| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- /**
- * 用途:订单分销记录业务(xhDistributionOrder)
- * 谁用:拉新客户-查看贡献明细(分红明细页)
- */
- namespace bizHd\distribution\classes;
- use bizHd\base\classes\BaseClass;
- use common\components\dateUtil;
- use common\components\util;
- use Yii;
- use yii\db\Query;
- class DistributionOrderClass extends BaseClass
- {
- public static $baseFile = '\bizHd\distribution\models\DistributionOrder';
- /**
- * 分销员分红订单列表(xhDistributionOrder)
- * @param int $shopId
- * @param int $distId 获佣分销员 xhCustom.id
- * @param int $buyerId 下单客户 xhCustom.id,0 表示不限下线
- * @return array
- * @throws \Exception
- */
- public static function getContribOrderList($shopId, $distId, $buyerId = 0)
- {
- $shopId = (int)$shopId;
- $distId = (int)$distId;
- $buyerId = (int)$buyerId;
- if ($distId < 0) {
- throw new \Exception('参数无效');
- }
- $get = Yii::$app->request->get();
- $settleStatus = isset($get['settleStatus']) ? trim($get['settleStatus']) : '';
- $keyword = isset($get['keyword']) ? trim($get['keyword']) : '';
- $searchTime = isset($get['searchTime']) ? trim($get['searchTime']) : 'thisMonth';
- $startTime = isset($get['startTime']) ? trim($get['startTime']) : '';
- $endTime = isset($get['endTime']) ? trim($get['endTime']) : '';
- $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
- // 分红合计:与列表相同的 searchTime 时段、settleStatus(不含 keyword 分页条件)
- $monthQuery = (new Query())
- ->from('xhDistributionOrder')
- ->where(['shopId' => $shopId]);
- if ($distId > 0) {
- $monthQuery->andWhere(['distId' => $distId]);
- }
- if ($buyerId > 0) {
- $monthQuery->andWhere(['buyerId' => $buyerId]);
- }
- if ($settleStatus !== '' && $settleStatus !== 'all') {
- $monthQuery->andWhere(['settleStatus' => (int)$settleStatus]);
- }
- if (!empty($period['startTime']) && !empty($period['endTime'])) {
- $monthQuery->andWhere(['between', 'orderTime', $period['startTime'], $period['endTime']]);
- }
- $monthCommission = (float)$monthQuery->sum('commissionAmount');
- // Base::conditionQuery 不支持 or 组合,关键词搜索改用 Query 分页
- $page = isset($get['page']) ? max(1, (int)$get['page']) : 1;
- $pageSize = isset($get['pageSize']) && (int)$get['pageSize'] > 0
- ? (int)$get['pageSize']
- : (int)Yii::$app->params['pageSize'];
- $query = (new Query())
- ->from('xhDistributionOrder')
- ->where(['shopId' => $shopId]);
- if ($distId > 0) {
- $query->andWhere(['distId' => $distId]);
- }
- if ($buyerId > 0) {
- $query->andWhere(['buyerId' => $buyerId]);
- }
- if ($settleStatus !== '' && $settleStatus !== 'all') {
- $query->andWhere(['settleStatus' => (int)$settleStatus]);
- }
- if (!empty($period['startTime']) && !empty($period['endTime'])) {
- $query->andWhere(['between', 'orderTime', $period['startTime'], $period['endTime']]);
- }
- if ($keyword !== '') {
- $query->andWhere([
- 'or',
- ['like', 'orderSn', $keyword],
- ['like', 'buyerName', $keyword],
- ['like', 'distName', $keyword],
- ]);
- }
- $total = (int)(clone $query)->count('*', Yii::$app->db);
- $totalPage = $pageSize > 0 ? (int)ceil($total / $pageSize) : 0;
- $rows = $query
- ->orderBy(['orderTime' => SORT_DESC, 'id' => SORT_DESC])
- ->offset(($page - 1) * $pageSize)
- ->limit($pageSize)
- ->all(Yii::$app->db);
- $list = [];
- foreach ($rows as $row) {
- $list[] = self::formatContribOrderRow($row);
- }
- return [
- 'list' => $list,
- 'totalNum' => $total,
- 'totalPage' => $totalPage,
- 'moreData' => $page < $totalPage ? 1 : 0,
- 'monthCommission' => round($monthCommission, 2),
- ];
- }
- /**
- * 格式化贡献订单行(金额字段与库表一致,另附展示用文案)
- */
- protected static function formatContribOrderRow($row)
- {
- $settleStatus = (int)$row['settleStatus'];
- $commissionAmount = round((float)$row['commissionAmount'], 2);
- $isSettled = $settleStatus === 1;
- return [
- 'id' => (int)$row['id'],
- 'orderId' => (int)$row['orderId'],
- 'orderSn' => $row['orderSn'],
- 'buyerId' => (int)$row['buyerId'],
- 'buyerName' => $row['buyerName'],
- 'distId' => (int)$row['distId'],
- 'distName' => $row['distName'],
- 'orderAmount' => round((float)$row['orderAmount'], 2),
- 'payAmount' => round((float)$row['payAmount'], 2),
- 'sendCost' => round((float)$row['sendCost'], 2),
- 'commissionBase' => round((float)$row['commissionBase'], 2),
- 'commissionRate' => round((float)$row['commissionRate'], 2),
- 'commissionAmount' => $commissionAmount,
- 'bonusType' => (int)$row['bonusType'],
- 'bindDays' => (int)$row['bindDays'],
- 'settleStatus' => $settleStatus,
- 'orderTime' => $row['orderTime'],
- 'payTime' => $row['payTime'],
- 'finishTime' => $row['finishTime'],
- 'settleTime' => $row['settleTime'],
- 'invalidTime' => $row['invalidTime'],
- 'invalidReason' => $row['invalidReason'],
- 'amountText' => '+¥' . number_format($commissionAmount, 2, '.', ''),
- 'statusText' => self::settleStatusText($settleStatus),
- 'statusClass' => self::settleStatusClass($settleStatus),
- 'timeLabel' => $isSettled ? '结算时间' : '下单时间',
- 'timeValue' => $isSettled ? ($row['settleTime'] ?: $row['orderTime']) : $row['orderTime'],
- ];
- }
- protected static function settleStatusText($settleStatus)
- {
- $map = [
- 0 => '待结算',
- 1 => '已结算',
- 2 => '已失效',
- ];
- return isset($map[$settleStatus]) ? $map[$settleStatus] : '';
- }
- protected static function settleStatusClass($settleStatus)
- {
- if ($settleStatus === 0) {
- return 'pending';
- }
- if ($settleStatus === 1) {
- return 'success';
- }
- return 'invalid';
- }
- /**
- * 分销关联订单的售后期限校验:订单完成后超过 settleDays 天不可再发起退款
- * 无记录(与分销无关)或不存在 finishTime(尚未完成计佣)则放行
- * @param int $orderId xhOrder.id
- * @param int $shopId
- * @param int $mainId
- */
- public static function assertRefundNotExpired($orderId, $shopId, $mainId)
- {
- $orderId = (int)$orderId;
- if ($orderId <= 0) {
- return;
- }
- $distOrder = self::getByCondition(['orderId' => $orderId]);
- if (empty($distOrder)) {
- return;
- }
- $finishTime = $distOrder['finishTime'] ?? '';
- if (empty($finishTime) || $finishTime === '0000-00-00 00:00:00') {
- // 订单尚未写入完成时间,暂不按 settleDays 拦截
- return;
- }
- $rule = DistributionRuleClass::getRule((int)$shopId, (int)$mainId);
- $settleDays = max(0, (int)($rule['settleDays'] ?? 0));
- $deadline = strtotime($finishTime) + $settleDays * 86400;
- if (time() > $deadline) {
- util::fail("该订单已超过售后期限(完成后{$settleDays}天内可申请),无法再发起退款");
- }
- }
- /**
- * 订单完成后回写 finishTime(取值与 xhOrder.successTime 一致,不改 settleStatus)
- * @param int $orderId xhOrder.id
- * @param string|null $finishTime 默认当前时间
- * @return int 更新行数
- */
- public static function touchFinishTimeByOrderId($orderId, $finishTime = null)
- {
- $orderId = (int)$orderId;
- if ($orderId <= 0) {
- return 0;
- }
- $finishTime = $finishTime ?: date('Y-m-d H:i:s');
- return (int)self::$baseFile::updateAll(
- ['finishTime' => $finishTime],
- [
- 'and',
- ['orderId' => $orderId],
- ['settleStatus' => 0],
- ['>', 'commissionAmount', 0],
- ]
- );
- }
- }
|