StoreGoodsController.php 45 KB

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