GoodsclassController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <?php
  2. /**
  3. * 商品分类列表
  4. */
  5. namespace app\admin\controller;
  6. use cmf\controller\AdminBaseController;
  7. use think\facade\Db;
  8. class GoodsclassController extends AdminbaseController {
  9. function index(){
  10. $lists = Db::name("shop_goods_class")
  11. ->where("gc_parentid=0")
  12. ->order("gc_sort,gc_id")
  13. ->paginate(5);
  14. $lists->each(function($v,$k){
  15. //获取二级分类
  16. $two_list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en,gc_isshow,gc_sort,gc_icon,gc_addtime,gc_edittime")->where("gc_parentid={$v['gc_id']}")->order("gc_sort")->select()->toArray();
  17. if($two_list){
  18. foreach ($two_list as $k1 => $v1) {
  19. //查询三级分类
  20. $three_list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en,gc_isshow,gc_sort,gc_icon,gc_addtime,gc_edittime")->where("gc_parentid={$v1['gc_id']}")->order("gc_sort")->select()->toArray();
  21. if(!$three_list){
  22. $three_list=[];
  23. }
  24. $two_list[$k1]['gc_icon']=get_upload_path($v1['gc_icon']);
  25. $two_list[$k1]['three_list']=$three_list;
  26. }
  27. }
  28. $v['gc_icon']= $v['gc_icon']?get_upload_path( $v['gc_icon']):'';
  29. $v['two_list']=$two_list;
  30. return $v;
  31. });
  32. /*var_dump($lists);
  33. die;*/
  34. $page = $lists->render();
  35. $this->assign('lists', $lists);
  36. $this->assign("page", $page);
  37. return $this->fetch();
  38. }
  39. /*
  40. * 商品分类添加
  41. *@return lists 商品分类列表
  42. *@return lists['two_list'] 商品二级分类列表
  43. */
  44. function add(){
  45. //获取后台要用的缓存列表
  46. $lists=getcaches("adminGoodsClass");
  47. $one_nums=getcaches("adminGC_oneNums");
  48. $lists=false;
  49. if(!$lists){
  50. $info=$this->getAdminClassList();
  51. $lists=$info['lists'];
  52. $one_nums=$info['one_nums'];
  53. $this->resetAdminCache($lists,$one_nums);
  54. }
  55. $this->assign('lists',$lists);
  56. $this->assign('one_nums',$one_nums);
  57. return $this->fetch();
  58. }
  59. /*
  60. * 商品分类添加保存
  61. *@request gc_parentid 上一级商品分类,作为一级是为0
  62. *@request gc_name 商品分类名称,30字符以内
  63. */
  64. function addPost(){
  65. $data=$this->request->param();
  66. $gc_name=$data['gc_name'];
  67. $gc_parentid=$data['gc_parentid'];
  68. $gc_sort=$data['gc_sort'];
  69. if(!$gc_name){
  70. $this->error("请填写分类名称");
  71. }
  72. if(mb_strlen($gc_name)>30){
  73. $this->error("分类名称在30字符以内");
  74. }
  75. //判断分类名称是否重复 lic
  76. // $isexist=Db::name("shop_goods_class")->where("gc_name='{$gc_name}'")->find();
  77. // if($isexist){
  78. // $this->error("分类名称已经存在");
  79. // }
  80. if($gc_sort==''){
  81. $this->error("请填写分类排序号");
  82. }
  83. if($gc_sort<0){
  84. $this->error("分类排序号必须是整数");
  85. }
  86. if($gc_sort>999999){
  87. $this->error("分类排序号应是0-999999之间的整数");
  88. }
  89. if(floor($gc_sort)!=$gc_sort){
  90. $this->error("分类排序号应是0-999999之间的整数");
  91. }
  92. $data['gc_one_id']=0;
  93. $data['gc_grade']=1;
  94. //判断用户选择的上级分类是否是一级
  95. if($gc_parentid){
  96. //获取该分类的一级分类
  97. $two_info=Db::name("shop_goods_class")->where("gc_id={$gc_parentid}")->find();
  98. if(!$two_info['gc_parentid']){ //添加的为二级分类
  99. //判断有没有上传图标
  100. /*$gc_icon=$data['gc_icon'];
  101. if(empty($gc_icon)){
  102. $this->error("请填写上传分类图片");
  103. }*/
  104. $data['gc_one_id']=$two_info['gc_id'];
  105. $data['gc_grade']=2;
  106. }else{
  107. $data['gc_one_id']=$two_info['gc_one_id'];
  108. $data['gc_grade']=3;
  109. }
  110. }
  111. $data['gc_addtime']=time();
  112. $result=Db::name("shop_goods_class")->insert($data);
  113. if(!$result){
  114. $this->error("分类添加失败");
  115. }
  116. $action="添加商品分类:{$result}";
  117. setAdminLog($action);
  118. $this->resetAdminCache();
  119. $this->resetCache();
  120. $this->resetOneCache();
  121. $this->resetTwoCache();
  122. $this->success("分类添加成功");
  123. }
  124. /*
  125. * 商品分类编辑
  126. *@request 上一级商品分类,作为一级是为0
  127. */
  128. function edit(){
  129. $id = $this->request->param('id', 0, 'intval');
  130. //获取后台要用的缓存列表
  131. $lists=getcaches("adminGoodsClass");
  132. $one_nums=getcaches("adminGC_oneNums");
  133. if(!$lists){
  134. $info=$this->getAdminClassList();
  135. $lists=$info['lists'];
  136. $one_nums=$info['one_nums'];
  137. $this->resetAdminCache($lists,$one_nums);
  138. }
  139. //获取该分类的信息
  140. $info=Db::name("shop_goods_class")->where("gc_id={$id}")->find();
  141. $gc_grade=$info['gc_grade'];
  142. if($gc_grade==1){
  143. foreach ($lists as $k => $v) {
  144. if($v['gc_id']==$id){
  145. unset($lists[$k]);
  146. break;
  147. }
  148. }
  149. }
  150. if($gc_grade==2){
  151. $gc_parentid=$info['gc_parentid'];
  152. foreach ($lists as $k => $v) {
  153. if($v['gc_id']==$gc_parentid){
  154. foreach ($v['two_list'] as $k1 => $v1) {
  155. if($v1['gc_id']==$id){
  156. unset($lists[$k]['two_list'][$k1]);
  157. break;
  158. }
  159. }
  160. }
  161. }
  162. }
  163. $this->assign("lists",$lists);
  164. $this->assign("one_nums",$one_nums);
  165. $this->assign("info",$info);
  166. return $this->fetch();
  167. }
  168. /*
  169. * 商品分类编辑保存
  170. *@request gc_id 分类id
  171. *@request gc_parentid 上级分类id
  172. *@request gc_name 分类名称
  173. *@request gc_isshow 分类是否显示
  174. *@request gc_sort 分类排序号
  175. */
  176. function editPost(){
  177. $data = $this->request->param();
  178. $gc_id=$data['gc_id'];
  179. $gc_parentid=$data['gc_parentid'];
  180. $gc_isshow=$data['gc_isshow'];
  181. $gc_sort=$data['gc_sort'];
  182. //根据id获取信息
  183. $info=Db::name("shop_goods_class")->where("gc_id={$gc_id}")->find();
  184. $gc_grade=$info['gc_grade'];
  185. //选择上级作为一级分类
  186. if($gc_parentid==0){
  187. if($gc_grade==2){ //当前分类是二级分类
  188. //将该分类下的三级分类的一级分类id修改为当前分类id
  189. Db::name("shop_goods_class")->where("gc_parentid={$gc_id}")->update(array("gc_one_id"=>$gc_id,"gc_grade"=>2,"gc_edittime"=>time()));
  190. }
  191. $data['gc_one_id']=0;
  192. $data['gc_grade']=1;
  193. }else{
  194. //判断选择的上级分类信息
  195. $parent_info=Db::name("shop_goods_class")->where("gc_id={$gc_parentid}")->find();
  196. $parent_grade=$parent_info['gc_grade'];
  197. //判断选择的上级
  198. switch ($parent_grade) {
  199. case 1: //上级为一级分类【当前分类设置为二级分类】
  200. if($gc_grade==1){ //当前分类为一级
  201. //判断该分类下是否有三级
  202. $three_info=Db::name("shop_goods_class")->where("gc_grade=3 and gc_one_id={$gc_id}")->find();
  203. if($three_info){
  204. $this->error("该分类的下级分类超过两级,不可重新指定上级分类");
  205. }
  206. //将该分类下的二级分类更改为三级分类信息
  207. Db::name("shop_goods_class")->where("gc_parentid={$gc_id}")->update(array("gc_grade"=>3,"gc_one_id"=>$gc_parentid,"gc_edittime"=>time()));
  208. }else if($gc_grade==2){ //当前分类为二级
  209. //将该分类下的三级分类信息变更信息
  210. Db::name("shop_goods_class")->where("gc_parentid={$gc_id}")->update(array("gc_one_id"=>$gc_parentid,"gc_edittime"=>time()));
  211. }
  212. $data['gc_grade']=2;
  213. $data['gc_one_id']=$gc_parentid;
  214. break;
  215. case 2://上级为二级分类【当前分类设置为三级分类】
  216. if($gc_grade==1 || $gc_grade==2){ //当前分类为一级或二级
  217. //判断当前分类下是否有分类
  218. $info=Db::name("shop_goods_class")->where("gc_parentid={$gc_id}")->find();
  219. if($info){
  220. $this->error("该分类下有分类,不可重新指定上级分类");
  221. }
  222. }
  223. $data['gc_grade']=3;
  224. $data['gc_one_id']=$parent_info['gc_one_id'];
  225. break;
  226. }
  227. }
  228. /*if($data['gc_grade']==2){
  229. //当是二级分类时,判断有没有上传图标
  230. $gc_icon=$data['gc_icon'];
  231. if(empty($gc_icon)){
  232. $this->error("请填写上传分类图片");
  233. }
  234. }*/
  235. if($gc_sort==''){
  236. $this->error("请填写分类排序号");
  237. }
  238. if($gc_sort<0){
  239. $this->error("分类排序号必须是整数");
  240. }
  241. if($gc_sort>999999){
  242. $this->error("分类排序号应是0-999999之间的整数");
  243. }
  244. if(floor($gc_sort)!=$gc_sort){
  245. $this->error("分类排序号应是0-999999之间的整数");
  246. }
  247. //更新当前分类信息
  248. $data['gc_edittime']=time();
  249. unset($data['gc_icon_old']);
  250. $result=Db::name("shop_goods_class")->update($data);
  251. if(!$result){
  252. $this->error("更新失败");
  253. }
  254. //将用户经营类目状态更改为不显示
  255. $status_data=array("status"=>0);
  256. if($gc_isshow){
  257. $status_data=array("status"=>1);
  258. }
  259. Db::name("seller_goods_class")->where("goods_classid={$gc_id}")->update($status_data);
  260. $this->resetAdminCache();
  261. $this->resetCache();
  262. $this->resetOneCache();
  263. $this->resetTwoCache();
  264. $action="编辑商品分类:{$gc_id}";
  265. setAdminLog($action);
  266. $this->success("商品分类更新成功");
  267. }
  268. /*
  269. * 商品分类排序
  270. *@request list_orders 排序号
  271. */
  272. function listOrder(){
  273. $ids = $this->request->post("list_orders/a");
  274. if(!empty($ids)){
  275. foreach ($ids as $k => $v) {
  276. $data['gc_sort'] = $v;
  277. Db::name("shop_goods_class")->where(array("gc_id"=>$k))->update($data);
  278. }
  279. }
  280. $action="更新商品分类排序";
  281. setAdminLog($action);
  282. $this->resetAdminCache();
  283. $this->resetCache();
  284. $this->resetOneCache();
  285. $this->resetTwoCache();
  286. $this->success("排序更新成功!");
  287. }
  288. /*
  289. * 商品分类删除
  290. *@request id 商品分类id
  291. */
  292. function del(){
  293. $id = $this->request->param('id', 0, 'intval');
  294. //判断是否有下级分类
  295. $info=Db::name("shop_goods_class")->where("gc_parentid={$id}")->find();
  296. if($info){
  297. $this->error("请先删除下级分类或将下级分类移至其他分类下再删除");
  298. }
  299. $rs = DB::name('shop_goods_class')->where("gc_id={$id}")->delete();
  300. if(!$rs){
  301. $this->error("删除失败!");
  302. }
  303. //删除用户经营类目
  304. Db::name("seller_goods_class")->where("goods_classid={$id}")->delete();
  305. $action="删除商品分类:{$id}";
  306. setAdminLog($action);
  307. $this->resetAdminCache();
  308. $this->resetCache();
  309. $this->resetOneCache();
  310. $this->resetTwoCache();
  311. $this->success("删除成功!");
  312. }
  313. /*
  314. * 商品分类获取
  315. */
  316. protected function getAdminClassList(){
  317. //获取一级分类
  318. $lists=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_grade")->where("gc_parentid=0")->order("gc_sort")->select()->toArray();
  319. $one_nums=0;
  320. foreach ($lists as $k => $v) {
  321. //获取二级分类
  322. $two_list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_grade")->where("gc_parentid={$v['gc_id']}")->order("gc_sort")->select()->toArray();
  323. if(!$two_list){
  324. $two_list=[];
  325. }
  326. $lists[$k]['two_list']=$two_list;
  327. $one_nums++;
  328. }
  329. return array(
  330. "lists"=>$lists,
  331. "one_nums"=>$one_nums
  332. );
  333. }
  334. /*
  335. * 将后台的商品分类缓存列表存入redis
  336. */
  337. protected function resetAdminCache($lists=array(),$one_nums=''){
  338. if((!$lists) || (!$one_nums)){
  339. $data=$this->getAdminClassList();
  340. $lists=$data['lists'];
  341. $one_nums=$data['one_nums'];
  342. }
  343. setcaches("adminGoodsClass",$lists);
  344. setcaches("adminGC_oneNums",$one_nums);
  345. }
  346. /*
  347. * 将商品分类缓存列表存入redis【只查询显示的分类】
  348. */
  349. protected function resetCache(){
  350. //获取一级分类
  351. $lists=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en")->where("gc_parentid=0 and gc_isshow=1")->order("gc_sort")->select()->toArray();
  352. foreach ($lists as $k => $v) {
  353. //获取二级分类
  354. $two_list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en")->where("gc_parentid={$v['gc_id']} and gc_isshow=1")->order("gc_sort")->select()->toArray();
  355. if($two_list){
  356. foreach ($two_list as $k1 => $v1) {
  357. //查询三级分类
  358. $three_list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en")->where("gc_parentid={$v1['gc_id']} and gc_isshow=1")->order("gc_sort")->select()->toArray();
  359. if(!$three_list){
  360. $three_list=[];
  361. }
  362. $two_list[$k1]['three_list']=$three_list;
  363. }
  364. }
  365. $lists[$k]['two_list']=$two_list;
  366. }
  367. setcaches("goodsClass",$lists);
  368. }
  369. /*
  370. * 将商品一级分类缓存列表存入redis【只查询有三级分类 且状态为显示的分类】
  371. */
  372. public function resetOneCache(){
  373. $list1=Db::name("shop_goods_class")->field("gc_one_id")->where("gc_grade=3")->select()->toArray();
  374. if(!$list1){
  375. return !1;
  376. }
  377. $gc_one_ids=array_column($list1,"gc_one_id");
  378. $ids=array_unique($gc_one_ids);
  379. $map['gc_isshow']=1;
  380. $list=Db::name("shop_goods_class")->field("gc_id,gc_name,gc_name_en,gc_isshow")->where($map)->where('gc_id','in',$ids)->order("gc_sort")->select()->toArray();
  381. setcaches("oneGoodsClass",$list);
  382. }
  383. //商品二级分类缓存列表存入redis--用于app商城模块展示
  384. public function resetTwoCache(){
  385. $map['gc_isshow']=1;
  386. $map['gc_grade']=2;
  387. $list=Db::name("shop_goods_class")
  388. ->field("gc_id,gc_name,gc_name_en,gc_icon")
  389. ->where($map)
  390. ->order("gc_sort")
  391. ->select()
  392. ->toArray();
  393. foreach($list as $k=>$v){
  394. $key2="threeGoodsClass_".$v['gc_id'];
  395. $list2=Db::name("shop_goods_class")
  396. ->field("gc_id,gc_name,gc_name_en")
  397. ->where("gc_isshow=1 and gc_grade=3 and gc_parentid={$v['gc_id']}")
  398. ->order("gc_sort")
  399. ->select()
  400. ->toArray();
  401. if($list2){
  402. setcaches($key2,$list2);
  403. }
  404. }
  405. setcaches("twoGoodsClass",$list);
  406. }
  407. }