Zhouzhendong 4 lat temu
rodzic
commit
4dddb7457b

+ 22 - 0
app/Components/Database.php

@@ -0,0 +1,22 @@
+<?php
+
+
+namespace App\Components;
+
+
+trait Database
+{
+    public function getFluxConnection()
+    {
+        $username = config('database.connections.oracle.username');
+        $password = config('database.connections.oracle.password');
+        $host = config('database.connections.oracle.host');
+        $service_name = config('database.connections.oracle.service_name');
+        return oci_connect($username, $password, $host . '/' . $service_name,"utf8");
+    }
+
+    public function releaseFluxConnection($conn)
+    {
+        oci_close($conn);
+    }
+}

+ 31 - 1
app/Http/Controllers/OrderController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Components\Database;
 use App\Http\Requests\OrderDelivering;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
@@ -16,10 +17,11 @@ use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Oursdreams\Export\Export;
-use PhpParser\Node\Stmt\DeclareDeclare;
 
 class OrderController extends Controller
 {
+    use Database;
+
     public function delivering(OrderDelivering $request){
         /** @var OrderService $orderService */
         $orderService = app('OrderService');
@@ -379,4 +381,32 @@ sql;
         else return ["success"=>false,"failNo"=>$failNo];
     }
 
+    public function allocation(Request $request):array
+    {
+        if(!Gate::allows('订单管理-编辑'))return["status"=>'fail',"msg"=>"无权操作"];
+        $list = $request->input("list",[]);
+        $error = [];
+        /** @var OrderService $service */
+        $service=app("OrderService");
+        $conn = null;
+        foreach ($list as $item){
+            if (!$item["number"]){
+                $error[] = "'{$item["code"]}'尚未获取快递单号";
+                continue;
+            }
+            if ((int)$item["status"]>30){
+                $error[] = "'{$item["code"]}'已被分配";
+                continue;
+            }
+            if (!$conn)$conn = $this->getFluxConnection();
+            $res = $service->allocation($item["code"],$item["warehouse"],$conn);
+            if (mb_substr($res,0,3)=='000')continue;
+            $error[] = "'{$item["code"]}'{$res}";
+        }
+        if ($conn)$this->releaseFluxConnection($conn);
+        if (!$error)return["status"=>'success'];
+        $txt = implode(",",$error);
+        return["status"=>'part',"msg"=>$txt];
+    }
+
 }

+ 3 - 1
app/Http/Controllers/ProcessController.php

@@ -1052,7 +1052,9 @@ class ProcessController extends Controller
             if (!is_object($owner)){
                 $str = $owner;
                 if (!$str) throw new \Exception('未找到货主!');
-                $owner=Owner::query()->where('code',$str)->orWhere('name',$str)->first();
+                $owner=Owner::query()->whereNull("deleted_at")->where(function ($query)use($str){
+                    $query->where('code',$str)->orWhere('name',$str);
+                })->first();
                 if (!$owner){
                     $owner = Owner::query()->create([
                         'code' => $str,

+ 47 - 0
app/Http/Controllers/TestController.php

@@ -17,6 +17,7 @@ use App\Jobs\OrderCreateInstantBill;
 use App\Jobs\OrderCreateWaybill;
 use App\Jobs\SettlementBillReportTask;
 use App\Jobs\StoreCreateInstantBill;
+use App\Jobs\TestJob;
 use App\Jobs\WeightUpdateInstantBill;
 use App\LaborReport;
 use App\LaborReportStatus;
@@ -87,6 +88,7 @@ use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Str;
 use Laravel\Horizon\Events\JobFailed;
 use Monolog\Handler\IFTTTHandler;
+use phpDocumentor\Reflection\Types\Resource_;
 use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
 
 class TestController extends Controller
@@ -105,9 +107,54 @@ class TestController extends Controller
         return call_user_func([$this, $method], $request);
     }
 
+
     public function test()
     {
+        $username = config('database.connections.oracle.username');
+        $password = config('database.connections.oracle.password');
+        $host = config('database.connections.oracle.host');
+        $service_name = config('database.connections.oracle.service_name');
+        $conn = oci_connect($username, $password, $host . '/' . $service_name,"utf8");
+        $sql = <<<sql
+BEGIN
+    SPSO_HardAllocation_Process('WH01','Allocation','By OrderNO',
+                                 null,'SO21090100007','0',null,
+    'zhouzhendong',:CODE);
+END;
+sql;
+
+        $stmt = oci_parse($conn, $sql);
+        $code = "";
+        oci_bind_by_name($stmt, ':CODE', $code,300);
+        oci_execute($stmt);
+        oci_close($conn);
+        dd($code);
+        //
 
+        $no = "SO21090900001";
+
+
+        $db = DB::connection("oracle");
+        //$order = $db->selectOne(DB::raw("select * from DOC_ORDER_HEADER where orderno = ?"),[$no]);
+        dd($db->select($sql,[
+        ]));
+        $db->select("CALL SPSO_HardAllocation_Process(?,'Allocation','By OrderNO',null,?,'0',null,'zhouzhendong',@code)",[
+            $order->warehouseid,$no
+        ]);
+        //SPSO_HardAllocation_Process
+        dd($db->selectOne("select @code"));
+        $date = "2021-09-14 15:47:00";
+        dispatch(new TestJob("1"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("2"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("3"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("4"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("5"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("6"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("7"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("8"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("9"))->delay(Carbon::parse($date));
+        dispatch(new TestJob("10"))->delay(Carbon::parse($date));
+        dd(1);
 
 
         Station::query()->where("station_type_id", 5)->update(["status" => 1]);

+ 0 - 6
app/Jobs/CacheShelfTaskJob.php

@@ -49,12 +49,10 @@ class CacheShelfTaskJob implements ShouldQueue
             case "CACHE_SHELF_AVAILABLE"://缓存架释放呼叫
                 //等待一定时间来合并同类请求至此
                 $available = Cache::get($this->key,0);
-                Log::debug("队列事务1",["当前数量:{$this->count}","缓存数量:$available"]);
                 if ($this->count!=$available)return;
                 Cache::forget($this->key); //无论是否开始分发 都清除本次缓存架的计数器
                 //获取可用缓存架
                 $stations = app("StationService")->getCacheShelf(true);
-                Log::debug("队列事务2",["可用缓存架:{$stations->count()}"]);
                 if ($stations->count()==0)break;
                 //检查事务 尝试分发任务 改变下方序列来控制分发顺序 逐级分发 一次成功就终止
                 if ($this->dispatchOutTask($stations,$service))break; //首先尝试向出库事务分发 分发成功跳出
@@ -109,7 +107,6 @@ class CacheShelfTaskJob implements ShouldQueue
                     $query->where("status","待处理");
                 })->where("status",3)->lockForUpdate()
                 ->where("mark",2)->groupBy("task_id")->get(); //检索等待的队列事务来获取对应任务
-            Log::debug("队列事务3",["队列出库任务:{$tasks->count()}"]);
             if ($tasks->count()==0)return false;
             if ($this->dispatchTask($tasks,$stations,$service,function ($obj,$stationId,$time,&$updateTransaction){
                 if ($obj->ids!=$obj->id){
@@ -119,7 +116,6 @@ class CacheShelfTaskJob implements ShouldQueue
             },function ($service,$toLocation,$task,$prefix){
                 return $service->fetchGroup_multiLocation($toLocation,$task,$prefix,'立架出至缓存架',20,false);
             },"to_station_id")){
-                Log::debug("队列事务4",["缓存架剩余数量:{$stations->count()}"]);
                 DB::commit();return $stations->count()==0;} //缓存架用完 跳出,否则接着分发
             DB::rollBack();
         }catch (\Exception $e){
@@ -145,14 +141,12 @@ class CacheShelfTaskJob implements ShouldQueue
                     $query->where("status","待处理");
                 })->where("status",3)->lockForUpdate()
                 ->where("mark",1)->get(); //检索等待的队列事务来获取对应任务
-            Log::debug("队列事务3",["队列入库任务:{$tasks->count()}"]);
             if ($tasks->count()==0)return false;
             if ($this->dispatchTask($tasks,$stations,$service,function ($obj,$stationId,$time,&$updateTransaction){
                 $updateTransaction[] = ["id"=>$obj->id,"fm_station_id"=>$stationId,"status"=>0,"updated_at"=>$time];
             },function ($service,$toLocation,$task,$prefix){
                 return $service->fetchGroup_multiLocation($toLocation,$task,'','立架出至缓存架',20,false);
             },"fm_station_id")){
-                Log::debug("队列事务5",["缓存架剩余数量:{$stations->count()}"]);
                 DB::commit();return $stations->count()==0; //缓存架用完 跳出,否则接着分发
             }
             DB::rollBack();

+ 37 - 0
app/Jobs/TestJob.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Jobs;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\DB;
+
+class TestJob implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable;
+
+    private $str;
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(string $str)
+    {
+        $this->str = $str;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        DB::select("call stu_out('{$this->str}',@str)");
+        echo json_encode(DB::selectOne("select @str"));
+    }
+}

+ 1 - 1
app/Services/MaterialBoxService.php

@@ -36,7 +36,7 @@ class MaterialBoxService
             $boxes = MaterialBox::query()->select('id',"code")
                 ->whereNotIn("id",$blacklist)
                 ->where("id",">",$id)->where("code","like","IDE%")
-                ->where("status",4)->limit(50)->orderBy("id")
+                /*->where("status",4)*/->limit(100)->orderBy("id")
                 ->whereNotIn("id",StationTaskMaterialBox::query()->select("material_box_id")
                     ->whereNotIn("status",["完成","取消"])
                     ->where("material_box_model_id",$model->id)->groupBy("material_box_id"));

+ 34 - 1
app/Services/OrderService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Commodity;
+use App\Components\Database;
 use App\Feature;
 use App\Jobs\OrderCreateInstantBill;
 use App\Jobs\OrderCreateWaybill;
@@ -39,7 +40,7 @@ use App\Traits\ServiceAppAop;
 class OrderService
 {
     use ServiceAppAop;
-    use ModelSearchWay;
+    use ModelSearchWay,Database;
     protected $modelClass=Order::class;
     /**
      * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
@@ -1542,4 +1543,36 @@ sql;
         oci_close($conn);
         return true;
     }
+
+    /**
+     * @param string $orderNo
+     * @param string|null $warehouseCode
+     * @param resource|null|mixed $conn
+     * @return string
+     */
+    public function allocation(string $orderNo, ?string $warehouseCode, $conn = null):string
+    {
+        if (!$warehouseCode){
+            $order = DB::connection("oracle")->selectOne(DB::raw("SELECT warehouseid FROM DOC_ORDER_HEADER WHERE ORDERNO = ?"),[$orderNo]);
+            if (!$order)return "500#订单丢失";
+            $warehouseCode = $order->warehouseid;
+        }
+        $user = Auth::user() ? "W".Auth::user()["name"] : "WAS";
+        $sql = <<<sql
+BEGIN
+    SPSO_HardAllocation_Process('{$warehouseCode}','Allocation','By OrderNO',
+                                 null,'{$orderNo}','0',null,
+    '{$user}',:CODE);
+END;
+sql;
+        $releaseSign = true;
+        if (!$conn || !is_resource($conn))$conn = $this->getFluxConnection();
+        else $releaseSign = false; //连接是外部传递则不释放资源
+        $stmt = oci_parse($conn, $sql);
+        $code = "";
+        oci_bind_by_name($stmt, ':CODE', $code,256);
+        oci_execute($stmt);
+        if ($releaseSign)$this->releaseFluxConnection($conn);
+        return $code;
+    }
 }

+ 2 - 1
composer.json

@@ -33,7 +33,8 @@
         "predis/predis": "^1.1",
         "pusher/pusher-php-server": "^4.1",
         "te7a-houdini/laravel-trix": "^2.0",
-        "yajra/laravel-oci8": "7.0"
+        "yajra/laravel-oci8": "7.0",
+        "ext-oci8": "*"
     },
     "require-dev": {
         "barryvdh/laravel-debugbar": "^3.2",

+ 1 - 1
config/users.php

@@ -1,7 +1,7 @@
 <?php
 
 return [
-    'superAdmin' => ['ldaaww','baoshi56','周亚萍','shiyao','zhouzhendong','zengjun',"yang",'huhao','zhangwanli',env('SUPER_ADMIN',"")],
+    'superAdmin' => ['ldaaww','baoshi56','周亚萍','shiyao','zhouzhendong','zengjun',"yang",'huhao',env('SUPER_ADMIN',"")],
     'token_expire_minutes'=>7200,
     'token_check_in_expire_minutes'=>432000, //打卡过期时间,单位为秒
     'cookie_expire_minutes'=>7200,//cookie过期时间,单位分钟

+ 49 - 1
resources/views/order/index/delivering.blade.php

@@ -26,6 +26,7 @@
                         <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1"  @click="freezeAll" style="cursor: pointer" title="订单的冻结条件要只局限在“创建订单”,“分配完成”,“拣货完成”,“播种完成”">冻结</span>
                         <button type="button" @click="thaw(null,true)" class="btn btn-sm btn-outline-danger tooltipTarget ml-1" title="解除已冻结订单" style="opacity: 0.7">解冻</button>
                         <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1" @click="deAllocationAll" style="cursor: pointer"  title="订单的取消分配条件要只局限在“分配完成”或“部分分配”">取消分配</span>
+                        <span class="btn btn-sm btn-outline-primary tooltipTarget ml-1" @click="allocation()" style="cursor: pointer"  title="仅能分配未分配订单">订单分配</span>
                         <button type="button" @click="resetLogisticsGetMark()" class="btn btn-sm ml-1 btn-outline-success">重置快递获取标记</button>
                         <button type="button" @click="resetInterfaceReturnMark()" class="btn btn-sm ml-1 btn-outline-secondary">重置接口回传标记</button>
                     @endcan
@@ -303,7 +304,8 @@
                     {name:'重要',value:'2'},
                     {name:'紧急',value:'3'},
                     {name:'重要且紧急',value:'4'},
-                ]
+                ],
+                exeSign:{},
             },
             mounted:function () {
                 this.initData();
@@ -530,6 +532,52 @@
                         tempTip.show('标记勾选内容冻结失败,网络连接错误:'+e);
                     })
                 },
+                //订单分配
+                allocation(){
+                    if (this.exeSign.allocation)return;
+                    if(checkData.length===0){tempTip.show('没有勾选记录');return;}
+                    let arr = [];
+                    checkData.forEach(no=>{
+                       this.orders.some(order=>{
+                           if (order.orderno === no){
+                               let obj = {
+                                    "status" : order.sostatus,
+                                    "number" : order.soreference5,
+                                    "warehouse" : order.warehouseid,
+                                    "code" : order.orderno,
+                               };
+                               arr.push(obj);
+                               return true;
+                           }
+                       });
+                    });
+                    window.tempTip.confirm("确定要分配这些订单吗?",()=>{
+                        this.exeSign.allocation = true;
+                        axios.post("{{url('order/allocation')}}",{list:arr}).then((res)=>{
+                            tempTip.setDuration(3000);
+                            this.exeSign.allocation = false;
+                            switch (res.data.status){
+                                case "success":
+                                    tempTip.showSuccess('订单分配成功');
+                                    setTimeout(function (){
+                                        window.location.reload();
+                                    },3000);
+                                    break;
+                                case "fail":
+                                    tempTip.show(res.data.msg);
+                                    break;
+                                default:
+                                    tempTip.confirm(res.data.msg,function (){
+                                        window.location.reload();
+                                    });
+                            }
+                        }).catch( (e)=>{
+                            this.exeSign.allocation = false;
+                            tempTip.setDuration(2500);
+                            tempTip.show('分配失败,预期之外的错误:'+e);
+                        })
+                    })
+                },
                 //批量取消分配
                 deAllocationAll(){
                     let _this=this;

+ 1 - 0
routes/web.php

@@ -796,6 +796,7 @@ Route::group(['prefix'=>'package'],function(){
         Route::post('thaw','OrderController@thaw');
         Route::post('deAllocation','OrderController@deAllocation');
         Route::post('deAllocationAll','OrderController@deAllocationAll');
+        Route::post('allocation','OrderController@allocation');
         Route::post('manualBack','OrderController@manualBack');
         Route::post('resetLogisticsGetMark','OrderController@resetLogisticsGetMark');
         Route::post('resetInterfaceReturnMark','OrderController@resetInterfaceReturnMark');