// +---------------------------------------------------------------------- namespace app\common\repositories\user; use app\common\dao\user\UserAssetsLogDao; use app\common\repositories\BaseRepository; use app\common\repositories\store\product\ProductAssistRepository; use app\common\repositories\store\product\ProductRepository; use app\common\repositories\system\groupData\GroupDataRepository; use think\db\exception\DataNotFoundException; use think\db\exception\DbException; use think\db\exception\ModelNotFoundException; use think\facade\Log; /** * @mixin UserAssetsLogDao */ class UserAssetsLogRepository extends BaseRepository { const ASSET_TYPE_CONSUME = 1; // 消费积分 const ASSET_TYPE_SHARE_POINT = 2; // 分红点 const ASSET_TYPE_WELFARE = 3; // 福利积分 const ASSET_TYPE_HUITONG = 4; // 惠通宝 const ASSET_TYPE_CONTRIBUTION = 5; // 贡献值 const CHANGE_TYPE_ORDER_GET = 1; // 订单获取 const CHANGE_TYPE_SIGN = 2; // 签到 const CHANGE_TYPE_SHARE = 3; // 分红 const CHANGE_TYPE_ORDER_PAY = 4; // 订单消费 const CHANGE_TYPE_SPREAD = 5; // 推广 const CHANGE_TYPE_CULTIVATE = 6; // 培育 const CHANGE_TYPE_TRANSFER = 7; // 赠与 const CHANGE_TYPE_EXCHANGE = 8; // 兑换 const STATUS_FROZEN = 0; // 冻结 const STATUS_SUCCESS = 1; // 成功 const STATUS_REFUND = 2; // 退款 public function __construct(UserAssetsLogDao $dao, UserAssetsRepository $userAssetsRepository, ProductRepository $productRepository, GroupDataRepository $groupRepository) { $this->dao = $dao; $this->userAssetsRepository = $userAssetsRepository; $this->productRepository = $productRepository; $this->groupDataRepository = $groupRepository; } /** * notes 获取资产变动类型 * @return string[] * @create 2024/3/15 15:30 * @update 2024/3/15 15:30 * @author zhangkxiang * @editor */ public function getChangeType() { return array( self::CHANGE_TYPE_ORDER_GET => "订单获取", self::CHANGE_TYPE_SIGN => "签到", self::CHANGE_TYPE_SHARE => "分红", self::CHANGE_TYPE_ORDER_PAY => "订单消费", self::CHANGE_TYPE_SPREAD => "推广", self::CHANGE_TYPE_CULTIVATE => "培育", self::CHANGE_TYPE_TRANSFER => "赠与", self::CHANGE_TYPE_EXCHANGE => "兑换", ); } public function getList(array $where, $page, $limit) { $query = $this->dao->search($where); $count = $query->count(); $list = $query->page($page, $limit)->with(['spread' => function ($query) { $query->field('uid,nickname,avatar'); }])->select(); return compact('count', 'list'); } /** * notes 用户支付订单时间处理 * @param $groupOrder * @create 2024/3/15 17:22 * @update 2024/3/15 17:22 * @author zhangkxiang * @editor * * {"name":"福利积分--项目经理", "value":10, "key":"welfare_project"} * {"name":"福利积分--一星经理", "value":30, "key":"welfare_project_1"} * {"name":"福利积分--二星经理", "value":50, "key":"welfare_project_2"} * {"name":"福利积分--三星经理", "value":80, "key":"welfare_project_3"} * {"name":"贡献值--用户", "value":1, "key":"contribution_user"} * {"name":"贡献值--项目经理", "value":1, "key":"contribution_project"} * {"name":"贡献值--一星经理", "value":2, "key":"contribution_project_1"} * {"name":"贡献值--二星经理", "value":3, "key":"contribution_project_2"} * {"name":"贡献值--三星经理", "value":4, "key":"contribution_project_3"} * {"name":"惠通宝--用户", "value":5, "key":"huitong_user"} * {"name":"惠通宝--项目经理", "value":10, "key":"huitong_project"} * {"name":"惠通宝--一星经理", "value":30, "key":"huitong_project_1"} * {"name":"惠通宝--二星经理", "value":50, "key":"huitong_project_2"} * {"name":"惠通宝--三星经理", "value":80, "key":"huitong_project_3"} * {"name":"福利积分--区域代理--区域代理奖", "value":1, "key":"welfare_agent"} * {"name":"福利积分--区域代理--推荐商家奖", "value":1, "key":"welfare_agent_recommend"} * {"name":"福利积分--项目经理--推荐商家奖", "value":1, "key":"welfare_project_recommend"} * {"name":"福利积分--商户--推荐商家奖", "value":1, "key":"welfare_merchat_recommend"} * {"name":"惠通宝增值幅度比例配置", "value":10, "key":"huitong_add"} * {"name":"福利积分--存在分红点用户奖励", "value":10, "key":"share_award"} */ public function userPayEvent($groupOrder) { // 配置信息 $config = $this->groupDataRepository->getGroupDataLst(0, 100, 1, 100); $config = array_column($config['list'], "value", 'key'); foreach ($groupOrder['orderList'] as $orderItem) { $base = 0; foreach ($orderItem['orderProduct'] as $orderProduct) { // 获取商品详情(奖励积分 $product = $this->productRepository->detail($orderProduct['product_id'], null); Log::info("product" . json_encode($product)); $rate = floatval($orderProduct['total_price']) / floatval($orderProduct['product_price']) * 100; if ($rate >= $product['cash_rate']) { $base += $product['base']; } } // 1. 用户资产 $this->userAssets($orderItem, $config, $base); // 2. 项目经理资产 if ($base) { $startProjectUid = $this->projectAssets($orderItem, $config, $base); // 3. 培育经理资产 $this->breedAssets($startProjectUid, $orderItem['order_id'], $config, $base); } } } /** * notes * @param $startProjectUid * @param $orderId * @param $config * @param $base * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException * @create 2024/3/17 19:32 * @update 2024/3/17 19:32 * @author zhangkxiang * @editor */ public function breedAssets($startProjectUid, $orderId, $config, $base) { $consume = 0; $userRepository = app(UserRepository::class); $userProject = $userRepository->get($startProjectUid); if (empty($userProject)) { return; } if ($userProject['group_id'] > 4 or $userProject['group_id'] <= 1) { return; } $group = $userProject['group_id'] - 1; // 1. 项目经理的福利积分 $orderWelfare = round($base * $config['welfare_project'] * $config['welfare_project_' . $group] / 10000, 2); $welfare = $this->_getValue($orderWelfare); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_WELFARE, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $welfare, ); // 2. 项目经理的惠通宝 $orderHuitong = round($base * $config['huitong_project'] * $config['huitong_project_' . $group] / 10000, 2); $huitong = $this->_getValue($orderHuitong); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_HUITONG, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $huitong, ); // 3. 项目经理的贡献值 $orderContribution = round($base * $config['contribution_project'] * $config['contribution_project_' . $group] / 10000, 2); $contribution = $this->_getValue($orderContribution); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_CONTRIBUTION, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $contribution, ); $this->addLog($logList); $this->userAssetsRepository->orderEvent($userProject['uid'], self::STATUS_FROZEN, compact('consume', 'welfare', 'huitong', 'contribution')); } /** * notes * @param $orderItem * @param $config * @param $base * @create 2024/3/17 19:32 * @update 2024/3/17 19:32 * @author zhangkxiang * @editor */ public function projectAssets($orderItem, $config, $base) { $consume = 0; $uid = $orderItem['uid']; $orderId = $orderItem['order_id']; $userProject = null; $userRepository = app(UserRepository::class); $user = $userRepository->get($uid); if (empty($user)) { return 0; } // 查找第一个项目经理 while (!$userProject) { $user = $userRepository->get($user['spread_uid']); if (empty($user)) { return 0; } if ($user['group_id']) { $userProject = $user; } } if (empty($userProject)) { return 0; } $logList = array(); // 1. 项目经理的福利积分 $orderWelfare = round($base * $config['welfare_project'] / 100, 2); $welfare = $this->_getValue($orderWelfare); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_WELFARE, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $welfare, ); // 2. 项目经理的惠通宝 $orderHuitong = round($base * $config['huitong_project'] / 100, 2); $huitong = $this->_getValue($orderHuitong); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_HUITONG, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $huitong, ); // 3. 项目经理的贡献值 $orderContribution = round($base * $config['contribution_project'] / 100, 2); $contribution = $this->_getValue($orderContribution); $logList[] = array( 'uid' => $userProject['uid'], 'asset_type' => self::ASSET_TYPE_CONTRIBUTION, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderId, 'count' => $contribution, ); $this->addLog($logList); $this->userAssetsRepository->orderEvent($userProject['uid'], self::STATUS_FROZEN, compact('consume', 'welfare', 'huitong', 'contribution')); return $userProject['spread_uid']; } /** * notes 用户资产变动 * @param $orderItem * @param $config * @param $base * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException * @create 2024/3/17 17:06 * @update 2024/3/17 17:06 * @author zhangkxiang * @editor */ public function userAssets($orderItem, $config, $base) { $logList = array(); $welfare = $huitong = $contribution = 0; // 1. 本人的消费积分 $logList[] = array( 'uid' => $orderItem['uid'], 'asset_type' => self::ASSET_TYPE_CONSUME, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderItem['order_id'], 'count' => $orderItem['pay_price'], ); $consume = $orderItem['pay_price']; // 如果该订单奖励基数大于0 if ($base) { // 2. 本人的福利积分 $orderWelfare = round($base * 0.1, 2); $welfare = $this->_getValue($orderWelfare); $logList[] = array( 'uid' => $orderItem['uid'], 'asset_type' => self::ASSET_TYPE_WELFARE, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderItem['order_id'], 'count' => $welfare, ); // 3. 本人的惠通宝 $orderHuitong = round($base * $config['huitong_user'] / 100, 2); $huitong = $this->_getValue($orderHuitong); $logList[] = array( 'uid' => $orderItem['uid'], 'asset_type' => self::ASSET_TYPE_HUITONG, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderItem['order_id'], 'count' => $huitong, ); // 4. 本人的贡献值 $orderContribution = round($base * $config['contribution_user'] / 100, 2); $contribution = $this->_getValue($orderContribution); $logList[] = array( 'uid' => $orderItem['uid'], 'asset_type' => self::ASSET_TYPE_CONTRIBUTION, 'type' => self::CHANGE_TYPE_ORDER_GET, 'status' => self::STATUS_FROZEN, 'order_id' => $orderItem['order_id'], 'count' => $contribution, ); } $this->addLog($logList); $this->userAssetsRepository->orderEvent($orderItem['uid'], self::STATUS_FROZEN, compact('consume', 'welfare', 'huitong', 'contribution')); } private function _getValue($value){ if($value < 0.01){ return 0.01; } return $value; } /** * notes 插入变动日志,如果小于0.01则插入0.01 * @param $list * @create 2024/3/17 22:09 * @update 2024/3/17 22:09 * @author zhangkxiang * @editor */ public function addLog($list) { $this->dao->insertAll($list); } public function userRefund() { } }