Bladeren bron

人事--添加劳务所筛选,显示总用工工时

haozi 5 jaren geleden
bovenliggende
commit
cf5d4bc108

+ 10 - 1
app/Http/Controllers/LaborReportController.php

@@ -62,9 +62,18 @@ class LaborReportController extends Controller
                 app('LogService')->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
             }
         }
+        $totalWorkingHours=$this->getTotalWorkingHours($request->input());
         $laborCompanies=LaborCompany::query()->get();
         $userWorkGroups=UserWorkgroup::query()->select('id','name')->get();
-        return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laborCompanies','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave'));
+        return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laborCompanies','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave','totalWorkingHours'));
+    }
+    public function getTotalWorkingHours($param){
+        $totalLaborReports=app('laborReportService')->get($param);
+        $totalWorkingHours=0;
+        foreach ($totalLaborReports as $totalLaborReport){
+            $totalWorkingHours=$totalWorkingHours+$totalLaborReport->thisRecordWorkingTime;
+        }
+        return $totalWorkingHours;
     }
     public function export(Request $request){
         if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }

+ 7 - 4
app/LaborReport.php

@@ -143,19 +143,19 @@ class LaborReport extends Model
     public function getThisRecordWorkingTimeAttribute(){
         if ($this['check_in_at']&&!$this['check_out_at']&&!$this['relax_time']){
             $workingTime=round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
-            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkInTime=Carbon::parse($this['check_in_at']);
             $checkOutTime=Carbon::parse(Carbon::now())->format('H');
             return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime);
         }
         if ($this['check_in_at']&&$this['check_out_at']&&!$this['relax_time']){
             $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
-            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkInTime=Carbon::parse($this['check_in_at']);
             $checkOutTime=Carbon::parse($this['check_out_at'])->format('H');
             return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime);
         }
         if ($this['check_in_at']&&$this['check_out_at']&&$this['relax_time']){
             $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
-            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkInTime=Carbon::parse($this['check_in_at']);
             $checkOutTime=Carbon::parse($this['check_out_at'])->format('H');
             return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime)-$this['relax_time']/60;
         }
@@ -163,7 +163,10 @@ class LaborReport extends Model
 
     //工作时长减午饭休息时间
     public function minusLunchTime($checkInTime,$checkOutTime,$hour){
-        if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
+//        if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
+//            $hour=$hour-1;
+//        }
+        if ($checkInTime->lessThanOrEqualTo($checkInTime->clone()->setHours(11)->setMinutes(30))&&(int)$checkOutTime>=13){
             $hour=$hour-1;
         }
         return $hour;

+ 2 - 1
app/Services/LaborReportService.php

@@ -47,6 +47,8 @@ class LaborReportService
             'created_at_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],
             'identity_number' => ['timeLimit' => 15],
             'name' => ['like' => ''],
+            'user_workgroup_id' => ['multi' => ','],
+            'labor_company_id' => ['multi' => ','],
             'id' => ['multi' => ',']
         ];
         $laborReports = app(QueryService::class)->query($params,$laborReports,$columnQueryRules,'labor_reports');
@@ -66,7 +68,6 @@ class LaborReportService
         return $this->conditionQuery($params)->paginate($params['paginate'] ?? 50);
     }
     public function get(array $params){
-//        dd($this->conditionQuery($params)->without("userDutyCheck")->toSql());
         return $this->conditionQuery($params)->without("userDutyCheck")->get();
     }
 

+ 65 - 67
app/Services/StoreItemService.php

@@ -18,27 +18,25 @@ Class StoreItemService
     public function storeItemCreateByWms($asnHerders)
     {
         if ($asnHerders->isEmpty())return null;
-        $asnDetails=collect();
-        $asnHerders->each(function ($asnHeader)use($asnDetails){
-            $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
-                $asnDetails->add($asnDetail);
-            });
-        });
+        $asnDetails=$this->getAsnDetailsByAsnHerder($asnHerders);
         $this->createStoreItem($asnDetails);
     }
 
     public function storeItemUpdateByWms($asnHerders)
     {
         if ($asnHerders->isEmpty())return null;
+        $asnDetails=$this->getAsnDetailsByAsnHerder($asnHerders);
+        $this->updateStoreItem($asnDetails);
+    }
+    public function getAsnDetailsByAsnHerder($asnHerders){
         $asnDetails=collect();
         $asnHerders->each(function ($asnHeader)use($asnDetails){
             $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
                 $asnDetails->add($asnDetail);
             });
         });
-        $this->updateStoreItem($asnDetails);
+        return $asnDetails;
     }
-
     public function createStoreItem($asnDetails)
     {
         if ($asnDetails->isEmpty())return null;
@@ -51,7 +49,6 @@ Class StoreItemService
         if(count($params)> 0){
             $this->insertStore($params);
         }
-
     }
     public function getParamsByAsnDetails($asnDetails,$store_asn_code_map)
     {
@@ -90,64 +87,6 @@ Class StoreItemService
             return StoreItems::query()->whereIn('id',data_get($params,'*.id'))->get();
         }
     }
-//    public function updateStoreItem($asnDetails)
-//    {
-//        if(!$asnDetails || $asnDetails->count() == 0){return null;}
-//        /** @var DataHandlerService $dataHandlerService */
-//        $dataHandlerService =  app(DataHandlerService::class);
-//        $storeItems=$this->getByWms($asnDetails);
-//        $storeItems_map =  $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
-//        /** @var StoreService $storeService */
-//        $storeService=app(StoreService::class);
-//        $stores=$storeService->getByWms($asnDetails);
-//        $stores_map =  $dataHandlerService->dataHeader(['asn_code'],$stores);
-//        $updateParams = [[
-//            'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
-//        ]];
-//        $updated_at=Carbon::now()->toDateTimeString();
-//        $delete_storeItems=[];
-//        foreach ($asnDetails as $asnDetail) {
-//            $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnDetail->asnno],$stores_map);
-//            $storeItem =$dataHandlerService
-//                ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItems_map);
-//            if(!$storeItem){
-//                array_push($delete_storeItems,$asnDetail);
-//                continue;
-//            }
-//            if( $storeItem->store_id != $store->id ||
-//                $storeItem->asn_line_code!=$asnDetail->asnlineno ||
-//                $storeItem->name != $asnDetail->skudescrc ||
-//                $storeItem->sku != $asnDetail->sku||
-//                $storeItem->barcode !=$asnDetail->basSku->alternate_sku1||
-//                $storeItem->amount !=$asnDetail->expectedqty||
-//                $storeItem->quality !=$asnDetail->qualityStatus??$asnDetail->qualityStatus->codename_c||
-//                $storeItem->status !=$asnDetail->lineStatus??$asnDetail->lineStatus->codename_c||
-//                $storeItem->created_at !=$asnDetail->addtime||
-//                $storeItem->updated_at != $asnDetail->edittime){
-//                $updateParams[] = [
-//                    'id'=>$storeItem->id,
-//                    'store_id'=>$store->id,
-//                    'asn_line_code' => $asnDetail->asnlineno,
-//                    'name' =>$asnDetail->skudescrc,
-//                    'sku' =>$asnDetail->sku,
-//                    'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
-//                    'amount' =>$asnDetail->expectedqty??0,
-//                    'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
-//                    'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
-//                    'created_at'=>$asnDetail->addtime??null,
-//                    'updated_at'=>$updated_at,
-//                ];
-//            }
-//        }
-//        if(count($updateParams) > 1){
-//            $this->batchUpdate($updateParams);
-//        }
-//
-//        if (count($asnDetails)<count($storeItems)){
-//                dd($delete_storeItems);
-//        }
-//        unset($updateParams,$asnDetails);
-//    }
     public function updateStoreItem($asnDetails)
     {
         if(!$asnDetails || $asnDetails->count() == 0){return null;}
@@ -207,6 +146,7 @@ Class StoreItemService
             $query->whereIn('asn_code',array_unique(data_get($asnDetails,'*.asnno')));
         })->get();
     }
+
     public function deleteStoreItem(array $delete_storeItems){
         $storeItemIds=[];
         foreach ($delete_storeItems as $delete_storeItem){
@@ -219,4 +159,62 @@ Class StoreItemService
             LogService::log(__METHOD__,__FUNCTION__,'删除多余StoreItems error'.count($delete_storeItems).json_encode($delete_storeItems).$e->getMessage().$e->getTraceAsString(),null);
         }
     }
+    //    public function updateStoreItem($asnDetails)
+//    {
+//        if(!$asnDetails || $asnDetails->count() == 0){return null;}
+//        /** @var DataHandlerService $dataHandlerService */
+//        $dataHandlerService =  app(DataHandlerService::class);
+//        $storeItems=$this->getByWms($asnDetails);
+//        $storeItems_map =  $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
+//        /** @var StoreService $storeService */
+//        $storeService=app(StoreService::class);
+//        $stores=$storeService->getByWms($asnDetails);
+//        $stores_map =  $dataHandlerService->dataHeader(['asn_code'],$stores);
+//        $updateParams = [[
+//            'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
+//        ]];
+//        $updated_at=Carbon::now()->toDateTimeString();
+//        $delete_storeItems=[];
+//        foreach ($asnDetails as $asnDetail) {
+//            $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnDetail->asnno],$stores_map);
+//            $storeItem =$dataHandlerService
+//                ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItems_map);
+//            if(!$storeItem){
+//                array_push($delete_storeItems,$asnDetail);
+//                continue;
+//            }
+//            if( $storeItem->store_id != $store->id ||
+//                $storeItem->asn_line_code!=$asnDetail->asnlineno ||
+//                $storeItem->name != $asnDetail->skudescrc ||
+//                $storeItem->sku != $asnDetail->sku||
+//                $storeItem->barcode !=$asnDetail->basSku->alternate_sku1||
+//                $storeItem->amount !=$asnDetail->expectedqty||
+//                $storeItem->quality !=$asnDetail->qualityStatus??$asnDetail->qualityStatus->codename_c||
+//                $storeItem->status !=$asnDetail->lineStatus??$asnDetail->lineStatus->codename_c||
+//                $storeItem->created_at !=$asnDetail->addtime||
+//                $storeItem->updated_at != $asnDetail->edittime){
+//                $updateParams[] = [
+//                    'id'=>$storeItem->id,
+//                    'store_id'=>$store->id,
+//                    'asn_line_code' => $asnDetail->asnlineno,
+//                    'name' =>$asnDetail->skudescrc,
+//                    'sku' =>$asnDetail->sku,
+//                    'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
+//                    'amount' =>$asnDetail->expectedqty??0,
+//                    'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
+//                    'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
+//                    'created_at'=>$asnDetail->addtime??null,
+//                    'updated_at'=>$updated_at,
+//                ];
+//            }
+//        }
+//        if(count($updateParams) > 1){
+//            $this->batchUpdate($updateParams);
+//        }
+//
+//        if (count($asnDetails)<count($storeItems)){
+//                dd($delete_storeItems);
+//        }
+//        unset($updateParams,$asnDetails);
+//    }
 }

+ 1 - 3
app/Services/StoreService.php

@@ -146,9 +146,7 @@ Class StoreService
                     ];
             }
         }
-        if(count($updateParams) > 1){
-            $this->batchUpdate($updateParams);
-        }
+        if(count($updateParams) > 1) $this->batchUpdate($updateParams);
         /** @var StoreItemService $storeItemService */
         $storeItemService = app(StoreItemService::class);
         $storeItemService->storeItemUpdateByWms($asnHerders);

+ 2 - 2
public/js/app.js

@@ -86472,8 +86472,8 @@ module.exports = tempTip;
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(/*! D:\Reald\desktop\BsWAS\src\resources\js\app.js */"./resources/js/app.js");
-module.exports = __webpack_require__(/*! D:\Reald\desktop\BsWAS\src\resources\sass\app.scss */"./resources/sass/app.scss");
+__webpack_require__(/*! D:\wamp64\www\bswas\resources\js\app.js */"./resources/js/app.js");
+module.exports = __webpack_require__(/*! D:\wamp64\www\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
 
 
 /***/ }),

+ 13 - 5
resources/views/personnel/laborReport/index.blade.php

@@ -66,7 +66,7 @@
                 @can('人事管理-临时工报表-修改劳务所')
                     <td class="text-muted">
                         <select  class="form-control-sm" name="labor_company" id="labor_company"  @change="updateLaborCompany(laborReport.labor_company_id,laborReport.enter_number)" v-model="laborReport.labor_company_id">
-                            <option v-for="laborCompany in laborCompanies" :value="laborCompany.id">@{{ laborCompany.name }}</option>
+                            <option v-for="laborCompany in laborCompanies" :value="laborCompany.name">@{{ laborCompany.value }}</option>
                         </select>
                     </td>
                 @else
@@ -311,9 +311,10 @@
                     ],
                     checkData:[],
                     permittingWorkgroups:{!! $permittingWorkgroups !!},
+                    totalWorkingHours:{!! $totalWorkingHours !!},
                     laborCompanies:[
                             @foreach($laborCompanies as $laborCompany)
-                        {id:'{{$laborCompany->id}}',name:'{{$laborCompany->name}}'},
+                        {name:'{{$laborCompany->id}}',value:'{{$laborCompany->name}}'},
                         @endforeach
                     ],
                     relax_time:'',dateTime:'',selectedStyle:'',
@@ -406,7 +407,10 @@
                     let data=[
                         [
                             {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
-                            {name:'user_workgroup_id',type:'search_select',tip:['',''],placeholder:['小组',''],data:this.userWorkGroups},
+                            {name:'user_workgroup_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的小组'],
+                                placeholder:['小组','定位或多选小组'],data:this.userWorkGroups},
+                            {name:'labor_company_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的劳务所'],
+                                placeholder:['劳务所','定位或多选劳务所'],data:this.laborCompanies},
                             {name:'enter_number',type:'input',tip:'进场编号:支持15天内模糊搜索,15天外精确搜索',placeholder: '进场编号'},
                             {name:'is_export',type:'checkbox',data:[{name:true,value:'显示已退场'}]},
                         ],
@@ -442,8 +446,8 @@
                         {name:'verifyAt',value: '审核时间'},
                         {name:'verifyPerson',value: '审核人'},
                         {name:'relax_time',value: '晚饭打卡(分)', neglect: true},
-                        {name:'thisRecordOnlineTime',value: '在线时长', neglect: true},
-                        {name:'thisRecordWorkingTime',value: '本次工作时长', neglect: true},
+                        {name:'thisRecordOnlineTime',value:'在线时长', neglect: true},
+                        {name:'thisRecordWorkingTime',value:'本次工作时长', neglect: true},
                         {name:'remark',value: '备注'},
                             @can('人事管理-临时工报表-删除')
                         {name:'remove',value: '操作'},
@@ -460,6 +464,10 @@
                             vue:vue
                         });
                         header.init();
+                        let $dom_thisRecordWorkingTime=$('#dom_thisRecordWorkingTime');
+                        $dom_thisRecordWorkingTime.attr('title','用工总工时:'+_this.totalWorkingHours);
+                        $dom_thisRecordWorkingTime.tooltip({'trigger':'manual'});
+                        $dom_thisRecordWorkingTime.tooltip('show')
                     },0);
                 },
                 watch:{

+ 42 - 0
tests/Services/StoreItemService/GetAsnDetailsByAsnHerderTest.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\OracleDOCASNHeader;
+use App\Services\OwnerService;
+use App\Services\StoreItemService;
+use App\Services\StoreService;
+use App\Services\WarehouseService;
+use App\Store;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class GetAsnDetailsByAsnHerderTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     * @var OwnerService $ownerService
+     * @var WarehouseService $warehouseService
+     *
+     */
+    public $service;
+    public $asnHeaders;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app(StoreItemService::class);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->where('addTime', '>=', Carbon::parse('2020-10-21 00:00:00')->format('Y-m-d H:i:s'))
+            ->get();
+    }
+    public function testGetAsnDetailsByAsnHerder(){
+        if (empty($this->asnHeaders))return null;
+        $asnDetails=$this->service->getAsnDetailsByAsnHerder($this->asnHeaders);
+        $this->assertNotEmpty($asnDetails);
+    }
+}

+ 60 - 0
tests/Services/StoreItemService/GetParamsByAsnDetailsTest.php

@@ -0,0 +1,60 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\OracleDOCASNHeader;
+use App\Services\OwnerService;
+use App\Services\StoreItemService;
+use App\Services\StoreService;
+use App\Services\WarehouseService;
+use App\Store;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class GetParamsByAsnDetailsTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     * @var OwnerService $ownerService
+     * @var WarehouseService $warehouseService
+     *
+     */
+    public $service;
+    public $asnHeaders;
+    public $ownerService;
+    public $warehouseService;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app(StoreItemService::class);
+        $this->ownerService=app(OwnerService::class);
+        $this->warehouseService=app(WarehouseService::class);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->where('addTime', '>=', Carbon::parse('2020-10-21 00:00:00')->format('Y-m-d H:i:s'))
+            ->get();
+    }
+    public function testGetParamsByAsnHeader(){
+        if (empty($this->asnHeaders))return null;
+        $stores = Store::query()->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->get();
+        $owners=$this->ownerService->getByWmsOrders($this->asnHeaders);
+        $warehouses=$this->warehouseService->getByWms($this->asnHeaders);
+        $this->assertNotEmpty($this->asnHeaders);
+        $this->assertNotEmpty($owners);
+        $this->assertNotEmpty($warehouses);
+        foreach ($owners as $owner) {
+            $owners_code_map[$owner->code] = $owner;
+        }
+        foreach ($warehouses as $warehouse) {
+            $warehouses_code_map[$warehouse->code] = $warehouse;
+        }
+        if (count($this->asnHeaders)>count($stores)){
+            $params=$this->service->getParamsByAsnHeader($this->asnHeaders,$owners_code_map,$warehouses_code_map);
+            $this->assertNotEmpty($params);
+        }
+    }
+}

+ 1 - 1
tests/Services/StoreService/AsnSyncTest.php

@@ -23,7 +23,7 @@ class AsnSyncTest extends TestCase
 
     public function testAsnSync(){
         $startDate=Carbon::parse('2020-10-22 00:00:00')->subDays(1)->format('Y-m-d H:i:s');
-        //app(StoreService::class)->syncWmsAsnData($startDate);
+        app(StoreService::class)->syncWmsAsnData($startDate);
         //$asnHeaders=app(OracleDocAsnHerderService::class)->getWmsAsnOnStartDateCreate($startDate);
         //dd($asnHeaders);
 

+ 5 - 4
tests/Services/StoreService/UpdateStoreTest.php

@@ -30,10 +30,11 @@ class UpdateStoreTest extends TestCase
             ->get();
     }
     public function testUpdateStore(){
-        if (!$this->asnHeaders) return null;
-        $this->assertTrue($this->service->updateStore($this->asnHeaders));
-
-
+        if (!$this->asnHeaders) {
+            $this->assertNull($this->asnHeaders);
+        }else{
+            //$this->assertEquals($this->service->updateStore($this->asnHeaders),1);
+        }
     }
     public function tearDown(): void
     {