goods_cat_list(); $this->assign('cat_list',$cat_list); return $this->fetch(); } /** * 添加修改商品分类 * 手动拷贝分类正则 ([\u4e00-\u9fa5/\w]+) ('393','$1'), * select * from tp_goods_category where id = 393 select * from tp_goods_category where parent_id = 393 update tp_goods_category set parent_id_path = concat_ws('_','0_76_393',id),`level` = 3 where parent_id = 393 insert into `tp_goods_category` (`parent_id`,`name`) values ('393','时尚饰品'), */ public function addEditCategory(){ $GoodsLogic = new GoodsLogic(); if(IS_GET) { $goods_category_info = D('GoodsCategory')->where('id='.I('GET.id',0))->find(); $this->assign('goods_category_info',$goods_category_info); $all_type = M('goods_category')->where("level<3")->getField('id,name,parent_id');//上级分类数据集,限制3级分类,那么只拿前两级作为上级选择 if(!empty($all_type)){ $parent_id = empty($goods_category_info) ? I('parent_id',0) : $goods_category_info['parent_id']; $all_type = $GoodsLogic->getCatTree($all_type); $cat_select = $GoodsLogic->exportTree($all_type,0,$parent_id); $this->assign('cat_select',$cat_select); } //$cat_list = M('goods_category')->where("parent_id = 0")->select(); //$this->assign('cat_list',$cat_list); return $this->fetch('_category'); exit; } $GoodsCategory = new GoodsCategory(); // D('GoodsCategory'); // $type = I('id') > 0 ? 2 : 1; // 标识自动验证时的 场景 1 表示插入 2 表示更新 //ajax提交验证 if(I('is_ajax') == 1) { // 数据验证 $validate = \think\Loader::validate('GoodsCategory'); if(!$validate->batch()->check(input('post.'))) { $error = $validate->getError(); $error_msg = array_values($error); $return_arr = array( 'status' => -1, 'msg' => $error_msg[0], 'data' => $error, ); $this->ajaxReturn($return_arr); } else { $GoodsCategory->data(input('post.'),true); // 收集数据 $GoodsCategory->parent_id = I('parent_id'); //查找同级分类是否有重复分类 $par_id = ($GoodsCategory->parent_id > 0) ? $GoodsCategory->parent_id : 0; $sameCateWhere = ['parent_id'=>$par_id , 'name'=>$GoodsCategory['name']]; $GoodsCategory->id && $sameCateWhere['id'] = array('<>' , $GoodsCategory->id); $same_cate = M('GoodsCategory')->where($sameCateWhere)->find(); if($same_cate){ $return_arr = array('status' => 0,'msg' => '同级已有相同分类存在','data' => ''); $this->ajaxReturn($return_arr); } if ($GoodsCategory->id > 0 && $GoodsCategory->parent_id == $GoodsCategory->id) { // 编辑 $return_arr = array('status' => 0,'msg' => '上级分类不能为自己','data' => '',); $this->ajaxReturn($return_arr); } //判断不能为自己的子类 if ($GoodsCategory->id > 0) { $category_id_list = db('goods_category')->where('parent_id',$GoodsCategory->id)->field('id')->select(); $category_id_list = array_column($category_id_list,'id'); if (in_array($GoodsCategory->parent_id,$category_id_list)) { $return_arr = array('status' => 0,'msg' => '上级分类不能为自己的子类','data' => ''); $this->ajaxReturn($return_arr); } } if($GoodsCategory->commission_rate > 100) { // 编辑 $return_arr = array('status' => -1,'msg' => '分佣比例不得超过100%','data' => ''); $this->ajaxReturn($return_arr); } if ($type == 2) { $GoodsCategory->isUpdate(true)->save(); // 写入数据到数据库 $GoodsLogic->refresh_cat(I('id')); } else { $GoodsCategory->save(); // 写入数据到数据库 $insert_id = $GoodsCategory->getLastInsID(); $GoodsLogic->refresh_cat($insert_id); } $return_arr = array( 'status' => 1, 'msg' => '操作成功', 'data' => array('url'=>U('Admin/Goods/categoryList')), ); $this->ajaxReturn($return_arr); } } } /** * 删除分类 */ public function delGoodsCategory(){ $ids = I('post.ids',''); empty($ids) && $this->ajaxReturn(['status' => -1,'msg' =>"非法操作!",'data' =>'']); // 判断子分类 $count = Db::name("goods_category")->where("parent_id = {$ids}")->count("id"); $count > 0 && $this->ajaxReturn(['status' => -1,'msg' =>'该分类下还有分类不得删除!']); // 判断是否存在商品 $goods_count = Db::name('Goods')->where("cat_id = {$ids}")->count('1'); $goods_count > 0 && $this->ajaxReturn(['status' => -1,'msg' =>'该分类下有商品不得删除!']); // 删除分类 DB::name('goods_category')->where('id',$ids)->delete(); $this->ajaxReturn(['status' => 1,'msg' =>'操作成功','url'=>U('Admin/Goods/categoryList')]); } /** * 商品列表 */ public function goodsList(){ $GoodsLogic = new GoodsLogic(); $brandList = $GoodsLogic->getSortBrands(); $categoryList = $GoodsLogic->getSortCategory(); $this->assign('categoryList',$categoryList); $this->assign('brandList',$brandList); return $this->fetch(); } /** * 商品列表 */ public function ajaxGoodsList(){ $where = ' 1 = 1 '; // 搜索条件 I('intro') && $where = "$where and ".I('intro')." = 1" ; I('brand_id') && $where = "$where and brand_id = ".I('brand_id') ; (I('is_on_sale') !== '') && $where = "$where and is_on_sale = ".I('is_on_sale') ; $cat_id = I('cat_id'); // 关键词搜索 $key_word = I('key_word') ? trim(I('key_word')) : ''; if($key_word) { $where = "$where and (goods_name like '%$key_word%' or goods_sn like '%$key_word%')" ; } if($cat_id > 0) { $grandson_ids = getCatGrandson($cat_id); $where .= " and cat_id in(". implode(',', $grandson_ids).") "; // 初始化搜索条件 } $count = M('Goods')->where($where)->count(); $Page = new AjaxPage($count,20); /** 搜索条件下 分页赋值 foreach($condition as $key=>$val) { $Page->parameter[$key] = urlencode($val); } */ $show = $Page->show(); $order_str = "`{$_POST['orderby1']}` {$_POST['orderby2']}"; $goodsList = M('Goods')->where($where)->order($order_str)->limit($Page->firstRow.','.$Page->listRows)->select(); $catList = D('goods_category')->select(); $catList = convert_arr_key($catList, 'id'); $this->assign('catList',$catList); $this->assign('goodsList',$goodsList); $this->assign('page',$show);// 赋值分页输出 return $this->fetch(); } /** * 出入库日志 */ public function stockList() { $ctime = urldecode(I('ctime')); if($ctime){ $gap = explode(' - ', $ctime); $this->assign('start_time',$gap[0]); $this->assign('end_time',$gap[1]); $this->assign('ctime',$gap[0].' - '.$gap[1]); } $logic = new StockLogic(); $res = $logic->getStockList(); $this->assign('pager',$res['pager']); $this->assign('page',$res['page']);// 赋值分页输出 $this->assign('stock_list',$res['stock_list']); $this->assign('stockChangeType', $res['stockChangeType']); return $this->fetch('stock_list'); } /** * 库存预警 */ public function lowStockWarn() { $GoodsLogic = new GoodsLogic(); $brandList = $GoodsLogic->getSortBrands(); $categoryList = $GoodsLogic->getSortCategory(); $this->assign('categoryList',$categoryList); $this->assign('brandList',$brandList); return $this->fetch(); } /** * 库存预警(获取列表) */ public function ajaxLowStockWarn() { $logic = new StockLogic(); $res = $logic->getAjaxLowStockWarn(); $this->assign('pager',$res['pager']); $this->assign('page',$res['page']);// 赋值分页输出 $this->assign('catList',$res['catList']); $this->assign('brand_list',$res['brand_list']); $this->assign('goodsList',$res['goodsList']); return $this->fetch('ajaxAlterStock'); } /** * 库存盘点 */ public function alterStock() { $GoodsLogic = new GoodsLogic(); $brandList = $GoodsLogic->getSortBrands(); $categoryList = $GoodsLogic->getSortCategory(); $this->assign('categoryList',$categoryList); $this->assign('brandList',$brandList); return $this->fetch(); } /** * 库存盘点(ajax获取库存列表) */ public function ajaxAlterStock() { $logic = new StockLogic(); $res = $logic->getAjaxAlterStock(); $this->assign('pager',$res['pager']); $this->assign('page',$res['page']);// 赋值分页输出 $this->assign('catList',$res['catList']); $this->assign('brand_list',$res['brand_list']); $this->assign('goodsList',$res['goodsList']); return $this->fetch(); } /** * 库存盘点(快速修改库存) */ public function changeStockVal() { $logic = new StockLogic(); $res = $logic->doChangeStockVal($this->admin_id); //传入admin_id用于记录stock_log ajaxReturn($res); } /** * 添加修改商品 */ public function addEditGoods() { $GoodsLogic = new GoodsLogic(); $Goods = new \app\common\model\Goods(); $goods_id = input('id'); if($goods_id){ $goods = $Goods->where('goods_id', $goods_id)->find(); $level_cat = $GoodsLogic->find_parent_cat($goods['cat_id']); // 获取分类默认选中的下拉框 $level_cat2 = $GoodsLogic->find_parent_cat($goods['extend_cat_id']); // 获取分类默认选中的下拉框 $brandList = $GoodsLogic->getSortBrands($goods['cat_id']); //获取三级分类下的全部品牌 $this->assign('goods', $goods); $this->assign('level_cat', $level_cat); $this->assign('level_cat2', $level_cat2); $this->assign('brandList', $brandList); } $cat_list = Db::name('goods_category')->where("parent_id = 0")->select(); // 已经改成联动菜单 $goodsType = Db::name("GoodsType")->select(); $suppliersList = Db::name("suppliers")->where(['is_check'=>1])->select(); $freight_template = Db::name('freight_template')->where('')->select(); $this->assign('freight_template',$freight_template); $this->assign('suppliersList', $suppliersList); $this->assign('cat_list', $cat_list); $this->assign('goodsType', $goodsType); return $this->fetch('_goods'); } //商品保存 public function save(){ $data = input('post.'); $spec_item = input('item/a'); $validate = Loader::validate('Goods');// 数据验证 if (!$validate->batch()->check($data)) { $error = $validate->getError(); $error_msg = array_values($error); $return_arr = ['status' => 0, 'msg' => $error_msg[0], 'result' => $error]; $this->ajaxReturn($return_arr); } if ($data['goods_id'] > 0) { $goods = \app\common\model\Goods::get($data['goods_id']); $store_count_change_num = $data['store_count'] - $goods['store_count'];//库存变化量 $cart_update_data = ['market_price'=>$data['market_price'],'goods_price'=>$data['shop_price'],'member_goods_price'=>$data['shop_price']]; db('cart')->where(['goods_id'=>$data['goods_id'],'spec_key'=>''])->save($cart_update_data); //编辑商品的时候需清楚缓存避免图片失效问题 clearCache(); }else{ $goods = new \app\common\model\Goods(); $store_count_change_num = $data['store_count']; } $goods->data($data, true); $goods->last_update = time(); $goods->price_ladder = true; $goods->save(); if(empty($spec_item)){ update_stock_log(session('admin_id'), $store_count_change_num, ['goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name']]);//库存日志 } $GoodsLogic = new GoodsLogic(); $GoodsLogic->afterSave($goods['goods_id']); $GoodsLogic->saveGoodsAttr($goods['goods_id'], $goods['goods_type']); // 处理商品 属性 $return_arr = ['status' => 1, 'msg' => '操作成功']; $this->ajaxReturn($return_arr); } public function getCategoryBrandList(){ $cart_id = I('cart_id/d',0); $GoodsLogic = new GoodsLogic(); $brandList = $GoodsLogic->getSortBrands($cart_id); $this->ajaxReturn(['status'=>1,'result'=>$brandList]); } /** * 商品类型 用于设置商品的属性 */ public function type_list() { $name = input('name/s'); $where = []; if ($name) { $where['name'] = ['like','%'.$name.'%']; } $GoodsType = new GoodsType(); $count = $GoodsType->where($where)->count(); $page = new Page($count, 14); $goods_type_list = $GoodsType->where($where)->order("id desc")->limit($page->firstRow . ',' . $page->listRows)->select(); $this->assign('page', $page); $this->assign('goods_type_list', $goods_type_list); return $this->fetch(); } //商品模型编辑页 public function type() { $id = input('id/d'); if($id){ $goods_type = GoodsType::get(['id'=>$id]); $this->assign('goods_type', $goods_type); } return $this->fetch(); } //商品模型保存 public function saveType() { $data = input('post.'); $validate = Loader::validate('GoodsType');// 数据验证 if (!$validate->batch()->check($data)) { $error = $validate->getError(); $error_msg = array_values($error); $this->ajaxReturn(['status' => 0, 'msg' => $error_msg[0], 'result' => $error]); } if ($data['id'] > 0) { $goodsType = GoodsType::get($data['id']); }else{ $goodsType = new GoodsType(); } try{ $goodsType->data($data, true)->save(); $this->ajaxReturn(['status' => 1, 'msg' => '操作成功','type_id'=>$goodsType->id]); }catch (TpshopException $t){ $error = $t->getErrorArr(); $this->ajaxReturn(['status' => 1, 'msg' => $error[0]]); } } //删除商品模型 public function deleteType() { $id = input('id/d'); if(empty($id)){ $this->ajaxReturn(['status' => 0, 'msg' => '参数错误']); } $GoodsType = new GoodsType(); $goods_type = $GoodsType->where(['id'=>$id])->find(); try { $goods_type->delete(); $this->ajaxReturn(['status' => 1, 'msg' => '删除成功']); } catch (TpshopException $t) { $error = $t->getErrorArr(); $this->ajaxReturn($error); } $this->ajaxReturn(['status' => 1, 'msg' => '删除成功']); } //删除规格项 public function deleteSpe() { $id = input('id/d'); if (empty($id)) { $this->ajaxReturn(['status' => 0, 'msg' => '参数错误']); } $Spec = new Spec(); $spec = $Spec->where('id', $id)->find(); try { $spec->delete(); $this->ajaxReturn(['status' => 1, 'msg' => '删除成功']); } catch (TpshopException $t) { $error = $t->getErrorArr(); $this->ajaxReturn($error); } } //删除规格值 public function deleteSpeItem() { $id = input('id/d'); if (empty($id)) { $this->ajaxReturn(['status' => 0, 'msg' => '参数错误']); } $SpeItem = new SpecItem(); $spec_item = $SpeItem->where('id', $id)->find(); try{ $spec_item->delete(); $this->ajaxReturn(['status' => 1, 'msg' => '删除成功']); }catch (TpshopException $t){ $error = $t->getErrorArr(); $this->ajaxReturn($error); } } //删除属性 public function deleteAttribute() { $attr_id = input('attr_id/d'); if (empty($attr_id)) { $this->ajaxReturn(['status' => 0, 'msg' => '参数错误']); } $GoodsAttribute = new GoodsAttribute(); $goods_attribute = $GoodsAttribute->where('attr_id', $attr_id)->find(); try { $goods_attribute->delete(); $this->ajaxReturn(['status' => 1, 'msg' => '删除成功']); } catch (TpshopException $t) { $error = $t->getErrorArr(); $this->ajaxReturn($error); } } /** * 更改指定表的指定字段 */ public function updateField(){ $primary = array( 'goods' => 'goods_id', 'goods_category' => 'id', 'brand' => 'id', 'goods_attribute' => 'attr_id', 'ad' =>'ad_id', ); $model = D($_POST['table']); $model->$primary[$_POST['table']] = $_POST['id']; $model->$_POST['field'] = $_POST['value']; $model->save(); $return_arr = array( 'status' => 1, 'msg' => '操作成功', ); $this->ajaxReturn($return_arr); } /** * 动态获取商品属性输入框 根据不同的数据返回不同的输入框类型 */ public function ajaxGetAttrInput() { $type_id = input('type_id/d', 0); $goods_id = input('goods_id/d', 0); $GoodsAttribute = new GoodsAttribute(); $attribute_list = $GoodsAttribute->where(['type_id' => $type_id,'attr_index'=>1])->order('`order` desc')->select(); if ($attribute_list) { $attribute_list = collection($attribute_list)->append(['attr_values_to_array'])->toArray(); } $GoodsAttr = new GoodsAttr(); foreach ($attribute_list as $attribute_key => $attribute_val) { $goods_attr = $GoodsAttr->where(['goods_id' => $goods_id, 'attr_id' => $attribute_val['attr_id']])->find(); $attribute_list[$attribute_key]['goods_attr'] = $goods_attr; } $this->ajaxReturn($attribute_list); } /** * 删除商品 */ public function delGoods() { $ids = I('post.ids',''); empty($ids) && $this->ajaxReturn(['status' => -1,'msg' =>"非法操作!",'data' =>'']); $goods_ids = rtrim($ids,","); // 判断此商品是否有订单 $ordergoods_count = Db::name('OrderGoods')->whereIn('goods_id',$goods_ids)->group('goods_id')->getField('goods_id',true); if($ordergoods_count) { $goods_count_ids = implode(',',$ordergoods_count); $this->ajaxReturn(['status' => -1,'msg' =>"ID为【{$goods_count_ids}】的商品有订单,不得删除!",'data' =>'']); } // 商品团购 $groupBuy_goods = M('group_buy')->whereIn('goods_id',$goods_ids)->group('goods_id')->getField('goods_id',true); if($groupBuy_goods) { $groupBuy_goods_ids = implode(',',$groupBuy_goods); $this->ajaxReturn(['status' => -1,'msg' =>"ID为【{$groupBuy_goods_ids}】的商品有团购,不得删除!",'data' =>'']); } //删除用户收藏商品记录 M('GoodsCollect')->whereIn('goods_id',$goods_ids)->delete(); // 删除此商品 M("Goods")->whereIn('goods_id',$goods_ids)->delete(); //商品表 M("cart")->whereIn('goods_id',$goods_ids)->delete(); // 购物车 M("comment")->whereIn('goods_id',$goods_ids)->delete(); //商品评论 M("goods_consult")->whereIn('goods_id',$goods_ids)->delete(); //商品咨询 M("goods_images")->whereIn('goods_id',$goods_ids)->delete(); //商品相册 M("spec_goods_price")->whereIn('goods_id',$goods_ids)->delete(); //商品规格 M("spec_image")->whereIn('goods_id',$goods_ids)->delete(); //商品规格图片 M("goods_attr")->whereIn('goods_id',$goods_ids)->delete(); //商品属性 M("goods_collect")->whereIn('goods_id',$goods_ids)->delete(); //商品收藏 $this->ajaxReturn(['status' => 1,'msg' => '操作成功','url'=>U("Admin/goods/goodsList")]); } /** * 品牌列表 */ public function brandList(){ $keyword = I('keyword'); $where = $keyword ? " name like '%$keyword%' " : ""; $count = Db::name("Brand")->where($where)->count(); $Page = $pager = new Page($count,10); $brandList = Db::name("Brand")->where($where)->order("sort desc")->limit($Page->firstRow.','.$Page->listRows)->select(); $show = $Page->show(); $cat_list = M('goods_category')->where("parent_id = 0")->getField('id,name'); // 已经改成联动菜单 $this->assign('cat_list',$cat_list); $this->assign('pager',$pager); $this->assign('show',$show); $this->assign('brandList',$brandList); return $this->fetch('brandList'); } /** * 添加修改编辑 商品品牌 */ public function addEditBrand() { $id = I('id'); if (IS_POST) { $data = I('post.'); $brandVilidate = Loader::validate('Brand'); if (!$brandVilidate->batch()->check($data)) { $return = ['status' => 0, 'msg' => '操作失败', 'result' => $brandVilidate->getError()]; $this->ajaxReturn($return); } if ($id) { Db::name("Brand")->update($data); } else { Db::name("Brand")->insert($data); } $this->ajaxReturn(['status' => 1, 'msg' => '操作成功', 'result' => '']); } $cat_list = M('goods_category')->where("parent_id = 0")->select(); // 已经改成联动菜单 $this->assign('cat_list', $cat_list); $brand = M("Brand")->find($id); $this->assign('brand', $brand); return $this->fetch('_brand'); } /** * 删除品牌 */ public function delBrand() { $ids = I('post.ids',''); empty($ids) && $this->ajaxReturn(['status' => -1,'msg' => '非法操作!']); $brind_ids = rtrim($ids,","); // 判断此品牌是否有商品在使用 $goods_count = Db::name('Goods')->whereIn("brand_id",$brind_ids)->group('brand_id')->getField('brand_id',true); $use_brind_ids = implode(',',$goods_count); if($goods_count) { $this->ajaxReturn(['status' => -1,'msg' => 'ID为【'.$use_brind_ids.'】的品牌有商品在用不得删除!','data' =>'']); } $res=Db::name('Brand')->whereIn('id',$brind_ids)->delete(); if($res){ $this->ajaxReturn(['status' => 1,'msg' => '操作成功','url'=>U("Admin/goods/brandList")]); } $this->ajaxReturn(['status' => -1,'msg' => '操作失败','data' =>'']); } /** * 动态获取商品规格选择框 根据不同的数据返回不同的选择框 */ public function ajaxGetSpecSelect() { $goods_id = input('goods_id/d', 0); $type_id = input('type_id/d', 0); $specList = db('Spec')->where("type_id", $type_id)->order('`order` desc')->select(); foreach ($specList as $k => $v) $specList[$k]['spec_item'] = db('SpecItem')->where("spec_id = " . $v['id'])->order('id')->getField('id,item'); // 获取规格项 $items_id = db('SpecGoodsPrice')->where('goods_id', $goods_id)->getField("GROUP_CONCAT(`key` SEPARATOR '_') AS items_id"); $items_ids = explode('_', $items_id); // 获取商品规格图片 if ($goods_id) { $specImageList = db('spec_image')->where("goods_id", $goods_id)->getField('spec_image_id,src'); $this->assign('specImageList', $specImageList); } $this->assign('items_ids', $items_ids); $this->assign('specList', $specList); return $this->fetch('ajax_spec_select'); } /** * 动态获取商品规格输入框 根据不同的数据返回不同的输入框 */ public function ajaxGetSpecInput(){ $GoodsLogic = new GoodsLogic(); $goods_id = I('goods_id/d') ? I('goods_id/d') : 0; $str = $GoodsLogic->getSpecInput($goods_id ,I('post.spec_arr/a',[[]])); exit($str); } /** * 删除商品相册图 */ public function del_goods_images() { $path = I('filename',''); M('goods_images')->where("image_url = '$path'")->delete(); } /** * 初始化商品关键词搜索 */ public function initGoodsSearchWord(){ $searchWordLogic = new SearchWordLogic(); $successNum = $searchWordLogic->initGoodsSearchWord(); $this->success('成功初始化'.$successNum.'个搜索关键词'); } /** * 初始化地址json文件 */ public function initLocationJsonJs() { $goodsLogic = new GoodsLogic(); $region_list = $goodsLogic->getRegionList();//获取配送地址列表 $area_list = $goodsLogic->getAreaList(); $data = "var locationJsonInfoDyr = ".json_encode($region_list, JSON_UNESCAPED_UNICODE).';'."var areaListDyr = ".json_encode($area_list, JSON_UNESCAPED_UNICODE).';'; file_put_contents(ROOT_PATH."public/js/locationJson.js", $data); $this->success('初始化地区json.js成功。文件位置为'.ROOT_PATH."public/js/locationJson.js"); } /** * 获取商品模型下拉列表 */ public function ajaxGetGoodsTypeList($type_id) { $GoodsType = new GoodsType(); $goods_type = $GoodsType->select(); $html = '