DistributionOrderClass.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. /**
  3. * 用途:订单分销记录业务(xhDistributionOrder)
  4. * 谁用:拉新客户-查看贡献明细(分红明细页)
  5. */
  6. namespace bizHd\distribution\classes;
  7. use bizHd\base\classes\BaseClass;
  8. use common\components\dateUtil;
  9. use Yii;
  10. use yii\db\Query;
  11. class DistributionOrderClass extends BaseClass
  12. {
  13. public static $baseFile = '\bizHd\distribution\models\DistributionOrder';
  14. /**
  15. * 分销员分红订单列表(xhDistributionOrder)
  16. * @param int $shopId
  17. * @param int $distId 获佣分销员 xhCustom.id
  18. * @param int $buyerId 下单客户 xhCustom.id,0 表示不限下线
  19. * @return array
  20. * @throws \Exception
  21. */
  22. public static function getContribOrderList($shopId, $distId, $buyerId = 0)
  23. {
  24. $shopId = (int)$shopId;
  25. $distId = (int)$distId;
  26. $buyerId = (int)$buyerId;
  27. if ($distId < 0) {
  28. throw new \Exception('参数无效');
  29. }
  30. $get = Yii::$app->request->get();
  31. $settleStatus = isset($get['settleStatus']) ? trim($get['settleStatus']) : '';
  32. $keyword = isset($get['keyword']) ? trim($get['keyword']) : '';
  33. $searchTime = isset($get['searchTime']) ? trim($get['searchTime']) : 'thisMonth';
  34. $startTime = isset($get['startTime']) ? trim($get['startTime']) : '';
  35. $endTime = isset($get['endTime']) ? trim($get['endTime']) : '';
  36. $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
  37. // 分红合计:与列表相同的 searchTime 时段、settleStatus(不含 keyword 分页条件)
  38. $monthQuery = (new Query())
  39. ->from('xhDistributionOrder')
  40. ->where(['shopId' => $shopId]);
  41. if ($distId > 0) {
  42. $monthQuery->andWhere(['distId' => $distId]);
  43. }
  44. if ($buyerId > 0) {
  45. $monthQuery->andWhere(['buyerId' => $buyerId]);
  46. }
  47. if ($settleStatus !== '' && $settleStatus !== 'all') {
  48. $monthQuery->andWhere(['settleStatus' => (int)$settleStatus]);
  49. }
  50. if (!empty($period['startTime']) && !empty($period['endTime'])) {
  51. $monthQuery->andWhere(['between', 'orderTime', $period['startTime'], $period['endTime']]);
  52. }
  53. $monthCommission = (float)$monthQuery->sum('commissionAmount');
  54. // Base::conditionQuery 不支持 or 组合,关键词搜索改用 Query 分页
  55. $page = isset($get['page']) ? max(1, (int)$get['page']) : 1;
  56. $pageSize = isset($get['pageSize']) && (int)$get['pageSize'] > 0
  57. ? (int)$get['pageSize']
  58. : (int)Yii::$app->params['pageSize'];
  59. $query = (new Query())
  60. ->from('xhDistributionOrder')
  61. ->where(['shopId' => $shopId]);
  62. if ($distId > 0) {
  63. $query->andWhere(['distId' => $distId]);
  64. }
  65. if ($buyerId > 0) {
  66. $query->andWhere(['buyerId' => $buyerId]);
  67. }
  68. if ($settleStatus !== '' && $settleStatus !== 'all') {
  69. $query->andWhere(['settleStatus' => (int)$settleStatus]);
  70. }
  71. if (!empty($period['startTime']) && !empty($period['endTime'])) {
  72. $query->andWhere(['between', 'orderTime', $period['startTime'], $period['endTime']]);
  73. }
  74. if ($keyword !== '') {
  75. $query->andWhere([
  76. 'or',
  77. ['like', 'orderSn', $keyword],
  78. ['like', 'buyerName', $keyword],
  79. ['like', 'distName', $keyword],
  80. ]);
  81. }
  82. $total = (int)(clone $query)->count('*', Yii::$app->db);
  83. $totalPage = $pageSize > 0 ? (int)ceil($total / $pageSize) : 0;
  84. $rows = $query
  85. ->orderBy(['orderTime' => SORT_DESC, 'id' => SORT_DESC])
  86. ->offset(($page - 1) * $pageSize)
  87. ->limit($pageSize)
  88. ->all(Yii::$app->db);
  89. $list = [];
  90. foreach ($rows as $row) {
  91. $list[] = self::formatContribOrderRow($row);
  92. }
  93. return [
  94. 'list' => $list,
  95. 'totalNum' => $total,
  96. 'totalPage' => $totalPage,
  97. 'moreData' => $page < $totalPage ? 1 : 0,
  98. 'monthCommission' => round($monthCommission, 2),
  99. ];
  100. }
  101. /**
  102. * 格式化贡献订单行(金额字段与库表一致,另附展示用文案)
  103. */
  104. protected static function formatContribOrderRow($row)
  105. {
  106. $settleStatus = (int)$row['settleStatus'];
  107. $commissionAmount = round((float)$row['commissionAmount'], 2);
  108. $isSettled = $settleStatus === 1;
  109. return [
  110. 'id' => (int)$row['id'],
  111. 'orderId' => (int)$row['orderId'],
  112. 'orderSn' => $row['orderSn'],
  113. 'buyerId' => (int)$row['buyerId'],
  114. 'buyerName' => $row['buyerName'],
  115. 'distId' => (int)$row['distId'],
  116. 'distName' => $row['distName'],
  117. 'orderAmount' => round((float)$row['orderAmount'], 2),
  118. 'payAmount' => round((float)$row['payAmount'], 2),
  119. 'sendCost' => round((float)$row['sendCost'], 2),
  120. 'commissionBase' => round((float)$row['commissionBase'], 2),
  121. 'commissionRate' => round((float)$row['commissionRate'], 2),
  122. 'commissionAmount' => $commissionAmount,
  123. 'bonusType' => (int)$row['bonusType'],
  124. 'bindDays' => (int)$row['bindDays'],
  125. 'settleStatus' => $settleStatus,
  126. 'orderTime' => $row['orderTime'],
  127. 'payTime' => $row['payTime'],
  128. 'finishTime' => $row['finishTime'],
  129. 'settleTime' => $row['settleTime'],
  130. 'invalidTime' => $row['invalidTime'],
  131. 'invalidReason' => $row['invalidReason'],
  132. 'amountText' => '+¥' . number_format($commissionAmount, 2, '.', ''),
  133. 'statusText' => self::settleStatusText($settleStatus),
  134. 'statusClass' => self::settleStatusClass($settleStatus),
  135. 'timeLabel' => $isSettled ? '结算时间' : '下单时间',
  136. 'timeValue' => $isSettled ? ($row['settleTime'] ?: $row['orderTime']) : $row['orderTime'],
  137. ];
  138. }
  139. protected static function settleStatusText($settleStatus)
  140. {
  141. $map = [
  142. 0 => '待结算',
  143. 1 => '已结算',
  144. 2 => '已失效',
  145. ];
  146. return isset($map[$settleStatus]) ? $map[$settleStatus] : '';
  147. }
  148. protected static function settleStatusClass($settleStatus)
  149. {
  150. if ($settleStatus === 0) {
  151. return 'pending';
  152. }
  153. if ($settleStatus === 1) {
  154. return 'success';
  155. }
  156. return 'invalid';
  157. }
  158. /**
  159. * 订单完成后回写 finishTime(取值与 xhOrder.successTime 一致,不改 settleStatus)
  160. * @param int $orderId xhOrder.id
  161. * @param string|null $finishTime 默认当前时间
  162. * @return int 更新行数
  163. */
  164. public static function touchFinishTimeByOrderId($orderId, $finishTime = null)
  165. {
  166. $orderId = (int)$orderId;
  167. if ($orderId <= 0) {
  168. return 0;
  169. }
  170. $finishTime = $finishTime ?: date('Y-m-d H:i:s');
  171. return (int)self::$baseFile::updateAll(
  172. ['finishTime' => $finishTime],
  173. [
  174. 'and',
  175. ['orderId' => $orderId],
  176. ['settleStatus' => 0],
  177. ['>', 'commissionAmount', 0],
  178. ]
  179. );
  180. }
  181. }