Jelajahi Sumber

Merge branch 'master' into zzd

zhouzhendong 4 tahun lalu
induk
melakukan
008862cfec
33 mengubah file dengan 629 tambahan dan 162 penghapusan
  1. 27 2
      app/Filters/OrderPackageFilters.php
  2. 11 0
      app/Http/Controllers/HandInStorageController.php
  3. 10 17
      app/Http/Controllers/MeasureMonitorController.php
  4. 5 1
      app/Http/Controllers/PackageLogisticController.php
  5. 11 1
      app/Http/Controllers/RequirementController.php
  6. 10 6
      app/Http/Requests/RequirementRequest.php
  7. 5 0
      app/OrderPackage.php
  8. 2 0
      app/Providers/AppServiceProvider.php
  9. 2 0
      app/Requirement.php
  10. 56 12
      app/Services/HandInStorageService.php
  11. 1 1
      app/Services/LogisticSFService.php
  12. 35 0
      app/Services/MeasureMonitorService.php
  13. 13 0
      app/Services/OrderIssueService.php
  14. 1 5
      app/Services/OrderPackageService.php
  15. 10 2
      app/Services/OrderTrackingService.php
  16. 1 1
      app/library/baidu-api-speech/lib/2a7552bdd1b678c303ad53645baeafce
  17. 32 0
      database/migrations/2021_08_26_100421_change_score_nullable_to_requirements_table.php
  18. 8 15
      laravel-echo-server.json
  19. TEMPAT SAMPAH
      public/sound/滴答电子.mp3
  20. 1 1
      resources/js/queryForm/queryForm.js
  21. 8 0
      resources/js/utilities/tempTip.js
  22. 35 7
      resources/views/package/logistic/index.blade.php
  23. 76 60
      resources/views/package/measureMonitor/index.blade.php
  24. 2 0
      resources/views/requirement/create_and_edit.blade.php
  25. 4 0
      resources/views/requirement/index.blade.php
  26. 51 4
      resources/views/requirement/show.blade.php
  27. 151 0
      resources/views/store/handInStorage/inventoryInfo.blade.php
  28. 43 23
      resources/views/store/handInStorage/putaway.blade.php
  29. 4 0
      resources/views/store/handInStorage/receive.blade.php
  30. 8 0
      resources/views/store/handInStorage/receiveDetailPage.blade.php
  31. 1 1
      resources/views/store/inStorage/androidIndex.blade.php
  32. 5 2
      routes/web.php
  33. 0 1
      tests/Services/LogisticYDService/LogisticYDSyncTest.php

+ 27 - 2
app/Filters/OrderPackageFilters.php

@@ -33,6 +33,8 @@ class OrderPackageFilters
         'default_date',
         'has_transfer_status',
         'is_new_rejecting',
+        'result_explain',
+        'issue_type_name',
     ];
 
     protected $orderIssueQuery;
@@ -173,8 +175,31 @@ class OrderPackageFilters
 
     public function is_new_rejecting($is_new_rejecting)
     {
-        $this->queryBuilder->whereIn('order_id', function ($query) use ($is_new_rejecting) {
-            $query->from('order_issues')->select('order_id')->where('is_new_rejecting', $is_new_rejecting);
+        if ($is_new_rejecting === '有') {
+            $this->queryBuilder->whereIn('logistic_number', function ($query) {
+                $query->from('rejected_bills')->select('logistic_number_return')->where('logistic_number','原单退回')->whereNotNull('logistic_number_return');
+            });
+        }
+        if ($is_new_rejecting === '无') {
+            $this->queryBuilder->whereNotIn('logistic_number', function ($query) {
+                $query->from('rejected_bills')->select('logistic_number_return')->where('logistic_number','原单退回')->whereNotNull('logistic_number_return');
+            });
+        }
+    }
+
+    public function issue_type_name($issue_type_name)
+    {
+        $this->queryBuilder->whereIn('order_id', function ($query) use ($issue_type_name) {
+            $query->from('order_issues')->select('order_id')->where('order_issue_type_id',function ($query) use ($issue_type_name){
+                $query->from('order_issue_types')->select('id')->where('name', $issue_type_name);
+            });
+        });
+    }
+
+    public function result_explain($result_explain)
+    {
+        $this->queryBuilder->whereIn('order_id', function ($query) use ($result_explain) {
+            $query->from('order_issues')->select('order_id')->where('result_explain','like',$result_explain);
         });
     }
 }

+ 11 - 0
app/Http/Controllers/HandInStorageController.php

@@ -195,6 +195,17 @@ class HandInStorageController extends Controller
         }
     }
 
+    public function getInventoryInfos(Request $request)
+    {
+        $this->gate("入库管理-手持入库-库存查询");
+        $param=$request->input('location');
+        /** @var HandInStorageService $handInStorageService  */
+        $handInStorageService=app('HandInStorageService');
+        $invs=$handInStorageService->getInventoryInfos($param);
+        if (count($invs)>0)$this->success($invs);
+        else $this->error('未查询到库存信息');
+    }
+
 
 
 

+ 10 - 17
app/Http/Controllers/MeasureMonitorController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\MeasuringMachine;
 use App\OrderPackage;
+use App\Services\MeasureMonitorService;
 use Illuminate\Http\Request;
 require_once '../app/library/baidu-api-speech/AipSpeech.php';
 class MeasureMonitorController extends Controller
@@ -36,24 +37,16 @@ class MeasureMonitorController extends Controller
         return '';
     }
 
+    /** 获取快递面单的语音播报 */
+    public function speech(Request $request,MeasureMonitorService $service): array
+    {
 
-    public function speech(Request $request){
-        $logistic=$request->input('logistic');
-        if (!$logistic)$logistic='空';
-        if (file_exists("storage/".$logistic.'.mp3')){
-            return "/storage/".$logistic.'.mp3';
-        }
-        $client=new \AipSpeech(config('api.baidu.speech.APP_ID'),config('api.baidu.speech.API_KEY'),config('api.baidu.speech.SECRET_KEY'));
-        $client->setConnectionTimeoutInMillis('180000');
-        $client->setSocketTimeoutInMillis('180000');
-
-        $result = $client->synthesis($logistic, 'zh', 1, array(
-            'vol' => 15,
-        ));
-        // 识别正确返回语音二进制 错误则返回json 参照下面错误码
-        if(!is_array($result)){
-            file_put_contents('storage/'.$logistic.'.mp3', $result);
+        if ( app('OrderIssueService')->isExists($request['logistic_number'])){
+            return $service->getMp3Audio('拦截订单');
         }
-        return "/storage/".$logistic.'.mp3';
+        return $service->getMp3Audio($request->input('logistic'));
+
     }
+
+
 }

+ 5 - 1
app/Http/Controllers/PackageLogisticController.php

@@ -31,7 +31,11 @@ class PackageLogisticController extends Controller
         $paginateParams = $request->input();
         $orderPackages = OrderPackage::query()
             ->filter($filters)
-            ->with(['order.logistic',
+            ->with([
+                'order.logistic',
+                'rejectedBill'=>function($query){
+                    $query->select('id','logistic_number','logistic_number_return')->where('logistic_number', '原单退回');
+                },
                 'orderPackageRemarks' => function ($query) {
                     $query->with('user')->orderByDesc('created_at');
                 },

+ 11 - 1
app/Http/Controllers/RequirementController.php

@@ -9,6 +9,7 @@ use App\Role;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
 
 class RequirementController extends Controller
 {
@@ -35,7 +36,10 @@ class RequirementController extends Controller
     {
         $requirement->fill($request->all());
         $requirement->user_id = Auth::id();
-        $requirement->status = '待接收';
+        $status = null;
+        if (Gate::allows('需求发布-新建-业务部门新建')) $status ='待审核';
+        if (Gate::allows('需求发布-新建-直接发布')) $status ='待接收';
+        $requirement->status = $status;
         $requirement->save();
         return redirect()->route('requirements.index', $requirement->id)->with('success', '需求创建成功!');
     }
@@ -129,4 +133,10 @@ class RequirementController extends Controller
         $requirement->save();
         return redirect()->route('requirements.show', $requirement->id)->with('success', '再次申请验收流程完成');
     }
+
+    public function status(Requirement $requirement,Request $request)
+    {
+        $requirement->update($request->all());
+        return redirect()->route('requirements.show', $requirement->id)->with('success', "状态更新为 {$request->status}成功!");
+    }
 }

+ 10 - 6
app/Http/Requests/RequirementRequest.php

@@ -3,20 +3,24 @@
 namespace App\Http\Requests;
 
 
-class RequirementRequest extends Request
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Gate;
+
+class RequirementRequest extends FormRequest
 {
     public function rules()
     {
-        switch($this->method())
-        {
+        switch ($this->method()) {
             case 'POST':
             case 'PUT':
             case 'PATCH':
             {
+                $score = '';
+                if (Gate::allows('需求发布-新建-直接发布')) $score = 'required|numeric';
                 return [
-                    'content'       => 'required|min:3',
-                    'title'       => 'required|min:3',
-                    'score' => 'required|numeric',
+                    'content' => 'required|min:3',
+                    'title' => 'required|min:3',
+                    'score' => $score,
                 ];
             }
             case 'GET':

+ 5 - 0
app/OrderPackage.php

@@ -395,4 +395,9 @@ class OrderPackage extends Model
     {
         return $this->hasMany(OrderPackageRemark::class);
     }
+
+    public function rejectedBill(): BelongsTo
+    {
+        return $this->belongsTo(RejectedBill::class, 'logistic_number', 'logistic_number_return');
+    }
 }

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -181,6 +181,7 @@ use App\Services\RequirementUserService;
 use App\Services\WorkOrderService;
 use App\Services\WorkOrderTypeService;
 use App\Services\OrderPackageRemarkService;
+use App\Services\MeasureMonitorService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -260,6 +261,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('LogisticZopService', LogisticZopService::class);
         app()->singleton('MaterialBoxModelService',MaterialBoxModelService::class);
         app()->singleton('MaterialBoxService', MaterialBoxService::class);
+        app()->singleton('MeasureMonitorService',MeasureMonitorService::class);
         app()->singleton('MenuService',MenuService::class);
         app()->singleton('NewOrderCountingRecordService',NewOrderCountingRecordService::class);
         app()->singleton('OracleActAllocationDetailService', OracleActAllocationDetailService::class);

+ 2 - 0
app/Requirement.php

@@ -42,6 +42,8 @@ class Requirement extends Model
             '待验收'=>3,
             '验收通过'=>4,
             '验收未通过'=>5,
+            '待审核'=>6,
+            '已驳回'=>7,
         ],
     ];
     function __construct(array $attributes = [])

+ 56 - 12
app/Services/HandInStorageService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\CommodityBarcode;
+use App\OracleActTransactionLog;
 use App\OracleBasCode;
 use App\OracleBasCustomer;
 use App\OracleBasForwardingLoc;
@@ -384,9 +385,11 @@ sql;
             }
         }
 
-        if ($barCode)$sql.=" AND TSK_TASKLISTS.sku in (select SKU from BAS_SKU where ALTERNATE_SKU1='".$barCode."' union
-                                  select SKU from BAS_SKU where ALTERNATE_SKU2='".$barCode."' union
-                                  select SKU from BAS_SKU where ALTERNATE_SKU3='".$barCode."' )";
+        if ($barCode)$sql.=" AND TSK_TASKLISTS.sku in (
+                                    select SKU from BAS_SKU where ALTERNATE_SKU1='".$barCode."' union
+                                    select SKU from BAS_SKU where ALTERNATE_SKU2='".$barCode."' union
+                                    select SKU from BAS_SKU where ALTERNATE_SKU3='".$barCode."' union
+                                    select SKU from BAS_SKU where SKU='".$barCode."' )";
 
         $sql.=' group by TSK_TASKLISTS.CustomerID, TSK_TASKLISTS.DOCNO, TSK_TASKLISTS.Sku, TSK_TASKLISTS.PlanToLotNum,
                TSK_TASKLISTS.PlanToID, DOC_ASN_DETAILS.SKUDESCRC, TSK_TASKLISTS.DOCLINENO) t
@@ -526,16 +529,12 @@ sql;
         return DB::connection("oracle")->transaction(function () use ($info, $invlotatt, $who, $time) {
             //flux 批次号
             $lotNum = $this->getOrCreateLotNum($info, $invlotatt, $who, $time);
-            if (!$lotNum) {
-                DB::connection("oracle")->rollBack();
-                return false;
-            }
+            if (!$lotNum) return false;
+
             //flux 创建入库事务
             $actTransactionLog = $this->setFluxActTransactionLog($info, $lotNum, $who, $time);
-            if (!$actTransactionLog) {
-                DB::connection("oracle")->rollBack();
-                return false;
-            }
+            if (count($actTransactionLog)==0) return false;
+
             //flux 创建上架任务
             $this->setFluxTskTaskListPA($info, $invlotatt, $actTransactionLog, $who, $time);
             //flux 完善库存余量
@@ -692,7 +691,13 @@ sql;
             if ($info['trackNumber']) $trackNumber = $info['trackNumber'];
             else $trackNumber = substr(md5($time), 0, 30);
             $asnHeader = OracleDOCASNHeader::query()->where('asnno', $info['asnno'])->first();
-            $asnDetail = OracleDOCASNDetail::query()->where('asnno', $info['asnno'])->where('sku', $info['sku'])->first();
+            $asnDetail = OracleDOCASNDetail::query()->where('asnno', $info['asnno'])
+                ->where('asnlineno',$info['asnlineno'])->where('sku', $info['sku'])->first();
+            //添加超收判断
+            $actTransactionLogQty=OracleActTransactionLog::query()->where('docno',$info['asnno'])
+                ->where('doclineno',$info['asnlineno'])->where('fmsku', $info['sku'])->count('fmqty');
+            if ((int)($info['amount']+$actTransactionLogQty)>(int)$asnDetail['expectedqty'])return [];
+
             $sql = <<<sql
 INSERT INTO ACT_TRANSACTION_LOG VALUES(?,'IN',?,?,?,?,'ASN',?,?,?,?,?,?,?,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,
 TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,?,null,null,null,?,?,?,?,?,?,?,?,
@@ -796,4 +801,43 @@ sql;
             ->where("name", "flux_ts_number")
             ->update(["value" => DB::raw("value+1")]);
     }
+
+    /**
+     * @param $param
+     * @return array
+     * 获取库存信息
+     */
+    public function getInventoryInfos($param): array
+    {
+        $sql = <<<sql
+select BAS_SKU.SKU,INV_LOT_LOC_ID.CUSTOMERID,BAS_SKU.ALTERNATE_SKU1,INV_LOT_LOC_ID.LOCATIONID,INV_LOT_ATT.LOTATT05,INV_LOT_ATT.LOTATT08,
+       INV_LOT_ATT.LOTATT01,INV_LOT_ATT.LOTATT02,INV_LOT_ATT.LOTATT03,INV_LOT_ATT.LOTATT04,
+       sum(INV_LOT_LOC_ID.QTY) AS QTY from INV_LOT_LOC_ID
+    left join BAS_SKU on INV_LOT_LOC_ID.CUSTOMERID=BAS_SKU.CUSTOMERID and INV_LOT_LOC_ID.SKU =BAS_SKU.SKU
+    left join INV_LOT_ATT on INV_LOT_ATT.LOTNUM=INV_LOT_LOC_ID.LOTNUM where
+sql;
+        if ($this->checkUserOwnerAuth($param)) { //输入条件为货主
+            $sql .= ' INV_LOT_LOC_ID.CUSTOMERID= ?';
+        } else if (preg_match('/^[A-Z]{1,3}[0-9]{2,3}[-][0-9]{2,3}[-][0-9]{2,3}$/', $param)) { //判断是否为库位
+            $sql .= ' INV_LOT_LOC_ID.LOCATIONID= ?';
+        } else {
+            $sql .= " BAS_SKU.SKU in (  select SKU from BAS_SKU where ALTERNATE_SKU1=? union
+                                        select SKU from BAS_SKU where ALTERNATE_SKU2=? union
+                                        select SKU from BAS_SKU where ALTERNATE_SKU3=? union
+                                        select SKU from BAS_SKU where SKU=? )";
+        }
+
+        $sql .= ' group by BAS_SKU.SKU,INV_LOT_LOC_ID.CUSTOMERID,BAS_SKU.ALTERNATE_SKU1,INV_LOT_LOC_ID.LOCATIONID,
+        INV_LOT_ATT.LOTATT05,INV_LOT_ATT.LOTATT08,INV_LOT_ATT.LOTATT01,INV_LOT_ATT.LOTATT02,INV_LOT_ATT.LOTATT03,INV_LOT_ATT.LOTATT04';
+        if ($this->checkUserOwnerAuth($param)){
+            $invLots = DB::connection("oracle")->select(DB::raw($sql), [strtoupper($param)
+            ]);
+        }else if(preg_match('/^[A-Z]{1,3}[0-9]{2,3}[-][0-9]{2,3}[-][0-9]{2,3}$/', $param)){
+            $invLots = DB::connection("oracle")->select(DB::raw($sql), [$param]);
+        }else{
+            $invLots = DB::connection("oracle")->select(DB::raw($sql), [$param,$param,$param,$param]);
+        }
+        if (!$invLots) return [];
+        else return $invLots;
+    }
 }

+ 1 - 1
app/Services/LogisticSFService.php

@@ -173,7 +173,7 @@ xml;
                     $data['status'] = '返回中';
                     break;
                 case 70:
-                    $data['status'] = '';
+                    $data['status'] = '其他';
                     break;
                 default:
                     throw new WarningException("未知的丰桥状态码: {$lastRoute['opcode']}->{json_encode($lastRoute)}");

+ 35 - 0
app/Services/MeasureMonitorService.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+
+require_once '../app/library/baidu-api-speech/AipSpeech.php';
+
+class MeasureMonitorService
+{
+    use ServiceAppAop;
+
+    public function getMp3Audio($content): array
+    {
+        if (!$content)$content='空';
+        if (file_exists("storage/".$content.'.mp3')){
+            return ['success' => true,'data' =>['name'=>$content,'path' =>"/storage/".$content.'.mp3'] ];
+        }
+
+        $client=new \AipSpeech(config('api.baidu.speech.APP_ID'),config('api.baidu.speech.API_KEY'),config('api.baidu.speech.SECRET_KEY'));
+        $client->setConnectionTimeoutInMillis('180000');
+        $client->setSocketTimeoutInMillis('180000');
+
+        $result = $client->synthesis($content, 'zh', 1, array(
+            'vol' => 15,
+        ));
+
+        if(!is_array($result)){
+            file_put_contents('storage/'.$content.'.mp3', $result);
+        }
+
+        return  ['success' => true,'data' =>['name'=>$content,'path' =>"/storage/".$content.'.mp3'] ];
+    }
+
+}

+ 13 - 0
app/Services/OrderIssueService.php

@@ -428,4 +428,17 @@ class OrderIssueService
             $orderIssue->update($updateParams);
         });
     }
+
+    /**
+     * 快递单对应的问题件是否存在
+     * @param $logistic_number
+     * @return bool
+     */
+    public function isExists($logistic_number): bool
+    {
+        $order_package_query = OrderPackage::query()->select('order_id')->whereIn('logistic_number',[$logistic_number]);
+        $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() ;
+    }
 }
+

+ 1 - 5
app/Services/OrderPackageService.php

@@ -2,10 +2,6 @@
 
 namespace App\Services;
 
-use App\Logistic;
-use App\OracleActAllocationDetails;
-use App\OracleDOCOrderDetail;
-use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
@@ -184,7 +180,7 @@ class OrderPackageService
         }
 
         /** 承运商是京东时的定制操作 */
-        if($order['id'] == $logistic['id'] && count($logistic_numbers) == 1){
+        if($order['logistic_id'] == $logistic['id'] && count($logistic_numbers) == 1){
             $logistic_numbers = [$orderHeader['soreference5']];
             $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
         }

+ 10 - 2
app/Services/OrderTrackingService.php

@@ -350,8 +350,16 @@ class OrderTrackingService
             if(mb_stristr($order_remark,'[')){
                 $items = [];
                 preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$order_remark,$items);
-                $params['client'] = $items[1][0];
-                $params['order_remark'] = $items[3][0];
+                if (isset($items[1][0])){
+                    $params['client'] = $items[1][0];
+                } else {
+                    $params['client'] = $orderHeader['issuepartyname'];
+                }
+                if (isset($items[3][0])) {
+                    $params['order_remark'] = $items[3][0];
+                } else {
+                    $params['order_remark'] = $order_remark;
+                }
             }else{
                 $params['client'] = $orderHeader['issuepartyname'];
                 $params['order_remark'] = $order_remark;

+ 1 - 1
app/library/baidu-api-speech/lib/2a7552bdd1b678c303ad53645baeafce

@@ -1 +1 @@
-{"refresh_token":"25.7e4748217e997c84c2402b9b24adb134.315360000.1936752238.282335-18688250","expires_in":2592000,"session_key":"9mzdCPblW0XXeNGCMqTv\/JHlyb1R+CCFsPtDR+I+pkvO3Wt6R95mYM6B\/czx+j6XbwA+xuH79EnEt1k9LyvlecbmLoyo3A==","access_token":"24.32855024de5bed138fec0c12a1dd166d.2592000.1623984238.282335-18688250","scope":"brain_asr_async brain_speech_realtime audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_all_scope picchain_test_picchain_api_scope wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base smartapp_mapp_dev_manage iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406 smartapp_component smartapp_search_plugin avatar_video_test","session_secret":"a8e2a31ba3a17b7c3f30efa29600b809","time":1621392238,"is_cloud_user":false}
+{"refresh_token":"25.795dad640f8af76864554c1c5afb8926.315360000.1945136504.282335-18688250","expires_in":2592000,"session_key":"9mzdX+3tcFZOpclBI6LTZrgxalCMs8nwU+QbwhRD2ex+wA6nIpZQQG7UR3cJNloHVeLBAU+JTC6Chj0iLy1LTU25Zb\/BBA==","access_token":"24.d799fe5d40a04d715a4abe85bf739e5e.2592000.1632368504.282335-18688250","scope":"brain_asr_async brain_speech_realtime audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_all_scope picchain_test_picchain_api_scope wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base smartapp_mapp_dev_manage iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406 smartapp_component smartapp_search_plugin avatar_video_test","session_secret":"71dcb07b69c06e01063930662a5fc2a6","time":1629776504,"is_cloud_user":false}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeScoreNullableToRequirementsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('requirements', function (Blueprint $table) {
+            $table->decimal('score')->nullable()->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('requirements', function (Blueprint $table) {
+            //
+        });
+    }
+}

+ 8 - 15
laravel-echo-server.json

@@ -3,20 +3,13 @@
 	"authEndpoint": "/broadcasting/auth",
 	"clients": [
 		{
-			"appId": "3ce79ec696215d04",
-			"key": "e68440520697de422639b451f760f208"
-		},
-		{
-			"appId": "wcs",
-			"key": "62c8838fa8546ad1f1784327a6d25df2"
+			"appId": "85568e6915a996da",
+			"key": "4339d8623127f8f4e8819901cbf62833"
 		}
 	],
 	"database": "redis",
 	"databaseConfig": {
-		"redis": {
-            "port": "6379",
-            "host": "127.0.0.1"
-        },
+		"redis": {},
 		"sqlite": {
 			"databasePath": "/database/laravel-echo-server.sqlite"
 		}
@@ -36,9 +29,9 @@
 		"redis": true
 	},
 	"apiOriginAllow": {
-        "allowCors" : true,
-        "allowOrigin" : "http://127.0.0.1",
-        "allowMethods" : "GET, POST",
-        "allowHeaders" : "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
+		"allowCors": false,
+		"allowOrigin": "",
+		"allowMethods": "",
+		"allowHeaders": ""
 	}
-}
+}

TEMPAT SAMPAH
public/sound/滴答电子.mp3


+ 1 - 1
resources/js/queryForm/queryForm.js

@@ -635,7 +635,7 @@ const query = function getQueryForm(data) {
         input.attr('title', controlJsType(condition.tip[1], 'undefined') ? '' : condition.tip[1]);
         input.attr('placeholder', controlJsType(condition.placeholder[1], 'undefined') ? '' : condition.placeholder[1])
 
-        let ul_div = $("<div class='pl-0 tooltipTarget' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; transform: scale(0.9);z-index:95' ></div>");
+        let ul_div = $("<div class='pl-0 tooltipTarget' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; z-index:95' ></div>");
         let ul = $("<ul name='" + condition.name + "' class='list-group pl-0 m-0 p-0 bg-white' style='list-style-type: none;width: 150px;top:35px; z-index: 95' ></ul>");
         let check = $("<input id='multipleCheckBox' type = 'checkbox' style='z-index:101;position:fixed;top:0;right: 0;border:1px green' >");
         let isMouseenterCheckBox = false;

+ 8 - 0
resources/js/utilities/tempTip.js

@@ -138,6 +138,14 @@ const tempTip={
             this.show('网络异常:'+err);
         });
     },
+    showErrorAudio:function (){
+        let src='/sound/滴答电子.mp3';
+         let audio= new Audio(src);
+         setTimeout(function (){
+             audio.play();
+         })
+        window.navigator.vibrate(1000);
+    }
 };
 module.exports=tempTip;
 

+ 35 - 7
resources/views/package/logistic/index.blade.php

@@ -119,11 +119,11 @@
                             @{{ i+1 }}
                             <span class="badge badge-danger" v-if="package.order.issue">问题件</span>
                             <span
-                                style="display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: absolute;top: 2px; margin-left: 3px;box-shadow: 0 0 3px #211f1f"
+                                style="display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: relative;top: 3px; margin-left: 3px;box-shadow: 0 0 3px #211f1f"
                                   :style="package.sync_routes_flag?'background-color:#4ed32d':'background-color:#e83939'"></span>
                             <span v-if="package.is_manual_update">
                                 <i class="fa fa-hand-paper-o" aria-hidden="true"
-                                   style="color: red;position: absolute;left: 50px;top: 3px;"></i>
+                                   style="color: red;margin-left: 5px"></i>
                             </span>
                         </span>
                     </td>
@@ -156,7 +156,7 @@
                         </div>
                     </td>
                     <!--退件状态-->
-                    <td>@{{ package.order.issue?package.order.issue.is_new_rejecting:'' }}</td>
+                    <td>@{{ package.rejected_bill?'有':'无' }}</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">
@@ -189,8 +189,7 @@
                         </div>
                         @endcan
                     </td>
-                    <td class="text-overflow-warp-200"><span v-if="package.order && package.order.issue">@{{ package.order.issue.result_explain }}</span>
-                    </td>
+                    <td class="text-overflow-warp-200"><span v-if="package.order && package.order.issue">@{{ package.order.issue.result_explain }}</span></td>
                     <td class="text-overflow-warp-200"><span
                             v-if="package.order && package.order.issue && package.order.issue.issue_type">@{{ package.order.issue.issue_type.name }}</span>
                     </td>
@@ -310,6 +309,7 @@
                     [
                         {name: 'logistic_number', type: 'input', tip: '可支持多快递单号,糊模查找需要在右边打上%符号', placeholder: '快递单号'},
                         {name: 'remark', type: 'input', tip: '糊模查找需要在右边打上%符号', placeholder: '客服备注'},
+                        {name: 'result_explain', type: 'input', tip: '糊模查找需要在右边打上%符号', placeholder: '情况说明'},
                         {
                             name: 'status',
                             type: 'select_multiple_select',
@@ -343,7 +343,8 @@
                         {name: 'received_at_start', type: 'dateTime', tip: '选择显示收货时间的起始时间'},
                         {name: 'default_date', type: 'checkbox', tip: '默认15天', data: [{name: 'ture', value: '默认15天'}]},
                         {name: 'default_logistics', type: 'checkbox', tip: '默认承运商', data: [{name: 'ture', value: '默认承运商'}]},
-                    ], [
+                    ],
+                    [
                         {
                             name: 'logistic',
                             type: 'select_multiple_select',
@@ -386,7 +387,34 @@
                             type: 'select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
                             placeholder: '退件状态',
-                            data: [{name: '无', value: '无'}, {name: '有', value: '有'},{name: '已处理', value: '已处理'}]
+                            data: [{name: '无', value: '无'}, {name: '有', value: '有'}]
+                        },
+                    ],
+                    [
+                        {
+                            name: 'issue_type_name',
+                            type: 'select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
+                            placeholder: '问题类型',
+                            data: [
+                                {name: '拦截', value: '拦截'},
+                                {name: '快递异常', value: '快递异常'},
+                                {name: '信息更改', value: '信息更改'},
+                                {name: '联系不上', value: '联系不上'},
+                                {name: '其他', value: '其他'},
+                                {name: '错漏发', value: '错漏发'},
+                                {name: '仓库问题', value: '仓库问题'},
+                                {name: '快递丢件', value: '快递丢件'},
+                                {name: '破损', value: '破损'},
+                                {name: '撤销丢件', value: '撤销丢件'},
+                                {name: '二次加工', value: '二次加工'},
+                                {name: '全检问题', value: '全检问题'},
+                                {name: '系统问题', value: '系统问题'},
+                                {name: '延迟发货', value: '延迟发货'},
+                                {name: '仓库丢件', value: '仓库丢件'},
+                                {name: '快递方式更改', value: '快递方式更改'},
+                                {name: '无记录', value: '无记录'},
+                            ]
                         },
                     ]
                 ];

+ 76 - 60
resources/views/package/measureMonitor/index.blade.php

@@ -62,6 +62,7 @@
                     </div>
                 </div>
             </section>
+
         </div>
     </div>
 @endsection
@@ -102,50 +103,38 @@
                     let audioTag=$('<audio id="audio'+i+'" src="" autoplay></audio>');
                     body.append(audioTag);
                 }
-                let _this=this;
-                _this.measuringMachines.forEach(function(machine){
-                    _this.measuringMachinesIndex[machine.name]=machine;
-                });
 
+
+                this.measuringMachines.forEach((machine)=>{
+                    this.measuringMachinesIndex[machine.name] = machine;
+                })
                 initEcho();
-                Echo.channel('{{$laravelEchoPrefix}}package').listen('WeighedEvent',(e)=>{
-                    let package=e.package;
-                    let _this=this;
-                    let audio=document.getElementById("audio"+_this.currentAudioIndex);
-                    if (_this.currentAudioIndex==_this.amount){
-                        _this.currentAudioIndex=1;
-                    }else{
-                        _this.currentAudioIndex=_this.currentAudioIndex+1;
+                Echo.channel('{{$laravelEchoPrefix}}package').listen('WeighedEvent',e=>{
+                    let item = e.package;
+                    let audio = document.getElementById('audio'+this.currentAudioIndex);
+                    if (this.currentAudioIndex === this.amount){
+                        this.currentAudioIndex = 1;
+                    } else {
+                        this.currentAudioIndex = this.currentAudioIndex +1;
                     }
-                    if (package && package.measuring_machine && package.measuring_machine.name ===_this.package.measuringMachine){
-                        if (package.id ===_this.package.id){
-                            _this.package.measuringMachine_status=package.measuring_machine.status;
-                            _this.measuringMachinesIndex[package.measuring_machine.name].status=package.measuring_machine.status;
-                            tempTip.setDuration(2000);
-                            tempTip.showSuccess('暂无新数据');
-                            return;
+                    if (item && item.measuring_machine && item.measuring_machine.name === this.package.measuringMachine){
+                        if (item.id === this.package.id){
+                            this.package.measuringMachine_status = item.measuring_machine.status;
+                            this.measuringMachinesIndex[item.measuring_machine.name].status = item.measuring_machine.status;
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.showSuccess('暂无新数据');
+                            return ;
                         }
-                        _this.updateData(_this,package);
-                        let logistic_name = package.order ? (package.order.logistic ? package.order.logistic.name : '') : '';
-                        if (_this.logisticAudioURL[logistic_name]){
-                            audio.src=_this.logisticAudioURL[logistic_name];
+                        this.updateData(item);
+                        let logistic_name = item.order ? (item.order.logistic ? item.order.logistic.name : '') : '';
+                        let logistic_number = item.logistic_number;
+                        if (this.logisticAudioURL[logistic_name]){
+                            audio.src=this.logisticAudioURL[logistic_name];
                             setTimeout(()=>{
                                 audio.play();
                             },0);
-                        }else {
-                            window.tempTip.setDuration(3000);
-                            window.axios.post("{{url('package/weigh/measureMonitor/speech')}}",{logistic:logistic_name})
-                                .then(function (response) {
-                                    if (response.data){
-                                        _this.logisticAudioURL[logistic_name]=response.data;
-                                        audio.src=response.data;
-                                        setTimeout(()=>{
-                                            audio.play();
-                                        },0);
-                                    }else window.tempTip.show('没有对应快递名称!');
-                                }).catch(function (err) {
-                                    window.tempTip.show('语音合成发生错误:'+err);
-                                });
+                        } else {
+                            this.speech(logistic_name,logistic_number);
                         }
                         window.tempTip.setDuration(1000);
                         window.tempTip.showSuccess('刷新成功!');
@@ -154,36 +143,63 @@
             },
             methods:{
                 clickMeasuringMachine(e){
-                    let _this=this;
-                    window.axios.post('{{url('package/weigh/measureMonitor/data')}}',{id:e})
-                        .then(function (response) {
-                            if (response.data.id){
-                                let orderPackage=response.data;
-                                _this.updateData(_this,orderPackage);
-                                _this.package.measuringMachine=orderPackage.measuring_machine ? orderPackage.measuring_machine.name : '';                            }else {
+                    let url  = '{{route('measureMonitor.dataApi')}}';
+                    let data = {id:e};
+                    window.axios.post(url,data).then(res =>{
+                            if (res.data.id){
+                                let orderPackage=res.data;
+                                this.updateData(orderPackage);
+                                this.package.measuringMachine= orderPackage.measuring_machine ? orderPackage.measuring_machine.name : '';
+                            }else {
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('暂无数据!');
                             }
-                        })
-                        .catch(function (err) {
+                        }).catch(err=>{
                             tempTip.setDuration(4000);
                             tempTip.show('切换设备错误:'+err);
                         });
                 },
-                updateData(_this,package){
-                    _this.package.id=package.id;
-                    _this.package.logistic_number=package.logistic_number;
-                    _this.package.orderno = package.order ?  package.order.code : '';
-                    _this.package.weight=package.weight;
-                    _this.package.owner=package.order ? (package.order.owner ? package.order.owner.name : '') : '';
-                    _this.package.paperBox=package.paper_box ? package.paper_box.name : '';
-                    _this.package.recipient=package.order ? package.order.recipient : '';
-                    _this.package.status=package.status;
-                    _this.package.weighed_at=package.weighed_at;_this.package.bulk=package.bulk;
-                    _this.package.logistic_name=package.order ? (package.order.logistic ? package.order.logistic.name : '') : '';
-                    _this.package.measuringMachine_status=package.measuring_machine ? package.measuring_machine.status : '';
-                    _this.measuringMachinesIndex[package.measuring_machine ? package.measuring_machine.name : ''].status=package.measuring_machine ? package.measuring_machine.status : '离线';
-                }
+                updateData(item){
+                    this.package.id=item.id;
+                    this.package.logistic_number=item.logistic_number;
+                    this.package.orderno = item.order ?  item.order.code : '';
+                    this.package.weight=item.weight;
+                    this.package.owner=item.order ? (item.order.owner ? item.order.owner.name : '') : '';
+                    this.package.paperBox=item.paper_box ? item.paper_box.name : '';
+                    this.package.recipient=item.order ? item.order.recipient : '';
+                    this.package.status=item.status;
+                    this.package.weighed_at=item.weighed_at;
+                    this.package.bulk=item.bulk;
+                    this.package.logistic_name=item.order ? (item.order.logistic ? item.order.logistic.name : '') : '';
+                    this.package.measuringMachine_status=item.measuring_machine ? item.measuring_machine.status : '';
+                    this.measuringMachinesIndex[item.measuring_machine ? item.measuring_machine.name : ''].status = item.measuring_machine ? item.measuring_machine.status : '离线';
+                },
+                speech(logistic_name,logistic_number){
+                    let audio = document.getElementById('audio'+this.currentAudioIndex);
+                    window.tempTip.setDuration(3000);
+                    let url = '{{route('measureMonitor.speechApi')}}';
+                    let data = {logistic:logistic_name,logistic_number:logistic_number};
+                    window.axios.post(url,data).then(res=>{
+                        if(res.data.success){
+                            let name =res.data.data.name;
+                            let path = res.data.data.path;
+                            this.logisticAudioURL[name] = path;
+                            audio.src = path;
+                            setTimeout(()=>{
+                                audio.play();
+                            },0);
+                        }else {
+                            if (res.data.data){
+                                audio.src = res.data.data.path;
+                                setTimeout(()=>{
+                                    audio.play();
+                                },0);
+                            }
+                        }
+                    }).catch(err=>{
+                        window.tempTip.show('语音合成发生错误:'+err);
+                    });
+                },
             },
         });
     </script>

+ 2 - 0
resources/views/requirement/create_and_edit.blade.php

@@ -34,6 +34,7 @@
                                   placeholder="请填入至少三个字符的内容。"
                                   required>{{ old('content', $requirement->content ) }}</textarea>
                                     </div>
+                                    @can('需求发布-新建-直接发布')
                                     <div class="form-group">
                                         <label class="form-group" for="score">分数</label>
 
@@ -41,6 +42,7 @@
                                                value="{{ old('score', $requirement->score ) }}" placeholder="请填写分数"
                                                required></input>
                                     </div>
+                                    @endcan
                                     <div class="well well-sm">
                                         <button type="submit" class="btn btn-primary"> 保存</button>
                                     </div>

+ 4 - 0
resources/views/requirement/index.blade.php

@@ -221,6 +221,10 @@
                             return "badge badge-success";
                         case '验收未通过':
                             return "badge badge-danger";
+                        case '待审核':
+                            return "badge badge-warning";
+                            case '已驳回':
+                            return "badge badge-danger";
                     }
                 }
             },

+ 51 - 4
resources/views/requirement/show.blade.php

@@ -12,18 +12,21 @@
                         发布人:{{ $requirement->creator->name }}
                     </div>
                     <div class="text-center">
-                        分数:{{ $requirement->score }}
+                        分数:{{ $requirement->score??'-' }}
+                    </div>
+                    <div class="text-center">
+                        状态:{{ $requirement->status }}
                     </div>
                 </div>
             </div>
         </div>
         <div class="col-12">
             <div class="card">
-                <div class="card-body">
-                    <h1 class="text-center mt-3 mb-3">
+                <div class="card-body text-center" style="width: 1200px;margin: 0 auto;">
+                    <h1>
                         {{ $requirement->title }}
                     </h1>
-                    <div class="text-center mt-4 mb-4">
+                    <div class="mt-4 mb-4">
                         {{ $requirement->content }}
                     </div>
                 </div>
@@ -78,7 +81,51 @@
                     </form>
                 </div>
             </div>
+        @elseif($requirement->status==='待审核')
+            <div class="m-4">
+                <form action="{{ route('requirements.status',$requirement->id) }}" method="post"
+                      style="display: inline-block;"
+                      onsubmit="return confirm('您确定要驳回需求么?');">
+                    {{ csrf_field() }}
+                    <input type="text" hidden name="status" value="已驳回">
+                    <button type="submit" class="btn btn-danger"> 驳回需求</button>
+                </form>
 
+                <form action="{{ route('requirements.status',$requirement->id) }}" method="post"
+                      style="display: inline-block;"
+                      onsubmit>
+                    {{ csrf_field() }}
+                    <input type="text" hidden name="status" value="待接收">
+                    <!-- Button trigger modal -->
+                    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
+                        通过审核
+                    </button>
+
+                    <!-- Modal -->
+                    <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
+                        <div class="modal-dialog">
+                            <div class="modal-content">
+                                <div class="modal-header">
+                                    <h5 class="modal-title" id="exampleModalLabel">输入分数</h5>
+                                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                        <span aria-hidden="true">&times;</span>
+                                    </button>
+                                </div>
+                                <div class="modal-body">
+                                    <div class="form-group">
+                                        <label for="exampleInputEmail1">分数</label>
+                                        <input type="number" name="score" class="form-control">
+                                    </div>
+                                </div>
+                                <div class="modal-footer">
+                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                                    <button type="submit" class="btn btn-success">通过审核</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
         @elseif($requirement->status==='开发中')
             <div class="col-12">
                 <div class="text-center m-4">

+ 151 - 0
resources/views/store/handInStorage/inventoryInfo.blade.php

@@ -0,0 +1,151 @@
+@extends('layouts.app')
+@section('title')手持入库-库存查询@endsection
+
+@section('content')
+    <div class="d-none" id="container">
+        <div class="card offset-md-3 col-md-6">
+            <div class="card-header text-center bg-transparent" id="header_title">
+                <span class="font-weight-bold h3">库存查询</span>
+            </div>
+            <div >
+                <div class="offset-1 mt-2">
+                    <span class="font-weight-bold h5">库位/货主/条码:</span><br>
+                    <p class="small font-weight-light">可输入商品条码,库位,货主编号(如:YOUWU)_查询</p>
+                    <div class="form-group row mt-2">
+                        <label for="location"></label>
+                        <input type="text" class="form-control col-8" id="location" autocomplete="off"
+                               :class="errors.location ? 'is-invalid' : ''" v-model="info.location">
+                        <span class="ml-2">
+                             <button type="button" id="select" class="btn btn-info font-weight-bold" @click="getInventoryInfos()">查询</button>
+                        </span>
+                        <span class="invalid-feedback" role="alert" v-if="errors.location">
+                            <strong>@{{ errors.location[0] }}</strong>
+                        </span>
+                    </div>
+                </div>
+                <div style="overflow: auto;overflow-x: hidden" id="cardTable">
+                    <table class="table-sm table-striped table-bordered table-hover mb-3" style="background: rgb(255, 255, 255);" v-if="invs.length>0">
+                    <tr v-for="(invLot,i) in invs" @click="selectTrOne(i)" :class="selectTr===i+1?'focusing' : ''">
+                        <td style="filter:grayscale(30%);">
+                            <div>
+                                <div style="transform:scale(1)" class="pl-0">
+                                        <span v-if="invLot.customerid">
+                                            <span class="text-black">货主:</span>
+                                            <span class="text-black font-weight-bold">@{{ invLot.customerid }}</span>
+                                        </span>
+                                    <span v-if="invLot.sku">
+                                            <span class="text-black">SKU:</span>
+                                            <span class="text-black font-weight-bold">@{{ invLot.sku }}</span>
+                                    </span>
+                                    <span v-if="invLot.alternate_sku1">
+                                            <span class="text-black">条码:</span>
+                                            <span class="text-danger">@{{ invLot.alternate_sku1 }}</span></span>
+                                    <span v-if="invLot.locationid">
+                                            <span>库位:</span>
+                                            <span class="font-weight-bold">@{{ invLot.locationid }} </span>
+                                        </span>
+                                    <span v-if="invLot.qty">
+                                            <span class="text-lowercase">数量:</span>
+                                            <span class="text-lowercase font-weight-bold">@{{ invLot.qty }} </span><span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt01">
+                                            <span class="text-black">生产日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt01 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt02">
+                                            <span class="text-black">失效日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt02 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt03">
+                                            <span class="text-black">入库日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt03 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt04">
+                                            <span class="text-black">批号:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt04 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt05">
+                                            <span class="text-black">属性仓:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt05 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                    <span v-if="invLot.lotatt08">
+                                            <span class="text-black">质量状态:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt08 }}</span>
+                                            <span>&nbsp;&nbsp;</span>
+                                        </span>
+                                </div>
+                            </div>
+                        </td>
+                    </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+@stop
+
+@section('lastScript')
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                height:0,//屏幕高度
+                info:{},
+                errors:{},
+                invs:[],
+                selectTr:'',
+                isAndroid:false,
+            },
+            mounted(){
+                if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
+                this.pageInit();
+                $("#container").removeClass("d-none");
+                this.height=window.screen.availHeight;
+                document.getElementById('cardTable').style.height=this.height*0.50+'px';
+                $('#location').trigger("click").focus();
+            },
+            methods:{
+                //页面初始化
+                pageInit(){
+                    if (!this.isAndroid)return;
+                    let element = document.getElementById("navbarSupportedContent").parentElement;
+                    element.className = "row";
+                    element.children[0].className += " col-5";
+                    element.innerHTML = element.children[0].outerHTML;
+                    let e1 = document.getElementById("menu");
+                    let e2 = document.getElementById("demand-div");
+                    if (e1)e1.remove();
+                    if (e2)e2.remove();
+                    document.getElementById('app').firstElementChild.style.display = 'none';
+                },
+                selectTrOne(i){
+                    if (this.selectTr===i+1){
+                        this.selectTr=0
+                    }else {
+                        this.selectTr=i+1;
+                    }
+                },
+                getInventoryInfos(){
+                    let error = {};
+                    if (!this.info.location)error.location = ["库位/货主/条码必填"];
+                    if (JSON.stringify(error)!=='{}'){this.errors = error;return;}
+                    let url = '{{url('store/handInStorage/getInventoryInfos')}}';
+                    window.axios.post(url,{location:this.info.location})
+                        .then(res=>{
+                            if (res.data.success){
+                                this.invs=res.data.data;
+                                this.$forceUpdate()
+                                return;
+                            }
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                            window.tempTip.showErrorAudio();
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
+                    })
+                },
+            },
+        });
+    </script>
+@stop

+ 43 - 23
resources/views/store/handInStorage/putaway.blade.php

@@ -85,59 +85,61 @@
                     </table>
                 </div>
 
-                <div style="overflow: auto;overflow-x: hidden" class="bg-secondary" v-if="invLots.length>0">
-                    <span class="font-weight-bold ml-1 text-white">库存余量</span>
-                    <table class="table-sm table-striped table-bordered table-hover mb-3"
-                           style="background: rgb(255, 255, 255);">
-                        <tr v-for="(invLot,i) in invLots">
-                            <td style="filter:grayscale(30%);">
-                                <div>
-                                    <div style="transform:scale(1)" class="pl-0">
+                    <div style="overflow: auto;overflow-x: hidden" class="bg-secondary" v-if="invLots.length>0">
+                        <span class="font-weight-bold ml-1 text-white">库存余量</span>
+                        <table class="table-sm table-striped table-bordered table-hover mb-3"
+                               style="background: rgb(255, 255, 255);">
+                            <tr v-for="(invLot,i) in invLots" @click="selectTrOne(i,invLot.locationid)" :class="selectTr===i+1?'focusing' : ''">
+                                <td style="filter:grayscale(30%);">
+                                    <div>
+                                        <div style="transform:scale(1)" class="pl-0">
                                         <span v-if="invLot.customerid">
                                             <span class="text-black">货主:</span>
                                             <span class="text-black font-weight-bold">@{{ invLot.customerid }}</span>
                                         </span>
-                                        <span v-if="invLot.alternate_sku1">
+                                            <span v-if="invLot.alternate_sku1">
                                             <span class="text-black">条码:</span>
                                             <span class="text-danger">@{{ invLot.alternate_sku1 }}</span></span>
-                                        <span v-if="invLot.locationid">
+                                            <span v-if="invLot.locationid">
                                             <span>库位:</span>
                                             <span class="font-weight-bold">@{{ invLot.locationid }} </span>
                                         </span>
-                                        <span v-if="invLot.qty">
+                                            <span v-if="invLot.qty">
                                             <span class="text-lowercase">数量:</span>
                                             <span class="text-lowercase font-weight-bold">@{{ invLot.qty }} </span><span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt01">
+                                            <span v-if="invLot.lotatt01">
                                             <span class="text-black">生产日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt01 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt02">
+                                            <span v-if="invLot.lotatt02">
                                             <span class="text-black">失效日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt02 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt03">
+                                            <span v-if="invLot.lotatt03">
                                             <span class="text-black">入库日期:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt03 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt04">
+                                            <span v-if="invLot.lotatt04">
                                             <span class="text-black">批号:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt04 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt05">
+                                            <span v-if="invLot.lotatt05">
                                             <span class="text-black">属性仓:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt05 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
-                                        <span v-if="invLot.lotatt08">
+                                            <span v-if="invLot.lotatt08">
                                             <span class="text-black">质量状态:</span><span class="text-black font-weight-bold">@{{ invLot.lotatt08 }}</span>
                                             <span>&nbsp;&nbsp;</span>
                                         </span>
+                                        </div>
                                     </div>
-                                </div>
-                            </td>
-                        </tr>
-                    </table>
-                </div>
+                                </td>
+                            </tr>
+                        </table>
+                    </div>
+                    <span v-if="mes" class="text-danger font-weight-bold" >@{{ mes }}</span>
+
 
                 <div class="card-footer bg-transparent">
                     <button type="button" id="confirm" class="btn btn-md btn-success font-weight-bold float-right"
@@ -167,6 +169,7 @@
                         element: [
                             "trackNumber","barCode", "amount", "location",
                         ],
+                        mes:'',
                     },
                     mounted() {
                         if (navigator.userAgent.indexOf("Android") !== -1) this.isAndroid = true;
@@ -195,6 +198,14 @@
                           this.checkData=[];
                           this.$forceUpdate();
                         },
+                        selectTrOne(i,location){
+                            if (this.selectTr===i+1){
+                                this.selectTr=0
+                            }else {
+                                this.selectTr=i+1;
+                                this.info.location=location;
+                            }
+                        },
                         checked(e, task, element = undefined) {
                             if (!element)element = e.target;
                             let _this = this;
@@ -214,6 +225,7 @@
                                             $('#'+element.id).prop('checked', false);
                                             window.tempTip.setDuration(3000);
                                             window.tempTip.show('货主,批次不同,不可同时上架');
+                                            window.tempTip.showErrorAudio();
                                         }
                                     });
                                 }
@@ -258,10 +270,12 @@
                                     this.tasks=[];
                                     window.tempTip.setDuration(3000);
                                     window.tempTip.show(res.data.data);
+                                    window.tempTip.showErrorAudio();
                                 }).catch(err => {
                                 this.tasks=[];
                                 window.tempTip.setDuration(3000);
                                 window.tempTip.show("网络错误:" + err);
+                                window.tempTip.showErrorAudio();
                             })
                         },
                         getTsk() {
@@ -280,6 +294,7 @@
                                     if (res.data.success) {
                                         this.tasks = res.data.data;
                                         this.invLots = res.data.inv;
+                                        if (this.invLots.length==0)this.mes='库内暂无该商品库存信息,请自行选定上架库位';
                                         this.$forceUpdate();
                                         setTimeout(function () {
                                             document.getElementById("task_0").checked=true;
@@ -290,9 +305,10 @@
                                                 if (i==0)return;
                                                 if (task.customerid == _this.tasks[0].customerid
                                                     && task.plantolotnum == _this.tasks[0].plantolotnum
-                                                    && task.sku == _this.tasks[0].sku)
+                                                    && task.sku == _this.tasks[0].sku){
                                                     document.getElementById("task_"+i).checked=true;
                                                     _this.checked(1,_this.tasks[i],element);
+                                                }
                                             })
                                             // document.getElementById('cardTable').remove();
                                             document.getElementById('cardTable').style.height=null;
@@ -302,10 +318,12 @@
                                     this.tasks=[];
                                     window.tempTip.setDuration(3000);
                                     window.tempTip.show(res.data.data);
+                                    window.tempTip.showErrorAudio();
                                 }).catch(err => {
                                 this.tasks=[];
                                 window.tempTip.setDuration(3000);
                                 window.tempTip.show("网络错误:" + err);
+                                window.tempTip.showErrorAudio();
                             })
                         },
                         clearChecked(){
@@ -345,9 +363,11 @@
                                     }
                                     window.tempTip.setDuration(3000);
                                     window.tempTip.show(res.data.data);
+                                    window.tempTip.showErrorAudio();
                                 }).catch(err=>{
                                 window.tempTip.setDuration(3000);
                                 window.tempTip.show("网络错误:"+err);
+                                window.tempTip.showErrorAudio();
                             })
 
                         },

+ 4 - 0
resources/views/store/handInStorage/receive.blade.php

@@ -142,9 +142,11 @@
                             }
                             window.tempTip.setDuration(2000);
                             window.tempTip.show(res.data.data);
+                            window.tempTip.showErrorAudio();
                         }).catch(err=>{
                         window.tempTip.setDuration(2000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 closeDetail(asn){
@@ -182,10 +184,12 @@
                             }else {
                                 window.tempTip.setDuration(2000);
                                 window.tempTip.show(res.data.data);
+                                window.tempTip.showErrorAudio();
                             }
                         }).catch(err=>{
                         window.tempTip.setDuration(2000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 cancel(){

+ 8 - 0
resources/views/store/handInStorage/receiveDetailPage.blade.php

@@ -211,9 +211,11 @@
                             this.clearInfo();
                             window.tempTip.setDuration(2000);
                             window.tempTip.show(res.data.data);
+                            window.tempTip.showErrorAudio();
                         }).catch(err=>{
                         window.tempTip.setDuration(2000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 checked(asnDetail){
@@ -231,9 +233,11 @@
                             }
                             window.tempTip.setDuration(2000);
                             window.tempTip.show(res.data.data);
+                            window.tempTip.showErrorAudio();
                         }).catch(err=>{
                         window.tempTip.setDuration(2000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 clearInfo(){
@@ -296,10 +300,12 @@
                                 window.tempTip.setDuration(3000);
                                 window.tempTip.show(res.data.data);
                                 this.isInit=true;
+                                window.tempTip.showErrorAudio();
                             }
                         }).catch(err=>{
                         window.tempTip.setDuration(3000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 ensure(){
@@ -335,9 +341,11 @@
                             }
                             window.tempTip.setDuration(3000);
                             window.tempTip.show(res.data.data);
+                            window.tempTip.showErrorAudio();
                         }).catch(err=>{
                         window.tempTip.setDuration(2000);
                         window.tempTip.show("网络错误:"+err);
+                        window.tempTip.showErrorAudio();
                     })
                 },
                 cancel(){

+ 1 - 1
resources/views/store/inStorage/androidIndex.blade.php

@@ -22,7 +22,7 @@
 <!--                <a href="{{url('store/inStorage/cacheRackStorage')}}"><button class="btn btn-info w-75 text-white" style="height: 60px"><h4>整箱入库</h4></button></a>-->
                 @can("入库管理-手持入库-收货")<a href="{{url('store/handInStorage/receive')}}"><button class="btn btn-info w-75 h-25 text-white" style="height: 60px"><h4>收货</h4></button></a>@endcan
                 @can("入库管理-手持入库-上架")<a href="{{url('store/handInStorage/putaway')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>上架</h4></button></a>@endcan
-{{--                @can("入库管理-手持入库-库存查询")<a href="{{url('store/handInStorage/inventoryInfo')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>库存查询</h4></button></a>@endcan--}}
+                @can("入库管理-手持入库-库存查询")<a href="{{url('store/handInStorage/inventoryInfo')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>库存查询</h4></button></a>@endcan
                 @can("入库管理-入库-半箱补货入库")<a href="{{url('store/inStorage/halfChestStorage')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>半箱入库</h4></button></a>
                 <a href="{{url('store/inStorage/boxBindShelf')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>新箱上架</h4></button></a>
                 <a href="{{url('store/inStorage/boxBindModel')}}"><button class="btn btn-info w-75 h-25 mt-3 text-white" style="height: 60px"><h4>料箱型号</h4></button></a>

+ 5 - 2
routes/web.php

@@ -23,10 +23,10 @@ Auth::routes();
 Route::get('/', function () {return redirect('login');});
 Route::any('test/{method}', 'TestController@method');
 //称重广播
-Route::post('package/weigh/measureMonitor/speech','MeasureMonitorController@speech');
+Route::post('package/weigh/measureMonitor/speech','MeasureMonitorController@speech')->name('measureMonitor.speechApi');
 //设备切换
 Route::post('package/measureMonitor/data','MeasureMonitorController@data');
-Route::post('package/weigh/measureMonitor/data','MeasureMonitorController@data');
+Route::post('package/weigh/measureMonitor/data','MeasureMonitorController@data')->name('measureMonitor.dataApi');
 //称重显示
 Route::get('package/measureMonitor','MeasureMonitorController@index');
 Route::get('package/weigh/measureMonitor','MeasureMonitorController@index');
@@ -509,8 +509,10 @@ Route::group(['prefix'=>'package'],function(){
         Route::group(['prefix'=>'handInStorage'],function() {
             Route::get('receive',function (){return view('store.handInStorage.receive');});//收货页面
             Route::get('putaway',function (){return view('store.handInStorage.putaway');});//上架页面
+            Route::get('inventoryInfo',function (){return view('store.handInStorage.inventoryInfo');});//库存查询页面
             Route::get('android.index',function (){return view('store.handInStorage.androidIndex');});
             Route::post('selectAsn','HandInStorageController@selectAsn');
+            Route::post('getInventoryInfos','HandInStorageController@getInventoryInfos');
             Route::post('checkAsnOperation','HandInStorageController@checkAsnOperation');
             Route::post('selectAsnDetails','HandInStorageController@selectAsnDetails');
             Route::post('getBasSkuWithLot','HandInStorageController@getBasSkuWithLot');
@@ -1029,6 +1031,7 @@ Route::group(['prefix'=>'package'],function(){
         Route::get('{requirement}/edit','RequirementController@edit')->name('requirements.edit');
         Route::post('{requirement}/review','RequirementController@review')->name('requirements.review');
         Route::post('{requirement}/againReview','RequirementController@againReview')->name('requirements.againReview');
+        Route::post('{requirement}/status','RequirementController@status')->name('requirements.status');
     });
 
 });

+ 0 - 1
tests/Services/LogisticYDService/LogisticYDSyncTest.php

@@ -5,7 +5,6 @@ use App\Jobs\LogisticYDSync;
 use App\OrderPackage;
 use App\Services\LogisticYDService;
 use Tests\TestCase;
-use App\LogisticYD;
 use App\Traits\TestMockSubServices;
 
 class LogisticYDSyncTest extends TestCase