|
|
@@ -0,0 +1,384 @@
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * 门店邀请分佣流水 xhMainInviteCommission:列表、汇总、格式化
|
|
|
+ */
|
|
|
+namespace bizHd\shop\classes;
|
|
|
+
|
|
|
+use biz\shop\classes\ShopClass;
|
|
|
+use bizHd\base\classes\BaseClass;
|
|
|
+use common\components\dateUtil;
|
|
|
+use Yii;
|
|
|
+
|
|
|
+class MainInviteCommissionClass extends BaseClass
|
|
|
+{
|
|
|
+
|
|
|
+ public static $baseFile = '\bizHd\shop\models\MainInviteCommission';
|
|
|
+
|
|
|
+ /** payTime 无效视为待缴费 */
|
|
|
+ public static function isPendingPay($payTime)
|
|
|
+ {
|
|
|
+ if ($payTime === null || $payTime === '') {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ $str = (string) $payTime;
|
|
|
+ if (strpos($str, '0000-00-00') === 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 最近分佣记录
|
|
|
+ */
|
|
|
+ public static function getRecentList($inviterMainId, $limit = 5)
|
|
|
+ {
|
|
|
+ if (empty($inviterMainId)) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ return self::getLimitList('*', [
|
|
|
+ 'inviterMainId' => (int) $inviterMainId,
|
|
|
+ ], (int) $limit, 'addTime DESC,id DESC');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分佣明细分页(默认近30天,按 addTime 筛选)
|
|
|
+ */
|
|
|
+ public static function getCommissionList($inviterMainId, $settleStatus = null)
|
|
|
+ {
|
|
|
+ $where = self::buildCommissionListWhere($inviterMainId, $settleStatus);
|
|
|
+ return self::getList('*', $where, 'addTime DESC,id DESC');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 佣金明细列表查询条件:inviterMainId + 可选结算状态 + 时间
|
|
|
+ */
|
|
|
+ protected static function buildCommissionListWhere($inviterMainId, $settleStatus = null)
|
|
|
+ {
|
|
|
+ $where = ['inviterMainId' => (int) $inviterMainId];
|
|
|
+ if ($settleStatus !== null && $settleStatus !== '') {
|
|
|
+ $where['settleStatus'] = (int) $settleStatus;
|
|
|
+ }
|
|
|
+ $get = Yii::$app->request->get();
|
|
|
+ $searchTime = isset($get['searchTime']) ? trim((string) $get['searchTime']) : 'last30Days';
|
|
|
+ $startTime = isset($get['startTime']) ? trim((string) $get['startTime']) : '';
|
|
|
+ $endTime = isset($get['endTime']) ? trim((string) $get['endTime']) : '';
|
|
|
+ if ($searchTime !== '' && $searchTime !== 'all') {
|
|
|
+ $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
|
|
|
+ if (!empty($period['startTime']) && !empty($period['endTime'])) {
|
|
|
+ $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $where;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 邀约花店列表:按 inviterMainId 分页查 xhMainInviteCommission
|
|
|
+ */
|
|
|
+ public static function getInviteShopList($inviterMainId, $keyword = '')
|
|
|
+ {
|
|
|
+ $mainId = (int) $inviterMainId;
|
|
|
+ if ($mainId <= 0) {
|
|
|
+ return [
|
|
|
+ 'list' => [],
|
|
|
+ 'totalNum' => 0,
|
|
|
+ 'totalPage' => 0,
|
|
|
+ 'moreData' => 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ $keyword = trim((string) $keyword);
|
|
|
+ if ($keyword === '') {
|
|
|
+ $result = self::getList('*', ['inviterMainId' => $mainId], 'addTime DESC,id DESC');
|
|
|
+ } else {
|
|
|
+ // 店名 / 冗余字段 inviteeMobile 模糊匹配
|
|
|
+ $result = self::getInviteShopListByKeyword($mainId, $keyword);
|
|
|
+ }
|
|
|
+ $rows = $result['list'] ?? [];
|
|
|
+ $list = [];
|
|
|
+ foreach ($rows as $row) {
|
|
|
+ $list[] = self::formatInviteShopListItem($row);
|
|
|
+ }
|
|
|
+ $result['list'] = $list;
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关键词搜索邀约列表(店名 OR 零售店手机号),分页与 getList 一致
|
|
|
+ */
|
|
|
+ protected static function getInviteShopListByKeyword($inviterMainId, $keyword)
|
|
|
+ {
|
|
|
+ $get = Yii::$app->request->get();
|
|
|
+ $page = isset($get['page']) ? max(1, (int) $get['page']) : 1;
|
|
|
+ $pageSize = !empty($get['pageSize'])
|
|
|
+ ? (int) $get['pageSize']
|
|
|
+ : (int) (Yii::$app->params['pageSize'] ?? 20);
|
|
|
+
|
|
|
+ $model = self::getModel();
|
|
|
+ $query = $model->conditionQuery(['inviterMainId' => (int) $inviterMainId]);
|
|
|
+ $query->andWhere([
|
|
|
+ 'or',
|
|
|
+ ['like', 'inviteeShopName', $keyword],
|
|
|
+ ['like', 'inviteeMobile', $keyword],
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $clone = clone $query;
|
|
|
+ $count = (int) $clone->count();
|
|
|
+ $totalPage = $pageSize > 0 ? (int) ceil($count / $pageSize) : 0;
|
|
|
+ $offset = ($page - 1) * $pageSize;
|
|
|
+ $rows = $query
|
|
|
+ ->select('*')
|
|
|
+ ->orderBy('addTime DESC,id DESC')
|
|
|
+ ->offset($offset)
|
|
|
+ ->limit($pageSize)
|
|
|
+ ->asArray()
|
|
|
+ ->all();
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'list' => $rows,
|
|
|
+ 'totalNum' => $count,
|
|
|
+ 'totalPage' => $totalPage,
|
|
|
+ 'moreData' => $page < $totalPage ? 1 : 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 受邀人手机号:优先读表冗余 inviteeMobile,空则回退 xhShop.mobile
|
|
|
+ */
|
|
|
+ protected static function resolveInviteeMobile($row)
|
|
|
+ {
|
|
|
+ $mobile = trim((string) ($row['inviteeMobile'] ?? ''));
|
|
|
+ if ($mobile !== '') {
|
|
|
+ return $mobile;
|
|
|
+ }
|
|
|
+ $lsShopId = (int) ($row['lsShopId'] ?? 0);
|
|
|
+ if ($lsShopId <= 0) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ $shop = ShopClass::getById($lsShopId, false);
|
|
|
+ return is_array($shop) ? trim((string) ($shop['mobile'] ?? '')) : '';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 邀约花店列表单行(与 hdApp 卡片字段一致)
|
|
|
+ */
|
|
|
+ public static function formatInviteShopListItem($row)
|
|
|
+ {
|
|
|
+ $lsShopId = (int) ($row['lsShopId'] ?? 0);
|
|
|
+ $shop = [];
|
|
|
+ if ($lsShopId > 0) {
|
|
|
+ $shop = ShopClass::getById($lsShopId, false) ?: [];
|
|
|
+ }
|
|
|
+ $shopName = trim((string) ($row['inviteeShopName'] ?? ''));
|
|
|
+ if ($shopName === '') {
|
|
|
+ $shopName = trim((string) ($row['lsShopName'] ?? ''));
|
|
|
+ }
|
|
|
+ $mobile = self::resolveInviteeMobile($row);
|
|
|
+
|
|
|
+ $pendingPay = self::isPendingPay($row['payTime'] ?? '');
|
|
|
+ $memberStatus = $pendingPay ? 'pending' : 'opened';
|
|
|
+ if ((int) ($row['settleStatus'] ?? 0) === 2) {
|
|
|
+ $memberStatus = 'refund';
|
|
|
+ }
|
|
|
+
|
|
|
+ $openTime = $row['payTime'] ?? '';
|
|
|
+ if (self::isPendingPay($openTime)) {
|
|
|
+ $openTime = $row['addTime'] ?? '';
|
|
|
+ }
|
|
|
+
|
|
|
+ $fee = (float) ($row['memberPayAmount'] ?? 0);
|
|
|
+ if ($fee <= 0) {
|
|
|
+ $fee = (float) ($row['amount'] ?? 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'id' => $row['id'] ?? 0,
|
|
|
+ 'lsShopId' => $lsShopId,
|
|
|
+ 'shopName' => $shopName,
|
|
|
+ 'shopImg' => self::resolveShopImg($shop),
|
|
|
+ 'mobile' => $mobile !== '' ? $mobile : '-',
|
|
|
+ 'openTime' => $openTime,
|
|
|
+ 'inviteTime' => $row['addTime'] ?? '',
|
|
|
+ 'memberFee' => round($fee, 2),
|
|
|
+ 'earnedCommission' => round((float) ($row['commissionAmount'] ?? 0), 2),
|
|
|
+ 'memberStatus' => $memberStatus,
|
|
|
+ 'memberStatusText' => self::memberStatusText($memberStatus),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function memberStatusText($status)
|
|
|
+ {
|
|
|
+ if ($status === 'pending') {
|
|
|
+ return '待缴费';
|
|
|
+ }
|
|
|
+ if ($status === 'refund') {
|
|
|
+ return '已退款';
|
|
|
+ }
|
|
|
+ return '已开通';
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function maskMobile($mobile)
|
|
|
+ {
|
|
|
+ $mobile = trim((string) $mobile);
|
|
|
+ if (strlen($mobile) < 7) {
|
|
|
+ return $mobile ?: '-';
|
|
|
+ }
|
|
|
+ return substr($mobile, 0, 3) . '****' . substr($mobile, -4);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function maskInviteCode($code)
|
|
|
+ {
|
|
|
+ $code = trim((string) $code);
|
|
|
+ if (strlen($code) === 11 && ctype_digit($code)) {
|
|
|
+ return self::maskMobile($code);
|
|
|
+ }
|
|
|
+ if (strlen($code) > 7) {
|
|
|
+ return substr($code, 0, 3) . '****' . substr($code, -4);
|
|
|
+ }
|
|
|
+ return $code;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function resolveShopImg($shop)
|
|
|
+ {
|
|
|
+ $avatar = is_array($shop) ? ($shop['avatar'] ?? '') : '';
|
|
|
+ if (empty($avatar)) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ if (strpos($avatar, 'http') === 0) {
|
|
|
+ return $avatar;
|
|
|
+ }
|
|
|
+ $host = Yii::$app->params['hdImgHost'] ?? '';
|
|
|
+ return $host . $avatar;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 佣金变动明细单行(hdApp shopInviteCommissionList 设计稿)
|
|
|
+ */
|
|
|
+ public static function formatCommissionListItem($row)
|
|
|
+ {
|
|
|
+ $lsShopId = (int) ($row['lsShopId'] ?? 0);
|
|
|
+ $shop = [];
|
|
|
+ if ($lsShopId > 0) {
|
|
|
+ $shop = ShopClass::getById($lsShopId, false) ?: [];
|
|
|
+ }
|
|
|
+ $shopName = trim((string) ($row['inviteeShopName'] ?? ''));
|
|
|
+ if ($shopName === '') {
|
|
|
+ $shopName = trim((string) ($row['lsShopName'] ?? ''));
|
|
|
+ }
|
|
|
+ $mobile = self::resolveInviteeMobile($row);
|
|
|
+ $mobileMask = $mobile !== '' ? self::maskMobile($mobile) : '-';
|
|
|
+
|
|
|
+ $recordType = self::resolveCommissionRecordType($row);
|
|
|
+ if ($recordType === 'deposit') {
|
|
|
+ $orderSnLabel = '存入编号';
|
|
|
+ $baseAmountLabel = '存余额金额';
|
|
|
+ } else {
|
|
|
+ $orderSnLabel = '会员订单号';
|
|
|
+ $baseAmountLabel = '会员实付金额';
|
|
|
+ }
|
|
|
+
|
|
|
+ $orderSn = trim((string) ($row['commissionSn'] ?? ''));
|
|
|
+ if ($orderSn === '' && !empty($row['relateOrderId'])) {
|
|
|
+ $orderSn = (string) $row['relateOrderId'];
|
|
|
+ }
|
|
|
+
|
|
|
+ $baseAmount = (float) ($row['memberPayAmount'] ?? 0);
|
|
|
+ if ($baseAmount <= 0) {
|
|
|
+ $baseAmount = (float) ($row['amount'] ?? 0);
|
|
|
+ }
|
|
|
+ if ($recordType === 'deposit' && $baseAmount <= 0) {
|
|
|
+ $baseAmount = (float) ($row['commissionAmount'] ?? 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ $settleStatus = (int) ($row['settleStatus'] ?? 0);
|
|
|
+ $commissionAmount = round(abs((float) ($row['commissionAmount'] ?? 0)), 2);
|
|
|
+ // 失效/扣回展示负号
|
|
|
+ $commissionSign = ($settleStatus === 2) ? -1 : 1;
|
|
|
+ if ((float) ($row['commissionAmount'] ?? 0) < 0) {
|
|
|
+ $commissionSign = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ $createTime = trim((string) ($row['addTime'] ?? ''));
|
|
|
+ if ($createTime !== '' && strlen($createTime) === 10) {
|
|
|
+ $createTime .= ' 00:00:00';
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'id' => $row['id'] ?? 0,
|
|
|
+ 'shopName' => $shopName !== '' ? $shopName : '-',
|
|
|
+ 'shopImg' => self::resolveShopImg($shop),
|
|
|
+ 'mobile' => $mobile !== '' ? $mobile : '-',
|
|
|
+ 'mobileMask' => $mobileMask,
|
|
|
+ 'orderSnLabel' => $orderSnLabel,
|
|
|
+ 'orderSn' => $orderSn !== '' ? $orderSn : '-',
|
|
|
+ 'baseAmountLabel' => $baseAmountLabel,
|
|
|
+ 'baseAmount' => round($baseAmount, 2),
|
|
|
+ 'createTime' => $createTime !== '' ? $createTime : '-',
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ 'commissionSign' => $commissionSign,
|
|
|
+ 'recordType' => $recordType,
|
|
|
+ 'settleStatus' => $settleStatus,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 明细类型:会员开通分佣 vs 佣金存入余额(按快照字段推断)
|
|
|
+ */
|
|
|
+ protected static function resolveCommissionRecordType($row)
|
|
|
+ {
|
|
|
+ $typeName = trim((string) ($row['memberTypeName'] ?? ''));
|
|
|
+ if ($typeName !== '' && mb_strpos($typeName, '存入') !== false) {
|
|
|
+ return 'deposit';
|
|
|
+ }
|
|
|
+ $sn = trim((string) ($row['commissionSn'] ?? ''));
|
|
|
+ if ($sn !== '' && (strpos($sn, 'D') === 0 || strpos($sn, 'CR') === 0)) {
|
|
|
+ return 'deposit';
|
|
|
+ }
|
|
|
+ return 'member';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化最近佣金行(供 hub 最近邀请)
|
|
|
+ */
|
|
|
+ public static function formatRecentRow($row)
|
|
|
+ {
|
|
|
+ $settleStatus = (int) ($row['settleStatus'] ?? 0);
|
|
|
+ $statusText = '待结算';
|
|
|
+ if ($settleStatus === 1) {
|
|
|
+ $statusText = '已结算';
|
|
|
+ } elseif ($settleStatus === 2) {
|
|
|
+ $statusText = '已失效';
|
|
|
+ }
|
|
|
+ $shopName = trim((string) ($row['inviteeShopName'] ?? ''));
|
|
|
+ if ($shopName === '') {
|
|
|
+ $shopName = trim((string) ($row['lsShopName'] ?? ''));
|
|
|
+ }
|
|
|
+ $mobile = self::resolveInviteeMobile($row);
|
|
|
+ $payTime = $row['payTime'] ?? '';
|
|
|
+ $openTime = $payTime;
|
|
|
+ if (self::isPendingPay($payTime)) {
|
|
|
+ $openTime = $row['addTime'] ?? '';
|
|
|
+ }
|
|
|
+ if (!empty($openTime) && strlen($openTime) >= 10) {
|
|
|
+ $openTime = substr($openTime, 0, 10);
|
|
|
+ }
|
|
|
+ $time = $row['settleTime'] ?? ($row['addTime'] ?? '');
|
|
|
+ if (!empty($time) && strlen($time) >= 10) {
|
|
|
+ $time = substr($time, 0, 10);
|
|
|
+ }
|
|
|
+ $mobileDisplay = $mobile !== '' ? $mobile : '-';
|
|
|
+ return [
|
|
|
+ 'id' => $row['id'] ?? 0,
|
|
|
+ 'shopName' => $shopName,
|
|
|
+ 'commissionSn' => $row['commissionSn'] ?? '',
|
|
|
+ 'orderSnLabel' => $row['commissionSn'] ?? '',
|
|
|
+ 'commissionAmount' => round((float) ($row['commissionAmount'] ?? 0), 2),
|
|
|
+ 'settleStatus' => $settleStatus,
|
|
|
+ 'statusText' => $statusText,
|
|
|
+ 'settleTime' => $time,
|
|
|
+ 'mobile' => $mobileDisplay,
|
|
|
+ 'mobileMask' => $mobileDisplay,
|
|
|
+ 'openTime' => $openTime ?: '-',
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+}
|