InventoryController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <?php
  2. namespace Modules\Service\Http\Controllers;
  3. use App\Http\Requests\ZtRequest;
  4. use App\Models\Inventory;
  5. use App\Models\Order;
  6. use App\Models\GoodsSku;
  7. use App\Models\GoodsSpec;
  8. use App\Models\GoodsSkuPrice;
  9. use App\Models\Goodtest;
  10. use App\Models\GoodsLog;
  11. use App\Models\Orderdetail;
  12. use App\Models\Ordertest;
  13. use App\Models\User;
  14. use Carbon\Carbon;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\Cache;
  18. use Illuminate\Support\Facades\DB;
  19. use Illuminate\Support\Facades\Validator;
  20. use Illuminate\Database\Eloquent\Builder;
  21. class InventoryController extends Controller
  22. {
  23. //商品库存
  24. public function getGoodsInventory(Request $request){
  25. $input=$request->all();
  26. $page_size=$input['page_size'];
  27. $page_index=$input['page_index'];
  28. $num = ($page_index - 1) * $page_size;
  29. $search_name=$input['search_name'];
  30. $status=$input['status'];
  31. $where=[];
  32. if ($status==1){
  33. $where=function ($query){
  34. $query->whereIn('is_show',[2,3]);
  35. };
  36. }elseif($status==-1){
  37. $where=[];
  38. }elseif($status==0){
  39. $where['is_show']=1;
  40. }elseif($status==2){
  41. $where['is_show']=4;
  42. }
  43. $data=Goodtest::where($where)->where('is_deleted',0);
  44. if($search_name){
  45. $data->where('name','like','%'.$search_name.'%');
  46. }
  47. $count=$data->count();
  48. if($count==0){
  49. $this->error('450001','没有数据');
  50. }
  51. $list=$data->skip($num)->take($page_size)
  52. ->get();
  53. $data=[];
  54. foreach ($list as $k=>$v){
  55. $data[$k]=$v;
  56. $data[$k]->order_num=$v->all_storage-$v->storage;
  57. $data[$k]->storage=$v->all_storage;
  58. }
  59. return $this->success_list($list,'success',$count);
  60. }
  61. public function exportGoodsInventory(Request $request){
  62. $input=$request->all();
  63. $search_name=$input['search_name'];
  64. $status=$input['status'];
  65. $where=[];
  66. if ($status==1){
  67. $where=function ($query){
  68. $query->whereIn('is_show',[2,3]);
  69. };
  70. }elseif($status==-1){
  71. $where=[];
  72. }elseif($status==0){
  73. $where['is_show']=1;
  74. }elseif($status==2){
  75. $where['is_show']=4;
  76. }
  77. $data=Goodtest::where($where)->where('is_deleted',0);
  78. if($search_name){
  79. $data->where('name','like','%'.$search_name.'%');
  80. }
  81. $count=$data->count();
  82. if($count==0){
  83. $this->error('450001','没有数据');
  84. }
  85. $list=$data->get();
  86. return $this->success_list($list,'success',$count);
  87. }
  88. public function importGoodsInventory(Request $request){
  89. $input=$request->all();
  90. $data=$input['data'];
  91. DB::beginTransaction();
  92. try{
  93. foreach($data as $key => $val){
  94. if(empty($val['商品id'])){
  95. return $this->error('450001','第'.($key+2).'行附近,商品id不能为空');
  96. }
  97. if(empty($val['商品名称'])){
  98. return $this->error('450001','第'.($key+2).'行附近,商品名称不能为空');
  99. }
  100. if(empty($val['款式'])){
  101. return $this->error('450001','第'.($key+2).'行附近,款式不能为空');
  102. }
  103. if(empty($val['总库存']) && $val['总库存']!=0){
  104. return $this->error('450001','第'.($key+2).'行附近,总库存不能为空');
  105. }
  106. if(!is_numeric($val['总库存'])){
  107. return $this->error('450001','第'.($key+2).'行附近,总库存数据类型有误');
  108. }
  109. $storage=Goodtest::where('id',$val['商品id'])->lockForUpdate()->first();
  110. if (!Cache::has('dwbs_good_num'.$storage->id)){
  111. $num=$val['总库存'];
  112. Cache::forever('dwbs_good_num'.$storage->id,$num);
  113. }else{
  114. $num=$val['总库存'];
  115. Cache::forever('dwbs_good_num'.$storage->id, $num);
  116. }
  117. if($storage->storage!=$val['总库存']){
  118. $storage->storage=$val['总库存'];
  119. $storage->all_storage=$val['总库存'];
  120. $storage->save();
  121. GoodsLog::create([
  122. 'admin_id'=> Auth::user()->id,
  123. 'admin_name'=>Auth::user()->name,
  124. 'goods_id'=>$val['商品id'],
  125. 'type'=>1,//修改库存
  126. 'name' => $val['商品名称'],
  127. 'text'=>'管理员:'.Auth::user()->name.',修改商品:'.$val['商品名称'].'('.$val['款式'].')库存,修改前库存:'.$storage.',修改后库存:'.$val['总库存']
  128. ]);
  129. }
  130. }
  131. DB::commit();
  132. return $this->success([]);
  133. }catch (\Exception $e){
  134. DB::rollback();
  135. return $e->getMessage();
  136. return $this->error();
  137. }
  138. }
  139. public function updateGoodsInventory(Request $request){
  140. $input=$request->all();
  141. $ids=$input['ids'];
  142. $num=$input['num'];
  143. $rules=[
  144. 'ids'=>'required|array',
  145. 'num'=>'required|numeric',
  146. ];
  147. $messages=[
  148. 'ids.required'=>'商品id不能为空.',
  149. 'ids.array'=>'商品id需为数组.',
  150. 'num.required'=>'库存数量不能为空.',
  151. 'num.numeric'=>'库存数量格式有误.',
  152. ];
  153. $validator = Validator::make($input, $rules, $messages);
  154. if($validator->fails()){
  155. return $this->error('400013',$validator->errors()->first());
  156. }
  157. DB::beginTransaction();
  158. try{
  159. foreach($ids as $key=>$val){
  160. $goods=Goodtest::where('id',$val)->first();
  161. $s=$goods->storage;
  162. if (!Cache::has('dwbs_good_num'.$val)){
  163. Cache::remember('dwbs_good_num'.$val,Carbon::now()->addDays(10),function ()use ($s){
  164. return $s;
  165. });
  166. }
  167. $numss=Cache::get('dwbs_good_num'.$val);
  168. if ($num<0){
  169. if ($numss<-$num){
  170. return $this->error(50023,'当前商品减少的数量大于库存数量'.$numss);
  171. }else{
  172. $numm=-$num;
  173. Cache::decrement('dwbs_good_num'.$val,$numm);
  174. }
  175. }else{
  176. Cache::increment('dwbs_good_num'.$val,$num);
  177. }
  178. $goods->storage=Cache::get('dwbs_good_num'.$val);
  179. $goods->all_storage+=$num;
  180. $log=new GoodsLog();
  181. $log->admin_id=Auth::user()->id;
  182. $log->admin_name=Auth::user()->name;
  183. $log->goods_id=$val;
  184. $log->type=1;//修改库存
  185. $log->name = $goods->name;
  186. $log->text='管理员:'.Auth::user()->name.',修改商品:'.$goods->name.'('.$goods->size.')库存,修改前库存:'.$numss.',修改后库存:'.Cache::get('dwbs_good_num'.$val);
  187. if (!$log->save()){
  188. throw new \Exception('1');
  189. }
  190. if (!$goods->save()){
  191. throw new \Exception('1');
  192. }
  193. }
  194. DB::commit();
  195. return $this->success([]);
  196. }catch (\Exception $exception){
  197. DB::rollBack();
  198. Cache::decrement('dwbs_good_num'.$ids[0],$num);
  199. return $this->error(50021,$exception->getMessage());
  200. }
  201. }
  202. public function getGoodsInventoryLog(Request $request){
  203. $input=$request->all();
  204. $id=$input['id'];
  205. $list=GoodsLog::where('goods_id',$id)->where('type',1)->orderBy('id','desc')->get();
  206. if(count($list)<=0){
  207. $this->error('450001','没有数据');
  208. }
  209. return $this->success($list);
  210. }
  211. //获取商品规格数据
  212. public function getSku($id){
  213. $path=GoodsSku::withTrashed()->find($id)->sku_path;
  214. $arr=explode('/',$path);
  215. $goodsSku=[];
  216. foreach($arr as $k=>$v){
  217. $upSpec=GoodsSpec::withTrashed()->where('id',$v)->first();
  218. $upSpec['uptitle']=GoodsSpec::withTrashed()->where('id',$upSpec->pid)->value('title');
  219. $goodsSku[$upSpec['uptitle']]=$upSpec->title;
  220. }
  221. return $goodsSku;
  222. }
  223. //皇冠库存
  224. public function getCrownInventoryInfo(Request $request){
  225. $input=$request->all();
  226. $page_size=$input['page_size'];
  227. $page_index=$input['page_index'];
  228. $num = ($page_index - 1) * $page_size;
  229. $search_name=$input['search_name'];
  230. $where=[];
  231. $ll=Inventory::with('user:id,nickname,mobile')
  232. ->whereHas('user',function ($query) {
  233. $query->where('level', 3);
  234. })
  235. ->whereHas('user', function (Builder $query) use ($search_name) {
  236. $query->where('nickname', 'like', '%' . $search_name . '%');
  237. $query->orwhere('mobile', 'like', '%' . $search_name . '%');
  238. })
  239. ->where($where)
  240. ->groupBy('user_id','goods_id')
  241. ->get();
  242. if($ll){
  243. $count=sizeof($ll);
  244. }else{
  245. $this->error('400001','没有数据');
  246. }
  247. $list=Inventory::with('user:id,nickname,mobile','goods:id,name')
  248. ->whereHas('user',function ($query) {
  249. $query->where('level', 3);
  250. })
  251. ->whereHas('user', function (Builder $query) use ($search_name) {
  252. $query->where('nickname', 'like', '%' . $search_name . '%');
  253. $query->orwhere('mobile', 'like', '%' . $search_name . '%');
  254. })
  255. ->select('user_id','goods_id')
  256. ->where($where)
  257. ->groupBy('user_id','goods_id')
  258. ->orderBy('user_id','desc')
  259. ->orderBy('goods_id','desc')
  260. ->skip($num)->take($page_size)
  261. ->get();
  262. if(empty($list)){
  263. return $this->error('400002','没有获取到数据');
  264. }
  265. foreach($list as $key=>$val){
  266. $sku= Inventory::where('goods_id',$val['goods_id'])->where('user_id',$val['user_id'])->select('sku_id','total')->get();
  267. foreach($sku as $k=>$v){
  268. $price=GoodsSkuPrice::withTrashed()->where('goods_id',$val['goods_id'])->where('sku_id',$v->sku_id)->where('user_level','3')->value('price');
  269. $sku[$k]->price=$price?$price:0;
  270. $sku[$k]->style=$this->getSku($v->sku_id);
  271. }
  272. $list[$key]->style=$sku;
  273. }
  274. return $this->success_list($list,'success',$count);
  275. }
  276. public function AddDataGood(ZtRequest $request){
  277. // $re=User::where('level',3)->whereNull('deleted_at')->whereNotIn('mobile',['13837111367','15617601787'])->pluck('mobile')->toArray();
  278. // if (in_array(13837111367,$re)){
  279. // dd(1);
  280. // }
  281. // dd(2);
  282. // dump($request->isEmptyString('id'));
  283. // dd($request->inputs('id',2));
  284. $good=Goodtest::where('is_deleted',0)->get();
  285. foreach ($good as $k=>$v){
  286. $num=$v->storage;
  287. // Cache::forget('dwbs_good_num'.$v->id);
  288. // Cache::put('dwbs_good_num'.$v->id,$num,3600*24*7);
  289. $ids=Ordertest::where('created_at','>','2021-08-24 00:00:00')->where('is_deleted',0)->pluck('id');
  290. $nums=Orderdetail::whereIn('order_id',$ids)->where('goods_id',$v->id)->sum('num');
  291. $n=$nums;
  292. dump(Cache::get('dwbs_good_num'.$v->id).'=========='.$v->name.$v->size.'('.$v->id.')'.'======='.$v->storage.'======'.$n);
  293. // dump(Cache::get('dwbs_good_num'.$v->id).'=========='.$v->name.$v->size.'('.$v->id.')'.'======='.$v->storage.'====='.$v->all_storage);
  294. }
  295. // Cache::forever('dwbs_good_num74',500);
  296. // 70
  297. }
  298. public function GetGoodNum(){
  299. $order=Ordertest::where('is_deleted',0)->where('created_at','>','2021-08-04 08:00:00')->pluck('id');
  300. $orders_1=Orderdetail::whereIn('order_id',$order)->where('goods_id',86)->sum('num');
  301. $orders_2=Orderdetail::whereIn('order_id',$order)->where('goods_id',87)->sum('num');
  302. $orders_3=Orderdetail::whereIn('order_id',$order)->where('goods_id',88)->sum('num');
  303. $orders_4=Orderdetail::whereIn('order_id',$order)->where('goods_id',89)->sum('num');
  304. dump($orders_1);
  305. dump($orders_2);
  306. dump($orders_3);
  307. dump($orders_4);
  308. }
  309. }