Browse Source

二次加工单-7.3需求

Zhouzhendong 5 năm trước cách đây
mục cha
commit
fd43347837

+ 177 - 44
app/Http/Controllers/ProcessController.php

@@ -10,6 +10,7 @@ use App\ProcessDailyParticipant;
 use App\ProcessesContent;
 use App\ProcessMethod;
 use App\ProcessStatistic;
+use App\Sign;
 use App\Tutorial;
 use App\UserDetail;
 use App\UserDutyCheck;
@@ -26,7 +27,7 @@ use Ramsey\Uuid\Uuid;
 
 class ProcessController extends Controller
 {
-    public function conditionQuery(Request $request,$processes){
+    private function conditionQuery(Request $request,$processes){
         if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/'));  }
         $today=Carbon::now()->subDays(15)->format('Y-m-d');;
         if ($request->input('commodity_barcode')){
@@ -89,7 +90,7 @@ class ProcessController extends Controller
     public function index(Request $request)
     {
         if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/'));  }
-        $processes=Process::with(['tutorials','processesContents'=>function($query){
+        $processes=Process::with(['tutorials','signs','processesContents'=>function($query){
             return $query->with(['commodity'=>function($query){
                 return $query->with('barcodes');
             }]);
@@ -150,7 +151,7 @@ class ProcessController extends Controller
     }
 
     //计算单参与人工时信息
-    public function countParticipantManHour($processDailyParticipant,$date){
+    protected function countParticipantManHour($processDailyParticipant,$date){
         $user=$processDailyParticipant->user_id;
         $userDutyCheckStart=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
             ->where('checked_at','like',$date.'%')->where('type','登入')->orderBy('id')->first();
@@ -191,7 +192,7 @@ class ProcessController extends Controller
     }
 
     //打卡工时减休息时间
-    public function isHour($userDutyCheckStart,$hour){
+    private function isHour($userDutyCheckStart,$hour){
 
         $date=$userDutyCheckStart->checked_at;
         $date=Carbon::parse($date)->format('H');
@@ -201,7 +202,7 @@ class ProcessController extends Controller
         return $hour;
     }
     //生成二次加工单缺失时间记录及本日记录
-    public function createDeficiencyData($processDailies,$today){
+    private function createDeficiencyData($processDailies,$today){
         $processDailiesArr=[];
         foreach ($processDailies as $processDaily){
             $processDailiesArr[$processDaily->date]=$processDaily;
@@ -226,6 +227,7 @@ class ProcessController extends Controller
                 $remain=$remain-($processDailiesArr[$date]->output);
             }
         }
+        $this->log(__METHOD__,"生成加工单每日记录".__FUNCTION__,json_encode($processDailies),Auth::user()['id']);
         return true;
     }
 
@@ -233,8 +235,9 @@ class ProcessController extends Controller
     public function reject($id){
         if(!Gate::allows('二次加工管理-接单与驳回')){ return redirect(url('/'));  }
         $process=Process::select('id','status')->find($id);
-        $process->status="驳回";
+        $process->status="驳回";
         $process->update();
+        $process->createOperatorLog('驳回');
         $this->log(__METHOD__,"驳回二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
         return $process;
     }
@@ -256,13 +259,24 @@ class ProcessController extends Controller
         }
         $process->status="待加工";
         $process->update();
+        $process->createOperatorLog('接单');
         $this->log(__METHOD__,"接单二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
         return $process;
     }
     //完成
-    public function accomplish($id){
-        if(!Gate::allows('二次加工管理-验收完成')){ return redirect(url('/'));  }
-        $process=Process::with('processDailies')->find($id);
+    public function accomplish(Request $request){
+        if(!Gate::allows('二次加工管理-交接完成')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $process=Process::with('processDailies')->find($request->id);
+        if (!$process)return ['success'=>false];
+        $process->update(['status'=>'交接完成']);
+        $process->createOperatorLog('交接完成');
+        $result=$this->statistic($process);
+        if (!$result['success'])return $result;
+        $processStatistic=$result['data'];
+        $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
+        return ['success'=>true,'data'=>'交接完成'];
+    }
+    private function statistic(Process $process){
         if (count($process->processDailies)>0){
             $completed_amount=0;
             foreach ($process->processDailies as $processDaily){
@@ -270,12 +284,9 @@ class ProcessController extends Controller
             }
             $process->completed_amount=$completed_amount;
         }
-        $process->status="已完成";
-        $process->update();
-
         //统计:
         $revenue=($process->unit_price)*($process->completed_amount);   //收入合计
-        $processDailies=ProcessDaily::with('processDailyParticipants')->where('process_id',$id)->where('output','>',0)->get();
+        $processDailies=ProcessDaily::with('processDailyParticipants')->where('process_id',$process->id)->where('output','>',0)->get();
         $duration_days=count($processDailies);      //完成天数
         $duration_man_hours=0;      //总工时
         $total_cost=0;              //合计成本
@@ -291,8 +302,9 @@ class ProcessController extends Controller
             }
         };
         $gross_profit=$revenue-$total_cost; //毛利润
+        if ($gross_profit<=0)return ['success'=>false,'data'=>'该单未产生费用,无法计算毛利率!'];
         $gross_profit_rate=$gross_profit/$revenue;  //毛利率
-        $processStatistic=ProcessStatistic::find($id);
+        $processStatistic=ProcessStatistic::find($process->id);
         $processStatistic->revenue=$revenue;
         $processStatistic->duration_days=$duration_days;
         $processStatistic->duration_man_hours=$duration_man_hours;
@@ -300,8 +312,8 @@ class ProcessController extends Controller
         $processStatistic->gross_profit=$gross_profit;
         $processStatistic->gross_profit_rate=$gross_profit_rate;
         $processStatistic->update();
-        $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
-        return $process;
+        $this->log(__METHOD__,"修改二次加工单统计单_".__FUNCTION__,json_encode($processStatistic),Auth::user()['id']);
+        return ['success'=>true,'data'=>$processStatistic];
     }
 
     //修改当日产量
@@ -324,7 +336,7 @@ class ProcessController extends Controller
         return $response;
     }
     //每次修改,去查询该单下全部日期,逐个替换,前一天剩余减当天产量为当天剩余,无前天记录去拿单子预期产量
-    public function countRemains($processDaily){
+    private function countRemains($processDaily){
         if (!$processDaily || !$processDaily->process) return;
         $processDailies=ProcessDaily::where('process_id',$processDaily->process_id)->orderBy('date')->get();
         for ($i=0;$i<count($processDailies);$i++){
@@ -347,15 +359,15 @@ class ProcessController extends Controller
         $processStatistic->update();
         //修改二次加工单状态
         $result=[];
-        if (count($processDailies)>0 && ($processDailies[(count($processDailies)-1)]->remain)<=0){
-            $result['process']=$this->changeProcessCheck($processDaily->process_id);
-        }
+        /*if (count($processDailies)>0 && ($processDailies[(count($processDailies)-1)]->remain)<=0){
+            $result['process']=$this->changeProcessCheck($processDaily->process_id);  //保留 目前小于0后等待人工确认再进入待验收
+        }*/
         $result['processDailies']=$processDailies;
         return $result;
     }
 
     //剩余小于等于0,状态待验收
-    public function changeProcessCheck($process_id){
+    private function changeProcessCheck($process_id){
         $process=Process::select('id','status')->find($process_id);
         if ($process->status=="加工中"){
             $process->status="待验收";
@@ -493,6 +505,7 @@ class ProcessController extends Controller
     }
     //添加教程关联
     public function selectedTutorial(Request $request){
+        if(!Gate::allows('二次加工管理-教程管理')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
         $process_id=$request->input('process_id');
         $tutorial_id=$request->input('tutorial_id');
         if (!$process_id || !$tutorial_id) return ['success'=>false,'data'=>'二次加工或教程传递错误!'];
@@ -504,6 +517,7 @@ class ProcessController extends Controller
     }
     //删除教程关联
     public function deleteTutorial(Request $request){
+        if(!Gate::allows('二次加工管理-教程管理')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
         $process_id=$request->input('process_id');
         $tutorial_id=$request->input('tutorial_id');
         if (!$process_id || !$tutorial_id) return ['success'=>false,'data'=>'二次加工或教程传递错误!'];
@@ -518,6 +532,7 @@ class ProcessController extends Controller
      */
     public function create()
     {
+        if(!Gate::allows('二次加工管理-录入')){ return redirect(url('/'));  }
         $processMethods=ProcessMethod::get();
         return view('process/create',['processMethods'=>$processMethods]);
     }
@@ -547,8 +562,10 @@ class ProcessController extends Controller
             'unit_price'=>$request->input('unit_price'),
             'remark'=>$request->input('remark'),
             'amount'=>$request->input('amount'),
+            'status'=>'待审核',
         ]);
         $process->save();
+        $process->createOperatorLog('创建');
         $processContents=[];
         foreach ($request->input('processContents') as $processContent){
             $wmsCode_commoditySku=$processContent['wms_code'].'_'.$processContent['commodity_sku'].'_'.$processContent['type'];
@@ -569,7 +586,14 @@ class ProcessController extends Controller
                 ]);
                 if ($processContent['type'])$processContentOne->type='成品单';
                 $processContentOne->save();
-                $this->log(__METHOD__,"录入二次加工单内容单".__FUNCTION__,json_encode($processContentOne),Auth::user()['id']);
+                if (isset($processContent['is_update_commodity_name'])){
+                    Sign::create([
+                        'signable_type'=>'processes_contents',
+                        'signable_id'=>$processContentOne->id,
+                        'field'=>'commodity_name',
+                        'mark'=>$processContent['commodity_name'],
+                    ]);
+                }
             }
         }
         $process->code='P'.date ("Ymd").str_pad($process->id,3,"0",STR_PAD_LEFT);
@@ -578,20 +602,73 @@ class ProcessController extends Controller
             'process_id'=>$process->id,
         ]);
         $processStatistic->save();
-        $this->log(__METHOD__,"录入二次加工单".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
+        $this->log(__METHOD__,"录入二次加工单".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
         if ($request->input('tutorials'))$process->tutorials()->sync($request->input('tutorials'));
         return;
     }
-
-    /**
-     * Display the specified resource.
-     *
-     * @param  int  $id
-     * @return \Illuminate\Http\Response
-     */
-    public function show($id)
-    {
-        //
+    //修改价格
+    function updateUnitPrice(Request $request){
+        if(!Gate::allows('二次加工管理-修改价格')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $errors=Validator::make($request->input(),[
+            'id' => 'required',
+            'unit_price'=>['required','numeric'],
+        ])->errors();
+        if (count($errors)>0)return ['success'=>false,'data'=>'非法参数!'];
+        $process=Process::with('signs')->find($request->id);
+        if (!$process || $process->status!='交接完成' || count($process->signs)>0)return ['success'=>false,'data'=>'无法操作该二次加工单!'];
+        $process->update(['unit_price'=>$request->unit_price]);
+        $sign=$process->createSign('发起修改');
+        $this->log(__METHOD__,"修改二次加工单价格_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return ['success'=>true,'data'=>$process->unit_price,'sign'=>$sign];
+    }
+
+    //二次加工组审核   两个方法大体相同 拆分原因是为了精确区分权限
+    function workGroupVerify(Request $request){
+        if(!Gate::allows('二次加工管理-组长确认')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $this->log(__METHOD__,"修改二次加工单价格二次加工组确认_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return $this->verify($request->id,'二次加工组确认');
+    }
+    //二次加工组审核
+    function accountantVerify(Request $request){
+        if(!Gate::allows('二次加工管理-财务确认')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $this->log(__METHOD__,"修改二次加工单价格财务确认_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return $this->verify($request->id,'财务确认');
+    }
+    private function verify($id,$msg){
+        $process=Process::with(['signs','processDailies'])->find($id);
+        if (!$process || count($process->signs)<1)return false;
+        $signMap=[];
+        foreach ($process->signs as $sign){
+            $signMap[$sign->mark]=true;
+        }
+        if (isset($signMap[$msg]))return ['success'=>false,'data'=>'该单已被确认过!'];
+        if (isset($signMap['二次加工组确认'])){
+            $process->createSign('财务确认');
+            $result=$this->statistic($process);
+            if (!$result['success'])return $result;
+            $process->destroySign();
+            return ['success'=>true,'data'=>false];
+        }
+        if (isset($signMap['财务确认'])){
+            $process->createSign('二次加工组确认');
+            $result=$this->statistic($process);
+            if (!$result['success'])return $result;
+            $process->destroySign();
+            return ['success'=>true,'data'=>false];
+        }
+        $sign = $process->createSign($msg);
+        return ['success'=>true,'data'=>$sign];
+    }
+
+    //审核
+    function audit(Request $request){
+        if(!Gate::allows('二次加工管理-审核')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $process=Process::find($request->id);
+        if (!$process)return ['success'=>false];
+        $process->update(['status'=>'待接单']);
+        $process->createOperatorLog('审核');
+        $this->log(__METHOD__,"二次加工单审核_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return ['success'=>true];
     }
 
     /**
@@ -602,6 +679,7 @@ class ProcessController extends Controller
      */
     public function edit($id)
     {
+        if(!Gate::allows('二次加工管理-编辑')){ return redirect(url('/'));  }
         $process=Process::with(['processesContents'=>function($query){
             return $query->with(['commodity'=>function($query){
                 return $query->with('barcodes');
@@ -611,6 +689,15 @@ class ProcessController extends Controller
         return view('process.edit',['process'=>$process,'processMethods'=>$processMethods]);
     }
 
+    public function show($id){
+        $process=Process::with(['processesContents'=>function($query){
+            $query->with(['commodity'=>function($query){
+                $query->with('barcodes');
+            }]);
+        },'tutorials'])->find($id);
+        return view('process.show',compact('process'));
+    }
+
     /**
      * Update the specified resource in storage.
      *
@@ -620,7 +707,7 @@ class ProcessController extends Controller
      */
     public function update(Request $request, $id)
     {
-        if(!Gate::allows('二次加工管理-编辑')){ return redirect(url('/'));  }
+        if(!Gate::allows('二次加工管理-编辑')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
         $errors=$this->validatorProcess($request)->errors();
         if (count($errors)>0)return ['error'=>$errors,'data'=>"process"];
         $errors=[];
@@ -637,10 +724,10 @@ class ProcessController extends Controller
             $process->unit_price=$request->input('unit_price');
             $process->remark=$request->input('remark');
             $process->amount=$request->input('amount');
-            if ($process->status=='驳回')$process->status='待加工';
+            if ($process->status=='已驳回')$process->status='待接单';
             $process->update();
+            $process->createOperatorLog('编辑');
         }
-        $this->log(__METHOD__,"编辑二次加工单".__FUNCTION__,json_encode($process),Auth::user()['id']);
         $processContents=[];
         foreach ($request->input('processContents') as $processContent){
             $wmsCode_commoditySku=$processContent['wms_code'].'_'.$processContent['commodity_sku'].'_'.$processContent['type'];
@@ -650,6 +737,9 @@ class ProcessController extends Controller
         if (count($processContents)>count($removeDuplicateProcessContents)){
             return ['success'=>false,'data'=>'录入商品不可重复!'];
         }else{
+            $ProcessesContents=ProcessesContent::where('process_id',$process->id)->get();
+            $ids=array_column($ProcessesContents->toArray(),'id');
+            Sign::where('signable_type','processes_contents')->whereIn('signable_id',$ids)->delete();
             ProcessesContent::where('process_id',$process->id)->delete();
             foreach ($request->input('processContents') as $processContent){
                 if ($processContent['addBtnShow'])continue;
@@ -662,13 +752,21 @@ class ProcessController extends Controller
                 ]);
                 if ($processContent['type'])$processContentOne->type='成品单';
                 $processContentOne->save();
-                $this->log(__METHOD__,"录入二次加工单内容单".__FUNCTION__,json_encode($processContentOne),Auth::user()['id']);
+                if (isset($processContent['is_update_commodity_name'])){
+                    Sign::create([
+                        'signable_type'=>'processes_contents',
+                        'signable_id'=>$processContentOne->id,
+                        'field'=>'commodity_name',
+                        'mark'=>$processContent['commodity_name'],
+                    ]);
+                }
             }
         }
+        $this->log(__METHOD__,"编辑二次加工单_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
         return;
     }
 
-    //删除二次加工内容单
+    //删除二次加工内容单            弃用,保留,改为全部提交后一次性验证,不在操作时就允许删除
     public function deleteProcessContent($id){
         if(!Gate::allows('二次加工管理-删除')){ return redirect(url('/'));  }
         $processContent=ProcessesContent::find($id);
@@ -679,42 +777,77 @@ class ProcessController extends Controller
 
     //回滚二次加工单状态
     function rollback(Request $request){
-        if(!Gate::allows('二次加工管理-回滚')){ return redirect(url('/'));  }
+        if(!Gate::allows('二次加工管理-回滚')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
         if (!$request->id)return ['success'=>false];
         $process=Process::find($request->id);
         switch ($process->status){
+            case '待接单':
+                $process->status='待审核';break;
             case '待加工':
                 $process->status='待接单';break;
-            case '驳回':
-                $process->status='待接单';break;
+            case '驳回':
+                $process->status='待审核';break;
             case '加工中':
                 $process->status='待接单';break;
             case '待验收':
                 $process->status='加工中';break;
+            case '待交接':
+                $process->status='待验收';break;
         }
         $process->save();
+        $process->createOperatorLog('回滚');
+        $this->log(__METHOD__,"回滚二次加工单_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
         return ['success'=>true,'data'=>$process->status];
     }
+    //加工完成
+    function processAccomplish(Request $request){
+       if(!Gate::allows('二次加工管理-登记工时')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+       $process= Process::find($request->id);
+       if (!$process)return ['success'=>false];
+       $process->update([
+           'status'=>'待验收'
+       ]);
+       $process->createOperatorLog('加工完成');
+        $this->log(__METHOD__,"标记加工完成_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+       return ['success'=>true,'data'=>'待验收'];
+    }
+
+    //质量验收
+    function checkAndAccept(Request $request){
+
+        $process= Process::find($request->id);
+        if (!$process)return ['success'=>false];
+        $process->update([
+            'status'=>'待交接'
+        ]);
+        $process->createOperatorLog('质量验收');
+        $this->log(__METHOD__,"质量验收二次加工单_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return ['success'=>true,'data'=>'待交接'];
+    }
 
     //回收站
     function recycle(Request $request){
+        if(!Gate::allows('二次加工管理-删除')){ return redirect('/');  }
         $processes=Process::onlyTrashed()->paginate($request->paginate??50);
         return view('process.recycle',compact('processes'));
     }
 
     //回收站恢复
     function recover(Request $request){
+        if(!Gate::allows('二次加工管理-删除')){ return redirect('/');  }
         $checkData=$request->checkData;
+        $this->log(__METHOD__,"回收站恢复二次加工单_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
         return ['success'=>Process::withTrashed()->whereIn('id',$checkData)->restore()];
     }
     /**
      * Remove the specified resource from storage.
-     *
-     * @param  int  $id
-     * @return \Illuminate\Http\Response
+     * @param int $id
+     * @return array
      */
     public function destroy($id)
     {
+        if(!Gate::allows('二次加工管理-删除')){ return redirect('/');  }
+        $this->log(__METHOD__,"删除二次加工单进回收站_".__FUNCTION__,json_encode($id),Auth::user()['id']);
         return ['success'=>Process::destroy($id)];
     }
 

+ 2 - 1
app/Http/Controllers/TutorialController.php

@@ -71,7 +71,8 @@ class TutorialController extends Controller
      */
     public function show($id)
     {
-
+        $tutorial=Tutorial::with('trixRichText')->find($id);
+        return view('maintenance.tutorial.show',compact('tutorial'));
     }
 
     /**

+ 29 - 0
app/OperatorLog.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App;
+
+use DateTimeInterface;
+use Illuminate\Database\Eloquent\Model;
+
+class OperatorLog extends Model
+{
+    const UPDATED_AT = null;
+    protected $fillable=[
+        'operator_logable_type','operator_logable_id','user_id','operation'
+    ];
+    protected $appends=[
+        'user_name'
+    ];
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i');
+    }
+    public function user(){
+        return $this->hasOne('App\User','id','user_id');
+    }
+    public function getUserNameAttribute()
+    {
+        return $this['user'] ? $this['user']['name'] : null;
+    }
+}

+ 32 - 0
app/Process.php

@@ -5,6 +5,7 @@ namespace App;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\Auth;
 
 class Process extends Model
 {
@@ -32,6 +33,14 @@ class Process extends Model
     public function processDailies(){
         return $this->hasMany('App\ProcessDaily','process_id','id');
     }
+    public function operatorLogs(){
+        return $this->hasMany('App\OperatorLog','operator_logable_id','id')
+            ->where('operator_logable_type','processes')->orderBy('id','DESC');
+    }
+    public function signs(){
+        return $this->hasMany('App\Sign','signable_id','id')
+            ->where('signable_type','processes');
+    }
 
 
     public function getOwnerNameAttribute()
@@ -42,4 +51,27 @@ class Process extends Model
     {
         return $this['processMethod']? $this['processMethod']['name']:null;
     }
+
+
+    public function createOperatorLog($operation){
+        OperatorLog::create([
+            'operator_logable_type'=>'processes',
+            'operator_logable_id'=>$this->id,
+            'user_id'=>Auth::id(),
+            'operation'=>$operation
+        ]);
+    }
+
+    public function createSign($mark){
+        return Sign::create([
+            'signable_type'=>'processes',
+            'signable_id'=>$this->id,
+            'field'=>'unit_price',
+            'mark'=>$mark
+        ]);
+    }
+
+    public function destroySign(){
+        Sign::where('signable_type','processes')->where('signable_id',$this->id)->where('field','unit_price')->delete();
+    }
 }

+ 9 - 0
app/ProcessesContent.php

@@ -13,6 +13,7 @@ class ProcessesContent extends Model
     ];
     protected $appends=[
         'commodity_name',
+        'sign_mark',
     ];
 
     public function process(){
@@ -21,9 +22,17 @@ class ProcessesContent extends Model
     public function commodity(){
         return $this->belongsTo('App\Commodity','commodity_id','id');
     }
+    public function sign(){
+        return $this->hasOne('App\Sign','signable_id','id')
+            ->where('signable_type','processes_contents')->where('field','commodity_name');
+    }
 
     public function getCommodityNameAttribute()
     {
         return $this['commodity']? $this['commodity']['name']:null;
     }
+    public function getSignMarkAttribute()
+    {
+        return $this['sign']? $this['sign']['mark']:null;
+    }
 }

+ 13 - 0
app/Sign.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Sign extends Model
+{
+    const UPDATED_AT = null;
+    protected $fillable=[
+        'signable_type','signable_id','field','mark'
+    ];
+}

+ 35 - 0
database/migrations/2020_07_06_145857_create_signs_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateSignsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('signs', function (Blueprint $table) {
+            $table->id();
+            $table->string('signable_type')->index()->comment('签名类型(表名)');
+            $table->string('signable_id')->index()->comment('ID');
+            $table->string('field')->nullable()->comment('字段名');
+            $table->string('mark')->nullable()->comment('标记');
+            $table->timestamp('created_at');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('signs');
+    }
+}

+ 71 - 0
database/migrations/2020_07_06_160500_create_operator_logs_table.php

@@ -0,0 +1,71 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOperatorLogsTable extends Migration
+{
+    protected $authNames=[
+        '教程',
+        '二次加工管理-审核',
+        '二次加工管理-质量验收',
+        '二次加工管理-交接完成',
+        '二次加工管理-修改价格',
+        '二次加工管理-组长确认',
+        '二次加工管理-财务确认',
+    ];
+    protected $authNamesDel=[
+        '二次加工管理-验收完成'
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('operator_logs', function (Blueprint $table) {
+            $table->id();
+            $table->string('operator_logable_type')->index()->comment('类型(表名)');
+            $table->bigInteger('operator_logable_id')->index()->comment('ID');
+            $table->bigInteger('user_id')->index()->comment('用户');
+            $table->string('operation')->nullable()->comment('操作');
+            $table->timestamp('created_at');
+        });
+        foreach ($this->authNames as $name){
+            \App\Authority::create(['name'=>$name,'alias_name'=>$name]);
+        }
+        foreach ($this->authNamesDel as $name){
+            \App\Authority::where(['name'=>$name,'alias_name'=>$name])->delete();
+        }
+        Schema::table('processes',function (Blueprint $table){
+            $table->dropColumn('status');
+        });
+        Schema::table('processes',function (Blueprint $table){
+            $table->enum('status',['待审核','已驳回','待接单','待加工','加工中','待验收','待交接','交接完成'])->comment('状态');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('operator_logs');
+        foreach ($this->authNames as $name){
+            \App\Authority::where(['name'=>$name,'alias_name'=>$name])->delete();
+        }
+        foreach ($this->authNamesDel as $name){
+            \App\Authority::create(['name'=>$name,'alias_name'=>$name]);
+        }
+        Schema::table('processes',function (Blueprint $table){
+            $table->dropColumn('status');
+        });
+        Schema::table('processes',function (Blueprint $table){
+            $table->enum('status',['待接单','待加工','驳回','加工中','待验收','已完成'])->comment('状态');
+        });
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
resources/js/trix.js


+ 5 - 0
resources/sass/layout.scss

@@ -67,6 +67,7 @@ table{
             background: #e7f5ee;
         }
     }
+
     tr:nth-child(even) td{
         &.td-warm{
             background: rgb(248, 244, 241);
@@ -92,3 +93,7 @@ table{
         }
     }
 }
+.row-even{
+   background-color: rgba(0, 0, 0, .05)
+}
+

+ 36 - 0
resources/sass/text.scss

@@ -2,3 +2,39 @@
 .del{
     text-decoration-line: line-through;
 }
+
+.flicker{
+    font-size: 1em;
+    color: red;
+    animation: changeshadow 2s ease-in infinite;
+    -webkit-animation: changeshadow 2s linear infinite;
+    -moz-animation: changeshadow 2s linear infinite;
+    -ms-animation: changeshadow 2s linear infinite;
+    -o-animation: changeshadow 2s linear infinite;
+}
+@keyframes changeshadow {
+    0%{ text-shadow: 0 0 4px red}
+    50%{ text-shadow: 0 0 40px red}
+    100%{ text-shadow: 0 0 4px red}
+}
+/* 添加兼容性前缀 */
+@-webkit-keyframes changeshadow {
+    0%{ text-shadow: 0 0 4px red}
+    50%{ text-shadow: 0 0 40px red}
+    100%{ text-shadow: 0 0 4px red}
+}
+@-moz-keyframes changeshadow {
+    0%{ text-shadow: 0 0 4px red}
+    50%{ text-shadow: 0 0 40px red}
+    100%{ text-shadow: 0 0 4px red}
+}
+@-ms-keyframes changeshadow {
+    0%{ text-shadow: 0 0 4px red}
+    50%{ text-shadow: 0 0 40px red}
+    100%{ text-shadow: 0 0 4px red}
+}
+@-o-keyframes changeshadow {
+    0%{ text-shadow: 0 0 4px red}
+    50%{ text-shadow: 0 0 40px red}
+    100%{ text-shadow: 0 0 4px red}
+}

+ 1 - 1
resources/views/layouts/app.blade.php

@@ -10,7 +10,7 @@
     <title>@yield('title') {{ config('app.name', '宝时WAS') }}</title>
     @yield('head')
     <!-- Styles -->
-    <link href="{{ asset('css/app200630.css') }}" rel="stylesheet">
+    <link href="{{ asset('css/app200708.css') }}" rel="stylesheet">
 </head>
 <body>
 <div id="app">

+ 130 - 0
resources/views/maintenance/tutorial/create.blade.php

@@ -3,6 +3,136 @@
 @section('head')
     <link rel="stylesheet" type="text/css" href="{{asset('css/trix.css')}}">
     <script type="text/javascript" src="{{asset('js/trix.js')}}"></script>
+    <script>
+
+        addEventListener("trix-file-accept", function(event) {
+            var config = laravelTrixConfig(event);
+
+            if(
+                config.hideToolbar ||
+                (config.hideTools && config.hideTools.indexOf("file-tools") != -1) ||
+                (config.hideButtonIcons && config.hideButtonIcons.indexOf("attach") != -1)
+            ) {
+                return event.preventDefault();
+            }
+        });
+
+        addEventListener("trix-attachment-remove", function(event) {
+            var config = laravelTrixConfig(event);
+
+            var xhr = new XMLHttpRequest();
+
+            var attachment = event.attachment.attachment.attributes.values.url.split("/").pop();
+
+            xhr.open("DELETE", "{{url('laravel-trix/attachment/:attachment')}}".replace(':attachment',attachment), true);
+
+            setAttachementUrlCollectorValue('attachment-' + config['id'], function(collector){
+                for( var i = 0; i < collector.length; i++){
+                    if ( collector[i] === attachment) {
+                        collector.splice(i, 1);
+                    }
+                }
+
+                return collector;
+            });
+
+            xhr.send();
+        });
+
+        addEventListener("trix-attachment-add", function(event) {
+            var config = laravelTrixConfig(event);
+
+            if (event.attachment.file) {
+                var attachment = event.attachment;
+
+                config['attachment'] = attachment;
+
+                uploadFile(config, setProgress, setAttributes, errorCallback);
+
+                function setProgress(progress) {
+                    attachment.setUploadProgress(progress);
+                }
+
+                function setAttributes(attributes) {
+                    attachment.setAttributes(attributes);
+                }
+
+                function errorCallback(xhr,attachment){
+                    attachment.remove();
+                    alert(xhr.statusText);
+                }
+            }
+        });
+
+
+        function uploadFile(data, progressCallback, successCallback, errorCallback) {
+            var formData = createFormData(data);
+            var xhr = new XMLHttpRequest();
+
+            xhr.open("POST", "{{url('laravel-trix/attachment')}}", true);
+
+            xhr.upload.addEventListener("progress", function(event) {
+                var progress = (event.loaded / event.total) * 100;
+                progressCallback(progress);
+            });
+
+            xhr.addEventListener("load", function(event) {
+                if (xhr.status >= 200 && xhr.status < 300) {
+                    var response = JSON.parse(xhr.response);
+
+                    setAttachementUrlCollectorValue('attachment-' + data['id'], function(collector){
+                        collector.push(response.url.split("/").pop())
+
+                        return collector;
+                    });
+
+                    successCallback({
+                        url : response.url,
+                        href: response.url
+                    })
+                } else {
+                    errorCallback(xhr,data.attachment)
+                }
+            });
+
+            xhr.send(formData);
+        }
+
+        function setAttachementUrlCollectorValue(inputId, callback){
+            var attachmentCollector = document.getElementById(inputId);
+
+            attachmentCollector.value = JSON.stringify(callback(JSON.parse(attachmentCollector.value)));
+        }
+
+        function createFormData(data) {
+            var formData = new FormData();
+            formData.append("Content-Type", data.attachment.file.type);
+            formData.append("file", data.attachment.file);
+            formData.append("field", data.field);
+            formData.append("modelClass", data.modelClass);
+
+            if(data.disk != undefined) {
+                formData.append("disk", data.disk);
+            }
+
+            return formData;
+        }
+        function laravelTrixConfig (event) {
+            return JSON.parse(event.target.getAttribute("data-config"));
+        }
+        window.onload = function() {
+            var laravelTrixInstanceStyles =  document.getElementsByTagName('laravel-trix-instance-style');
+
+            var style = document.createElement('style');
+            style.type = 'text/css';
+
+            for (var tag of laravelTrixInstanceStyles) {
+                style.innerHTML += tag.textContent + ' ';
+            }
+
+            document.getElementsByTagName('head')[0].appendChild(style);
+        }
+    </script>
 @endsection
 @section('content')
     <div id="nav2">

+ 131 - 1
resources/views/maintenance/tutorial/edit.blade.php

@@ -3,11 +3,141 @@
 @section('head')
     <link rel="stylesheet" type="text/css" href="{{asset('css/trix.css')}}">
     <script type="text/javascript" src="{{asset('js/trix.js')}}"></script>
+    <script>
+
+        addEventListener("trix-file-accept", function(event) {
+            var config = laravelTrixConfig(event);
+
+            if(
+                config.hideToolbar ||
+                (config.hideTools && config.hideTools.indexOf("file-tools") != -1) ||
+                (config.hideButtonIcons && config.hideButtonIcons.indexOf("attach") != -1)
+            ) {
+                return event.preventDefault();
+            }
+        });
+
+        addEventListener("trix-attachment-remove", function(event) {
+            var config = laravelTrixConfig(event);
+
+            var xhr = new XMLHttpRequest();
+
+            var attachment = event.attachment.attachment.attributes.values.url.split("/").pop();
+
+            xhr.open("DELETE", "{{url('laravel-trix/attachment/:attachment')}}".replace(':attachment',attachment), true);
+
+            setAttachementUrlCollectorValue('attachment-' + config['id'], function(collector){
+                for( var i = 0; i < collector.length; i++){
+                    if ( collector[i] === attachment) {
+                        collector.splice(i, 1);
+                    }
+                }
+
+                return collector;
+            });
+
+            xhr.send();
+        });
+
+        addEventListener("trix-attachment-add", function(event) {
+            var config = laravelTrixConfig(event);
+
+            if (event.attachment.file) {
+                var attachment = event.attachment;
+
+                config['attachment'] = attachment;
+
+                uploadFile(config, setProgress, setAttributes, errorCallback);
+
+                function setProgress(progress) {
+                    attachment.setUploadProgress(progress);
+                }
+
+                function setAttributes(attributes) {
+                    attachment.setAttributes(attributes);
+                }
+
+                function errorCallback(xhr,attachment){
+                    attachment.remove();
+                    alert(xhr.statusText);
+                }
+            }
+        });
+
+
+        function uploadFile(data, progressCallback, successCallback, errorCallback) {
+            var formData = createFormData(data);
+            var xhr = new XMLHttpRequest();
+
+            xhr.open("POST", "{{url('laravel-trix/attachment')}}", true);
+
+            xhr.upload.addEventListener("progress", function(event) {
+                var progress = (event.loaded / event.total) * 100;
+                progressCallback(progress);
+            });
+
+            xhr.addEventListener("load", function(event) {
+                if (xhr.status >= 200 && xhr.status < 300) {
+                    var response = JSON.parse(xhr.response);
+
+                    setAttachementUrlCollectorValue('attachment-' + data['id'], function(collector){
+                        collector.push(response.url.split("/").pop())
+
+                        return collector;
+                    });
+
+                    successCallback({
+                        url : response.url,
+                        href: response.url
+                    })
+                } else {
+                    errorCallback(xhr,data.attachment)
+                }
+            });
+
+            xhr.send(formData);
+        }
+
+        function setAttachementUrlCollectorValue(inputId, callback){
+            var attachmentCollector = document.getElementById(inputId);
+
+            attachmentCollector.value = JSON.stringify(callback(JSON.parse(attachmentCollector.value)));
+        }
+
+        function createFormData(data) {
+            var formData = new FormData();
+            formData.append("Content-Type", data.attachment.file.type);
+            formData.append("file", data.attachment.file);
+            formData.append("field", data.field);
+            formData.append("modelClass", data.modelClass);
+
+            if(data.disk != undefined) {
+                formData.append("disk", data.disk);
+            }
+
+            return formData;
+        }
+        function laravelTrixConfig (event) {
+            return JSON.parse(event.target.getAttribute("data-config"));
+        }
+        window.onload = function() {
+                var laravelTrixInstanceStyles =  document.getElementsByTagName('laravel-trix-instance-style');
+
+                var style = document.createElement('style');
+                style.type = 'text/css';
+
+                for (var tag of laravelTrixInstanceStyles) {
+                    style.innerHTML += tag.textContent + ' ';
+                }
+
+                document.getElementsByTagName('head')[0].appendChild(style);
+            }
+        </script>
 @endsection
 @section('content')
     <div id="nav2">
         @component('maintenance.menu')@endcomponent
-        @component('maintenance.city.menu')@endcomponent
+        @component('maintenance.tutorial.menu')@endcomponent
     </div>
     <div class="card col-md-8 offset-md-2" id="tutorial">
         <div class="card-body">

+ 30 - 0
resources/views/maintenance/tutorial/show.blade.php

@@ -0,0 +1,30 @@
+@extends('layouts.app')
+@section('title')教程详情@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.tutorial.menu')
+        <li class="nav-item">
+            <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('tutorial',2)}">详情</a>
+        </li>
+        @endcomponent
+    </span>
+    <div class="card card-body container col" id="body">
+        <div class="col-8 offset-2" id="content" v-html="content.trix_rich_text.content"></div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:'#body',
+            data:{
+                content:{!! $tutorial !!},
+            },
+            mounted(){
+                console.log(this.content.trix_rich_text.content);
+            }
+        });
+    </script>
+@stop

+ 15 - 9
resources/views/process/create.blade.php

@@ -33,7 +33,7 @@
                                     </span>
                                 </div>
                                 <div class="row pt-2 small"><label class="col-3  text-right">商品名</label>
-                                    <b v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" class="col-8">@{{ processContents[0].commodity_name }}</b>
+                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" class="form-control form-control-sm col-8" @input="update_commodity_name(processContents[0])" v-model="processContents[0].commodity_name">
                                 </div>
                                 <div class="row pt-2 small"><label class="col-3  text-right">条码</label>
                                     <ul class="p-0 m-0 ml-2 list-unstyled list-inline" v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type && processContents[0].commodity_barcodes && processContents[0].commodity_barcodes.length>0">
@@ -58,14 +58,14 @@
                                            value="确定新增" class="btn btn-primary btn-sm form-control form-control-sm">
                                 </div>
                                 <div class="col-8 offset-2 pt-2 pb-2">
-                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" type="button" @click="deleteProcessContent(processContents[0].wms_code,processContents[0].commodity_id,false)" value="删除" class="btn btn-danger form-control">
+                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" type="button" @click="deleteProcessContent(processContents[0].wms_code,processContents[0].commodity_id,false,0)" value="删除" class="btn btn-danger form-control">
                                 </div>
                             </div>
                         </div>
                         <div class="form-group row">
                             <div class="col-10 offset-1 p-1 border rounded bg-light" v-for="processContent in processContents" v-if="!processContent.addBtnShow && !processContent.type">
                                 <div class="col-12 border">
-                                    <div class="row small"  @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,false)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,false)">
+                                    <div class="row small" style="background-color: white;opacity: 0.7"  @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,false)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,false)">
                                         <span class="font-weight-bold">单据号:</span>
                                         <span class="font-weight-bold">@{{ processContent.wms_code }}</span>
                                         <span class="ml-2 text-muted">单据类型:</span>
@@ -79,7 +79,7 @@
                                         <span class="ml-2 text-muted">条码:</span>
                                         <span class="text-muted"><small v-if="processContent.commodity_barcodes && processContent.commodity_barcodes.length>0"
                                                                         v-for="barcode in processContent.commodity_barcodes">@{{ barcode.code }}</small></span>
-                                        <button v-if="is_delBtn[processContent.wms_code+'_'+processContent.commodity_id+'_'+false]" @click="deleteProcessContent(processContent.wms_code,processContent.commodity_id,false)" class="btn btn-sm btn-danger" style="position: absolute;right: 0;bottom: 0">删除</button>
+                                        <button v-if="is_delBtn[processContent.wms_code+'_'+processContent.commodity_id+'_'+false]" @click="deleteProcessContent(processContent.wms_code,processContent.commodity_id,false,processContent.amount)" class="btn btn-sm btn-danger" style="position: absolute;right: 0;bottom: 0">删除</button>
                                     </div>
                                 </div>
                             </div>
@@ -135,14 +135,14 @@
                                            value="确定新增" class="btn btn-primary btn-sm form-control form-control-sm">
                                 </div>
                                 <div class="col-8 offset-2 pt-2 pb-2">
-                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && processContents[0].type" type="button" @click="deleteProcessContent(processContents[0].wms_code,processContents[0].commodity_id,true)" value="删除" class="btn btn-danger form-control">
+                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && processContents[0].type" type="button" @click="deleteProcessContent(processContents[0].wms_code,processContents[0].commodity_id,true,0)" value="删除" class="btn btn-danger form-control">
                                 </div>
                             </div>
                         </div>
                         <div class="form-group row">
                             <div class="col-10 offset-1 p-1 border rounded bg-light" v-for="processContent in processContents" v-if="!processContent.addBtnShow && processContent.type">
                                 <div class="col-12 border">
-                                    <div class="row small" style="position: relative" @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,true)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,true)">
+                                    <div class="row small" style="background-color: white;opacity: 0.7" @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,true)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,true)">
                                         <span class="font-weight-bold">单据号:</span>
                                         <span class="font-weight-bold">@{{ processContent.wms_code }}</span>
                                         <span class="ml-2 text-muted">单据类型:</span>
@@ -156,7 +156,7 @@
                                         <span class="ml-2 text-muted">条码:</span>
                                         <span class="text-muted"><small v-if="processContent.commodity_barcodes && processContent.commodity_barcodes.length>0"
                                                                         v-for="barcode in processContent.commodity_barcodes">@{{ barcode.code }}</small></span>
-                                        <button v-if="is_delBtn[processContent.wms_code+'_'+processContent.commodity_id+'_'+true]" @click="deleteProcessContent(processContent.wms_code,processContent.commodity_id,true)" class="btn btn-sm btn-danger" style="position: absolute;right: 0;bottom: 0">删除</button>
+                                        <button v-if="is_delBtn[processContent.wms_code+'_'+processContent.commodity_id+'_'+true]" @click="deleteProcessContent(processContent.wms_code,processContent.commodity_id,true,processContent.amount)" class="btn btn-sm btn-danger" style="position: absolute;right: 0;bottom: 0">删除</button>
                                     </div>
                                 </div>
                             </div>
@@ -178,7 +178,7 @@
                 </div>
                 <div class="form-group row">
                     <label class="col-3 col-form-label text-right" >加工数量</label>
-                    <input v-model="process.amount" type="text" class="form-control col-8" :class="error.amount && error.amount.length>0 ? 'is-invalid' :''">
+                    <input v-model="process.amount" type="text" :placeholder="'自动计算数量为“' + sum +'”请填写实际数'" class="form-control col-8" :class="error.amount && error.amount.length>0 ? 'is-invalid' :''">
                     <span v-if="error.amount && error.amount.length>0" class="invalid-feedback col-8 offset-3 mt-0" role="alert">
                         <strong>@{{ error.amount[0] }}</strong>
                     </span>
@@ -237,6 +237,7 @@
                 msg:false,
                 commodityIds:[],
                 is_delBtn:[],
+                sum:0
             },
             watch:{
                 processContents:{
@@ -326,6 +327,7 @@
                     let sign=true;
                     let is_return=false;
                     let processContentTemp={};
+                    if (!type)_this.sum+= Number(amount);
                     _this.processContents.some(function (processContent) {
                         if (processContent.wms_code==wms_code && processContent.commodity_id==commodity_id && processContent.type==type) {
                             processContent.commodities.every(function (commodity) {
@@ -352,9 +354,10 @@
                     }
                 },
                 //删除新增
-                deleteProcessContent(wms_code,commodity_id,type){
+                deleteProcessContent(wms_code,commodity_id,type,amount){
                     let _this=this;
                     let deleteData=[];
+                    if (!type)_this.sum-= Number(amount);
                     _this.processContents.some(function (processContent,i) {
                         if (processContent.wms_code===wms_code && processContent.commodity_id===commodity_id && processContent.type===type) {
                             deleteData.unshift(i);
@@ -496,6 +499,9 @@
                     if (is_type) this.$set(this.is_delBtn,wms_code+'_'+commodity_id+'_'+type,true);
                     else this.$set(this.is_delBtn,wms_code+'_'+commodity_id+'_'+type,false);
                 },
+                update_commodity_name(processContent){
+                    this.$set(processContent,'is_update_commodity_name',true);
+                },
             },
         });
     </script>

+ 4 - 1
resources/views/process/edit.blade.php

@@ -37,7 +37,7 @@
                                     </span>
                                 </div>
                                 <div class="row pt-2 small"><label class="col-3  text-right">商品名</label>
-                                    <b v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" class="col-8">@{{ processContents[0].commodity_name }}</b>
+                                    <input v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type" class="form-control form-control-sm col-8" v-model="processContents[0].commodity_name" @input="update_commodity_name(processContents[0])">
                                 </div>
                                 <div class="row pt-2 small"><label class="col-3  text-right">条码</label>
                                     <ul class="p-0 m-0 ml-2 list-unstyled list-inline" v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type && processContents[0].commodity_barcodes && processContents[0].commodity_barcodes.length>0">
@@ -434,6 +434,9 @@
                     if (is_type) this.$set(this.is_delBtn,wms_code+'_'+commodity_id+'_'+type,true);
                     else this.$set(this.is_delBtn,wms_code+'_'+commodity_id+'_'+type,false);
                 },
+                update_commodity_name(processContent){
+                  this.$set(processContent,'is_update_commodity_name',true);
+                },
             },
 
         });

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 513 - 407
resources/views/process/index.blade.php


+ 2 - 1
resources/views/process/menu.blade.php

@@ -15,9 +15,10 @@
             <li class="nav-item">
                 <a class="nav-link" href="{{url('process/statistic')}}" :class="{active:isActive('statistic',2)}">统计</a>
             </li> @endcan
+            @can('二次加工管理-删除')
             <li class="nav-item">
                 <a class="nav-link" href="{{url('process/recycle')}}" :class="{active:isActive('recycle',2)}">回收站</a>
-            </li>
+            </li>@endcan
             <li class="nav-item">
                 <a class="nav-link text-dark" href="{{url('process/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
             </li>

+ 120 - 0
resources/views/process/show.blade.php

@@ -0,0 +1,120 @@
+@extends('layouts.app')
+@section('title','单据详情')
+
+@section('content')
+<span id="nav2">
+    @component('process.menu')
+    <li class="nav-item">
+        <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('process',1)}">单据</a>
+    </li>
+    @endcomponent
+</span>
+<div id="body" class="d-none card card-body container text-nowrap">
+    <div class="col offset-1 row">
+        <label class="col-2 text-primary" for="code">任务号:</label>
+        <span id="code" class="col-8 offset-1">@{{ process.code }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-primary" for="code">货主:</label>
+        <span id="code" class="col-8 offset-1">@{{ process.owner_name }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-primary" for="code">加工类型:</label>
+        <span id="code" class="col-8 offset-1 text-danger font-weight-bold">@{{ process.process_method_name }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">预期数量:</label>
+        <span id="code" class="col-8 offset-1 text-muted">@{{ process.amount }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">单价:</label>
+        <span id="code" class="col-8 offset-1 text-muted">@{{ process.unit_price }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">完成数量:</label>
+        <span id="code" class="col-8 offset-1 text-muted">@{{ process.completed_amount }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">建单日期:</label>
+        <span id="code" class="col-8 offset-1 text-muted">@{{ process.created_at }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">状态:</label>
+        <span id="code" class="col-8 offset-1 text-success font-weight-bold">@{{ process.status }}</span>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="code">备注:</label>
+        <span id="code" class="col-8 offset-1 text-muted" style="white-space: normal;max-width: 200px">@{{ process.remark }}</span>
+    </div>
+    <div class="col row mt-0 mb-0 p-0 small w-100" style="margin-left: -18px;">
+        <table class="table table-sm table-bordered table-bordered w-100" style="background-color: #efe3d9;">
+            <tr>
+                <th>类型<span class="badge badge-sm bg-warning">原料单</span></th>
+                <th>单据号</th>
+                <th>本单数量</th>
+                <th>商品条码</th>
+                <th>商品名称</th>
+            </tr>
+            <tr v-for="content in process.processes_contents" v-if="content.type=='原料单'">
+                <td>@{{ content.bill_type }}</td>
+                <td>@{{ content.wms_code }}</td>
+                <td>@{{ content.amount }}</td>
+                <td>
+                    <ul class="p-0 m-0 list-unstyled list-inline" v-if="content.commodity">
+                        <li v-for="barcode in content.commodity.barcodes"><small style="white-space: normal">@{{ barcode.code }}</small></li>
+                    </ul>
+                </td>
+                <td class="text-muted tooltipTarget">
+                    <div style="white-space: normal">@{{ content.sign_mark?content.sign_mark:content.commodity_name }}</div></td>
+            </tr>
+        </table>
+        <table class="table table-sm table-bordered table-bordered w-100" style="background-color: #ccd7dc;">
+            <tr>
+                <th>类型<span class="badge badge-sm bg-warning">成品单</span></th>
+                <th>单据号</th>
+                <th>本单数量</th>
+                <th>商品条码</th>
+                <th>商品名称</th>
+            </tr>
+            <tr v-for="content in process.processes_contents" v-if="content.type=='成品单'">
+                <td>@{{ content.bill_type }}</td>
+                <td>@{{ content.wms_code }}</td>
+                <td>@{{ content.amount }}</td>
+                <td>
+                    <ul class="p-0 m-0 list-unstyled list-inline" v-if="content.commodity">
+                        <li v-for="barcode in content.commodity.barcodes"><small style="white-space: normal">@{{ barcode.code }}</small></li>
+                    </ul>
+                </td>
+                <td class="text-muted tooltipTarget">
+                    <div style="white-space: normal">@{{ content.sign_mark?content.sign_mark:content.commodity_name }}</div></td>
+            </tr>
+        </table>
+    </div>
+    <div class="col offset-1 row">
+        <label class="col-2 text-dark" for="tutorials">教程:</label>
+        <span class="col-8 offset-1 text-danger font-weight-bold" v-if="process.tutorials.length<1">暂无</span>
+        <div v-else id="tutorials" class="col-8 offset-1 text-muted" style="white-space: normal">
+            <b @click="tutorialShow(tutorial.id)" style="cursor: pointer;text-decoration:underline" class="text-primary" v-for="tutorial in process.tutorials">@{{ tutorial.name }}<br></b>
+        </div>
+    </div>
+</div>
+@stop
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#body",
+            data:{
+                process:{!! $process !!},
+            },
+            mounted:function(){
+                $('#body').removeClass('d-none');
+            },
+            methods:{
+                tutorialShow(id){
+                    window.open('{{url('maintenance/tutorial')}}/'+id);
+                }
+            },
+        });
+    </script>
+@stop

+ 1 - 1
resources/views/process/statistic.blade.php

@@ -63,7 +63,7 @@
                                     <option >    </option>
                                     <option value="待接单">待接单</option>
                                     <option value="待加工">待加工</option>
-                                    <option value="驳回">驳回</option>
+                                    <option value="驳回">驳回</option>
                                     <option value="加工中">加工中</option>
                                     <option value="待验收">待验收</option>
                                     <option value="已完成">已完成</option>

+ 1 - 1
resources/views/waybill/waybillFinancialSnapshot/index.blade.php

@@ -12,7 +12,7 @@
                     <ul class="nav nav-pills">
                         @can('财务报表-查询')
                             <li class="nav-item">
-                                <a class="nav-link" href="@if(!isset($excepted)) {{url('files')}} @else {{url('waybill/waybillFinancialExcepted')}} @endif" :class="{active:isActive('',3)}">全部</a>
+                                <a class="nav-link" href="@if(!isset($excepted)) {{url('waybill/waybillFinancialSnapshot')}} @else {{url('waybill/waybillFinancialExcepted')}} @endif" :class="{active:isActive('',3)}">全部</a>
                             </li> @endcan
                         @can('财务报表-查询')
                             <li class="nav-item">

+ 13 - 1
routes/web.php

@@ -180,7 +180,7 @@ Route::group(['prefix'=>'process'],function(){
     //接单
     Route::post('receive/{id}','ProcessController@receive');
     //完成
-    Route::post('accomplish/{id}','ProcessController@accomplish');
+    Route::post('accomplish','ProcessController@accomplish');
     //修改每日产量
     Route::post('updateDailyOutput','ProcessController@updateDailyOutput');
     //添加参与人
@@ -209,6 +209,18 @@ Route::group(['prefix'=>'process'],function(){
     Route::get('recycle','ProcessController@recycle');
     //恢复
     Route::post('recover','ProcessController@recover');
+    //审核
+    Route::post('audit','ProcessController@audit');
+    //加工完成
+    Route::post('processAccomplish','ProcessController@processAccomplish');
+    //验收
+    Route::post('checkAndAccept','ProcessController@checkAndAccept');
+    //修改价格
+    Route::post('updateUnitPrice','ProcessController@updateUnitPrice');
+    //二次加工组审核
+    Route::post('workGroupVerify','ProcessController@workGroupVerify');
+    //财务审核
+    Route::post('accountantVerify','ProcessController@accountantVerify');
 });
 //process主方法 restful
 Route::resource('process','ProcessController');

+ 1 - 2
tests/webApi/test.http

@@ -29,10 +29,9 @@ POST http://bswas/userDutyCheck/storeUserDetail
 
 ###
 
-POST https://was.baoshi56.com/api/thirdPart/weixin/login
+POST http://bswas/laravel-trix/attachment
 Content-Type: application/json
 
-{"name":"zhouzhendong","password":"zhou1792524653"}
 ###
 
 GET https://was.baoshi56.com/api/thirdPart/weixin/waybill?api_token=fb7efc3

+ 1 - 1
webpack.mix.js

@@ -12,7 +12,7 @@ const mix = require('laravel-mix');
  */
 
 mix.js('resources/js/app.js', 'public/js')
-    .sass('resources/sass/app.scss', 'public/css/app200630.css');
+    .sass('resources/sass/app.scss', 'public/css/app200708.css');
 mix.js('resources/js/singles/rejectedIndex.js', 'public/js/singles/rejectedIndex200513.js');
 mix.js('resources/js/singles/searchAnalyze.js', 'public/js/singles/searchAnalyze200513.js');
 

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác