|
|
@@ -0,0 +1,564 @@
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * 门店邀请分佣 — 管理后台业务
|
|
|
+ * 用途:ghs Web 分成比例管理、佣金分成明细;全局配置只读 dict,批发商独立比例写 xhMainInvite
|
|
|
+ */
|
|
|
+
|
|
|
+namespace bizHd\shop\classes;
|
|
|
+
|
|
|
+use biz\shop\classes\ShopClass;
|
|
|
+use bizHd\base\classes\BaseClass;
|
|
|
+use biz\renew\classes\RenewClass;
|
|
|
+use common\components\dateUtil;
|
|
|
+use common\components\dict;
|
|
|
+use common\components\util;
|
|
|
+use Yii;
|
|
|
+
|
|
|
+class MainInviteAdminClass extends BaseClass
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 管理端只读:hdRegisterConfig + 等效比例
|
|
|
+ */
|
|
|
+ public static function getRegisterConfigForAdmin()
|
|
|
+ {
|
|
|
+ $config = dict::getDict('hdRegisterConfig');
|
|
|
+ $price = round((float) ($config['price'] ?? 0), 2);
|
|
|
+ $commissionAmount = round((float) ($config['commissionAmount'] ?? 0), 2);
|
|
|
+ $hdDiscountAmount = round((float) ($config['hdDiscountAmount'] ?? 0), 2);
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'price' => $price,
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ 'hdDiscountAmount' => $hdDiscountAmount,
|
|
|
+ 'commissionRatio' => self::calcRatio($commissionAmount, $price),
|
|
|
+ 'discountRatio' => self::calcRatio($hdDiscountAmount, $price),
|
|
|
+ 'enabled' => $commissionAmount > 0 ? 1 : 0,
|
|
|
+ 'commissionBaseLabel' => '会员实际支付金额',
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 金额反算等效分成比例(%)
|
|
|
+ */
|
|
|
+ public static function calcRatio($amount, $price)
|
|
|
+ {
|
|
|
+ $price = round((float) $price, 2);
|
|
|
+ $amount = round((float) $amount, 2);
|
|
|
+ if ($price <= 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return round($amount / $price * 100, 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比例换算为固定分佣金额
|
|
|
+ */
|
|
|
+ public static function ratioToAmount($ratio, $price)
|
|
|
+ {
|
|
|
+ $price = round((float) $price, 2);
|
|
|
+ $ratio = round((float) $ratio, 2);
|
|
|
+ if ($price <= 0 || $ratio < 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return round($price * $ratio / 100, 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批发商独立比例分页:xhMainInvite 全表数据(仅支持关键词筛选)
|
|
|
+ */
|
|
|
+ public static function getWholesalerRatioList($keyword = '')
|
|
|
+ {
|
|
|
+ $config = self::getRegisterConfigForAdmin();
|
|
|
+
|
|
|
+ $keyword = trim((string) $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 = MainInviteClass::getModel();
|
|
|
+ $query = $model->find()->orderBy('id DESC');
|
|
|
+
|
|
|
+ if ($keyword !== '') {
|
|
|
+ $mainIds = self::searchWholesalerMainIds($keyword);
|
|
|
+ if (empty($mainIds)) {
|
|
|
+ return self::emptyPage($page, $pageSize);
|
|
|
+ }
|
|
|
+ $query->andWhere(['mainId' => $mainIds]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $count = (int) (clone $query)->count();
|
|
|
+ $rows = $query->offset(($page - 1) * $pageSize)->limit($pageSize)->asArray()->all();
|
|
|
+ $list = [];
|
|
|
+ foreach ($rows as $row) {
|
|
|
+ $list[] = self::formatWholesalerRatioRow($row, $config['price']);
|
|
|
+ }
|
|
|
+
|
|
|
+ $totalPage = $pageSize > 0 ? (int) ceil($count / $pageSize) : 0;
|
|
|
+ return [
|
|
|
+ 'list' => $list,
|
|
|
+ 'totalNum' => $count,
|
|
|
+ 'totalPage' => $totalPage,
|
|
|
+ 'moreData' => $page < $totalPage ? 1 : 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function emptyPage($page, $pageSize)
|
|
|
+ {
|
|
|
+ return [
|
|
|
+ 'list' => [],
|
|
|
+ 'totalNum' => 0,
|
|
|
+ 'totalPage' => 0,
|
|
|
+ 'moreData' => 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关键词查批发商 mainId 列表(xhShop ptStyle=2)
|
|
|
+ */
|
|
|
+ protected static function searchWholesalerMainIds($keyword)
|
|
|
+ {
|
|
|
+ $keyword = trim((string) $keyword);
|
|
|
+ $shopModel = ShopClass::getModel();
|
|
|
+ $query = $shopModel->find()
|
|
|
+ ->select(['mainId'])
|
|
|
+ ->where([
|
|
|
+ 'delStatus' => 0,
|
|
|
+ 'ptStyle' => 2,
|
|
|
+ ])
|
|
|
+ ->andWhere(['>', 'mainId', 0]);
|
|
|
+
|
|
|
+ if ($keyword !== '') {
|
|
|
+ $query->andWhere([
|
|
|
+ 'or',
|
|
|
+ ['like', 'shopName', $keyword],
|
|
|
+ ['like', 'merchantName', $keyword],
|
|
|
+ ['like', 'mobile', $keyword],
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $shopRows = $query->limit(200)->asArray()->all();
|
|
|
+ $mainIds = [];
|
|
|
+ foreach ($shopRows as $shop) {
|
|
|
+ $mid = (int) ($shop['mainId'] ?? 0);
|
|
|
+ if ($mid > 0) {
|
|
|
+ $mainIds[] = $mid;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return array_values(array_unique($mainIds));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批发商下拉搜索:xhShop 表 ptStyle=2(供货商)
|
|
|
+ */
|
|
|
+ public static function searchWholesaler($keyword = '', $limit = 20)
|
|
|
+ {
|
|
|
+ $keyword = trim((string) $keyword);
|
|
|
+ $shopModel = ShopClass::getModel();
|
|
|
+ $query = $shopModel->find()
|
|
|
+ ->select(['mainId', 'shopName', 'merchantName', 'mobile'])
|
|
|
+ ->where([
|
|
|
+ 'delStatus' => 0,
|
|
|
+ 'ptStyle' => 2,
|
|
|
+ ])
|
|
|
+ ->andWhere(['>', 'mainId', 0])
|
|
|
+ ->orderBy('id DESC')
|
|
|
+ ->limit((int) $limit);
|
|
|
+
|
|
|
+ if ($keyword !== '') {
|
|
|
+ $query->andWhere([
|
|
|
+ 'or',
|
|
|
+ ['like', 'shopName', $keyword],
|
|
|
+ ['like', 'merchantName', $keyword],
|
|
|
+ ['like', 'mobile', $keyword],
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $shopRows = $query->asArray()->all();
|
|
|
+ $list = [];
|
|
|
+ $seenMainIds = [];
|
|
|
+ foreach ($shopRows as $shop) {
|
|
|
+ $mainId = (int) ($shop['mainId'] ?? 0);
|
|
|
+ if ($mainId <= 0 || isset($seenMainIds[$mainId])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $seenMainIds[$mainId] = true;
|
|
|
+ $list[] = [
|
|
|
+ 'mainId' => $mainId,
|
|
|
+ 'shopName' => ShopClass::formatDisplayShopName($shop),
|
|
|
+ 'mobile' => trim((string) ($shop['mobile'] ?? '')),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ return $list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * sjId 取首店 mainId
|
|
|
+ */
|
|
|
+ public static function resolveMainIdBySjId($sjId)
|
|
|
+ {
|
|
|
+ $sjId = (int) $sjId;
|
|
|
+ if ($sjId <= 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ $shop = ShopClass::getByCondition(['sjId' => $sjId, 'delStatus' => 0], false, 'id ASC');
|
|
|
+ return (int) ($shop['mainId'] ?? 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function resolveShopByMainId($mainId)
|
|
|
+ {
|
|
|
+ $mainId = (int) $mainId;
|
|
|
+ if ($mainId <= 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ $shop = ShopClass::getByCondition(['mainId' => $mainId, 'delStatus' => 0], false, 'id ASC');
|
|
|
+ return is_array($shop) ? $shop : [];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按 mainId + ptStyle 取 xhShop 首店
|
|
|
+ */
|
|
|
+ protected static function resolveShopByMainIdPtStyle($mainId, $ptStyle)
|
|
|
+ {
|
|
|
+ $mainId = (int) $mainId;
|
|
|
+ $ptStyle = (int) $ptStyle;
|
|
|
+ if ($mainId <= 0 || $ptStyle <= 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ $shop = ShopClass::getByCondition([
|
|
|
+ 'mainId' => $mainId,
|
|
|
+ 'ptStyle' => $ptStyle,
|
|
|
+ 'delStatus' => 0,
|
|
|
+ ], false, 'id ASC');
|
|
|
+ return is_array($shop) ? $shop : [];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function formatWholesalerRatioRow($row, $price)
|
|
|
+ {
|
|
|
+ $mainId = (int) ($row['mainId'] ?? 0);
|
|
|
+ $shop = self::resolveShopByMainId($mainId);
|
|
|
+ $mobile = trim((string) ($shop['mobile'] ?? ''));
|
|
|
+ $commissionAmount = round((float) ($row['commissionAmount'] ?? 0), 2);
|
|
|
+ $hdDiscountAmount = round((float) ($row['hdDiscountAmount'] ?? 0), 2);
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'id' => (int) ($row['id'] ?? 0),
|
|
|
+ 'mainId' => $mainId,
|
|
|
+ 'shopName' => ShopClass::formatDisplayShopName($shop),
|
|
|
+ // 管理端列表展示完整手机号,不做脱敏
|
|
|
+ 'mobile' => $mobile !== '' ? $mobile : '-',
|
|
|
+ 'inviteCode' => trim((string) ($row['inviteCode'] ?? '')),
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ 'hdDiscountAmount' => $hdDiscountAmount,
|
|
|
+ 'commissionRatio' => self::calcRatio($commissionAmount, $price),
|
|
|
+ 'discountRatio' => self::calcRatio($hdDiscountAmount, $price),
|
|
|
+ 'effectiveTime' => $row['addTime'] ?? '',
|
|
|
+ 'updateTime' => $row['updateTime'] ?? '',
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存批发商独立比例
|
|
|
+ */
|
|
|
+ public static function saveWholesalerRatio($mainId, $commissionAmount, $hdDiscountAmount)
|
|
|
+ {
|
|
|
+ $mainId = (int) $mainId;
|
|
|
+ if ($mainId <= 0) {
|
|
|
+ throw new \Exception('请选择批发商');
|
|
|
+ }
|
|
|
+ $commissionAmount = round((float) $commissionAmount, 2);
|
|
|
+ $hdDiscountAmount = round((float) $hdDiscountAmount, 2);
|
|
|
+ if ($commissionAmount <= 0 || $hdDiscountAmount <= 0) {
|
|
|
+ throw new \Exception('分佣金额与优惠金额须大于 0');
|
|
|
+ }
|
|
|
+ MainInviteClass::ensureByMainId($mainId);
|
|
|
+ MainInviteClass::updateByCondition(['mainId' => $mainId], [
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ 'hdDiscountAmount' => $hdDiscountAmount,
|
|
|
+ ]);
|
|
|
+ $row = MainInviteClass::getByMainId($mainId);
|
|
|
+ $config = self::getRegisterConfigForAdmin();
|
|
|
+ return self::formatWholesalerRatioRow($row, $config['price']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 佣金汇总卡片
|
|
|
+ */
|
|
|
+ public static function getCommissionSummary($where = [])
|
|
|
+ {
|
|
|
+ $baseWhere = self::buildCommissionAdminWhere($where);
|
|
|
+
|
|
|
+ $model = MainInviteCommissionClass::getModel();
|
|
|
+ $query = $model->conditionQuery($baseWhere);
|
|
|
+ $totalGenerated = (float) $query->sum('commissionAmount');
|
|
|
+
|
|
|
+ $settledQuery = $model->conditionQuery($baseWhere);
|
|
|
+ $settledAmount = (float) $settledQuery->andWhere(['settleStatus' => 1])->sum('commissionAmount');
|
|
|
+
|
|
|
+ $countQuery = $model->conditionQuery($baseWhere);
|
|
|
+ $inviterCount = (int) $countQuery->select('inviterMainId')->distinct()->count();
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'totalGenerated' => round($totalGenerated, 2),
|
|
|
+ 'settledAmount' => round($settledAmount, 2),
|
|
|
+ 'inviterCount' => $inviterCount,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 管理端佣金明细分页
|
|
|
+ */
|
|
|
+ public static function getCommissionAdminList($filters = [])
|
|
|
+ {
|
|
|
+ $where = self::buildCommissionAdminWhere($filters);
|
|
|
+ $result = MainInviteCommissionClass::getList('*', $where, 'addTime DESC,id DESC');
|
|
|
+ $rows = $result['list'] ?? [];
|
|
|
+ $list = [];
|
|
|
+ $pageTotal = 0;
|
|
|
+ foreach ($rows as $row) {
|
|
|
+ $item = self::formatCommissionAdminRow($row);
|
|
|
+ $list[] = $item;
|
|
|
+ $pageTotal += (float) ($item['commissionAmount'] ?? 0);
|
|
|
+ }
|
|
|
+ $result['list'] = $list;
|
|
|
+ $result['pageCommissionTotal'] = round($pageTotal, 2);
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function buildCommissionAdminWhere($filters)
|
|
|
+ {
|
|
|
+ // 管理端明细分页:仅展示已关联批发门店(pfShopId>0)的获佣记录
|
|
|
+ $where = [
|
|
|
+ 'inviterMainId>' => 0,
|
|
|
+ 'inviteeMainId>' => 0,
|
|
|
+ 'pfShopId>' => 0,
|
|
|
+ ];
|
|
|
+
|
|
|
+ $inviterKeyword = trim((string) ($filters['inviterKeyword'] ?? ''));
|
|
|
+ $inviteeKeyword = trim((string) ($filters['inviteeKeyword'] ?? ''));
|
|
|
+ $inviteCode = trim((string) ($filters['inviteCode'] ?? ''));
|
|
|
+
|
|
|
+ if ($inviteCode !== '') {
|
|
|
+ $where['inviteCode'] = ['like', $inviteCode];
|
|
|
+ }
|
|
|
+ if ($inviterKeyword !== '') {
|
|
|
+ $where['pfShopName'] = ['like', $inviterKeyword];
|
|
|
+ }
|
|
|
+ if ($inviteeKeyword !== '') {
|
|
|
+ $where['inviteeShopName'] = ['like', $inviteeKeyword];
|
|
|
+ }
|
|
|
+
|
|
|
+ $searchTime = trim((string) ($filters['searchTime'] ?? ''));
|
|
|
+ $startTime = trim((string) ($filters['startTime'] ?? ''));
|
|
|
+ $endTime = trim((string) ($filters['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;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function formatCommissionAdminRow($row)
|
|
|
+ {
|
|
|
+ $memberPay = round((float) ($row['memberPayAmount'] ?? 0), 2);
|
|
|
+ if ($memberPay <= 0) {
|
|
|
+ $memberPay = round((float) ($row['amount'] ?? 0), 2);
|
|
|
+ }
|
|
|
+ $commissionAmount = round((float) ($row['commissionAmount'] ?? 0), 2);
|
|
|
+ $inviterMainId = (int) ($row['inviterMainId'] ?? 0);
|
|
|
+ // 列表获佣人展示批发门店快照名 pfShopName
|
|
|
+ $inviterName = trim((string) ($row['pfShopName'] ?? ''));
|
|
|
+ if ($inviterName === '' || $inviterName === '0') {
|
|
|
+ $inviterName = trim((string) ($row['inviterShopName'] ?? ''));
|
|
|
+ }
|
|
|
+
|
|
|
+ $settleStatus = (int) ($row['settleStatus'] ?? 0);
|
|
|
+ return [
|
|
|
+ 'id' => (int) ($row['id'] ?? 0),
|
|
|
+ 'commissionSn' => $row['commissionSn'] ?? '',
|
|
|
+ 'inviterMainId' => $inviterMainId,
|
|
|
+ 'inviterShopName' => $inviterName !== '' ? $inviterName : '-',
|
|
|
+ 'inviteeShopName' => trim((string) ($row['inviteeShopName'] ?? '')) ?: '-',
|
|
|
+ 'inviteCode' => MainInviteCommissionClass::maskInviteCode($row['inviteCode'] ?? ''),
|
|
|
+ 'memberTypeName' => trim((string) ($row['memberTypeName'] ?? '')) ?: '年度会员',
|
|
|
+ 'memberPayAmount' => $memberPay,
|
|
|
+ 'commissionRatio' => self::calcRatio($commissionAmount, $memberPay),
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ 'hdDiscountAmount' => round((float) ($row['hdDiscountAmount'] ?? 0), 2),
|
|
|
+ 'settleStatus' => $settleStatus,
|
|
|
+ 'settleStatusText' => self::settleStatusText($settleStatus),
|
|
|
+ 'addTime' => $row['addTime'] ?? '',
|
|
|
+ 'settleTime' => $row['settleTime'] ?? '',
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function settleStatusText($status)
|
|
|
+ {
|
|
|
+ if ((int) $status === 1) {
|
|
|
+ return '已结算';
|
|
|
+ }
|
|
|
+ if ((int) $status === 2) {
|
|
|
+ return '已失效';
|
|
|
+ }
|
|
|
+ return '待结算';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 佣金分成详情(管理端)
|
|
|
+ */
|
|
|
+ public static function getCommissionDetail($id)
|
|
|
+ {
|
|
|
+ $id = (int) $id;
|
|
|
+ if ($id <= 0) {
|
|
|
+ throw new \Exception('参数无效');
|
|
|
+ }
|
|
|
+ $row = MainInviteCommissionClass::getById($id);
|
|
|
+ if (empty($row)) {
|
|
|
+ throw new \Exception('记录不存在');
|
|
|
+ }
|
|
|
+
|
|
|
+ $memberPay = round((float) ($row['memberPayAmount'] ?? 0), 2);
|
|
|
+ if ($memberPay <= 0) {
|
|
|
+ $memberPay = round((float) ($row['amount'] ?? 0), 2);
|
|
|
+ }
|
|
|
+ $prePrice = round((float) ($row['amount'] ?? 0), 2);
|
|
|
+ $commissionAmount = round((float) ($row['commissionAmount'] ?? 0), 2);
|
|
|
+ $settleStatus = (int) ($row['settleStatus'] ?? 0);
|
|
|
+
|
|
|
+ $inviterMainId = (int) ($row['inviterMainId'] ?? 0);
|
|
|
+ $inviteeMainId = (int) ($row['inviteeMainId'] ?? 0);
|
|
|
+ $pfShopId = (int) ($row['pfShopId'] ?? 0);
|
|
|
+ $lsShopId = (int) ($row['lsShopId'] ?? 0);
|
|
|
+ $inviterShop = $pfShopId > 0
|
|
|
+ ? (ShopClass::getById($pfShopId, false) ?: [])
|
|
|
+ : self::resolveShopByMainIdPtStyle($inviterMainId, 2);
|
|
|
+ $inviteeShop = $lsShopId > 0
|
|
|
+ ? (ShopClass::getById($lsShopId, false) ?: [])
|
|
|
+ : self::resolveShopByMainIdPtStyle($inviteeMainId, 1);
|
|
|
+ $inviterInvite = MainInviteClass::getByMainId($inviterMainId);
|
|
|
+
|
|
|
+ $inviterDisplayName = trim((string) ($row['inviterShopName'] ?? ''));
|
|
|
+ if ($inviterDisplayName === '' && !empty($inviterShop)) {
|
|
|
+ $inviterDisplayName = ShopClass::formatDisplayShopName($inviterShop);
|
|
|
+ }
|
|
|
+ $inviteeDisplayName = trim((string) ($row['inviteeShopName'] ?? ''));
|
|
|
+ if ($inviteeDisplayName === '' && !empty($inviteeShop)) {
|
|
|
+ $inviteeDisplayName = ShopClass::formatDisplayShopName($inviteeShop);
|
|
|
+ }
|
|
|
+
|
|
|
+ $renew = self::resolveMemberRenew($inviteeMainId, $row['payTime'] ?? '');
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'commission' => [
|
|
|
+ 'commissionSn' => $row['commissionSn'] ?? '',
|
|
|
+ 'addTime' => $row['addTime'] ?? '',
|
|
|
+ 'settleStatus' => $settleStatus,
|
|
|
+ 'settleStatusText' => self::settleStatusText($settleStatus),
|
|
|
+ 'settleTime' => $row['settleTime'] ?? '',
|
|
|
+ 'commissionAmount' => $commissionAmount,
|
|
|
+ ],
|
|
|
+ 'inviter' => [
|
|
|
+ 'shopName' => $inviterDisplayName !== '' ? $inviterDisplayName : '-',
|
|
|
+ 'inviteCode' => trim((string) ($inviterInvite['inviteCode'] ?? ($row['inviteCode'] ?? ''))) ?: '-',
|
|
|
+ 'contactName' => trim((string) ($inviterShop['contact'] ?? '')) ?: '-',
|
|
|
+ 'mobile' => trim((string) ($inviterShop['mobile'] ?? '')) ?: '-',
|
|
|
+ 'creditedAmount' => $commissionAmount,
|
|
|
+ ],
|
|
|
+ 'invitee' => [
|
|
|
+ 'shopName' => $inviteeDisplayName !== '' ? $inviteeDisplayName : '-',
|
|
|
+ 'contactName' => trim((string) ($inviteeShop['contact'] ?? '')) ?: '-',
|
|
|
+ 'registerTime' => $inviteeShop['addTime'] ?? ($inviteeShop['createTime'] ?? ($row['addTime'] ?? '')),
|
|
|
+ 'mobile' => trim((string) ($row['inviteeMobile'] ?? ($inviteeShop['mobile'] ?? ''))) ?: '-',
|
|
|
+ 'inviteRelation' => $inviterDisplayName !== '' ? ($inviterDisplayName . '邀请') : '-',
|
|
|
+ ],
|
|
|
+ 'memberOrder' => [
|
|
|
+ 'orderSn' => $renew['orderSn'] ?? ('HY' . ($renew['id'] ?? '')),
|
|
|
+ 'actPrice' => $memberPay,
|
|
|
+ 'memberTypeName' => trim((string) ($row['memberTypeName'] ?? '')) ?: '年度会员',
|
|
|
+ 'payTime' => $row['payTime'] ?? ($renew['payTime'] ?? ''),
|
|
|
+ 'prePrice' => $prePrice > 0 ? $prePrice : round((float) ($renew['prePrice'] ?? 0), 2),
|
|
|
+ 'payWayText' => self::payWayText((int) ($row['payWay'] ?? ($renew['payWay'] ?? 0))),
|
|
|
+ 'hdDiscountAmount' => round((float) ($row['hdDiscountAmount'] ?? 0), 2),
|
|
|
+ 'orderStatus' => 1,
|
|
|
+ 'orderStatusText' => '已完成',
|
|
|
+ ],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function resolveMemberRenew($inviteeMainId, $payTime)
|
|
|
+ {
|
|
|
+ $inviteeMainId = (int) $inviteeMainId;
|
|
|
+ if ($inviteeMainId <= 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ $where = ['mainId' => $inviteeMainId, 'status' => 1];
|
|
|
+ $list = RenewClass::getLimitList('*', $where, 1, 'payTime DESC,id DESC');
|
|
|
+ return !empty($list[0]) ? $list[0] : [];
|
|
|
+ }
|
|
|
+
|
|
|
+ protected static function payWayText($payWay)
|
|
|
+ {
|
|
|
+ if ((int) $payWay === 1) {
|
|
|
+ return '支付宝';
|
|
|
+ }
|
|
|
+ if ((int) $payWay === 2) {
|
|
|
+ return '余额';
|
|
|
+ }
|
|
|
+ return '微信支付';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导出佣金明细 CSV
|
|
|
+ */
|
|
|
+ public static function exportCommissionList($filters = [])
|
|
|
+ {
|
|
|
+ $savedGet = Yii::$app->request->get();
|
|
|
+ $exportGet = array_merge($savedGet, ['page' => 1, 'pageSize' => 5000, 'export' => 0]);
|
|
|
+ Yii::$app->request->setQueryParams($exportGet);
|
|
|
+
|
|
|
+ $result = self::getCommissionAdminList($filters);
|
|
|
+ $list = $result['list'] ?? [];
|
|
|
+ if (empty($list)) {
|
|
|
+ util::fail('没有数据需要导出');
|
|
|
+ }
|
|
|
+
|
|
|
+ $filename = 'invite_commission_' . date('YmdHis') . '.csv';
|
|
|
+ $dir = './priceTable/invite_admin';
|
|
|
+ if (!is_dir($dir)) {
|
|
|
+ mkdir($dir, 0777, true);
|
|
|
+ }
|
|
|
+ $path = $dir . '/' . $filename;
|
|
|
+ $fp = fopen($path, 'w');
|
|
|
+ fprintf($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
|
|
|
+ fputcsv($fp, ['分佣单号', '批发商', '受邀花店', '邀请码', '会员类型', '会员实付', '分成比例%', '产生佣金', '结算状态', '产生时间', '结算时间']);
|
|
|
+ foreach ($list as $row) {
|
|
|
+ fputcsv($fp, [
|
|
|
+ $row['commissionSn'] ?? '',
|
|
|
+ $row['inviterShopName'] ?? '',
|
|
|
+ $row['inviteeShopName'] ?? '',
|
|
|
+ $row['inviteCode'] ?? '',
|
|
|
+ $row['memberTypeName'] ?? '',
|
|
|
+ $row['memberPayAmount'] ?? '',
|
|
|
+ $row['commissionRatio'] ?? '',
|
|
|
+ $row['commissionAmount'] ?? '',
|
|
|
+ $row['settleStatusText'] ?? '',
|
|
|
+ $row['addTime'] ?? '',
|
|
|
+ $row['settleTime'] ?? '',
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ fclose($fp);
|
|
|
+
|
|
|
+ Yii::$app->request->setQueryParams($savedGet);
|
|
|
+ $host = Yii::$app->params['ghsHost'] ?? (Yii::$app->params['hdImgHost'] ?? '');
|
|
|
+ return [
|
|
|
+ 'file' => rtrim($host, '/') . '/priceTable/invite_admin/' . $filename,
|
|
|
+ 'shortFile' => $filename,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+}
|