StoreGoodsController.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\DwbsUser;
  4. use App\Models\ExpressStorage;
  5. use App\Models\Goods;
  6. use App\Models\InventoryW;
  7. use App\Models\Order;
  8. use App\Models\OrderDetail;
  9. use App\Models\OrderDetailW;
  10. use App\Models\OrderRefund;
  11. use App\Models\OrderRefundW;
  12. use App\Models\See;
  13. use App\Models\SettingW;
  14. use App\Models\Store;
  15. use App\Models\VipLogW;
  16. use App\Models\User;
  17. use App\Models\UserZ;
  18. use App\Models\ZbsBasic;
  19. use App\Models\UserStorage;
  20. use App\Models\UserW;
  21. use App\Models\OrderW;
  22. use App\Models\AddressW;
  23. use App\Models\StoreGoods;
  24. use App\Models\StoreGoodsSku;
  25. use App\Models\ZbsEnroll;
  26. use Illuminate\Http\Request;
  27. use GuzzleHttp\Client;
  28. use App\Jobs\PayOrderAddCreditsJob;
  29. use Illuminate\Support\Facades\Auth;
  30. use Illuminate\Support\Facades\DB;
  31. use Illuminate\Support\Facades\Log;
  32. use Illuminate\Support\Facades\Cache;
  33. use Illuminate\Support\Facades\Storage;
  34. use Illuminate\Support\Facades\Config;
  35. use Illuminate\Support\Facades\Crypt;
  36. use Intervention\Image\Facades\Image as Image;
  37. use Qiniu\Auth as Auths;
  38. use Qiniu\Storage\UploadManager;
  39. use Validator;
  40. use Carbon\Carbon;
  41. class StoreGoodsController extends Controller{
  42. //获取商品sku
  43. public function getGoodsTaps(Request $request){
  44. $type=$request->input('type');
  45. $user_id=Auth::user()->id;
  46. $store_id=Store::where('user_id',$user_id)->value('id');
  47. $goods=StoreGoods::where('is_delete',0)->where('is_shelves',1)->select('id','name','img','price','vip_price','main_attr')->orderByDesc('sort')->orderBy('id')->get();
  48. $inventory=InventoryW::where('store_id',$store_id)->pluck('num',DB::raw("CONCAT(store_id,'_',goods_id,'_',sku_id)"))->toArray();
  49. foreach($goods as $key=>$val){
  50. $goods[$key]->imgs=str_replace('http://','https://',$val->img);
  51. $second=mt_rand(3600,7200);
  52. if(Cache::has('goods_id_'.$val->id.'_sku')){
  53. $sku= Cache::get('goods_id_'.$val->id.'_sku');
  54. }else{
  55. $sku=StoreGoodsSku::where('goods_id',$val->id)->groupBy('type')->pluck('type');
  56. Cache::add('goods_id_'.$val->id.'_sku',$sku,$second);
  57. }
  58. $goods[$key]->sku=$sku;
  59. $size=[];
  60. foreach($sku as $k=>$v){
  61. if(Cache::has('goods_id_'.$val->id.'_'.$v.'_sku')){
  62. $skuInfo= Cache::get('goods_id_'.$val->id.'_'.$v.'_sku');
  63. }else{
  64. $skuInfo=StoreGoodsSku::where('goods_id',$val->id)->where('type',$v)->select('id','size')->orderBy('sort')->get();
  65. Cache::put('goods_id_'.$val->id.'_'.$v.'_sku',$skuInfo,$second);
  66. }
  67. foreach($skuInfo as $ks => $vs){
  68. $info=$vs;
  69. $info->type=$v;
  70. if(empty($inventory[$store_id.'_'.$val->id.'_'.$vs->id])){
  71. $info->num=0;
  72. }else{
  73. $info->num=$inventory[$store_id.'_'.$val->id.'_'.$vs->id];
  74. }
  75. $info->isChecked=false;
  76. // if($type==1 && $k==0 && $ks==0){
  77. // $info->isChecked=true;
  78. // }
  79. $size[$v][$ks]=$info;
  80. }
  81. $goods[$key]->size=$size;
  82. }
  83. }
  84. return $this->success($goods);
  85. }
  86. //获取店铺用户
  87. public function getStoreUser(Request $request){
  88. $input=$request->all();
  89. $user_id=Auth::user()->id;
  90. $time=Carbon::now()->toDateTimeString();
  91. $level=User::where('id',$user_id)->value('level');
  92. if($level==1 && $time>'2023-02-03 09:00:00'){
  93. return $this->error('451101','该店铺不能进行代下单','该店铺不能进行代下单');
  94. }
  95. $store_id=Store::where('user_id',$user_id)->value('id');
  96. $user_ids=OrderW::where('store_id',$store_id)->groupBy('user_id')->pluck('user_id');
  97. $user=UserW::whereIn('id',$user_ids);
  98. $search_name=$input['search_name'];
  99. if(!empty($search_name)){
  100. $user->where(function($query)use($search_name){
  101. $query->where('nickname','like','%'.$search_name.'%')
  102. ->orWhere('phone','like','%'.$search_name.'%');
  103. });
  104. }
  105. $list=$user->orderBy('id')->get();
  106. Log::info('已下单顾客信息');
  107. Log::info($store_id);
  108. $mobiles = [];
  109. if(empty($list)){
  110. Log::info('没有已下单顾客信息');
  111. Log::info($list);
  112. return $this->success([]);
  113. }
  114. foreach($list as $key=>$val){
  115. $uu=User::where('mobile',$val->phone)
  116. ->where(function($query){
  117. $query->where('cert_status',3)
  118. ->orWhere('cert_status',6);
  119. })
  120. ->where('service_status',0)->whereNull('deleted_at')->pluck('uuid');
  121. foreach($uu as $v){
  122. $mobiles[] = Crypt::decryptString($v);
  123. break;
  124. }
  125. }
  126. Log::info('count:'.count($list));
  127. $client = new Client(['headers' => [
  128. "User-Agent" => 'Mozilla/5.0(Windows;U;Windows NT 5.1;en-US;rv:0.9.4)',
  129. "Content-type" => 'application/json'
  130. ]]);
  131. $url='https://weidian.cliu.cc/api/crypt/getCryptData';
  132. $data = [
  133. 'form_params' => [
  134. 'list' => array_column($list->toArray(),'id'),
  135. 'store_id' => $store_id,
  136. 'mobiles' => $mobiles
  137. ],
  138. 'timeout' => 300
  139. ];
  140. $data=$client->post($url,$data);
  141. $ids=$data->getBody()->getContents();
  142. $ids = json_decode($ids, true);
  143. $ll = UserW::whereIn('id',$ids)->get();
  144. Log::info('count_ll:'.count($ll));
  145. return $this->success($ll);
  146. }
  147. //获取商品信息
  148. public function getGoods(){
  149. $data=[];
  150. $goods=StoreGoods::where('is_delete',0)->where('is_shelves',1)->pluck('name','id');
  151. $type=['男款','女款'];
  152. $size=['S','M','L','XL','XXL','XXXL'];
  153. $data['goods']=$goods;
  154. $data['type']=$type;
  155. $data['size']=$size;
  156. return $this->success($data);
  157. }
  158. public function getGoodsDetail(Request $request){
  159. $goods_id=$request->input('goods_id');
  160. $goods=StoreGoods::with('goodSku')->where('id',$goods_id)->first();
  161. $goods->imgs=str_replace('http://','https://',$goods->img);
  162. return $this->success($goods);
  163. }
  164. //获取商品列表
  165. public function getGoodsList(Request $request){
  166. $input=$request->all();
  167. $page_index=$input['page_index'];
  168. $page_size=$input['page_size'];
  169. $num=$page_size*($page_index-1);
  170. $goods_id=$input['goods_id'];
  171. if(!is_array($input['ids'])){
  172. $ids=json_decode($input['ids'],true);
  173. }else{
  174. $ids=$input['ids'];
  175. }
  176. $data=StoreGoodsSku::with(['goods:id,name,price,img'])
  177. ->whereHas('goods',function($query){
  178. $query->where('is_delete',0)->where('is_shelves',1);
  179. });
  180. if(!empty($goods_id)){
  181. $data ->where('goods_id',$goods_id);
  182. }
  183. if(!empty($ids)){
  184. $data->whereIn('id',$ids);
  185. }
  186. $count=$data->count();
  187. $list=$data->orderByDesc('goods_id')->orderByDesc('goods_id')
  188. ->skip($num)->take($page_size)
  189. ->get();
  190. return $this->success_list($list,'成功',$count);
  191. }
  192. //分享商品
  193. public function shareGoods(Request $request){
  194. $input=$request->all();
  195. $sku_id=$input['sku_id'];
  196. $info=StoreGoodsSku::with(['goods'])->whereHas('goods',function($query){
  197. $query->where('is_delete',0)->where('is_shelves',1);
  198. })->where('id',$sku_id)
  199. ->orderByDesc('goods_id')->orderByDesc('goods_id')->get();
  200. return $this->success($info);
  201. }
  202. //上传图片
  203. public function uploadImg(Request $request){
  204. $path_url = 'public/goods';
  205. $path = $request->file('img')->store($path_url);
  206. if($path){
  207. $url = env('APP_URL'). \Storage::url($path);
  208. return $this->success($url);
  209. }
  210. return $this->error();
  211. }
  212. /*--授权书---*/
  213. public function auth_code(Request $request){
  214. $user=User::find($request->id);
  215. if ($user->cert_status==3||$user->cert_status==6){
  216. if ($user->auth_startime &&$user->auth_code){
  217. if ($user->auth_img==null){
  218. $name=$user->realname==null?$user->nickname:$user->realname;
  219. $url=$this->auth_create($name,$user->mobile,judge_level($user->level),$user->auth_code,$user->auth_startime,$user->auth_endtime,$user->id);
  220. $user->auth_img=$url;
  221. $user->save();
  222. }
  223. $data['status']=0;
  224. }else{
  225. $data['status']=1;
  226. }
  227. }else{
  228. $data['status']=1;
  229. }
  230. if ($user->service_status==1){
  231. // return $this->error(50021,'','该代理尚未通过客服审核');
  232. return $this->error(50021,'','该账号尚未通过经销商审核');
  233. }
  234. if ($user->service_status==2){
  235. // return $this->error(50021,'','该代理的申请已被客服驳回');
  236. return $this->error(50021,'','该账号的申请已被经销商驳回');
  237. }
  238. $data['auth_startime']=strtotime($user->auth_startime)*1000;
  239. $data['auth_endtime']=strtotime($user->auth_endtime)*1000;
  240. $data['code']=$user->auth_code;
  241. $data['phone']=$user->mobile;
  242. $data['level_name']=judge_level($user->level);
  243. $data['realname']=$user->realname==null?$user->nickname:$user->realname;
  244. $data['url']=$user->auth_img==null?'':$user->auth_img;
  245. return $data;
  246. }
  247. public function auth_create($name,$phone,$level_name,$auth_code,$time_start,$time_end,$num){
  248. $client=new Client();
  249. $url='http://api.app.cliu.cc/138.jpg';
  250. $avatarResponse = $client->get($url);
  251. $img = Image::make($avatarResponse->getBody()->getContents());
  252. $img->text($name, 400, 565,function ($font){
  253. $font->file(base_path().'/public/fangzheng.ttf');
  254. $font->size(25);
  255. $font->angle(0);
  256. });
  257. $img->text($phone, 400, 635,function ($font){
  258. $font->file(base_path().'/public/fangzheng.ttf');
  259. $font->size(25);
  260. $font->angle(0);
  261. });
  262. $img->text($level_name, 350, 820,function ($font){
  263. $font->file(base_path().'/public/fangzheng.ttf');
  264. $font->size(60);
  265. $font->angle(0);
  266. });
  267. $img->text($auth_code, 285, 965,function ($font){
  268. $font->file(base_path().'/public/fangzheng.ttf');
  269. $font->size(25);
  270. $font->angle(0);
  271. });
  272. $year=mb_substr($time_start,0,4);
  273. $month=mb_substr($time_start,5,2);
  274. $day=mb_substr($time_start,8,2);
  275. $year_t=mb_substr($time_end,0,4);
  276. $month_t=mb_substr($time_end,5,2);
  277. $day_t=mb_substr($time_end,8,2);
  278. $img->text("{$year}年{$month}月{$day}日 - {$year_t}年{$month_t}月{$day_t}日", 285, 1050,function ($font){
  279. $font->file(base_path().'/public/fangzheng.ttf');
  280. $font->size(25);
  281. $font->angle(0);
  282. });
  283. $name=$this->rand_code($num);
  284. $img->save(base_path().'/public/public/uploads/auth_img/'.$name.'.jpg');
  285. return env('APP_URL').'/public/uploads/auth_img/'.$name.'.jpg';
  286. }
  287. public function rand_code($num){
  288. $code='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  289. $str=$num."_";
  290. $str_1='';
  291. for ($i=0;$i<20;$i++){
  292. $int=rand(0,34);
  293. $str_1.=mb_substr($code,$int,1);
  294. }
  295. $str=$str.mb_substr(time(),2,3).$str_1;
  296. return $str.mb_substr(time(),7,3);
  297. }
  298. //获取所有取消订单信息
  299. public function getCancelOrderList(Request $request){
  300. $user_id=Auth::user()->id;
  301. $store_id=Store::where('user_id',$user_id)->value('id');
  302. $page_index=$request->input('page_index');
  303. $page_size=$request->input('page_size');
  304. $order_no=$request->input('order_no');
  305. $num=$page_size*($page_index-1);
  306. $data= OrderW::with(['user:id,nickname,phone','order_cancel'=>function($query){$query->where('using',1);},'refund','store:id,name,img,phone'])
  307. ->where('store_id',$store_id)
  308. ->whereIn('apply_cancel',[1,2,3]);
  309. if($order_no){
  310. $data->where('order_no','like','%'.$order_no.'%');
  311. }
  312. $count= $data->count();
  313. $orders= $data->orderByDesc('cancel_at')->skip($num)->take($page_size)->get();
  314. foreach($orders as $key=>$val){
  315. $goods_ids=OrderDetailW::where('order_no',$val->order_no)->groupBy('goods_id')->pluck('goods_id');
  316. $goods=[];
  317. foreach($goods_ids as $k=>$v){
  318. $goods[$k]=StoreGoods::select('id','name','img','main_attr')->where('id',$v)->first();
  319. $goods[$k]->sku=OrderDetailW::where('order_no',$val->order_no)->where('goods_id',$v)->get();
  320. if(count($goods[$k]->sku)>0){
  321. $goods[$k]->price=$goods[$k]->sku[0]->price;
  322. }
  323. }
  324. $orders[$key]->goods=$goods;
  325. }
  326. return $this->success_list($orders,'成功',$count);
  327. }
  328. //获取所有退货订单
  329. public function getAllRefundOrder(Request $request)
  330. {
  331. $user_id=Auth::user()->id;
  332. $store_id=Store::where('user_id',$user_id)->value('id');
  333. $page_index=$request->input('page_index');
  334. $page_size=$request->input('page_size');
  335. $num=$page_size*($page_index-1);
  336. $refund_no=$request->input('refund_no');
  337. $data=OrderRefundW::with('store:id,name,phone')->where('store_id',$store_id);
  338. if($refund_no){
  339. $data->where('refund_no','like','%'.$refund_no.'%');
  340. }
  341. $total= $data->count();
  342. $refunds = $data->orderBy('id','desc')->skip($num)->take($page_size)->get();
  343. foreach($refunds as $key=>$val){
  344. $goods=[];
  345. $goods_ids=OrderDetailW::where('order_no',$val->refund_no)->groupBy('goods_id')->pluck('goods_id');
  346. foreach($goods_ids as $k=>$v){
  347. $goods[$k]=StoreGoods::where('id',$v)->first();
  348. $goods[$k]->sku=OrderDetailW::where('order_no',$val->refund_no)->where('goods_id',$v)->get();
  349. }
  350. $refunds[$key]->goods=$goods;
  351. }
  352. return $this->success_list($refunds,'成功',$total);
  353. }
  354. //获取退货订单详情
  355. public function getRefundOrderDetail(Request $request)
  356. {
  357. $refund_id = $request->input('refund_id');
  358. //获取订单信息(id)
  359. $order = OrderRefundW::with(['store:id,name,img,phone'])->where('id', $refund_id)->first();
  360. $goods_ids = OrderDetailW::where('order_no', $order->refund_no)->groupBy('goods_id')->pluck('goods_id');
  361. $goods = [];
  362. foreach ($goods_ids as $key => $val) {
  363. $goods[$key] = StoreGoods::where('id', $val)->first();
  364. $goods[$key]->sku = OrderDetailW::where('order_no', $order->refund_no)->where('goods_id', $val)->get();
  365. }
  366. $order->goods = $goods;
  367. return $this->success($order);
  368. }
  369. //删除订单
  370. public function deleteOriginOrder(Request $request){
  371. $order_id=$request->input('order_id');
  372. $res=OrderW::where('id',$order_id)->delete();
  373. if($res){
  374. return $this->success([]);
  375. }else{
  376. return $this->error();
  377. }
  378. }
  379. //取消退货审核
  380. public function cancelRefundOrder(Request $request){
  381. $refund_id=$request->input('refund_id');
  382. $refund=OrderRefundW::where('id',$refund_id)->first();
  383. if(empty($refund)){
  384. return $this->error('450001','退货单不存在');
  385. }
  386. $count=OrderRefundW::where('order_no',$refund->order_no)->count();
  387. try{
  388. DB::transaction(function()use($count,$refund){
  389. if($count==1){
  390. OrderW::where('order_no',$refund->order_no)->update([
  391. 'is_refund'=>0
  392. ]);
  393. }elseif($count>1){
  394. OrderW::where('order_no',$refund->order_no)->update([
  395. 'is_refund'=>2
  396. ]);
  397. }
  398. OrderRefundW::where('id',$refund->id)->delete();
  399. },5);
  400. return $this->success([]);
  401. }catch(\Exception $e){
  402. return $this->error('450001',$e->getMessage());
  403. }
  404. }
  405. //修改订单物流信息
  406. public function editExpress(Request $request){
  407. $input=$request->all();
  408. $rules=[
  409. 'express_no' =>'required',
  410. 'express_company'=>'required',
  411. 'express_time' =>'required'
  412. ];
  413. $message=[
  414. 'express_no.required' =>'发货单号不能为空.',
  415. 'express_company.required'=>'物流公司不能为空.',
  416. 'express_time.required' =>'发货时间不能为空.'
  417. ];
  418. $validator = Validator::make($input,$rules,$message);
  419. if($validator->fails()){
  420. return $this->error('400013',$validator->errors()->first());
  421. }
  422. $res=OrderW::where('order_no',$input['order_no'])->update([
  423. 'express_no'=>str_replace(' ','', $input['express_no']),
  424. 'express_company'=>$input['express_company'],
  425. 'express_code'=>$input['express_code'],
  426. 'express_state'=>0,
  427. 'express_info'=>null,
  428. 'express_receive_time'=>null,
  429. 'express_phone'=>$input['express_phone'],
  430. 'express_time'=>$input['express_time']
  431. ]);
  432. if($res){
  433. return $this->success([]);
  434. }else{
  435. return $this->error();
  436. }
  437. }
  438. //添加微信二维码
  439. public function uploadWxQrCodeImg(Request $request){
  440. Log::info(Auth::user()->id.'---'.Auth::user()->nickname.'---变更了微信二维码');
  441. // $path_url = 'public/wxQrCode/'.date("Ymd");
  442. $file=$request->file('img');
  443. $extension=['jpg','png','jpeg'];//,'xbm','tif','tiff','pjp','svgz','ico','gif','svg','webp','bpm','pjpeg','avif','xbm','tif','tiff','pjp','svgz','ico','gif','svg','webp','bpm','pjpeg','avif'
  444. $fileextension=$file->getClientOriginalExtension();
  445. Log::info(Auth::user()->id.'---'.Auth::user()->nickname.'---'.$fileextension);
  446. $fileextension=strtolower($fileextension);
  447. if(!in_array($fileextension,$extension)){
  448. return $this->error('450001','上传图片格式有误,当前文件格式为:'.$fileextension);
  449. }
  450. // $path = $file->store($path_url);
  451. // 获取七牛云配置信息
  452. $config = [
  453. 'driver' => 'qiniu',
  454. 'domain' => 'http://image.chuliu.cc', //七牛域名
  455. 'access_key' => 'cIbo9JAqHBgO6uw97gT5fJOlEHiTiGrpB84unVEn', //AccessKey
  456. 'secret_key' => '4f0nTNNrvzOsFc6Rz0GC5DntiJRnk2GcfkyJFNQp', //SecretKey
  457. 'bucket' => 'daweiboshi-app', //Bucket名字
  458. 'dirname'=> 'daweiboshi-weidian'
  459. ];
  460. // 构建鉴权对象
  461. $auth = new Auths($config['access_key'], $config['secret_key']);
  462. // 生成上传 Token
  463. $token = $auth->uploadToken($config['bucket']);
  464. //获取文件的绝对路径,但是获取到的在本地不能打开
  465. $filePath = $file->getRealPath();
  466. //获取文件的扩展名
  467. $ext = $file->getClientOriginalExtension();
  468. // 新文件名
  469. $filename =date('His') . uniqid(mt_rand(10000,99999)) .'.'. $ext;
  470. $dirname=$config['dirname'];
  471. // 初始化 UploadManager 对象并进行文件的上传。
  472. $uploadMgr = new UploadManager();
  473. // 调用 UploadManager 的 putFile 方法进行文件的上传。
  474. $pathname= $dirname.'/wxQrCode/'.date('Ymd').'/'.$filename;
  475. try{
  476. $uploadMgr->putFile($token, $pathname, $filePath);
  477. }catch(\Exception $e){
  478. return $this->error('450001',$e->getMessage(),$e->getMessage());
  479. }
  480. // 获取文件完整路径
  481. $url = $config['domain'].'/'.$pathname;
  482. if($url){
  483. $user_id=Auth::user()->id;
  484. $res=Store::where('user_id',$user_id)->update(['qr_code'=>$url]);
  485. if($res){
  486. return $this->success($url);
  487. }else{
  488. return $this->error('450001','二维码上传失败');
  489. }
  490. }else{
  491. return $this->error('450001','二维码上传失败');
  492. }
  493. }
  494. //销收数据
  495. public function getSaleInfo(Request $request){
  496. $cycle=$request->input('cycle');
  497. $startime=$request->input('startime');
  498. $endtime=$request->input('endtime');
  499. $agent_id=Auth::user()->id;
  500. $store_id=Store::where('status',0)->where('user_id',$agent_id)->value('id');
  501. $data=OrderW::with('user')->where('store_id',$store_id)
  502. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1]);
  503. if(!empty($startime) && !empty($endtime)){
  504. $data->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime($startime)),date("Y-m-d 23:59:59",strtotime($endtime))]);
  505. }else{
  506. switch($cycle){
  507. case 'daily':
  508. $data->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  509. break;
  510. case 'today':
  511. $data->whereDate('created_at',date("Y-m-d"));
  512. break;
  513. case 'week':
  514. $w=date('w');
  515. if($w==0){
  516. $w=7;
  517. }
  518. $w-=1;
  519. $data->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime("-$w day")),date("Y-m-d 23:59:59")]);
  520. break;
  521. case 'month':
  522. $data->whereBetween('created_at',[date("Y-m-01 00:00:00"),date("Y-m-d 23:59:59")]);
  523. break;
  524. // case 'quarter':
  525. // $start=(ceil(date("m")/3)-1)*3+1;
  526. // $data->whereBetween('created_at',[date("Y-".$start."-01 00:00:00"),date("Y-m-d 23:59:59")]);
  527. // break;
  528. default:
  529. $data->where([]);
  530. }
  531. }
  532. $order_nos=$data->pluck('order_no');
  533. $goods_ids=StoreGoods::where('is_shelves',1)->select('id','name','main_attr')->get()->toArray();
  534. $sale_info=[];
  535. // return $order_nos;
  536. foreach($goods_ids as $key=>$val){
  537. $order_details=OrderDetailW::with('goods:id,name,main_attr,img')
  538. ->where('goods_id',$val['id'])->whereIn('order_no',$order_nos)
  539. ->select('goods_id',DB::raw('sum(num) as num'),DB::raw('sum(ifNUll(account,0)) as account'))
  540. ->first()->toArray();
  541. if(empty($order_details['goods'])){
  542. $order_details['goods_id']=$val['id'];
  543. $order_details['num']=0;
  544. $order_details['account']=0;
  545. $order_details['goods']=$val;
  546. }
  547. $sale_info[$key]=$order_details;
  548. }
  549. return $this->success($sale_info);
  550. }
  551. //销售曲线
  552. public function getSaleAccount(Request $request){
  553. $cycle=$request->input('cycle');
  554. $startime=$request->input('startime');
  555. $endtime=$request->input('endtime');
  556. $agent_id=Auth::user()->id;
  557. $store_id=Store::where('status',0)->where('user_id',$agent_id)->value('id');
  558. switch($cycle){
  559. case 'daily':
  560. case 'today':
  561. $type='daily';
  562. $date=$this->getDateFromRange(date("Y-m-d",strtotime('-1 day')),date("Y-m-d"));
  563. break;
  564. case 'week':
  565. $w=date('w');
  566. if($w==0){
  567. $w=7;
  568. }
  569. $w-=1;
  570. $type='daily';
  571. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-$w day")),date("Y-m-d"));
  572. break;
  573. case 'month':
  574. $type='daily';
  575. $date=$this->getDateFromRange(date("Y-m-01"),date("Y-m-d"));
  576. break;
  577. default:
  578. $time=OrderW::with('user')->where('store_id',$store_id)
  579. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  580. ->pluck('created_at')->toArray();
  581. if(count($time)>=2) {
  582. $max_time = date("Y-m-d", strtotime(max($time)));
  583. $min_time = date("Y-m-d", strtotime(min($time)));
  584. $datetime1 = date_create($max_time); //格式化日期
  585. $datetime2 = date_create($min_time); //格式化日期
  586. $interval = date_diff($datetime1, $datetime2);
  587. if ($interval->format('%a') > 31) {
  588. $type = 'month';
  589. $date = $this->dateMonths($min_time, $max_time);
  590. } else {
  591. $type = 'daily';
  592. $date = $this->getDateFromRange($min_time, $max_time);
  593. }
  594. }else{
  595. $type='daily';
  596. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-1 days")),date("Y-m-d"));
  597. }
  598. }
  599. if(!empty($startime) && !empty($endtime)){
  600. $max_time=date("Y-m-d",strtotime($endtime));
  601. $min_time=date("Y-m-d",strtotime($startime));
  602. $datetime1 = date_create($max_time); //格式化日期
  603. $datetime2 = date_create($min_time); //格式化日期
  604. $interval = date_diff($datetime1, $datetime2);
  605. if($interval->format('%a') > 31){
  606. $type='month';
  607. $date=$this->dateMonths($min_time,$max_time);
  608. }else{
  609. $type='daily';
  610. $date=$this->getDateFromRange($min_time,$max_time);
  611. }
  612. }
  613. $stores=[];
  614. foreach($date as $key=>$val){
  615. if($type=='daily'){
  616. $order_nos=OrderW::with('user')->where('store_id',$store_id)
  617. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  618. ->whereDate('created_at',$val)->pluck('order_no');
  619. }else{
  620. $order_nos=OrderW::with('user')->where('store_id',$store_id)
  621. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  622. ->whereMonth('created_at',$val)->pluck('order_no');
  623. }
  624. $stores[$val]=OrderDetailW::with('goods:id,name,main_attr,img')->whereIn('order_no',$order_nos)->groupBy('goods_id')
  625. ->select('goods_id',DB::raw('sum(num) as num'),DB::raw('sum(ifNUll(account,0)) as account'))
  626. ->get();
  627. }
  628. $goods=StoreGoods::where('is_shelves',1)->select('id','name','main_attr')->get();
  629. $data['store']=$stores;
  630. $data['goods']=$goods;
  631. return $this->success($data);
  632. }
  633. function getDateFromRange($startdate, $enddate){
  634. $stimestamp = strtotime($startdate);
  635. $etimestamp = strtotime($enddate);
  636. // 计算日期段内有多少天
  637. $days = ($etimestamp-$stimestamp)/86400+1;
  638. // 保存每天日期
  639. $date = array();
  640. for($i=0; $i<$days; $i++){
  641. $date[] = date('Y-m-d', $stimestamp+(86400*$i));
  642. }
  643. return $date;
  644. }
  645. /**
  646. * 计算出两个日期之间的月份区间
  647. * @author Eric
  648. * @param [type] $start_date [开始日期,如2014-03]
  649. * @param [type] $end_date [结束日期,如2015-12]
  650. * @param string $explode [年份和月份之间分隔符,此例为 - ]
  651. * @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用]
  652. * @return [type] [返回是两个月份之间所有月份字符串]
  653. */
  654. function dateMonthsSections($start_date,$end_date,$explode='-',$addOne=false){
  655. $data = $this->dateMonths($start_date,$end_date,$explode,$addOne);
  656. $length = sizeof($data);
  657. $res = array();
  658. foreach ($data as $key => $value) {
  659. if($key < ($length-1)){
  660. $date1 = $value;
  661. $date2 = $data[$key + 1];
  662. $res[$key][0] = $date1;
  663. $res[$key][1] = $date2;
  664. }
  665. }
  666. return $res;
  667. }
  668. /**
  669. * 计算出两个日期之间的月份
  670. * @author Eric
  671. * @param [type] $start_date [开始日期,如2014-03]
  672. * @param [type] $end_date [结束日期,如2015-12]
  673. * @param string $explode [年份和月份之间分隔符,此例为 - ]
  674. * @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用]
  675. * @return [type] [返回是两个月份之间所有月份字符串]
  676. */
  677. function dateMonths($start_date,$end_date,$explode='-',$addOne=false){
  678. //判断两个时间是不是需要调换顺序
  679. $start_date=date("Y-m",strtotime($start_date));
  680. $end_date=date("Y-m",strtotime($end_date));
  681. $start_int = strtotime($start_date);
  682. $end_int = strtotime($end_date);
  683. if($start_int > $end_int){
  684. $tmp = $start_date;
  685. $start_date = $end_date;
  686. $end_date = $tmp;
  687. }
  688. //结束时间月份+1,如果是13则为新年的一月份
  689. $start_arr = explode($explode,$start_date);
  690. $start_year = intval($start_arr[0]);
  691. $start_month = intval($start_arr[1]);
  692. $end_arr = explode($explode,$end_date);
  693. $end_year = intval($end_arr[0]);
  694. $end_month = intval($end_arr[1]);
  695. $data = array();
  696. $data[] = $start_date;
  697. $tmp_month = $start_month;
  698. $tmp_year = $start_year;
  699. //如果起止不相等,一直循环
  700. while (!(($tmp_month == $end_month) && ($tmp_year == $end_year))) {
  701. $tmp_month ++;
  702. //超过十二月份,到新年的一月份
  703. if($tmp_month > 12){
  704. $tmp_month = 1;
  705. $tmp_year++;
  706. }
  707. $data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT);
  708. }
  709. if($addOne == true){
  710. $tmp_month ++;
  711. //超过十二月份,到新年的一月份
  712. if($tmp_month > 12){
  713. $tmp_month = 1;
  714. $tmp_year++;
  715. }
  716. $data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT);
  717. }
  718. return $data;
  719. }
  720. //获取操作全部视频
  721. public function getAllVideo(){
  722. $setting=SettingW::all();
  723. return $this->success($setting);
  724. }
  725. public function getUserData(Request $request){
  726. $cycle=$request->input('cycle');
  727. $user_id=Auth::user()->id;
  728. $store_id=Store::where('user_id',$user_id)->value('id');
  729. $data=OrderW::where('store_id',$store_id)
  730. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  731. ->select(DB::raw('ifnull(sum(total),0) as total'),DB::raw('ifnull(sum(account),0) as account'));
  732. switch($cycle){
  733. case 'yesterday':
  734. $type='yesterday';
  735. $where=function($query){
  736. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  737. };
  738. $date=$this->getDateFromRange(date("Y-m-d",strtotime('-1 day')),date("Y-m-d"));
  739. break;
  740. case 'today':
  741. $type='today';
  742. $where=function($query){
  743. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  744. };
  745. $date=$this->getDateFromRange(date("Y-m-d",strtotime('-1 day')),date("Y-m-d"));
  746. break;
  747. case 'week':
  748. $type='week';
  749. $w=date('w');
  750. if($w==0){
  751. $w=7;
  752. }
  753. $w-=1;
  754. $where=function($query)use($w){
  755. $query->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime("-$w day")),date("Y-m-d 23:59:59")]);
  756. };
  757. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-$w day")),date("Y-m-d"));
  758. break;
  759. case 'month':
  760. $type='month';
  761. $where=function($query){
  762. $query->whereBetween('created_at',[date("Y-m-01 00:00:00"),date("Y-m-d 23:59:59")]);
  763. };
  764. $date=$this->getDateFromRange(date("Y-m-01"),date("Y-m-d"));
  765. break;
  766. default:
  767. $where=[];
  768. $time=OrderW::with('user')->where('store_id',$store_id)
  769. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  770. ->pluck('created_at')->toArray();
  771. if(count($time)>=2){
  772. $max_time=date("Y-m-d",strtotime(max($time)));
  773. $min_time=date("Y-m-d",strtotime(min($time)));
  774. $datetime1 = date_create($max_time); //格式化日期
  775. $datetime2 = date_create($min_time); //格式化日期
  776. $interval = date_diff($datetime1, $datetime2);
  777. if($interval->format('%a') > 31){
  778. $type='all';
  779. $date=$this->dateMonths($min_time,$max_time);
  780. }else{
  781. $type='daily';
  782. $date=$this->getDateFromRange($min_time,$max_time);
  783. }
  784. }else{
  785. $type='daily';
  786. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-1 days")),date("Y-m-d"));
  787. }
  788. }
  789. $data->where($where);
  790. $data1=clone $data;
  791. $list=$data->first()->toArray();
  792. $users=$data1->whereHas('user',function($query)use($where){
  793. $query->where($where);
  794. })->groupBy('user_id')->get();
  795. $list['type']=$type;
  796. $list['count']=$users->count();
  797. foreach($date as $key=>$val){
  798. if($type=='yesterday' || $type=='today' || $type=='week' || $type=='month'){
  799. $user_ids=OrderW::where('store_id',$store_id)
  800. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  801. ->where('store_id',$store_id)->whereDate('created_at',$val)->groupBy('user_id')->pluck('user_id');
  802. $line[$val]=UserW::whereDate('created_at',$val)->whereIn('id',$user_ids)->count();
  803. }else{
  804. Log::info('two');
  805. $timestamp=strtotime($val);
  806. $start=Carbon::parse($timestamp)->tz('PRC')->startOfMonth()->toDateTimeString();
  807. $end=Carbon::parse($timestamp)->tz('PRC')->endOfMonth()->toDateTimeString();
  808. $user_ids=OrderW::query()->where('store_id',$store_id)->whereBetween('created_at',[$start,$end])->groupBy('user_id')->pluck('user_id');
  809. $line[$val]=UserW::whereBetween('created_at',[$start,$end])->whereIn('id',$user_ids)->count();
  810. }
  811. }
  812. Log::info('123122222');
  813. $list['line']=$line;
  814. return $this->success($list);
  815. }
  816. public function getUserList(Request $request){
  817. // dispatch(new PayOrderAddCreditsJob('运行队列测试123--00--123'));
  818. $cycle=$request->input('cycle');
  819. $search_name=$request->input('search_name');
  820. $page_index=$request->input('page_index');
  821. $page_size=$request->input('page_size');
  822. $num=$page_size*($page_index-1);
  823. $user_id=Auth::user()->id;
  824. $store_id=Store::where('user_id',$user_id)->value('id');
  825. $wheres=[];
  826. if($search_name){
  827. $wheres=function($query)use($search_name){
  828. $query->where('nickname','like','%'.$search_name.'%')->orWhere('phone','like','%'.$search_name.'%');
  829. };
  830. }
  831. switch($cycle){
  832. case 'yesterday':
  833. $where=function($query){
  834. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  835. };
  836. break;
  837. case 'today':
  838. $where=function($query){
  839. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  840. };
  841. break;
  842. case 'week':
  843. $w=date('w');
  844. if($w==0){
  845. $w=7;
  846. }
  847. $w-=1;
  848. $where=function($query)use($w){
  849. $query->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime("-$w day")),date("Y-m-d 23:59:59")]);
  850. };
  851. break;
  852. case 'month':
  853. $where=function($query){
  854. $query->whereBetween('created_at',[date("Y-m-01 00:00:00"),date("Y-m-d 23:59:59")]);
  855. };
  856. break;
  857. default:
  858. $where=[];
  859. }
  860. $count=OrderW::where('store_id',$store_id)
  861. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  862. ->select(DB::raw('ifnull(sum(total),0) as total'),DB::raw('ifnull(sum(account),0) as account'))
  863. ->whereHas('user',function($query)use($where,$wheres){
  864. $query->where($where)->where($wheres);
  865. })->groupBy('user_id')->get()->count();
  866. $list=OrderW::with('user:id,nickname,avatar')->where('store_id',$store_id)
  867. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  868. ->select('user_id',DB::raw('ifnull(sum(total),0) as total'),DB::raw('ifnull(sum(account),0) as account'))
  869. ->whereHas('user',function($query)use($where,$wheres){
  870. $query->where($where)->where($wheres);
  871. })->groupBy('user_id')->OrderByDesc('total')->OrderByDesc('account')->OrderBy('user_id')->skip($num)->take($page_size)->get();
  872. return $this->success_list($list,'',$count);
  873. }
  874. public function getSeeUserData(Request $request){
  875. $cycle=$request->input('cycle');
  876. $user_id=Auth::user()->id;
  877. $store_id=Store::where('user_id',$user_id)->value('id');
  878. switch($cycle){
  879. case 'yesterday':
  880. $type='yesterday';
  881. $where=function($query){
  882. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  883. };
  884. $date=$this->getDateFromRange(date("Y-m-d",strtotime('-1 day')),date("Y-m-d"));
  885. break;
  886. case 'today':
  887. $type='today';
  888. $where=function($query){
  889. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  890. };
  891. $date=$this->getDateFromRange(date("Y-m-d",strtotime('-1 day')),date("Y-m-d"));
  892. break;
  893. case 'week':
  894. $type='week';
  895. $w=date('w');
  896. if($w==0){
  897. $w=7;
  898. }
  899. $w-=1;
  900. $where=function($query)use($w){
  901. $query->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime("-$w day")),date("Y-m-d 23:59:59")]);
  902. };
  903. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-$w day")),date("Y-m-d"));
  904. break;
  905. case 'month':
  906. $type='month';
  907. $where=function($query){
  908. $query->whereBetween('created_at',[date("Y-m-01 00:00:00"),date("Y-m-d 23:59:59")]);
  909. };
  910. $date=$this->getDateFromRange(date("Y-m-01"),date("Y-m-d"));
  911. break;
  912. default:
  913. $where=[];
  914. $time=OrderW::with('user')->where('store_id',$store_id)
  915. ->where('is_pay',1)->whereIn('apply_cancel',[0,1,3])->whereIn('is_refund',[0,1])
  916. ->pluck('created_at')->toArray();
  917. if(count($time)>=2){
  918. $max_time=date("Y-m-d",strtotime(max($time)));
  919. $min_time=date("Y-m-d",strtotime(min($time)));
  920. $datetime1 = date_create($max_time); //格式化日期
  921. $datetime2 = date_create($min_time); //格式化日期
  922. $interval = date_diff($datetime1, $datetime2);
  923. if($interval->format('%a') > 31){
  924. $type='all';
  925. $date=$this->dateMonths($min_time,$max_time);
  926. }else{
  927. $type='daily';
  928. $date=$this->getDateFromRange($min_time,$max_time);
  929. }
  930. }else{
  931. $type='daily';
  932. $date=$this->getDateFromRange(date("Y-m-d",strtotime("-1 days")),date("Y-m-d"));
  933. }
  934. }
  935. $list=[];
  936. $list['count']=See::where($where)->where('store_id',$store_id)->groupBy('user_id')->get()->count();
  937. foreach($date as $key=>$val){
  938. if($type=='yesterday' || $type=='today' || $type=='week' || $type=='month'){
  939. $user_ids=See::where('store_id',$store_id)->whereDate('created_at',$val)->groupBy('user_id')->pluck('user_id');
  940. }else{
  941. $timestamp=strtotime($val);
  942. $start=Carbon::parse($timestamp)->tz('PRC')->startOfMonth()->toDateTimeString();
  943. $end=Carbon::parse($timestamp)->tz('PRC')->endOfMonth()->toDateTimeString();
  944. $user_ids=See::query()->where('store_id',$store_id)->whereBetween('created_at',[$start,$end])->groupBy('user_id')->pluck('user_id');
  945. }
  946. $line[$val]=count($user_ids);
  947. }
  948. $list['line']=$line;
  949. return $this->success($list);
  950. }
  951. public function getSeeUserList(Request $request){
  952. $cycle=$request->input('cycle');
  953. $search_name=$request->input('search_name');
  954. $page_index=$request->input('page_index');
  955. $page_size=$request->input('page_size');
  956. $num=$page_size*($page_index-1);
  957. $user_id=Auth::user()->id;
  958. $store_id=Store::where('user_id',$user_id)->value('id');
  959. switch($cycle){
  960. case 'yesterday':
  961. $where=function($query){
  962. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  963. };
  964. break;
  965. case 'today':
  966. $where=function($query){
  967. $query->whereDate('created_at',date("Y-m-d",strtotime('-1 day')));
  968. };
  969. break;
  970. case 'week':
  971. $w=date('w');
  972. if($w==0){
  973. $w=7;
  974. }
  975. $w-=1;
  976. $where=function($query)use($w){
  977. $query->whereBetween('created_at',[date("Y-m-d 00:00:00",strtotime("-$w day")),date("Y-m-d 23:59:59")]);
  978. };
  979. break;
  980. case 'month':
  981. $where=function($query){
  982. $query->whereBetween('created_at',[date("Y-m-01 00:00:00"),date("Y-m-d 23:59:59")]);
  983. };
  984. break;
  985. default:
  986. $where=[];
  987. }
  988. $count=See::where($where)->where('store_id',$store_id)->whereHas('user',function($query)use($search_name){
  989. $query->where('nickname','like','%'.$search_name.'%')->orWhere('phone','like','%'.$search_name.'%');
  990. })->count();
  991. $list=See::with(['user:id,nickname,avatar','goods:id,name,img'])
  992. ->whereHas('user',function($query)use($search_name){
  993. $query->where('nickname','like','%'.$search_name.'%')->orWhere('phone','like','%'.$search_name.'%');
  994. })
  995. ->where($where)->where('store_id',$store_id)->orderByDesc('created_at')->skip($num)->take($page_size)->get();
  996. return $this->success_list($list,'',$count);
  997. }
  998. //设置店铺商品库存
  999. public function setStoreGoodsInventory(Request $request){
  1000. $data=$request->input('data');
  1001. $user_id=Auth::user()->id;
  1002. $store_id=Store::where('user_id',$user_id)->value('id');
  1003. foreach($data as $key=>$val){
  1004. $sku=StoreGoodsSku::where('id',$val[0])->first();
  1005. if($sku){
  1006. InventoryW::updateOrCreate(
  1007. [
  1008. 'store_id'=>$store_id,
  1009. 'goods_id'=>$sku->goods_id,
  1010. 'sku_id'=>$val[0],
  1011. 'size'=>$sku->size,
  1012. 'type'=>$sku->type
  1013. ],
  1014. [
  1015. 'num'=>$val[1]
  1016. ]
  1017. );
  1018. }
  1019. }
  1020. return $this->success([]);
  1021. }
  1022. }