handleVipMap($param); $VipModel = new RetailVipModel(); //昨日新增会员 $yesterday_count = $VipModel->getCount($mapResult['yesterdayMap']); //上周新增会员 $last_week_count = $VipModel->getCount($mapResult['lastWeekMap']); $all_integral = $VipModel->getSum($mapResult['map'], 'integral'); $all_balance = $VipModel->getSum($mapResult['map'], 'balance'); return callBack(statusCode()['success'], '获取成功', [ 'all_integral' => $all_integral, 'all_balance' => $all_balance, 'yesterday_count' => $yesterday_count, 'last_week_count' => $last_week_count, ]); } /** * 获取普通会员列表 * @param $param * $param['merchant_id'] 商户id * $param['store_id'] 筛选的门店ID * $param['keyword'] 会员搜索的关键词 * $param['status'] 会员状态 * $param['section'] 高级筛选条件 * $param['need_count'] 是否需要返回总条数 * $param['get_type'] 获取类型 1商户获取 2门店获取(门店获取时返回会员标签) * $param['label_store_id'] 指定标签的门店ID(只有门店获取时生效) * @return mixed */ public function getVipList($param) { $VipModel = new RetailVipModel(); //处理查询条件 $param['plus_type'] = 3; $mapResult = $this->handleVipMap($param); if (!$param['is_export']) { $list = $VipModel->getSelect($mapResult['map'], '*', 'id desc', $param['page'] . ',' . $param['limit']); } else { $list = $VipModel->getSelect($mapResult['map'], '*', 'id desc'); } $count = 0; if ($list) { $count = $param['need_count'] !== false ? $VipModel->getCount($mapResult['map']) : 0; $store_list = []; $guide_list = []; $Store = new Store(); $Guide = new Guide(); $VipInfo = new VipInfo(); $VipWithLabelModel = new RetailVipWithLabelModel(); foreach ($list as $key => &$val) { if ($param['need_index']) $val['index'] = $key + 1; $val['add_time'] = date('Y-m-d H:i:s', $val['addtime']); unset($val['addtime']); $val['store_name'] = $Store->getStoreName($val['storeid'], $store_list); if (empty($val['birthday'])) { $val['birthday'] = ''; } if (!empty($val['guideid'])) { $val['guide_name'] = $Guide->getGuideName($val['guideid'], $guide_list, 1); } $grade = $VipInfo->singleVipGrade([ 'merchant_id' => $param['merchant_id'], 'grade_integral' => $val['grade_integral'], 'get_default' => true, ]); $val['grade_id'] = $grade['id']; $val['grade_name'] = $grade['grade_name']; $val['discount'] = $grade['id'] ? ($grade['discount'] * 10 . '折') : '-'; $val['balance'] = $val['balance'] ? $val['balance'] : "0.00"; $val['nickname'] = $val['nickname'] ? $val['nickname'] : ''; $val['name'] = $val['name'] ? $val['name'] : ''; switch ($val['status']) { case 1: $val['status_name'] = "正常"; break; case 3: $val['status_name'] = "冻结"; break; case 4: $val['status_name'] = "挂失"; break; } if (empty($val['card_key'])) { $val['card_key'] = ''; } // 获取会员标签 if ($param['get_type'] == 2 && $param['label_store_id']) { $val['user_label'] = $VipWithLabelModel->getVipLabelName($val['id'], $param['label_store_id']); } } } return callBack(statusCode()['success'], empty($list) ? '暂无数据' : '获取成功', ['list' => $list, 'count' => $count]); } /** * 处理普通会员查询条件 * @param $param * $param['merchant_id'] 商户id * $param['store_id'] 筛选的门店ID * $param['keyword'] 会员搜索的关键词 * $param['status'] 会员状态 * $param['section'] 高级筛选条件 * $param['plus_type'] 类型 1普通vip 2Plus * @return array */ public function handleVipMap($param) { $store_id = $param['store_id']; $keyword = $param['keyword']; $status = $param['status']; $section = $param['section']; try { $section = json_decode($section, true); } catch (Exception $e) { } $add_time = $section['time']; $where = [ 'merchantid' => $param['merchant_id'], 'plus_type' => $param['plus_type'], 'status' => ['neq', 2], ]; if (!empty($store_id) && $store_id != 0) { $where['storeid'] = $store_id; } $result = []; //如果是统计 则返回统计的条件 if ($param['sum']) { // 昨天的数据 $start_time = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); $end_time = mktime(23, 59, 59, date('m'), date('d') - 1, date('Y')); $where['addtime'] = ['between', [$start_time, $end_time]]; $result['yesterdayMap'] = $where; // 上周的数据 $start_time = mktime(0, 0, 0, date('m'), date('d') - date("w") - 6, date('Y')); $end_time = mktime(23, 59, 59, date('m'), date('d') - date("w"), date('Y')); $where['addtime'] = array('between', array($start_time, $end_time)); $result['lastWeekMap'] = $where; unset($where['addtime']); } //查询条件 if (!empty($keyword)) { $where['name|nickname|mobile_phone|card_key'] = array('like', "%" . $keyword . "%"); } //会员状态 switch ($status) { case 1: $where['status'] = 1; break; case 3: $where['status'] = 3; break; case 4: $where['status'] = 4; break; default: $where['status'] = ['neq', 2]; } //积分区间 if (!empty($section['integral'])) { $str = strpos($section['integral'], "-"); if ($str) { $integral = explode('-', $section['integral']); $where['integral'] = ['between', [$integral[0], $integral[1]]]; } else { $where['integral'] = ['egt', $section['integral']]; } } //余额区间 if (!empty($section['balance'])) { $str = strpos($section['balance'], '-'); if ($str) { $balance = explode('-', $section['balance']); $where['balance'] = ['between', [$balance[0], $balance[1]]]; } else { $where['balance'] = ['egt', $section['balance']]; } } $BillModel = new RetailBillOrderModel(); if (!empty($section['time'])) { switch ($section['type']) { case 1: //激活时间 $start_time = strtotime($add_time[0]); $end_time = strtotime($add_time[1]); $where['addtime'] = ['between', [$start_time, $end_time]]; break; case 2: //生日时间 $where['birthday'] = ['between', [$add_time[0], $add_time[1]]]; break; case 3: //沉睡时间 $start_time = strtotime($add_time[0]); $end_time = strtotime($add_time[1]); $map = array( 'merchant_id' => $param['merchant_id'], 'vid' => ['gt', 0], 'add_time' => ['between', [$start_time, $end_time]] ); if (!empty($store_id)) { $map['store_id'] = $store_id; } $vidArr = $BillModel->getGroupFindField($map, 'vid', 'vid', true); if (!empty($vidArr)) { $where['id'] = ['not in', $vidArr]; } break; } } if ($section['type'] == 4 && !empty($section['purchase'])) { //复购次数 $map = array( 'merchant_id' => $param['merchant_id'], 'vid' => array('gt', 0) ); if (!empty($section['time'])) { $start_time = strtotime($add_time[0]); $end_time = strtotime($add_time[1]); $map['add_time'] = array('between', array($start_time, $end_time)); } if (!empty($store_id)) { $map['store_id'] = $store_id; } $vidArr = $BillModel->getGroupHavingFindField($map, 'vid', $section['purchase'], 'vid', true); if (!empty($vidArr)) { $where['id'] = array('in', $vidArr); } else { $where['id'] = 0; } } $result['map'] = $where; return $result; } /** * 充值记录-列表 * @param req_data 搜索条件 [ * keyword 搜索关键词 * mode 充值类型 * scene_type 场景 * store_id 搜索门店 * time 时间搜索 * search_type 搜索类型 1本店充值 2本店会员 * ] * @param page 页码 * @param limit 页长 * @param merchant_id 商户id */ public function getRechargeList($param) { // 条件处理 $where = $this->handleRechargeMap($param); $RechargeOrderModel = new RetailRechargeOrderModel(); $fields = [ 'r.*', 'v.name', 'v.nickname', 'v.mobile_phone', 'v.card_key', ]; $recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, $param['page'], $param['limit']); if (!$recharge_order) { return callBack(statusCode()['success'], '暂无数据', ['list' => [], 'count' => 0]); } $count = $RechargeOrderModel->getVipRechargeCount($where); $StoreModel = new RetailStoreModel(); $storeIdArr = []; $storeInfoArr = []; foreach ($recharge_order as $key => &$val) { $val['index'] = $key + 1; $val['add_time'] = $val['add_time'] ? date('Y-m-d H:i:s', $val['add_time']) : ''; $val['name'] = $val['name'] ? $val['name'] : '未设置'; $val['nickname'] = $val['nickname'] ? $val['nickname'] : '未设置'; $val['mobile_phone'] = $val['mobile_phone'] ? $val['mobile_phone'] : '未设置'; $val['card_key'] = $val['card_key'] && ($val['card_key'] != 0 || $val['card_key'] != '0') ? $val['card_key'] : '未设置'; $val['all_money'] = floatval($val['all_money']); $val['money'] = floatval($val['money']); if ($val['store_id'] == 0) { $val['store_name'] = '商户'; } else { if (in_array($val['store_id'], $storeIdArr)) { $val['store_name'] = $storeInfoArr[$val['store_id']]['name']; } else { $store_name = $StoreModel->getFindField(['id' => $val['store_id']], 'storetag'); $val['store_name'] = $store_name ? $store_name : '未知门店'; $storeIdArr[] = $val['store_id']; $storeInfoArr[$val['store_id']]['name'] = $val['store_name']; } } switch ($val['scene_type']) { case 1: $val['scene_name'] = '收银机'; break; case 2: $val['scene_name'] = '商户后台'; break; case 3: $val['scene_name'] = '门店后台'; break; case 4: $val['scene_name'] = '小程序'; break; case 5: $val['scene_name'] = '公众号'; break; case 6: $val['scene_name'] = '小助手'; break; default: $val['scene_name'] = '未知场景'; } switch ($val['pay_type']) { case 0: $val['recharge_mode'] = '编辑增加'; break; case 1: $val['recharge_mode'] = '现金'; break; case 2: $val['recharge_mode'] = '微信'; break; case 3: $val['recharge_mode'] = '支付宝'; break; default: $val['recharge_mode'] = '未知类型'; } switch ($val['repay_name']) { case 0: $val['aging_repay_name'] = '直接到账'; break; case 1: $val['aging_repay_name'] = '分期到账'; break; default: $val['aging_repay_name'] = '未知类型'; } $val['give_money'] = floatval($val['give_money']); $val['pay_coupon_fee'] = floatval($val['pay_coupon_fee']); } return callBack(statusCode()['success'], '获取成功', ['list' => $recharge_order, 'count' => (int)$count]); } /** * 充值记录-统计 * @param req_data 搜索条件 [ * keyword 搜索关键词 * mode 充值类型 * scene_type 场景 * store_id 搜索门店 * time 时间搜索 * search_type 搜索类型 1本店充值 2本店会员 * ] */ public function getRechargeTotal($param) { $where = $this->handleRechargeMap($param); $RechargeOrderModel = new RetailRechargeOrderModel(); $money = $RechargeOrderModel->getLinkVipSum($where, 'money'); $all_money = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); $pay_coupon_money = $RechargeOrderModel->getLinkVipSum($where, 'pay_coupon_fee'); return callBack(statusCode()['success'], '获取成功', [ 'money' => $money, 'all_money' => $all_money, 'give_money' => bcsub($all_money, $money), 'pay_coupon_money' => floatval($pay_coupon_money), ]); } /** * 充值记录条件处理 */ public function handleRechargeMap($param) { $req_data = $param['req_data']; try { $req_data = json_decode($req_data, true); } catch (Exception $e) { } $where = [ 'r.state' => 1, 'r.status' => 1, 'r.type' => ['in', '1,3'], 'r.merchant_id' => $param['merchant_id'], ]; // 昵称、姓名、手机号、实体卡 if (trim($req_data['keyword'])) { $where['v.nickname|v.name|v.mobile_phone|v.card_key'] = ['like', ['%' . $req_data['keyword'] . '%']]; } // 充值类型 if (!empty($req_data['mode']) && in_array($req_data['mode'], ['1', '2', '3', '4'])) { $where['r.pay_type'] = $req_data['mode'] == 4 ? 0 : $req_data['mode']; } // 场景 if (!empty($req_data['scene_type']) && in_array($req_data['scene_type'], ['1', '2', '3', '4', '5', '6'])) { $where['r.scene_type'] = $req_data['scene_type']; } // 时间搜索 if (!empty($req_data['time'])) { $where['r.add_time'] = ['between', [strtotime($req_data['time'][0]), strtotime($req_data['time'][1])]]; } else if ($param['is_export']) { //默认导出当日记录 $where['r.add_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), time()]]; } // 门店 if ($req_data['search_type'] && $param['store_id']) { switch ($req_data['search_type']) { case 1: $where['r.store_id'] = $param['store_id']; break; case 2: $where['v.storeid'] = $param['store_id']; break; default: $where[] = [ 'v.storeid' => $param['store_id'], 'r.store_id' => $param['store_id'], '_logic' => 'OR', ]; break; } } else if ($param['store_id']) { $where[] = [ 'v.storeid' => $param['store_id'], 'r.store_id' => $param['store_id'], '_logic' => 'OR', ]; } else if ($req_data['store_id']) { $where['r.store_id'] = $req_data['store_id']; } return $where; } /** * 余额记录-列表 * @param seek_data [ * keyword * type * scene_type * ] * @param merchant_id 商户id * @param page 页码 * @param limit 页长 */ public function getBalanceList($param) { $where = $this->handleBalanceMap($param); $fields = [ 'r.*', 'v.name', 'v.nickname', 'v.mobile_phone', 'v.card_key', ]; $RechargeOrderModel = new RetailRechargeOrderModel(); if ($param['page'] && $param['limit']) { $recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, $param['page'], $param['limit']); } else { $recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, '', ''); } if (!$recharge_order) { return callBack(statusCode()['success'], '暂无数据', [ 'list' => [], 'count' => 0, ]); } $count = $RechargeOrderModel->getVipRechargeCount($where); $StoreModel = new RetailStoreModel(); $storeIdArr = []; $storeInfoArr = []; foreach ($recharge_order as $key => &$val) { $val['add_time'] = $val['add_time'] ? date('Y-m-d H:i:s', $val['add_time']) : ''; $val['name'] = $val['name'] ? $val['name'] : '未设置'; $val['nickname'] = $val['nickname'] ? $val['nickname'] : '未设置'; $val['mobile_phone'] = $val['mobile_phone'] ? $val['mobile_phone'] : '未设置'; $val['card_key'] = $val['card_key'] && ($val['card_key'] != 0 || $val['card_key'] != '0') ? $val['card_key'] : '未设置'; $val['all_money'] = floatval($val['all_money']); $val['money'] = floatval($val['money']); if ($val['store_id'] == 0) { $val['store_name'] = '商户'; } else { if (in_array($val['store_id'], $storeIdArr)) { $val['store_name'] = $storeInfoArr[$val['store_id']]['name']; } else { $store_name = $StoreModel->getFindField(['id' => $val['store_id']], 'storetag'); $val['store_name'] = $store_name ? $store_name : '未知门店'; $storeIdArr[] = $val['store_id']; $storeInfoArr[$val['store_id']]['name'] = $val['store_name']; } } switch ($val['scene_type']) { case 1: $val['scene_name'] = '收银机'; break; case 2: $val['scene_name'] = '商户后台'; break; case 3: $val['scene_name'] = '门店后台'; break; case 4: $val['scene_name'] = '小程序'; break; case 5: $val['scene_name'] = '公众号'; break; case 6: $val['scene_name'] = '小助手'; break; default: $val['scene_name'] = '未知场景'; } switch ($val['type']) { case 1: $val['type_name'] = '充值'; break; case 2: $val['type_name'] = '消费'; break; case 3: $val['type_name'] = '编辑增加'; break; case 4: $val['type_name'] = '编辑减少'; break; case 5: $val['type_name'] = '退款增加'; break; case 6: $val['type_name'] = '红包充值'; break; case 7: $val['type_name'] = '大转盘充值'; break; case 8: $val['type_name'] = '礼品卡充值'; break; case 9: $val['type_name'] = '充值退款'; break; default: $val['type_name'] = '未知类型'; } switch ($val['pay_type']) { case '1': $val['recharge_mode'] = '现金'; break; case '2': $val['recharge_mode'] = '微信'; break; case '3': $val['recharge_mode'] = '支付宝'; break; default: $val['recharge_mode'] = '余额'; break; } $val['index'] = intval($key + 1); $val['give_money'] = round($val['all_money'] - $val['money'], 2); } return callBack(statusCode()['success'], '获取成功', [ 'list' => $recharge_order, 'count' => (int)$count, ]); } /** * 余额记录-统计 * [ * merchant_id 商户id * store_id 门店id * ] * @param $param * @return mixed */ public function getBalanceTotal($param) { //处理查询条件 $where = $this->handleBalanceMap($param); $RechargeOrderModel = new RetailRechargeOrderModel(); //总消费金额 $where['type'] = 2; $result['consumption'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); //总扣除金额 $where['type'] = 4; $result['deduct'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); //消费退款总金额 $where['type'] = 5; $result['refund'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); //充值退款总金额 $where['type'] = 9; $result['recharge_refund'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); //总充值获得金额 $where['type'] = 1; $result['recharge'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); //总活动增加金额 $where['type'] = ['in', '6,7']; $result['activity'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money'); return callBack(statusCode()['success'], '获取成功', $result); } /** * 余额记录条件处理 * @param $param * @return array */ public function handleBalanceMap($param) { $where = [ 'r.state' => 1, 'r.status' => 1, 'r.merchant_id' => $param['merchant_id'], ]; try { $req_data = json_decode($param['req_data'], true); } catch (Exception $e) { $req_data = []; } // 类型查询 if (trim($req_data['keyword'])) { $where['v.nickname|v.name|v.mobile_phone|v.card_key'] = ['like', ['%' . $req_data['keyword'] . '%']]; } // 类型 if (!empty($req_data['type'])) { $where['r.type'] = $req_data['type']; } // 场景 if (!empty($req_data['scene_type'])) { $where['r.scene_type'] = $req_data['scene_type']; } // 处理门店 if ($req_data['store_id'] != '') { $where['r.store_id'] = $req_data['store_id']; } else if ($param['store_id']) { $where[] = [ 'v.storeid' => $param['store_id'], 'r.store_id' => $param['store_id'], '_logic' => 'OR', ]; } // 时间搜索 if (!empty($req_data['time'])) { $where['r.add_time'] = ['between', [strtotime($req_data['time'][0]), strtotime($req_data['time'][1])]]; } else if ($param['is_export']) { //默认导出当日记录 $where['r.add_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), time()]]; } return $where; } }