StoreGoodsController.php 43 KB

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