瀏覽代碼

采购系统

haozi 5 年之前
父節點
當前提交
0d12e8d84e

+ 45 - 12
app/Http/Controllers/ProcurementController.php

@@ -29,23 +29,28 @@ class ProcurementController extends Controller
 {
     use AsyncResponse;
 
-    private function newProcurement($param){
+    private function newProcurement($param,$userId,$type=0,$status=0){
         $procurement=new Procurement([
             'owner_material_id'=>$param['owner_material_id'],
             'quantity'=>$param['quantity'],
             'amount'=>$param['amount'],
             'unit_price'=>$param['unit_price'],
-            'initiator'=>Auth::user()['id'],
-            'type'=>0,
+            'initiator'=>$userId,
+            'type'=>$type,
+            'status'=>$status,
         ]);
         $procurement->save();
         $number_id=$procurement['id'];
         $procurement_code='BSHC';
         $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
-        $procurement->update(['code'=>$procurement_code]);
+        /** @var ProcurementService $procurementService*/
+        $procurementService=app(ProcurementService::class);
+        $deadline=$procurementService->computeDeadline($procurement->created_at);
+        $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
         return $procurement;
     }
 
+
     public function index(Request $request,ProcurementFilters $filters)
     {
         if(!Gate::allows('采购管理-采购-查询')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
@@ -80,7 +85,7 @@ class ProcurementController extends Controller
     {
         $this->gate('采购管理-采购-新建');
         $param=$request->all(['owner_material_id','quantity','amount','unit_price']);
-        $procurement=$this->newProcurement($param);
+        $procurement=$this->newProcurement($param,Auth::user()['id']);
         return redirect('procurement/procurement/index')->with('successTip','新采购单“'.$procurement->code.'”添加成功');
     }
     public function createProcurement(ProcurementRequest $request)
@@ -89,7 +94,7 @@ class ProcurementController extends Controller
         $request->validated();
         $param=$request->all(['owner_material_id','quantity','amount','unit_price']);
         try {
-            $procurement=$this->newProcurement($param);
+            $procurement=$this->newProcurement($param,Auth::user()['id']);
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '添加失败'];
@@ -111,14 +116,18 @@ class ProcurementController extends Controller
                 'unit_price'=>0,
                 'initiator'=>Auth::user()['id'],
                 'type'=>1,
-                'status'=>9,
-                //'is_enquiry'=>'是',
+                'status'=>0,
+                'is_enquiry'=>'是',
+                'time'=>14400000,
             ]);
             $procurement->save();
             $number_id=$procurement['id'];
             $procurement_code='BSHC';
             $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
-            $procurement->update(['code'=>$procurement_code]);
+            /** @var ProcurementService $procurementService*/
+            $procurementService=app(ProcurementService::class);
+            $deadline=$procurementService->computeDeadline($procurement->created_at);
+            $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '添加失败'];
@@ -140,12 +149,16 @@ class ProcurementController extends Controller
                 'unit_price'=>0,
                 'initiator'=>Auth::user()['id'],
                 'type'=>2,
+                'status'=>2,
             ]);
             $procurement->save();
             $number_id=$procurement['id'];
             $procurement_code='BSHC';
             $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
-            $procurement->update(['code'=>$procurement_code]);
+            /** @var ProcurementService $procurementService*/
+            $procurementService=app(ProcurementService::class);
+            $deadline=$procurementService->computeDeadline($procurement->created_at);
+            $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '添加失败'];
@@ -153,11 +166,12 @@ class ProcurementController extends Controller
             return ['success' => false,'message' => $e->getMessage()];
         }
     }
+    //取消采购单
     public function cancel($id){
         $this->gate('采购管理-采购-编辑');
         try {
             $procurement=Procurement::query()->find($id);
-            $procurement->update(['status'=>3]);
+            $procurement->update(['status'=>10]);
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '取消失败'];
@@ -179,7 +193,7 @@ class ProcurementController extends Controller
             }
             $procurement->update([
                 'type'=>0,
-                'status'=>0,
+                'status'=>2,
                 'quantity'=>$param['quantity'],
                 'amount'=>$param['amount'],
                 'unit_price'=>$unit_price,
@@ -220,6 +234,25 @@ class ProcurementController extends Controller
             return ['success' => false,'message' => $e->getMessage()];
         }
     }
+    public function createAnew(Request $request)
+    {
+        $this->gate('采购管理-采购-新建');
+        $ids=$request->input('checkData');
+        if (empty($ids)) return ['success' => false, 'message' => '当前未勾选指定订单!'];
+        $collect=collect();
+        $procurements=Procurement::query()->whereIn('id',$ids)->get();
+        foreach ($procurements as $procurement){
+            if ($procurement->type==2){
+                $pro=$this->newProcurement($procurement,Auth::user()['id'],$procurement->type,2);
+                $pro->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
+                continue;
+            }
+            $pro=$this->newProcurement($procurement,Auth::user()['id'],$procurement->type);
+            $pro->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
+            $collect->add($pro);
+        }
+        if (!empty($collect)) return ['success' => true,'data' => $collect];
+    }
 
 
 

+ 16 - 10
app/Http/Controllers/TestController.php

@@ -60,7 +60,9 @@ use App\ProcessDaily;
 use App\ProcessStatistic;
 use App\Procurement;
 use App\ProcurementCheckSheet;
+use App\ProcurementDeliverie;
 use App\ProcurementQuotation;
+use App\ProcurementTotalBill;
 use App\Province;
 use App\Region;
 use App\RejectedBill;
@@ -1676,15 +1678,19 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
     public function testUser()
     {
-        $procurementQuotations=ProcurementQuotation::query()
-            ->with('procurement.ownerMaterial.material')
-            ->where('status',0)
-            ->whereNull('offer')
-            //->where('created_at','>=',Carbon::parse($now)->subHours(4))
-            //->where('created_at','<=',$now)
-            ->get();
-        dd($procurementQuotations->toJson());
-
-
+        $procurement=Procurement::query()->with('ownerMaterial.material')->find(1);
+        $material=$procurement->ownerMaterial->material;
+        $user=Auth::user();
+        $supplier=Supplier::query()
+            ->whereHas('user',function($query)use($user){
+            /** @var Builder $query */
+            return $query->where('id',$user['id']);
+            })
+            ->whereHas('material',function ($builder)use ($material){
+                /** @var Builder $builder */
+                return $builder->where('id',$material['id']);
+            })
+        ->first();
+        dd($supplier);
     }
 }

+ 0 - 5
app/Http/Controllers/api/procurement/wechat/AuthController.php

@@ -40,11 +40,6 @@ class AuthController extends Controller
         return response()->json(['status'=>1,'message' => $userType,'data'=>$token], 200);
     }
 
-    public function me()
-    {
-        return response()->json(auth('api')->user());
-    }
-
     public function getJWTToken($value)
     {
         $time = time();

+ 180 - 8
app/Http/Controllers/api/procurement/wechat/ProcurementController.php

@@ -3,21 +3,193 @@
 namespace App\Http\Controllers\api\procurement\wechat;
 
 use App\Http\Controllers\Controller;
+use App\Procurement;
+use App\ProcurementCheckSheet;
+use App\ProcurementDeliverie;
 use App\ProcurementQuotation;
+use App\ProcurementTotalBill;
+use App\Services\api\UserService;
+use App\Services\ProcurementService;
 use Carbon\Carbon;
+use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
 class ProcurementController extends Controller
 {
-    public function getQuotation(){
-        $now=Carbon::now()->toDateTimeString();
-        $procurementQuotations=ProcurementQuotation::query()
+
+    public function getWaitQuotation(Request $request)
+    {
+        $status=$request->input('status');//0:待报价,2:待接单
+        $procurements=Procurement::query()
+            ->withCount('procurementQuotations')
+            ->with('ownerMaterial.material')
+            ->where('status',$status)
+            ->whereNull('supplier_id')
+            ->get();
+        $keys = [];
+        foreach ($procurements as $key=>$procurement){
+            if ($procurement->procurement_quotations_count>0 && $status==0 )$keys[]= $key;
+            if($status==0)$procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now()); //待报价倒计时4小时
+            if($status==2)$procurement->deadline=Carbon::parse($procurement->deadline)->subHours(-24)->diffInMilliseconds(Carbon::now()); //待接单倒计时24小时
+        }
+        $procurements = $procurements->diffKeys($keys);
+        if (!empty($procurements))return response()->json(['status'=>1,'data'=>$procurements], 200);
+    }
+
+    public function getQuotationDetailById(Request $request)
+    {
+        $id=$request->input('id');
+        $procurement=Procurement::query()
+            ->with(['ownerMaterial.material','ownerMaterial.owner'])
+            ->find($id);
+        $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now());
+        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+    }
+    //报价
+    public function setOffer(Request $request)
+    {
+        $param=$request->all(['id','offer']);
+        $user= Auth::user();
+        $procurement=Procurement::query()->with('ownerMaterial.material')->find($param['id']);
+        $material=$procurement->ownerMaterial->material;
+        /** @var ProcurementService $procurementService*/
+        $procurementService=app(ProcurementService::class);
+        $supplier=$procurementService->screenSupplier($user,$material);
+        $procurementQuotation=ProcurementQuotation::query()->create([
+            'procurement_id'=>$param['id'],
+            'offer'=>$param['offer'],
+            'operator'=>$user->id,
+            'supplier_id'=>$supplier->id,
+            'quoted_at'=>Carbon::now()->toDateTimeString(),
+            'status'=>1,//2:已报价
+        ]);
+        $procurement->update(['status'=>1]);//1:已报价
+        if ($procurementQuotation) return response()->json(['status'=>1,'data'=>$procurementQuotation], 200);
+    }
+    //接单
+    public function accept(Request $request)
+    {
+        $id=$request->input('id');
+        $user= Auth::user();
+        $procurement=Procurement::query()->with('ownerMaterial.material')->find($id);
+        if ($procurement->type==2){
+            $material=$procurement->ownerMaterial->material;
+            /** @var ProcurementService $procurementService*/
+            $procurementService=app(ProcurementService::class);
+            $supplier=$procurementService->screenSupplier($user,$material);
+            $procurement->update(['status'=>4,'supplier_id'=>$supplier->id]);//4:生产中
+        }else{
+            $procurement->update(['status'=>4]);//4:生产中
+        }
+        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+    }
+    //生产中的订单
+    public function getProductionProcurement()
+    {
+        $procurements=Procurement::query()
+            ->with('ownerMaterial.material')
+            ->whereIn('type',[0,2])
+            ->where('status',4) //4:生产中
+            ->get();
+        if ($procurements) return response()->json(['status'=>1,'data'=>$procurements], 200);
+    }
+    //结束生产
+    public function finishProductionProcurement(Request $request)
+    {
+        $id=$request->input('id');
+        $procurement=Procurement::query()->find($id)->update(['status'=>5]);
+        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+    }
+
+    public function getProcurementDeliveries()
+    {
+        $procurementDeliveries=ProcurementDeliverie::query()
             ->with('procurement.ownerMaterial.material')
-            ->where('status',0)
-            ->whereNull('offer')
-            //->where('created_at','>=',Carbon::parse($now)->subHours(4))
-            //->where('created_at','<=',$now)
+            ->whereIn('status',[0,1])//1:待送货,2:送货中
+            ->get();
+        if ($procurementDeliveries) return response()->json(['status'=>1,'data'=>$procurementDeliveries], 200);
+    }
+    public function makeProcurementDelivery(Request $request)
+    {
+        $param=$request->all(['id','deliverAmount']);
+        $procurement=Procurement::query()
+            ->with('procurementDeliveries')
+            ->find($param['id']);
+        $deliveryAmount=$param['deliverAmount'];
+        if (!empty($procurement->procurementDeliveries)){
+            foreach ($procurement->procurementDeliveries as $delivery){
+                if (!$delivery->amount)continue;
+                $deliveryAmount=$deliveryAmount+$delivery->amount;
+            }
+        }
+        if ((int)$deliveryAmount>(int)$procurement->quantity) return  response()->json(['status'=>0,'message' => '当前送货数量叠加已送货数量大于采购数量','data'=>$deliveryAmount], 401);
+        /** @var $apiUserService UserService */
+        $apiUserService=app(UserService::class);
+        $user= $apiUserService->getUser($request->header('token'));
+        //生成送货单
+        $procurementDelivery=new ProcurementDeliverie();
+        $procurementDelivery['procurement_id']=$param['id'];
+        $procurementDelivery['amount']=$param['deliverAmount'];
+        $procurementDelivery['initiator']=$user->data->id;
+        $procurementDelivery['signer']=$procurement->initiator ?? 0;
+        $procurementDelivery['created_at']=Carbon::now()->toDateTimeString();
+        $procurementDelivery['updated_at']=Carbon::now()->toDateTimeString();
+        $procurementDelivery->save();
+        $procurementDelivery->loadMissing( 'procurement.ownerMaterial.material');
+        //当前采购单不是打样单生成对账单
+        if ($procurement->type!=2)ProcurementCheckSheet::query()->create(['procurement_delivery_id'=>$procurementDelivery->id,'account_payable'=>$procurementDelivery->receipt_amount*$procurement->cost_price,'auditor'=>0]);
+        if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
+    }
+    public function getProcurementDeliveryById(Request $request)
+    {
+        $procurementDelivery=ProcurementDeliverie::query()
+            ->with(['procurement.ownerMaterial.material','receiver.userDetail','procurement.ownerMaterial.owner.customer','procurement.supplier',])
+            ->find($request->input('id'));
+        if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
+    }
+    public function updateProcurementDeliveryAmount(Request $request)
+    {
+        $param=$request->all(['id','delivernum']);
+        $procurementDelivery=ProcurementDeliverie::query()->where('id',$param['id'])->update(['amount'=>$param['delivernum']]);
+        if ($procurementDelivery)return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
+    }
+
+    public function getProcurementTotalBill()
+    {
+        $procurementTotalBills=ProcurementTotalBill::query()
             ->get();
-        if (!empty($procurementQuotations))return response()->json(['status'=>1,'data'=>$procurementQuotations->toJson()], 200);
+        foreach ($procurementTotalBills as $procurementTotalBill){
+            /** @var  ProcurementTotalBill $procurementTotalBill */
+            $procurementTotalBill->setCurrentMothProcurements();
+        }
+        if ($procurementTotalBills) return response()->json(['status'=>1,'data'=>$procurementTotalBills], 200);
+    }
+    public function markProcurementTotalBillStatus(Request $request)//供应商提交对账单
+    {
+        $id=$request->input('id');
+        $procurementTotalBill=ProcurementTotalBill::query()->find($id)->update(['status'=>1]);//1:已出账
+        return response()->json(['status'=>1,'data'=>$procurementTotalBill], 200);
+    }
+    //收货员确认收货
+    public function makeReceipt(Request $request)
+    {
+        $param=$request->all(['id','delivernum']);
+        $procurementDelivery=ProcurementDeliverie::query()->with('procurement')->find($param['id']);
+        $procurementDelivery ->update(['status'=>1,'receipt_amount'=>$param['delivernum'],'created_at'=>Carbon::now()->toDateTimeString(),'signed_at'=>Carbon::now()->toDateString()]);
+        $procurementDelivery->procurement->update(['status'=>6]);
+        if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
+    }
+    public function supplierDeliverConfirm(Request $request)
+    {
+        $procurementDelivery=ProcurementDeliverie::query()
+            ->with(['procurement','procurementCheckSheet'])->find($request->input('id'));
+        $procurementDelivery->update(['status'=>2]);//2:送货完成
+        $procurementCheckSheet=$procurementDelivery->procurementCheckSheet;
+        if ($procurementDelivery->procurement
+            && $procurementDelivery->procurement->type!=2
+            && $procurementCheckSheet)
+        $procurementCheckSheet->update(['status'=>1,'account_payable'=>($procurementDelivery->receipt_amount*$procurementDelivery->procurement->cost_price)]);
+        $procurementDelivery->procurement->update(['status'=>7]);//待出账
+        if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
     }
 }

+ 5 - 1
app/Http/Middleware/ProcurementApiAuth.php

@@ -2,8 +2,10 @@
 
 namespace App\Http\Middleware;
 
+use App\User;
 use Closure;
 use Firebase\JWT\JWT;
+use Illuminate\Support\Facades\Auth;
 
 
 class ProcurementApiAuth
@@ -20,12 +22,14 @@ class ProcurementApiAuth
 
         $key = env('JWT_SECRET');
         try{
-            JWT::decode($jwt,$key,$alg);
+            $loginUser=JWT::decode($jwt,$key,$alg);
         }
         catch (\Exception $e)
         {
             return response()->json('token无效:'.$e);
         }
+        if ($loginUser) $user=User::query()->find($loginUser->data->id);
+        if ($user)   Auth::login($user);
         return $next($request);
     }
 }

+ 4 - 2
app/Http/Requests/Procurement/ProcurementAmountRequest.php

@@ -26,15 +26,17 @@ class ProcurementAmountRequest extends FormRequest
     public function rules()
     {
         return [
-            'quantity'=>'required',
-            'amount'=>'required',
+            'quantity'=>'required|numeric|min:0|not_in:0',
+            'amount'=>'required|numeric|min:0|not_in:0',
         ];
     }
     public function messages()
     {
         return [
             'quantity.required' => '采购数量不可为空',
+            'quantity.not_in' => '采购数量不可为0',
             'amount.required' => '销售数量不可为空',
+            'amount.not_in' => '销售数量不可为0',
         ];
     }
 }

+ 2 - 13
app/LaborReport.php

@@ -235,7 +235,7 @@ class LaborReport extends Model
     private function checkExitStatus()
     {
         $status = $this->laborReportStatus->sortByDesc('id')->first();
-        $this->is_export = $status['status'] == '已退场' ? true : false;
+        $this->is_export = ($status['status'] == '已退场') ? true :false;
         if ($status['status'] == '已退场')$this->exit_at=Carbon::parse($status['created_at'])->format('Y-m-d H:i:s');
     }
     private function checkEnterStatus(){
@@ -269,17 +269,6 @@ class LaborReport extends Model
             $laborReport->checkExitStatus(); //校验出场并赋值
         }
     }
-    public static function enter($laborReports)
-    {
-        foreach ($laborReports as $laborReport){
-            /** @var LaborReport $laborReport */
-            $laborReport->checkEnterStatus(); //校验进场并赋值
-            $laborReport->checkAmountOfJoined();
-            $laborReport->checkSequence();
-            $laborReport->checkTotalOnlineTime();
-            $laborReport->checkExitStatus(); //校验出场并赋值
-        }
-    }
 
     //创建或获取进场编号
     public function makeOrGetEnteringNumber()
@@ -308,7 +297,7 @@ class LaborReport extends Model
             $laborReport->online_duration=$online_duration;
         }
         $laborReport->update();
-        $laborReport->is_export=$laborReport->checkExitStatus();
+        $laborReport->is_export=true;
         return $laborReport;
     }
 

+ 19 - 9
app/Procurement.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use App\Services\api\UserService;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
@@ -22,20 +23,21 @@ class Procurement extends Model
     ];
 
     const status=[
-        0 => "待推单",
+        0 => "待报价",
         1 => "已报价",
-        2 => "生产中",
-        3 => "取消订单",
-        4 => "已完成",
-        5 => "完结",
-        6 => "下单失败",
+        2 => "待接单",
+        3 => "已失效",
+        4 => "生成中",
+        5 => "待收货",
+        6 => "待确定",
         7 => "待出账",
-        8 => "待接单(已过期)",
-        9 => "待报价",
+        8 => "已出账",
+        9 => "完结",
+        10 => "订单取消",
     ];
 
     protected $fillable=[
-        'code','owner_material_id', 'supplier_id', 'quantity','amount','unit_price','cost_price','status','initiator','type'
+        'code','owner_material_id', 'supplier_id', 'quantity','amount','unit_price','cost_price','status','initiator','type','is_enquiry','deadline'
     ];
 
     protected static function booted()
@@ -65,6 +67,14 @@ class Procurement extends Model
     {
         return $this->belongsTo(User::class,'initiator','id');
     }
+    public function procurementDeliveries()
+    {
+        return $this->hasMany('App\ProcurementDeliverie','procurement_id','id');
+    }
+    public function procurementQuotations()
+    {
+        return $this->hasMany('App\ProcurementQuotation','procurement_id','id');
+    }
 
     public function scopeFilter($query, $filters)
     {

+ 3 - 2
app/ProcurementCheckSheet.php

@@ -14,8 +14,9 @@ class ProcurementCheckSheet extends Model
 
     const status=[
         0 => "未出账",
-        1 => "已出账",
-        2 => "已完结",
+        1 => "待出账",
+        2 => "已出账",
+        3 => "已完结",
     ];
     protected $fillable=[
         'procurement_delivery_id','invoice_number', 'account_payable', 'auditor','status','created_at'

+ 9 - 2
app/ProcurementDeliverie.php

@@ -14,9 +14,13 @@ class ProcurementDeliverie extends Model
     use ModelTimeFormat;
 
     protected $fillable=[
-        'procurement_id','amount', 'initiator','status','signer','signed_at',
+        'procurement_id','amount', 'initiator','status','signer','signed_at','receipt_amount'
+    ];
+    const status=[
+        0=>'待送货',
+        1=>'送货中',
+        2=>'送货完成',
     ];
-
     public function procurement(){
         return $this->belongsTo('App\Procurement','procurement_id','id');
     }
@@ -24,4 +28,7 @@ class ProcurementDeliverie extends Model
     public function receiver(){
         return $this->belongsTo('App\User','signer','id');
     }
+    public function procurementCheckSheet(){
+        return $this->belongsTo('App\ProcurementCheckSheet','id','procurement_delivery_id');
+    }
 }

+ 1 - 1
app/ProcurementQuotation.php

@@ -21,7 +21,7 @@ class ProcurementQuotation extends Model
 
     const status=[
         0 => "待报价",
-        1 => "待审核",
+        1 => "已报价",
         2 => "待接单",
         3 => "已失效",
         4 => "生成中",

+ 31 - 0
app/ProcurementTotalBill.php

@@ -3,9 +3,12 @@
 namespace App;
 
 use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\ModelLogChanging;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
 
 class ProcurementTotalBill extends Model
 {
@@ -24,9 +27,37 @@ class ProcurementTotalBill extends Model
     public function supplier(){
         return $this->belongsTo('App\Supplier','supplier_id','id');
     }
+
     //截取账单日期为月
     public function getCountingMonthAttribute($value)
     {
         return substr($value,0,7);
     }
+
+    public function  setCurrentMothProcurements(){
+        $ProcurementQuery = Procurement::query()->select("id")
+            ->where('supplier_id',$this->supplier_id)
+            ->where("created_at","like",$this->counting_month."%");
+         $procurementDeliveryQuery= ProcurementDeliverie::query()->select('id')
+            ->whereIn("procurement_id",$ProcurementQuery);
+        $this->relations["procurementCheckSheets"]=ProcurementCheckSheet::query()
+            ->with(['procurementDelivery.procurement.ownerMaterial.material'])
+            ->whereIn('procurement_delivery_id',$procurementDeliveryQuery)->get();
+    }
+
+    protected static function booted()
+    {
+        /** @var User $user */
+        $user = Auth::user();
+        if ($user && !$user->isSuperAdmin()) {
+            /** @var \stdClass $user */
+            $ids = array_column(DB::select(DB::raw("SELECT supplier_id FROM supplier_user WHERE user_id = ?"),[$user->id]),"supplier_id");
+            if (count($ids)>0){
+                static::addGlobalScope('supplier', function (Builder $builder)use ($ids) {
+                    $builder->whereIn('supplier_id',  $ids);
+                });
+            }
+        }
+    }
+
 }

+ 1 - 0
app/Providers/AppServiceProvider.php

@@ -231,6 +231,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('UnitService',UnitService::class);
         app()->singleton('UserOwnerGroupService',UserOwnerGroupService::class);
         app()->singleton('UserService',UserService::class);
+        app()->singleton('ApiUserService',\App\Services\api\UserService::class);
         app()->singleton('UserWorkgroupService',UserWorkgroupService::class);
         app()->singleton('WarehouseService',WarehouseService::class);
         app()->singleton('WaybillFinancialService',WaybillFinancialService::class);

+ 1 - 1
app/Services/LaborReportService.php

@@ -151,7 +151,7 @@ class LaborReportService
             $laborReport->online_duration=$online_duration;
         }
         $laborReport->update();
-        $laborReport->is_export=$laborReport->getIsExportAttribute();
+        $laborReport->is_export=true;
         return $laborReport;
     }
     //当天第一次进工作组更新临时工报表

+ 31 - 2
app/Services/ProcurementService.php

@@ -6,6 +6,9 @@ use App\Owner;
 use App\Procurement;
 use App\ProcurementQuotation;
 use App\Services\common\QueryService;
+use App\Supplier;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Facades\Auth;
 use App\Traits\ServiceAppAop;
 
@@ -17,8 +20,12 @@ class ProcurementService
     //选中最低报价
     public function screenLowestQuotation($procurement_id){
         if (!$procurement_id) return null;
-        $procurementQuotation=ProcurementQuotation::query()->with('supplier')
-            ->select('supplier_id','offer')->orderBy('offer','asc')->where('procurement_id',$procurement_id)->first();
+        $procurementQuotation=ProcurementQuotation::query()
+            ->with(['supplier','procurement'])
+            ->select('procurement_id','supplier_id','offer')
+            ->orderBy('offer','asc')
+            ->where('procurement_id',$procurement_id)
+            ->first();
         return $procurementQuotation;
     }
 
@@ -35,4 +42,26 @@ class ProcurementService
             //TODO 推送给指定耗材类型供应商
         }
     }
+    public function computeDeadline($time)
+    {
+        $date=Carbon::parse($time)->toDateString();
+        if ($time<$date." 09:00:00")$deadline=Carbon::parse($date." 09:00:00")->subHours(-4)->toDateTimeString();
+        if($time>=$date." 09:00:00" && $time<$date." 14:00:00") $deadline=Carbon::parse($time)->subHours(-4)->toDateTimeString();
+        if ($time>=$date." 14:00:00")$deadline=Carbon::parse($time)->subHours(-15-4)->toDateTimeString();
+        if ($deadline) return $deadline;
+    }
+    public function screenSupplier($user,$material)
+    {
+        //通过当前登录用户及采购单对应相应耗材筛选出指定供应商
+        $supplier=Supplier::query()
+            ->whereHas('user',function($query)use($user){
+                /** @var Builder $query */
+                return $query->where('id',$user->id);
+            })
+            ->whereHas('material',function ($builder)use ($material){
+                /** @var Builder $builder */
+                return $builder->where('id',$material['id']);
+            })->first();
+        if ($supplier) return $supplier;
+    }
 }

+ 28 - 0
app/Services/api/UserService.php

@@ -0,0 +1,28 @@
+<?php
+
+
+namespace App\Services\api;
+
+
+use App\Authority;
+use App\Owner;
+use App\User;
+use Firebase\JWT\JWT;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Gate;
+use App\Traits\ServiceAppAop;
+
+
+class UserService
+{
+    public function getUser($jwt)
+    {
+        $alg =
+            [
+                "typ" => "JWT", //声明类型为jwt
+                "alg" => "HS256" //声明签名算法为SHA256
+            ];
+        $key = env('JWT_SECRET');
+        return JWT::decode($jwt,$key,$alg);
+    }
+}

+ 5 - 0
app/Supplier.php

@@ -20,6 +20,11 @@ class Supplier extends Model
         return $this->belongsToMany(Material::class,'material_suppliers','supplier_id','material_id');
     }
 
+    public function user():BelongsToMany
+    {
+        return $this->belongsToMany(User::class,'supplier_user','supplier_id','user_id');
+    }
+
     public function scopeFilter($query,$filters)
     {
         return $filters->apply($query);

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddReceiptAmountColumnToProcurementDeliveries extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('procurement_deliveries', function (Blueprint $table) {
+            $table->decimal('receipt_amount')->nullable()->comment('送货数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('procurement_deliveries', function (Blueprint $table) {
+            $table->dropColumn('receipt_amount');
+        });
+    }
+}

+ 35 - 0
database/migrations/2021_03_09_131039_change_procurements_time_column.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeProcurementsTimeColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('procurements', function (Blueprint $table) {
+            $table->dropColumn('time');
+            $table->timestamp('deadline')->nullable()->comment('接单倒计时');
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('procurements', function (Blueprint $table) {
+            $table->timestamp('time')->nullable()->comment('接单倒计时');
+            $table->dropColumn('deadline');
+        });
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class DeleteIsEnquiryColumnToProcurements extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('procurements', function (Blueprint $table) {
+            $table->dropColumn('is_enquiry');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('procurements', function (Blueprint $table) {
+            $table->enum('is_enquiry',['是','否'])->default('否')->comment('是否询价');
+        });
+    }
+}

+ 4 - 1
resources/views/procurement/finance/checkBill.blade.php

@@ -42,7 +42,10 @@
                 <td class="text-muted">@{{ procurementCheckSheet.account_payable }}</td>
                 <td><span>@{{ procurementCheckSheet.invoice_number }}</span></td>
                 <td><span>@{{ procurement_check_sheet_status[procurementCheckSheet.status] }}</span></td>
-                <td><a class="text-primary" @click="fillInvoiceNumber(procurementCheckSheet.id)" v-if="!procurementCheckSheet.invoice_number">填写发票号</a></td>
+                <td class="text-center">
+                    <a class="text-primary" @click="fillInvoiceNumber(procurementCheckSheet.id)" v-if="!procurementCheckSheet.invoice_number">填写发票号</a>
+                    <span v-else>-</span>
+                </td>
             </tr>
         </table>
         @can('采购管理-财务-对账单')

+ 5 - 3
resources/views/procurement/finance/procurementBill.blade.php

@@ -35,7 +35,7 @@
                 <td class=""></td>
                 <td v-if="procurement.owner_material.owner">@{{ procurement.owner_material.owner.name }}</td>
                 <td v-if="procurement.owner_material.owner.customer">@{{ procurement.owner_material.owner.customer.company_name }}</td>
-                <td v-if="procurement.supplier">@{{ procurement.supplier.name }}</td>
+                <td ><span v-if="procurement.supplier">@{{ procurement.supplier.name }}</span></td>
                 <td class="tooltipTarget" style="max-width: 200px;overflow:hidden" v-if="procurement.owner_material.material">@{{ procurement.owner_material.material.code }}</td>
                 <td class="text-muted" v-if="procurement.owner_material.material">@{{ procurement.owner_material.material.name }}</td>
                 <td class="text-muted" v-if="procurement.owner_material">@{{ procurement.owner_material.size }}</td>
@@ -50,8 +50,10 @@
                 <td>@{{ procurement.quantity*procurement.unit_price }}</td> {{--应付--}}
                 <td><span>@{{ procurement_status[procurement.status] }}</span></td>
                 <td>
-                    <span class="btn btn-sm btn-outline-danger">锁定</span>
-                    <span class="btn btn-sm btn-outline-success" @click="changeCostPrice(procurement.id,procurement.cost_price)">修改采购单价</span>
+                    <span v-if="procurement.status<9">
+                        <span class="btn btn-sm btn-outline-danger">锁定</span>
+                        <span class="btn btn-sm btn-outline-success" @click="changeCostPrice(procurement.id,procurement.cost_price)">修改采购单价</span>
+                    </span>
                 </td>
             </tr>
         </table>

+ 33 - 9
resources/views/procurement/procurement/index.blade.php

@@ -36,7 +36,7 @@
                         <div class="card-body row">
                             <span class="fa fa-calendar-o fa-4x offset-md-3" style="color: #2ca02c"></span>
                             <span class="ml-4 mt-2">
-                        <h5 class="font-weight-bold">数量</h5>
+                        <h5 class="font-weight-bold">0</h5>
                         <p class="text-muted">今日对账金额</p>
                         </span>
                         </div>
@@ -72,7 +72,7 @@
             @can('采购管理-采购-编辑')
                 @include('procurement.procurement._addQuantity')
             @endcan
-            <span class="btn btn-sm btn-outline-primary ml-2">重新发起</span>
+            <span class="btn btn-sm btn-outline-primary ml-2" @click="createAnew(checkData)">重新发起</span>
         </div>
         <label for="all" id="cloneCheckAll" class="d-none">
             <input id="all" type="checkbox" @click="checkAll($event)">全选
@@ -102,11 +102,12 @@
                 <td><span>@{{ procurement_status[procurement.status] }}</span></td>
                 <td><span v-if="procurement.owner_material.owner.customer">@{{ procurement.owner_material.owner.customer.phone }}</span></td>
                 <td>
-                    <span v-if="procurement_status[procurement.status]!='取消订单'">
+                    <span v-if="procurement_status[procurement.status]!='订单取消'">
                         <span class="btn btn-sm btn-outline-danger" v-if="!procurement.supplier_id"
                               @click="cancel(procurement.id,procurement.type,procurement.code)">取消</span>
-                        <span class="btn btn-sm btn-outline-success" v-if="procurement_type[procurement.type]=='询价单'"
-                              @click="initiateProcurement(procurement.id)">发起采购</span>
+                        <span class="btn btn-sm btn-outline-success" v-if="procurement_type[procurement.type]=='询价单'
+                        || (procurement_type[procurement.type]=='采购单' && !procurement.cost_price)"
+                              @click="initiateProcurement(procurement)">发起采购</span>
                     </span>
                 </td>
             </tr>
@@ -262,16 +263,18 @@
                     this.errors = {};
                     $('#add-proof').modal('show');
                 },
-                initiateProcurement(id) {
+                initiateProcurement(procurement) {
                     let _this=this;
-                    this.procurement_id=id;
+                    this.procurement_id=procurement.id;
                     let url="{{url('procurement/procurement/initiateProcurement')}}";
-                    let params={id:id};
+                    let params={id:procurement.id};
                     window.axios.post(url,params).then(res => {
                             if (res.data.success) {
                               _this.supplier=res.data.data.supplier.name;
                               _this.supplier_id=res.data.data.supplier_id;
                               _this.offer=res.data.data.offer;
+                              if(res.data.data.procurement.quantity)_this.quantity=res.data.data.procurement.quantity;else _this.quantity='';
+                              if(res.data.data.procurement.amount)_this.amount=res.data.data.procurement.amount; else _this.amount='';
                               $('#add-quantity').modal('show');
                             } else {
                                 tempTip.setDuration(3000);
@@ -453,7 +456,28 @@
                         window.tempTip.show("网络错误:" + err);
                     });
                 },
-
+                //从新创建procurement
+                createAnew(checkData){
+                    let _this=this;
+                    let url="{{url('procurement/procurement/createAnew')}}";
+                    let params={checkData:checkData};
+                    window.axios.post(url,params).then(res => {
+                        if (!res.data.success) {
+                            window.tempTip.setDuration(3000);
+                            window.tempTip.show(res.data.message);
+                        } else {
+                           res.data.data.forEach(function (procurement) {
+                               _this.procurements.push(procurement);
+                            });
+                            _this.checkData=[];
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.showSuccess("从新发起成功");
+                        }
+                    }).catch(err => {
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show("网络错误:" + err);
+                    });
+                },
             }
         });
     </script>

+ 14 - 1
routes/api.php

@@ -16,7 +16,20 @@ use Illuminate\Support\Facades\Route;
 Route::group(['prefix' => 'procurement','middleware'=>'procurement.auth.api'], function ($router) {
     Route::post('logout', 'api\procurement\wechat\AuthController@logout');
     Route::post('refresh', 'api\procurement\wechat\AuthController@refresh');
-    Route::get('getQuotation', 'api\procurement\wechat\ProcurementController@getQuotation');
+    Route::post('getWaitQuotation', 'api\procurement\wechat\ProcurementController@getWaitQuotation');
+    Route::post('getQuotationDetailById', 'api\procurement\wechat\ProcurementController@getQuotationDetailById');
+    Route::post('setOffer', 'api\procurement\wechat\ProcurementController@setOffer');
+    Route::post('accept', 'api\procurement\wechat\ProcurementController@accept');
+    Route::get('getProductionProcurement', 'api\procurement\wechat\ProcurementController@getProductionProcurement');
+    Route::get('getProcurementDeliveries', 'api\procurement\wechat\ProcurementController@getProcurementDeliveries');
+    Route::post('makeProcurementDelivery', 'api\procurement\wechat\ProcurementController@makeProcurementDelivery');
+    Route::post('finishProductionProcurement', 'api\procurement\wechat\ProcurementController@finishProductionProcurement');
+    Route::post('getProcurementDeliveryById', 'api\procurement\wechat\ProcurementController@getProcurementDeliveryById');
+    Route::post('updateProcurementDeliveryAmount', 'api\procurement\wechat\ProcurementController@updateProcurementDeliveryAmount');
+    Route::get('getProcurementTotalBill', 'api\procurement\wechat\ProcurementController@getProcurementTotalBill');
+    Route::post('markProcurementTotalBillStatus', 'api\procurement\wechat\ProcurementController@markProcurementTotalBillStatus');
+    Route::post('makeReceipt', 'api\procurement\wechat\ProcurementController@makeReceipt');
+    Route::post('supplierDeliverConfirm', 'api\procurement\wechat\ProcurementController@supplierDeliverConfirm');
 });
 Route::group(['prefix' => 'procurement'], function ($router) {
     Route::post('login', 'api\procurement\wechat\AuthController@login');

+ 3 - 2
routes/web.php

@@ -459,13 +459,13 @@ Route::group(['prefix'=>'personnel'],function(){
         Route::group(['prefix'=>'userDutyCheck'],function(){
             Route::get('importAndExportClock','UserDutyCheckController@importAndExportClock');
             Route::get('clock','UserDutyCheckController@clock');
-            Route::post('storeClock','UserDutyCheckController@storeClock');
+            Route::any('storeClock','UserDutyCheckController@storeClock');
             Route::post('绑定临时工并进组','UserDutyCheckController@绑定临时工并进组');
             Route::post('importGroupClock','UserDutyCheckController@importGroupClock');
             Route::get('createUserDetail/{mobile_phone}','UserDutyCheckController@createUserDetail');
             Route::get('updateUserLaborCompanies/{mobile_phone}','UserDutyCheckController@updateUserLaborCompanies');
             Route::any('storeUserDetail','UserDutyCheckController@storeUserDetail');
-            Route::post('storeUpdateUserLaborCompanies','UserDutyCheckController@storeUpdateUserLaborCompanies');
+            Route::any('storeUpdateUserLaborCompanies','UserDutyCheckController@storeUpdateUserLaborCompanies');
         });
 
         Route::get('goGetQRCode','QRCodeController@goGetQRCode');
@@ -747,6 +747,7 @@ Route::group(['prefix'=>'procurement'],function () {
         Route::get('cancel/{id}','ProcurementController@cancel');
         Route::post('initiateProcurement','ProcurementController@initiateProcurement');
         Route::post('submitProcurement','ProcurementController@submitProcurement');
+        Route::post('createAnew','ProcurementController@createAnew');
     });
     /** 财务 */
     Route::group(['prefix'=>'finance'],function(){