Explorar el Código

Merge branch 'Haozi' of ssh://was.baoshi56.com:10022/var/git/bswas

LD hace 5 años
padre
commit
4d6f257e1a
Se han modificado 39 ficheros con 1152 adiciones y 194 borrados
  1. 26 0
      app/Components/ApiProcurementResponse.php
  2. 8 0
      app/Console/Commands/CreateProcurementTotalBill.php
  3. 15 2
      app/Http/Controllers/Auth/RegisterController.php
  4. 3 0
      app/Http/Controllers/ConfigurationController.php
  5. 56 46
      app/Http/Controllers/ProcurementController.php
  6. 1 0
      app/Http/Controllers/TestController.php
  7. 24 3
      app/Http/Controllers/UserController.php
  8. 0 61
      app/Http/Controllers/api/procurement/wechat/AuthController.php
  9. 86 0
      app/Http/Controllers/api/thirdPart/weixin/AuthController.php
  10. 22 16
      app/Http/Controllers/api/thirdPart/weixin/ProcurementController.php
  11. 78 0
      app/Jobs/ProcurementCheckConfirmInform.php
  12. 81 0
      app/Jobs/ProcurementConfirmInform.php
  13. 68 0
      app/Jobs/ProcurementEnquiry.php
  14. 37 0
      app/Jobs/ProcurementReceive.php
  15. 82 0
      app/Jobs/ProcurementWaitConfirmInform.php
  16. 8 6
      app/Procurement.php
  17. 7 1
      app/ProcurementTotalBill.php
  18. 4 0
      app/Providers/AppServiceProvider.php
  19. 37 0
      app/Services/ConfigurationService.php
  20. 2 2
      app/Services/PackageService.php
  21. 8 19
      app/Services/ProcurementService.php
  22. 67 0
      app/Services/ProcurementWeiXinSendMessageService.php
  23. 3 0
      app/User.php
  24. 1 1
      app/UserDetail.php
  25. 16 0
      config/weiXin.php
  26. 32 0
      database/migrations/2021_03_19_134619_add_openid_column_to_user_details.php
  27. 39 0
      database/migrations/2021_03_23_140544_add_configurations_data.php
  28. 11 1
      database/seeds/ConfigurationSeeder.php
  29. BIN
      public/images/QRCodeIMG/1.png
  30. 1 1
      resources/views/layouts/menu.blade.php
  31. 1 1
      resources/views/maintenance/configuration/_edit.blade.php
  32. 140 0
      resources/views/maintenance/user/create.blade.php
  33. 151 2
      resources/views/maintenance/user/edit.blade.php
  34. 6 0
      resources/views/maintenance/user/index.blade.php
  35. 2 2
      resources/views/package/weigh/index.blade.php
  36. 3 3
      resources/views/procurement/finance/procurementBill.blade.php
  37. 4 4
      resources/views/procurement/menuProcurement.blade.php
  38. 6 6
      resources/views/procurement/procurement/index.blade.php
  39. 16 17
      routes/api.php

+ 26 - 0
app/Components/ApiProcurementResponse.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Components;
+
+use Illuminate\Support\Facades\Gate;
+use Maatwebsite\Excel\Facades\Excel;
+
+trait ApiProcurementResponse{
+
+    public function success($data = null,$message = null): \Illuminate\Http\JsonResponse
+    {
+        $status_code=200;
+        $result = ['status'=>1];
+        if ($data)$result["data"] = $data;
+        if ($message)$result["message"] = $message;
+        return response()->json($result,$status_code);
+    }
+
+    public function error($message = null): \Illuminate\Http\JsonResponse
+    {
+        $status_code=401;
+        $result = ['status'=>0,'message'=>$message];
+        if ($message)$result["message"] = $message;
+        return response()->json($result,$status_code);
+    }
+}

+ 8 - 0
app/Console/Commands/CreateProcurementTotalBill.php

@@ -2,7 +2,9 @@
 
 namespace App\Console\Commands;
 
+use App\Jobs\ProcurementCheckConfirmInform;
 use App\ProcurementCheckSheet;
+use App\ProcurementTotalBill;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\DB;
 
@@ -61,6 +63,12 @@ class CreateProcurementTotalBill extends Command
         if (count($totalBill)>0){
             DB::table("procurement_total_bills")->insert($totalBill);
             app('LogService')->log(__METHOD__,"采购管理-生成月账单报表",json_encode($totalBill));
+            $procurementTotalBills=ProcurementTotalBill::query()
+                ->withCount('procurement')
+                ->with(['supplier.user.userDetail'])
+                ->where('counting_month',$date.'-01')
+                ->get();
+            dispatch(new ProcurementCheckConfirmInform($procurementTotalBills));
         }
     }
 

+ 15 - 2
app/Http/Controllers/Auth/RegisterController.php

@@ -4,6 +4,8 @@ namespace App\Http\Controllers\Auth;
 
 use App\User;
 use App\Http\Controllers\Controller;
+use App\UserDetail;
+use Carbon\Carbon;
 use Illuminate\Auth\Events\Registered;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -75,17 +77,28 @@ class RegisterController extends Controller
     }
     public function register(Request $request)
     {
-
         $headTo=$request->input('headTo')??'';
         $this->validator($request->all())->validate();
 
         event(new Registered($user = $this->create($request->all())));
-
+        $phone=$request->input('phone');
+        if ($phone) UserDetail::query()->create([
+            'user_id'=>$user['id'],
+            'full_name'=>$user['name'],
+            'mobile_phone'=>$phone,
+            'created_at'=>Carbon::now()->toDateTimeString(),
+            'updated_at'=>Carbon::now()->toDateTimeString(),
+        ]);
         $rolesIds=$request->input('role')??'';
         if($rolesIds){
             $roleIdArr=explode(',',$rolesIds);
             $user->roles()->sync($roleIdArr);
         }
+        $supplierIds=$request->input('supplier')??'';
+        if($supplierIds){
+            $supplierIdArr=explode(',',$supplierIds);
+            $user->suppliers()->sync($supplierIdArr);
+        }
 //        $this->guard()->login($user);
         $carrierIds=$request->input('carrier')??'';
         if ($carrierIds){

+ 3 - 0
app/Http/Controllers/ConfigurationController.php

@@ -7,6 +7,7 @@ use App\Configuration;
 use App\Filters\ConfigurationFilters;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
 
 class ConfigurationController extends Controller
 {
@@ -24,6 +25,7 @@ class ConfigurationController extends Controller
         $params = $request->all();
         $params['operator'] = Auth::user()['id'];
         $configuration = Configuration::query()->create($params);
+        Cache::put($params['name'],$configuration);
         if($configuration)$this->success($configuration->loadMissing('operator'));
         $this->error('创建失败');
     }
@@ -36,6 +38,7 @@ class ConfigurationController extends Controller
         $params = $request->only(['name','value','description']);
         $params['operator'] = Auth::user()['id'];
         $configuration->update($params);
+        Cache::put($params['name'],$configuration);
         $this->success($configuration->loadMissing('operator'));
     }
 

+ 56 - 46
app/Http/Controllers/ProcurementController.php

@@ -10,19 +10,26 @@ use App\Http\Requests\Procurement\EnquiryRequest;
 use App\Http\Requests\Procurement\ProcurementAmountRequest;
 use App\Http\Requests\Procurement\ProcurementRequest;
 use App\Http\Requests\Procurement\ProofRequest;
+use App\Jobs\ProcurementConfirmInform;
+use App\Jobs\ProcurementEnquiry;
+use App\Jobs\ProcurementReceive;
+use App\Jobs\ProcurementWaitConfirmInform;
 use App\Material;
 use App\Procurement;
 use App\ProcurementCheckSheet;
 use App\ProcurementDeliverie;
 use App\ProcurementTotalBill;
 use App\Services\common\ExportService;
+use App\Services\ConfigurationService;
 use App\Services\OwnerMaterialService;
 use App\Services\ProcurementService;
 use App\Services\ProcurementTotalBillService;
 use App\Supplier;
 use Carbon\Traits\Date;
 use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
 use Matrix\Builder;
 
@@ -47,8 +54,10 @@ class ProcurementController extends Controller
         $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
         /** @var ProcurementService $procurementService*/
         $procurementService=app(ProcurementService::class);
-        $deadline=$procurementService->computeDeadline($procurement->created_at);
+        $deadline=$procurementService->computeDeadline(Carbon::now()->toDateTimeString());
         $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
+        if ($procurement->type==0)  dispatch(new ProcurementEnquiry($procurement))->delay(Carbon::parse($deadline)); //采购单创建时 推送到队列中
+        dispatch(new ProcurementConfirmInform($procurement));  //推送发送订单通知消息模板  队列
         return $procurement;
     }
 
@@ -62,7 +71,11 @@ class ProcurementController extends Controller
             ->filter($filters)
             ->with(['initiator','ownerMaterial.file','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
                 $query->with('customer')->whereIn('id',$owner_ids);
-            }])->paginate($param['paginate'] ?? 50);
+            },'procurementDeliveries'])->paginate($param['paginate'] ?? 50);
+        foreach ($procurements as $procurement){
+            if (empty($procurement->procurementDeliveries))continue;
+            $procurement->deliver_amount=$procurement->procurementDeliveries->sum('amount');
+        }
         /** @var OwnerMaterialService $ownerMaterialService*/
         $ownerMaterialService=app(OwnerMaterialService::class);
         $owners=$ownerMaterialService->getOwnerPermittingWithMaterial();
@@ -92,6 +105,7 @@ class ProcurementController extends Controller
     }
     public function createProcurement(ProcurementRequest $request): array
     {
+
         $this->gate('采购管理-采购-新建');
         $request->validated();
         $param=$request->all(['owner_material_id','quantity','amount','unit_price']);
@@ -129,6 +143,7 @@ class ProcurementController extends Controller
             $procurementService=app(ProcurementService::class);
             $deadline=$procurementService->computeDeadline($procurement->created_at);
             $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
+            dispatch(new ProcurementConfirmInform($procurement));  //推送发送订单通知消息模板  队列
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '添加失败'];
@@ -160,6 +175,7 @@ class ProcurementController extends Controller
             $procurementService=app(ProcurementService::class);
             $deadline=$procurementService->computeDeadline($procurement->created_at);
             $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
+            dispatch(new ProcurementConfirmInform($procurement));  //推送发送订单通知消息模板  队列
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '添加失败'];
@@ -187,13 +203,15 @@ class ProcurementController extends Controller
         $this->gate('采购管理-采购-编辑');
         $request->validated();
         $param=$request->all();
+        /**@var ConfigurationService $configurationService */
+        $configurationService=app(ConfigurationService::class);
+        $receive_time=$configurationService->getReceiveTime();
+        $priceCoefficient=$configurationService->getPriceCoefficient();
         try {
+            /** @var Procurement $procurement */
             $procurement=Procurement::query()->find($param['id']);
             $unit_price=$param['unit_price'];
-            if (!$unit_price){
-                $priceCoefficient=Configuration::query()->where('name','价格系数')->value('value');
-                $unit_price=$priceCoefficient*$param['offer'];
-            }
+            if (!$unit_price) $unit_price=$priceCoefficient*$param['offer'];
             $procurement->update([
                 'type'=>0,
                 'status'=>2,
@@ -202,7 +220,10 @@ class ProcurementController extends Controller
                 'unit_price'=>$unit_price,
                 'cost_price'=>$param['offer'],
                 'supplier_id'=>$param['supplier_id'],
+                'deadline'=>Carbon::parse(Carbon::now()->toDateTimeString())->subHours(-$receive_time)->toDateTimeString(),
             ]);
+            dispatch(new ProcurementReceive($procurement))->delay(now()->addHours($receive_time)); //可从系统配置获取
+            dispatch(new ProcurementWaitConfirmInform($procurement));
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file']);
             if ($procurement) return ['success' => true,'data' => $procurement];
             else return ['success' => false, 'message' => '发起采购失败'];
@@ -258,31 +279,6 @@ class ProcurementController extends Controller
         if (!empty($collect)) return ['success' => true,'data' => $collect];
     }
 
-
-
-    public function show(Procurement $procurement)
-    {
-        //
-    }
-
-
-    public function edit(Procurement $procurement)
-    {
-        //
-    }
-
-
-    public function update(Request $request, Procurement $procurement)
-    {
-        //
-    }
-
-
-    public function destroy(Procurement $procurement)
-    {
-        //
-    }
-
     public function checkBill(Request $request,ProcurementCheckSheetFilters $filters)
     {
         if(!Gate::allows('采购管理-财务-对账单')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
@@ -295,7 +291,8 @@ class ProcurementController extends Controller
         $materials=Material::query()->select('id','name')->get();
         return view('procurement/finance/checkBill',compact('procurementCheckSheets','suppliers','paginateParams','materials'));
     }
-    public function fillInvoice(Request $request){
+    public function fillInvoice(Request $request): array
+    {
         $this->gate('采购管理-财务-对账单');
         $id=$request->input('procurementCheckSheetId');
         $invoice_number=$request->input('invoice_number');
@@ -321,12 +318,14 @@ class ProcurementController extends Controller
             ->with(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
                 /** @var Builder $query */
                 $query->with('customer')->whereIn('id',$owner_ids);
-            },'procurementDeliveries'=>function($builder){
-                /** @var Builder $builder */
-                $builder->orderByDesc('id')->first();
-            }])
+            },'procurementDeliveries'])
             ->where('type',0) //只取采购单
             ->paginate($param['paginate'] ?? 50);
+        foreach ($procurements as $procurement){
+            if (empty($procurement->procurementDeliveries))continue;
+            $procurement->deliver_amount=$procurement->procurementDeliveries->sum('amount');
+            $procurement->signed_at=$procurement->procurementDeliveries->first()['signed_at'];
+        }
         return view('procurement/finance/procurementBill',compact('suppliers','materials','owners','paginateParams','procurements'));
     }
 
@@ -348,8 +347,11 @@ class ProcurementController extends Controller
             ->filter($filters)
             ->with(['initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
                 $query->with('customer')->whereIn('id',$owner_ids);
-            }])->get();
-
+            },'procurementDeliveries'])->get();
+        foreach ($procurements as $procurement){
+            if (empty($procurement->procurementDeliveries))continue;
+            $procurement->deliver_amount=$procurement->procurementDeliveries->sum('amount');
+        }
         $procurementStatus=Procurement::status;
         $procurementType=Procurement::type;
         $row = ['采购编号','项目','单据类型','采购公司','耗材编号','耗材','尺寸大小','特殊要求','材质规格','采购数量','销售单价(元)','送货数量','销售总价(元)','采购单状态','联系方式'];
@@ -367,7 +369,7 @@ class ProcurementController extends Controller
                 $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
                 $procurement->quantity,
                 $procurement->unit_price,
-                '',//送货数量
+                $procurement->deliver_amount ?  $procurement->deliver_amount :'',//送货数量
                 $procurement->unit_price*$procurement->amount,//销售总价=销售数量*销售单价
                 is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
                 $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->phone :'',
@@ -410,9 +412,17 @@ class ProcurementController extends Controller
         $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
         $procurements = Procurement::query()
             ->filter($filters)
-            ->with(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
+            ->with(['supplier','initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
+                /** @var Builder $query */
                 $query->with('customer')->whereIn('id',$owner_ids);
-            }])->get();
+            },'procurementDeliveries'])
+            ->where('type',0) //只取采购单
+            ->paginate($param['paginate'] ?? 50);
+        foreach ($procurements as $procurement){
+            if (empty($procurement->procurementDeliveries))continue;
+            $procurement->receive_amount=$procurement->procurementDeliveries->sum('receipt_amount');
+            $procurement->signed_at=$procurement->procurementDeliveries->first()['signed_at'];
+        }
 
         $procurementStatus=Procurement::status;
         $row = ['采购编号','采购日期','接单日期','签收日期','项目名称','采购公司','供应商','耗材编号','耗材','尺寸大小','特殊要求',
@@ -422,8 +432,8 @@ class ProcurementController extends Controller
             $list[] = [
                 $procurement->code,
                 $procurement->created_at,
-                '',//接单日期
-                '',//签收日期
+                $procurement->deadline ? $procurement->deadline : '',//接单日期
+                $procurement->signed_at ? $procurement->signed_at : '',//签收日期
                 $procurement->ownerMaterial->owner ? $procurement->ownerMaterial->owner->name :'',
                 $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->company_name :'',
                 $procurement->supplier ? $procurement->supplier->name :'',
@@ -434,11 +444,11 @@ class ProcurementController extends Controller
                 $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
                 $procurement->quantity,
                 $procurement->amount,
-                '',//收货数量
+                $procurement->receive_amount ? $procurement->receive_amount : '',//收货数量
                 $procurement->cost_price,
                 $procurement->unit_price,
-                '',//应收金额
-                '',//应付金额
+                $procurement->amount*$procurement->cost_price,//应收金额
+                $procurement->quantity*$procurement->unit_price,//应付金额
                 is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
             ];
         }

+ 1 - 0
app/Http/Controllers/TestController.php

@@ -99,6 +99,7 @@ use App\Services\OrderTrackingOwnerService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerPriceOperationService;
 use App\Services\OwnerService;
+use App\Services\ProcurementWeiXinSendMessageService;
 use App\Services\RegionService;
 use App\Services\RejectedBillService;
 use App\Services\ShopService;

+ 24 - 3
app/Http/Controllers/UserController.php

@@ -3,9 +3,13 @@
 namespace App\Http\Controllers;
 
 use App\Role;
+use App\Supplier;
 use App\User;
+use App\UserDetail;
 use App\UserWorkgroup;
+use Doctrine\DBAL\Configuration;
 use Exception;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
@@ -23,7 +27,8 @@ class UserController extends Controller
     public function index(Request $request)
     {
         if(!Gate::allows('用户-查询')){ return redirect(url('/'));  }
-        $query = User::with(['roles','logistics','userWorkgroups']);
+        $userDetailQuery = UserDetail::query()->select('user_id')->where('type','临时工');
+        $query = User::with(['roles','logistics','userWorkgroups','suppliers','userDetail'])->whereNotIn('id',$userDetailQuery);
         if($request->has('user')){
            $query->where('name','like',$request->input('user'));
         }
@@ -51,7 +56,8 @@ class UserController extends Controller
         $roles=Role::all();
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
         $userWorkgroups=UserWorkgroup::query()->get();
-        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups]);
+        $suppliers=Supplier::query()->get();
+        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups,'suppliers'=>$suppliers]);
     }
 
 
@@ -78,13 +84,16 @@ class UserController extends Controller
     public function edit(User $user)
     {
         if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
+        $user=$user->loadMissing('userDetail');
         $rolesAll=Role::all();
         $roles=$user->roles()->get();
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
         $logisticUser=$user->logistics()->get();
         $userWorkgroups=UserWorkgroup::query()->get();
         $userWorkgroup=$user->userWorkgroups()->first();
-        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup'));
+        $supplierUser=$user->suppliers()->get();
+        $suppliers=Supplier::query()->get();
+        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup','suppliers','supplierUser'));
     }
 
     /**
@@ -96,6 +105,7 @@ class UserController extends Controller
      */
     public function update(Request $request, User $user)
     {
+
         if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
         $this->validatorUpdate($request->all())->validate();
         $user->fill($request->all());
@@ -107,6 +117,13 @@ class UserController extends Controller
         }else{
             $user->roles()->sync([]);
         }
+        $supplierIds=$request->input('supplier')??'';
+        if($supplierIds){
+            $supplierIdArr=explode(',',$supplierIds);
+            $user->suppliers()->sync($supplierIdArr);
+        }else{
+            $user->suppliers()->sync([]);
+        }
         $carrierIds=$request->input('logistic')??'';
         if($carrierIds){
             $carrierIds=explode(',',$carrierIds);
@@ -120,6 +137,10 @@ class UserController extends Controller
         }else{
             $user->userWorkgroups()->sync([]);
         }
+        $phone=$request->input('phone');
+        $user=$user->loadMissing('userDetail');
+        if ($phone && $user->userDetail->mobile_phone && $phone!=$user->userDetail->mobile_phone)UserDetail::query()->where('user_id',$user->id)
+            ->update(['mobile_phone'=>$phone]);
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/user/')->with('successTip',"成功修改用户“{$user['name']}”!");
     }

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

@@ -1,61 +0,0 @@
-<?php
-
-namespace App\Http\Controllers\api\procurement\wechat;
-
-use App\User;
-use Firebase\JWT\JWT;
-use App\Http\Controllers\Controller;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Support\Facades\Hash;
-
-class AuthController extends Controller
-{
-
-    public function login()
-    {
-        $phone=request('phone');
-        $password = request("password");
-        $user=User::query()->with('roles')
-            ->whereHas('userDetail',function ($query)use($phone){
-            /** @var Builder $query */
-            $query->where('mobile_phone',$phone);
-        })->whereHas('roles',function ($builder){
-                /** @var Builder $builder */
-            $builder->whereIn('name',['供应商','收货员']);
-            })
-            ->first();
-        if (!$user)return response()->json(['status'=>0,'message' => '当前用户不存在!'], 401);
-        if (!Hash::check($password,$user->password)) return response()->json(['status'=>0,'message' => '很抱歉,您的手机号和密码不匹配'], 401);
-
-        $credentials = [
-            'id'=>$user->id,
-            'name'=>$user->name,
-        ];
-        $token = $this->getJWTToken($credentials);
-        $userType=0;
-        foreach ($user->roles as $role){
-            if ($role->name=='供应商')$userType=1;
-            if ($role->name=='收货员')$userType=2;
-        }
-        return response()->json(['status'=>1,'message' => $userType,'data'=>$token], 200);
-    }
-
-    public function getJWTToken($value)
-    {
-        $time = time();
-        $payload = [
-            'iat' => $time,
-            'nbf' => $time,
-            'exp' => $time+7200,
-            'data' => [
-                'id' => $value['id'],
-                'name' => $value['name']
-            ]
-        ];
-        $key =  env('JWT_SECRET');
-        $alg = 'HS256';
-        $token = JWT::encode($payload,$key,$alg);
-        return $token;
-    }
-
-}

+ 86 - 0
app/Http/Controllers/api/thirdPart/weixin/AuthController.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace App\Http\Controllers\api\thirdPart\weixin;
+
+use App\Components\ApiProcurementResponse;
+use App\User;
+use App\UserDetail;
+use Firebase\JWT\JWT;
+use App\Http\Controllers\Controller;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Http;
+
+class AuthController extends Controller
+{
+    use ApiProcurementResponse;
+
+    public function login(): \Illuminate\Http\JsonResponse
+    {
+        $phone=request('phone');
+        $password = request("password");
+        $user=User::query()->with('roles')
+            ->whereHas('userDetail',function ($query)use($phone){
+            /** @var Builder $query */
+            $query->where('mobile_phone',$phone);
+        })->whereHas('roles',function ($builder){
+                /** @var Builder $builder */
+            $builder->whereIn('name',['供应商','收货员']);
+            })
+            ->first();
+        if (!$user)return $this->error('当前用户不存在');
+        if (!Hash::check($password,$user->password))return $this->error('很抱歉,您的手机号和密码不匹配');
+
+        $credentials = [
+            'id'=>$user->id,
+            'name'=>$user->name,
+        ];
+        $token = $this->getJWTToken($credentials);
+        $userType=0;
+        foreach ($user->roles as $role){
+            if ($role->name=='供应商')$userType=1;
+            if ($role->name=='收货员')$userType=2;
+        }
+        return $this->success($token,$userType);
+    }
+
+    public function getJWTToken($value): string
+    {
+        $time = time();
+        $payload = [
+            'iat' => $time,
+            'nbf' => $time,
+            'exp' => $time+7200,
+            'data' => [
+                'id' => $value['id'],
+                'name' => $value['name']
+            ]
+        ];
+        $key =  env('JWT_SECRET');
+        $alg = 'HS256';
+        $token = JWT::encode($payload,$key,$alg);
+        return $token;
+    }
+
+    public function banding(Request $request): \Illuminate\Http\JsonResponse
+    {
+        if (!$request->input('code'))return $this->error('code 不能为空!');
+        $requests= [
+            'appid'=>config('weiXin.xiaoChengXu.appId'), //小程序appid
+            'secret'=>config('weiXin.xiaoChengXu.appSecret'), //小程序appsecret
+            'js_code'=>$request->input('code'),
+            'grant_type'=>'authorization_code',
+        ];
+        $url='https://api.weixin.qq.com/sns/jscode2session?';
+        $get=Http::get($url,$requests);
+        $resp=$get->json();
+        if (!$resp['openid']) return $this->error('授权失败,无法获取openid');
+        UserDetail::query()
+            ->where('user_id',Auth::user()['id'])
+            ->update(['procurement_wechat_open_id'=>$resp['openid'],]);
+        return $this->success($resp['openid'],'获取openID成功');
+    }
+
+}

+ 22 - 16
app/Http/Controllers/api/procurement/wechat/ProcurementController.php → app/Http/Controllers/api/thirdPart/weixin/ProcurementController.php

@@ -1,7 +1,8 @@
 <?php
 
-namespace App\Http\Controllers\api\procurement\wechat;
+namespace App\Http\Controllers\api\thirdPart\weixin;
 
+use App\Components\ApiProcurementResponse;
 use App\Http\Controllers\Controller;
 use App\Procurement;
 use App\ProcurementCheckSheet;
@@ -16,6 +17,7 @@ use Illuminate\Support\Facades\Auth;
 
 class ProcurementController extends Controller
 {
+    use ApiProcurementResponse;
 
     public function getWaitQuotation(Request $request): \Illuminate\Http\JsonResponse
     {
@@ -26,14 +28,18 @@ class ProcurementController extends Controller
             ->where('status',$status)
             ->get();
         $keys = [];
+        $now=Carbon::now();
         foreach ($procurements as $key=>$procurement){
             if ($procurement->procurement_quotations_count>0 && $status==0 )$keys[]= $key;
             if ($procurement->type==2 && $procurement->supplier_id )$keys[]= $key;
-            if($status==0)$procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now()); //待报价倒计时4小时
+            if($status==0){
+                if ($procurement->deadline>$now) $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(); //待报价倒计时4小时
+                else $procurement->deadline=0;
+            }
             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);
+        if (!empty($procurements)) return $this->success($procurements);
     }
 
     public function getQuotationDetailById(Request $request): \Illuminate\Http\JsonResponse
@@ -43,7 +49,7 @@ class ProcurementController extends Controller
             ->with(['ownerMaterial.material','ownerMaterial.owner','ownerMaterial.file'])
             ->find($id);
         $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now());
-        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+        if ($procurement) return $this->success($procurement);
     }
     //报价
     public function setOffer(Request $request): \Illuminate\Http\JsonResponse
@@ -64,7 +70,7 @@ class ProcurementController extends Controller
             'status'=>1,//2:已报价
         ]);
         $procurement->update(['status'=>1]);//1:已报价
-        if ($procurementQuotation) return response()->json(['status'=>1,'data'=>$procurementQuotation], 200);
+        if ($procurementQuotation) return $this->success($procurementQuotation);
     }
     //接单
     public function accept(Request $request): \Illuminate\Http\JsonResponse
@@ -81,7 +87,7 @@ class ProcurementController extends Controller
         }else{
             $procurement->update(['status'=>4,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中
         }
-        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+        if ($procurement) return $this->success($procurement);
     }
     //生产中的订单
     public function getProductionProcurement(): \Illuminate\Http\JsonResponse
@@ -91,14 +97,14 @@ class ProcurementController extends Controller
             ->whereIn('type',[0,2])
             ->where('status',4) //4:生产中
             ->get();
-        if ($procurements) return response()->json(['status'=>1,'data'=>$procurements], 200);
+        if ($procurements) return $this->success($procurements);
     }
     //结束生产
     public function finishProductionProcurement(Request $request): \Illuminate\Http\JsonResponse
     {
         $id=$request->input('id');
         $procurement=Procurement::query()->find($id)->update(['status'=>5]);
-        if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
+        if ($procurement) return $this->success($procurement);
     }
 
     public function getProcurementDeliveries(): \Illuminate\Http\JsonResponse
@@ -107,7 +113,7 @@ class ProcurementController extends Controller
             ->with('procurement.ownerMaterial.material')
             ->whereIn('status',[0,1])//1:待送货,2:送货中
             ->get();
-        if ($procurementDeliveries) return response()->json(['status'=>1,'data'=>$procurementDeliveries], 200);
+        if ($procurementDeliveries) return $this->success($procurementDeliveries);
     }
     public function makeProcurementDelivery(Request $request): \Illuminate\Http\JsonResponse
     {
@@ -138,20 +144,20 @@ class ProcurementController extends Controller
         $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);
+        if ($procurementDelivery) return $this->success($procurementDelivery);
     }
     public function getProcurementDeliveryById(Request $request): \Illuminate\Http\JsonResponse
     {
         $procurementDelivery=ProcurementDeliverie::query()
             ->with(['procurement.ownerMaterial.material','receiver.userDetail','procurement.ownerMaterial.owner.customer','procurement.supplier','procurement.ownerMaterial.file'])
             ->find($request->input('id'));
-        if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
+        if ($procurementDelivery) return $this->success($procurementDelivery);
     }
     public function updateProcurementDeliveryAmount(Request $request): \Illuminate\Http\JsonResponse
     {
         $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);
+        if ($procurementDelivery)return $this->success($procurementDelivery);
     }
 
     public function getProcurementTotalBill(): \Illuminate\Http\JsonResponse
@@ -162,13 +168,13 @@ class ProcurementController extends Controller
             /** @var  ProcurementTotalBill $procurementTotalBill */
             $procurementTotalBill->setCurrentMothProcurements();
         }
-        if ($procurementTotalBills) return response()->json(['status'=>1,'data'=>$procurementTotalBills], 200);
+        if ($procurementTotalBills) return $this->success($procurementTotalBills);
     }
     public function markProcurementTotalBillStatus(Request $request): \Illuminate\Http\JsonResponse//供应商提交对账单
     {
         $id=$request->input('id');
         $procurementTotalBill=ProcurementTotalBill::query()->find($id)->update(['status'=>1]);//1:已出账
-        return response()->json(['status'=>1,'data'=>$procurementTotalBill], 200);
+        return $this->success($procurementTotalBill);
     }
     //收货员确认收货
     public function makeReceipt(Request $request): \Illuminate\Http\JsonResponse
@@ -177,7 +183,7 @@ class ProcurementController extends Controller
         $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);
+        if ($procurementDelivery) return $this->success($procurementDelivery);
     }
     public function supplierDeliverConfirm(Request $request): \Illuminate\Http\JsonResponse
     {
@@ -190,6 +196,6 @@ class ProcurementController extends Controller
             && $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);
+        if ($procurementDelivery) return $this->success($procurementDelivery);
     }
 }

+ 78 - 0
app/Jobs/ProcurementCheckConfirmInform.php

@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Services\ProcurementWeiXinSendMessageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Collection;
+
+class ProcurementCheckConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurementTotalBills;
+    /**
+     * Create a new job instance.
+     *
+     * @param Collection $procurementTotalBills
+     */
+    public function __construct(Collection $procurementTotalBills)
+    {
+        $this->procurementTotalBills=$procurementTotalBills;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        if (empty($this->procurementTotalBills)) return;
+        foreach ($this->procurementTotalBills as $procurementTotalBill){
+            foreach ($procurementTotalBill->supplier as $supplier) {
+                foreach ($supplier->user as $user){
+                   if($user->userDetail->procurement_wechat_open_id){
+                       $param['touser'] =$user->userDetail->procurement_wechat_open_id;
+                       $param['mp_template_msg'] =[
+                           "appid"=>config('weiXin.fuWuHao.appId'),
+                           "template_id"=>config('weiXin.fuWuHaoTemplate.check_sheet_inform'),
+                           "url"=>"http://weixin.qq.com/download",
+                           "miniprogram"=>[
+                               "appid"=>config('weiXin.appId.appId'),
+                               "pagepath"=>"pages/login/login"
+                           ],
+                           'data'=>[
+                               'first' => [
+                                   "value"=>"您好,您的对账单已生成。",
+                               ],
+                               'keyword1' => [
+                                   "value"=>$procurementTotalBill->created_at ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'keyword2' => [
+                                   "value"=>$procurementTotalBill->procurement_count ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'keyword3' => [
+                                   "value"=>$procurementTotalBill->total_payable ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'remark' => [
+                                   "value"=>'点击查看详情。',
+                               ],
+                           ]
+                       ];
+                       app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+                   }
+                }
+            }
+
+        }
+
+    }
+}

+ 81 - 0
app/Jobs/ProcurementConfirmInform.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use App\Services\ProcurementWeiXinSendMessageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcurementConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $pro=$this->procurement->loadMissing(['ownerMaterial.material.supplier.user.userDetail','ownerMaterial.owner.customer']);
+        if (empty($pro->ownerMaterial->material->supplier))return;
+        $suppliers=$pro->ownerMaterial->material->supplier;
+        $open_ids=[];
+        foreach ($suppliers as $supplier) {
+            foreach ($supplier->user as $user){
+                $open_id = $user->userDetail->procurement_wechat_open_id ?? false;
+                if($open_id)$open_ids[]=$open_id;
+            }
+        }
+        $open_ids=array_unique($open_ids);
+        foreach ($open_ids as $open_id){
+            $param['touser'] =$open_id;
+            $param['mp_template_msg'] =[
+                "appid"=>config('weiXin.fuWuHao.appId'),
+                "template_id"=>config('weiXin.fuWuHaoTemplate.order_confirm_inform'),
+                "url"=>"http://weixin.qq.com/download",
+                "miniprogram"=>[
+                    "appid"=>config('weiXin.appId.appId'),
+                    "pagepath"=>"pages/login/login"
+                ],
+                'data'=>[
+                    'first' => [
+                        "value"=>"尊敬的供应商,你好!",
+                    ],
+                    'keyword1' => [
+                        "value"=>$pro->code ?? '',
+                        "color"=>"#173177"
+                    ],
+                    'keyword2' => [
+                        "value"=>$pro->ownerMaterial->owner->customer->company_name ?? '',
+                        "color"=>"#173177"
+                    ],
+                    'remark' => [
+                        "value"=>'请及时确认,谢谢。',
+                    ],
+                ]
+            ];
+            app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+        }
+
+    }
+
+
+
+}

+ 68 - 0
app/Jobs/ProcurementEnquiry.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Configuration;
+use App\Procurement;
+use App\Services\ConfigurationService;
+use App\Services\LogService;
+use App\Services\ProcurementService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Cache;
+
+class ProcurementEnquiry implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+    private $unit_price;
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        /** @var ProcurementService $procurementService*/
+        /**@var ConfigurationService $configurationService */
+        $configurationService=app(ConfigurationService::class);
+        $receive_time=$configurationService->getReceiveTime();
+        $priceCoefficient=$configurationService->getPriceCoefficient();
+        $procurementService=app(ProcurementService::class);
+        $procurementQuotation=$procurementService->screenLowestQuotation($this->procurement->id);
+        if (!$procurementQuotation){
+            $this->procurement->update(['status'=>3]);
+            return;
+        }
+        if(!$this->procurement->unit_price)$this->unit_price=$priceCoefficient*$procurementQuotation['offer'];
+        try{
+           $this->procurement->update([
+               'status'=>2,
+               'unit_price'=>$this->unit_price,
+               'cost_price'=>$procurementQuotation['offer'],
+               'supplier_id'=>$procurementQuotation['supplier_id'],
+               'deadline'=>Carbon::parse(Carbon::now()->toDateTimeString())->subHours(-$receive_time)->toDateTimeString(),
+           ]);
+            dispatch(new ProcurementReceive($this->procurement))->delay(now()->addHours($receive_time)); //可从系统配置获取
+            dispatch(new ProcurementWaitConfirmInform($this->procurement));
+
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-采购延时选定最低报价供应商",$this->procurement->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 37 - 0
app/Jobs/ProcurementReceive.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcurementReceive implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    protected $procurement;
+
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $procurement=Procurement::query()->find($this->procurement->id);
+        if ($procurement->status==2) $procurement->update(['status'=>3]);
+    }
+}

+ 82 - 0
app/Jobs/ProcurementWaitConfirmInform.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use App\Services\ProcurementWeiXinSendMessageService;
+use App\User;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+
+class ProcurementWaitConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $pro=$this->procurement->loadMissing(['supplier.user.userDetail']);
+        $initiator='';
+        if ($pro->initiator)$initiator=User::query()->where('id',$pro->initiator)->value('name');
+            foreach ($pro->supplier->user as $user){
+               if ($user->userDetail->procurement_wechat_open_id){
+                   $param['touser'] =$user->userDetail->procurement_wechat_open_id;
+                   $param['mp_template_msg'] =[
+                       "appid"=>config('weiXin.fuWuHao.appId'),
+                       "template_id"=>config('weiXin.fuWuHaoTemplate.wait_procurement_inform'),
+                       "url"=>"http://weixin.qq.com/download",
+                       "miniprogram"=>[
+                           "appid"=>config('weiXin.appId.appId'),
+                           "pagepath"=>"pages/login/login"
+                       ],
+                       'data'=>[
+                           'first' => [
+                               "value"=>"采购申请等待处理。",
+                           ],
+                           'keyword1' => [
+                               "value"=>$pro->code ?? '',
+                               "color"=>"#173177"
+                           ],
+                           'keyword2' => [
+                               "value"=> $initiator,
+                               "color"=>"#173177"
+                           ],
+                           'keyword3' => [
+                               "value"=>$pro->cost_price*$pro->quantity>0 ? $pro->cost_price*$pro->quantity.'元' :0 .'元',
+                               "color"=>"#173177"
+                           ],
+                           'keyword4' => [
+                               "value"=>Carbon::now()->toDateString(),
+                               "color"=>"#173177"
+                           ],
+                           'remark' => [
+                               "value"=>'请及时确认,谢谢。',
+                               "color"=>"#173177"
+                           ],
+                       ]
+                   ];
+                   app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+               }
+            }
+
+    }
+}

+ 8 - 6
app/Procurement.php

@@ -55,23 +55,25 @@ class Procurement extends Model
         }
     }
 
-    public  function ownerMaterial(){
+    public  function ownerMaterial(): \Illuminate\Database\Eloquent\Relations\HasOne
+    {
         return $this->hasOne('App\OwnerMaterial','id','owner_material_id');
     }
 
-    public  function supplier(){
+    public  function supplier(): \Illuminate\Database\Eloquent\Relations\HasOne
+    {
         return $this->hasOne('App\Supplier','id','supplier_id');
     }
 
-    public function initiator()
+    public function initiator(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(User::class,'initiator','id');
     }
-    public function procurementDeliveries()
+    public function procurementDeliveries(): \Illuminate\Database\Eloquent\Relations\HasMany
     {
-        return $this->hasMany('App\ProcurementDeliverie','procurement_id','id');
+        return $this->hasMany('App\ProcurementDeliverie','procurement_id','id')->orderByDesc('id');
     }
-    public function procurementQuotations()
+    public function procurementQuotations(): \Illuminate\Database\Eloquent\Relations\HasMany
     {
         return $this->hasMany('App\ProcurementQuotation','procurement_id','id');
     }

+ 7 - 1
app/ProcurementTotalBill.php

@@ -24,9 +24,15 @@ class ProcurementTotalBill extends Model
     protected $fillable=[
         'counting_month','supplier_id','status','total_payable'
     ];
-    public function supplier(){
+    public function supplier(): \Illuminate\Database\Eloquent\Relations\BelongsTo
+    {
         return $this->belongsTo('App\Supplier','supplier_id','id');
     }
+    public function procurement()
+    {
+        return $this->hasMany('App\Procurement','supplier_id','supplier_id')
+            ->whereNotIn('status',[3,10]);
+    }
 
     //截取账单日期为月
     public function getCountingMonthAttribute($value)

+ 4 - 0
app/Providers/AppServiceProvider.php

@@ -10,6 +10,7 @@ use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
 use App\Services\CommodityBarcodeService;
 use App\Services\common\DataHandlerService;
+use App\Services\ConfigurationService;
 use App\Services\CustomerLogService;
 use App\Services\CustomerLogStatusService;
 use App\Services\CustomerService;
@@ -62,6 +63,7 @@ use App\Services\ProcessService;
 use App\Services\ProcessStatisticService;
 use App\Services\ProcurementService;
 use App\Services\ProcurementTotalBillService;
+use App\Services\ProcurementWeiXinSendMessageService;
 use App\Services\ProvinceService;
 use App\Services\RealtimePendingOrdersService;
 use App\Services\RejectedBillItemService;
@@ -158,6 +160,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('CustomerLogStatusService',CustomerLogStatusService::class);
         app()->singleton('CustomerLogStatusService',CustomerLogStatusService::class);
         app()->singleton('CustomerService',CustomerService::class);
+        app()->singleton('ConfigurationService',ConfigurationService::class);
         app()->singleton('DataHandlerService',DataHandlerService::class);
         app()->singleton('DeliveryAppointment',DeliveryAppointment::class);
         app()->singleton('DeliveryAppointmentService',DeliveryAppointmentService::class);
@@ -211,6 +214,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('ProvinceService',ProvinceService::class);
         app()->singleton('ProcurementService',ProcurementService::class);
         app()->singleton('ProcurementTotalBillService',ProcurementTotalBillService::class);
+        app()->singleton('ProcurementWeiXinSendMessageService',ProcurementWeiXinSendMessageService::class);
         app()->singleton('RealtimePendingOrdersService',RealtimePendingOrdersService::class);
         app()->singleton('RegionService',RegionService::class);
         app()->singleton('RejectedBillItemService',RejectedBillItemService::class);

+ 37 - 0
app/Services/ConfigurationService.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Services;
+
+use App\CarType;
+use App\Configuration;
+use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\Cache;
+
+
+class ConfigurationService
+{
+    use ServiceAppAop;
+    protected $modelClass=Configuration::class;
+
+    public function getEnquiryTime()
+    {
+        return Cache::remember('询价延时时间',null,function (){
+            return Configuration::query()->where('name','询价延时时间')->value('value');
+        });
+    }
+
+    public function getReceiveTime()
+    {
+        return Cache::remember('接单延时时间',null,function (){
+            return Configuration::query()->where('name','接单延时时间')->value('value');
+        });
+    }
+    public function getPriceCoefficient()
+    {
+        return Cache::remember('价格系数',null,function (){
+            return Configuration::query()->where('name','价格系数')->value('value');
+        });
+    }
+
+
+}

+ 2 - 2
app/Services/PackageService.php

@@ -39,8 +39,8 @@ class PackageService
             'batch_number' => ['like' => ''],
             'created_at_start' => ['alias' => 'created_at','startDate' => " 00:00:00"],
             'created_at_end' => ['alias' => 'created_at','endDate' => " 23:59:59"],
-            'weighed_at_start' => ['alias' => 'weighed_at','startDate' => " 00:00:00"],
-            'weighed_at_end' => ['alias' => 'weighed_at','endDate' => " 23:59:59"],
+            'weighed_at_start' => ['alias' => 'weighed_at', 'startDate' => ':00'],
+            'weighed_at_end' => ['alias' => 'weighed_at','endDate' => ":59"],
             'id' => ['multi' => ','],
         ];
         $packages = app(QueryService::class)->query($params,$packages,$columnQueryRules,"order_packages");

+ 8 - 19
app/Services/ProcurementService.php

@@ -20,34 +20,23 @@ class ProcurementService
     //选中最低报价
     public function screenLowestQuotation($procurement_id){
         if (!$procurement_id) return null;
-        $procurementQuotation=ProcurementQuotation::query()
+        return ProcurementQuotation::query()
             ->with(['supplier','procurement'])
             ->select('procurement_id','supplier_id','offer')
             ->orderBy('offer','asc')
             ->where('procurement_id',$procurement_id)
             ->first();
-        return $procurementQuotation;
     }
 
-    public function pushEnquiryToSupplier($procurement_id){
-        $procurement=Procurement::query()->find($procurement_id);
-        $procurement->loadMissing(['ownerMaterial.material.supplier']);
-        if (!empty($procurement->ownerMaterial->material->supplier))$suppliers=$procurement->ownerMaterial->material->supplier;
-        foreach ($suppliers as $supplier){
-            $procurementQuotation= new ProcurementQuotation([
-                'procurement_id'=>$procurement_id,
-                'supplier_id'=>$supplier->id,
-            ]);
-            $procurementQuotation->save();
-            //TODO 推送给指定耗材类型供应商
-        }
-    }
-    public function computeDeadline($time)
+    public function computeDeadline($time): string
     {
+        /**@var ConfigurationService $configurationService */
+        $configurationService=app(ConfigurationService::class);
+        $enquiry_time=$configurationService->getEnquiryTime();
         $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 ($time<$date." 09:00:00")$deadline=Carbon::parse($date." 09:00:00")->subHours(-$enquiry_time);
+        if($time>=$date." 09:00:00" && $time<$date." 14:00:00") $deadline=Carbon::parse($time)->subHours(-$enquiry_time);
+        if ($time>=$date." 14:00:00")$deadline=Carbon::parse($time)->subHours(-15-$enquiry_time);
         if ($deadline) return $deadline;
     }
     public function screenSupplier($user,$material)

+ 67 - 0
app/Services/ProcurementWeiXinSendMessageService.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace App\Services;
+
+
+use App\Components\AsyncResponse;
+
+class ProcurementWeiXinSendMessageService
+{
+    use AsyncResponse;
+    //获取access_token
+    public  function get_access_token($appId = '', $appSecret = ''){
+        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret";
+        $result = file_get_contents($url);
+        $result = json_decode($result,true);
+        if (array_key_exists("access_token", $result)) return $result['access_token'];
+        return null;
+    }
+    //发送微信模版消息通知
+    public function sendWenChantTemplate($param)
+    {
+        try {
+            $params['touser'] = $param['touser'];
+            $params['mp_template_msg'] = $param['mp_template_msg'];
+            $res = $this -> send_message($params);
+        } catch (\Exception $e) {
+            $this->error('发送模板消息失败!');
+        }
+        $this->success('发送模板消息成功!');
+    }
+
+    /**
+     * @desc 发送微信消息
+     * param     string
+     * $type
+     * $param['title'] 消息标题
+     * $param['reason'] 消息内容或者消息原因
+     */
+    public function send_message($param)
+    {
+
+        $appId=config('weiXin.xiaoChengXu.appId');
+        $appSecret=config('weiXin.xiaoChengXu.appSecret');
+        $data = [
+            "touser" => $param['touser'],
+            "mp_template_msg" => $param['mp_template_msg'],
+        ];
+        $json = json_encode($data, JSON_UNESCAPED_UNICODE);
+        $access_token = self::get_access_token($appId, $appSecret);
+        $url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=" . $access_token;
+
+        //以'json'格式发送post的https请求
+        $curl = curl_init();
+        curl_setopt($curl, CURLOPT_URL, $url);
+        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
+        if (!empty($json)) {
+            curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
+        }
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        $output = curl_exec($curl);
+        curl_close($curl);
+        return $output;
+    }
+
+}

+ 3 - 0
app/User.php

@@ -92,6 +92,9 @@ class User extends Authenticatable
     function userWorkgroups(){
         return $this->belongsToMany('App\UserWorkgroup','user_workgroup_user','user_id','user_workgroup_id');
     }
+    function suppliers(){
+        return $this->belongsToMany('App\Supplier','supplier_user','user_id','supplier_id');
+    }
 
     function authorities(){
         $authorities = new Collection([]);

+ 1 - 1
app/UserDetail.php

@@ -17,7 +17,7 @@ class UserDetail extends Model
     public $incrementing=false;
 
     protected $fillable=[
-        'user_id','full_name','gender','identity_number','mobile_phone','type'
+        'user_id','full_name','gender','identity_number','mobile_phone','type','procurement_wechat_open_id'
     ];
     protected $appends=[
         'user_labor_company'

+ 16 - 0
config/weiXin.php

@@ -0,0 +1,16 @@
+<?php
+
+return [
+    "xiaoChengXu" => [
+        "appId" => "wxe1fbb56a49af3618",
+        "appSecret" => "ed27727f5152b094581a6bd6826907e5",
+    ],
+    "fuWuHao" => [
+        "appId" => "wxbe276d9de7304ef3",
+    ],
+    "fuWuHaoTemplate" => [
+        "check_sheet_inform" => "YAa5LNgLHtGUQeU0742sDQ0CT6hSsbyQ_qa0ZWKQEd0",
+        "order_confirm_inform" => "fL5KbX45ETWEtY6sJ77F9xF7u0u4fJqCSIXLBLxe_B8",
+        "wait_procurement_inform" => "k6QhyPbjKTPuJoQ7JxBqf-VVTWubgdmdDIA1uXqLZuE",
+    ],
+];

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOpenidColumnToUserDetails extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_details', function (Blueprint $table) {
+            $table->string('procurement_wechat_open_id')->nullable()->comment('采购小程序绑定用户openid');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('user_details', function (Blueprint $table) {
+            $table->dropColumn('procurement_wechat_open_id');
+        });
+    }
+}

+ 39 - 0
database/migrations/2021_03_23_140544_add_configurations_data.php

@@ -0,0 +1,39 @@
+<?php
+
+use App\Configuration;
+use Illuminate\Database\Migrations\Migration;
+
+use Illuminate\Support\Facades\Auth;
+
+class AddConfigurationsData extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        $time=\Illuminate\Support\Carbon::now()->toDateTimeString();
+        $configurations = [];
+        $conf_one=['name'=>'价格系数','description'=>'采购管理价格系数','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $conf_two=['name'=>'询价延时时间','description'=>'报价需在询价发起延时时间之内有效','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $conf_three=['name'=>'接单延时时间','description'=>'接单需在询价发起延时时间之内有效','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $configurations[]=$conf_one;
+        $configurations[]=$conf_two;
+        $configurations[]=$conf_three;
+        Configuration::query()->insert($configurations);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Configuration::query()->where('name','价格系数')->delete();
+        Configuration::query()->where('name','询价延时时间')->delete();
+        Configuration::query()->where('name','接单延时时间')->delete();
+    }
+}

+ 11 - 1
database/seeds/ConfigurationSeeder.php

@@ -1,7 +1,10 @@
 <?php
 
+use Carbon\Carbon;
 use Illuminate\Database\Seeder;
 use App\Configuration;
+use Illuminate\Support\Facades\Auth;
+
 class ConfigurationSeeder extends Seeder
 {
     /**
@@ -11,7 +14,14 @@ class ConfigurationSeeder extends Seeder
      */
     public function run()
     {
-        $configurations = factory(Configuration::class)->times(100)->make()->toArray();
+        $time=Carbon::now()->toDateTimeString();
+        $configurations = [];
+        $conf_one=['name'=>'价格系数','description'=>'采购管理价格系数','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $conf_two=['name'=>'询价延时时间','description'=>'报价需在询价发起延时时间之内有效','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $conf_three=['name'=>'接单延时时间','description'=>'接单需在询价发起延时时间之内有效','operator'=>Auth::user()['id'],'created_at'=>$time,'updated_at'=>$time];
+        $configurations[]=$conf_one;
+        $configurations[]=$conf_two;
+        $configurations[]=$conf_three;
         Configuration::query()->insert($configurations);
     }
 }

BIN
public/images/QRCodeIMG/1.png


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

@@ -59,7 +59,7 @@
                     站管理</a></li> @endcan
         @can('采购管理')
                 <li class="nav-item"><a href="{{url("procurement/procurement/index")}}" class="nav-link"
-                                        :class="{active:isActive('station',1)}">
+                                        :class="{active:isActive('procurement',1)}">
                         <span class="fa fa-cart-plus" style="color: #1b4b72"></span>
                         采购管理</a></li>@endcan
         @can('基础设置')

+ 1 - 1
resources/views/maintenance/configuration/_edit.blade.php

@@ -12,7 +12,7 @@
                     <div class="form-group row">
                         <label for="add-name" class="col-sm-2 col-form-label text-right">名称</label>
                         <div class="col-sm-10 form-inline">
-                            <input type="text" name="name" id="add-name" class="form-control col-sm-10" placeholder="输入配置名称" v-model="editConfiguration.name">
+                            <input type="text" name="name" id="add-name" class="form-control col-sm-10" placeholder="输入配置名称" v-model="editConfiguration.name" readonly>
                         </div>
                     </div>
                     <div class="form-group row">

+ 140 - 0
resources/views/maintenance/user/create.blade.php

@@ -51,6 +51,22 @@
                                 </div>
                             </div>
 
+                            <div class="form-group row">
+                                <label for="phone" class="col-md-3 col-form-label text-md-right">手机号码</label>
+
+                                <div class="col-md-7">
+                                    <input id="phone" type="phone"
+                                           class="form-control @error('phone') is-invalid @enderror" name="phone"
+                                           value="{{ old('phone') }}" required autocomplete="phone">
+
+                                    @error('phone')
+                                    <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                                    @enderror
+                                </div>
+                            </div>
+
                             <div class="form-group row">
                                 <label for="password" class="col-md-3 col-form-label text-md-right">密码</label>
 
@@ -120,6 +136,7 @@
                                     </div>
                                 </div>
                             </div>
+
                             <div class="form-group row">
                                 <label for="logistic" class="col-md-3 col-form-label text-md-right">可见承运商</label>
                                 <div class="col-md-7">
@@ -156,6 +173,42 @@
                                 </div>
                             </div>
 
+                            <div class="form-group row">
+                                <label for="logistic" class="col-md-3 col-form-label text-md-right">可见供应商</label>
+                                <div class="col-md-7">
+                                    <input type="text" class="form-control tooltipTarget" placeholder="定位供应商"
+                                           @input="seekSupplier($event)" title="输入关键词快速定位"></div>
+                            </div>
+                            <div class="form-group row">
+                                <label class="col-md-3"></label>
+                                <div class="col-md-4">
+                                    <div class="input-group"
+                                         style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
+                                        <ul class="list-group tooltipTarget" style="width: 100%"
+                                            onselectstart="return false;">
+                                            <li :data-original-title="supplier.style ? '双击删除供应商' : '双击添加供应商'"
+                                                v-for="supplier in suppliersFilter" :id="supplier.name"
+                                                class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
+                                                @dblclick="selectedSupplier(supplier)"
+                                                :class="supplier.style ? 'active' :''"><span style="cursor: default;"> @{{ supplier.name }}  </span>
+                                            </li>
+                                        </ul>
+                                    </div>
+                                </div>
+                                <div class="col-md-3">
+                                    <input name="supplier" hidden v-model="supplier">
+                                    <div class="input-group"
+                                         style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
+                                        <ul class="list-group" style="width: 100%" onselectstart="return false;">
+                                            <li title="双击删除供应商" v-for="supplier in suppliersList"
+                                                class="list-group-item list-group-item-action pt-0 pb-0"
+                                                @dblclick="selectedSupplier(supplier)"><span style="cursor: default;"> @{{ supplier.name }}  </span>
+                                            </li>
+                                        </ul>
+                                    </div>
+                                </div>
+                            </div>
+
                             <input type="hidden" value="{{url('maintenance/user/create')}}">
                             <div class="form-group row mb-0">
                                 <div class="col-md-7 offset-md-4">
@@ -198,6 +251,7 @@
                 ],
                 roles: [{{old('role')}}],
                 rolesList: [],
+
                 logisticsAll: [
                         @foreach($logistics as $logistic)
                     {
@@ -214,6 +268,23 @@
                 ],
                 logistics: [{{old('logistic')}}],
                 logisticsList: [],
+
+                suppliersAll: [
+                        @foreach($suppliers as $supplier)
+                    {
+                        id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
+                    },
+                    @endforeach
+                ],
+                suppliersFilter: [
+                        @foreach($suppliers as $supplier)
+                    {
+                        id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
+                    },
+                    @endforeach
+                ],
+                supplier: [{{old('supplier')}}],
+                suppliersList: [],
             },
             mounted: function () {
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
@@ -293,6 +364,50 @@
                         $(".tooltipTarget").tooltip({'trigger': 'hover'});
                     }, 10)
                 },
+                selectedSupplier: function (e) {
+                    let supplier = this.supplier;
+                    let suppliersAll = this.suppliersAll;
+                    let suppliersList = this.suppliersList;
+                    let isSupplier = true;
+                    if (supplier && suppliersAll) {
+                        for (let i = 0; i < supplier.length; i++) {
+                            if (supplier[i] == e.id) {
+                                supplier.splice(i, 1);
+                                suppliersAll.every(function (suppliersAll) {
+                                    if (suppliersAll.id == e.id) {
+                                        suppliersAll.style = false;
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                suppliersList.every(function (supplier, i) {
+                                    if (supplier.id == e.id) {
+                                        suppliersList.splice(i, 1);
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                isSupplier = false;
+                                break;
+                            }
+                            isSupplier = true;
+                        }
+                    }
+                    if (isSupplier || !supplier) {
+                        supplier.push(e.id);
+                        suppliersAll.every(function (suppliersAll) {
+                            if (suppliersAll.id == e.id) {
+                                suppliersAll.style = true;
+                                suppliersList.push({'id': suppliersAll.id, 'name': suppliersAll.name});
+                                return false;
+                            }
+                            return true;
+                        });
+                    }
+                    setTimeout(function () {
+                        $(".tooltipTarget").tooltip({'trigger': 'hover'});
+                    }, 10)
+                },
                 seekLogistic: function (e) {
                     let $val = e.target.value;
                     let logisticsAll = this.logisticsAll;
@@ -318,6 +433,31 @@
                         }
                     }
                 },
+                seekSupplier: function (e) {
+                    let $val = e.target.value;
+                    let suppliersAll = this.suppliersAll;
+                    let bool = false;
+                    suppliersAll.every(function (supplierAll) {
+                        let name = supplierAll.name;
+                        if (name.includes($val)) {
+                            bool = true;
+                            return false;
+                        }
+                        return true;
+                    });
+                    if($val==='' && !bool){
+                        this.suppliersFilter = this.suppliersAll;
+                    }else if(bool){
+                        this.suppliersFilter= [];
+                        for (let i = 0; i < suppliersAll.length; i++) {
+                            let supplier = suppliersAll[i];
+                            let name = supplier.name;
+                            if(name.includes($val)){
+                                this.suppliersFilter.push(supplier);
+                            }
+                        }
+                    }
+                },
                 selectedRole: function (e) {
                     let roles = this.roles;
                     let rolesAll = this.rolesAll;

+ 151 - 2
resources/views/maintenance/user/edit.blade.php

@@ -44,6 +44,20 @@
                             @enderror
                         </div>
                     </div>
+
+                    <div class="form-group row">
+                        <label for="email" class="col-2 col-form-label text-right">手机号</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('phone') is-invalid @enderror"
+                                   name="phone" autocomplete="off" value="@if(old('phone')){{old('phone')}}@else{{$user->userDetail->mobile_phone}}@endif" required>
+                            @error('phone')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+
                     <div class="form-group row">
                         <label for="userWorkgroup" class="col-2 col-form-label text-right">工作组</label>
                         <div class="col-8">
@@ -107,6 +121,35 @@
                             </div>
                         </div>
                     </div>
+
+                    <hr class="col-8 offset-2 border-info">
+                    <div class="form-group row">
+                        <label for="supplier" class="col-md-3 col-form-label text-md-right">供应商</label>
+                        <div class="col-md-7">
+                            <input type="text"  class="form-control tooltipTarget" placeholder="定位供应商"
+                                   @input="seekSupplier($event)" title="输入关键词快速定位"></div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-md-3"></label>
+                        <div class="col-md-4">
+                            <input name="supplier" hidden    v-model="suppliers" >
+                            <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
+                                <ul class="list-group tooltipTarget" style="width: 100%" onselectstart="return false;">
+                                    <li  :data-original-title="supplier.style ? '双击删除供应商' :'双击添加供应商'"    v-for="supplier in suppliersFilter" :id="supplier.name" class="list-group-item list-group-item-action pt-0 pb-0"
+                                         @dblclick="selectedSupplier(supplier)" :class="supplier.style ? 'active' :''"><span style="cursor: default;" :id="supplier.name"> @{{ supplier.name }}  </span></li>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="col-md-3">
+                            <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;text-align: center;">
+                                <ul class="list-group" style="width: 100%" onselectstart="return false;">
+                                    <li  title="双击删除供应商"    v-for="supplier in suppliersList" :id="supplier.name" class="list-group-item list-group-item-action pt-0 pb-0"
+                                         @dblclick="selectedSupplier(supplier)" ><span style="cursor: default;" > @{{ supplier.name }}  </span></li>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+
                     <hr class="col-8 offset-2 border-info">
                     <div class="form-group row">
                         <div class="col-8 offset-2">
@@ -151,6 +194,7 @@
                     @endif
                 ],
                 rolesList:[],
+
                 logisticsAll:[
                     @foreach($logistics as $logistic)
                     {id:'{{$logistic->id}}',name:'{{$logistic->name}}',style:false},
@@ -171,6 +215,27 @@
                     @endforeach
                 ],
                 logisticsList:[],
+
+                suppliersAll: [
+                        @foreach($suppliers as $supplier)
+                    {id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false},
+                    @endforeach
+                ],
+                suppliersFilter: [
+                        @foreach($suppliers as $supplier)
+                    {id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false},
+                    @endforeach
+                ],
+                suppliers: [
+                    @if(old('supplier'))
+                    {{ old('supplier') }}
+                    @else
+                    @foreach( $supplierUser as $supplier )
+                    {{$supplier->id}},
+                    @endforeach
+                    @endif
+                ],
+                suppliersList: [],
             },
             mounted:function(){
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -204,6 +269,21 @@
                         });
                     }
                 }
+                if (this.suppliers.length>0){
+                    let suppliersAll=this.suppliersAll;
+                    let suppliers=this.suppliers;
+                    let suppliersList=this.suppliersList;
+                    for (let i = 0; i < suppliers.length; i++) {
+                        suppliersAll.every(function (supplierAll) {
+                            if (supplierAll.id == suppliers[i]) {
+                                supplierAll.style = true;
+                                suppliersList.push({'id':supplierAll.id,'name':supplierAll.name});
+                                return false;
+                            }
+                            return true;
+                        });
+                    }
+                }
             },
             methods:{
                 selectedLogistic:function (e) {
@@ -250,6 +330,50 @@
                         $(".tooltipTarget").tooltip({'trigger':'hover'});
                     },10)
                 },
+                selectedSupplier:function (e) {
+                    let suppliers=this.suppliers;
+                    let suppliersAll=this.suppliersAll;
+                    let suppliersList=this.suppliersList;
+                    let isSupplier=true;
+                    if (suppliers&&suppliersAll) {
+                        for (let i = 0; i < suppliers.length; i++) {
+                            if (suppliers[i] == e.id) {
+                                suppliers.splice(i,1);
+                                suppliersAll.every(function (supplierAll) {
+                                    if (supplierAll.id == e.id) {
+                                        supplierAll.style = false;
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                suppliersList.every(function (supplier,i) {
+                                    if (supplier.id==e.id){
+                                        suppliersList.splice(i,1);
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                isSupplier= false;
+                                break;
+                            }
+                            isSupplier= true;
+                        }
+                    }
+                    if (isSupplier || !suppliers){
+                        suppliers.push(e.id);
+                        suppliersAll.every(function (supplierAll) {
+                            if (supplierAll.id==e.id){
+                                supplierAll.style=true;
+                                suppliersList.push({'id':supplierAll.id,'name':supplierAll.name});
+                                return false;
+                            }
+                            return  true;
+                        });
+                    }
+                    setTimeout(function(){
+                        $(".tooltipTarget").tooltip({'trigger':'hover'});
+                    },10)
+                },
                 seekLogistic:function (e) {
                     let $val=e.target.value;
                     let logisticsAll=this.logisticsAll;
@@ -279,7 +403,7 @@
                     let rolesAll=this.rolesAll;
                     let rolesList=this.rolesList;
                     let isRole=true;
-                    if (roles&&rolesAll) {
+                    if (roles && rolesAll) {
                         for (let i = 0; i < roles.length; i++) {
                             if (roles[i] == e.id) {
                                 roles.splice(i,1);
@@ -304,7 +428,7 @@
                         }
                     }
                     if (isRole || !roles){
-                        roles.push(e.id);
+                        roles.push(Number(e.id));
                         rolesAll.every(function (roleAll) {
                             if (roleAll.id==e.id){
                                 roleAll.style=true;
@@ -313,6 +437,7 @@
                             }
                             return  true;
                         });
+                        console.log(roles)
                     }
                     setTimeout(function(){
                         $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -342,6 +467,30 @@
                         }
                     }
                 },
+                seekSupplier:function (e) {
+                    let $val=e.target.value;
+                    let suppliersAll=this.suppliersAll;
+                    let bool = false;
+                    suppliersAll.every(function (supplierAll) {
+                        let name=supplierAll.name;
+                        if (name.includes($val)){
+                            bool = true;
+                            return false;
+                        }
+                        return  true;
+                    });
+                    if($val === '' ){
+                        this.suppliersFilter = this.suppliersAll;
+                    }else if(bool){
+                        this.suppliersFilter = [];
+                        for (let i = 0; i <suppliersAll.length ; i++) {
+                            let supplier = suppliersAll[i];
+                            if(supplier.name.includes($val)){
+                                this.suppliersFilter.push(supplier);
+                            }
+                        }
+                    }
+                },
             },
         });
 

+ 6 - 0
resources/views/maintenance/user/index.blade.php

@@ -32,6 +32,11 @@
                                     <li v-for="logistic in user.logistics" style="list-style: none">@{{ logistic.name }}</li>
                                 </ul>
                             </td>
+                            <td>
+                                <ul v-if="user.suppliers.length>0" class="list-group">
+                                    <li v-for="supplier in user.suppliers" style="list-style: none">@{{ supplier.name }}</li>
+                                </ul>
+                            </td>
                             <td>@{{user.email}}</td>
                             <td class="text-muted">@{{user.created_at}}</td>
                             <td>
@@ -85,6 +90,7 @@
                     {name:'role_name',value: '角色', neglect: true},
                     {name:'workgroup_name',value: '工作组', neglect: true},
                     {name:'carrier_name',value: '配置承运商', neglect: true},
+                    {name:'supplier_name',value: '配置供应商', neglect: true},
                     {name:'email',value: '邮件地址'},
                     {name:'created_at',value: '创建时间'},
                     {name:'operation',value: '操作', neglect: true},

+ 2 - 2
resources/views/package/weigh/index.blade.php

@@ -102,14 +102,14 @@
                 let _this = this;
                 let data = [[
                     {name:'created_at_start',type:'dateTime',tip:'选择显示创建日期的起始时间'},
-                    {name:'weighed_at_start',type:'dateTime',tip:'选择显示称重日期的起始时间'},
+                    {name:'weighed_at_start',type:'time',tip:['选择显示称重日期的起始时间','选择显示称重日期的起始时间']},
                     {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'],
                         placeholder:['货主','定位或多选货主'],data:_this.owners},
                     {name:'logistic_number',type:'input',tip:'可支持多快递单号,糊模查找需要在左边打上%符号',placeholder:'快递单号'},
                     {name:'is_weighed',type:'checkbox',tip:'是否已称重', data: [{name: 'true', value: '是否已称重'}]}
                 ],[
                     {name:'created_at_end',type:'dateTime',tip:'选择显示创建日期的结束时间'},
-                    {name:'weighed_at_end',type:'dateTime',tip:'选择显示称重日期的结束时间'},
+                    {name:'weighed_at_end',type:'time',tip:['选择显示称重日期的结束时间','选择显示称重日期的结束时间']},
                     {name:'batch_number',type:'input',tip:'波次号:可在两侧增加百分号(%)进行模糊搜索',placeholder:'波次号'}
                 ]];
 

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

@@ -32,7 +32,7 @@
                 <td class="">@{{ procurement.code }}</td>
                 <td class="">@{{ procurement.created_at }}</td>
                 <td class=""><span v-if="procurement.supplier_id">@{{ procurement.deadline }}</span></td>
-                <td class=""></td>
+                <td class=""><span v-if="procurement.signed_at">@{{ procurement.signed_at }}</span></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 ><span v-if="procurement.supplier">@{{ procurement.supplier.name }}</span></td>
@@ -43,7 +43,7 @@
                 <td class="text-muted" v-if="procurement.owner_material">@{{ procurement.owner_material.specification }}</td>
                 <td>@{{ procurement.quantity }}</td>{{--采购数量--}}
                 <td>@{{ procurement.amount }}</td> {{--销售数量--}}
-                <td></td>
+                <td><span v-if="procurement.receive_amount">@{{ procurement.receive_amount }}</span></td>
                 <td>@{{ procurement.cost_price }}</td> {{--采购单价--}}
                 <td>@{{ procurement.unit_price }}</td>  {{--销售单价--}}
                 <td>@{{ procurement.amount*procurement.cost_price }}</td> {{--应收--}}
@@ -140,7 +140,7 @@
                     {name: 'specification', value: '材质规格', class: 'text-muted'},
                     {name: 'quantity', value: '采购数量', neglect: true},
                     {name: '', value: '销售数量', neglect: true},
-                    {name: '', value: '收货数量', neglect: true},
+                    {name: 'deliver_amount', value: '收货数量', neglect: true},
                     {name: '', value: '采购单价(元)', neglect: true},
                     {name: 'unit_price', value: '销售单价(元)', neglect: true},
                     {name: '', value: '应收金额(元)', neglect: true},

+ 4 - 4
resources/views/procurement/menuProcurement.blade.php

@@ -10,19 +10,19 @@
                     <ul class="nav nav-pills">
                     @can('耗材类型')
                         <li class="nav-item">
-                            <a target="maintenance/userWorkgroup" class="nav-link text-dark" href="{{url('maintenance/material')}}" :class="{active:isActive('material',2)}">耗材</a>
+                            <a target="maintenance/material" class="nav-link text-dark" href="{{url('maintenance/material')}}" :class="{active:isActive('material',2)}">耗材</a>
                         </li> @endcan
                     @can('项目耗材')
                         <li class="nav-item">
-                            <a target="maintenance/userLabor" class="nav-link text-dark" href="{{url('maintenance/ownerMaterial')}}" :class="{active:isActive('ownerMaterial',2)}">项目耗材</a>
+                            <a target="maintenance/ownerMaterial" class="nav-link text-dark" href="{{url('maintenance/ownerMaterial')}}" :class="{active:isActive('ownerMaterial',2)}">项目耗材</a>
                         </li> @endcan
                     @can('供应商')
                         <li class="nav-item">
-                            <a target="maintenance/laborCompany" class="nav-link text-dark" href="{{url('maintenance/supplier')}}" :class="{active:isActive('supplier',2)}">供应商</a>
+                            <a target="maintenance/supplier" class="nav-link text-dark" href="{{url('maintenance/supplier')}}" :class="{active:isActive('supplier',2)}">供应商</a>
                         </li> @endcan
                         @can('系统配置')
                         <li class="nav-item">
-                            <a target="maintenance/laborCompany" class="nav-link text-dark" href="{{url('maintenance/configuration')}}" :class="{active:isActive('configuration',2)}">系统配置</a>
+                            <a target="maintenance/configuration" class="nav-link text-dark" href="{{url('maintenance/configuration')}}" :class="{active:isActive('configuration',2)}">系统配置</a>
                         </li> @endcan
                 </ul>
             </div>

+ 6 - 6
resources/views/procurement/procurement/index.blade.php

@@ -100,7 +100,7 @@
                 </td>
                 <td>@{{ procurement.quantity }}</td>
                 <td><span>@{{ procurement.unit_price }}</span></td>
-                <td><span></span></td>
+                <td><span v-if="procurement.deliver_amount">@{{ procurement.deliver_amount }}</span></td>
                 <td><span>@{{ procurement.quantity*procurement.unit_price }}</span></td>
                 <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>
@@ -109,7 +109,7 @@
                         <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]=='询价单'
-                        || (procurement_type[procurement.type]=='采购单' && !procurement.cost_price)"
+                        /*|| (procurement_type[procurement.type]=='采购单'*/ && !procurement.cost_price"
                               @click="initiateProcurement(procurement)">发起采购</span>
                     </span>
                 </td>
@@ -161,7 +161,7 @@
                 procurement_status:{!! json_encode(\App\Procurement::status,JSON_UNESCAPED_UNICODE) !!},
                 checkData: [],
                 sum:{!! $procurements->total() !!},
-                owner_id: '{{old('owner_id')}}',
+                owner_id: '',
                 owner_material_id: '{{old('owner_material_id')}}',
                 material_name: '{{old('material_name')}}',
                 customer_name: '{{old('customer_name')}}',
@@ -175,7 +175,8 @@
                 procurement_id:'',supplier:'',offer:'',supplier_id:'',
                 ownerMaterials: [],
                 errors: {},
-                selectTr:''
+                selectTr:'',
+                createdProcurement:{},
             },
             mounted: function () {
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
@@ -340,14 +341,13 @@
                     };
                     window.axios.post(url, params).then(function (res) {
                         if (!res.data.success) {
-                            _this.errors = res.data.errors;
+                            _this.errors = res.data.errors
                         } else {
                             _this.procurements.push(res.data.data);
                             $("#add-procurement").modal('hide');
                             _this.clearData();
                             tempTip.setDuration(3000);
                             tempTip.showSuccess('新增采购单成功!');
-
                         }
                     }).catch(function (err) {
                         tempTip.setDuration(3000);

+ 16 - 17
routes/api.php

@@ -14,24 +14,23 @@ 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::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::any('banding', 'api\thirdPart\weixin\AuthController@banding');
+    Route::post('getWaitQuotation', 'api\thirdPart\weixin\ProcurementController@getWaitQuotation');
+    Route::post('getQuotationDetailById', 'api\thirdPart\weixin\ProcurementController@getQuotationDetailById');
+    Route::post('setOffer', 'api\thirdPart\weixin\ProcurementController@setOffer');
+    Route::post('accept', 'api\thirdPart\weixin\ProcurementController@accept');
+    Route::get('getProductionProcurement', 'api\thirdPart\weixin\ProcurementController@getProductionProcurement');
+    Route::get('getProcurementDeliveries', 'api\thirdPart\weixin\ProcurementController@getProcurementDeliveries');
+    Route::post('makeProcurementDelivery', 'api\thirdPart\weixin\ProcurementController@makeProcurementDelivery');
+    Route::post('finishProductionProcurement', 'api\thirdPart\weixin\ProcurementController@finishProductionProcurement');
+    Route::post('getProcurementDeliveryById', 'api\thirdPart\weixin\ProcurementController@getProcurementDeliveryById');
+    Route::post('updateProcurementDeliveryAmount', 'api\thirdPart\weixin\ProcurementController@updateProcurementDeliveryAmount');
+    Route::get('getProcurementTotalBill', 'api\thirdPart\weixin\ProcurementController@getProcurementTotalBill');
+    Route::post('markProcurementTotalBillStatus', 'api\thirdPart\weixin\ProcurementController@markProcurementTotalBillStatus');
+    Route::post('makeReceipt', 'api\thirdPart\weixin\ProcurementController@makeReceipt');
+    Route::post('supplierDeliverConfirm', 'api\thirdPart\weixin\ProcurementController@supplierDeliverConfirm');
 });
 Route::group(['prefix' => 'procurement'], function ($router) {
-    Route::post('login', 'api\procurement\wechat\AuthController@login');
+    Route::post('login', 'api\thirdPart\weixin\AuthController@login');
 });