Преглед изворни кода

Merge branch 'master' into zzd

zhouzhendong пре 4 година
родитељ
комит
3f6bee381b

+ 1 - 4
app/Filters/WorkOrderFilters.php

@@ -70,10 +70,7 @@ class WorkOrderFilters
             $this->id(explode(',',$this->params['data']));
 
         if (!isset($this->params['owner'])){
-            $owners = app(OwnerService::class)->getAuthorizedOwners();
-            $this->getOrderQuery()->whereIn('owner_id',$owners->map(function($item){
-                return $item->id;
-            }));
+            $this->getOrderQuery()->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user())??[]);
         }
     }
 

+ 2 - 0
app/Http/Controllers/MeasureMonitorController.php

@@ -41,9 +41,11 @@ class MeasureMonitorController extends Controller
     public function speech(Request $request,MeasureMonitorService $service): array
     {
         if (app('WorkOrderService')->isIntercept($request['logistic_number'])){
+            app('OrderIssueService')->intercept($request['logistic_number']);
             return $service->getMp3Audio('拦截订单');
         }
         if ( app('OrderIssueService')->isExists($request['logistic_number'])){
+            app('OrderIssueService')->intercept($request['logistic_number']);
             return $service->getMp3Audio('拦截订单');
         }
         return $service->getMp3Audio($request->input('logistic'));

+ 27 - 0
app/Http/Controllers/OrderController.php

@@ -16,6 +16,7 @@ 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
 {
@@ -352,4 +353,30 @@ sql;
         }
     }
 
+    /**
+     * @param Request $request
+     * @return array
+     * 一键回传功能
+     */
+    public function manualBack(Request $request): array
+    {
+        if(!Gate::allows('订单管理-订单-一键回传'))return["success"=>false,"data"=>"无权操作"];
+        /** @var OrderService $orderService */
+        $orderService=app(OrderService::class);
+        $orderNos=$request->input('ordernos');
+        $failNo=array();
+        $successNo=array();
+        foreach ($orderNos as $no){
+            $res=$orderService->manualBack($no);
+            if (!$res){
+                array_push($failNo,$no);
+                app('LogService')->log(__METHOD__,'人工回传失败'.__FUNCTION__,json_encode($no),Auth::user()['id']);
+            }else{
+                array_push($successNo,$no);
+            }
+        }
+        if (count($orderNos)>=count($failNo))return ["success"=>true,"successNo"=>$orderNos,"failNo"=>$failNo];
+        else return ["success"=>false,"failNo"=>$failNo];
+    }
+
 }

+ 78 - 2
app/Http/Controllers/TestController.php

@@ -60,6 +60,8 @@ use App\Waybill;
 use App\WorkOrder;
 use Carbon\Carbon;
 use Carbon\CarbonPeriod;
+use Decimal\Decimal;
+use Doctrine\DBAL\Exception;
 use Firebase\JWT\JWT;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Foundation\Http\FormRequest;
@@ -74,6 +76,7 @@ use Illuminate\Support\Facades\URL;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Str;
 use Laravel\Horizon\Events\JobFailed;
+use Monolog\Handler\IFTTTHandler;
 use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
 
 class TestController extends Controller
@@ -241,8 +244,8 @@ sql;
             ->where('class', 'like', 'https://was.baoshi56.com/package/logistic/batchUpdate%')->pluck('description');
         foreach ($descriptions as $description) {
             $description = substr($description, 9);
-            $description = \Illuminate\Support\Str::before($description,"}");
-            $obj= json_decode($description.'}',true);
+            $description = \Illuminate\Support\Str::before($description, "}");
+            $obj = json_decode($description . '}', true);
             OrderPackage::query()
                 ->whereIn('logistic_number', $obj['logistic_numbers'])
                 ->update([
@@ -271,4 +274,77 @@ sql;
     }
 
 
+
+    public function testUpdateInv()
+    {
+        ini_set('max_execution_time', 0);
+        ini_set('memory_limit', '4096M');
+        $sql = <<<sql
+select FMLOTNUM,FMLOCATION,PLANTOLOCATION,CREATE_TRANSACTIONID,SKU,CUSTOMERID from TSK_TASKLISTS
+where CUSTOMERID=?
+  AND FMLOCATION= ?
+  AND OPENWHO = ?
+  AND TASKPROCESS = ?
+  AND DOCTYPE = ?
+  AND TASKTYPE = ?
+  AND LOTATT05=?
+  AND LOTATT08=?
+  AND PLANTOID = ?
+  and OPENTIME>=TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')
+  and OPENTIME<=TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')
+sql;
+        $CUSTOMERID = 'JIANSHANG';
+        $FMLOCATION = 'STAGEWH02';
+        $OPENWHO = 'WCS';
+        $TASKPROCESS = '00';
+        $DOCTYPE = 'ASN';
+        $TASKTYPE = 'PA';
+        $LOTATT05 = 'MJ-CP';
+        $LOTATT08 = 'ZP';
+        $PLANTOID = '*';
+        $traceid = 'JIANSHANG03';
+        $start = '2021-09-02 23:59:59';
+        $end = '2021-09-03 11:10:00';
+        $res = DB::connection("oracle")->select(DB::raw($sql),
+            [$CUSTOMERID, $FMLOCATION, $OPENWHO, $TASKPROCESS, $DOCTYPE, $TASKTYPE, $LOTATT05, $LOTATT08, $PLANTOID, $start, $end]);
+        $resItems = array_chunk($res, 200);
+        foreach ($resItems as $res) {
+            DB::connection("oracle")->beginTransaction();
+            try {
+                foreach ($res as $re) {
+                    DB::connection("oracle")->table('INV_LOT_LOC_ID')
+                        ->where([
+                            'LOTNUM' => $re->fmlotnum,
+                            'LOCATIONID' => $re->fmlocation,
+                            'CUSTOMERID' => $re->customerid,
+                            'sku' => $re->sku,
+                            'TRACEID' => '*',
+                        ])
+                        ->update([
+                            'TRACEID' => $traceid,
+                            'EDITWHO' => 'WCS_',
+                        ]);
+                    if ($re->fmlocation != $re->plantolocation) {
+                        DB::connection("oracle")->table('INV_LOT_LOC_ID')
+                            ->where([
+                                'LOTNUM' => $re->fmlotnum,
+                                'LOCATIONID' => $re->plantolocation,
+                                'CUSTOMERID' => $re->customerid,
+                                'sku' => $re->sku,
+                                'TRACEID' => '*',
+                            ])
+                            ->update([
+                                'TRACEID' => $traceid,
+                                'EDITWHO' => 'WCS_',
+                            ]);
+                    }
+                    DB::connection("oracle")->commit();
+                }
+                dd(true);
+            } catch (\Exception $e) {
+                DB::connection("oracle")->rollBack();
+                dd($e->getMessage());
+            }
+        }
+    }
 }

+ 9 - 0
app/Http/Controllers/WorkOrderController.php

@@ -100,4 +100,13 @@ class WorkOrderController extends Controller
         return ['success' => true,'data' => $items];
     }
 
+    // 删除
+    public function destroyApi($id): array
+    {
+        if (Gate::denies('订单管理-工单处理-删除'))
+            return ['success' => false,'message' => '没有对应权限'];
+        WorkOrder::query()->where('id',$id)->Delete();
+        return ['success' => true];
+    }
+
 }

+ 2 - 0
app/Jobs/LogisticSFSync.php

@@ -5,6 +5,7 @@ namespace App\Jobs;
 use App\OrderPackage;
 use App\Services\LogisticSFService;
 use App\Services\LogService;
+use App\Services\OrderPackageReceivedSyncService;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Foundation\Bus\Dispatchable;
@@ -25,6 +26,7 @@ class LogisticSFSync implements ShouldQueue
      * @var LogisticSFService $logisticSFService
      */
     public $logisticSFService;
+    /** @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService  */
     public $orderPackageReceivedSyncService;
 
     /**

+ 10 - 1
app/OrderIssue.php

@@ -36,7 +36,9 @@ class OrderIssue extends Model
         'logistic_indemnity_money', 'logistic_express_remission',
         'baoshi_indemnity_money', 'baoshi_express_remission', 'user_workgroup_id',
         'custom_code','imported_status','finance_confirm',
-        'hidden_tag','archive_at'];
+        'hidden_tag','archive_at',
+        'is_intercept'
+    ];
     /*
      * second_client_no 二次客户订单号
      * second_logistic_number 二次运单号 【二次运单号可以单独存在,当二次客户订单号有对应的订单信息时,显示的是二次客户订单号对应的运单号,没有的话显示二次原单号】
@@ -50,6 +52,7 @@ class OrderIssue extends Model
      * finance_confirm 财务确认
      * hidden_tag 隐藏标识
      * archive_at 归档时间
+     * is_intercept 是否拦截
      */
     protected $appends = [];
 
@@ -312,4 +315,10 @@ class OrderIssue extends Model
     {
         return $this->belongsToMany(UserWorkgroup::class);
     }
+
+    // 库内拦截
+    public function intercept(): bool
+    {
+        return $this->update(['is_intercept' => 1]);
+    }
 }

+ 2 - 0
app/Services/LogisticSFService.php

@@ -150,6 +150,7 @@ xml;
                 case 31:
                 case 30:
                 case 36:
+                case 106://航空板箱到达
                     $data['status'] = '在途';
                     break;
                 case 33:
@@ -176,6 +177,7 @@ xml;
                     $data['status'] = '其他';
                     break;
                 default:
+                    $data['status'] = '其他';
                     throw new WarningException("未知的丰桥状态码: {$lastRoute['opcode']}->{json_encode($lastRoute)}");
             }
         } catch (WarningException $e) {

+ 6 - 0
app/Services/OrderIssueService.php

@@ -440,5 +440,11 @@ class OrderIssueService
         $order_issue_type_query = OrderIssueType::query()->select('id')->where('name' ,'拦截');
         return OrderIssue::query()->whereIn('order_id',$order_package_query)->whereIn('order_issue_type_id',$order_issue_type_query)->count() ;
     }
+
+    public function intercept($logistic_number)
+    {
+        $order_package_query = OrderPackage::query()->select('order_id')->where('logistic_number',$logistic_number);
+        OrderIssueType::query()->where('order_id',$order_package_query)->update(['is_intercept' => 1]);
+    }
 }
 

+ 24 - 19
app/Services/OrderPackageReceivedSyncService.php

@@ -25,15 +25,15 @@ class OrderPackageReceivedSyncService
      * 2 如果当前时间小于等于初始化时间,执行初始化脚本,将数据库中全部小于等于初始化时间的数据更新
      * @throws Exception
      */
-    public function syncLogisticRoute($is_to_init=false)
+    public function syncLogisticRoute($is_to_init = false)
     {
         ini_set('max_execution_time', 2 * 60 * 60);
         ini_set('memory_limit', '1024M');
         //  LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法", '');
         $query = OrderPackage::query()
-            ->select(['logistic_number', 'order_id','id'])
+            ->select(['logistic_number', 'order_id', 'id'])
             ->with(['order' => function ($query) {
-                return $query->select(['id','logistic_id'])->with('logistic:id,name,code');
+                return $query->select(['id', 'logistic_id'])->with('logistic:id,name,code');
             }]);
         if ($is_to_init) {//当前时间小于等于初始化时间
             $initDate = Carbon::parse(config('api_logistic.init_date'));
@@ -79,7 +79,7 @@ class OrderPackageReceivedSyncService
                 $YTOLogisticNumbers = $logisticNumbers['YTO'];
                 //  LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-YTO", json_encode($YTOLogisticNumbers));
                 foreach ($YTOLogisticNumbers as $logistic_number) {
-                    if ($logistic_number)LogisticYTOSync::dispatch($logistic_number);
+                    if ($logistic_number) LogisticYTOSync::dispatch($logistic_number);
                 }
             }
         });
@@ -89,10 +89,10 @@ class OrderPackageReceivedSyncService
     {
         ini_set('max_execution_time', 2 * 60 * 60);
         $query = OrderPackage::query()
-            ->select(['logistic_number', 'order_id','id'])
-            ->whereIn('order_id',function ($query){
-                $query->from('orders')->selectRaw('id')->whereIn('logistic_id',function ($builder){
-                    $builder->from('logistics')->selectRaw('id')->where('type','=','快递')->whereNotIn('belong_company',['顺丰','中通','韵达','圆通','京东']);
+            ->select(['logistic_number', 'order_id', 'id'])
+            ->whereIn('order_id', function ($query) {
+                $query->from('orders')->selectRaw('id')->whereIn('logistic_id', function ($builder) {
+                    $builder->from('logistics')->selectRaw('id')->where('type', '=', '快递')->whereNotIn('belong_company', ['顺丰', '中通', '韵达', '圆通', '京东']);
                 });
             });
         $query = $query->where('sent_at', '>=', now()->subDays(config('api_logistic.querying_days')))
@@ -100,31 +100,34 @@ class OrderPackageReceivedSyncService
 
         $query->chunkById(200, function ($orderPackages) {
             //  LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-阿里公用接口", json_encode($orderPackages));
-            foreach ($orderPackages as $orderPackage){
-                if ($orderPackage && $orderPackage->logistic_number)LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
+            foreach ($orderPackages as $orderPackage) {
+                if ($orderPackage && $orderPackage->logistic_number) LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
             }
         });
         //TODO 暂时不同步京东
 //        $this->syncLogisticRouteJD();
     }
-    public function syncLogisticRouteJD(){
+
+    public function syncLogisticRouteJD()
+    {
         ini_set('max_execution_time', 60);
         $query = OrderPackage::query()
-            ->select(['logistic_number', 'order_id','id'])
-            ->whereIn('order_id',function ($query){
-                $query->from('orders')->selectRaw('id')->whereIn('logistic_id',function ($builder){
-                    $builder->from('logistics')->selectRaw('id')->where('type','!=','物流')->where('belong_company','京东');
+            ->select(['logistic_number', 'order_id', 'id'])
+            ->whereIn('order_id', function ($query) {
+                $query->from('orders')->selectRaw('id')->whereIn('logistic_id', function ($builder) {
+                    $builder->from('logistics')->selectRaw('id')->where('type', '!=', '物流')->where('belong_company', '京东');
                 });
             });
         $query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days')))
-            ->whereNull('received_at')->where('logistic_number','like','JD%');
+            ->whereNull('received_at')->where('logistic_number', 'like', 'JD%');
         $query->chunkById(200, function ($orderPackages) {
             //  LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-JD", json_encode($orderPackages));
-            foreach ($orderPackages as $orderPackage){
-                if ($orderPackage && $orderPackage->logistic_number)LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
+            foreach ($orderPackages as $orderPackage) {
+                if ($orderPackage && $orderPackage->logistic_number) LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
             }
         });
     }
+
     /**
      * 根据传递的承运商与快递单号更新快递信息
      * @param array $logisticNumbers 快递单号
@@ -181,7 +184,7 @@ class OrderPackageReceivedSyncService
             if (empty($logisticResponse)) continue;
             $orderPackage = OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])->first();
             //如果已经收货,状态改为已签收
-            if ($logisticResponse['received_at']??false) {
+            if ($logisticResponse['received_at'] ?? false) {
                 $logisticResponse['status'] = '已签收';
             }
             //未查询到路由信息改为  揽件异常
@@ -191,6 +194,8 @@ class OrderPackageReceivedSyncService
                 if (empty($orderPackage->weighed_at)) {
                     $logisticResponse['status'] = '疑似库内丢件';
                 }
+            } else if (count($logisticResponse['transfer_status'])<=3) {//快递记录不为空但是小于3条
+                $logisticResponse['status'] = '揽件异常';
             }
             //标记为手动更新的 status不更新
             if ($orderPackage->is_manual_update) {

+ 43 - 5
app/Services/OrderService.php

@@ -30,6 +30,7 @@ use App\Warehouse;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
 use App\Traits\ServiceAppAop;
@@ -88,6 +89,7 @@ class OrderService
         $ordernos = $params["ordernos"] ?? null;
         $edisendflag2=$params["edisendflag2"] ?? null;
         $edisendflag=$params["edisendflag"] ?? null;
+        $manualflag=$params["manualflag"] ?? null;
         $checkAllSign = $params['checkAllSign'] ?? null;
         if ($ordernos){
             $sql .= " AND orderno IN ".$ordernos;
@@ -219,6 +221,7 @@ class OrderService
         }
         if ($edisendflag2) $sql.=" and edisendflag2 like '".$edisendflag2."%'";
         if ($edisendflag) $sql.=" and edisendflag like '".$edisendflag."%'";
+        if ($manualflag) $sql.=" and manualflag = '".$manualflag."'";
         if ($soreference1){
             $arr=array_values(array_filter(preg_split('/[,, ]+/is', $soreference1)));
             if (count($arr)==1){
@@ -252,10 +255,10 @@ class OrderService
             if ($ordernos)$params['ordernos'] = $ordernos;
             else return null;
         }
-        $sql="SELECT * FROM (select ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID as header_customer_id
+        $sql="SELECT * FROM (select ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.MANUALFLAG,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID as header_customer_id
         ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.C_Tel1,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,DOC_ORDER_HEADER.EDIREMARKS2,
        DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1
-        ,NVL(ACT_ALLOCATION_DETAILS.PICKTOTRACEID,DOC_ORDER_HEADER.soreference5) as soreference5,DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
+        ,NVL(DOC_ORDER_HEADER.soreference5,ACT_ALLOCATION_DETAILS.PICKTOTRACEID) as soreference5,DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
        DOC_ORDER_HEADER.Picking_Print_Flag,DOC_ORDER_HEADER.EDISENDFLAG
         ,DOC_ORDER_HEADER.ReleaseStatus,DOC_ORDER_HEADER.C_Address1,DOC_ORDER_HEADER.OrderTime,DOC_Order_Details.CustomerID,
        DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,DOC_Order_Details.LOTNUM,DOC_Order_Details.LineStatus,DOC_Order_Details.OrderLineNo,order_code.codename_c as orderCodeName,
@@ -264,7 +267,7 @@ class OrderService
         $sql=$this->preciseQuery($params,$sql);
         ;$sql.=" ) as counted from (";
         if ($paginate && $page)$sql.=" select * from (";
-        $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
+        $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.MANUALFLAG,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
                           ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.C_Tel1,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
                          DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1
                           ,DOC_ORDER_HEADER.soreference5,DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
@@ -295,10 +298,10 @@ class OrderService
                       left join  BAS_SKU on DOC_Order_Details.CustomerID=BAS_SKU.CustomerID and DOC_Order_Details.SKU=BAS_SKU.SKU
                       left join  ACT_ALLOCATION_DETAILS on DOC_Order_Details.orderno = ACT_ALLOCATION_DETAILS.orderno
                       and DOC_Order_Details.ORDERLINENO = ACT_ALLOCATION_DETAILS.ORDERLINENO
-                      GROUP BY ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,
+                      GROUP BY ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.MANUALFLAG,
                       DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,
                       DOC_ORDER_HEADER.CustomerID,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.C_Tel1,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
-                      DOC_ORDER_HEADER.EDIREMARKS2,DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1, NVL(ACT_ALLOCATION_DETAILS.PICKTOTRACEID,DOC_ORDER_HEADER.soreference5),
+                      DOC_ORDER_HEADER.EDIREMARKS2,DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1, NVL(DOC_ORDER_HEADER.soreference5,ACT_ALLOCATION_DETAILS.PICKTOTRACEID),
                       DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
                       DOC_ORDER_HEADER.Picking_Print_Flag,DOC_ORDER_HEADER.EDISENDFLAG,DOC_ORDER_HEADER.ReleaseStatus,DOC_ORDER_HEADER.C_Address1,
                       DOC_ORDER_HEADER.OrderTime,DOC_Order_Details.CustomerID,DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,DOC_Order_Details.LOTNUM,
@@ -1504,4 +1507,39 @@ sql;
             else $order->is_order_issue = false;
         }
     }
+
+    /**
+     * @param $orderno
+     * @return bool
+     * 一键回传 调用flux的sp
+     */
+    public function manualBack($orderno): bool
+    {
+        $who = 'WAS' . (Auth::user() ? '-' . Auth::user()["name"] : '');
+        $host=config('database.connections.oracle.host');
+        $serviceName=config('database.connections.oracle.service_name');
+        $user=config('database.connections.oracle.username');
+        $password=config('database.connections.oracle.password');
+        $conn=oci_connect($user,$password,$host.'/'.$serviceName,'utf8');
+        $IN_WarehouseID='';
+        $IN_OrderNo=$orderno;
+        $IN_Language='';
+        $IN_UserID=$who;
+        $OUT_Return_Code='';
+        $sql_sp="begin SPSOUDF_BS_ManualCF(:IN_WarehouseID,:IN_OrderNo,:IN_Language,:IN_UserID,:OUT_Return_Code); end;";
+        $stmt = oci_parse($conn, $sql_sp);
+        oci_bind_by_name($stmt,':IN_WarehouseID',$IN_WarehouseID);
+        oci_bind_by_name($stmt,':IN_OrderNo',$IN_OrderNo);
+        oci_bind_by_name($stmt, ':IN_Language', $IN_Language);
+        oci_bind_by_name($stmt, ':IN_UserID', $IN_UserID);
+        oci_bind_by_name($stmt, ':OUT_Return_Code', $OUT_Return_Code,300);
+        oci_execute($stmt);
+
+        if (substr($OUT_Return_Code,0,3) != '000'){
+            app('LogService')->log(__METHOD__,'调用sp一键回传订单失败'.__FUNCTION__,"ORDERNO:".$orderno."ERROR:".$OUT_Return_Code);
+            return false;
+        }
+        oci_close($conn);
+        return true;
+    }
 }

+ 1 - 1
app/Services/WorkOrderService.php

@@ -130,7 +130,7 @@ class WorkOrderService
         $ids = $workOrders->map(function ($item) {
             return $item->id;
         })->toArray();
-        WorkOrder::query()->whereIn('id', $ids)->update(['review_at' => Carbon::now(), 'reviewer_id' => Auth::user()['id']]);
+        WorkOrder::query()->whereIn('id', $ids)->update(['review_at' => Carbon::now(), 'reviewer_id' => Auth::user()['id'],'status' => '2']);
         $wordOrder = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
             /** @var $query Builder */
             $query->with('packages', 'issue', 'logistic');

+ 32 - 0
database/migrations/2021_09_06_135431_add_is_intercept_to_order_issues.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddIsInterceptToOrderIssues extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            $table->tinyInteger('is_intercept')->comment('是否库内拦截');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            $table->dropColumn('is_intercept');
+        });
+    }
+}

+ 87 - 2
resources/views/order/index/delivering.blade.php

@@ -39,6 +39,10 @@
                     @can('订单管理-订单-生成工单')
                         <button class="btn btn-sm ml-1 btn-outline-success" @click="showInterceptModel()">生成工单</button>
                     @endcan
+                    @can('订单管理-订单-一键回传')
+                        <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="订单一键回传必须满足条件:订单状态为“分配完成,部分拣货,拣货完成,播种完成”;订单未冻结;订单有快递单号"
+                                @click="manualBack()">一键回传</button>
+                    @endcan
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -73,8 +77,8 @@
                         <td class="text-muted text-nowrap"><span>@{{ order.carriername }}</span></td>
                         <td class="text-nowrap">
                             <div v-if="picktotraceidMap[order.orderno] && picktotraceidMap[order.orderno].length>1" class="text-center">
-                                <span v-for="picktotraceid in picktotraceidMap[order.orderno]" v-if="order.is_unfold">
-                                    @{{ picktotraceid }}<br>
+                                <span v-for="(picktotraceid,key) in picktotraceidMap[order.orderno]" v-if="order.is_unfold">
+                                    @{{ order.soreference5 ? (order.soreference5+'#'+(key+1)) : picktotraceid }}<br>
                                 </span>
                                 <button class="btn btn-sm btn-outline-info" :style="order.is_unfold ? 'opacity:0.7' : ''" @click="isUnfold(order)">
                                     <span v-if="order.is_unfold" class="mt-1">收起</span>
@@ -117,6 +121,7 @@
                             </div>
                         </td>
                         <td><span>@{{ order.notes }}</span></td>
+                        <td><span>@{{ order.manualflag}}</span></td>
                         <td><span>@{{ order.erpcancelflag }}</span></td>
                         <td><span>@{{ order.picking_print_flag }}</span></td>
                         <td><span>@{{ order.edisendflag }}</span></td>
@@ -354,6 +359,7 @@
                     ],
                     [
                         {name:'restrict_time',type:'select',tip:'查询限定时间范围',placeholder:'查询时间范围',data:[{name:'1',value:'一天内'},{name:'7',value:'一周内'},{name:"30",value:"一月内"},{name:"90",value:"本季度"}]},
+                        {name:'manualflag',type:'select',tip:'是否人工回传',placeholder:'是否人工回传',data:[{name:'Y',value:'是'},{name:'N',value:'否'}]},
                     ],
                 ];
                 this.form = new query({
@@ -392,6 +398,7 @@
                             {value:"复核时间",col:"2"}
                         ]},
                     {name:'notes',value: '备注'},
+                    {name:'manualflag',value: '人工回传标记'},
                     {name:'erpcancelflag',value: '接口取消标记'},
                     {name:'picking_print_flag',value: '拣货单打印标记'},
                     {name:'edisendflag',value: '接口回传标记'},
@@ -1007,6 +1014,84 @@
                         window.tempTip.show(err)
                     });
                 },
+                changeReceiveInfo() {
+                    let url = '{{url('apiLocal/workOrder/editOrderReceiveInfo')}}';
+                    let data = {
+                        order_nos:checkData[0],
+                        grad:this.grad,
+                        remake:`${this.remark.name} ${this.remark.phone} ${this.remark.province} ${this.remark.city} ${this.remark.city} ${this.remark.district} ${this.remark.adder}`,
+                    };
+                    console.log(data);
+                    window.tempTip.setIndex('1999');
+                    window.axios.post(url,data).then(res=>{
+                        if (res.data.success){
+                            window.tempTip.showSuccess('生成修改工单成功');
+                            $('#intercept-modal').modal('hide');
+                        } else{
+                            window.tempTip.show(res.data.message);
+                        }
+                    }).catch(err=>{
+                        window.tempTip.show(err);
+                    });
+                },
+                manualBack(){
+                    let _this=this;
+                    let orders=[];
+                    let fail=[];
+                    let isGreater=false;
+                    const start = new Date(new Date(new Date().toLocaleDateString()).getTime()+16*60*60*1000+30*60*1000);
+                    if(checkData.length===0){tempTip.show('没有勾选记录');return;}
+                    _this.orders.forEach(function(order){
+                        if (new Date(new Date(order.addtime).getTime())>start) isGreater=true;
+                        checkData.forEach(function (checkedId) {
+                            if(order.orderno===checkedId){
+                                if (order.soreference5 //存在快递单号
+                                    && order.releasestatus!='H' //订单未冻结
+                                    && order.manualflag=='N' //订单未回传
+                                    && (order.sostatus=='40' ||
+                                        order.sostatus=='50' ||
+                                        order.sostatus=='60' ||
+                                        order.sostatus=='61')) //订单状态为 分配完成,部分拣货,拣货完成,或播种完成
+                                {orders.push(order.orderno);}else {fail.push(order.orderno)}
+                            }
+                        });
+                    });
+                    let failText='';
+                    fail.forEach(function (item){
+                        failText += item + ','
+                    });
+                    if (isGreater){
+                        if (!confirm('订单中包含16:30以后推送的订单,有超时揽收风险,是否确定操作?')) return;
+                    }else {
+                        if (!confirm('提前回传订单将无法取消,是否确定操作?')) return;
+                    }
+                    let url = '{{url('order/manualBack')}}';
+                    window.axios.post(url, {ordernos:orders})
+                        .then(res => {
+                            if (res.data.success) {
+                                _this.orders.forEach(function (order){
+                                    res.data.successNo.forEach(function (success_item){
+                                        if (order.orderno==success_item)order.manualflag='Y';
+                                    })
+                                })
+                                res.data.failNo.forEach(function (item){
+                                    failText += item + ','
+                                });
+                                if (failText.length > 0) {
+                                    failText = failText.substr(0,failText.length - 1);
+                                }
+                                window.tempTip.setDuration(4000);
+                                window.tempTip.showSuccess('回传成功!'+'    单号:'+failText+'不满足回传条件,系统已自动筛除');
+                                this.$forceUpdate();
+                                return;
+                            }
+                            window.tempTip.setDuration(3000);
+                            window.tempTip.show('人工回传失败');
+                        }).catch(err => {
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show("网络错误:" + err);
+                    })
+                },
             },
         });
     </script>

+ 2 - 1
resources/views/order/issue/index.blade.php

@@ -228,6 +228,7 @@
                                 @else
                                     <span v-if="orderIssue.is_new_rejecting">@{{ orderIssue.is_new_rejecting }}</span>
                                 @endcan
+                                <span class="badge badge-info" v-if="orderIssue.is_intercept === 1">库内拦截</span>
                             </td>
                             @can("订单管理-问题件-置顶")
                                 <td class="text-muted child-layer-1">
@@ -300,7 +301,7 @@
                             <template v-if="orderIssue.order">
                                 <span :class="orderIssue.order.packages.length > 1 ?'collapse ':''"
                                       :id="'logisticNumbers'+orderIssue.id">
-                                    <span class="m-0 p-0 d-inline-block" v-for="package in orderIssue.order.packages">@{{ package.logistic_number!==orderIssue.order.code ? package.logistic_number:'' }}&nbsp;&nbsp;</span>
+                                    <span class="m-0 p-0 d-inline-block" v-for="(package,key) in orderIssue.order.packages">@{{ orderIssue.custom_code ? orderIssue.custom_code +'-'+(key+1) : (package.logistic_number!==orderIssue.order.code ? package.logistic_number:'') }}&nbsp;&nbsp;</span>
                                 </span>
                                 <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1"
                                     v-if="orderIssue.order.packages.length > 1"

+ 20 - 2
resources/views/order/workOrder/index.blade.php

@@ -65,6 +65,12 @@
                                             审核
                                         </button>
                                     @endcan
+                                    @can('订单管理-工单处理-删除')
+                                        <button class="btn btn-sm btn-outline-danger"
+                                                @click="destroy(item,i)">
+                                            删除
+                                        </button>
+                                    @endcan
                                 </td>
                                 <td class="text-center">@{{ item.status }}</td>
                                 <td class="text-center">@{{ item.owner ? item.owner.name : '' }}</td>
@@ -196,7 +202,6 @@
                                 <td class="text-center">@{{ item.created_at }}</td>
                                 <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
                                 <td>@{{ item.review_at }}</td>
-
                             </tr>
                         </template>
                         </tbody>
@@ -595,7 +600,20 @@
                         window.tempTip.show(err)
                     })
                 },
-
+                destroy(item,i){
+                    let url = '{{url('apiLocal/workOrder/')}}'+'/'+item.id;
+                    if(!confirm('是否删除当前工单')) return ;
+                    window.axios.delete(url).then(res=>{
+                        if (res.data.success){
+                            this.$delete(this.workOrders,i);
+                            window.tempTip.showSuccess('删除成功');
+                        }else {
+                            window.tempTip.show(res.data.message ? res.data.message : '');
+                        }
+                    }).catch(err=>{
+                        window.tempTip.show(err);
+                    })
+                }
             },
         });
     </script>

+ 2 - 2
resources/views/package/logistic/index.blade.php

@@ -157,7 +157,7 @@
                     </td>
                     <!--退件状态-->
                     <td>@{{ package.rejected_bill?'有':'无' }}</td>
-                    <td>@{{ package.order.oracle_d_o_c_order_header.notes??'' }}</td>
+                    <td>@{{ package.order && package.order.oracle_d_o_c_order_header && package.order.oracle_d_o_c_order_header.notes }}</td>
                     <td  class="m-0 p-0 order-package-remarks" style="padding-left: 0 !important;padding-right: 0 !important">
                         @can('包裹管理-快递-客服备注')
                         <label :for="'create_remark_'+package.id" class="btn-create-remark" @click="package.input_remark=!package.input_remark">
@@ -195,7 +195,7 @@
                             v-if="package.order && package.order.issue && package.order.issue.issue_type">@{{ package.order.issue.issue_type.name }}</span>
                     </td>
                     <td class="text-overflow-warp-200">@{{ package.order && package.order.batch && package.order.batch.wms_type }}</td>
-                    <td class="text-overflow-warp-200">@{{ package.order.oracle_d_o_c_order_header.waveno??'' }}</td>
+                    <td class="text-overflow-warp-200">@{{ package.order && package.order.oracle_d_o_c_order_header && package.order.oracle_d_o_c_order_header.waveno }}</td>
                     <td class="text-overflow-warp-200"><span
                             v-if="package.order && package.order.issue && package.order.issue.logs.length >0"><span
                                 v-for="log in package.order.issue.logs">@{{ log.content }}<br></span></span></td>

+ 41 - 37
resources/views/transport/waybill/index.blade.php

@@ -24,46 +24,49 @@
                     </ul>
                 </div>
             </div>
+
             <div id="form_div"></div>
-            <span class="dropdown">
-                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
-                        data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
-                    导出Excel
-                </button>
-                <div class="dropdown-menu" style="z-index: 1099">
-                    <a class="dropdown-item" @click="waybillExport(false)" href="javascript:">导出勾选内容</a>
-                    <a class="dropdown-item" @click="waybillExport(true)" href="javascript:">导出所有页</a>
+            <div class="ml-3 form-inline" id="btn">
+                <span class="dropdown">
+                    <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                            data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
+                        导出Excel
+                    </button>
+                    <div class="dropdown-menu" style="z-index: 1099">
+                        <a class="dropdown-item" @click="waybillExport(false)" href="javascript:">导出勾选内容</a>
+                        <a class="dropdown-item" @click="waybillExport(true)" href="javascript:">导出所有页</a>
+                    </div>
+                </span>
+                <div class="form-check d-inline-block">
+                    <label class="form-check-label">
+                        <input type="checkbox" class="form-check-input" v-model="appendFluxInfo">导出附加FLUX信息
+                    </label>
                 </div>
-            </span>
-            <div class="form-check d-inline-block">
-                <label class="form-check-label">
-                    <input type="checkbox" class="form-check-input" v-model="appendFluxInfo">导出附加FLUX信息
-                </label>
-            </div>
-            @can('运输管理-运单-图片上传')<button class="btn btn-sm btn-outline-info" data-target="#batchUploadImg" data-toggle="modal">批量上传图片</button>@endcan
-            @can('运输管理-运单-图片删除')<button class="btn btn-sm btn-outline-danger" @click="deleteImg()">批量删除图片</button>@endcan
-            @if($uriType=='' || $uriType=='专线')
-                @can('运输管理-运单-按日计算专线费')
-                    <button class="btn btn-sm btn-outline-success tooltipTarget" data-target="#dailyBilling" data-toggle="modal"
-                            title="计算指定日期下的所有专线费,不考虑有无货主权限">按日输入专线费</button>@endcan
-            @endif
-            @can('运输管理-编辑')<button class="btn btn-sm btn-outline-info tooltipTarget"
-                        title="合并多条运单至一条,已填写信息将被累加处理" @click="waybillMerge()">运单合并</button>
-            <button class="btn btn-sm btn-outline-info tooltipTarget"
-                    title="将已合并运单拆分返回原状态" @click="waybillSplit()">拆单返回</button>
-            @endcan
-            @if($uriType=='' || $uriType=='德邦物流')
+                @can('运输管理-运单-图片上传')<button class="btn btn-sm btn-outline-info" data-target="#batchUploadImg" data-toggle="modal">批量上传图片</button>@endcan
+                @can('运输管理-运单-图片删除')<button class="btn btn-sm btn-outline-danger" @click="deleteImg()">批量删除图片</button>@endcan
+                @if($uriType=='' || $uriType=='专线')
+                    @can('运输管理-运单-按日计算专线费')
+                        <button class="btn btn-sm btn-outline-success tooltipTarget" data-target="#dailyBilling" data-toggle="modal"
+                                title="计算指定日期下的所有专线费,不考虑有无货主权限">按日输入专线费</button>@endcan
+                @endif
+                @can('运输管理-编辑')<button class="btn btn-sm btn-outline-info tooltipTarget"
+                                       title="合并多条运单至一条,已填写信息将被累加处理" @click="waybillMerge()">运单合并</button>
                 <button class="btn btn-sm btn-outline-info tooltipTarget"
-                        title="打印快递面单" @click="expressFaceList()">打印快递面单</button>
-            @endif
-            <div>
-                @if(Session::has('successTip'))
-                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                        title="将已合并运单拆分返回原状态" @click="waybillSplit()">拆单返回</button>
+                @endcan
+                @if($uriType=='' || $uriType=='德邦物流')
+                    <button class="btn btn-sm btn-outline-info tooltipTarget"
+                            title="打印快递面单" @click="expressFaceList()">打印快递面单</button>
                 @endif
+                <div>
+                    @if(Session::has('successTip'))
+                        <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                    @endif
+                </div>
+                {{--    德邦面单--}}
+                <div id="lodopTips"></div>
+                {{--    德邦面单--}}
             </div>
-            {{--    德邦面单--}}
-            <div id="lodopTips"></div>
-            {{--    德邦面单--}}
 
             <table class="table table-striped table-bordered table-hover text-nowrap waybill-table td-min-width-80" style="background: #fff;" id="table">
                 <tr v-for="(waybill,i) in waybills" :class="[waybill.status=='待重审'?'td-red':''||waybill.status=='已完结'?'td-green':'',selectTr==waybill.id ? 'tr-select' : '']"
@@ -686,6 +689,7 @@
                     el:"#form_div",
                     condition:data,
                     param:param,
+                    appendDom : "btn",
                 });
                 this.form.init();
                 this.rendingHeader();
@@ -889,7 +893,7 @@
                         column: column,
                         data: this.waybills,
                         restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
+                        fixedTop:($('#form_div').height()) + ($('#btn').height())+2,
                         before : [
                             {colspan:'4',value: '', class:"table-header-layer-1"},
                             {colspan:'15',value: '运单信息',font:"fa fa-file-text-o", class:"table-header-layer-1"},
@@ -1434,7 +1438,7 @@
                     });
                     return val;
                 },
-            }
+            },
         });
         // modal 隐藏时修改 input 为空
         $("#exampleModal").on('hide.bs.modal',function(e){

+ 1 - 0
routes/apiLocal.php

@@ -267,4 +267,5 @@ Route::prefix('workOrder')->group(function(){
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');  // 生成问题件
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi'); // 修改问题类型
     Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型
+    Route::delete('/{id}','WorkOrderController@destroyApi')->name('workOrder.destroyApi');
  });

+ 1 - 0
routes/web.php

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