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

采购管理--微信小程序推送模板消息

haozi 5 лет назад
Родитель
Сommit
25e65f1ef7

+ 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));
         }
     }
 

+ 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'));
     }
 

+ 20 - 4
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;
 
@@ -48,6 +55,8 @@ class ProcurementController extends Controller
         /** @var ProcurementService $procurementService*/
         $procurementService=app(ProcurementService::class);
         $deadline=$procurementService->computeDeadline($procurement->created_at);
+        if ($procurement->type==0) dispatch(new ProcurementEnquiry($procurement))->delay($deadline); //采购单创建时 推送到队列中
+        dispatch(new ProcurementConfirmInform($procurement));  //推送发送订单通知消息模板  队列
         $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
         return $procurement;
     }
@@ -129,6 +138,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 +170,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 +198,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 +215,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' => '发起采购失败'];

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

@@ -94,6 +94,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;
@@ -1660,4 +1661,10 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         }
         return $count;
     }
+    public function testConf(){
+
+        $procurementTotalBills=ProcurementTotalBill::query()->with(['supplier.user.userDetail','procurement'])->get();
+        dd($procurementTotalBills);
+
+    }
 }

+ 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);
     }
 }

+ 7 - 5
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');
     }
-    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()
+    {
+        $enquiry_time=Cache::get('询价延时时间')->value;
+        if (!$enquiry_time) $enquiry_time=Configuration::query()->where('name','询价延时时间')->value('value');
+        return $enquiry_time;
+    }
+
+    public function getReceiveTime()
+    {
+        $receive_time=Cache::get('接单延时时间')->value;
+        if (!$receive_time) $receive_time=Configuration::query()->where('name','接单延时时间')->value('value');
+        return $receive_time;
+    }
+    public function getPriceCoefficient()
+    {
+        $priceCoefficient=Cache::get('价格系数')->value;
+        if (!$priceCoefficient) $priceCoefficient=Configuration::query()->where('name','价格系数')->value('value');
+        return $priceCoefficient;
+    }
+
+
+}

+ 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");

+ 7 - 18
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)
     {
+        /**@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)->toDateTimeString();
+        if($time>=$date." 09:00:00" && $time<$date." 14:00:00") $deadline=Carbon::parse($time)->subHours(-$enquiry_time)->toDateTimeString();
+        if ($time>=$date." 14:00:00")$deadline=Carbon::parse($time)->subHours(-15-$enquiry_time)->toDateTimeString();
         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;
+    }
+
+}

+ 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",
+    ],
+];

+ 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">

+ 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:'波次号'}
                 ]];
 

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

@@ -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>

+ 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');
 });