Просмотр исходного кода

卸货任务 成本批量录入

ajun 4 лет назад
Родитель
Сommit
4e08182995

+ 34 - 4
app/DischargeTask.php

@@ -35,17 +35,34 @@ class DischargeTask extends Model
     ];
 
     protected $fillable = [
-        'owner_id','type','numbers','status',
-        'income_amount','income_unit','income_unit_price','income_total_cost','income_remark',
-        'facilitator_id','expenditure_amount','expenditure_unit','expenditure_unit_price','expenditure_total_cost','expenditure_remark',
-        'income_at','expenditure_at','warehouse_id'
+        'owner_id',  // 货主
+        'type',      // 类型
+        'numbers',   // 任务编号
+        'status',    // 状态
+        'income_amount', // 数量
+        'income_unit',   // 单位
+        'income_unit_price', // 单价
+        'income_total_cost', // 总价
+        'income_remark',     // 备注
+        'facilitator_id',    // 卸货商
+        'expenditure_amount',  // 成本数量
+        'expenditure_unit',    // 成本单位
+        'expenditure_unit_price',  // 成本单价
+        'expenditure_total_cost',  // 成本总价
+        'expenditure_remark',      // 成本备注
+        'income_at',                // 预约时间
+        'expenditure_at',          // 卸货时间
+        'warehouse_id',              // 仓库
+        'created_at',  // 创建时间->卸货任务:预约时间->结算报表:日期
     ];
 
+    // 货主
     function owner(): BelongsTo
     {
         return $this->belongsTo(Owner::class);
     }
 
+    // 卸货商
     function facilitator(): BelongsTo
     {
         return $this->belongsTo(Facilitator::class);
@@ -56,9 +73,22 @@ class DischargeTask extends Model
         return $filters->apply($query);
     }
 
+    // 仓库
     public function warehouse(): BelongsTo
     {
         return $this->belongsTo(Warehouse::class);
     }
 
+    // 任务创建人
+    public function creator(): BelongsTo
+    {
+        return $this->belongsTo(User::class,'creator_id');
+    }
+
+    // 成本录入人
+    public function constEntry():BelongsTo
+    {
+        return $this->belongsTo(User::class,'const_entry_id');
+    }
+
 }

+ 28 - 1
app/Http/Controllers/DischargeTaskController.php

@@ -7,9 +7,11 @@ use App\Facilitator;
 use App\DischargeTask;
 use App\Filters\DischargeTaskFilters;
 use App\Http\Requests\DischargeTask\DischargeTaskRequest;
+use App\Imports\DischargeTaskCostEntryImport;
 use App\Imports\DischargeTaskImport;
 use App\Owner;
 use App\Role;
+use App\Services\DischargeTaskService;
 use App\Services\OwnerService;
 use App\Services\UserService;
 use App\Warehouse;
@@ -84,6 +86,7 @@ class DischargeTaskController extends Controller
         $result = app('DischargeTaskService')->updateDischargeTask($dischargeTask, $request->all());
 
         if ($result['success']) $this->success($result['data']);
+
         else $this->error($result['message'] ?? '操作异常,请刷新页面重试');
     }
 
@@ -137,7 +140,7 @@ class DischargeTaskController extends Controller
             $dischargeTasks = DischargeTask::query()->with(['Facilitator', 'owner'])->filter($filters)->whereIn('owner_id', data_get($owners, '*.id'))->orderByDesc('id')->get();
         }
 
-        $row = ['日期', '客户名称', '作业名称', '入库单号', '数量', '单位', '单价', '收费', '状态', '备注'];
+        $row = ['日期','仓库', '客户名称', '作业名称','入库单号', '数量', '单位', '单价', '收费', '状态', '备注'];
         $json = app('DischargeTaskService')->getJson($dischargeTasks);
 
         return Export::make($row, $json, "卸货任务");
@@ -182,6 +185,30 @@ class DischargeTaskController extends Controller
         return ['success' => true];
     }
 
+    public function constEntryImportApi(Request $request): array
+    {
+        $this->gate('人事管理-卸货-成本录入');
+        $extension = $request->file()['file']->getClientOriginalExtension();
+        $flag = !in_array($extension, ['xlsx', 'xlsm', 'xltx', 'xltm', 'xls', 'xlt', 'ods', 'ots', 'slk', 'xml', 'gnumeric', 'htm', 'html', 'csv', 'tsv']);
+        if ($flag){
+            return ['success' => false, 'message' => '请检查导入文件是否符合要求'];
+        }
+
+        $extension[0] = strtoupper($extension[0]);
+
+        try {
+            Excel::import(new DischargeTaskCostEntryImport(), $request->file()['file']->path(), null, $extension);
+        } catch (\Exception $e) {
+            return ['success' => false, 'message' => ['请检查导入文件是否符合要求']];
+        }
+
+        $exception=Cache::get('exception');
+        $numbers=Cache::get('numbers');
+
+        if ($exception) return ['success' => false, 'errors' => $exception,'message' => $numbers];
+        return ['success' => true];
+    }
+
 
     public function show(DischargeTask $dischargeTask)
     {

+ 88 - 0
app/Imports/DischargeTaskCostEntryImport.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Imports;
+
+use App\DischargeTask;
+use App\Facilitator;
+use App\Owner;
+use App\Services\DischargeTaskService;
+use App\Warehouse;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+use Maatwebsite\Excel\Concerns\ToCollection;
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
+use Maatwebsite\Excel\Imports\HeadingRowFormatter;
+
+HeadingRowFormatter::default('none');
+class DischargeTaskCostEntryImport implements ToCollection,WithHeadingRow
+{
+    /**
+    * @param Collection $collection
+    */
+    public function collection(Collection $collection)
+    {
+        $exception = [];
+        $numbers = [];
+        foreach ($collection as $row => $item) {
+            $index = $row + 1;  // 行数
+            $message = '';      // 信息
+
+            $type = array_search(trim($item['作业名称']), DischargeTask::types);
+            $created_at = $item['日期'] ?? '';            // 导入的日期为创建时间
+            $number = $item['入库单号'] ?? '';
+            $owner_name = $item['客户名称'] ?? '';
+            $owner = Owner::query()->where('name',$owner_name)->first();
+            $ware_house = Warehouse::query()->where('name',$item['仓库'])->first();
+            $facilitator = Facilitator::query()->where('name', $item['服务商'] ?? '')->first();
+
+            if ($created_at == '') $message .= '日期为空,';
+            if ($number == '')$message .= '入库单号为空,';
+            if ($owner_name =='' || $owner == null) $message .= '货主未找到,';
+            if ($ware_house == null)  $message .= '仓库未找到,';
+            $expenditure_unit_price = $item['成本单价'];
+
+            $expenditure_amount = $item['成本数量'];
+            $dischargeTask = DischargeTask::query()->where([
+                'owner_id' => $owner['id'],
+                'numbers' => $number,
+                'created_at' => $created_at,
+                'type' => $type,
+                'warehouse_id' =>$ware_house['id']
+            ])->first();
+
+
+            $expenditure_unit = '';
+            if (isset($item['成本单位'])){
+                $expenditure_unit = array_search(trim($item['成本单位']), DischargeTask::units);
+                if (trim($expenditure_unit) == 'm3'){
+                    $expenditure_unit= array_search('m³', DischargeTask::types);
+                }
+            }else{
+                $expenditure_unit = $dischargeTask['income_unit'];
+            }
+
+            if ($expenditure_unit_price == 0 || $expenditure_unit_price == null)  $message .= '成本单价为空,';
+            if ($expenditure_unit != 0 &&  ($expenditure_unit == '' || $expenditure_unit == null ) )  $message .= '成本单位为空,';
+            if ($expenditure_amount == '' || $expenditure_unit_price == null) $message .= '成本数量为空,';
+            if ($facilitator == null) $message .= '未指定服务商,';
+            if (strlen($message) != 0) {
+                $exception[] = "第{$index}行成本编辑异常:" . $message;
+                continue;
+            }
+            $params = [
+                'expenditure_unit_price' => $expenditure_unit_price,
+                'expenditure_unit' => $expenditure_unit,
+                'expenditure_amount'=>$expenditure_amount,
+                'facilitator_id' => $facilitator['id'],
+                'status' => array_search('接单',DischargeTask::status),
+            ];
+            $params['expenditure_total_cost'] = $expenditure_unit_price * $expenditure_amount;
+
+            $dischargeTask->update($params);
+            $numbers[] = $number;
+        }
+        Cache::put('exception', $exception, 86400);
+        Cache::put('numbers', $numbers, 86400);
+    }
+}

+ 1 - 0
app/Services/DischargeTaskService.php

@@ -104,6 +104,7 @@ class DischargeTaskService
 
             $json[] = [
                 $date->toDateTimeString(),
+                $dischargeTask->warehouse->name ?? '',
                 $dischargeTask->owner->name ?? '',
                 DischargeTask::types[$dischargeTask['type']] ?? '',
                 $dischargeTask->numbers ?? '',

+ 38 - 0
resources/views/personnel/discharge/task/_constEntryImport.blade.php

@@ -0,0 +1,38 @@
+<div class="modal fade" id="importConstEntryModal">
+    <div class="modal-dialog modal-dialog-centered modal-lg">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">
+                    批量成本导入
+                </h5>
+                <button type="button" class="close" data-dismiss="modal">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label for="importConstEntryFile">导入文件</label>
+                        <input type="file" ref="constEntryfile" name="file"  id="importConstEntryFile"  class="form-control-file">
+                    </div>
+                    <div class="form-group">
+                        <small>文件类型:xlsx ,xlsm ,xls</small>
+                    </div>
+                    <div class="form-group">
+                        <small>字段:*货主,*仓库,*预约日期,*作业名称,*仓库,*入库单,*成本单价,*成本数量,*成本单位,*服务商</small>
+                    </div>
+                    <div class="form-group" v-if="constEntryError.length > 0">
+                        <p class="text-danger">导入异常明细</p>
+                        <ul class="list-group" v-if="constEntryError">
+                            <li class="list-group-item" v-for="error in constEntryError">@{{ error }}</li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button class="btn btn-success" @click="cancelConstEntryImport">关闭</button>
+                <button class="btn btn-success" @click="constEntryImport">导入</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 47 - 2
resources/views/personnel/discharge/task/index.blade.php

@@ -30,6 +30,13 @@
                   >批量导入</button>
             </span>
             @endcan
+            @can('人事管理-卸货-成本录入')
+                <span class="ml-1">
+                  <button type="button" class="btn btn-outline-primary btn-sm form-control-sm tooltipTarget"
+                          @click="constEntryImportModel"
+                  >批量成本录入</button>
+            </span>
+            @endcan
         </div>
         @include('personnel.discharge.task._import')
         @include('personnel.discharge.task._table')
@@ -39,6 +46,9 @@
         @can('人事管理-卸货-编辑')
         @include('personnel.discharge.task._executeTask')
         @endcan
+        @can('人事管理-卸货-成本录入')
+            @include('personnel.discharge.task._constEntryImport')
+        @endcan
     </div>
 @endsection
 
@@ -60,6 +70,7 @@
                 executingTack: {},
                 taskError:{},
                 uploadErrors:[],
+                constEntryError:[],
                 taskTypes: [
                     {name: 0, value: "装车"},
                     {name: 1, value: "卸车"},
@@ -200,7 +211,6 @@
                 },
                 // 创建任务
                 createTask(index) {
-                    console.log(this.addTask);
                     if (this.isUpdate) {
                         this.updateCurrentTask(index);
                         return
@@ -387,6 +397,32 @@
                         window.tempTip.show(err);
                     });
                 },
+                // 成本批量录入
+                constEntryImport(){
+                    window.tempTip.setIndex(1999);
+                    let formData = new FormData();
+                    let file = document.querySelector('#importConstEntryFile').files[0];
+                    if(file==null){
+                        window.tempTip.show('请选择上传文件');
+                    }
+                    formData.append('file',file);
+                    let url = '{{url('apiLocal/personnel/discharge/task/constEntryImport')}}';
+                    window.axios.post(url,formData,{
+                        'Content-Type': 'multipart/form-data'
+                    }).then(res=>{
+                        if(res.data.success){
+                            window.tempTip.showSuccess(res.data.message ? res.data.message : '导入成功!刷新页面显示');
+                            return ;
+                        }else if(res.data.errors){
+                            window.tempTip.show('导入卸货成本失败!,详情请看列表')
+                            this.constEntryError = res.data.errors;
+                            return ;
+                        }
+                        window.tempTip.show('导入失败!'+(res.data.message ? res.data.message : ''));
+                    }).catch(err=>{
+                        window.tempTip.show(err);
+                    });
+                },
                 importModal(){
                     document.querySelector('#importFile').file = [];
                     $('#importModal').modal('show');
@@ -395,7 +431,16 @@
                     this.uploadErrors = [];
                     $('#importModal').modal('hide');
                     document.querySelector('#importFile').value = null;
-                }
+                },
+                constEntryImportModel(){
+                    document.querySelector('#importConstEntryFile').file = [];
+                    $('#importConstEntryModal').modal('show');
+                },
+                cancelConstEntryImport(){
+                    this.constEntryError = [];
+                    $('#importConstEntryModal').modal('hide');
+                    document.querySelector('#importConstEntryFile').value = null;
+                },
 
 
             }

+ 1 - 0
routes/apiLocal.php

@@ -53,6 +53,7 @@ Route::group(['prefix' => 'personnel'], function () {
             Route::put('updateFacilitator', 'DischargeTaskController@updateTaskFacilitatorApi')->name('discharge.updateTaskFacilitatorApi');
             Route::put('updateColumn', 'DischargeTaskController@updateApi')->name('facilitator.updateColumnApi');
             Route::post('import', 'DischargeTaskController@importApi')->name('discharge.importApi');
+            Route::post('constEntryImport', 'DischargeTaskController@constEntryImportApi')->name('discharge.constEntryImportApi');
         });
     });
 });