From cab7164f65c406a75effe510c1c05205b7ffbeb4 Mon Sep 17 00:00:00 2001 From: liaofei <136327134@qq.com> Date: Thu, 16 May 2019 14:27:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=90=8E=E5=8F=B0=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E7=AD=89=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/common.php | 15 + application/admin/controller/Index.php | 18 +- .../admin/controller/agent/AgentManage.php | 4 +- .../admin/controller/article/Article.php | 2 +- .../admin/controller/article/WechatNews.php | 186 +++ .../admin/controller/finance/UserRecharge.php | 6 +- .../admin/controller/order/StoreOrder.php | 601 ++++++++- .../controller/setting/SystemGroupData.php | 10 +- .../admin/controller/store/StoreProduct.php | 84 +- .../controller/store/StoreProductReply.php | 26 + .../controller/system/SystemAttachment.php | 3 - .../controller/system/SystemCleardata.php | 144 ++- .../controller/system/SystemDatabackup.php | 2 +- .../admin/controller/ump/StoreCoupon.php | 10 +- .../admin/controller/ump/UserPoint.php | 3 + .../admin/controller/user/UserLevel.php | 335 +++++ application/admin/controller/wechat/Menus.php | 2 +- application/admin/controller/wechat/Reply.php | 19 +- .../controller/wechat/WechatNewsCategory.php | 4 +- .../controller/wechat/WechatTemplate.php | 15 +- .../admin/controller/wechat/WechatUser.php | 399 +++++- application/admin/model/article/Article.php | 154 ++- .../admin/model/finance/FinanceModel.php | 2 +- application/admin/model/order/StoreOrder.php | 306 +++-- .../admin/model/record/StoreStatistics.php | 40 +- .../admin/model/routine/RoutineFormId.php | 2 +- .../admin/model/store/StoreCategory.php | 4 +- .../model/store/StoreProductAttrValue.php | 8 + .../admin/model/store/StoreProductReply.php | 50 + application/admin/model/system/Express.php | 2 +- .../model/system/SystemAttachmentType.php | 51 + .../admin/model/system/SystemConfig.php | 283 ++++- .../admin/model/system/SystemGroupData.php | 5 + .../admin/model/system/SystemUserLevel.php | 53 + .../admin/model/system/SystemUserTask.php | 136 +++ .../admin/model/ump/StoreCouponIssue.php | 4 +- application/admin/model/user/User.php | 1078 ++++++++++++++++- application/admin/model/user/UserExtract.php | 39 +- application/admin/model/user/UserLevel.php | 54 + application/admin/model/user/UserRecharge.php | 13 +- .../admin/model/user/UserTaskFinish.php | 29 + .../admin/model/wechat/WechatQrcode.php | 2 +- .../admin/model/wechat/WechatReply.php | 8 +- application/admin/model/wechat/WechatUser.php | 12 +- .../admin/view/agent/agent_manage/index.php | 11 +- .../admin/view/finance/finance/bill.php | 2 +- .../admin/view/finance/finance/bill1.php | 58 + .../view/finance/finance/content_info.php | 4 +- application/admin/view/index/index.php | 6 +- .../admin/view/order/store_order/index.php | 64 +- application/admin/view/public/container.php | 3 +- .../admin/view/public/form-builder.php | 12 +- application/admin/view/public/frame_head.php | 1 - application/admin/view/public/head.php | 2 +- application/admin/view/public/layui.php | 22 + .../view/record/record/chart_bargain.php | 75 +- .../admin/view/record/record/chart_cash.php | 52 +- .../view/record/record/chart_combination.php | 48 + .../admin/view/record/record/chart_coupon.php | 14 + .../admin/view/record/record/chart_order.php | 54 +- .../view/record/record/chart_product.php | 52 +- .../admin/view/record/record/chart_rebate.php | 56 +- .../view/record/record/chart_recharge.php | 52 +- .../admin/view/record/record/chart_score.php | 14 + .../view/record/record/chart_seckill.php | 48 + .../admin/view/record/record/product_info.php | 15 + .../admin/view/record/record/user_attr.php | 52 +- .../record/record/user_business_chart.php | 48 + .../admin/view/record/record/user_chart.php | 74 ++ .../record/record/user_distribution_chart.php | 48 + .../view/setting/system_group/create.php | 1 + .../admin/view/setting/system_role/index.php | 17 + .../admin/view/store/store_product/attr.php | 2 +- .../view/store/store_product/statistics.php | 4 +- .../view/store/store_product_reply/index.php | 457 ++++--- .../view/system/system_file/openfile.php | 4 +- .../admin/view/system/system_notice/index.php | 93 ++ .../view/system/system_notice/message.php | 225 ++++ .../system/system_upgradeclient/index.php | 22 +- .../admin/view/ump/store_coupon/grant.php | 2 +- .../admin/view/ump/store_seckill/attr.php | 371 ++++++ application/admin/view/user/user/group.php | 76 ++ application/admin/view/user/user/index.php | 25 +- application/admin/view/user/user/rank.php | 76 ++ .../admin/view/user/user_level/index.php | 203 ++++ .../admin/view/user/user_level/tash.php | 168 +++ .../view/user/user_level/user_level_list.php | 161 +++ application/admin/view/wechat/menus/index.php | 10 +- .../wechat/wechat_news_category/append.php | 4 +- .../wechat/wechat_news_category/create.php | 22 +- .../view/wechat/wechat_news_category/edit.php | 21 +- .../wechat/wechat_news_category/index.php | 111 +- application/admin/view/widget/icon.php | 8 +- application/version.php | 4 +- 94 files changed, 6548 insertions(+), 649 deletions(-) create mode 100644 application/admin/controller/article/WechatNews.php create mode 100644 application/admin/controller/user/UserLevel.php create mode 100644 application/admin/model/system/SystemAttachmentType.php create mode 100644 application/admin/model/system/SystemUserLevel.php create mode 100644 application/admin/model/system/SystemUserTask.php create mode 100644 application/admin/model/user/UserLevel.php create mode 100644 application/admin/model/user/UserTaskFinish.php create mode 100644 application/admin/view/finance/finance/bill1.php create mode 100644 application/admin/view/public/layui.php create mode 100644 application/admin/view/system/system_notice/index.php create mode 100644 application/admin/view/system/system_notice/message.php create mode 100644 application/admin/view/ump/store_seckill/attr.php create mode 100644 application/admin/view/user/user/group.php create mode 100644 application/admin/view/user/user/rank.php create mode 100644 application/admin/view/user/user_level/index.php create mode 100644 application/admin/view/user/user_level/tash.php create mode 100644 application/admin/view/user/user_level/user_level_list.php diff --git a/application/admin/common.php b/application/admin/common.php index 3c137dcf..316ba6dd 100644 --- a/application/admin/common.php +++ b/application/admin/common.php @@ -102,3 +102,18 @@ function clearfile($path,$ext = '*.log') } return true; } +/**获取当前类方法 + * @param $class + * @return array + */ +function get_this_class_methods($class,$array4 = []) { + $array1 = get_class_methods($class); + if ($parent_class = get_parent_class($class)) { + $array2 = get_class_methods($parent_class); + $array3 = array_diff($array1, $array2);//去除父级的 + } else { + $array3 = $array1; + } + $array5 = array_diff($array3, $array4);//去除无用的 + return $array5; +} diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php index 6a6835c5..74afc59b 100644 --- a/application/admin/controller/Index.php +++ b/application/admin/controller/Index.php @@ -57,13 +57,13 @@ class Index extends AuthController ->count(); //库存预警 $replenishment_num = SystemConfig::getValue('store_stock') > 0 ? SystemConfig::getValue('store_stock') : 20;//库存预警界限 - $topData['stockProduct'] = StoreProduct::where('stock','<=',$replenishment_num)->where('is_del',0)->count(); + $topData['stockProduct'] = StoreProduct::where('stock','<=',$replenishment_num)->where('is_show',1)->where('is_del',0)->count(); //待处理提现 $topData['treatedExtract'] = UserExtractModel::where('status',0)->count(); - //订单数->日 - $now_day_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$now_day)->count(); + //订单数->昨日 + $now_day_order_p = StoreOrderModel::where('paid',1)->whereTime('pay_time','yesterday')->count(); $pre_day_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$pre_day)->where('pay_time','lt',$now_day)->count(); $first_line['d_num'] = [ 'data' => $now_day_order_p ? $now_day_order_p : 0, @@ -72,8 +72,8 @@ class Index extends AuthController ]; //交易额->昨天 - $now_month_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$pre_day)->value('sum(pay_price)'); - $pre_month_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$beforyester_day)->where('pay_time','lt',$pre_day)->value('sum(pay_price)'); + $now_month_order_p = StoreOrderModel::where('paid',1)->whereTime('pay_time','yesterday')->sum('pay_price'); + $pre_month_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$beforyester_day)->where('pay_time','lt',$pre_day)->sum('pay_price'); $first_line['d_price'] = [ 'data' => $now_month_order_p > 0 ? $now_month_order_p : 0, 'percent' => abs($now_month_order_p - $pre_month_order_p), @@ -81,7 +81,7 @@ class Index extends AuthController ]; //交易额->月 - $now_month_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$now_month)->value('sum(pay_price)'); + $now_month_order_p = StoreOrderModel::where('paid',1)->whereTime('pay_time','month')->sum('pay_price'); $pre_month_order_p = StoreOrderModel::where('paid',1)->where('pay_time','gt',$pre_month)->where('pay_time','lt',$now_month)->value('sum(pay_price)'); $first_line['m_price'] = [ 'data' => $now_month_order_p > 0 ? $now_month_order_p : 0, @@ -156,8 +156,8 @@ class Index extends AuthController $datalist[date('m-d',strtotime($i.' day'))] = date('m-d',strtotime($i.' day')); } $order_list = StoreOrderModel::where('add_time','between time',[$datebefor,$dateafter]) - ->field("FROM_UNIXTIME(add_time,'%m-%e') as day,count(*) as count,sum(pay_price) as price") - ->group("FROM_UNIXTIME(add_time, '%Y%m%e')") + ->field("FROM_UNIXTIME(add_time,'%m-%d') as day,count(*) as count,sum(pay_price) as price") + ->group("FROM_UNIXTIME(add_time, '%Y%m%d')") ->order('add_time asc') ->select()->toArray(); if(empty($order_list)) return Json::fail('无数据'); @@ -567,7 +567,7 @@ class Index extends AuthController $data = []; $data['ordernum'] = StoreOrderModel::statusByWhere(1)->count();//待发货 $replenishment_num = SystemConfig::getValue('store_stock') > 0 ? SystemConfig::getValue('store_stock') : 2;//库存预警界限 - $data['inventory'] = ProductModel::where('stock','<=',$replenishment_num)->where('is_del',0)->count();//库存 + $data['inventory'] = ProductModel::where('stock','<=',$replenishment_num)->where('is_show',1)->where('is_del',0)->count();//库存 $data['commentnum'] = StoreProductReplyModel::where('is_reply',0)->count();//评论 $data['reflectnum'] = UserExtractModel::where('status',0)->count();;//提现 $data['msgcount'] = intval($data['ordernum'])+intval($data['inventory'])+intval($data['commentnum'])+intval($data['reflectnum']); diff --git a/application/admin/controller/agent/AgentManage.php b/application/admin/controller/agent/AgentManage.php index 4b205292..f33180fa 100644 --- a/application/admin/controller/agent/AgentManage.php +++ b/application/admin/controller/agent/AgentManage.php @@ -7,7 +7,7 @@ use app\admin\model\order\StoreOrder; use app\admin\model\user\User; use app\admin\model\wechat\WechatUser as UserModel; use app\admin\library\FormBuilder; -use app\wap\model\user\UserBill; +use app\core\model\user\UserBill; use service\UtilService as Util; /** @@ -75,7 +75,7 @@ class AgentManage extends AuthController ->order('u.add_time DESC') ->select() ->toArray(); - foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid']); + foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid'])?:0; $this->assign('list',$list); return $this->fetch(); } diff --git a/application/admin/controller/article/Article.php b/application/admin/controller/article/Article.php index f1b9436e..7e1c69f8 100644 --- a/application/admin/controller/article/Article.php +++ b/application/admin/controller/article/Article.php @@ -159,7 +159,7 @@ class Article extends AuthController if($res) return Json::successful('修改图文成功!',$id); else - return Json::fail('修改图文失败!',$id); + return Json::fail('修改图文失败,您并没有修改什么!',$id); }else{ $data['add_time'] = time(); $data['admin_id'] = $this->adminId; diff --git a/application/admin/controller/article/WechatNews.php b/application/admin/controller/article/WechatNews.php new file mode 100644 index 00000000..dea0f5f8 --- /dev/null +++ b/application/admin/controller/article/WechatNews.php @@ -0,0 +1,186 @@ +request); + if($cid) + $where['cid'] = $cid; + else + $where['cid'] = ''; + $this->assign('where',$where); + $where['merchant'] = 0;//区分是管理员添加的图文显示 0 还是 商户添加的图文显示 1 + $this->assign('cid',$cid); + $this->assign(ArticleModel::getAll($where)); + return $this->fetch(); + } + + /** + * 展示页面 添加和删除 + * @return mixed + */ + public function create(){ + $id = input('id'); + $cid = input('cid'); + $news = array(); + $news['id'] = ''; + $news['image_input'] = ''; + $news['title'] = ''; + $news['author'] = ''; + $news['content'] = ''; + $news['synopsis'] = ''; + $news['url'] = ''; + $news['cid'] = array(); + if($id){ + $news = \app\admin\model\wechat\WechatNews::where('n.id',$id)->alias('n')->field('n.*,c.content')->join('__WECHAT_NEWS_CONTENT__ c','c.nid=n.id')->find(); + if(!$news) return $this->failedNotice('数据不存在!'); + $news['cid'] = explode(',',$news['cid']); +// dump($news); + } + $all = array(); + $select = 0; + if(!$cid) + $cid = ''; + else { + if($id){ + $all = ArticleCategoryModel::where('id',$cid)->where('hidden','neq',0)->column('id,title'); + $select = 1; + }else{ + $all = ArticleCategoryModel::where('id',$cid)->column('id,title'); + $select = 1; + } + + } + if(empty($all)){ + $all = ArticleCategoryModel::getField('id,title');//新闻分类 + $select = 0; + } + $this->assign('all',$all); + $this->assign('news',$news); + $this->assign('cid',$cid); + $this->assign('select',$select); + return $this->fetch(); + } + + /** + * 上传图文图片 + * @return \think\response\Json + */ + public function upload_image(){ + $res = Upload::Image($_POST['file'],'wechat/image/'.date('Ymd')); + //产品图片上传记录 + $fileInfo = $res->fileInfo->getinfo(); + SystemAttachment::attachmentAdd($res->fileInfo->getSaveName(),$fileInfo['size'],$fileInfo['type'],$res->dir,'',5); + if(!$res->status) return Json::fail($res->error); + return Json::successful('上传成功!',['url'=>$res->filePath]); + } + + /** + * 添加和修改图文 + * @param Request $request + * @return \think\response\Json + */ + public function add_new(Request $request){ + $post = $request->post(); + $data = Util::postMore([ + ['id',0], + ['cid',[]], + 'title', + 'author', + 'image_input', + 'content', + 'synopsis', + 'share_title', + 'share_synopsis', + ['visit',0], + ['sort',0], + 'url', + ['status',1],],$request); + $data['cid'] = implode(',',$data['cid']); + $content = $data['content']; + unset($data['content']); + if($data['id']){ + $id = $data['id']; + unset($data['id']); + ArticleModel::beginTrans(); + $res1 = ArticleModel::edit($data,$id,'id'); + $res2 = ArticleModel::setContent($id,$content); + if($res1 && $res2) + $res = true; + else + $res =false; +// dump($res); +// exit(); + ArticleModel::checkTrans($res); + if($res) + return Json::successful('修改图文成功!',$id); + else + return Json::fail('修改图文失败!',$id); + }else{ + $data['add_time'] = time(); + $data['admin_id'] = $this->adminId; + ArticleModel::beginTrans(); + $res1 = ArticleModel::set($data); + $res2 = false; + if($res1) + $res2 = ArticleModel::setContent($res1->id,$content); + if($res1 && $res2) + $res = true; + else + $res =false; + ArticleModel::checkTrans($res); + if($res) + return Json::successful('添加图文成功!',$res1->id); + else + return Json::successful('添加图文失败!',$res1->id); + } + } + + /** + * 删除图文 + * @param $id + * @return \think\response\Json + */ + public function delete($id) + { + $res = ArticleModel::del($id); + if(!$res) + return Json::fail('删除失败,请稍候再试!'); + else + return Json::successful('删除成功!'); + } + + public function merchantIndex(){ + $where = Util::getMore([ + ['title',''] + ],$this->request); + $this->assign('where',$where); + $where['cid'] = input('cid'); + $where['merchant'] = 1;//区分是管理员添加的图文显示 0 还是 商户添加的图文显示 1 + $this->assign(ArticleModel::getAll($where)); + return $this->fetch(); + } +} \ No newline at end of file diff --git a/application/admin/controller/finance/UserRecharge.php b/application/admin/controller/finance/UserRecharge.php index d122d5c6..35945433 100644 --- a/application/admin/controller/finance/UserRecharge.php +++ b/application/admin/controller/finance/UserRecharge.php @@ -2,7 +2,7 @@ namespace app\admin\controller\finance; use app\admin\controller\AuthController; use app\admin\model\user\UserRecharge as UserRechargeModel; -use app\wap\model\user\UserBill; +use app\core\model\user\UserBill; use service\UtilService as Util; use service\JsonService as Json; use think\Url; @@ -10,7 +10,7 @@ use service\FormBuilder as Form; use think\Request; use service\HookService; use behavior\wechat\PaymentBehavior; -use service\WechatTemplateService; +use app\core\util\WechatTemplateService; use app\wap\model\user\WechatUser as WechatUserWap; /** * 微信充值记录 @@ -69,6 +69,8 @@ class UserRecharge extends AuthController if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额'); $refund_data['pay_price'] = $UserRecharge['price']; $refund_data['refund_price'] = $refund_price; +// $refund_data['refund_account']='REFUND_SOURCE_RECHARGE_FUNDS'; + try{ HookService::listen('user_recharge_refund',$UserRecharge['order_id'],$refund_data,true,PaymentBehavior::class); }catch(\Exception $e){ diff --git a/application/admin/controller/order/StoreOrder.php b/application/admin/controller/order/StoreOrder.php index 415e678b..75cf6f83 100644 --- a/application/admin/controller/order/StoreOrder.php +++ b/application/admin/controller/order/StoreOrder.php @@ -1 +1,600 @@ - * @day: 2017/11/11 */ namespace app\admin\controller\order; use basic\ModelBasic; use Api\Express; use app\admin\controller\AuthController; use service\FormBuilder as Form; use app\admin\model\order\StoreOrderStatus; use app\admin\model\ump\StorePink; use app\admin\model\user\User; use app\admin\model\user\UserBill; use behavior\system\OrderBehavior; use behavior\wechat\PaymentBehavior; use EasyWeChat\Core\Exception; use service\CacheService; use service\HookService; use service\JsonService; use service\SystemConfigService; use service\UtilService as Util; use service\JsonService as Json; use think\Db; use think\Request; use think\Url; use app\admin\model\order\StoreOrder as StoreOrderModel; /** * 订单管理控制器 同一个订单表放在一个控制器 * Class StoreOrder * @package app\admin\controller\store */ class StoreOrder extends AuthController { /** * @return mixed */ public function index() { $config = SystemConfigService::more(['pay_routine_appid','pay_routine_appsecret','pay_routine_mchid','pay_routine_key','pay_routine_client_cert','pay_routine_client_key']); $this->assign([ 'year'=>getMonth('y'), 'real_name'=>$this->request->get('real_name',''), 'orderCount'=>StoreOrderModel::orderCount(), ]); return $this->fetch(); } /** * 获取头部订单金额等信息 * return json * */ public function getBadge(){ $where = Util::postMore([ ['status',''], ['real_name',''], ['is_del',0], ['data',''], ['type',''], ['order',''] ]); return JsonService::successful(StoreOrderModel::getBadge($where)); } /** * 获取订单列表 * return json */ public function order_list(){ $where = Util::getMore([ ['status',''], ['real_name',$this->request->param('real_name','')], ['is_del',0], ['data',''], ['type',''], ['order',''], ['page',1], ['limit',20], ['excel',0] ]); return JsonService::successlayui(StoreOrderModel::OrderList($where)); } public function orderchart(){ $where = Util::getMore([ ['status',''], ['real_name',''], ['is_del',0], ['data',''], ['combination_id',''], ['export',0], ['order','id desc'] ],$this->request); $limitTimeList = [ 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), 'week'=>implode(' - ',[ date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) ]), 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), 'quarter'=>implode(' - ',[ date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) ]), 'year'=>implode(' - ',[ date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) ]) ]; if($where['data'] == '') $where['data'] = $limitTimeList['today']; $orderCount = [ urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(), urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(), urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(), urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(), urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(), urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(), urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count() ]; $model = StoreOrderModel::getOrderWhere($where,new StoreOrderModel())->field('sum(total_num) total_num,count(*) count,sum(total_price) total_price,sum(refund_price) refund_price,from_unixtime(add_time,\'%Y-%m-%d\') add_time') ->group('from_unixtime(add_time,\'%Y-%m-%d\')'); $orderPrice = $model->select()->toArray(); $orderDays = []; $orderCategory = [ ['name'=>'商品数','type'=>'line','data'=>[]], ['name'=>'订单数','type'=>'line','data'=>[]], ['name'=>'订单金额','type'=>'line','data'=>[]], ['name'=>'退款金额','type'=>'line','data'=>[]] ]; foreach ($orderPrice as $price){ $orderDays[] = $price['add_time']; $orderCategory[0]['data'][] = $price['total_num']; $orderCategory[1]['data'][] = $price['count']; $orderCategory[2]['data'][] = $price['total_price']; $orderCategory[3]['data'][] = $price['refund_price']; } $this->assign(StoreOrderModel::systemPage($where,$this->adminId)); $this->assign('price',StoreOrderModel::getOrderPrice($where)); $this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory')); return $this->fetch(); } /** * 修改支付金额等 * @param $id * @return mixed|\think\response\Json|void */ public function edit($id) { if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); $f = array(); $f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1); $f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0); $f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0); $f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0); $f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage')); $f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral')); // $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); $form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** 修改订单提交更新 * @param Request $request * @param $id */ public function update(Request $request, $id) { $data = Util::postMore([ 'order_id', 'total_price', 'total_postage', 'pay_price', 'pay_postage', 'gain_integral', ],$request); if($data['total_price'] <= 0) return Json::fail('请输入商品总价'); if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额'); $data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']); StoreOrderModel::edit($data,$id); HookService::afterListen('store_product_order_edit',$data,$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']); return Json::successful('修改成功!'); } /** * 送货 * @param $id * send */ public function delivery($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['paid'] == 1 && $product['status'] == 0) { $f = array(); $f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;'); $f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone'); $form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } else return Json::fail('数据不存在!'); } /**送货 * @param Request $request * @param $id */ public function updateDelivery(Request $request, $id){ $data = Util::postMore([ 'delivery_name', 'delivery_id', ],$request); $data['delivery_type'] = 'send'; if(!$data['delivery_name']) return Json::fail('请输入送货人姓名'); if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码'); else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码'); $data['status'] = 1; StoreOrderModel::edit($data,$id); HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']); return Json::successful('修改成功!'); } /** * 发货 * @param $id * express */ public function deliver_goods($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['paid'] == 1 && $product['status'] == 0){ $f = array(); $f[] = Form::select('delivery_name','快递公司')->setOptions(function(){ $list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name'); $menus = []; foreach ($list as $k=>$v){ $menus[] = ['value'=>$v,'label'=>$v]; } return $menus; })->filterable(1); $f[] = Form::input('delivery_id','快递单号')->number(1); $form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } else return Json::fail('数据不存在!'); } /**发货保存 * @param Request $request * @param $id */ public function updateDeliveryGoods(Request $request, $id){ $data = Util::postMore([ 'delivery_name', 'delivery_id', ],$request); $data['delivery_type'] = 'express'; if(!$data['delivery_name']) return Json::fail('请选择快递公司'); if(!$data['delivery_id']) return Json::fail('请输入快递单号'); $data['status'] = 1; StoreOrderModel::edit($data,$id); HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']); return Json::successful('修改成功!'); } /** * 修改状态为已收货 * @param $id * @return \think\response\Json|void */ public function take_delivery($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['status'] == 2) return Json::fail('不能重复收货!'); if($product['paid'] == 1 && $product['status'] == 1) $data['status'] = 2; else if($product['pay_type'] == 'offline') $data['status'] = 2; else return Json::fail('请先发货或者送货!'); if(!StoreOrderModel::edit($data,$id)) return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!')); else{ try{ HookService::listen('store_product_order_take_delivery',$data,$id,false,OrderBehavior::class); }catch (Exception $e){ return Json::fail($e->getMessage()); } StoreOrderStatus::setStatus($id,'take_delivery','已收货'); return Json::successful('收货成功!'); } } /** * 修改退款状态 * @param $id * @return \think\response\Json|void */ public function refund_y($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['paid'] == 1){ $f = array(); $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); $f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01); $f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]); $form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } else return Json::fail('数据不存在!'); } /**退款处理 * @param Request $request * @param $id */ public function updateRefundY(Request $request, $id){ $data = Util::postMore([ 'refund_price', ['type',1], ],$request); if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了'); if(!$data['refund_price']) return Json::fail('请输入退款金额'); $refund_price = $data['refund_price']; $data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2); $bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2); if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额'); if($data['type'] == 1){ $data['refund_status'] = 2; }else if($data['type'] == 2){ $data['refund_status'] = 0; } $type = $data['type']; unset($data['type']); $refund_data['pay_price'] = $product['pay_price']; $refund_data['refund_price'] = $refund_price; if($product['pay_type'] == 'weixin'){ if($product['is_channel']){ try{ HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class); }catch(\Exception $e){ return Json::fail($e->getMessage()); } }else{ try{ HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class); }catch(\Exception $e){ return Json::fail($e->getMessage()); } } }else if($product['pay_type'] == 'yue'){ ModelBasic::beginTrans(); $res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid'); $res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],$product['pay_price'],'订单退款到余额'.floatval($refund_price).'元'); try{ HookService::listen('store_order_yue_refund',$product,$refund_data,false,OrderBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } $res = $res1 && $res2; ModelBasic::checkTrans($res); if(!$res) return Json::fail('余额退款失败!'); } $resEdit = StoreOrderModel::edit($data,$id); if($resEdit){ $data['type'] = $type; if($data['type'] == 1) StorePink::setRefundPink($id); HookService::afterListen('store_product_order_refund_y',$data,$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元'); return Json::successful('修改成功!'); }else{ StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败'); return Json::successful('修改失败!'); } } public function order_info($oid = '') { if(!$oid || !($orderInfo = StoreOrderModel::get($oid))) return $this->failed('订单不存在!'); $userInfo = User::getUserInfos($orderInfo['uid']); if($userInfo['spread_uid']){ $spread = User::where('uid',$userInfo['spread_uid'])->value('nickname'); }else{ $spread =''; } $this->assign(compact('orderInfo','userInfo','spread')); return $this->fetch(); } public function express($oid = '') { if(!$oid || !($order = StoreOrderModel::get($oid))) return $this->failed('订单不存在!'); if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!'); $cacheName = $order['order_id'].$order['delivery_id']; $result = CacheService::get($cacheName,null); if($result === null || 1==1){ $result = Express::query($order['delivery_id']); if(is_array($result) && isset($result['result']) && isset($result['result']['deliverystatus']) && $result['result']['deliverystatus'] >= 3) $cacheTime = 0; else $cacheTime = 1800; CacheService::set($cacheName,$result,$cacheTime); } $this->assign([ 'order'=>$order, 'express'=>$result ]); return $this->fetch(); } /** * 修改配送信息 * @param $id * @return mixed|\think\response\Json|void */ public function distribution($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); $f = array(); $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); if($product['delivery_type'] == 'send'){ $f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name')); $f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id')); }else if($product['delivery_type'] == 'express'){ $f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){ $list = Db::name('express')->where('is_show',1)->column('id,name'); $menus = []; foreach ($list as $k=>$v){ $menus[] = ['value'=>$v,'label'=>$v]; } return $menus; }); $f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id')); } $form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /**修改配送信息 * @param Request $request * @param $id */ public function updateDistribution(Request $request, $id){ $data = Util::postMore([ 'delivery_name', 'delivery_id', ],$request); if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['delivery_type'] == 'send'){ if(!$data['delivery_name']) return Json::fail('请输入送货人姓名'); if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码'); else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码'); }else if($product['delivery_type'] == 'express'){ if(!$data['delivery_name']) return Json::fail('请选择快递公司'); if(!$data['delivery_id']) return Json::fail('请输入快递单号'); } StoreOrderModel::edit($data,$id); HookService::afterListen('store_product_order_distribution',$data,$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']); return Json::successful('修改成功!'); } /** * 修改退款状态 * @param $id * @return mixed|\think\response\Json|void */ public function refund_n($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); $f[] = Form::input('refund_reason','退款原因')->type('textarea'); $form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /**不退款原因 * @param Request $request * @param $id */ public function updateRefundN(Request $request, $id){ $data = Util::postMore([ 'refund_reason', ],$request); if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if(!$data['refund_reason']) return Json::fail('请输入退款原因'); $data['refund_status'] = 0; StoreOrderModel::edit($data,$id); HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,OrderBehavior::class); StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']); return Json::successful('修改成功!'); } /** * 立即支付 * @param $id */ public function offline($id){ $res = StoreOrderModel::updateOffline($id); if($res){ try{ HookService::listen('store_product_order_offline',$id,false,OrderBehavior::class); }catch (Exception $e){ return Json::fail($e->getMessage()); } StoreOrderStatus::setStatus($id,'offline','线下付款'); return Json::successful('修改成功!'); }else{ return Json::fail('修改失败!'); } } /** * 修改积分和金额 * @param $id * @return mixed|\think\response\Json|void */ public function integral_back($id){ if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($product['paid'] == 1){ $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); $f[] = Form::number('back_integral','退积分')->min(0); $form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); }else{ return Json::fail('参数错误!'); } return $this->fetch('public/form-builder'); } /** 退积分保存 * @param Request $request * @param $id */ public function updateIntegralBack(Request $request, $id){ $data = Util::postMore([ 'back_integral', ],$request); if(!$id) return $this->failed('数据不存在'); $product = StoreOrderModel::get($id); if(!$product) return Json::fail('数据不存在!'); if($data['back_integral'] <= 0) return Json::fail('请输入积分'); if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了'); $back_integral = $data['back_integral']; $data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2); $bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2); if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分'); ModelBasic::beginTrans(); $res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid'); $res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],$product['pay_price'],'订单退积分'.floatval($back_integral).'积分到用户积分'); try{ HookService::listen('store_order_integral_back',$product,$back_integral,false,OrderBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } $res = $res1 && $res2; ModelBasic::checkTrans($res); if(!$res) return Json::fail('退积分失败!'); StoreOrderModel::edit($data,$id); StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']); return Json::successful('退积分成功!'); } public function remark(Request $request){ $data = Util::postMore(['id','remark'],$request); if(!$data['id']) return Json::fail('参数错误!'); if($data['remark'] == '') return Json::fail('请输入要备注的内容!'); $id = $data['id']; unset($data['id']); StoreOrderModel::edit($data,$id); return Json::successful('备注成功!'); } public function order_status($oid){ if(!$oid) return $this->failed('数据不存在'); $this->assign(StoreOrderStatus::systemPage($oid)); return $this->fetch(); } } \ No newline at end of file + + * @day: 2017/11/11 + */ +namespace app\admin\controller\order; + +use Api\Express; +use app\admin\controller\AuthController; +use service\FormBuilder as Form; +use app\admin\model\order\StoreOrderStatus; +use app\admin\model\ump\StorePink; +use app\admin\model\user\User; +use app\admin\model\user\UserBill; +use basic\ModelBasic; +use behavior\admin\OrderBehavior; +use behavior\wechat\PaymentBehavior; +use EasyWeChat\Core\Exception; +use service\CacheService; +use service\HookService; +use service\JsonService; +use app\core\util\SystemConfigService; +use service\UtilService as Util; +use service\JsonService as Json; +use think\Db; +use think\Request; +use think\Url; +use app\admin\model\order\StoreOrder as StoreOrderModel; +/** + * 订单管理控制器 同一个订单表放在一个控制器 + * Class StoreOrder + * @package app\admin\controller\store + */ +class StoreOrder extends AuthController +{ + /** + * @return mixed + */ + public function index() + { + $this->assign([ + 'year'=>getMonth('y'), + 'real_name'=>$this->request->get('real_name',''), + 'orderCount'=>StoreOrderModel::orderCount(), + ]); + return $this->fetch(); + } + /** + * 获取头部订单金额等信息 + * return json + * + */ + public function getBadge(){ + $where = Util::postMore([ + ['status',''], + ['real_name',''], + ['is_del',0], + ['data',''], + ['type',''], + ['order',''] + ]); + return JsonService::successful(StoreOrderModel::getBadge($where)); + } + /** + * 获取订单列表 + * return json + */ + public function order_list(){ + $where = Util::getMore([ + ['status',''], + ['real_name',$this->request->param('real_name','')], + ['is_del',0], + ['data',''], + ['type',''], + ['order',''], + ['page',1], + ['limit',20], + ['excel',0] + ]); + return JsonService::successlayui(StoreOrderModel::OrderList($where)); + } + public function orderchart(){ + $where = Util::getMore([ + ['status',''], + ['real_name',''], + ['is_del',0], + ['data',''], + ['combination_id',''], + ['export',0], + ['order','id desc'] + ],$this->request); + $limitTimeList = [ + 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), + 'week'=>implode(' - ',[ + date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), + date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) + ]), + 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), + 'quarter'=>implode(' - ',[ + date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', + date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) + ]), + 'year'=>implode(' - ',[ + date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) + ]) + ]; + if($where['data'] == '') $where['data'] = $limitTimeList['today']; + $orderCount = [ + urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(), + urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(), + urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(), + urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(), + urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(), + urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(), + urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count() + ]; + $model = StoreOrderModel::getOrderWhere($where,new StoreOrderModel())->field('sum(total_num) total_num,count(*) count,sum(total_price) total_price,sum(refund_price) refund_price,from_unixtime(add_time,\'%Y-%m-%d\') add_time') + ->group('from_unixtime(add_time,\'%Y-%m-%d\')'); + $orderPrice = $model->select()->toArray(); + $orderDays = []; + $orderCategory = [ + ['name'=>'商品数','type'=>'line','data'=>[]], + ['name'=>'订单数','type'=>'line','data'=>[]], + ['name'=>'订单金额','type'=>'line','data'=>[]], + ['name'=>'退款金额','type'=>'line','data'=>[]] + ]; + foreach ($orderPrice as $price){ + $orderDays[] = $price['add_time']; + $orderCategory[0]['data'][] = $price['total_num']; + $orderCategory[1]['data'][] = $price['count']; + $orderCategory[2]['data'][] = $price['total_price']; + $orderCategory[3]['data'][] = $price['refund_price']; + } + $this->assign(StoreOrderModel::systemPage($where,$this->adminId)); + $this->assign('price',StoreOrderModel::getOrderPrice($where)); + $this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory')); + return $this->fetch(); + } + /** + * 修改支付金额等 + * @param $id + * @return mixed|\think\response\Json|void + */ + public function edit($id) + { + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + $f = array(); + $f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1); + $f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0); + $f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0); + $f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0); + $f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage')); + $f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral')); +// $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); + $form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + + } + + /** 修改订单提交更新 + * @param Request $request + * @param $id + */ + public function update(Request $request, $id) + { + $data = Util::postMore([ + 'order_id', + 'total_price', + 'total_postage', + 'pay_price', + 'pay_postage', + 'gain_integral', + ],$request); + if($data['total_price'] <= 0) return Json::fail('请输入商品总价'); + if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额'); + $data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']); + StoreOrderModel::edit($data,$id); + HookService::afterListen('store_product_order_edit',$data,$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']); + return Json::successful('修改成功!'); + } + /** + * 送货 + * @param $id + * send + */ + public function delivery($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['paid'] == 1 && $product['status'] == 0) { + $f = array(); + $f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;'); + $f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone'); + $form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id)),5); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + else $this->failedNotice('订单状态错误'); + } + + /**送货 + * @param Request $request + * @param $id + */ + public function updateDelivery(Request $request, $id){ + $data = Util::postMore([ + 'delivery_name', + 'delivery_id', + ],$request); + $data['delivery_type'] = 'send'; + if(!$data['delivery_name']) return Json::fail('请输入送货人姓名'); + if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码'); + else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码'); + $data['status'] = 1; + StoreOrderModel::edit($data,$id); + HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']); + return Json::successful('修改成功!'); + } + /** + * 发货 + * @param $id + * express + */ + public function deliver_goods($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['paid'] == 1 && $product['status'] == 0){ + $f = array(); + $f[] = Form::select('delivery_name','快递公司')->setOptions(function(){ + $list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name'); + $menus = []; + foreach ($list as $k=>$v){ + $menus[] = ['value'=>$v,'label'=>$v]; + } + return $menus; + })->filterable(1); + $f[] = Form::input('delivery_id','快递单号'); + $form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id)),5); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + else return $this->failedNotice('订单状态错误'); + } + + /**发货保存 + * @param Request $request + * @param $id + */ + public function updateDeliveryGoods(Request $request, $id){ + $data = Util::postMore([ + 'delivery_name', + 'delivery_id', + ],$request); + $data['delivery_type'] = 'express'; + if(!$data['delivery_name']) return Json::fail('请选择快递公司'); + if(!$data['delivery_id']) return Json::fail('请输入快递单号'); + $data['status'] = 1; + StoreOrderModel::edit($data,$id); + HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']); + return Json::successful('修改成功!'); + } + /** + * 修改状态为已收货 + * @param $id + * @return \think\response\Json|void + */ + public function take_delivery($id){ + if(!$id) return $this->failed('数据不存在'); + $order = StoreOrderModel::get($id); + if(!$order) return Json::fail('数据不存在!'); + if($order['status'] == 2) return Json::fail('不能重复收货!'); + if($order['paid'] == 1 && $order['status'] == 1) $data['status'] = 2; + else if($order['pay_type'] == 'offline') $data['status'] = 2; + else return Json::fail('请先发货或者送货!'); + if(!StoreOrderModel::edit($data,$id)) + return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!')); + else{ + try{ + HookService::listen('store_product_order_take_delivery',$order,$id,false,OrderBehavior::class); + }catch (\Exception $e){ + return Json::fail($e->getMessage()); + } + StoreOrderStatus::setStatus($id,'take_delivery','已收货'); + return Json::successful('收货成功!'); + } + } + /** + * 修改退款状态 + * @param $id + * @return \think\response\Json|void + */ + public function refund_y($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['paid'] == 1){ + $f = array(); + $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); + $f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01); + $f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]); + $form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id)),5); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + else return Json::fail('数据不存在!'); + } + + /**退款处理 + * @param Request $request + * @param $id + */ + public function updateRefundY(Request $request, $id){ + $data = Util::postMore([ + 'refund_price', + ['type',1], + ],$request); + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了'); + if(!$data['refund_price']) return Json::fail('请输入退款金额'); + $refund_price = $data['refund_price']; + $data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2); + $bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2); + if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额'); + if($data['type'] == 1){ + $data['refund_status'] = 2; + }else if($data['type'] == 2){ + $data['refund_status'] = 0; + } + $type = $data['type']; + unset($data['type']); + $refund_data['pay_price'] = $product['pay_price']; + $refund_data['refund_price'] = $refund_price; + if($product['pay_type'] == 'weixin'){ + if($product['is_channel']){//小程序 + try{ + HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class); + }catch(\Exception $e){ + return Json::fail($e->getMessage()); + } + }else{ + try{ + HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class); + }catch(\Exception $e){ + return Json::fail($e->getMessage()); + } + } + }else if($product['pay_type'] == 'yue'){ + ModelBasic::beginTrans(); + $usermoney = User::where('uid',$product['uid'])->value('now_money'); + $res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid'); + $res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],bcadd($usermoney,$refund_price,2),'订单退款到余额'.floatval($refund_price).'元'); + try{ + HookService::listen('store_order_yue_refund',$product,$refund_data,false,OrderBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + $res = $res1 && $res2; + ModelBasic::checkTrans($res); + if(!$res) return Json::fail('余额退款失败!'); + } + $resEdit = StoreOrderModel::edit($data,$id); + if($resEdit){ + $data['type'] = $type; + if($data['type'] == 1) StorePink::setRefundPink($id); + HookService::afterListen('store_product_order_refund_y',$data,$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元'); + ModelBasic::commitTrans(); + return Json::successful('修改成功!'); + }else{ + StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败'); + return Json::successful('修改失败!'); + } + } + public function order_info($oid = '') + { + if(!$oid || !($orderInfo = StoreOrderModel::get($oid))) + return $this->failed('订单不存在!'); + $userInfo = User::getUserInfos($orderInfo['uid']); + if($userInfo['spread_uid']){ + $spread = User::where('uid',$userInfo['spread_uid'])->value('nickname'); + }else{ + $spread =''; + } + $this->assign(compact('orderInfo','userInfo','spread')); + return $this->fetch(); + } + public function express($oid = '') + { + if(!$oid || !($order = StoreOrderModel::get($oid))) + return $this->failed('订单不存在!'); + if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!'); + $cacheName = $order['order_id'].$order['delivery_id']; + $result = CacheService::get($cacheName,null); + if($result === null || 1==1){ + $result = Express::query($order['delivery_id']); + if(is_array($result) && + isset($result['result']) && + isset($result['result']['deliverystatus']) && + $result['result']['deliverystatus'] >= 3) + $cacheTime = 0; + else + $cacheTime = 1800; + CacheService::set($cacheName,$result,$cacheTime); + } + $this->assign([ + 'order'=>$order, + 'express'=>$result + ]); + return $this->fetch(); + } + /** + * 修改配送信息 + * @param $id + * @return mixed|\think\response\Json|void + */ + public function distribution($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + $f = array(); + $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); + if($product['delivery_type'] == 'send'){ + $f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name')); + $f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id')); + }else if($product['delivery_type'] == 'express'){ + $f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){ + $list = Db::name('express')->where('is_show',1)->column('id,name'); + $menus = []; + foreach ($list as $k=>$v){ + $menus[] = ['value'=>$v,'label'=>$v]; + } + return $menus; + }); + $f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id')); + } + $form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id)),5); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /**修改配送信息 + * @param Request $request + * @param $id + */ + public function updateDistribution(Request $request, $id){ + $data = Util::postMore([ + 'delivery_name', + 'delivery_id', + ],$request); + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['delivery_type'] == 'send'){ + if(!$data['delivery_name']) return Json::fail('请输入送货人姓名'); + if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码'); + else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码'); + }else if($product['delivery_type'] == 'express'){ + if(!$data['delivery_name']) return Json::fail('请选择快递公司'); + if(!$data['delivery_id']) return Json::fail('请输入快递单号'); + } + StoreOrderModel::edit($data,$id); + HookService::afterListen('store_product_order_distribution',$data,$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']); + return Json::successful('修改成功!'); + } + /** + * 修改退款状态 + * @param $id + * @return mixed|\think\response\Json|void + */ + public function refund_n($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); + $f[] = Form::input('refund_reason','退款原因')->type('textarea'); + $form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /**不退款原因 + * @param Request $request + * @param $id + */ + public function updateRefundN(Request $request, $id){ + $data = Util::postMore([ + 'refund_reason', + ],$request); + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if(!$data['refund_reason']) return Json::fail('请输入退款原因'); + $data['refund_status'] = 0; + StoreOrderModel::edit($data,$id); + HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,OrderBehavior::class); + StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']); + return Json::successful('修改成功!'); + } + /** + * 立即支付 + * @param $id + */ + public function offline($id){ + $res = StoreOrderModel::updateOffline($id); + if($res){ + try{ + HookService::listen('store_product_order_offline',$id,false,OrderBehavior::class); + }catch (Exception $e){ + return Json::fail($e->getMessage()); + } + StoreOrderStatus::setStatus($id,'offline','线下付款'); + return Json::successful('修改成功!'); + }else{ + return Json::fail('修改失败!'); + } + } + /** + * 修改积分和金额 + * @param $id + * @return mixed|\think\response\Json|void + */ + public function integral_back($id){ + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($product['paid'] == 1){ + $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1); + $f[] = Form::number('use_integral','使用的积分',$product->getData('use_integral'))->min(0)->disabled(1); + $f[] = Form::number('use_integrals','已退积分',$product->getData('back_integral'))->min(0)->disabled(1); + $f[] = Form::number('back_integral','可退积分',bcsub($product->getData('use_integral'),$product->getData('use_integral')))->min(0); + $form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + }else{ + return Json::fail('参数错误!'); + } + return $this->fetch('public/form-builder'); + } + + /** 退积分保存 + * @param Request $request + * @param $id + */ + public function updateIntegralBack(Request $request, $id){ + $data = Util::postMore([ + 'back_integral', + ],$request); + if(!$id) return $this->failed('数据不存在'); + $product = StoreOrderModel::get($id); + if(!$product) return Json::fail('数据不存在!'); + if($data['back_integral'] <= 0) return Json::fail('请输入积分'); + if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了'); + $back_integral = $data['back_integral']; + $data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2); + $bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2); + if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分'); + ModelBasic::beginTrans(); + $integral = User::where('uid',$product['uid'])->value('integral'); + $res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid'); + $res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],bcadd($integral,$back_integral,2),'订单退积分'.floatval($back_integral).'积分到用户积分'); + try{ + HookService::listen('store_order_integral_back',$product,$back_integral,false,OrderBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + $res = $res1 && $res2; + ModelBasic::checkTrans($res); + if(!$res) return Json::fail('退积分失败!'); + StoreOrderModel::edit($data,$id); + StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']); + return Json::successful('退积分成功!'); + } + public function remark(Request $request){ + $data = Util::postMore(['id','remark'],$request); + if(!$data['id']) return Json::fail('参数错误!'); + if($data['remark'] == '') return Json::fail('请输入要备注的内容!'); + $id = $data['id']; + unset($data['id']); + StoreOrderModel::edit($data,$id); + return Json::successful('备注成功!'); + } + public function order_status($oid){ + if(!$oid) return $this->failed('数据不存在'); + $this->assign(StoreOrderStatus::systemPage($oid)); + return $this->fetch(); + } +} diff --git a/application/admin/controller/setting/SystemGroupData.php b/application/admin/controller/setting/SystemGroupData.php index f8f93628..931da8fd 100644 --- a/application/admin/controller/setting/SystemGroupData.php +++ b/application/admin/controller/setting/SystemGroupData.php @@ -47,13 +47,13 @@ class SystemGroupData extends AuthController $f = array(); foreach ($Fields["fields"] as $key => $value) { $info = []; - if(!empty($value["param"])){ + if(isset($value["param"])){ $value["param"] = str_replace("\r\n","\n",$value["param"]);//防止不兼容 $params = explode("\n",$value["param"]); if(is_array($params) && !empty($params)){ foreach ($params as $index => $v) { $vl = explode('=>',$v); - if(!empty($vl[0]) && !empty($vl[1])){ + if(isset($vl[0]) && isset($vl[1])){ $info[$index]["value"] = $vl[0]; $info[$index]["label"] = $vl[1]; } @@ -150,13 +150,13 @@ class SystemGroupData extends AuthController $f = array(); foreach ($Fields['fields'] as $key => $value) { $info = []; - if(!empty($value["param"])){ + if(isset($value["param"])){ $value["param"] = str_replace("\r\n","\n",$value["param"]);//防止不兼容 $params = explode("\n",$value["param"]); if(is_array($params) && !empty($params)){ foreach ($params as $index => $v) { $vl = explode('=>',$v); - if(!empty($vl[0]) && !empty($vl[1])){ + if(isset($vl[0]) && isset($vl[1])){ $info[$index]["value"] = $vl[0]; $info[$index]["label"] = $vl[1]; } @@ -221,7 +221,7 @@ class SystemGroupData extends AuthController foreach ($params as $key => $param) { foreach ($Fields['fields'] as $index => $field) { if($key == $field["title"]){ - if($param == "" || count($param) == 0) + if(!$param) return Json::fail($field["name"]."不能为空!"); else{ $value[$key]["type"] = $field["type"]; diff --git a/application/admin/controller/store/StoreProduct.php b/application/admin/controller/store/StoreProduct.php index f2a976bd..c120501a 100644 --- a/application/admin/controller/store/StoreProduct.php +++ b/application/admin/controller/store/StoreProduct.php @@ -9,6 +9,7 @@ use app\admin\model\store\StoreProductAttrResult; use app\admin\model\store\StoreProductRelation; use app\admin\model\system\SystemConfig; use service\JsonService; +use think\Db; use traits\CurdControllerTrait; use service\UtilService as Util; use service\JsonService as Json; @@ -72,6 +73,7 @@ class StoreProduct extends AuthController ['store_name',''], ['cate_id',''], ['excel',0], + ['order',''], ['type',$this->request->param('type')] ]); return JsonService::successlayui(ProductModel::ProductList($where)); @@ -138,27 +140,22 @@ class StoreProduct extends AuthController $menus[] = ['value'=>$menu['id'],'label'=>$menu['html'].$menu['cate_name'],'disabled'=>$menu['pid']== 0];//,'disabled'=>$menu['pid']== 0]; } return $menus; - })->filterable(1)->multiple(1)->required(), - Form::input('store_name','产品名称')->col(Form::col(24))->validateFn(function($validate){ - $validate->min(5)->max(32); - })->required(), + })->filterable(1)->multiple(1), + Form::input('store_name','产品名称')->col(Form::col(24)), Form::input('store_info','产品简介')->type('textarea'), Form::input('keyword','产品关键字')->placeholder('多个用英文状态下的逗号隔开'), - Form::input('unit_name','产品单位','件')->required(), - Form::frameImageOne('image','产品主图片(305*305px)',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image')->width('100%')->height('500px')->required(), - Form::frameImages('slider_image','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'slider_image')))->maxLength(5)->icon('images')->width('100%')->height('500px')->spin(0) - ->required()->validateFn(function($validate){ - $validate->min(1)->max(5); - }), - Form::number('price','产品售价')->min(0)->col(8)->required(), + Form::input('unit_name','产品单位','件'), + Form::frameImageOne('image','产品主图片(305*305px)',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image')->width('100%')->height('500px'), + Form::frameImages('slider_image','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'slider_image')))->maxLength(5)->icon('images')->width('100%')->height('500px')->spin(0), + Form::number('price','产品售价')->min(0)->col(8), Form::number('ot_price','产品市场价')->min(0)->col(8), Form::number('give_integral','赠送积分')->min(0)->precision(0)->col(8), - Form::number('postage','邮费')->min(0)->col(Form::col(8))->required(), + Form::number('postage','邮费')->min(0)->col(Form::col(8)), Form::number('sales','销量',0)->min(0)->precision(0)->col(8)->readonly(1), Form::number('ficti','虚拟销量')->min(0)->precision(0)->col(8), - Form::number('stock','库存')->min(0)->precision(0)->col(8)->required(), + Form::number('stock','库存')->min(0)->precision(0)->col(8), Form::number('cost','产品成本价')->min(0)->col(8), - Form::number('sort','排序',0)->col(8)->required(), + Form::number('sort','排序')->col(8), Form::radio('is_show','产品状态',0)->options([['label'=>'上架','value'=>1],['label'=>'下架','value'=>0]])->col(8), Form::radio('is_hot','热卖单品',0)->options([['label'=>'是','value'=>1],['label'=>'否','value'=>0]])->col(8), Form::radio('is_benefit','促销单品',0)->options([['label'=>'是','value'=>1],['label'=>'否','value'=>0]])->col(8), @@ -204,13 +201,13 @@ class StoreProduct extends AuthController ['unit_name','件'], ['image',[]], ['slider_image',[]], - 'postage', - 'ot_price', - 'price', - 'sort', - 'stock', + ['postage',0], + ['ot_price',0], + ['price',0], + ['sort',0], + ['stock',100], 'sales', - 'ficti', + ['ficti',100], ['give_integral',0], ['is_show',0], ['cost',0], @@ -222,24 +219,22 @@ class StoreProduct extends AuthController ['is_postage',0], ],$request); if(count($data['cate_id']) < 1) return Json::fail('请选择产品分类'); + $cate_id=$data['cate_id']; $data['cate_id'] = implode(',',$data['cate_id']); if(!$data['store_name']) return Json::fail('请输入产品名称'); -// if(!$data['store_info']) return Json::fail('请输入产品简介'); -// if(!$data['keyword']) return Json::fail('请输入产品关键字'); if(count($data['image'])<1) return Json::fail('请上传产品图片'); if(count($data['slider_image'])<1) return Json::fail('请上传产品轮播图'); if($data['price'] == '' || $data['price'] < 0) return Json::fail('请输入产品售价'); if($data['ot_price'] == '' || $data['ot_price'] < 0) return Json::fail('请输入产品市场价'); - if($data['postage'] == '' || $data['postage'] < 0) return Json::fail('请输入邮费'); if($data['stock'] == '' || $data['stock'] < 0) return Json::fail('请输入库存'); - if($data['cost'] == '' || $data['ot_price'] < 0) return Json::fail('请输入产品成本价'); - if($data['sales'] == '' || $data['sales'] < 0) return Json::fail('请输入销量'); - if($data['give_integral'] < 0) return Json::fail('请输入赠送积分'); $data['image'] = $data['image'][0]; $data['slider_image'] = json_encode($data['slider_image']); $data['add_time'] = time(); $data['description'] = ''; - ProductModel::set($data); + $res=ProductModel::set($data); + foreach ($cate_id as $cid){ + Db::name('store_product_cate')->insert(['product_id'=>$res['id'],'cate_id'=>$cid,'add_time'=>time()]); + } return Json::successful('添加产品成功!'); } @@ -281,7 +276,7 @@ class StoreProduct extends AuthController Form::input('keyword','产品关键字',$product->getData('keyword'))->placeholder('多个用英文状态下的逗号隔开'), Form::input('unit_name','产品单位',$product->getData('unit_name')), Form::frameImageOne('image','产品主图片(305*305px)',Url::build('admin/widget.images/index',array('fodder'=>'image')),$product->getData('image'))->icon('image')->width('100%')->height('500px'), - Form::frameImages('slider_image','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'slider_image')),json_decode($product->getData('slider_image'),1))->maxLength(5)->icon('images')->width('100%')->height('500px'), + Form::frameImages('slider_image','产品轮播图(640*640px)',Url::build('admin/widget.images/index',array('fodder'=>'slider_image')),json_decode($product->getData('slider_image'),1) ? : [])->maxLength(5)->icon('images')->width('100%')->height('500px'), Form::number('price','产品售价',$product->getData('price'))->min(0)->precision(2)->col(8), Form::number('ot_price','产品市场价',$product->getData('ot_price'))->min(0)->col(8), Form::number('give_integral','赠送积分',$product->getData('give_integral'))->min(0)->precision(0)->col(8), @@ -322,13 +317,12 @@ class StoreProduct extends AuthController ['unit_name','件'], ['image',[]], ['slider_image',[]], - 'postage', - 'ot_price', - 'price', - 'sort', - 'stock', -// 'sales', - 'ficti', + ['postage',0], + ['ot_price',0], + ['price',0], + ['sort',0], + ['stock',0], + ['ficti',100], ['give_integral',0], ['is_show',0], ['cost',0], @@ -340,23 +334,22 @@ class StoreProduct extends AuthController ['is_postage',0], ],$request); if(count($data['cate_id']) < 1) return Json::fail('请选择产品分类'); + $cate_id=$data['cate_id']; $data['cate_id'] = implode(',',$data['cate_id']); if(!$data['store_name']) return Json::fail('请输入产品名称'); -// if(!$data['store_info']) return Json::fail('请输入产品简介'); -// if(!$data['keyword']) return Json::fail('请输入产品关键字'); if(count($data['image'])<1) return Json::fail('请上传产品图片'); if(count($data['slider_image'])<1) return Json::fail('请上传产品轮播图'); if(count($data['slider_image'])>5) return Json::fail('轮播图最多5张图'); if($data['price'] == '' || $data['price'] < 0) return Json::fail('请输入产品售价'); if($data['ot_price'] == '' || $data['ot_price'] < 0) return Json::fail('请输入产品市场价'); - if($data['postage'] == '' || $data['postage'] < 0) return Json::fail('请输入邮费'); - if($data['cost'] == '' || $data['cost'] < 0) return Json::fail('请输入产品成本价'); if($data['stock'] == '' || $data['stock'] < 0) return Json::fail('请输入库存'); -// if($data['sales'] == '' || $data['sales'] < 0) return Json::fail('请输入销量'); - if($data['give_integral'] < 0) return Json::fail('请输入赠送积分'); $data['image'] = $data['image'][0]; $data['slider_image'] = json_encode($data['slider_image']); ProductModel::edit($data,$id); + Db::name('store_product_cate')->where('product_id',$id)->delete(); + foreach ($cate_id as $cid){ + Db::name('store_product_cate')->insert(['product_id'=>$id,'cate_id'=>$cid,'add_time'=>time()]); + } return Json::successful('修改成功!'); } @@ -365,7 +358,7 @@ class StoreProduct extends AuthController if(!$id) return $this->failed('数据不存在!'); $result = StoreProductAttrResult::getResult($id); $image = ProductModel::where('id',$id)->value('image'); - $this->assign(compact('id','result','product','image')); + $this->assign(compact('id','result','image')); return $this->fetch(); } /** @@ -443,10 +436,15 @@ class StoreProduct extends AuthController */ public function delete($id) { + if(!$id) return $this->failed('数据不存在'); if(!ProductModel::be(['id'=>$id])) return $this->failed('产品数据不存在'); if(ProductModel::be(['id'=>$id,'is_del'=>1])){ - return Json::fail(ProductModel::getErrorInfo('暂不支持回收站删除产品!')); + $data['is_del'] = 0; + if(!ProductModel::edit($data,$id)) + return Json::fail(ProductModel::getErrorInfo('恢复失败,请稍候再试!')); + else + return Json::successful('成功恢复产品!'); }else{ $data['is_del'] = 1; if(!ProductModel::edit($data,$id)) diff --git a/application/admin/controller/store/StoreProductReply.php b/application/admin/controller/store/StoreProductReply.php index 2dfe1c89..f5daaa6b 100644 --- a/application/admin/controller/store/StoreProductReply.php +++ b/application/admin/controller/store/StoreProductReply.php @@ -3,6 +3,8 @@ namespace app\admin\controller\store; use app\admin\controller\AuthController; +use service\JsonService; +use service\UtilService; use traits\CurdControllerTrait; use service\UtilService as Util; use service\JsonService as Json; @@ -38,10 +40,34 @@ class StoreProductReply extends AuthController else $where['product_id'] = 0; $this->assign('where',$where); + $this->assign('is_layui',true); $this->assign(ProductReplyModel::systemPage($where)); return $this->fetch(); } + public function get_product_imaes_list() + { + $where=UtilService::getMore([ + ['page',1], + ['limit',10], + ['title',''], + ['is_reply',''], + ]); + return JsonService::successful(ProductReplyModel::getProductImaesList($where)); + } + + public function get_product_reply_list() + { + $where=UtilService::getMore([ + ['limit',10], + ['title',''], + ['is_reply',''], + ['message_page',1], + ['producr_id',0], + ]); + return JsonService::successful(ProductReplyModel::getProductReplyList($where)); + } + /** * @param $id * @return \think\response\Json|void diff --git a/application/admin/controller/system/SystemAttachment.php b/application/admin/controller/system/SystemAttachment.php index 9df3fee0..cae82ff1 100755 --- a/application/admin/controller/system/SystemAttachment.php +++ b/application/admin/controller/system/SystemAttachment.php @@ -21,9 +21,6 @@ class SystemAttachment extends AuthController public function upload() { $res = Upload::image('upfile','editor/'.date('Ymd')); - if($res->status==false && $res->error){ - exit(json_encode(['state'=>$res->error])); - } //产品图片上传记录 $fileInfo = $res->fileInfo->getinfo(); $thumbPath = Upload::thumb($res->dir); diff --git a/application/admin/controller/system/SystemCleardata.php b/application/admin/controller/system/SystemCleardata.php index 03bb4d79..dbd629b7 100644 --- a/application/admin/controller/system/SystemCleardata.php +++ b/application/admin/controller/system/SystemCleardata.php @@ -1,7 +1,7 @@ fetch(); } //清除用户数据 - public function UserRelevant(){ - SystemCleardata::ClearData('user_recharge',1); - SystemCleardata::ClearData('user_address',1); - SystemCleardata::ClearData('user_bill',1); - SystemCleardata::ClearData('user_enter',1); - SystemCleardata::ClearData('user_extract',1); - SystemCleardata::ClearData('user_notice',1); - SystemCleardata::ClearData('user_notice_see',1); - SystemCleardata::ClearData('wechat_qrcode',1); - SystemCleardata::ClearData('wechat_message',1); - SystemCleardata::ClearData('store_coupon_user',1); - SystemCleardata::ClearData('store_coupon_issue_user',1); - SystemCleardata::ClearData('store_bargain_user',1); - SystemCleardata::ClearData('store_bargain_user_help',1); - SystemCleardata::ClearData('store_product_reply',1); + public function userRelevantData(){ + self::clearData('user_recharge',1); + self::clearData('user_address',1); + self::clearData('user_bill',1); + self::clearData('user_enter',1); + self::clearData('user_extract',1); + self::clearData('user_notice',1); + self::clearData('user_notice_see',1); + self::clearData('wechat_qrcode',1); + self::clearData('wechat_message',1); + self::clearData('store_visit',1); + self::clearData('store_coupon_user',1); + self::clearData('store_coupon_issue_user',1); + self::clearData('store_bargain_user',1); + self::clearData('store_bargain_user_help',1); + self::clearData('store_product_reply',1); + self::clearData('routine_qrcode',1); + self::clearData('routine_form_id',1); + self::clearData('user_sign',1); + self::clearData('user_task_finish',1); + self::clearData('user_level',1); + self::clearData('token',1); + self::clearData('user_group',1); $this->delDirAndFile('./public/uploads/store/comment'); - SystemCleardata::ClearData('store_product_relation',1); + self::clearData('store_product_relation',1); return Json::successful('清除数据成功!'); } //清除商城数据 - public function storedata(){ - SystemCleardata::ClearData('store_coupon',1); - SystemCleardata::ClearData('store_coupon_issue',1); - SystemCleardata::ClearData('store_bargain',1); - SystemCleardata::ClearData('store_combination',1); - SystemCleardata::ClearData('store_product_attr',1); - SystemCleardata::ClearData('store_product_attr_result',1); - SystemCleardata::ClearData('store_product_attr_value',1); - SystemCleardata::ClearData('store_seckill',1); - SystemCleardata::ClearData('store_product',1); - $this->delDirAndFile('./public/uploads/store/product'); - + public function storeData(){ + self::clearData('store_coupon',1); + self::clearData('store_coupon_issue',1); + self::clearData('store_bargain',1); + self::clearData('store_combination',1); + self::clearData('store_combination_attr',1); + self::clearData('store_combination_attr_result',1); + self::clearData('store_combination_attr_value',1); + self::clearData('store_product_attr',1); + self::clearData('store_product_attr_result',1); + self::clearData('store_product_attr_value',1); + self::clearData('store_seckill',1); + self::clearData('store_seckill_attr',1); + self::clearData('store_seckill_attr_result',1); + self::clearData('store_seckill_attr_value',1); + self::clearData('store_product',1); + self::clearData('store_visit',1); return Json::successful('清除数据成功!'); } //清除产品分类 - public function categorydata(){ - SystemCleardata::ClearData('store_category',1); - $this->delDirAndFile('./public/uploads/store/product'); + public function categoryData(){ + self::clearData('store_category',1); return Json::successful('清除数据成功!'); } //清除订单数据 - public function orderdata(){ - SystemCleardata::ClearData('store_order',1); - SystemCleardata::ClearData('store_order_cart_info',1); - SystemCleardata::ClearData('store_order_copy',1); - SystemCleardata::ClearData('store_order_status',1); - SystemCleardata::ClearData('store_pink',1); - SystemCleardata::ClearData('store_cart',1); + public function orderData(){ + self::clearData('store_order',1); + self::clearData('store_order_cart_info',1); + self::clearData('store_order_status',1); + self::clearData('store_pink',1); + self::clearData('store_cart',1); + self::clearData('store_order_status',1); return Json::successful('清除数据成功!'); } //清除客服数据 - public function kefudata(){ - SystemCleardata::ClearData('store_service',1); + public function kefuData(){ + self::clearData('store_service',1); $this->delDirAndFile('./public/uploads/store/service'); - SystemCleardata::ClearData('store_service_log',1); + self::clearData('store_service_log',1); return Json::successful('清除数据成功!'); } //清除微信管理数据 - public function wechatdata(){ - SystemCleardata::ClearData('wechat_media',1); - SystemCleardata::ClearData('wechat_reply',1); - $this->delDirAndFile('./public/uploads/wechat'); + public function wechatData(){ + self::clearData('wechat_media',1); + self::clearData('wechat_reply',1); + self::clearData('cache',1); + $this->delDirAndFile('./public/uploads/wechat'); return Json::successful('清除数据成功!'); } //清除所有附件 - public function uploaddata(){ - $this->delDirAndFile('./public/uploads'); + public function uploadData(){ + self::clearData('system_attachment',1); + self::clearData('system_attachment_category',1); + $this->delDirAndFile('./public/uploads/'); return Json::successful('清除上传文件成功!'); } //清除微信用户 - public function wechatuserdata(){ - SystemCleardata::ClearData('wechat_user',1); - SystemCleardata::ClearData('user',1); + public function wechatuserData(){ + self::clearData('wechat_user',1); + self::clearData('user',1); return Json::successful('清除数据成功!'); } //清除内容分类 public function articledata(){ - SystemCleardata::ClearData('article_category',1); - SystemCleardata::ClearData('article',1); - SystemCleardata::ClearData('article_content',1); - $this->delDirAndFile('./public/uploads/article/'); + self::clearData('article_category',1); + self::clearData('article',1); + self::clearData('article_content',1); + return Json::successful('清除数据成功!'); + } + //清除系统记录 + public function systemdata(){ + self::clearData('system_notice_admin',1); + self::clearData('system_log',1); return Json::successful('清除数据成功!'); } //清除制定表数据 - public function ClearData($table_name,$status){ + public function clearData($table_name,$status){ $table_name = Config::get('database')['prefix'].$table_name; if($status){ - @db::query('TRUNCATE TABLE '.$table_name); + @db::execute('TRUNCATE TABLE '.$table_name); }else{ - @db::query('DELETE FROM'.$table_name); + @db::execute('DELETE FROM'.$table_name); } } diff --git a/application/admin/controller/system/SystemDatabackup.php b/application/admin/controller/system/SystemDatabackup.php index a5d1c7c7..36ba5f71 100644 --- a/application/admin/controller/system/SystemDatabackup.php +++ b/application/admin/controller/system/SystemDatabackup.php @@ -19,7 +19,7 @@ class SystemDatabackup extends AuthController public function _initialize() { $config = array( - 'path' => '.'.PUBILC_PATH.'/backup/data/', + 'path' => '.'.PUBILC_PATH.'backup/data/', //数据库备份路径 'part' => 20971520, //数据库备份卷大小 diff --git a/application/admin/controller/ump/StoreCoupon.php b/application/admin/controller/ump/StoreCoupon.php index a0c4aa9b..ca22bf17 100644 --- a/application/admin/controller/ump/StoreCoupon.php +++ b/application/admin/controller/ump/StoreCoupon.php @@ -42,14 +42,14 @@ class StoreCoupon extends AuthController public function create() { $f = array(); - $f[] = Form::input('title','优惠券名称')->required(); + $f[] = Form::input('title','优惠券名称'); $f[] = Form::number('coupon_price','优惠券面值',0)->min(0); $f[] = Form::number('use_min_price','优惠券最低消费')->min(0); $f[] = Form::number('coupon_time','优惠券有效期限')->min(0); $f[] = Form::number('sort','排序'); $f[] = Form::radio('status','状态',0)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); - $form = Form::make_post_form('添加优惠券',$f,Url::build('save'));//->setSuccessScript(''); + $form = Form::make_post_form('添加优惠券',$f,Url::build('save')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } @@ -227,8 +227,8 @@ class StoreCoupon extends AuthController public function update_issue(Request $request,$id) { - list($_id,$rangeTime,$count,$status) = UtilService::postMore([ - 'id',['range_date',['','']],['count',0],['status',0] + list($_id,$rangeTime,$count,$status,$is_permanent) = UtilService::postMore([ + 'id',['range_date',['','']],['count',0],['status',0],['is_permanent',0] ],$request,true); if($_id != $id) return JsonService::fail('操作失败,信息不对称'); if(!$count) $count = 0; @@ -241,7 +241,7 @@ class StoreCoupon extends AuthController if(!$endTime) $endTime = 0; if(!$startTime && $endTime) return JsonService::fail('请选择正确的开始时间'); if($startTime && !$endTime) return JsonService::fail('请选择正确的结束时间'); - if(StoreCouponIssue::setIssue($id,$count,strtotime($startTime),strtotime($endTime),$count,$status)) + if(StoreCouponIssue::setIssue($id,$count,strtotime($startTime),strtotime($endTime),$count,$status,$is_permanent)) return JsonService::successful('发布优惠劵成功!'); else return JsonService::fail('发布优惠劵失败!'); diff --git a/application/admin/controller/ump/UserPoint.php b/application/admin/controller/ump/UserPoint.php index d2b2632d..2394a73b 100644 --- a/application/admin/controller/ump/UserPoint.php +++ b/application/admin/controller/ump/UserPoint.php @@ -23,6 +23,9 @@ class UserPoint extends AuthController public function index() { $this->assign([ +// 'sum_point'=>UserBill::where(['category'=>'integral','type'=>'system_add'])->sum('number'), +// 'count'=>UserBill::where(['category'=>'integral','type'=>'sign'])->group('uid')->count(), +// 'song_point'=>UserBill::where(['category'=>'integral','type'=>'sign'])->group('uid')->sum('number'), 'is_layui'=>true, 'year'=>getMonth('y'), ]); diff --git a/application/admin/controller/user/UserLevel.php b/application/admin/controller/user/UserLevel.php new file mode 100644 index 00000000..27fd7608 --- /dev/null +++ b/application/admin/controller/user/UserLevel.php @@ -0,0 +1,335 @@ +fetch(); + } + + /* + * 创建form表单 + * */ + public function create($id=0) + { + if($id) $vipinfo=SystemUserLevel::get($id); + $field[]= Form::input('name','等级名称',isset($vipinfo) ? $vipinfo->name : '')->col(Form::col(24)); + $field[]= Form::radio('is_forever','是否为永久',isset($vipinfo) ? $vipinfo->is_forever : 0)->options([['label'=>'永久','value'=>1],['label'=>'非永久','value'=>0]])->col(24); + $field[]= Form::number('money','等级价格',isset($vipinfo) ? $vipinfo->money : 0)->min(0)->col(24); + $field[]= Form::radio('is_pay','是否需要购买',isset($vipinfo) ? $vipinfo->is_pay : 0)->options([['label'=>'需要','value'=>1],['label'=>'免费','value'=>0]])->col(24); + $field[]= Form::number('valid_date','有效时间(天)',isset($vipinfo) ? $vipinfo->valid_date : 0)->min(0)->col(8); + $field[]= Form::number('grade','等级',isset($vipinfo) ? $vipinfo->grade : 0)->min(0)->col(8); + $field[]= Form::number('discount','享受折扣',isset($vipinfo) ? $vipinfo->discount : 0)->min(0)->col(8); + $field[]= Form::frameImageOne('icon','图标',Url::build('admin/widget.images/index',array('fodder'=>'icon')),isset($vipinfo) ? $vipinfo->icon : '')->icon('image')->width('100%')->height('500px'); + $field[]= Form::frameImageOne('image','会员背景',Url::build('admin/widget.images/index',array('fodder'=>'image')),isset($vipinfo) ? $vipinfo->image : '')->icon('image')->width('100%')->height('500px'); + $field[]= Form::radio('is_show','是否显示',isset($vipinfo) ? $vipinfo->is_show : 0)->options([['label'=>'显示','value'=>1],['label'=>'隐藏','value'=>0]])->col(8); + $field[]= Form::textarea('explain','等级说明',isset($vipinfo) ? $vipinfo->explain : ''); + $form = Form::make_post_form('添加等级设置',$field,Url::build('save',['id'=>$id]),2); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /* + * 会员等级添加或者修改 + * @param $id 修改的等级id + * @return json + * */ + public function save($id=0) + { + $data=UtilService::postMore([ + ['name',''], + ['is_forever',0], + ['money',0], + ['is_pay',0], + ['valid_date',0], + ['grade',0], + ['discount',0], + ['icon',''], + ['image',''], + ['is_show',''], + ['explain',''], + ]); + if(!$data['name']) return JsonService::fail('请输入等级名称'); + if(!$data['grade']) return JsonService::fail('请输入等级'); + if(!$data['explain']) return JsonService::fail('请输入等级说明'); + if($data['is_forever']==0 && !$data['valid_date']) return JsonService::fail('请输入有效时间(天)'); + if($data['is_pay'] && !$data['money']) return JsonService::fail('请输入购买金额'); + if(!$data['icon']) return JsonService::fail('请上传等级图标'); + if(!$data['image']) return JsonService::fail('请上传等级背景图标'); + SystemUserLevel::beginTrans(); + try{ + //修改 + if($id){ + if(SystemUserLevel::edit($data,$id)){ + SystemUserLevel::commitTrans(); + return JsonService::successful('修改成功'); + }else{ + SystemUserLevel::rollbackTrans(); + return JsonService::fail('添加失败'); + } + }else{ + //新增 + $data['add_time']=time(); + if(SystemUserLevel::set($data)){ + SystemUserLevel::commitTrans(); + return JsonService::successful('添加成功'); + }else{ + SystemUserLevel::rollbackTrans(); + return JsonService::fail('添加失败'); + } + } + }catch (\Exception $e){ + SystemUserLevel::rollbackTrans(); + return JsonService::fail($e->getMessage()); + } + } + /* + * 获取系统设置的vip列表 + * @param int page + * @param int limit + * */ + public function get_system_vip_list() + { + $where=UtilService::getMore([ + ['page',0], + ['limit',10], + ['title',''], + ['is_show',''], + ]); + return JsonService::successlayui(SystemUserLevel::getSytemList($where)); + } + + /* + * 删除会员等级 + * @param int $id + * */ + public function delete($id=0) + { + if(SystemUserLevel::edit(['is_del'=>1],$id)) + return JsonService::successful('删除成功'); + else + return JsonService::fail('删除失败'); + } + + /** + * 设置单个产品上架|下架 + * + * @return json + */ + public function set_show($is_show='',$id=''){ + ($is_show=='' || $id=='') && Json::fail('缺少参数'); + $res=SystemUserLevel::where(['id'=>$id])->update(['is_show'=>(int)$is_show]); + if($res){ + return JsonService::successful($is_show==1 ? '显示成功':'隐藏成功'); + }else{ + return JsonService::fail($is_show==1 ? '显示失败':'隐藏失败'); + } + } + + /** + * 快速编辑 + * + * @return json + */ + public function set_value($field='',$id='',$value=''){ + $field=='' || $id=='' || $value=='' && Json::fail('缺少参数'); + if(SystemUserLevel::where(['id'=>$id])->update([$field=>$value])) + return JsonService::successful('保存成功'); + else + return JsonService::fail('保存失败'); + } + + + /* + * 等级任务列表 + * @param int $vip_id 等级id + * @return json + * */ + public function tash($level_id=0) + { + $this->assign('level_id',$level_id); + return $this->fetch(); + } + + /** + * 快速编辑 + * + * @return json + */ + public function set_tash_value($field='',$id='',$value=''){ + $field=='' || $id=='' || $value=='' && Json::fail('缺少参数'); + if(SystemUserTask::where(['id'=>$id])->update([$field=>$value])) + return JsonService::successful('保存成功'); + else + return JsonService::fail('保存失败'); + } + + /** + * 设置单个产品上架|下架 + * + * @return json + */ + public function set_tash_show($is_show='',$id=''){ + ($is_show=='' || $id=='') && Json::fail('缺少参数'); + $res=SystemUserTask::where(['id'=>$id])->update(['is_show'=>(int)$is_show]); + if($res){ + return JsonService::successful($is_show==1 ? '显示成功':'隐藏成功'); + }else{ + return JsonService::fail($is_show==1 ? '显示失败':'隐藏失败'); + } + } + + /** + * 设置单个产品上架|下架 + * + * @return json + */ + public function set_tash_must($is_must='',$id=''){ + ($is_must=='' || $id=='') && Json::fail('缺少参数'); + $res=SystemUserTask::where(['id'=>$id])->update(['is_must'=>(int)$is_must]); + if($res){ + return JsonService::successful('设置成功'); + }else{ + return JsonService::fail('设置失败'); + } + } + + /* + * 生成任务表单 + * @param int $id 任务id + * @param int $vip_id 会员id + * @return html + * */ + public function create_tash($id=0,$level_id=0) + { + if($id) $tash=SystemUserTask::get($id); + $field[]= Form::select('task_type','任务类型',isset($tash) ? $tash->task_type : '')->setOptions(function(){ + $list = SystemUserTask::getTaskTypeAll(); + $menus=[]; + foreach ($list as $menu){ + $menus[] = ['value'=>$menu['type'],'label'=>$menu['name'].'----单位['.$menu['unit'].']']; + } + return $menus; + })->filterable(1); + $field[]= Form::number('number','限定数量',isset($tash) ? $tash->number : 0)->min(0)->col(24); + $field[]= Form::number('sort','排序',isset($tash) ? $tash->sort : 0)->min(0)->col(24); + $field[]= Form::radio('is_show','是否显示',isset($tash) ? $tash->is_show : 1)->options([['label'=>'显示','value'=>1],['label'=>'隐藏','value'=>0]])->col(24); + $field[]= Form::radio('is_must','是否务必达成',isset($tash) ? $tash->is_must : 1)->options([['label'=>'务必达成','value'=>1],['label'=>'完成其一','value'=>0]])->col(24); + $field[]= Form::textarea('illustrate','任务说明',isset($tash) ? $tash->illustrate : ''); + $form = Form::make_post_form('添加任务',$field,Url::build('save_tash',['id'=>$id,'level_id'=>$level_id]),2); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + + /* + * 保存或者修改任务 + * @param int $id 任务id + * @param int $vip_id 会员id + * */ + public function save_tash($id=0,$level_id=0) + { + if(!$level_id) return JsonService::fail('缺少参数'); + $data=UtilService::postMore([ + ['task_type',''], + ['number',0], + ['is_show',0], + ['sort',0], + ['is_must',0], + ['illustrate',''], + ]); + if(!$data['task_type']) return JsonService::fail('请选择任务类型'); + if($data['number'] < 0) return JsonService::fail('请输入限定数量'); + $tash=SystemUserTask::getTaskType($data['task_type']); + if($tash['max_number']!=0 && $data['number'] > $tash['max_number']) return JsonService::fail('您设置的限定数量超出最大限制,最大限制为:'.$tash['max_number']); + $data['name']=SystemUserTask::setTaskName($data['task_type'],$data['number']); + try{ + if($id){ + SystemUserTask::edit($data,$id); + return JsonService::successful('修改成功'); + }else{ + $data['level_id']=$level_id; + $data['add_time']=time(); + $data['real_name']=$tash['real_name']; + if(SystemUserTask::set($data)) + return JsonService::successful('添加成功'); + else + return JsonService::fail('添加失败'); + } + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + } + + /* + * 异步获取等级任务列表 + * @param int $vip_id 会员id + * @param int $page 分页 + * @param int $limit 显示条数 + * @return json + * */ + public function get_tash_list($level_id=0) + { + list($page,$limit)=UtilService::getMore([ + ['page',1], + ['limit',10], + ],$this->request,true); + return JsonService::successlayui(SystemUserTask::getTashList($level_id,(int)$page,(int)$limit)); + } + + /* + * 删除任务 + * @param int 任务id + * */ + public function delete_tash($id=0) + { + if(!$id) return JsonService::fail('缺少差参数'); + if(SystemUserTask::del($id)) + return JsonService::successful('删除成功'); + else + return JsonService::fail('删除失败'); + } + + /* + * 会员等级展示 + * + * */ + public function user_level_list() + { + $this->assign('level',SystemUserLevel::where('is_del',0)->where('is_show',1)->order('grade asc')->field(['id','name'])->select()); + return $this->fetch(); + } + + public function get_user_vip_list() + { + $where=UtilService::getMore([ + ['page',1], + ['limit',10], + ['nickname',''], + ['level_id',''], + ]); + return JsonService::successlayui(UserLevelModel::getUserVipList($where)); + } + +} \ No newline at end of file diff --git a/application/admin/controller/wechat/Menus.php b/application/admin/controller/wechat/Menus.php index 9ba7298b..eec0e9ab 100644 --- a/application/admin/controller/wechat/Menus.php +++ b/application/admin/controller/wechat/Menus.php @@ -2,7 +2,7 @@ namespace app\admin\controller\wechat; use app\admin\controller\AuthController; -use service\WechatService; +use app\core\util\WechatService; use think\Cache; use think\Db; use think\Request; diff --git a/application/admin/controller/wechat/Reply.php b/application/admin/controller/wechat/Reply.php index ff7b9a01..9e0af259 100644 --- a/application/admin/controller/wechat/Reply.php +++ b/application/admin/controller/wechat/Reply.php @@ -23,10 +23,23 @@ class Reply extends AuthController { if(empty(input('key'))) return $this->failed('请输入参数key'); if(empty(input('title'))) return $this->failed('请输入参数title'); - $replay = WechatReply::getDataByKey(input('key')); + $key = input('key'); + switch($key){ + case 'subscribe': + $title = '编辑关注回复'; + break; + case 'default': + $title = '编辑关键字默认回复'; + break; + default: + $title = '编辑关键字回复'; + break; + } + + $replay = WechatReply::getDataByKey($key); $this->assign('replay_arr',json_encode($replay)); - $this->assign('key',input('key')); - $this->assign('title',urldecode(input('title'))); + $this->assign('key',$key); + $this->assign('title',$title); return $this->fetch(); } diff --git a/application/admin/controller/wechat/WechatNewsCategory.php b/application/admin/controller/wechat/WechatNewsCategory.php index f97e07a5..7c1eb11a 100644 --- a/application/admin/controller/wechat/WechatNewsCategory.php +++ b/application/admin/controller/wechat/WechatNewsCategory.php @@ -14,7 +14,7 @@ use service\UtilService; use think\Db; use think\Request; use think\Url; -use service\WechatService; +use app\core\util\WechatService; use \app\admin\model\wechat\WechatNewsCategory as WechatNewsCategoryModel; use app\admin\model\article\Article as ArticleModel; /** @@ -235,8 +235,8 @@ class WechatNewsCategory extends AuthController if($v['author'] == '') return JsonService::fail('作者不能为空'); if($v['content'] == '') return JsonService::fail('正文不能为空'); if($v['synopsis'] == '') return JsonService::fail('摘要不能为空'); - $v['add_time'] = time(); $v['status'] = 1; + $v['add_time'] = time(); if($v['id']){ $idC = $v['id']; unset($v['id']); diff --git a/application/admin/controller/wechat/WechatTemplate.php b/application/admin/controller/wechat/WechatTemplate.php index 1308ec77..addc1126 100644 --- a/application/admin/controller/wechat/WechatTemplate.php +++ b/application/admin/controller/wechat/WechatTemplate.php @@ -6,7 +6,7 @@ use app\admin\controller\AuthController; use service\FormBuilder as Form; use service\UtilService as Util; use service\JsonService as Json; -use service\WechatTemplateService; +use app\core\util\WechatTemplateService; use think\Cache; use think\Request; use think\Url; @@ -32,10 +32,15 @@ class WechatTemplate extends AuthController $this->assign('where',$where); $this->assign(WechatTemplateModel::SystemPage($where)); $industry = Cache::tag($this->cacheTag)->remember('_wechat_industry',function(){ - $cache = WechatTemplateService::getIndustry(); - if(!$cache) return []; - Cache::tag($this->cacheTag,['_wechat_industry']); - return $cache->toArray(); + try{ + $cache = WechatTemplateService::getIndustry(); + if(!$cache) return []; + Cache::tag($this->cacheTag,['_wechat_industry']); + return $cache->toArray(); + }catch (\Exception $e){ + return $e->getMessage(); + } + },0)?:[]; !is_array($industry) && $industry = []; $this->assign('industry',$industry); diff --git a/application/admin/controller/wechat/WechatUser.php b/application/admin/controller/wechat/WechatUser.php index bc1a1df3..d0b288dd 100644 --- a/application/admin/controller/wechat/WechatUser.php +++ b/application/admin/controller/wechat/WechatUser.php @@ -1 +1,398 @@ -request); $tagidList = explode(',',$where['tagid_list']); foreach ($tagidList as $k=>$v){ if(!$v){ unset($tagidList[$k]); } } $tagidList = array_unique($tagidList); $where['tagid_list'] = implode(',',$tagidList); $this->assign([ 'where'=>$where, 'groupList'=>UserModel::getUserGroup(), 'tagList'=>UserModel::getUserTag() ]); $limitTimeList = [ 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), 'week'=>implode(' - ',[ date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) ]), 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), 'quarter'=>implode(' - ',[ date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) ]), 'year'=>implode(' - ',[ date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) ]) ]; $uidAll = UserModel::getAll($where); $this->assign(compact('limitTimeList','uidAll')); $this->assign(UserModel::systemPage($where)); return $this->fetch(); } public function edit_user_tag($openid) { if(!$openid) return JsonService::fail('参数错误!'); $list = Collection::make(UserModel::getUserTag())->each(function($item){ return ['value'=>$item['id'],'label'=>$item['name']]; }); $tagList = UserModel::where('openid',$openid)->value('tagid_list'); $tagList = explode(',',$tagList)?:[]; $f = [Form::select('tag_id','用户标签',$tagList)->setOptions($list->toArray())->multiple(1)]; $form = Form::make_post_form('标签名称',$f,Url::build('update_user_tag',compact('openid'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update_user_tag(Request $request,$openid) { if(!$openid) return JsonService::fail('参数错误!'); $tagId = $request->post('tag_id/a',[]); if(!$tagId) return JsonService::fail('请选择用户标签!'); $tagList = explode(',',UserModel::where('openid',$openid)->value('tagid_list'))?:[]; UserModel::beginTrans(); if(!$tagId[0])unset($tagId[0]); UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); try{ foreach ($tagList as $tag){ if($tag) WechatService::userTagService()->batchUntagUsers([$openid],$tag); } foreach ($tagId as $tag){ WechatService::userTagService()->batchTagUsers([$openid],$tag); } }catch (\Exception $e){ UserModel::rollbackTrans(); return JsonService::fail($e->getMessage()); } UserModel::commitTrans(); return JsonService::successful('修改成功!'); } public function edit_user_group($openid) { if(!$openid) return JsonService::fail('参数错误!'); $list = Collection::make(UserModel::getUserGroup())->each(function($item){ return ['value'=>$item['id'],'label'=>$item['name']]; }); $groupId = UserModel::where('openid',$openid)->value('groupid'); $f = [Form::select('tag_id','用户标签',(string)$groupId)->setOptions($list->toArray())]; $form = Form::make_post_form('标签名称',$f,Url::build('update_user_group',compact('openid'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update_user_group(Request $request,$openid) { if(!$openid) return JsonService::fail('参数错误!'); $groupId = $request->post('group_id'); if(!$groupId) return JsonService::fail('请选择用户分组!'); UserModel::beginTrans(); UserModel::edit(['groupid'=>$groupId],$openid,'openid'); try{ WechatService::userGroupService()->moveUser($openid,$groupId); }catch (\Exception $e){ UserModel::rollbackTrans(); return JsonService::fail($e->getMessage()); } UserModel::commitTrans(); return JsonService::successful('修改成功!'); } /** * 用户标签列表 */ public function tag($refresh = 0) { if($refresh == 1) { UserModel::clearUserTag(); $this->redirect(Url::build('tag')); } $list = UserModel::getUserTag(); $this->assign(compact('list')); return $this->fetch(); } /** * 添加标签 * @return mixed */ public function create_tag() { $f = [Form::input('name','标签名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('save_tag')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 添加 * @param Request $request * @return \think\response\Json */ public function save_tag(Request $request) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入标签名称!'); try{ WechatService::userTagService()->create($tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('添加标签成功!'); } /** * 修改标签 * @param $id * @return mixed */ public function edit_tag($id) { $f = [Form::input('name','标签名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('update_tag',['id'=>$id])); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 修改标签 * @param Request $request * @param $id * @return \think\response\Json */ public function update_tag(Request $request, $id) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入标签名称!'); try{ WechatService::userTagService()->update($id,$tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('修改标签成功!'); } /** * 删除标签 * @param $id * @return \think\response\Json */ public function delete_tag($id) { try{ WechatService::userTagService()->delete($id); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('删除标签成功!'); } /** * 用户分组列表 */ public function group($refresh = 0) { if($refresh == 1) { UserModel::clearUserGroup(); $this->redirect(Url::build('group')); } $list = UserModel::getUserGroup(); $this->assign(compact('list')); return $this->fetch(); } /** * 添加分组 * @return mixed */ public function create_group() { $f = [Form::input('name','分组名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('save_group')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 添加 * @param Request $request * @return \think\response\Json */ public function save_group(Request $request) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入分组名称!'); try{ WechatService::userGroupService()->create($tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('添加分组成功!'); } /** * 修改分组 * @param $id * @return mixed */ public function edit_group($id) { $f = [Form::input('name','分组名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('update_group',compact('id'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 修改分组 * @param Request $request * @param $id * @return \think\response\Json */ public function update_group(Request $request, $id) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入分组名称!'); try{ WechatService::userGroupService()->update($id,$tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('修改分组成功!'); } /** * 删除分组 * @param $id * @return \think\response\Json */ public function delete_group($id) { try{ WechatService::userTagService()->delete($id); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('删除分组成功!'); } public function synchro_tag($openid){ if(!$openid) return JsonService::fail('参数错误!'); $data = array(); if(UserModel::be($openid,'openid')){ try{ $tag = WechatService::userTagService()->userTags($openid)->toArray(); }catch (\Exception $e) { return JsonService::fail($e->getMessage()); } if($tag['tagid_list']) $data['tagid_list'] = implode(',',$tag['tagid_list']); else $data['tagid_list'] = ''; $res = UserModel::edit($data,$openid,'openid'); if($res) return JsonService::successful('同步成功'); else return JsonService::fail('同步失败!'); }else return JsonService::fail('参数错误!'); } /** * 一级推荐人页面 * @return mixed */ public function stair($uid = ''){ if($uid == '') return $this->failed('参数错误'); $list = User::alias('u') ->where('u.spread_uid',$uid) ->field('u.avatar,u.nickname,u.now_money,u.add_time,u.uid') ->where('u.status',1) ->order('u.add_time DESC') ->select() ->toArray(); foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid']); $this->assign('list',$list); return $this->fetch(); } /** * 个人资金详情页面 * @return mixed */ public function now_money($uid = ''){ if($uid == '') return $this->failed('参数错误'); $list = UserBill::where('uid',$uid)->where('category','now_money') ->field('mark,pm,number,add_time') ->where('status',1)->order('add_time DESC')->select()->toArray(); foreach ($list as &$v){ $v['add_time'] = date('Y-m-d H:i:s',$v['add_time']); } $this->assign('list',$list); return $this->fetch(); } } \ No newline at end of file +request); + $tagidList = explode(',',$where['tagid_list']); + foreach ($tagidList as $k=>$v){ + if(!$v){ + unset($tagidList[$k]); + } + } + $tagidList = array_unique($tagidList); + $where['tagid_list'] = implode(',',$tagidList); + try{ + $groupList=UserModel::getUserGroup(); + $tagList=UserModel::getUserTag(); + }catch (\Exception $e){ + $groupList=[]; + $tagList=[]; + } + $this->assign([ + 'where'=>$where, + 'groupList'=>$groupList, + 'tagList'=>$tagList + ]); + $limitTimeList = [ + 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), + 'week'=>implode(' - ',[ + date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), + date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) + ]), + 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), + 'quarter'=>implode(' - ',[ + date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', + date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) + ]), + 'year'=>implode(' - ',[ + date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) + ]) + ]; + $uidAll = UserModel::getAll($where); + $this->assign(compact('limitTimeList','uidAll')); + $this->assign(UserModel::systemPage($where)); + return $this->fetch(); + } + + public function edit_user_tag($openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $list = Collection::make(UserModel::getUserTag())->each(function($item){ + return ['value'=>$item['id'],'label'=>$item['name']]; + }); + $tagList = UserModel::where('openid',$openid)->value('tagid_list'); + + $tagList = explode(',',$tagList)?:[]; + $f = [Form::select('tag_id','用户标签',$tagList)->setOptions($list->toArray())->multiple(1)]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_user_tag',compact('openid'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + public function update_user_tag(Request $request,$openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $tagId = $request->post('tag_id/a',[]); + if(!$tagId) return JsonService::fail('请选择用户标签!'); + $tagList = explode(',',UserModel::where('openid',$openid)->value('tagid_list'))?:[]; + UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); + if(!$tagId[0])unset($tagId[0]); + UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); + try{ + foreach ($tagList as $tag){ + if($tag) WechatService::userTagService()->batchUntagUsers([$openid],$tag); + } + foreach ($tagId as $tag){ + WechatService::userTagService()->batchTagUsers([$openid],$tag); + } + }catch (\Exception $e){ + UserModel::rollbackTrans(); + return JsonService::fail($e->getMessage()); + } + UserModel::commitTrans(); + return JsonService::successful('修改成功!'); + } + + public function edit_user_group($openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $list = Collection::make(UserModel::getUserGroup())->each(function($item){ + return ['value'=>$item['id'],'label'=>$item['name']]; + }); + $groupId = UserModel::where('openid',$openid)->value('groupid'); + $f = [Form::select('group_id','用户分组',(string)$groupId)->setOptions($list->toArray())]; + $form = Form::make_post_form('用户分组',$f,Url::build('update_user_group',compact('openid'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + public function update_user_group(Request $request,$openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $groupId = $request->post('group_id'); +// if(!$groupId) return JsonService::fail('请选择用户分组!'); + UserModel::beginTrans(); + UserModel::edit(['groupid'=>$groupId],$openid,'openid'); + try{ + WechatService::userGroupService()->moveUser($openid,$groupId); + }catch (\Exception $e){ + UserModel::rollbackTrans(); + return JsonService::fail($e->getMessage()); + } + UserModel::commitTrans(); + return JsonService::successful('修改成功!'); + } + + /** + * 用户标签列表 + */ + public function tag($refresh = 0) + { + $list=[]; + if($refresh == 1) { + UserModel::clearUserTag(); + $this->redirect(Url::build('tag')); + } + try{ + $list = UserModel::getUserTag(); + }catch (\Exception $e){} + $this->assign(compact('list')); + return $this->fetch(); + } + + /** + * 添加标签 + * @return mixed + */ + public function create_tag() + { + $f = [Form::input('name','标签名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('save_tag')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 添加 + * @param Request $request + * @return \think\response\Json + */ + public function save_tag(Request $request) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入标签名称!'); + try{ + WechatService::userTagService()->create($tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('添加标签成功!'); + } + + /** + * 修改标签 + * @param $id + * @return mixed + */ + public function edit_tag($id) + { + $f = [Form::input('name','标签名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_tag',['id'=>$id])); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 修改标签 + * @param Request $request + * @param $id + * @return \think\response\Json + */ + public function update_tag(Request $request, $id) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入标签名称!'); + try{ + WechatService::userTagService()->update($id,$tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('修改标签成功!'); + } + + /** + * 删除标签 + * @param $id + * @return \think\response\Json + */ + public function delete_tag($id) + { + try{ + WechatService::userTagService()->delete($id); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('删除标签成功!'); + } + + /** + * 用户分组列表 + */ + + public function group($refresh = 0) + { + $list=[]; + if($refresh == 1) { + UserModel::clearUserGroup(); + $this->redirect(Url::build('group')); + } + try{ + $list = UserModel::getUserGroup(); + }catch (\Exception $e){} + $this->assign(compact('list')); + return $this->fetch(); + } + + /** + * 添加分组 + * @return mixed + */ + public function create_group() + { + $f = [Form::input('name','分组名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('save_group')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 添加 + * @param Request $request + * @return \think\response\Json + */ + public function save_group(Request $request) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入分组名称!'); + try{ + WechatService::userGroupService()->create($tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('添加分组成功!'); + } + + /** + * 修改分组 + * @param $id + * @return mixed + */ + public function edit_group($id) + { + $f = [Form::input('name','分组名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_group',compact('id'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 修改分组 + * @param Request $request + * @param $id + * @return \think\response\Json + */ + public function update_group(Request $request, $id) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入分组名称!'); + try{ + WechatService::userGroupService()->update($id,$tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('修改分组成功!'); + } + + /** + * 删除分组 + * @param $id + * @return \think\response\Json + */ + public function delete_group($id) + { + try{ + WechatService::userTagService()->delete($id); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('删除分组成功!'); + } + + public function synchro_tag($openid){ + if(!$openid) return JsonService::fail('参数错误!'); + $data = array(); + if(UserModel::be($openid,'openid')){ + try{ + $tag = WechatService::userTagService()->userTags($openid)->toArray(); + }catch (\Exception $e) { + return JsonService::fail($e->getMessage()); + } + if($tag['tagid_list']) $data['tagid_list'] = implode(',',$tag['tagid_list']); + else $data['tagid_list'] = ''; + $res = UserModel::edit($data,$openid,'openid'); + if($res) return JsonService::successful('同步成功'); + else return JsonService::fail('同步失败!'); + }else return JsonService::fail('参数错误!'); + } + + /** + * 一级推荐人页面 + * @return mixed + */ + public function stair($uid = ''){ + if($uid == '') return $this->failed('参数错误'); + $list = User::alias('u') + ->where('u.spread_uid',$uid) + ->field('u.avatar,u.nickname,u.now_money,u.add_time,u.uid') + ->where('u.status',1) + ->order('u.add_time DESC') + ->select() + ->toArray(); + foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid']); + $this->assign('list',$list); + return $this->fetch(); + } + + /** + * 个人资金详情页面 + * @return mixed + */ + public function now_money($uid = ''){ + if($uid == '') return $this->failed('参数错误'); + $list = UserBill::where('uid',$uid)->where('category','now_money') + ->field('mark,pm,number,add_time') + ->where('status',1)->order('add_time DESC')->select()->toArray(); + foreach ($list as &$v){ + $v['add_time'] = date('Y-m-d H:i:s',$v['add_time']); + } + $this->assign('list',$list); + return $this->fetch(); + } + +} + diff --git a/application/admin/model/article/Article.php b/application/admin/model/article/Article.php index 161f0a13..636bea5a 100644 --- a/application/admin/model/article/Article.php +++ b/application/admin/model/article/Article.php @@ -1 +1,153 @@ - * @day: 2017/11/02 */ namespace app\admin\model\article; use app\admin\model\system\SystemAdmin; use traits\ModelTrait; use basic\ModelBasic; use think\Db; /** * 图文管理 Model * Class WechatNews * @package app\admin\model\wechat */ class Article extends ModelBasic { use ModelTrait; /** * 获取配置分类 * @param array $where * @return array */ public static function getAll($where = array()){ $model = new self; // if($where['status'] !== '') $model = $model->where('status',$where['status']); // if($where['access'] !== '') $model = $model->where('access',$where['access']); if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where("CONCAT(',',cid,',') LIKE '%,$where[cid],%'"); if($where['cid'] == ''){ if(!$where['merchant']) $model = $model->where('mer_id',0); if($where['merchant']) $model = $model->where('mer_id','GT',0); } $model = $model->where('status',1)->where('hide',0); return self::page($model,function($item){ if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); $item['catename'] = Db::name('ArticleCategory')->where('id',$item['cid'])->value('title'); },$where); } /** * 删除图文 * @param $id * @return bool */ public static function del($id){ return self::edit(['status'=>0],$id,'id'); } /** * 获取指定字段的值 * @return array */ public static function getNews() { return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); } /** * 给表中的字符串类型追加值 * 删除所有有当前分类的id之后重新添加 * @param $cid * @param $id * @return bool */ public static function saveBatchCid($cid,$id){ $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 foreach ($res_all as $k=>$v){ $cid_arr = explode(',',$v['cid']); if(in_array($cid,$cid_arr)){ $key = array_search($cid, $cid_arr); array_splice($cid_arr, $key, 1); } if(empty($cid_arr)) { $data['cid'] = 0; self::edit($data,$v['id']); }else{ $data['cid'] = implode(',',$cid_arr); self::edit($data,$v['id']); } } $res = self::where('id','IN',$id)->select(); foreach ($res as $k=>$v){ if(!in_array($cid,explode(',',$v['cid']))){ if(!$v['cid']){ $data['cid'] = $cid; }else{ $data['cid'] = $v['cid'].','.$cid; } self::edit($data,$v['id']); } } return true; } public static function setContent($id,$content){ $count = Db::name('ArticleContent')->where('nid',$id)->count(); $data['nid'] = $id; $data['content'] = $content; // dump($data); if($count){ $res = Db::name('ArticleContent')->where('nid',$id)->setField('content',$content); if($res !== false) $res = true; } else $res = Db::name('ArticleContent')->insert($data); // echo Db::getLastSql(); // exit(); return $res; } public static function merchantPage($where = array()){ $model = new self; if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); $model = $model ->where('status',1) ->where('hide',0) ->where('admin_id',$where['admin_id']) ->where('mer_id',$where['mer_id']); return self::page($model,function($item){ $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); },$where); } /** * 获取指定文章列表 图文管理使用 * @param string $id * @param string $field * @return false|\PDOStatement|string|\think\Collection */ public static function getArticleList($id = '',$field = 'title,author,image_input,synopsis,id'){ $list = self::where('id','IN',$id)->field($field)->select(); foreach ($list as $k=>$v){ $list[$k]['content'] = Db::name('ArticleContent')->where('nid',$v['id'])->value('content'); } return $list; } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\article; + +use app\admin\model\system\SystemAdmin; +use traits\ModelTrait; +use basic\ModelBasic; +use think\Db; + +/** + * 图文管理 Model + * Class WechatNews + * @package app\admin\model\wechat + */ +class Article extends ModelBasic { + + use ModelTrait; + + /** + * 获取配置分类 + * @param array $where + * @return array + */ + public static function getAll($where = array()){ + $model = new self; +// if($where['status'] !== '') $model = $model->where('status',$where['status']); +// if($where['access'] !== '') $model = $model->where('access',$where['access']); + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') + $model = $model->where('cid','in',$where['cid']); + else + if($where['merchant']) + $model = $model->where('mer_id','GT',0); + else + $model = $model->where('mer_id',0); + $model = $model->where('status',1)->where('hide',0); + return self::page($model,function($item){ + if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); + else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); + $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); + $item['catename'] = Db::name('ArticleCategory')->where('id',$item['cid'])->value('title'); + },$where); + } + + /** + * 删除图文 + * @param $id + * @return bool + */ + public static function del($id){ + return self::edit(['status'=>0],$id,'id'); + } + + /** + * 获取指定字段的值 + * @return array + */ + public static function getNews() + { + return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); + } + + /** + * 给表中的字符串类型追加值 + * 删除所有有当前分类的id之后重新添加 + * @param $cid + * @param $id + * @return bool + */ + public static function saveBatchCid($cid,$id){ + $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 + foreach ($res_all as $k=>$v){ + $cid_arr = explode(',',$v['cid']); + if(in_array($cid,$cid_arr)){ + $key = array_search($cid, $cid_arr); + array_splice($cid_arr, $key, 1); + } + if(empty($cid_arr)) { + $data['cid'] = 0; + self::edit($data,$v['id']); + }else{ + $data['cid'] = implode(',',$cid_arr); + self::edit($data,$v['id']); + } + } + $res = self::where('id','IN',$id)->select(); + foreach ($res as $k=>$v){ + if(!in_array($cid,explode(',',$v['cid']))){ + if(!$v['cid']){ + $data['cid'] = $cid; + }else{ + $data['cid'] = $v['cid'].','.$cid; + } + self::edit($data,$v['id']); + } + } + return true; + } + + public static function setContent($id,$content){ + $count = Db::name('ArticleContent')->where('nid',$id)->count(); + $data['nid'] = $id; + $data['content'] = $content; +// dump($data); + if($count){ + $res = Db::name('ArticleContent')->where('nid',$id)->setField('content',$content); + if($res !== false) $res = true; + } + else + $res = Db::name('ArticleContent')->insert($data); +// echo Db::getLastSql(); +// exit(); + return $res; + } + + public static function merchantPage($where = array()){ + $model = new self; + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); + $model = $model + ->where('status',1) + ->where('hide',0) + ->where('admin_id',$where['admin_id']) + ->where('mer_id',$where['mer_id']); + return self::page($model,function($item){ + $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); + },$where); + } + + /** + * 获取指定文章列表 图文管理使用 + * @param string $id + * @param string $field + * @return false|\PDOStatement|string|\think\Collection + */ + public static function getArticleList($id = '',$field = 'title,author,image_input,synopsis,id'){ + $list = self::where('id','IN',$id)->field($field)->select(); + foreach ($list as $k=>$v){ + $list[$k]['content'] = Db::name('ArticleContent')->where('nid',$v['id'])->value('content'); + } + return $list; + } +} \ No newline at end of file diff --git a/application/admin/model/finance/FinanceModel.php b/application/admin/model/finance/FinanceModel.php index 0242ce24..8564270d 100644 --- a/application/admin/model/finance/FinanceModel.php +++ b/application/admin/model/finance/FinanceModel.php @@ -10,7 +10,7 @@ namespace app\admin\model\finance; use traits\ModelTrait; use basic\ModelBasic; use service\ExportService; -use app\wap\model\user\UserBill; +use app\core\model\user\UserBill; use app\admin\model\user\User; use service\PHPExcelService; /*数据统计处理*/ diff --git a/application/admin/model/order/StoreOrder.php b/application/admin/model/order/StoreOrder.php index 99da5ee6..b423eaae 100644 --- a/application/admin/model/order/StoreOrder.php +++ b/application/admin/model/order/StoreOrder.php @@ -8,19 +8,22 @@ namespace app\admin\model\order; +use app\admin\model\ump\StoreCouponUser; use app\admin\model\wechat\WechatUser; use app\admin\model\ump\StorePink; use app\admin\model\order\StoreOrderCartInfo; use app\admin\model\store\StoreProduct; use app\admin\model\routine\RoutineFormId; -use app\admin\model\routine\RoutineTemplate; +use app\core\model\routine\RoutineTemplate; +use service\ProgramTemplateService; use service\PHPExcelService; use traits\ModelTrait; use basic\ModelBasic; -use service\WechatTemplateService; -use service\RoutineTemplateService; +use app\core\util\WechatTemplateService; use think\Url; use think\Db; +use app\admin\model\user\User; +use app\admin\model\user\UserBill; /** * 订单管理Model * Class StoreOrder @@ -38,9 +41,10 @@ class StoreOrder extends ModelBasic $data['jy']=self::statusByWhere(4,new self())->count(); $data['tk']=self::statusByWhere(-1,new self())->count(); $data['yt']=self::statusByWhere(-2,new self())->count(); - $data['general']=self::where(['pink_id'=>0,'combination_id'=>0,'seckill_id'=>0])->count(); - $data['pink']=self::where('pink_id|combination_id','neq',0)->count(); - $data['seckill']=self::where('seckill_id','neq',0)->count(); + $data['general']=self::where(['pink_id'=>0,'combination_id'=>0,'seckill_id'=>0,'bargain_id'=>0])->count(); + $data['pink']=self::where('pink_id|combination_id','>',0)->count(); + $data['seckill']=self::where('seckill_id','>',0)->count(); + $data['bargain']=self::where('bargain_id','>',0)->count(); return $data; } @@ -84,14 +88,15 @@ class StoreOrder extends ModelBasic $item['color'] = '#457856'; break; } + }elseif ($item['seckill_id']){ + $item['pink_name'] = '[秒杀订单]'; + $item['color'] = '#32c5e9'; + }elseif ($item['bargain_id']){ + $item['pink_name'] = '[砍价订单]'; + $item['color'] = '#12c5e9'; }else{ - if($item['seckill_id']){ - $item['pink_name'] = '[秒杀订单]'; - $item['color'] = '#32c5e9'; - }else{ - $item['pink_name'] = '[普通订单]'; - $item['color'] = '#895612'; - } + $item['pink_name'] = '[普通订单]'; + $item['color'] = '#895612'; } if($item['paid']==1){ switch ($item['pay_type']){ @@ -276,6 +281,9 @@ HTML; if($item['seckill_id']){ $item['pink_name'] = '[秒杀订单]'; $item['color'] = '#32c5e9'; + }elseif ($item['bargain_id']){ + $item['pink_name'] = '[砍价订单]'; + $item['color'] = '#12c5e9'; }else{ $item['pink_name'] = '[普通订单]'; $item['color'] = '#895612'; @@ -336,7 +344,7 @@ HTML; } /** - * 退款发送模板消息 + * TODO 公众号退款发送模板消息 * @param $oid * $oid 订单id key */ @@ -352,6 +360,26 @@ HTML; ],Url::build('wap/My/order',['uni'=>$order['order_id']],true,true)); } + /** + * TODO 小程序余额退款模板消息 + * @param $oid + * @return bool|mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public static function refundRoutineTemplate($oid){ + $order = self::where('id',$oid)->find(); + $data['keyword1'] = $order['order_id']; + $data['keyword2'] = date('Y-m-d H:i:s',time()); + $data['keyword3'] = $order['pay_price']; + if($order['pay_type'] == 'yue') $data['keyword4'] = '余额支付'; + else if($order['pay_type'] == 'weixin') $data['keyword4'] = '微信支付'; + else if($order['pay_type'] == 'offline') $data['keyword4'] = '线下支付'; + $data['keyword5'] = '已成功退款'; + return RoutineTemplate::sendOut('ORDER_REFUND_SUCCESS',$order['uid'],$data); + } + /** * 处理where条件 * @param $where @@ -364,7 +392,7 @@ HTML; if($where['is_del'] != '' && $where['is_del'] != -1) $model = $model->where($aler.'is_del',$where['is_del']); if(isset($where['combination_id'])){ if($where['combination_id'] =='普通订单'){ - $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0); + $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0)->where($aler.'bargain_id',0); } if($where['combination_id'] =='拼团订单'){ $model = $model->where($aler.'combination_id',">",0)->where($aler.'pink_id',">",0); @@ -372,18 +400,25 @@ HTML; if($where['combination_id'] =='秒杀订单'){ $model = $model->where($aler.'seckill_id',">",0); } + if($where['combination_id'] =='砍价订单'){ + $model = $model->where($aler.'bargain_id',">",0); + } } if(isset($where['type'])){ switch ($where['type']){ case 1: - $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0); + $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0)->where($aler.'bargain_id',0); break; case 2: - $model = $model->where($aler.'combination_id',">",0)->where($aler.'pink_id',">",0); +// $model = $model->where($aler.'combination_id',">",0)->where($aler.'pink_id',">",0); + $model = $model->where($aler.'combination_id',">",0); break; case 3: $model = $model->where($aler.'seckill_id',">",0); break; + case 4: + $model = $model->where($aler.'bargain_id',">",0); + break; } } @@ -482,23 +517,32 @@ HTML; $price['back_integral'] = 0;//退积分总数 $price['deduction_price'] = 0;//抵扣金额 $price['total_num'] = 0; //商品总数 - $model = self::getOrderWhere($where,$model); - $list = $model->where('is_del',0)->select()->toArray(); + $sumNumber =self::getOrderWhere($where,$model)->where('is_del',0)->field([ + 'sum(total_num) as sum_total_num', + 'sum(pay_price) as sum_pay_price', + 'sum(refund_price) as sum_refund_price', + 'sum(use_integral) as sum_use_integral', + 'sum(back_integral) as sum_back_integral', + 'sum(deduction_price) as sum_deduction_price' + ])->find(); + if($sumNumber) { + $price['total_num'] = $sumNumber['sum_total_num']; + $price['pay_price'] = $sumNumber['sum_pay_price']; + $price['refund_price'] = $sumNumber['sum_refund_price']; + $price['use_integral'] = $sumNumber['sum_use_integral']; + $price['back_integral'] = $sumNumber['sum_back_integral']; + $price['deduction_price'] = $sumNumber['sum_deduction_price']; + } + $list=self::getOrderWhere($where,$model)->where('is_del',0)->group('pay_type')->field(['sum(pay_price) as sum_pay_price','pay_type'])->select(); foreach ($list as $v){ - $price['total_num'] = bcadd($price['total_num'],$v['total_num'],0); - $price['pay_price'] = bcadd($price['pay_price'],$v['pay_price'],2); - $price['refund_price'] = bcadd($price['refund_price'],$v['refund_price'],2); - $price['use_integral'] = bcadd($price['use_integral'],$v['use_integral'],2); - $price['back_integral'] = bcadd($price['back_integral'],$v['back_integral'],2); - $price['deduction_price'] = bcadd($price['deduction_price'],$v['deduction_price'],2); if ($v['pay_type'] == 'weixin'){ - $price['pay_price_wx'] = bcadd($price['pay_price_wx'],$v['pay_price'],2); + $price['pay_price_wx'] = $v['sum_pay_price']; }elseif($v['pay_type'] == 'yue'){ - $price['pay_price_yue'] = bcadd($price['pay_price_yue'],$v['pay_price'],2); + $price['pay_price_yue'] = $v['sum_pay_price']; }elseif($v['pay_type'] == 'offline'){ - $price['pay_price_offline'] = bcadd($price['pay_price_offline'],$v['pay_price'],2); + $price['pay_price_offline'] = $v['sum_pay_price']; }else{ - $price['pay_price_other'] = bcadd($price['pay_price_other'],$v['pay_price'],2); + $price['pay_price_other'] = $v['sum_pay_price']; } } return $price; @@ -670,7 +714,7 @@ HTML; switch ($where['type']){ case 1: //普通商品 - $model=$model->where('combination_id',0)->where('seckill_id',0); + $model=$model->where('combination_id',0)->where('seckill_id',0)->where('bargain_id',0); break; case 2: //拼团商品 @@ -759,26 +803,6 @@ HTML; public static function getOrderBadge($where){ return [ - [ - 'name'=>'拼团订单数量', - 'field'=>'个', - 'count'=>self::setEchatWhere($where,2)->count(), - 'content'=>'拼团总订单数量', - 'background_color'=>'layui-bg-cyan', - 'sum'=>self::setEchatWhere($where,2,true)->count(), - 'class'=>'fa fa-line-chart', - 'col'=>2 - ], - [ - 'name'=>'砍价订单数量', - 'field'=>'个', - 'count'=>self::setEchatWhere($where,4)->count(), - 'content'=>'砍价总订单数量', - 'background_color'=>'layui-bg-cyan', - 'sum'=>self::setEchatWhere($where,4,true)->count(), - 'class'=>'fa fa-line-chart', - 'col'=>2 - ], [ 'name'=>'秒杀订单数量', 'field'=>'个', @@ -888,8 +912,8 @@ HTML; */ public static function orderPostageAfter($oid,$postageData = []) { + $order = self::where('id',$oid)->find(); - $openid = WechatUser::uidToOpenid($order['uid']); $url = Url::build('wap/My/order',['uni'=>$order['order_id']],true,true); $group = [ 'first'=>'亲,您的订单已发货,请注意查收', @@ -897,23 +921,35 @@ HTML; ]; if($postageData['delivery_type'] == 'send'){//送货 $goodsName = StoreOrderCartInfo::getProductNameList($order['id']); - $group = array_merge($group,[ - 'keyword1'=>$goodsName, - 'keyword2'=>$order['pay_type'] == 'offline' ? '线下支付' : date('Y/m/d H:i',$order['pay_time']), - 'keyword3'=>$order['user_address'], - 'keyword4'=>$postageData['delivery_name'], - 'keyword5'=>$postageData['delivery_id'] - ]); - WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_DELIVER_SUCCESS,$group,$url); - - }else if($postageData['delivery_type'] == 'express'){//发货 - $group = array_merge($group,[ - 'keyword1'=>$order['order_id'], - 'keyword2'=>$postageData['delivery_name'], - 'keyword3'=>$postageData['delivery_id'] - ]); - WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_POSTAGE_SUCCESS,$group,$url); + if($order['is_channel']){ + //小程序送货模版消息 + RoutineTemplate::sendOrderPostage($order); + }else{//公众号 + $openid = WechatUser::where('uid',$order['uid'])->value('openid'); + $group = array_merge($group,[ + 'keyword1'=>$goodsName, + 'keyword2'=>$order['pay_type'] == 'offline' ? '线下支付' : date('Y/m/d H:i',$order['pay_time']), + 'keyword3'=>$order['user_address'], + 'keyword4'=>$postageData['delivery_name'], + 'keyword5'=>$postageData['delivery_id'] + ]); + WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_DELIVER_SUCCESS,$group,$url); + } + }else if($postageData['delivery_type'] == 'express') {//发货 + if ($order['is_channel']) { + //小程序发货模版消息 + RoutineTemplate::sendOrderPostage($order,1); + } else {//公众号 + $openid = WechatUser::where('uid',$order['uid'])->value('openid'); + $group = array_merge($group, [ + 'keyword1' => $order['order_id'], + 'keyword2' => $postageData['delivery_name'], + 'keyword3' => $postageData['delivery_id'] + ]); + WechatTemplateService::sendTemplate($openid, WechatTemplateService::ORDER_POSTAGE_SUCCESS, $group, $url); + } } + } /** * 小程序 订单发货提醒 @@ -927,38 +963,76 @@ HTML; $routine_openid = WechatUser::uidToRoutineOpenid($order['uid']); if(!$routine_openid) return true; if($postageData['delivery_type'] == 'send'){//送货 - $data['keyword1']['value'] = $order['order_id']; - $data['keyword2']['value'] = $order['delivery_name']; - $data['keyword3']['value'] = $order['delivery_id']; - $data['keyword4']['value'] = date('Y-m-d H:i:s',time()); - $data['keyword5']['value'] = '您的商品已经发货请注意查收'; - $formId = RoutineFormId::getFormIdOne($order['uid']); - if($formId){ - RoutineFormId::delFormIdOne($formId); - RoutineTemplateService::sendTemplate($routine_openid, - RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_DELIVER_SUCCESS), - '', - $data, - $formId); - } + RoutineTemplate::sendOrderPostage($order); }else if($postageData['delivery_type'] == 'express'){//发货 - $data['keyword1']['value'] = $order['order_id']; - $data['keyword2']['value'] = $order['delivery_name']; - $data['keyword3']['value'] = $order['delivery_id']; - $data['keyword4']['value'] = date('Y-m-d H:i:s',time()); - $data['keyword5']['value'] = '您的商品已经发货请注意查收'; - $formId = RoutineFormId::getFormIdOne($order['uid']); - if($formId){ - RoutineFormId::delFormIdOne($formId); - RoutineTemplateService::sendTemplate($routine_openid, - RoutineTemplateService::setTemplateId(RoutineTemplateService::ORDER_POSTAGE_SUCCESS), - '', - $data, - $formId); - } + RoutineTemplate::sendOrderPostage($order,1); } } + /** 收货后发送模版消息 + * @param $order + */ + public static function orderTakeAfter($order) + { + if($order['is_channel']){//小程序 + RoutineTemplate::sendOut('OREDER_TAKEVER',$order['uid'],[ + 'keyword1'=>$order['order_id'], + 'keyword2'=>self::getDb('store_cart')->alias('a')->join('__STORE_PRODUCT__ P','a.product_id=p.id')->where('a.id','in',$order['cart_id'])->value('p.title'), + 'keyword3'=>$order['pay_price'], + 'keyword4'=>date('Y-m-d H:i:s',time()), + ]); + }else{ + $openid = WechatUser::where('uid',$order['uid'])->value('openid'); + $title=''; + $cartInfo = self::getDb('StoreOrderCartInfo')->where('oid', $order['id'])->column('product_id') ?: []; + foreach ($cartInfo as $k => $productId) { + $store_name=self::getDb('store_product')->where('id',$productId)->value('store_name'); + $title.=$store_name.','; + } + WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_TAKE_SUCCESS,[ + 'first'=>'亲,您的订单已收货', + 'keyword1'=>$order['order_id'], + 'keyword2'=>'已收货', + 'keyword3'=>date('Y-m-d H:i:s',time()), + 'keyword4'=>$title, + 'remark'=>'感谢您的光临!' + ]); + } + } + + /* + * 不退款发送模板消息 + * @param int $id 订单id + * @param array $data 退款详情 + * */ + public static function refundNoPrieTemplate($id,$data) + { + $order=self::get($id); + if($order) return false; + //小程序模板消息 + $cartInfo = self::getDb('StoreOrderCartInfo')->where('oid', $order['id'])->column('product_id') ?: []; + $title=''; + foreach ($cartInfo as $k => $productId) { + $store_name=self::getDb('store_product')->where('id',$productId)->value('store_name'); + $title.=$store_name.','; + } + if($order->is_channel){ + RoutineTemplate::sendOut('ORDER_REFUND_FILE',$order->uid,[ + 'keyword1'=>$order->order_id, + 'keyword2'=>$title, + 'keyword3'=>$order->pay_price, + 'keyword4'=>$data, + ]); + }else{ + WechatTemplateService::sendTemplate(WechatUser::where(['uid'=>$order->uid])->value('openid'),WechatTemplateService::ORDER_REFUND_STATUS,[ + 'first'=>'很抱歉您的订单退款失败,失败原因:'.$data, + 'keyword1'=>$order->order_id, + 'keyword2'=>$order->pay_price, + 'keyword3'=>date('Y-m-d H:i:s',time()), + 'remark'=>'给您带来的不便,请谅解!' + ]); + } + } /** * 获取订单总数 @@ -986,4 +1060,46 @@ HTML; public static function getOrderPayMonthCount($is_promoter = 0){ return self::where('o.paid',1)->alias('o')->whereTime('o.pay_time','last month')->join('User u','u.uid=o.uid')->where('u.is_promoter',$is_promoter)->count(); } + + /** 订单收货处理积分 + * @param $order + * @return bool + */ + public static function gainUserIntegral($order) + { + if($order['gain_integral'] > 0){ + $userInfo = User::get($order['uid']); + ModelBasic::beginTrans(); + $res1 = false != User::where('uid',$userInfo['uid'])->update(['integral'=>bcadd($userInfo['integral'],$order['gain_integral'],2)]); + $res2 = false != UserBill::income('购买商品赠送积分',$order['uid'],'integral','gain',$order['gain_integral'],$order['id'],bcadd($userInfo['integral'],$order['gain_integral'],2),'购买商品赠送'.floatval($order['gain_integral']).'积分'); + $res = $res1 && $res2; + ModelBasic::checkTrans($res); + return $res; + } + return true; + } + + public static function integralBack($id){ + $order = self::get($id)->toArray(); + if(!(float)bcsub($order['use_integral'],0,2) && !$order['back_integral']) return true; + if($order['back_integral'] && !(int)$order['use_integral']) return true; + ModelBasic::beginTrans(); + $data['back_integral'] = bcsub($order['use_integral'],$order['use_integral'],0); + if(!$data['back_integral']) return true; + $data['use_integral'] = 0; + $data['deduction_price'] = 0.00; + $data['pay_price'] = 0.00; + $data['coupon_id'] = 0.00; + $data['coupon_price'] = 0.00; + $res4 = true; + $integral = User::where('uid',$order['uid'])->value('integral'); + $res1 = User::bcInc($order['uid'],'integral',$data['back_integral'],'uid'); + $res2 = UserBill::income('商品退积分',$order['uid'],'integral','pay_product_integral_back',$data['back_integral'],$order['id'],bcadd($integral,$data['back_integral'],2),'订单退积分'.floatval($data['back_integral']).'积分到用户积分'); + $res3 = self::edit($data,$id); + if($order['coupon_id']) $res4 = StoreCouponUser::recoverCoupon($order['coupon_id']); + StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']); + $res = $res1 && $res2 && $res3 && $res4; + ModelBasic::checkTrans($res); + return $res; + } } \ No newline at end of file diff --git a/application/admin/model/record/StoreStatistics.php b/application/admin/model/record/StoreStatistics.php index 04fe9cd3..d7f0b417 100644 --- a/application/admin/model/record/StoreStatistics.php +++ b/application/admin/model/record/StoreStatistics.php @@ -10,7 +10,7 @@ namespace app\admin\model\record; use traits\ModelTrait; use basic\ModelBasic; use service\ExportService; -use app\wap\model\user\UserBill; +use app\core\model\user\UserBill; use app\admin\model\user\User; use service\PHPExcelService; class StoreStatistics extends ModelBasic @@ -97,22 +97,28 @@ class StoreStatistics extends ModelBasic */ public static function getTime($where,$model=null,$prefix='add_time'){ if ($model == null) $model = new self; + if(!$where['date']) return $model; if ($where['data'] == '') { - switch ($where['date']){ - case 'today':case 'week':case 'month':case 'year': - $model=$model->whereTime($prefix,$where['date']); - break; - case 'quarter': - list($startTime,$endTime)=User::getMonth('n'); - $model = $model->where($prefix, '>', strtotime($startTime)); - $model = $model->where($prefix, '<', strtotime($endTime)); - break; - } - }else{ - list($startTime, $endTime) = explode(' - ', $where['data']); - $model = $model->where($prefix, '>', strtotime($startTime)); - $model = $model->where($prefix, '<', strtotime($endTime)); + $limitTimeList = [ + 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), + 'week'=>implode(' - ',[ + date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), + date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) + ]), + 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), + 'quarter'=>implode(' - ',[ + date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', + date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) + ]), + 'year'=>implode(' - ',[ + date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) + ]) + ]; + $where['data'] = $limitTimeList[$where['date']]; } + list($startTime, $endTime) = explode(' - ', $where['data']); + $model = $model->where($prefix, '>', strtotime($startTime)); + $model = $model->where($prefix, '<', strtotime($endTime)); return $model; } /** @@ -120,7 +126,7 @@ class StoreStatistics extends ModelBasic */ public static function getConsumption($where) { - $consumption=self::getTime($where,new UserBill,'b.add_time')->alias('a')->join('user b','a.uid = b.uid') + $consumption=self::getTime($where,new UserBill,'b.add_time')->alias('a')->join('__USER__ b','a.uid = b.uid') ->field('sum(a.number) number') ->where('a.type','pay_product')->find()->toArray(); return $consumption; @@ -172,7 +178,7 @@ class StoreStatistics extends ModelBasic public static function trans() { $trans = self::alias('a') - ->join('user b', 'a.uid=b.uid') + ->join('__USER__ b', 'a.uid=b.uid','left') ->join('__STORE_ORDER_CART_INFO__ c', 'a.id=c.oid') ->join('__STORE_PRODUCT__ d', 'c.product_id=d.id') ->field('b.nickname,a.pay_price,d.store_name') diff --git a/application/admin/model/routine/RoutineFormId.php b/application/admin/model/routine/RoutineFormId.php index 9a72b78c..ff06e250 100644 --- a/application/admin/model/routine/RoutineFormId.php +++ b/application/admin/model/routine/RoutineFormId.php @@ -7,7 +7,7 @@ use traits\ModelTrait; /** * 表单ID表 * Class RoutineFormId - * @package app\routine\model\routine + * @package app\admin\model\routine */ class RoutineFormId extends ModelBasic { diff --git a/application/admin/model/store/StoreCategory.php b/application/admin/model/store/StoreCategory.php index 7a4e13e2..1ae82c20 100644 --- a/application/admin/model/store/StoreCategory.php +++ b/application/admin/model/store/StoreCategory.php @@ -49,6 +49,8 @@ class StoreCategory extends ModelBasic if($isAjax===true){ if(isset($where['order']) && $where['order']!=''){ $model=$model->order(self::setOrder($where['order'])); + }else{ + $model=$model->order('sort desc,id desc'); } return $model; } @@ -78,7 +80,7 @@ class StoreCategory extends ModelBasic public static function getTierList($model = null) { if($model === null) $model = new self(); - return UtilService::sortListTier($model->select()->toArray()); + return UtilService::sortListTier($model->order('sort desc,id desc')->select()->toArray()); } public static function delCategory($id){ diff --git a/application/admin/model/store/StoreProductAttrValue.php b/application/admin/model/store/StoreProductAttrValue.php index f50877f1..9e92f88e 100644 --- a/application/admin/model/store/StoreProductAttrValue.php +++ b/application/admin/model/store/StoreProductAttrValue.php @@ -28,6 +28,14 @@ class StoreProductAttrValue extends ModelBasic return self::uniqueId($data['product_id'].$data['suk'].uniqid(true)); } + /* + * 减少销量增加库存 + * */ + public static function incProductAttrStock($productId,$unique,$num) + { + return false !== self::where('product_id',$productId)->where('unique',$unique)->inc('stock',$num)->dec('sales',$num)->update(); + } + public static function decProductAttrStock($productId,$unique,$num) { return false !== self::where('product_id',$productId)->where('unique',$unique) diff --git a/application/admin/model/store/StoreProductReply.php b/application/admin/model/store/StoreProductReply.php index 789ff692..012e9324 100644 --- a/application/admin/model/store/StoreProductReply.php +++ b/application/admin/model/store/StoreProductReply.php @@ -19,6 +19,55 @@ class StoreProductReply extends ModelBasic { use ModelTrait; + protected function getPicsAttr($value) + { + return json_decode($value,true); + } + /* + * 设置where条件 + * @param array $where + * @param string $alias + * @param object $model + * */ + public static function valiWhere($where,$alias='',$model=null) + { + $model=is_null($model) ? new self() : $model; + if($alias){ + $model=$model->alias($alias); + $alias.='.'; + } + if(isset($where['title']) && $where['title']!='') $model=$model->where("{$alias}comment",'LIKE',"%$where[title]%"); + if(isset($where['is_reply']) && $where['is_reply']!='') $model= $where['is_reply'] >= 0 ? $model->where("{$alias}is_reply",$where['is_reply']) : $model->where("{$alias}is_reply",'GT',0); + if(isset($where['producr_id']) && $where['producr_id']!=0) $model=$model->where('product_id',$where['producr_id']); + return $model->where("{$alias}is_del",0); + } + + public static function getProductImaesList($where) + { + $list=self::valiWhere($where,'a')->group('p.id')->join('__WECHAT_USER__ u','u.uid=a.uid')->join("__STORE_PRODUCT__ p",'a.product_id=p.id')->field(['p.id','p.image','p.store_name','p.price'])->page($where['page'],$where['limit'])->select(); + $list=count($list) ? $list->toArray() : []; + foreach ($list as &$item){ + $item['store_name']=self::getSubstrUTf8($item['store_name'],10,'UTF-8',''); + } + + return $list; + } + + public static function getProductReplyList($where) + { + $data=self::valiWhere($where,'a')->join("__STORE_PRODUCT__ p",'a.product_id=p.id') + ->join('__WECHAT_USER__ u','u.uid=a.uid') + ->order('a.add_time desc,a.is_reply asc') + ->field('a.*,u.nickname,u.headimgurl as avatar') + ->page((int)$where['message_page'],(int)$where['limit']) + ->select(); + $data=count($data) ? $data->toArray() : []; + foreach ($data as &$item){ + $item['time']=\service\UtilService::timeTran($item['add_time']); + } + $count=self::valiWhere($where,'a')->join('__WECHAT_USER__ u','u.uid=a.uid')->join("__STORE_PRODUCT__ p",'a.product_id=p.id')->count(); + return ['list'=>$data,'count'=>$count]; + } /** * @param $where * @return array @@ -38,6 +87,7 @@ class StoreProductReply extends ModelBasic $model = $model->join('__STORE_PRODUCT__ p','p.id=r.product_id'); $model = $model->where('r.is_del',0); $model = $model->field('r.*,u.nickname,u.headimgurl,p.store_name'); + $model = $model->order('r.add_time desc,r.is_reply asc'); return self::page($model,function($itme){ },$where); diff --git a/application/admin/model/system/Express.php b/application/admin/model/system/Express.php index 4efe2238..dfd77f4e 100644 --- a/application/admin/model/system/Express.php +++ b/application/admin/model/system/Express.php @@ -11,7 +11,7 @@ use traits\ModelTrait; use basic\ModelBasic; /** - * Class SystemAdmin + * Class Express * @package app\admin\model\system */ class Express extends ModelBasic diff --git a/application/admin/model/system/SystemAttachmentType.php b/application/admin/model/system/SystemAttachmentType.php new file mode 100644 index 00000000..76fe7ccd --- /dev/null +++ b/application/admin/model/system/SystemAttachmentType.php @@ -0,0 +1,51 @@ +where($where)->order('att_id desc'); + return $model->page($model,$where,'',30); + } + /** + * 获取单条信息 + * */ + public static function getinfo($att_id){ + $model = new self; + $where['att_id'] = $att_id; + return $model->where($where)->select()->toArray()[0]; + } + +} \ No newline at end of file diff --git a/application/admin/model/system/SystemConfig.php b/application/admin/model/system/SystemConfig.php index b1219d55..a6d73287 100644 --- a/application/admin/model/system/SystemConfig.php +++ b/application/admin/model/system/SystemConfig.php @@ -1 +1,282 @@ - * @day: 2017/11/02 */ namespace app\admin\model\system; use basic\ModelBasic; use service\FormBuilder as Form; use traits\ModelTrait; use \app\admin\model\system\SystemConfigTab; class SystemConfig extends ModelBasic { use ModelTrait; /** * 修改单个配置 * */ public static function setValue($menu,$value){ if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return self::setErrorInfo('字段名称错误'); if($config_one['type'] == 'radio' || $config_one['type'] == 'checkbox'){ $parameter = array(); $option = array(); $parameter = explode(',',$config_one['parameter']); foreach ($parameter as $k=>$v){ if(isset($v) && !empty($v)){ $option[$k] = explode('-',$v); } } $value_arr = array();//选项的值 foreach ($option as $k=>$v){ foreach ($v as $kk=>$vv) if(!$kk){ $value_arr[$k] = $vv; } } $i = 0;// if(is_array($value)){ foreach ($value as $value_v){ if(in_array($value_v,$value_arr)){ $i++; } } if(count($value) != $i) return self::setErrorInfo('输入的值不属于选项中的参数'); }else{ if(in_array($value,$value_arr)){ $i++; } if(!$i) return self::setErrorInfo('输入的值不属于选项中的参数'); } if($config_one['type'] == 'radio' && is_array($value)) return self::setErrorInfo('单选按钮的值是字符串不是数组'); } $bool = self::edit(['value' => json_encode($value)],$menu,'menu_name'); return $bool; } /** * 获取单个参数配置 * */ public static function getValue($menu){ if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return false; return json_decode($config_one['value'],true); } /** * 获得多个参数 * @param $menus * @return array */ public static function getMore($menus) { $menus = is_array($menus) ? implode(',',$menus) : $menus; $list = self::where('menu_name','IN',$menus)->column('value','menu_name')?:[]; foreach ($list as $menu => $value){ $list[$menu] = json_decode($value,true); } return $list; } public static function getAllConfig() { $list = self::column('value','menu_name')?:[]; foreach ($list as $menu => $value){ $list[$menu] = json_decode($value,true); } return $list; } /** * text 判断 * */ public static function valiDateTextRole($data){ if (!$data['width']) return self::setErrorInfo('请输入文本框的宽度'); if ($data['width'] <= 0) return self::setErrorInfo('请输入正确的文本框的宽度'); return true; } /** * radio 和 checkbox规则的判断 * */ public static function valiDateRadioAndCheckbox($data){ $parameter = array(); $option = array(); $option_new = array(); $data['parameter'] = str_replace("\r\n","\n",$data['parameter']);//防止不兼容 $parameter = explode("\n",$data['parameter']); if(count($parameter) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); foreach ($parameter as $k=>$v){ if(isset($v) && !empty($v)){ $option[$k] = explode('=>',$v); } } if(count($option) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); $bool = 1; foreach ($option as $k=>$v){ $option_new[$k] = $option[$k][0]; foreach ($v as $kk=>$vv){ $vv_num = strlen($vv); if(!$vv_num){ $bool = 0; } } } // dump($option); if(!$bool)return self::setErrorInfo('请输入正确格式的配置参数'); $num1 = count($option_new);//提取该数组的数目 $arr2 = array_unique($option_new);//合并相同的元素 $num2 = count($arr2);//提取合并后数组个数 if($num1>$num2)return self::setErrorInfo('请输入正确格式的配置参数'); return true; } /** * textarea 判断 * */ public static function valiDateTextareaRole($data){ if (!$data['width']) return self::setErrorInfo('请输入多行文本框的宽度'); if (!$data['high']) return self::setErrorInfo('请输入多行文本框的高度'); if ($data['width'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); if ($data['high'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); return true; } /** * 获取一数据 * */ public static function getOneConfig($filed,$value){ $where[$filed] = $value; return self::where($where)->find(); } /** * 获取配置分类 * */ public static function getAll($id){ $where['config_tab_id'] = $id; $where['status'] = 1; return self::where($where)->order('sort desc,id asc')->select(); } /** * 获取所有配置分类 * */ public static function getConfigTabAll($type=0){ $configAll = SystemConfigTab::getAll($type); $config_tab = array(); foreach ($configAll as $k=>$v){ if(!$v['info']){ $config_tab[$k]['value'] = $v['id']; $config_tab[$k]['label'] = $v['title']; $config_tab[$k]['icon'] = $v['icon']; $config_tab[$k]['type'] = $v['type']; } } return $config_tab; } /** * 选择类型 * */ public static function radiotype($type='text'){ return [ ['value'=>'text','label'=>'文本框','disabled'=>1] ,['value'=>'textarea','label'=>'多行文本框','disabled'=>1] ,['value'=>'radio','label'=>'单选按钮','disabled'=>1] ,['value'=>'upload','label'=>'文件上传','disabled'=>1] ,['value'=>'checkbox','label'=>'多选按钮','disabled'=>1] ]; } /** * 文本框 * */ public static function createInputRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','text')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('width','文本框宽(%)',100); $formbuider[] = Form::input('required','验证规则')->placeholder('多个请用,隔开例如:required:true,url:true'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 多行文本框 * */ public static function createTextAreaRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','textarea')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('value','默认值'); $formbuider[] = Form::number('width','文本框宽(%)',100); $formbuider[] = Form::number('high','多行文本框高(%)',5); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 单选按钮 * */ public static function createRadioRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','radio')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密"); $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 文件上传 * */ public static function createUploadRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','upload')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::radio('upload_type','上传类型',1)->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 多选框 * */ public static function createCheckboxRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','checkbox')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色"); // $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 插入数据到数据库 * */ public static function set($data) { return self::create($data); } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\system; + +use basic\ModelBasic; +use service\FormBuilder as Form; +use traits\ModelTrait; +use \app\admin\model\system\SystemConfigTab; + +class SystemConfig extends ModelBasic { + + use ModelTrait; + /** + * 修改单个配置 + * */ + public static function setValue($menu,$value){ + if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return self::setErrorInfo('字段名称错误'); + if($config_one['type'] == 'radio' || $config_one['type'] == 'checkbox'){ + $parameter = array(); + $option = array(); + $parameter = explode(',',$config_one['parameter']); + foreach ($parameter as $k=>$v){ + if(isset($v) && !empty($v)){ + $option[$k] = explode('-',$v); + } + } + $value_arr = array();//选项的值 + foreach ($option as $k=>$v){ + foreach ($v as $kk=>$vv) + if(!$kk){ + $value_arr[$k] = $vv; + } + } + $i = 0;// + if(is_array($value)){ + foreach ($value as $value_v){ + if(in_array($value_v,$value_arr)){ + $i++; + } + } + if(count($value) != $i) return self::setErrorInfo('输入的值不属于选项中的参数'); + }else{ + if(in_array($value,$value_arr)){ + $i++; + } + if(!$i) return self::setErrorInfo('输入的值不属于选项中的参数'); + } + if($config_one['type'] == 'radio' && is_array($value)) return self::setErrorInfo('单选按钮的值是字符串不是数组'); + } + $bool = self::edit(['value' => json_encode($value)],$menu,'menu_name'); + return $bool; + } + /** + * 获取单个参数配置 + * */ + public static function getValue($menu){ + if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return false; + return json_decode($config_one['value'],true); + } + + /** + * 获得多个参数 + * @param $menus + * @return array + */ + public static function getMore($menus) + { + $menus = is_array($menus) ? implode(',',$menus) : $menus; + $list = self::where('menu_name','IN',$menus)->column('value','menu_name')?:[]; + foreach ($list as $menu => $value){ + $list[$menu] = json_decode($value,true); + } + return $list; + } + + public static function getAllConfig() + { + $list = self::column('value','menu_name')?:[]; + foreach ($list as $menu => $value){ + $list[$menu] = json_decode($value,true); + } + return $list; + } + + /** + * text 判断 + * */ + public static function valiDateTextRole($data){ + if (!$data['width']) return self::setErrorInfo('请输入文本框的宽度'); + if ($data['width'] <= 0) return self::setErrorInfo('请输入正确的文本框的宽度'); + return true; + } + /** + * radio 和 checkbox规则的判断 + * */ + public static function valiDateRadioAndCheckbox($data){ + $parameter = array(); + $option = array(); + $option_new = array(); + $data['parameter'] = str_replace("\r\n","\n",$data['parameter']);//防止不兼容 + $parameter = explode("\n",$data['parameter']); + if(count($parameter) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); + foreach ($parameter as $k=>$v){ + if(isset($v) && !empty($v)){ + $option[$k] = explode('=>',$v); + } + } + if(count($option) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); + $bool = 1; + foreach ($option as $k=>$v){ + $option_new[$k] = $option[$k][0]; + foreach ($v as $kk=>$vv){ + $vv_num = strlen($vv); + if(!$vv_num){ + $bool = 0; + } + } + } +// dump($option); + if(!$bool)return self::setErrorInfo('请输入正确格式的配置参数'); + $num1 = count($option_new);//提取该数组的数目 + $arr2 = array_unique($option_new);//合并相同的元素 + $num2 = count($arr2);//提取合并后数组个数 + if($num1>$num2)return self::setErrorInfo('请输入正确格式的配置参数'); + return true; + } + /** + * textarea 判断 + * */ + public static function valiDateTextareaRole($data){ + if (!$data['width']) return self::setErrorInfo('请输入多行文本框的宽度'); + if (!$data['high']) return self::setErrorInfo('请输入多行文本框的高度'); + if ($data['width'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); + if ($data['high'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); + return true; + } + + /** + * 获取一数据 + * */ + public static function getOneConfig($filed,$value){ + $where[$filed] = $value; + return self::where($where)->find(); + } + /** + * 获取配置分类 + * */ + public static function getAll($id){ + $where['config_tab_id'] = $id; +// $where['status'] = 1; + return self::where($where)->order('sort desc,id asc')->select(); + } + + /** + * 获取所有配置分类 + * */ + public static function getConfigTabAll($type=0){ + $configAll = SystemConfigTab::getAll($type); + $config_tab = array(); + foreach ($configAll as $k=>$v){ + if(!$v['info']){ + $config_tab[$k]['value'] = $v['id']; + $config_tab[$k]['label'] = $v['title']; + $config_tab[$k]['icon'] = $v['icon']; + $config_tab[$k]['type'] = $v['type']; + } + } + return $config_tab; + } + /** + * 选择类型 + * */ + public static function radiotype($type='text'){ + return [ + ['value'=>'text','label'=>'文本框','disabled'=>1] + ,['value'=>'textarea','label'=>'多行文本框','disabled'=>1] + ,['value'=>'radio','label'=>'单选按钮','disabled'=>1] + ,['value'=>'upload','label'=>'文件上传','disabled'=>1] + ,['value'=>'checkbox','label'=>'多选按钮','disabled'=>1] + ]; + } + /** + * 文本框 + * */ + public static function createInputRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','text')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('width','文本框宽(%)',100); + $formbuider[] = Form::input('required','验证规则')->placeholder('多个请用,隔开例如:required:true,url:true'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 多行文本框 + * */ + public static function createTextAreaRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','textarea')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('value','默认值'); + $formbuider[] = Form::number('width','文本框宽(%)',100); + $formbuider[] = Form::number('high','多行文本框高(%)',5); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 单选按钮 + * */ + public static function createRadioRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','radio')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密"); + $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 文件上传 + * */ + public static function createUploadRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','upload')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::radio('upload_type','上传类型',1)->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + + } + /** + * 多选框 + * */ + public static function createCheckboxRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','checkbox')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色"); +// $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + + /** + * 插入数据到数据库 + * */ + public static function set($data) + { + return self::create($data); + } +} \ No newline at end of file diff --git a/application/admin/model/system/SystemGroupData.php b/application/admin/model/system/SystemGroupData.php index 285541cd..1bb74912 100644 --- a/application/admin/model/system/SystemGroupData.php +++ b/application/admin/model/system/SystemGroupData.php @@ -49,6 +49,11 @@ class SystemGroupData extends ModelBasic }); } + /**获得组合数据信息+组合数据列表 + * @param $config_name + * @param int $limit + * @return array|bool|false|\PDOStatement|string|\think\Model + */ public static function getGroupData($config_name,$limit = 0) { $group = SystemGroup::where('config_name',$config_name)->field('name,info,config_name')->find(); diff --git a/application/admin/model/system/SystemUserLevel.php b/application/admin/model/system/SystemUserLevel.php new file mode 100644 index 00000000..0f5526f8 --- /dev/null +++ b/application/admin/model/system/SystemUserLevel.php @@ -0,0 +1,53 @@ + + * @day: 2017/11/13 + */ + +namespace app\admin\model\system; + +use traits\ModelTrait; +use basic\ModelBasic; + +/** + * 设置会员vip model + * Class SystemVip + * @package app\admin\model\system + */ +class SystemUserLevel extends ModelBasic +{ + use ModelTrait; + + public static function setAddTimeAttr() + { + return time(); + } + public static function getAddTimeAttr($value) + { + return date('Y-m-d H:i:s',$value); + } + /* + * 获取查询条件 + * */ + public static function setWhere($where,$alert='',$model=null) + { + $model=$model===null ? new self() : $model; + if($alert) $model=$model->alias($alert); + $alert=$alert ? $alert.'.': ''; + if(isset($where['is_show']) && $where['is_show']!=='') $model=$model->where("{$alert}is_show",$where['is_show']); + if(isset($where['title']) && $where['title']) $model=$model->where("{$alert}name",'LIKE',"%$where[title]%"); + return $model; + } + /* + * 查找系统设置的会员等级列表 + * */ + public static function getSytemList($where) + { + $data=self::setWhere($where)->order('grade asc')->page((int)$where['page'],(int)$where['limit'])->select(); + $data=count($data) ? $data->toArray() : []; + $count=self::setWhere($where)->count(); + return compact('data','count'); + } + +} \ No newline at end of file diff --git a/application/admin/model/system/SystemUserTask.php b/application/admin/model/system/SystemUserTask.php new file mode 100644 index 00000000..958ba1b5 --- /dev/null +++ b/application/admin/model/system/SystemUserTask.php @@ -0,0 +1,136 @@ + + * @day: 2017/11/13 + */ + +namespace app\admin\model\system; + +use app\admin\model\order\StoreOrder; +use app\admin\model\user\User; +use app\admin\model\user\UserBill; +use app\admin\model\user\UserLevel; +use app\admin\model\user\UserTaskFinish; +use traits\ModelTrait; +use basic\ModelBasic; + +/** + * 设置等级任务 model + * Class SystemVipTask + * @package app\admin\model\system + */ +class SystemUserTask extends ModelBasic +{ + use ModelTrait; + + /* + * 任务类型 + * type 记录在数据库中用来区分任务 + * name 任务名 (任务名中的{$num}会自动替换成设置的数字 + 单位) + * max_number 最大设定数值 0为不限定 + * min_number 最小设定数值 + * unit 单位 + * */ + protected static $TaskType=[ + [ + 'type'=>'SatisfactionIntegral', + 'name'=>'满足积分{$num}', + 'real_name'=>'积分数', + 'max_number'=>0, + 'min_number'=>0, + 'unit'=>'分' + ], + [ + 'type'=>'ConsumptionAmount', + 'name'=>'消费满{$num}', + 'real_name'=>'消费金额', + 'max_number'=>0, + 'min_number'=>0, + 'unit'=>'元' + ], + [ + 'type'=>'ConsumptionFrequency', + 'name'=>'消费{$num}', + 'real_name'=>'消费次数', + 'max_number'=>0, + 'min_number'=>0, + 'unit'=>'次' + ], + [ + 'type'=>'CumulativeAttendance', + 'name'=>'累计签到{$num}', + 'real_name'=>'累计签到', + 'max_number'=>365, + 'min_number'=>1, + 'unit'=>'天' + ], + [ + 'type'=>'SharingTimes', + 'name'=>'分享给朋友{$num}', + 'real_name'=>'分享给朋友', + 'max_number'=>1000, + 'min_number'=>1, + 'unit'=>'次' + ], + [ + 'type'=>'InviteGoodFriends', + 'name'=>'邀请好友{$num}成为下线', + 'real_name'=>'邀请好友成为下线', + 'max_number'=>1000, + 'min_number'=>1, + 'unit'=>'人' + ], + [ + 'type'=>'InviteGoodFriendsLevel', + 'name'=>'邀请好友{$num}成为会员', + 'real_name'=>'邀请好友成为会员', + 'max_number'=>1000, + 'min_number'=>1, + 'unit'=>'人' + ], + ]; + + public function profile() + { + return $this->hasOne('SystemUserLevel','level_id','id')->field('name'); + } + + public static function getTaskTypeAll() + { + return self::$TaskType; + } + + /* + * 获取某个任务 + * */ + public static function getTaskType($type) + { + foreach (self::$TaskType as $item){ + if($item['type']==$type) return $item; + } + } + + /* + * 设置任务名 + * */ + public static function setTaskName($type,$num) + { + $systemType=self::getTaskType($type); + return str_replace('{$num}',$num.$systemType['unit'],$systemType['name']); + } + /* + * 获取等级会员任务列表 + * */ + public static function getTashList($level_id,$page,$limit) + { + $data=self::where('level_id',$level_id)->order('sort desc,add_time desc')->page($page,$limit)->select(); + $data=count($data) ? $data->toArray() : []; + foreach ($data as &$item){ + $item['level_name']=SystemUserLevel::where('id',$item['level_id'])->value('name'); + } + $count=self::where('level_id',$level_id)->count(); + return compact('data','count'); + } + +} \ No newline at end of file diff --git a/application/admin/model/ump/StoreCouponIssue.php b/application/admin/model/ump/StoreCouponIssue.php index 2b01ec81..09b4ef98 100644 --- a/application/admin/model/ump/StoreCouponIssue.php +++ b/application/admin/model/ump/StoreCouponIssue.php @@ -33,8 +33,8 @@ class StoreCouponIssue extends ModelBasic return time(); } - public static function setIssue($cid,$total_count = 0,$start_time = 0,$end_time = 0,$remain_count = 0,$status = 0) + public static function setIssue($cid,$total_count = 0,$start_time = 0,$end_time = 0,$remain_count = 0,$status = 0,$is_permanent=0) { - return self::set(compact('cid','start_time','end_time','total_count','remain_count','status')); + return self::set(compact('cid','start_time','end_time','total_count','remain_count','status','is_permanent')); } } \ No newline at end of file diff --git a/application/admin/model/user/User.php b/application/admin/model/user/User.php index a752537c..4db21684 100644 --- a/application/admin/model/user/User.php +++ b/application/admin/model/user/User.php @@ -1 +1,1077 @@ - * @day: 2017/11/11 */ namespace app\admin\model\user; use app\admin\model\order\StoreOrder; use traits\ModelTrait; use app\wap\model\user\UserBill; use basic\ModelBasic; use app\admin\model\wechat\WechatUser; use app\admin\model\store\StoreCouponUser; use app\admin\model\user\UserExtract; use think\Db; /** * 用户管理 model * Class User * @package app\admin\model\user */ class User extends ModelBasic { use ModelTrait; /** * @param $where * @return array */ public static function systemPage($where){ $model = new self; if($where['status'] != '') $model = $model->where('status',$where['status']); if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']); if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']); if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%"); $model = $model->order('uid desc'); return self::page($model,function ($item){ if($item['spread_uid']){ $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname'); }else{ $item['spread_uid_nickname'] = '无'; } },$where); } /* * 设置搜索条件 * */ public static function setWhere($where) { if($where['order']!=''){ $model=self::order(self::setOrder($where['order'])); }else{ $model=self::order('u.uid desc'); } if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or'); } if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.last_time', '>', strtotime($startTime)); $model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600); } if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.add_time', '>', strtotime($startTime)); $model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600); } if($where['pay_count'] !== '') { if($where['pay_count'] == '-1') $model = $model->where('pay_count',0); else $model = $model->where('pay_count','>',$where['pay_count']); } if($where['user_type'] != ''){ if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null'); else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null'); } if($where['country'] != ''){ if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国'); else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国'); } return $model; } /** * 异步获取当前用户 信息 * @param $where * @return array */ public static function getUserList($where){ $model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']); $list = $model->alias('u') ->join('WechatUser w','u.uid=w.uid') ->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time') ->page((int)$where['page'],(int)$where['limit']) ->select() ->each(function ($item){ $item['add_time']=date('Y-m-d H:i:s',$item['add_time']); if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期 else $item['last_time'] = '无访问';//最近一次访问日期 self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']); $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现 if($item['spread_uid']){ $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid']; }else{ $item['spread_uid_nickname'] = '无'; } if($item['openid'] != '' && $item['routine_openid'] != ''){ $item['user_type']='通用'; }else if($item['openid'] == '' && $item['routine_openid'] != ''){ $item['user_type']='小程序'; }else if($item['openid'] != '' && $item['routine_openid'] == ''){ $item['user_type']='公众号'; }else $item['user_type']='其他'; if($item['sex'] == 1){ $item['sex']='男'; }else if($item['sex'] == 2){ $item['sex']='女'; }else $item['sex']='保密'; })->toArray(); $count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count(); return ['count'=>$count,'data'=>$list]; } /** * 修改用户状态 * @param $uids 用户uid * @param $status 修改状态 * @return array */ public static function destrSyatus($uids,$status){ if(empty($uids) && !is_array($uids)) return false; if($status=='') return false; self::beginTrans(); try{ $res=self::where('uid','in',$uids)->update(['status'=>$status]); self::checkTrans($res); return true; }catch (\Exception $e){ self::rollbackTrans(); return Json::fail($e->getMessage()); } } /* * 获取某季度,某年某年后的时间戳 * * self::getMonth('n',1) 获取当前季度的上个季度的时间戳 * self::getMonth('n') 获取当前季度的时间戳 */ public static function getMonth($time='',$ceil=0){ if(empty($time)){ $firstday = date("Y-m-01",time()); $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day")); }else if($time=='n'){ if($ceil!=0) $season = ceil(date('n') /3)-$ceil; else $season = ceil(date('n') /3); $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); }else if($time=='y'){ $firstday=date('Y-01-01'); $lastday=date('Y-12-31'); }else if($time=='h'){ $firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00'; $lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59'; } return array($firstday,$lastday); } public static function getcount(){ return self::count(); } /* *获取用户某个时间段的消费信息 * * reutrn Array || number */ public static function consume($where,$status='',$keep=''){ $model = new self; $user_id=[]; if(is_array($where)){ if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']); if($where['status']!='') $model=$model->where('status',$where['status']); switch ($where['date']){ case null:case 'today':case 'week':case 'year': if($where['date']==null){ $where['date']='month'; } if($keep){ $model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']); }else{ $model=$model->whereTime('add_time',$where['date']); } break; case 'quarter': $quarter=self::getMonth('n'); $startTime=strtotime($quarter[0]); $endTime=strtotime($quarter[1]); if($keep){ $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime); }else{ $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime); } break; default: //自定义时间 if(strstr($where['date'],'-')!==FALSE){ list($startTime,$endTime)=explode('-',$where['date']); $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime)); }else{ $model=$model->whereTime('add_time','month'); } break; } }else{ if(is_array($status)){ $model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]); } } if($keep===true){ return $model->count(); } if($status==='default'){ return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray(); } if($status==='grouping'){ return $model->group('user_type')->field('user_type')->select()->toArray(); } $uid=$model->field('uid')->select()->toArray(); foreach ($uid as $val){ $user_id[]=$val['uid']; } if(empty($user_id)){ $user_id=[0]; } if($status==='xiaofei'){ $list=UserBill::where('uid','in',$user_id) ->group('type') ->field('sum(number) as top_number,title') ->select() ->toArray(); $series=[ 'name'=>isset($list[0]['title'])?$list[0]['title']:'', 'type'=>'pie', 'radius'=> ['40%', '50%'], 'data'=>[] ]; foreach($list as $key=>$val){ $series['data'][$key]['value']=$val['top_number']; $series['data'][$key]['name']=$val['title']; } return $series; }else if($status==='form'){ $list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray(); $count=self::getcount(); $option=[ 'legend_date'=>[], 'series_date'=>[] ]; foreach($list as $key=>$val){ $num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0; $t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle']; $option['legend_date'][$key]=$t; $option['series_date'][$key]=['value'=>$num,'name'=>$t['name']]; } return $option; }else{ $number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number'); return $number; } } /* * 获取 用户某个时间段的钱数或者TOP20排行 * * return Array || number */ public static function getUserSpend($date,$status=''){ $model=new self(); $model=$model->alias('A'); switch ($date){ case null:case 'today':case 'week':case 'year': if($date==null) $date='month'; $model=$model->whereTime('A.add_time',$date); break; case 'quarter': list($startTime,$endTime)=User::getMonth('n'); $model = $model->where('A.add_time','>',strtotime($startTime)); $model = $model->where('A.add_time','<',strtotime($endTime)); break; default: list($startTime,$endTime)=explode('-',$date); $model = $model->where('A.add_time','>',strtotime($startTime)); $model = $model->where('A.add_time','<',strtotime($endTime)); break; } if($status===true){ return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); } $list=$model->join('user_bill B','B.uid=A.uid') ->where('B.type','pay_product') ->where('B.pm',0) ->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time') ->order('totel_number desc') ->limit(0,20) ->select() ->toArray(); if(!isset($list[0]['totel_number'])){ $list=[]; } return $list; } /* * 获取 相对于上月或者其他的数据 * * return Array */ public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){ $model=new self(); if(!$status) $model=$model->alias('A'); switch ($date){ case null:case 'today':case 'week':case 'year': if($date==null) { $date='last month'; $title='相比上月用户'.$t.'增长'; } if($date=='today') { $date='yesterday'; $title='相比昨天用户'.$t.'增长'; } if($date=='week') { $date='last week'; $title='相比上周用户'.$t.'增长'; } if($date=='year') { $date='last year'; $title='相比去年用户'.$t.'增长'; } $model=$model->whereTime($field,$date); break; case 'quarter': $title='相比上季度用户'.$t.'增长'; list($startTime,$endTime)=User::getMonth('n',1); $model = $model->where($field,'>',$startTime); $model = $model->where($field,'<',$endTime); break; default: list($startTime,$endTime)=explode('-',$date); $title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长'; $Time=strtotime($endTime)-strtotime($startTime); $model = $model->where($field,'>',strtotime($startTime)+$Time); $model = $model->where($field,'<',strtotime($endTime)+$Time); break; } if($status){ return [$model->count(),$title]; } $number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); return [$number,$title]; } //获取用户新增,头部信息 public static function getBadgeList($where){ $user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count(); $user_count_old=self::getOldDate($where)->count(); $fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count(); $fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count(); $newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0); $order_count=bcsub($user_count,$user_count_old,0); return [ [ 'name'=>'会员人数', 'field'=>'个', 'count'=>$user_count, 'content'=>'会员总人数', 'background_color'=>'layui-bg-blue', 'sum'=>self::count(), 'class'=>'fa fa-bar-chart', ], [ 'name'=>'会员增长', 'field'=>'个', 'count'=>$order_count, 'content'=>'会员增长率', 'background_color'=>'layui-bg-cyan', 'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0, 'class'=>'fa fa-line-chart', ], [ 'name'=>'分销人数', 'field'=>'个', 'count'=>$fenxiao, 'content'=>'分销总人数', 'background_color'=>'layui-bg-green', 'sum'=>self::where('spread_uid','neq',0)->count(), 'class'=>'fa fa-bar-chart', ], [ 'name'=>'分销增长', 'field'=>'个', 'count'=>$newFemxiao_count, 'content'=>'分销总人数', 'background_color'=>'layui-bg-orange', 'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0, 'class'=>'fa fa-cube', ], ]; } /* * 获取会员增长曲线图和分布图 * $where 查询条件 * $limit 显示条数,是否有滚动条 */ public static function getUserChartList($where,$limit=20){ $list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status']) ->where('add_time','neq',0) ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num']) ->order('_add_time asc') ->group('_add_time') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $Zoom=''; foreach ($list as $item){ $seriesdata[]=$item['num']; $xdata[]=$item['_add_time']; } (count($xdata) > $limit) && $Zoom=$xdata[$limit-5]; //多次购物会员数量饼状图 $count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count(); $user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter']) ->where('r.paid',1)->count('a.uid'); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0], 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1], 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom'); } //获取$date的前一天或者其他的时间段 public static function getOldDate($where,$moedls=null){ $model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls; switch ($where['data']){ case 'today': $model=$model->whereTime('add_time','yesterday'); break; case 'week': $model=$model->whereTime('add_time','last week'); break; case 'month': $model=$model->whereTime('add_time','last month'); break; case 'year': $model=$model->whereTime('add_time','last year'); break; case 'quarter': $time=self::getMonth('n',1); $model=$model->where('add_time','between',$time); break; } return $model; } //获取用户属性和性别分布图 public static function getEchartsData($where){ $model=self::alias('a'); $data=self::getModelTime($where,$model,'a.add_time') ->join('wechat_user r','r.uid=a.uid') ->group('r.province') ->field('count(r.province) as count,province') ->order('count desc') ->limit(15) ->select(); if(count($data)) $data=$data->toArray(); $legdata=[]; $dataList=[]; foreach ($data as $value){ $value['province']=='' && $value['province']='未知省份'; $legdata[]=$value['province']; $dataList[]=$value['count']; } $model=self::alias('a'); $sex=self::getModelTime($where,$model,'a.add_time') ->join('wechat_user r','r.uid=a.uid') ->group('r.sex') ->field('count(r.uid) as count,sex') ->order('count desc') ->select(); if(count($sex)) $sex=$sex->toArray(); $sexlegdata=['男','女','未知']; $sexcount=self::getModelTime($where,new self())->count(); $sexList=[]; $color=['#FB7773','#81BCFE','#91F3FE']; foreach ($sex as $key=>$item){ if($item['sex']==1){ $item_date['name']='男'; }else if($item['sex']==2){ $item_date['name']='女'; }else{ $item_date['name']='未知性别'; } $item_date['value']=bcdiv($item['count'],$sexcount,2)*100; $item_date['itemStyle']['color']=$color[$key]; $sexList[]=$item_date; } return compact('sexList','sexlegdata','legdata','dataList'); } //获取佣金记录列表 public static function getCommissionList($where){ $list=self::setCommissionWhere($where) ->page((int)$where['page'],(int)$where['limit']) ->select(); count($list) && $list=$list->toArray(); foreach ($list as &$value){ $value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price'); $value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price'); } $count=self::setCommissionWhere($where)->count(); return ['data'=>$list,'count'=>$count]; } //获取佣金记录列表的查询条件 public static function setCommissionWhere($where){ $models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid']) ->join('user_bill B','B.uid=A.uid') ->group('A.uid') ->where(['B.category'=>'now_money','B.type'=>'brokerage']) ->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']); if($where['order']==''){ $models=$models->order('sum_number desc'); }else{ $models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc'); } if($where['price_max']!='' && $where['price_min']!=''){ $models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]); } return $models; } /**获取用户详细信息 * @param $uid * @return array */ public static function getUserInfos($uid) { $userInfo = self::where('uid',$uid)->find(); if(!$userInfo) exception('读取用户信息失败!'); return $userInfo->toArray(); } //获取某人用户推广信息 public static function getUserinfo($uid){ $userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray(); $userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number'); $userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :''; return $userinfo; } //获取某用户的详细信息 public static function getUserDetailed($uid){ $key_field=['real_name','phone','province','city','district','detail','post_code']; $Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ? $thisAddress : Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find(); $UserInfo=self::get($uid); return [ ['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''], // ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8], ['name'=>'手机号码','value'=>$UserInfo['phone']], // ['name'=>'ID','value'=>$uid], ['name'=>'姓名','value'=>''], ['name'=>'微信昵称','value'=>$UserInfo['nickname']], ['name'=>'邮箱','value'=>''], ['name'=>'生日','value'=>''], ['name'=>'积分','value'=>UserBill::where(['category'=>'integral','uid'=>$uid])->where('type','in',['sign','system_add'])->sum('number')], ['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''], ['name'=>'账户余额','value'=>$UserInfo['now_money']], ['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')], ['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')], ]; } //获取某用户的订单个数,消费明细 public static function getHeaderList($uid){ return [ [ 'title'=>'总计订单', 'value'=>StoreOrder::where(['uid'=>$uid])->count(), 'key'=>'笔', 'class'=>'', ], [ 'title'=>'总消费金额', 'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'), 'key'=>'元', 'class'=>'', ], [ 'title'=>'本月订单', 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(), 'key'=>'笔', 'class'=>'', ], [ 'title'=>'本月消费金额', 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'), 'key'=>'元', 'class'=>'', ] ]; } /* * 获取 会员 订单个数,积分明细,优惠劵明细 * * $uid 用户id; * * return array */ public static function getCountInfo($uid){ $order_count=StoreOrder::where(['uid'=>$uid])->count(); $integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count(); $sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count(); $balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money']) ->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub']) ->count(); $coupon_count=StoreCouponUser::where(['uid'=>$uid])->count(); $spread_count=self::where(['spread_uid'=>$uid])->count(); return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count'); } /* * 获取 会员业务的 * 购物会员统计 * 会员访问量 * * 曲线图 * * $where 查询条件 * * return array */ public static function getUserBusinessChart($where,$limit=20){ //获取购物会员人数趋势图 $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where(['r.paid'=>1,'a.is_promoter'=>0]) ->where('a.add_time','neq',0) ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $zoom=''; foreach ($list as $item){ $seriesdata[]=$item['count_user']; $xdata[]=$item['_add_time']; } count($xdata) > $limit && $zoom=$xdata[$limit-5]; //会员访问量 $visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time') ->where('a.is_promoter',0) ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($visit) && $visit=$visit->toArray(); $visit_data=[]; $visit_xdata=[]; $visit_zoom=''; foreach ($visit as $item){ $visit_data[]=$item['count_user']; $visit_xdata[]=$item['_add_time']; } count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; //多次购物会员数量饼状图 $count=self::getModelTime($where,self::where('is_promoter',0))->count(); $user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where('a.is_promoter',0) ->where('r.paid',1) ->group('a.uid') ->count(); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0], 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1], 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata'); } /* * 获取用户 * 积分排行 * 会员余额排行榜 * 分销商佣金总额排行榜 * 购物笔数排行榜 * 购物金额排行榜 * 分销商佣金提现排行榜 * 上月消费排行榜 * $limit 查询多少条 * return array */ public static function getUserTop10List($limit=10,$is_promoter=0){ //积分排行 $integral=self::where('status',1) ->where('is_promoter',$is_promoter) ->order('integral desc') ->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) ->limit($limit) ->select(); count($integral) && $integral=$integral->toArray(); //会员余额排行榜 $now_money=self::where('status',1) ->where('is_promoter',$is_promoter) ->order('now_money desc') ->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) ->limit($limit) ->select(); count($now_money) && $now_money=$now_money->toArray(); //购物笔数排行榜 $orderPayCount = StoreOrder::getOrderPayCount($is_promoter); if($orderPayCount){ $shopcount=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) ->group('r.uid') ->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) ->order('sum_count desc') ->limit($limit) ->select(); }else $shopcount = []; count($shopcount) && $shopcount=$shopcount->toArray(); //购物金额排行榜 if($orderPayCount){ $order=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) ->group('r.uid') ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) ->order('sum_price desc') ->limit($limit) ->select(); }else $order = []; count($order) && $order=$order->toArray(); //上月消费排行 $orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter); if($orderPayCount){ $lastorder=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) // ->whereTime('r.pay_time','last month') ->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))]) ->group('r.uid') ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) ->order('sum_price desc') ->limit($limit) ->select(); }else $lastorder = []; count($lastorder) && $lastorder=$lastorder->toArray(); return compact('integral','now_money','shopcount','order','lastorder'); } /* * 获取 会员业务 * 会员总余额 会员总积分 * $where 查询条件 * * return array */ public static function getUserBusinesHeade($where){ return [ [ 'name'=>'会员总余额', 'field'=>'元', 'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'), 'background_color'=>'layui-bg-cyan', 'col'=>6, ], [ 'name'=>'会员总积分', 'field'=>'分', 'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'), 'background_color'=>'layui-bg-cyan', 'col'=>6 ] ]; } /* * 分销会员头部信息查询获取 * * 分销商总佣金余额 * 分销商总提现佣金 * 本月分销商业务佣金 * 本月分销商佣金提现金额 * 上月分销商业务佣金 * 上月分销商佣金提现金额 * $where array 时间条件 * * return array */ public static function getDistributionBadgeList($where){ return [ [ 'name'=>'分销商总佣金', 'field'=>'元', 'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'分销商总佣金余额', 'field'=>'元', 'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'分销商总提现佣金', 'field'=>'元', 'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'本月分销商业务佣金', 'field'=>'元', 'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage')) ->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'本月分销商佣金提现金额', 'field'=>'元', 'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1)) ->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->field('uid'); })->sum('extract_price'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], [ 'name'=>'上月分销商业务佣金', 'field'=>'元', 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->where('type','brokerage'))->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], [ 'name'=>'上月分销商佣金提现金额', 'field'=>'元', 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->where('type','brokerage'))->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], ]; } /* * 分销会员 * 分销数量 饼状图 * 分销商会员访问量 曲线 * 获取购物会员人数趋势图 曲线 * 多次购物分销会员数量 饼状图 * $where array 条件 * $limit int n条数据后出拖动条 * return array */ public static function getUserDistributionChart($where,$limit=20){ //分销数量 $fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select(); count($fenbu_user) && $fenbu_user=$fenbu_user->toArray(); $sum_user=0; $fenbu_data=[]; $fenbu_xdata=['分销商','非分销商']; $color=['#81BCFE','#91F3FE']; foreach($fenbu_user as $item){ $sum_user+=$item['num']; } foreach ($fenbu_user as $key=>$item){ $value['value']=bcdiv($item['num'],$sum_user,2)*100; $value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :''; $value['itemStyle']['color']=$color[$key]; $fenbu_data[]=$value; } //分销商会员访问量 $visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time') ->where('a.is_promoter',1) ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($visit) && $visit=$visit->toArray(); $visit_data=[]; $visit_xdata=[]; $visit_zoom=''; foreach ($visit as $item){ $visit_data[]=$item['count_user']; $visit_xdata[]=$item['_add_time']; } count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; //获取购物会员人数趋势图 $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where(['r.paid'=>1,'a.is_promoter'=>1]) ->where('a.add_time','neq',0) ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $zoom=''; foreach ($list as $item){ $seriesdata[]=$item['count_user']; $xdata[]=$item['_add_time']; } count($xdata) > $limit && $zoom=$xdata[$limit-5]; //多次购物分销会员数量饼状图 $count=self::getModelTime($where,self::where('is_promoter',1))->count(); $user_count=self::getModelTime($where,self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where('a.is_promoter',1) ->where('r.paid',1) ->group('a.uid') ->count(); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0].$user_count.'人', 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1].($count-$user_count).'人', 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data'); } /* * 分销商佣金提现排行榜 * 分销商佣金总额排行榜 * $limit 截取条数 * return array */ public static function getUserDistributionTop10List($limit){ //分销商佣金提现排行榜 $extract=self::alias('a') ->join('user_extract t','a.uid=t.uid') ->where(['t.status'=>1,'a.is_promoter'=>1]) ->group('t.uid') ->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid']) ->order('sum_price desc') ->limit($limit) ->select(); count($extract) && $extract=$extract->toArray(); //分销商佣金总额排行榜 $commission=UserBill::alias('l') ->join('user a','l.uid=a.uid') ->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1]) ->group('l.uid') ->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) ->order('sum_number desc') ->limit($limit) ->select(); count($commission) && $commission=$commission->toArray(); return compact('extract','commission'); } public static function getSpreadList($uid,$page,$limit){ $list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time']) ->order('uid desc')->page((int)$page,(int)$limit)->select(); count($list) && $list=$list->toArray(); foreach ($list as &$item){ $item['add_time']=date('Y-m-d H',$item['add_time']); } return $list; } } \ No newline at end of file + + * @day: 2017/11/11 + */ +namespace app\admin\model\user; +use app\admin\model\order\StoreOrder; +use app\admin\model\system\SystemUserLevel; +use traits\ModelTrait; +use app\admin\model\user\UserBill; +use basic\ModelBasic; +use app\admin\model\wechat\WechatUser; +use app\admin\model\store\StoreCouponUser; +use app\admin\model\user\UserExtract; +use app\core\util\SystemConfigService; +use think\Db; +/** + * 用户管理 model + * Class User + * @package app\admin\model\user + */ +class User extends ModelBasic +{ + use ModelTrait; + /** + * @param $where + * @return array + */ + public static function systemPage($where){ + $model = new self; + if($where['status'] != '') $model = $model->where('status',$where['status']); + if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']); + if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']); + if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%"); + $model = $model->order('uid desc'); + return self::page($model,function ($item){ + if($item['spread_uid']){ + $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname'); + }else{ + $item['spread_uid_nickname'] = '无'; + } + },$where); + } + /* + * 设置搜索条件 + * + */ + public static function setWhere($where) + { + if($where['order']!=''){ + $model=self::order(self::setOrder($where['order'])); + }else{ + $model=self::order('u.uid desc'); + } + if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or'); + } + if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.last_time', '>', strtotime($startTime)); + $model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600); + } + if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.add_time', '>', strtotime($startTime)); + $model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600); + } + if($where['pay_count'] !== '') { + if($where['pay_count'] == '-1') $model = $model->where('pay_count',0); + else $model = $model->where('pay_count','>',$where['pay_count']); + } + if($where['user_type'] != ''){ + if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null'); + else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null'); + } + if($where['country'] != ''){ + if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国'); + else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国'); + } + return $model; + } + /** + * 异步获取当前用户 信息 + * @param $where + * @return array + */ + public static function getUserList($where){ + $model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']); + $list = $model->alias('u') + ->join('WechatUser w','u.uid=w.uid') + ->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time') + ->page((int)$where['page'],(int)$where['limit']) + ->select() + ->each(function ($item){ + $item['add_time']=date('Y-m-d H:i:s',$item['add_time']); + if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期 + else $item['last_time'] = '无访问';//最近一次访问日期 + self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']); + $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现 + if($item['spread_uid']){ + $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid']; + }else{ + $item['spread_uid_nickname'] = '无'; + } + if($item['openid'] != '' && $item['routine_openid'] != ''){ + $item['user_type']='通用'; + }else if($item['openid'] == '' && $item['routine_openid'] != ''){ + $item['user_type']='小程序'; + }else if($item['openid'] != '' && $item['routine_openid'] == ''){ + $item['user_type']='公众号'; + }else $item['user_type']='其他'; + if($item['sex'] == 1){ + $item['sex']='男'; + }else if($item['sex'] == 2){ + $item['sex']='女'; + }else $item['sex']='保密'; + $item['vip_name']=false; + $levelinfo=UserLevel::where(['uid'=>$item['uid'],'is_del'=>0])->order('grade desc')->field(['level_id','is_forever','valid_time'])->find(); + if($levelinfo){ + if($levelinfo['is_forever']) $item['vip_name']=SystemUserLevel::where('id',$levelinfo['level_id'])->value('name'); + else if(time() > $levelinfo['valid_time']) $item['vip_name']=SystemUserLevel::where('id',$levelinfo['level_id'])->value('name'); + } + });//->toArray(); + $count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count(); + return ['count'=>$count,'data'=>$list]; + } + /** + * 修改用户状态 + * @param $uids 用户uid + * @param $status 修改状态 + * @return array + */ + public static function destrSyatus($uids,$status){ + if(empty($uids) && !is_array($uids)) return false; + if($status=='') return false; + self::beginTrans(); + try{ + $res=self::where('uid','in',$uids)->update(['status'=>$status]); + self::checkTrans($res); + return true; + }catch (\Exception $e){ + self::rollbackTrans(); + return Json::fail($e->getMessage()); + } + } + /* + * 获取某季度,某年某年后的时间戳 + * + * self::getMonth('n',1) 获取当前季度的上个季度的时间戳 + * self::getMonth('n') 获取当前季度的时间戳 + */ + public static function getMonth($time='',$ceil=0){ + if(empty($time)){ + $firstday = date("Y-m-01",time()); + $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day")); + }else if($time=='n'){ + if($ceil!=0) + $season = ceil(date('n') /3)-$ceil; + else + $season = ceil(date('n') /3); + $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); + $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); + }else if($time=='y'){ + $firstday=date('Y-01-01'); + $lastday=date('Y-12-31'); + }else if($time=='h'){ + $firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00'; + $lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59'; + } + return array($firstday,$lastday); + } + public static function getcount(){ + return self::count(); + } + /* + *获取用户某个时间段的消费信息 + * + * reutrn Array || number + */ + public static function consume($where,$status='',$keep=''){ + $model = new self; + $user_id=[]; + if(is_array($where)){ + if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']); + if($where['status']!='') $model=$model->where('status',$where['status']); + switch ($where['date']){ + case null:case 'today':case 'week':case 'year': + if($where['date']==null){ + $where['date']='month'; + } + if($keep){ + $model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']); + }else{ + $model=$model->whereTime('add_time',$where['date']); + } + break; + case 'quarter': + $quarter=self::getMonth('n'); + $startTime=strtotime($quarter[0]); + $endTime=strtotime($quarter[1]); + if($keep){ + $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime); + }else{ + $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime); + } + break; + default: + //自定义时间 + if(strstr($where['date'],'-')!==FALSE){ + list($startTime,$endTime)=explode('-',$where['date']); + $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime)); + }else{ + $model=$model->whereTime('add_time','month'); + } + break; + } + }else{ + if(is_array($status)){ + $model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]); + } + } + if($keep===true){ + return $model->count(); + } + if($status==='default'){ + return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray(); + } + if($status==='grouping'){ + return $model->group('user_type')->field('user_type')->select()->toArray(); + } + $uid=$model->field('uid')->select()->toArray(); + foreach ($uid as $val){ + $user_id[]=$val['uid']; + } + if(empty($user_id)){ + $user_id=[0]; + } + if($status==='xiaofei'){ + $list=UserBill::where('uid','in',$user_id) + ->group('type') + ->field('sum(number) as top_number,title') + ->select() + ->toArray(); + $series=[ + 'name'=>isset($list[0]['title'])?$list[0]['title']:'', + 'type'=>'pie', + 'radius'=> ['40%', '50%'], + 'data'=>[] + ]; + foreach($list as $key=>$val){ + $series['data'][$key]['value']=$val['top_number']; + $series['data'][$key]['name']=$val['title']; + } + return $series; + }else if($status==='form'){ + $list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray(); + $count=self::getcount(); + $option=[ + 'legend_date'=>[], + 'series_date'=>[] + ]; + foreach($list as $key=>$val){ + $num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0; + $t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle']; + $option['legend_date'][$key]=$t; + $option['series_date'][$key]=['value'=>$num,'name'=>$t['name']]; + } + return $option; + }else{ + $number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number'); + return $number; + } + } + /* + * 获取 用户某个时间段的钱数或者TOP20排行 + * + * return Array || number + */ + public static function getUserSpend($date,$status=''){ + $model=new self(); + $model=$model->alias('A'); + switch ($date){ + case null:case 'today':case 'week':case 'year': + if($date==null) $date='month'; + $model=$model->whereTime('A.add_time',$date); + break; + case 'quarter': + list($startTime,$endTime)=User::getMonth('n'); + $model = $model->where('A.add_time','>',strtotime($startTime)); + $model = $model->where('A.add_time','<',strtotime($endTime)); + break; + default: + list($startTime,$endTime)=explode('-',$date); + $model = $model->where('A.add_time','>',strtotime($startTime)); + $model = $model->where('A.add_time','<',strtotime($endTime)); + break; + } + if($status===true){ + return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); + } + $list=$model->join('user_bill B','B.uid=A.uid') + ->where('B.type','pay_product') + ->where('B.pm',0) + ->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time') + ->order('totel_number desc') + ->limit(0,20) + ->select() + ->toArray(); + if(!isset($list[0]['totel_number'])){ + $list=[]; + } + return $list; + } + /* + * 获取 相对于上月或者其他的数据 + * + * return Array + */ + public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){ + $model=new self(); + if(!$status) $model=$model->alias('A'); + switch ($date){ + case null:case 'today':case 'week':case 'year': + if($date==null) { + $date='last month'; + $title='相比上月用户'.$t.'增长'; + } + if($date=='today') { + $date='yesterday'; + $title='相比昨天用户'.$t.'增长'; + } + if($date=='week') { + $date='last week'; + $title='相比上周用户'.$t.'增长'; + } + if($date=='year') { + $date='last year'; + $title='相比去年用户'.$t.'增长'; + } + $model=$model->whereTime($field,$date); + break; + case 'quarter': + $title='相比上季度用户'.$t.'增长'; + list($startTime,$endTime)=User::getMonth('n',1); + $model = $model->where($field,'>',$startTime); + $model = $model->where($field,'<',$endTime); + break; + default: + list($startTime,$endTime)=explode('-',$date); + $title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长'; + $Time=strtotime($endTime)-strtotime($startTime); + $model = $model->where($field,'>',strtotime($startTime)+$Time); + $model = $model->where($field,'<',strtotime($endTime)+$Time); + break; + } + if($status){ + return [$model->count(),$title]; + } + $number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); + return [$number,$title]; + } + //获取用户新增,头部信息 + public static function getBadgeList($where){ + $user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count(); + $user_count_old=self::getOldDate($where)->count(); + $fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count(); + $fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count(); + $newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0); + $order_count=bcsub($user_count,$user_count_old,0); + return [ + [ + 'name'=>'会员人数', + 'field'=>'个', + 'count'=>$user_count, + 'content'=>'会员总人数', + 'background_color'=>'layui-bg-blue', + 'sum'=>self::count(), + 'class'=>'fa fa-bar-chart', + ], + [ + 'name'=>'会员增长', + 'field'=>'个', + 'count'=>$order_count, + 'content'=>'会员增长率', + 'background_color'=>'layui-bg-cyan', + 'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0, + 'class'=>'fa fa-line-chart', + ], + [ + 'name'=>'分销人数', + 'field'=>'个', + 'count'=>$fenxiao, + 'content'=>'分销总人数', + 'background_color'=>'layui-bg-green', + 'sum'=>self::where('spread_uid','neq',0)->count(), + 'class'=>'fa fa-bar-chart', + ], + [ + 'name'=>'分销增长', + 'field'=>'个', + 'count'=>$newFemxiao_count, + 'content'=>'分销总人数', + 'background_color'=>'layui-bg-orange', + 'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0, + 'class'=>'fa fa-cube', + ], + ]; + } + /* + * 获取会员增长曲线图和分布图 + * $where 查询条件 + * $limit 显示条数,是否有滚动条 + */ + public static function getUserChartList($where,$limit=20){ + $list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status']) + ->where('add_time','neq',0) + ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num']) + ->order('_add_time asc') + ->group('_add_time') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $Zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['num']; + $xdata[]=$item['_add_time']; + } + (count($xdata) > $limit) && $Zoom=$xdata[$limit-5]; + //多次购物会员数量饼状图 + $count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count(); + $user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter']) + ->where('r.paid',1)->count('a.uid'); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0], + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1], + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom'); + } + //获取$date的前一天或者其他的时间段 + public static function getOldDate($where,$moedls=null){ + $model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls; + switch ($where['data']){ + case 'today': + $model=$model->whereTime('add_time','yesterday'); + break; + case 'week': + $model=$model->whereTime('add_time','last week'); + break; + case 'month': + $model=$model->whereTime('add_time','last month'); + break; + case 'year': + $model=$model->whereTime('add_time','last year'); + break; + case 'quarter': + $time=self::getMonth('n',1); + $model=$model->where('add_time','between',$time); + break; + } + return $model; + } + //获取用户属性和性别分布图 + public static function getEchartsData($where){ + $model=self::alias('a'); + $data=self::getModelTime($where,$model,'a.add_time') + ->join('wechat_user r','r.uid=a.uid') + ->group('r.province') + ->field('count(r.province) as count,province') + ->order('count desc') + ->limit(15) + ->select(); + if(count($data)) $data=$data->toArray(); + $legdata=[]; + $dataList=[]; + foreach ($data as $value){ + $value['province']=='' && $value['province']='未知省份'; + $legdata[]=$value['province']; + $dataList[]=$value['count']; + } + $model=self::alias('a'); + $sex=self::getModelTime($where,$model,'a.add_time') + ->join('wechat_user r','r.uid=a.uid') + ->group('r.sex') + ->field('count(r.uid) as count,sex') + ->order('count desc') + ->select(); + if(count($sex)) $sex=$sex->toArray(); + $sexlegdata=['男','女','未知']; + $sexcount=self::getModelTime($where,new self())->count(); + $sexList=[]; + $color=['#FB7773','#81BCFE','#91F3FE']; + foreach ($sex as $key=>$item){ + if($item['sex']==1){ + $item_date['name']='男'; + }else if($item['sex']==2){ + $item_date['name']='女'; + }else{ + $item_date['name']='未知性别'; + } + $item_date['value']=bcdiv($item['count'],$sexcount,2)*100; + $item_date['itemStyle']['color']=$color[$key]; + $sexList[]=$item_date; + } + return compact('sexList','sexlegdata','legdata','dataList'); + } + //获取佣金记录列表 + public static function getCommissionList($where){ + $list=self::setCommissionWhere($where) + ->page((int)$where['page'],(int)$where['limit']) + ->select(); + count($list) && $list=$list->toArray(); + foreach ($list as &$value){ + $value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price'); + $value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price'); + } + $count=self::setCommissionWhere($where)->count(); + return ['data'=>$list,'count'=>$count]; + } + //获取佣金记录列表的查询条件 + public static function setCommissionWhere($where){ + $models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid']) + ->join('user_bill B','B.uid=A.uid') + ->group('A.uid') + ->where(['B.category'=>'now_money','B.type'=>'brokerage']) + ->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']); + if($where['order']==''){ + $models=$models->order('sum_number desc'); + }else{ + $models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc'); + } + if($where['price_max']!='' && $where['price_min']!=''){ + $models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]); + } + return $models; + } + + /**获取用户详细信息 + * @param $uid + * @return array + */ + public static function getUserInfos($uid) + { + $userInfo = self::where('uid',$uid)->find(); + if(!$userInfo) exception('读取用户信息失败!'); + return $userInfo->toArray(); + } + + //获取某人用户推广信息 + public static function getUserinfo($uid){ + $userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray(); + $userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number'); + $userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :''; + return $userinfo; + } + //获取某用户的详细信息 + public static function getUserDetailed($uid){ + $key_field=['real_name','phone','province','city','district','detail','post_code']; + $Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ? + $thisAddress : + Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find(); + $UserInfo=self::get($uid); + return [ + ['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''], +// ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8], + ['name'=>'手机号码','value'=>$UserInfo['phone']], +// ['name'=>'ID','value'=>$uid], + ['name'=>'姓名','value'=>''], + ['name'=>'微信昵称','value'=>$UserInfo['nickname']], + ['name'=>'邮箱','value'=>''], + ['name'=>'生日','value'=>''], + ['name'=>'积分','value'=>$UserInfo['integral']], + ['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''], + ['name'=>'账户余额','value'=>$UserInfo['now_money']], + ['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')], + ['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')], + ]; + } + //获取某用户的订单个数,消费明细 + public static function getHeaderList($uid){ + return [ + [ + 'title'=>'总计订单', + 'value'=>StoreOrder::where(['uid'=>$uid])->count(), + 'key'=>'笔', + 'class'=>'', + ], + [ + 'title'=>'总消费金额', + 'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'), + 'key'=>'元', + 'class'=>'', + ], + [ + 'title'=>'本月订单', + 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(), + 'key'=>'笔', + 'class'=>'', + ], + [ + 'title'=>'本月消费金额', + 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'), + 'key'=>'元', + 'class'=>'', + ] + ]; + } + /* + * 获取 会员 订单个数,积分明细,优惠劵明细 + * + * $uid 用户id; + * + * return array + */ + public static function getCountInfo($uid){ + $order_count=StoreOrder::where(['uid'=>$uid])->count(); + $integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count(); + $sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count(); + $balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money']) + ->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub']) + ->count(); + $coupon_count=StoreCouponUser::where(['uid'=>$uid])->count(); + $spread_count=self::where(['spread_uid'=>$uid])->count(); + return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count'); + } + /* + * 获取 会员业务的 + * 购物会员统计 + * 会员访问量 + * + * 曲线图 + * + * $where 查询条件 + * + * return array + */ + public static function getUserBusinessChart($where,$limit=20){ + //获取购物会员人数趋势图 + $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where(['r.paid'=>1,'a.is_promoter'=>0]) + ->where('a.add_time','neq',0) + ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['count_user']; + $xdata[]=$item['_add_time']; + } + count($xdata) > $limit && $zoom=$xdata[$limit-5]; + //会员访问量 + $visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time') + ->where('a.is_promoter',0) + ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($visit) && $visit=$visit->toArray(); + $visit_data=[]; + $visit_xdata=[]; + $visit_zoom=''; + foreach ($visit as $item){ + $visit_data[]=$item['count_user']; + $visit_xdata[]=$item['_add_time']; + } + count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; + //多次购物会员数量饼状图 + $count=self::getModelTime($where,self::where('is_promoter',0))->count(); + $user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where('a.is_promoter',0) + ->where('r.paid',1) + ->group('a.uid') + ->count(); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0], + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1], + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata'); + } + /* + * 获取用户 + * 积分排行 + * 会员余额排行榜 + * 分销商佣金总额排行榜 + * 购物笔数排行榜 + * 购物金额排行榜 + * 分销商佣金提现排行榜 + * 上月消费排行榜 + * $limit 查询多少条 + * return array + */ + public static function getUserTop10List($limit=10,$is_promoter=0){ + //积分排行 + $integral=self::where('status',1) + ->where('is_promoter',$is_promoter) + ->order('integral desc') + ->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) + ->limit($limit) + ->select(); + count($integral) && $integral=$integral->toArray(); + //会员余额排行榜 + $now_money=self::where('status',1) + ->where('is_promoter',$is_promoter) + ->order('now_money desc') + ->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) + ->limit($limit) + ->select(); + count($now_money) && $now_money=$now_money->toArray(); + //购物笔数排行榜 + $orderPayCount = StoreOrder::getOrderPayCount($is_promoter); + if($orderPayCount){ + $shopcount=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) + ->group('r.uid') + ->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) + ->order('sum_count desc') + ->limit($limit) + ->select(); + }else $shopcount = []; + count($shopcount) && $shopcount=$shopcount->toArray(); + //购物金额排行榜 + if($orderPayCount){ + $order=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) + ->group('r.uid') + ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + }else $order = []; + count($order) && $order=$order->toArray(); + //上月消费排行 + $orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter); + if($orderPayCount){ + $lastorder=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) +// ->whereTime('r.pay_time','last month') + ->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))]) + ->group('r.uid') + ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + }else $lastorder = []; + count($lastorder) && $lastorder=$lastorder->toArray(); + return compact('integral','now_money','shopcount','order','lastorder'); + } + /* + * 获取 会员业务 + * 会员总余额 会员总积分 + * $where 查询条件 + * + * return array + */ + public static function getUserBusinesHeade($where){ + return [ + [ + 'name'=>'会员总余额', + 'field'=>'元', + 'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'), + 'background_color'=>'layui-bg-cyan', + 'col'=>6, + ], + [ + 'name'=>'会员总积分', + 'field'=>'分', + 'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'), + 'background_color'=>'layui-bg-cyan', + 'col'=>6 + ] + ]; + } + /* + * 分销会员头部信息查询获取 + * + * 分销商总佣金余额 + * 分销商总提现佣金 + * 本月分销商业务佣金 + * 本月分销商佣金提现金额 + * 上月分销商业务佣金 + * 上月分销商佣金提现金额 + * $where array 时间条件 + * + * return array + */ + public static function getDistributionBadgeList($where){ + return [ + [ + 'name'=>'分销商总佣金', + 'field'=>'元', + 'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'分销商总佣金余额', + 'field'=>'元', + 'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'分销商总提现佣金', + 'field'=>'元', + 'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'本月分销商业务佣金', + 'field'=>'元', + 'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage')) + ->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'本月分销商佣金提现金额', + 'field'=>'元', + 'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1)) + ->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->field('uid'); + })->sum('extract_price'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + [ + 'name'=>'上月分销商业务佣金', + 'field'=>'元', + 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->where('type','brokerage'))->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + [ + 'name'=>'上月分销商佣金提现金额', + 'field'=>'元', + 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->where('type','brokerage'))->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + ]; + } + /* + * 分销会员 + * 分销数量 饼状图 + * 分销商会员访问量 曲线 + * 获取购物会员人数趋势图 曲线 + * 多次购物分销会员数量 饼状图 + * $where array 条件 + * $limit int n条数据后出拖动条 + * return array + */ + public static function getUserDistributionChart($where,$limit=20){ + //分销数量 + $fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select(); + count($fenbu_user) && $fenbu_user=$fenbu_user->toArray(); + $sum_user=0; + $fenbu_data=[]; + $fenbu_xdata=['分销商','非分销商']; + $color=['#81BCFE','#91F3FE']; + foreach($fenbu_user as $item){ + $sum_user+=$item['num']; + } + foreach ($fenbu_user as $key=>$item){ + $value['value']=bcdiv($item['num'],$sum_user,2)*100; + $value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :''; + $value['itemStyle']['color']=$color[$key]; + $fenbu_data[]=$value; + } + //分销商会员访问量 + $visit=self::getModelTime($where,self::alias('a')->join('store_visit t','t.uid=a.uid'),'t.add_time') + ->where('a.is_promoter',1) + ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); +// echo self::getLastSql();die; + count($visit) && $visit=$visit->toArray(); + $visit_data=[]; + $visit_xdata=[]; + $visit_zoom=''; + foreach ($visit as $item){ + $visit_data[]=$item['count_user']; + $visit_xdata[]=$item['_add_time']; + } + count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; + //获取购物会员人数趋势图 + $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where(['r.paid'=>1,'a.is_promoter'=>1]) + ->where('a.add_time','neq',0) + ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['count_user']; + $xdata[]=$item['_add_time']; + } + count($xdata) > $limit && $zoom=$xdata[$limit-5]; + //多次购物分销会员数量饼状图 + $count=self::getModelTime($where,self::where('is_promoter',1))->count(); + $user_count=self::getModelTime($where,self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where('a.is_promoter',1) + ->where('r.paid',1) + ->group('a.uid') + ->count(); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0].$user_count.'人', + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1].($count-$user_count).'人', + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data'); + } + /* + * 分销商佣金提现排行榜 + * 分销商佣金总额排行榜 + * $limit 截取条数 + * return array + */ + public static function getUserDistributionTop10List($limit){ + //分销商佣金提现排行榜 + $extract=self::alias('a') + ->join('user_extract t','a.uid=t.uid') + ->where(['t.status'=>1,'a.is_promoter'=>1]) + ->group('t.uid') + ->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + count($extract) && $extract=$extract->toArray(); + //分销商佣金总额排行榜 + $commission=UserBill::alias('l') + ->join('user a','l.uid=a.uid') + ->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1]) + ->group('l.uid') + ->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) + ->order('sum_number desc') + ->limit($limit) + ->select(); + count($commission) && $commission=$commission->toArray(); + return compact('extract','commission'); + } + public static function getSpreadList($uid,$page,$limit){ + $list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time']) + ->order('uid desc')->page((int)$page,(int)$limit)->select(); + count($list) && $list=$list->toArray(); + foreach ($list as &$item){ + $item['add_time']=date('Y-m-d H',$item['add_time']); + } + return $list; + } + /** + * 一级分销 + * @param $orderInfo + * @return bool + */ + public static function backOrderBrokerage($orderInfo) + { + $userInfo = User::getUserInfo($orderInfo['uid']); + if(!$userInfo || !$userInfo['spread_uid']) return true; + $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型 + if($storeBrokerageStatu == 1){ + if(!User::be(['uid'=>$userInfo['spread_uid'],'is_promoter'=>1])) return true; + } + $brokerageRatio = (SystemConfigService::get('store_brokerage_ratio') ?: 0)/100; + if($brokerageRatio <= 0) return true; + $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价 + if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回 + $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2); + //返佣之后余额 + $spNow_money = User::where(['uid'=>$userInfo['spread_uid']])->value('now_money'); + $balance = bcadd($spNow_money,$brokeragePrice,2); + if($brokeragePrice <= 0) return true; + $mark = $userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice); + self::beginTrans(); + $res1 = UserBill::income('获得推广佣金',$userInfo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark); + $res2 = self::bcInc($userInfo['spread_uid'],'now_money',$brokeragePrice,'uid'); + $res = $res1 && $res2; + self::checkTrans($res); + if($res) self::backOrderBrokerageTwo($orderInfo); + return $res; + } + + /** + * 二级推广 + * @param $orderInfo + * @return bool + */ + public static function backOrderBrokerageTwo($orderInfo){ + $userInfo = User::getUserInfo($orderInfo['uid']); + $userInfoTwo = User::getUserInfo($userInfo['spread_uid']); + if(!$userInfoTwo || !$userInfoTwo['spread_uid']) return true; + $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型 + if($storeBrokerageStatu == 1){ + if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true; + } + $brokerageRatio = (SystemConfigService::get('store_brokerage_two') ?: 0)/100; + if($brokerageRatio <= 0) return true; + $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价 + if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回 + $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2); + //返佣之后余额 + $spNow_money = User::where(['uid'=>$userInfo['spread_uid']])->value('now_money'); + $balance = bcadd($spNow_money,$brokeragePrice,2); + if($brokeragePrice <= 0) return true; + $mark = '二级推广人'.$userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice); + self::beginTrans(); + $res1 = UserBill::income('获得推广佣金',$userInfoTwo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark); + $res2 = self::bcInc($userInfoTwo['spread_uid'],'now_money',$brokeragePrice,'uid'); + $res = $res1 && $res2; + self::checkTrans($res); + return $res; + } +} \ No newline at end of file diff --git a/application/admin/model/user/UserExtract.php b/application/admin/model/user/UserExtract.php index 43a0c445..d1475e04 100644 --- a/application/admin/model/user/UserExtract.php +++ b/application/admin/model/user/UserExtract.php @@ -14,7 +14,7 @@ use app\admin\model\wechat\WechatUser; use think\Url; use traits\ModelTrait; use basic\ModelBasic; -use service\WechatTemplateService; +use app\core\util\WechatTemplateService; /** * 用户提现管理 model * Class User @@ -49,16 +49,18 @@ class UserExtract extends ModelBasic $uid=$data['uid']; $status = -1; $User= User::find(['uid'=>$uid])->toArray(); - UserBill::income('提现失败',$uid,'now_money','extract',$extract_number,$id,$User['now_money'],$mark); - + UserBill::income('提现失败',$uid,'now_money','extract',$extract_number,$id,bcadd($User['now_money'],$extract_number,2),$mark); User::bcInc($uid,'now_money',$extract_number,'uid'); - WechatTemplateService::sendTemplate(WechatUser::uidToOpenid($uid),WechatTemplateService::USER_BALANCE_CHANGE,[ - 'first'=> $mark, - 'keyword1'=>'佣金提现', - 'keyword2'=>date('Y-m-d H:i:s',time()), - 'keyword3'=>$extract_number, - 'remark'=>'错误原因:'.$fail_msg - ],Url::build('wap/my/user_pro',[],true,true)); + if($User['user_type'] == 'wechat'){ + WechatTemplateService::sendTemplate(WechatUser::uidToOpenid($uid),WechatTemplateService::USER_BALANCE_CHANGE,[ + 'first'=> $mark, + 'keyword1'=>'佣金提现', + 'keyword2'=>date('Y-m-d H:i:s',time()), + 'keyword3'=>$extract_number, + 'remark'=>'错误原因:'.$fail_msg + ],Url::build('wap/my/user_pro',[],true,true)); + } + return self::edit(compact('fail_time','fail_msg','status'),$id); } @@ -69,13 +71,16 @@ class UserExtract extends ModelBasic $extract_number=$data['extract_price']; $mark='成功提现佣金'.$extract_number.'元'; $uid=$data['uid']; - WechatTemplateService::sendTemplate(WechatUser::uidToOpenid($uid),WechatTemplateService::USER_BALANCE_CHANGE,[ - 'first'=> $mark, - 'keyword1'=>'佣金提现', - 'keyword2'=>date('Y-m-d H:i:s',time()), - 'keyword3'=>$extract_number, - 'remark'=>'点击查看我的佣金明细' - ],Url::build('wap/my/user_pro',[],true,true)); + $User= User::find(['uid'=>$uid])->toArray(); + if($User['user_type'] == 'wechat') { + WechatTemplateService::sendTemplate(WechatUser::uidToOpenid($uid), WechatTemplateService::USER_BALANCE_CHANGE, [ + 'first' => $mark, + 'keyword1' => '佣金提现', + 'keyword2' => date('Y-m-d H:i:s', time()), + 'keyword3' => $extract_number, + 'remark' => '点击查看我的佣金明细' + ], Url::build('wap/my/user_pro', [], true, true)); + } return self::edit(compact('status'),$id); } //测试数据 diff --git a/application/admin/model/user/UserLevel.php b/application/admin/model/user/UserLevel.php new file mode 100644 index 00000000..ce0a01c1 --- /dev/null +++ b/application/admin/model/user/UserLevel.php @@ -0,0 +1,54 @@ + + * @day: 2017/11/11 + */ +namespace app\admin\model\user; +use app\admin\model\system\SystemUserLevel; +use traits\ModelTrait; +use basic\ModelBasic; +/** + * 用户管理 model + * Class User + * @package app\admin\model\user + */ +class UserLevel extends ModelBasic +{ + use ModelTrait; + + public static function setWhere($where,$alias='',$userAlias='u.',$model=null) + { + $model=is_null($model) ? new self() : $model; + if($alias){ + $model=$model->alias($alias); + $alias.='.'; + } + if(isset($where['nickname']) && $where['nickname']!='') $model=$model->where("{$userAlias}nickanme",$where['nickname']); + if(isset($where['level_id']) && $where['level_id']!='') $model=$model->where("{$alias}level_id",$where['level_id']); + return $model->where(["{$alias}status"=>1,"{$alias}is_del"=>0]); + } + /* + * 查询用户vip列表 + * @param array $where + * */ + public static function getUserVipList($where) + { + $data=self::setWhere($where,'a')->group('a.uid')->order('grade desc') + ->field(['a.*','u.nickname','u.avatar']) + ->join('__USER__ u','a.uid=u.uid')->page((int)$where['page'],(int)$where['limit'])->select(); + $data=count($data) ? $data->toArray() : []; + foreach ($data as &$item){ + $info=SystemUserLevel::where('id',$item['level_id'])->find(); + if($info){ + $item['name']=$info['name']; + $item['icon']=$info['icon']; + } + $item['is_forever']= $item['is_forever'] ? '永久会员':'限时会员'; + $item['valid_time']=$item['is_forever'] ? '永久':date('Y-m-d H:i:s',$item['valid_time']); + } + $count=self::setWhere($where,'a')->group('a.level_id')->order('grade desc')->join('__USER__ u','a.uid=u.uid')->count(); + return compact('data','count'); + } + +} \ No newline at end of file diff --git a/application/admin/model/user/UserRecharge.php b/application/admin/model/user/UserRecharge.php index 45cf73d4..596eb675 100644 --- a/application/admin/model/user/UserRecharge.php +++ b/application/admin/model/user/UserRecharge.php @@ -1,12 +1,18 @@ + * @day: 2017/11/28 + */ + namespace app\admin\model\user; + use traits\ModelTrait; use basic\ModelBasic; -use app\admin\model\user\User; /** - * 提现记录 + * 用户充值记录 * Class UserRecharge * @package app\admin\model\user */ @@ -19,8 +25,9 @@ use app\admin\model\user\User; $model = new self; $model = $model->alias('A'); if($where['order_id'] != '') { - $model = $model->where('A.order_id|B.nickname','like',"%$where[order_id]%"); + $model = $model->whereOr('A.order_id','like',"%$where[order_id]%"); $model = $model->whereOr('A.id',(int)$where['order_id']); + $model = $model->whereOr('B.nickname','like',"%$where[order_id]%"); } $model = $model->where('A.recharge_type','weixin'); $model = $model->where('A.paid',1); diff --git a/application/admin/model/user/UserTaskFinish.php b/application/admin/model/user/UserTaskFinish.php new file mode 100644 index 00000000..909b30ed --- /dev/null +++ b/application/admin/model/user/UserTaskFinish.php @@ -0,0 +1,29 @@ +$uid,'task_id'=>$task_id])) return true; + return self::set(compact('uid','task_id','add_time')); + } +} \ No newline at end of file diff --git a/application/admin/model/wechat/WechatQrcode.php b/application/admin/model/wechat/WechatQrcode.php index c9fce08a..fa7527a2 100644 --- a/application/admin/model/wechat/WechatQrcode.php +++ b/application/admin/model/wechat/WechatQrcode.php @@ -10,7 +10,7 @@ namespace app\admin\model\wechat; use traits\ModelTrait; use basic\ModelBasic; -use service\WechatService; +use app\core\util\WechatService; /** * 获取二维码 diff --git a/application/admin/model/wechat/WechatReply.php b/application/admin/model/wechat/WechatReply.php index 4a82d2c7..7fd197e3 100644 --- a/application/admin/model/wechat/WechatReply.php +++ b/application/admin/model/wechat/WechatReply.php @@ -12,7 +12,7 @@ use traits\ModelTrait; use basic\ModelBasic; use service\HookService; use service\UtilService; -use service\WechatService; +use app\core\util\WechatService; use think\Url; /** @@ -30,7 +30,7 @@ class WechatReply extends ModelBasic * @param $key */ public static function getDataByKey($key){ - $resdata = []; + $resdata = ['data'=>'']; $resdata = self::where('key',$key)->find(); $resdata['data'] = json_decode($resdata['data'],true); return $resdata; @@ -187,9 +187,7 @@ class WechatReply extends ModelBasic public static function reply($key,$default=''){ $res = self::where('key',$key)->where('status','1')->find(); if(empty($res)) $res = self::where('key','default')->where('status','1')->find(); - if(empty($res)){ - return WechatService::textMessage($default); - } + if(empty($res)) return WechatService::transfer(); $res['data'] = json_decode($res['data'],true); if($res['type'] == 'text'){ return WechatService::textMessage($res['data']['content']); diff --git a/application/admin/model/wechat/WechatUser.php b/application/admin/model/wechat/WechatUser.php index fe16aff4..f99d3e58 100644 --- a/application/admin/model/wechat/WechatUser.php +++ b/application/admin/model/wechat/WechatUser.php @@ -12,14 +12,14 @@ use app\admin\model\order\StoreOrder; use app\admin\model\user\User; use app\admin\model\user\UserExtract; use service\ExportService; -use service\QrcodeService; +use app\core\util\QrcodeService; use think\Cache; use think\Config; use traits\ModelTrait; use basic\ModelBasic; -use service\WechatService; +use app\core\util\WechatService; use service\PHPExcelService; -use service\SystemConfigService; +use app\core\util\SystemConfigService; /** * 微信用户 model @@ -215,7 +215,11 @@ use service\SystemConfigService; ->ExcelSave(); } return self::page($model,function ($item){ - $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid']); + try{ + $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid']); + }catch (\Exception $e){ + $item['qr_code'] = ''; + } $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现 $item['extract_count_num'] = UserExtract::getUserCountNum($item['uid']);//提现次数 },$where); diff --git a/application/admin/view/agent/agent_manage/index.php b/application/admin/view/agent/agent_manage/index.php index 2cc21454..0d895270 100644 --- a/application/admin/view/agent/agent_manage/index.php +++ b/application/admin/view/agent/agent_manage/index.php @@ -8,6 +8,7 @@ +
@@ -279,7 +282,6 @@ $(function() { function getnotice() { $.getJSON("{:Url('Jnotice')}",function(res){ - console.log(res); var info = eval("("+res+")"); var data = info.data; $('#msgcount').html(data.msgcount); @@ -290,7 +292,7 @@ }); } getnotice(); - setInterval(getnotice, 3000); + setInterval(getnotice, 600000); }); diff --git a/application/admin/view/order/store_order/index.php b/application/admin/view/order/store_order/index.php index 1ef3f776..42c26666 100644 --- a/application/admin/view/order/store_order/index.php +++ b/application/admin/view/order/store_order/index.php @@ -82,29 +82,30 @@
-{/block} +{/block} \ No newline at end of file diff --git a/application/admin/view/public/container.php b/application/admin/view/public/container.php index 9e7748f8..3a61cfc1 100644 --- a/application/admin/view/public/container.php +++ b/application/admin/view/public/container.php @@ -8,8 +8,7 @@ {block name="head"}{/block} - -
+
{block name="content"}{/block} {block name="foot"}{/block} {block name="script"}{/block} diff --git a/application/admin/view/public/form-builder.php b/application/admin/view/public/form-builder.php index cc18660d..4ce59978 100644 --- a/application/admin/view/public/form-builder.php +++ b/application/admin/view/public/form-builder.php @@ -3,12 +3,12 @@ <?=$form->getTitle()?> - - - - - - + + + + + + {/block} {block name="content"} @@ -176,7 +224,7 @@ info:function(){ var that=this; var index=layList.layer.load(2,{shade: [0.3,'#fff']}); - layList.baseGet(layList.Url({c:'auth_api',a:'get_echarts_product',q:{type:this.status,data:this.data}}),function (res){ + layList.baseGet(layList.Url({c:'record.record',a:'get_mark_echarts_product',q:{type:this.status,data:this.data}}),function (res){ layList.layer.close(index); that.badge=res.data.badge; that.count=res.data.count; @@ -191,26 +239,26 @@ }, getSalesList:function(){ var that=this; - layList.baseGet(layList.Url({c:'auth_api',a:'get_echarts_maxlist',q:{data:this.data}}),function (rem) { + layList.baseGet(layList.Url({c:'record.record',a:'get_mark_echarts_maxlist',q:{data:this.data}}),function (rem) { that.SalesList=rem.data; }); }, getProfityList:function(){ var that=this; - layList.baseGet(layList.Url({c:'auth_api',a:'get_echarts_profity',q:{data:this.data}}),function (rem) { + layList.baseGet(layList.Url({c:'record.record',a:'get_mark_echarts_profity',q:{data:this.data}}),function (rem) { that.ProfityList=rem.data; }); }, getTuiPriesList:function(){ var that=this; - layList.baseGet(layList.Url({c:'auth_api',a:'get_bargain_refund_list'}),function (rem) { + layList.baseGet(layList.Url({c:'record.record',a:'get_mark_bargain_refund_list'}),function (rem) { that.TuiPriesList=rem.data; }); },/*待补货*/ getLackList:function(){ var that=layList; var data={ - url:that.U({c:'auth_api',a:'getLackList'}), + url:that.U({c:'record.record',a:'get_mark_lack_list'}), limit:10 }; layList.tables('PhList',data,[ @@ -219,21 +267,6 @@ {field: 'stock', title: '库存',edit:'stock'}, {field: 'right', title: '操作',align:'center',toolbar:'#bar'}, ]); - that.table.on('edit(PhList)',function (obj) { - var value = obj.value //得到修改后的值 - ,data = obj.data //得到所在行所有键值 - ,field = obj.field; //得到字段 - switch (field){ - case 'stock': - that.basePost(that.U({c:'auth_api',a:'editField',p:{id:obj.data.id}}),{stock:obj.value},function (rem) { - that.msg(rem.msg); - }); - break; - default: - console.log('未检测到指定字段'+name); - break; - } - }); that.table.on('tool(PhList)', function (obj) { var data = obj.data, layEvent = obj.event; switch (layEvent) { @@ -248,7 +281,7 @@ },/*获取砍价产品的评论*/ getnegativeList:function(){ var that=this; - layList.baseGet(layList.Url({c:'auth_api',a:'getnegativelist'}),function(rem) { + layList.baseGet(layList.Url({c:'record.record',a:'get_mark_negative_list'}),function(rem) { that.negativeList=rem.data.data; }); }, diff --git a/application/admin/view/record/record/chart_cash.php b/application/admin/view/record/record/chart_cash.php index 9e6ffc1c..f37d1f4a 100644 --- a/application/admin/view/record/record/chart_cash.php +++ b/application/admin/view/record/record/chart_cash.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -160,15 +208,11 @@ this.setChart(this.$refs.echarts_price,'price'); this.getBadgeList(); this.getExtractData(); - var that=this; layList.laydate.render({ elem:this.$refs.date_time, trigger:'click', eventElem:this.$refs.time, range:true, - change:function (value) { - that.data=value; - } }); } }) diff --git a/application/admin/view/record/record/chart_combination.php b/application/admin/view/record/record/chart_combination.php index 3c5e347f..53124cab 100644 --- a/application/admin/view/record/record/chart_combination.php +++ b/application/admin/view/record/record/chart_combination.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/chart_coupon.php b/application/admin/view/record/record/chart_coupon.php index 32499884..20c92322 100644 --- a/application/admin/view/record/record/chart_coupon.php +++ b/application/admin/view/record/record/chart_coupon.php @@ -1,5 +1,19 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/chart_order.php b/application/admin/view/record/record/chart_order.php index 58522870..b7497ce6 100644 --- a/application/admin/view/record/record/chart_order.php +++ b/application/admin/view/record/record/chart_order.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -116,8 +164,6 @@ typeList:[ {name:'全部',value:''}, {name:'普通',value:1}, - {name:'拼团',value:2}, - {name:'砍价',value:3}, {name:'秒杀',value:4}, ], status:'', @@ -162,6 +208,7 @@ setoption:function(seriesdata,xdata,legend,title,type,Zoom){ var _type=type || 'line'; var _title=title || '订单数据统计图'; + switch (_type){ case 'line': this.option={ @@ -204,6 +251,9 @@ }; break; } + this.option.grid = { + x: 50,x2: 40,y: 60,y2: 50 + }; if(Zoom!='' && Zoom!=undefined){ this.option.dataZoom=[{startValue:Zoom},{type:'inside'}]; } diff --git a/application/admin/view/record/record/chart_product.php b/application/admin/view/record/record/chart_product.php index 8ecfdce7..6598f973 100644 --- a/application/admin/view/record/record/chart_product.php +++ b/application/admin/view/record/record/chart_product.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -333,15 +381,11 @@ this.getLackList(); this.getnegativeList(); this.getTuiPriesList(); - var that=this; layList.laydate.render({ elem:this.$refs.date_time, trigger:'click', eventElem:this.$refs.time, range:true, - change:function (value) { - that.data=value; - } }); } }); diff --git a/application/admin/view/record/record/chart_rebate.php b/application/admin/view/record/record/chart_rebate.php index 5073be57..6260e66a 100644 --- a/application/admin/view/record/record/chart_rebate.php +++ b/application/admin/view/record/record/chart_rebate.php @@ -1,5 +1,56 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -236,15 +287,11 @@ this.getEchartsData(); this.getbadge(); this.getFanList(); - var that=this; layList.laydate.render({ elem:this.$refs.date_time, trigger:'click', eventElem:this.$refs.time, range:true, - change:function (value) { - that.data=value; - } }); var that=this; layList.baseGet(layList.U({a:'getFanCount'}),function (rem) { @@ -259,6 +306,7 @@ } }); }); + } }) }) diff --git a/application/admin/view/record/record/chart_recharge.php b/application/admin/view/record/record/chart_recharge.php index 62bb81f1..f55db4ed 100644 --- a/application/admin/view/record/record/chart_recharge.php +++ b/application/admin/view/record/record/chart_recharge.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -149,15 +197,11 @@ this.setChart(this.$refs.echarts_list,'list'); this.setChart(this.$refs.echarts_price,'price'); this.getEchartsRecharge(); - var that=this; layList.laydate.render({ elem:this.$refs.date_time, trigger:'click', eventElem:this.$refs.time, range:true, - change:function (value) { - that.data=value; - } }); } }) diff --git a/application/admin/view/record/record/chart_score.php b/application/admin/view/record/record/chart_score.php index 4c48c10b..920b83c7 100644 --- a/application/admin/view/record/record/chart_score.php +++ b/application/admin/view/record/record/chart_score.php @@ -1,5 +1,19 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/chart_seckill.php b/application/admin/view/record/record/chart_seckill.php index d577232d..18f9382f 100644 --- a/application/admin/view/record/record/chart_seckill.php +++ b/application/admin/view/record/record/chart_seckill.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/product_info.php b/application/admin/view/record/record/product_info.php index ddb8b8ea..d5445e6c 100644 --- a/application/admin/view/record/record/product_info.php +++ b/application/admin/view/record/record/product_info.php @@ -1,5 +1,20 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/user_attr.php b/application/admin/view/record/record/user_attr.php index f48d7b1c..9650d88b 100644 --- a/application/admin/view/record/record/user_attr.php +++ b/application/admin/view/record/record/user_attr.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -142,15 +190,11 @@ this.setChart(this.$refs.echarts_list,'list'); this.setChart(this.$refs.echarts_list_sex,'sex'); this.getEchartsData(); - var that=this; layList.laydate.render({ elem:this.$refs.date_time, trigger:'click', eventElem:this.$refs.time, range:true, - change:function (value) { - that.data=value; - } }); } }) diff --git a/application/admin/view/record/record/user_business_chart.php b/application/admin/view/record/record/user_business_chart.php index ca3ef36d..4392489b 100644 --- a/application/admin/view/record/record/user_business_chart.php +++ b/application/admin/view/record/record/user_business_chart.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/record/record/user_chart.php b/application/admin/view/record/record/user_chart.php index 1ecda07a..7339aac7 100644 --- a/application/admin/view/record/record/user_chart.php +++ b/application/admin/view/record/record/user_chart.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} @@ -71,6 +119,26 @@
+
+
+
分销商数量饼状图
+
+
+
+
+
+
+
+
+
+
多次购物会员数量饼状图
+
+
+
+
+
+
+
@@ -118,6 +186,10 @@ var option=that.setoption(rem.data.seriesdata,rem.data.xdata,rem.data.Zoom); console.log(option); that.myChart.list.setOption(option); + var fenxiao=that.setoption(rem.data.fenbu_data,rem.data.fenbu_xdata,'','分销商分布','pic'); + that.myChart.fenxiao.setOption(fenxiao); + var shop=that.setoption(rem.data.shop_data,rem.data.shop_xdata,'','购物会员分布','pic'); + that.myChart.shop.setOption(shop); }); }, setoption:function(seriesdata,xdata,Zoom,title,type){ @@ -187,6 +259,8 @@ }, mounted:function () { this.setChart(this.$refs.echarts_list,'list'); + this.setChart(this.$refs.echarts_fenxiao,'fenxiao'); + this.setChart(this.$refs.echarts_shop,'shop'); this.getBadgeList(); this.getUserChart(); var that=this; diff --git a/application/admin/view/record/record/user_distribution_chart.php b/application/admin/view/record/record/user_distribution_chart.php index 2af9c32c..2db930ad 100644 --- a/application/admin/view/record/record/user_distribution_chart.php +++ b/application/admin/view/record/record/user_distribution_chart.php @@ -1,5 +1,53 @@ {extend name="public/container"} {block name="head_top"} + {/block} {block name="content"} diff --git a/application/admin/view/setting/system_group/create.php b/application/admin/view/setting/system_group/create.php index 719f7658..b443a030 100644 --- a/application/admin/view/setting/system_group/create.php +++ b/application/admin/view/setting/system_group/create.php @@ -1,4 +1,5 @@ + {include file="public/head"} diff --git a/application/admin/view/setting/system_role/index.php b/application/admin/view/setting/system_role/index.php index 45a18f5b..78853a38 100644 --- a/application/admin/view/setting/system_role/index.php +++ b/application/admin/view/setting/system_role/index.php @@ -12,6 +12,23 @@
+ + + + +
+ + +
+ */ ?>
- - - - - -
- - -
-
-
-
-
- {volist name="list" id="vo"} -
-