$site_id, 'year' => $carbon->year, 'month' => $carbon->month, 'day' => $carbon->day ]; $info = model('stat_shop')->getInfo($condition, 'id'); //在这里会整体处理总支出 总收入 总预计收入 $stat_data = $this->getStatData($data); if (empty($info)) { $insert_data = [ 'site_id' => $site_id, 'year' => $carbon->year, 'month' => $carbon->month, 'day' => $carbon->day, 'day_time' => time(), 'create_time' => time() ]; $insert_data = array_merge($insert_data, $stat_data); $res = model('stat_shop')->add( $insert_data ); } else { $update_data = array (); if (!empty($stat_data)) { foreach ($stat_data as $k => $v) { if ($v > 0) { $update_data[ $k ] = Db::raw($k . '+' . $v); } else if ($v < 0) { $update_data[ $k ] = Db::raw($k . '-' . abs($v)); } } } if (!empty($update_data)) { $res = Db::name('stat_shop')->where($condition) ->update($update_data); Log::write('addShopStat' . Db::name('stat_shop')->getLastSql()); Cache::tag("cache_table" . "stat_shop")->clear(); } } //增加当天时统计 $this->addShopHourStat($data, $carbon); return $this->success($res ?? 0); } /** * 增加当日的时统计记录 * @param $data */ public function addShopHourStat($data, $carbon) { $site_id = $data[ 'site_id' ]; // $carbon = Carbon::now(); $condition = [ 'site_id' => $site_id, 'year' => $carbon->year, 'month' => $carbon->month, 'day' => $carbon->day, 'hour' => $carbon->hour ]; $info = model('stat_shop_hour')->getInfo($condition, 'id'); //在这里会整体处理总支出 总收入 总预计收入 $stat_data = $this->getStatData($data); if (empty($info)) { $insert_data = [ 'site_id' => $site_id, 'year' => $carbon->year, 'month' => $carbon->month, 'day' => $carbon->day, 'day_time' => time(), 'create_time' => time(), 'hour' => $carbon->hour ]; $insert_data = array_merge($insert_data, $stat_data); $res = model('stat_shop_hour')->add( $insert_data ); } else { $update_data = array (); if (!empty($stat_data)) { foreach ($stat_data as $k => $v) { if ($v > 0) { $update_data[ $k ] = Db::raw($k . '+' . $v); } else if ($v < 0) { $update_data[ $k ] = Db::raw($k . '-' . abs($v)); } } } if (!empty($update_data)) { $res = Db::name('stat_shop_hour')->where($condition) ->update($update_data); Cache::tag("cache_table" . "stat_shop_hour")->clear(); } } return $this->success($res ?? 0); } /** * 整理数据 * @param $data * @return mixed */ public function getStatData($data) { unset($data[ 'site_id' ]); $order_pay_money = $data[ 'order_pay_money' ] ?? 0;//订单总额 $member_recharge_total_money = $data[ 'member_recharge_total_money' ] ?? 0;//会员充值总额 $member_level_total_money = $data[ 'member_level_total_money' ] ?? 0;//超级会员卡销售额 $member_giftcard_total_money = $data[ 'member_giftcard_total_money' ] ?? 0;//礼品卡订单总额 $earnings_total_money = $order_pay_money + $member_recharge_total_money + $member_level_total_money + $member_giftcard_total_money;//预计总收入 $order_refund_total_money = $data[ 'refund_total' ] ?? 0;//订单退款总额 $member_withdraw_total_money = $data[ 'member_withdraw_total_money' ] ?? 0;//会员提现总额 $expenditure_total_money = $order_refund_total_money + $member_withdraw_total_money;//总支出 $expected_earnings_total_money = $earnings_total_money - $expenditure_total_money; Log::write('getStatData' . json_encode([ $earnings_total_money, $expenditure_total_money, $expected_earnings_total_money ])); $data[ 'earnings_total_money' ] = $earnings_total_money; $data[ 'expenditure_total_money' ] = $expenditure_total_money; $data[ 'expected_earnings_total_money' ] = $expected_earnings_total_money; $data = array_filter($data); return $data; } /** * 获取店铺统计(按照天查询) * @param unknown $site_id 0表示平台 * @param unknown $year * @param unknown $month * @param unknown $day */ public function getStatShop($site_id, $year, $month, $day) { $condition = [ 'site_id' => $site_id, 'year' => $year, 'month' => $month, 'day' => $day ]; $info = model('stat_shop')->setIsCache(0)->getInfo($condition, '*'); if (empty($info)) { $condition[ 'day_time' ] = strtotime(date("{$year}-{$month}-{$day}")); model('stat_shop')->add($condition); $info = model('stat_shop')->getInfo($condition, '*'); } $info[ 'goods_order_count' ] = numberFormat($info[ 'goods_order_count' ]); return $this->success($info); } /** * 获取店铺统计信息 * @param unknown $site_id * @param unknown $start_time */ public function getShopStatSum($site_id, $start_time = 0, $end_time = 0) { $condition = [ [ 'site_id', '=', $site_id ] ]; if (!empty($start_time)) { $condition[] = [ 'day_time', '>=', $start_time ]; } if (!empty($end_time)) { $condition[] = [ 'day_time', '<=', $end_time ]; } $field = array_map(function($field) { switch ( $field ) { case 'earnings_total_money': return "sum(earnings_total_money) + sum(cashier_billing_money) + sum(cashier_buycard_money) as earnings_total_money"; break; case 'expenditure_total_money': // return "sum(expenditure_total_money) + sum(cashier_refund_money) as expenditure_total_money"; return "sum(expenditure_total_money) as expenditure_total_money"; break; case 'cashier_billing_money': return "sum(cashier_billing_money) + sum(cashier_buycard_money) as cashier_order_pay_money"; break; case 'refund_total': return "sum(refund_total) + sum(cashier_refund_money) as refund_total"; break; case 'expected_earnings_total_money': // return "sum(expected_earnings_total_money) + sum(cashier_billing_money) + sum(cashier_buycard_money) - sum(cashier_refund_money) as expected_earnings_total_money"; return "sum(earnings_total_money) + sum(cashier_billing_money) + sum(cashier_buycard_money) - sum(expenditure_total_money) as expected_earnings_total_money"; break; case 'order_pay_count': return "sum(order_pay_count) + sum(cashier_billing_count) + sum(cashier_buycard_count) as order_pay_count"; break; default: return "sum($field) as $field"; } }, $this->getStatField()); // outFileLog($condition,'stat','$condition'); // outFileLog($field,'stat','$field'); $info = model('stat_shop')->getInfo($condition, $field); if (isset($info[ 'goods_order_count' ])) { $info[ 'goods_order_count' ] = numberFormat($info[ 'goods_order_count' ]); } return $this->success($info); } /** * 获取店铺统计列表 * @param unknown $site_id * @param unknown $start_time */ public function getShopStatList($site_id, $start_time, $end_time) { $condition = [ [ 'site_id', '=', $site_id ], [ 'day_time', '>=', $start_time ], [ 'day_time', '<=', $end_time ], ]; $list = model('stat_shop')->getList($condition, $this->handleStatField()); foreach ($list as $k => $v) { $list[ $k ][ 'goods_order_count' ] = numberFormat($list[ $k ][ 'goods_order_count' ]); } return $this->success($list); } /** * 处理查询字段 */ private function handleStatField() { $fields = Db::name('stat_shop')->getTableFields(''); foreach ($fields as $k => $field) { switch ( $field ) { case 'earnings_total_money': $fields[ $k ] = "earnings_total_money + cashier_billing_money + cashier_buycard_money as earnings_total_money"; break; case 'expenditure_total_money': $fields[ $k ] = "expenditure_total_money + cashier_refund_money as expenditure_total_money"; break; case 'cashier_billing_money': $fields[ $k ] = "cashier_billing_money + cashier_buycard_money as cashier_order_pay_money"; break; case 'refund_total': $fields[ $k ] = "refund_total + cashier_refund_money as refund_total"; break; case 'expected_earnings_total_money': $fields[ $k ] = "expected_earnings_total_money + cashier_billing_money + cashier_buycard_money - cashier_refund_money as expected_earnings_total_money"; break; case 'order_pay_count': $fields[ $k ] = "order_pay_count + cashier_billing_count + cashier_buycard_count as order_pay_count"; break; } } return implode(',', $fields); } /** * 获取小时统计数据 * @param $site_id * @param $year * @param $month * @param $day * @return array */ public function getShopStatHourList($site_id, $year, $month, $day) { $condition = [ [ 'site_id', '=', $site_id ], [ 'year', '=', $year ], [ 'month', '=', $month ], [ 'day', '=', $day ], ]; $list = model('stat_shop_hour')->getList($condition, $this->handleStatHourField(), 'id desc'); foreach ($list as $k => $v) { $list[ $k ][ 'goods_order_count' ] = numberFormat($list[ $k ][ 'goods_order_count' ]); } return $this->success($list); } /** * 处理查询字段 */ private function handleStatHourField() { $fields = Db::name('stat_shop_hour')->getTableFields(''); foreach ($fields as $k => $field) { switch ( $field ) { case 'earnings_total_money': $fields[ $k ] = "earnings_total_money + cashier_billing_money + cashier_buycard_money as earnings_total_money"; break; case 'expenditure_total_money': $fields[ $k ] = "expenditure_total_money + cashier_refund_money as expenditure_total_money"; break; case 'refund_total': $fields[ $k ] = "refund_total + cashier_refund_money as refund_total"; break; case 'expected_earnings_total_money': $fields[ $k ] = "expected_earnings_total_money + cashier_billing_money + cashier_buycard_money - cashier_refund_money as expected_earnings_total_money"; break; case 'order_pay_count': $fields[ $k ] = "order_pay_count + cashier_billing_count + cashier_buycard_count as order_pay_count"; break; } } $fields[] = 'cashier_billing_money + cashier_buycard_money as cashier_order_pay_money'; return implode(',', $fields); } /** * 获取天统计表统计字段 * @return array */ public function getStatField() { $fields = Db::name('stat_shop')->getTableFields(''); $fields = array_values(array_diff($fields, [ 'id', 'site_id', 'year', 'month', 'day', 'day_time' ])); return $fields; } /** * 获取时统计表统计字段 * @return array */ public function getStatHourField() { $fields = Db::name('stat_shop_hour')->getTableFields(''); $fields = array_values(array_diff($fields, [ 'id', 'site_id', 'year', 'month', 'day', 'hour', 'day_time' ])); return $fields; } /** * 获取商品销量排行榜 * @param $site_id * @param string $start_time * @param string $end_time */ public function getGoodsSaleNumRankingList($site_id, $start_time, $end_time, $page_index, $page_size) { $condition = [ [ 'o.site_id', '=', $site_id ], [ 'o.pay_status', '=', 1 ], [ 'g.is_delete', '=', 0 ], [ 'o.order_status', '<>', OrderCommon::ORDER_CLOSE ], [ 'og.refund_status', '<>', OrderRefund::REFUND_COMPLETE ] ]; if (!empty($start_time) && empty($end_time)) { // $condition[] = [ 'o.create_time', '>=', date_to_time($start_time) ]; $condition[] = [ 'o.create_time', '>=', $start_time ]; } elseif (empty($start_time) && !empty($end_time)) { $condition[] = [ 'o.create_time', '<=', $end_time ]; } elseif (!empty($start_time) && !empty($end_time)) { $condition[] = [ 'o.create_time', 'between', [ $start_time, $end_time ] ]; } $join = [ [ 'order o', 'og.order_id = o.order_id', 'left' ], [ 'goods g', 'og.goods_id = g.goods_id', 'right' ] ]; $list = model('order_goods')->pageList($condition, 'og.goods_id,g.goods_name,g.goods_state,SUM(FLOOR(og.num)) AS sale_num', 'sale_num desc', $page_index, $page_size, 'og', $join, 'og.goods_id'); // foreach($list as &$v){ // $v['sale_num'] = round($v['sale_num'],0); // } return $this->success($list); } /** * 获取商品销量排行榜 * @param $site_id * @param string $start_time * @param string $end_time * @param $page_index * @param $page_size * @return array */ public function getGoodsSaleMoneyRankingList($site_id, $start_time, $end_time, $page_index, $page_size) { $condition = [ [ 'o.site_id', '=', $site_id ], [ 'o.pay_status', '=', 1 ], [ 'g.is_delete', '=', 0 ], [ 'o.order_status', '<>', OrderCommon::ORDER_CLOSE ], [ 'og.refund_status', '<>', OrderRefund::REFUND_COMPLETE ] ]; if (!empty($start_time) && empty($end_time)) { $condition[] = [ 'o.create_time', '>=', $start_time ]; } elseif (empty($start_time) && !empty($end_time)) { $condition[] = [ 'o.create_time', '<=', $end_time ]; } elseif (!empty($start_time) && !empty($end_time)) { $condition[] = [ 'o.create_time', 'between', [ $start_time, $end_time ] ]; } $join = [ [ 'order o', 'og.order_id = o.order_id', 'left' ], [ 'goods g', 'og.goods_id = g.goods_id', 'right' ] ]; $list = model('order_goods')->pageList($condition, 'og.goods_id,g.goods_name,g.goods_state,SUM(o.order_money) AS order_money', 'order_money desc', $page_index, $page_size, 'og', $join, 'og.goods_id'); return $this->success($list); } public function switchStat($params) { $type = $params[ 'type' ]; $temp_params = $params[ 'data' ]; $result = event('AddStat', $params, true); if (empty($result)) { switch ( $type ) { case 'order_create'://订单支付 $order_stat_model = new OrderStat(); $result = $order_stat_model->addOrderCreateStat($temp_params); break; case 'order_pay'://订单支付 $order_stat_model = new OrderStat(); $result = $order_stat_model->addOrderPayStat($temp_params); break; case 'order_refund'://退款 $order_stat_model = new OrderStat(); $result = $order_stat_model->addOrderRefundStat($temp_params); break; case 'add_goods'://添加商品 $goods_stat_model = new GoodsStat(); $result = $goods_stat_model->addGoodsStat($temp_params); break; case 'collect_goods': $goods_stat_model = new GoodsStat(); $result = $goods_stat_model->addGoodsCollectStat($temp_params); break; case 'recharge': $recharge_model = new RechargeStat(); $result = $recharge_model->addRechargeStat($temp_params); break; case 'visit': $visit_model = new VisitStat(); $result = $visit_model->addVisitStat($temp_params); break; case 'member_withdraw': $withdraw_model = new MemberWithdrawStat(); $result = $withdraw_model->addMemberWithdrawStat($temp_params); break; case 'add_member': $member_model = new MemberStat(); $result = $member_model->addMemberStat($temp_params); break; case 'goods_cart'://购物车加购 $goods_cart_stat_model = new GoodsCartStat(); $result = $goods_cart_stat_model->addGoodsCartStat($temp_params); break; case 'goods_visit': $goods_stat_model = new GoodsStat(); $result = $goods_stat_model->addGoodsVisit($temp_params); break; case 'goods_on'://上下架 $goods_stat_model = new GoodsStat(); $result = $goods_stat_model->addGoodsOnStat($temp_params); break; } } return $result; } }