services->setting->addons->get($this->mall_id, HappinessEnum::ADDONS_NAME, 'basic.commission_day'); if (!empty($setting)) { $data['send_time'] = $commission_day * 86400; } $data['order_no'] = $params['order_no']; $data['user_id'] = $params['user_id']; $data['remark'] = $params['remark']; $data['order_id'] = $params['order_id']; $data['money'] = $params['money']; $data['commission_status'] = $params['commission_status']; $data['status'] = \common\enums\StatusEnum::ENABLED; $data['commission_type'] = $params['commission_type']; $data['mall_id'] = $params['mall_id']; $data['agent_id'] = $params['agent_id'] ?? 0; $data['store_id'] = $params['store_id']; $data['order_money'] = $params['order_money']??0; if($data['money']<=0) { return true; } $res = HappinessCommissionLog::setData($data); if ($res === false) { $this->error = HappinessCommissionLog::setStaticError(); return false; } return true; } /** * 结算发放佣金 * @param $params * @return void */ public function send($order, $order_status) { try { $mall_id = $order['mall_id']; $order_no = $order['order_no']; $buy_user_id = $order['user_id']; //获取订单佣金记录进行发放 $settlement_method = \Yii::$app->services->setting->addons->get($mall_id, HappinessEnum::ADDONS_NAME, 'basic.settlement_method'); if ($order_status != $settlement_method) { return; } $commission_log = HappinessCommissionLog::find()->where(['order_no' => $order_no, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'status' => StatusEnum::ENABLED, 'mall_id' => $mall_id])->asArray() ->all(); if (empty($commission_log)) { return; } $now_send = [];//需要立即发放的 $now_settle = [];//结算的 $now_give = [];//到账的 foreach ($commission_log as $value) { //发放佣金 if ($value['send_time'] == 0) { $table='order'; if(strpos($value['order_no'],'C')===0) { $table=HappinessCashierOrder::tableName(); } $now_send[] = [ 'mall_id' => $value['mall_id'], 'user_id' => $value['user_id'], 'is_frozen' => false, 'wallet_type' => 'commission', 'money' => $value['money'], 'desc' => $value['remark'], 'source_table' => $table, 'source_table_id' => $order['id'], 'from_type' => HappinessEnum::ADDONS_NAME, 'capital_type' => $value['commission_type'], ]; $now_give[] = $value['id']; } else { $now_settle[] = $value['id']; } } if ($now_send) { UserWalletService::batchHandleByQueue($now_send); HappinessCommissionLog::updateAll(['commission_status' => HappinessRewardEnum::SETTLED], ['in', 'id', $now_settle]); HappinessCommissionLog::updateAll(['commission_status' => HappinessRewardEnum::SEND], ['in', 'id', $now_give]); } $res=$this->stats($commission_log); if($res===false) { throw new \Exception($this->error); } return true; } catch (\Exception $e) { \Yii::error('OrderFinishListener error:' . $e->getMessage() . $e->getFile() . ':' . $e->getLine() . PHP_EOL); } } //支出统计 public function stats($params) { if(empty($params)) { return true; } //写入express_log foreach ($params as $value) { $userData=HappinessExpensesLog::find()->where(['mall_id' => $value['mall_id'], 'user_id' => $value['user_id'], 'order_id' =>$value['order_id']])->one(); if (!$userData) { $userData=HappinessExpensesLog::setData( [ 'mall_id' => $value['mall_id'], 'user_id' => $value['user_id'], 'store_id' => $value['store_id'], 'order_id' =>$value['order_id'], 'order_no' =>$value['order_no'], 'order_money' =>$value['order_money'], ]); } switch ($value['commission_type']) { case HappinessRewardEnum::COMMISSION_TYPE_COMMAND: case HappinessRewardEnum::COMMISSION_TYPE_COMMAND_AGENT: $userData->promotion_money =bcadd($userData->promotion_money, $value['money'],2); break; case HappinessRewardEnum::COMMISSION_TYPE_LOCK: $userData->fans_money=bcadd($userData->fans_money, $value['money'],2); break; case HappinessRewardEnum::COMMISSION_TYPE_SHARE: $userData->share_money =bcadd($userData->share_money, $value['money'],2); break; case HappinessRewardEnum::COMMISSION_TYPE_AGENT: $userData->agent_money =bcadd($userData->agent_money, $value['money'],2); break; } $res=$userData->save(); if ($res === false) { $this->error = $userData->getError(); \Yii::error($this->error); return false; } } return true; } public function statsItem($params,$field) { $userData=HappinessExpensesLog::find()->where(['mall_id' => $params['mall_id'], 'user_id' => $params['user_id'],'order_id'=>$params['order_id'] ]) ->one(); if (!$userData) { $userData=HappinessExpensesLog::setData( [ 'mall_id' => $params['mall_id'], 'user_id' => $params['user_id'], 'store_id' => $params['store_id'], 'order_id' =>$params['order_id'], 'order_no' =>$params['order_no'], 'order_money' =>$params['order_money'], ]); } $userData->$field =bcadd($userData->$field, $params['money'],2); $res=$userData->save(); if ($res === false) { $this->error = HappinessCommissionLog::setStaticError(); return false; } return true; } /** * 定时发放的 * @return void * @throws \Exception * */ public function jobSend($mall_id) { //获取订单佣金记录进行发放 $commission_log = HappinessCommissionLog::find()->where(['mall_id' => $mall_id, 'commission_status' => HappinessRewardEnum::SETTLED])->andWhere(['<=', 'send_time', time()])->asArray() ->limit(1000)->all(); if (empty($commission_log)) { return true; } $now_send = []; $now_give = []; foreach ($commission_log as $value) { $now_send[] = [ 'mall_id' => $value['mall_id'], 'user_id' => $value['user_id'], 'is_frozen' => false, 'wallet_type' => 'commission', 'money' => $value['money'], 'desc' => $value['remark'], 'from_type' => HappinessEnum::ADDONS_NAME, 'capital_type' => $value['commission_type'], 'source_table' => 'order', 'source_table_id' => $value['order_id'], ]; $now_give[] = $value['id']; } if ($now_send) { UserWalletService::batchHandleByQueue($now_send); HappinessCommissionLog::updateAll(['commission_status' => HappinessRewardEnum::SEND], ['in', 'id', $now_give]); } } public function calculateAndRecord($order, $params) { //计算其它佣金 $setting = \Yii::$app->services->setting->addons->get($params['mall_id'], HappinessEnum::ADDONS_NAME, 'basic'); $commission_arr = []; //锁定收益 $lockService = new LockUserService(); $lockStoreUserId = $lockService->getLockStoreUser($order['user_id'], $params['mall_id']); if ($lockStoreUserId === false) { //锁定用户 $lockService->lockUser($order['order_no'], $order['user_id'], $params['store_id'], $params['mall_id']); } else { //锁定收益 $lock_commission_money = bcmul($order['pay_money'], bcdiv($setting['lock_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $lockStoreUserId, 'money' => $lock_commission_money, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_LOCK, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $lockStoreUserId . ')获得小店锁定收益', 'mall_id' => $params['mall_id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; } $store = HappinessStore::find()->where(['id' => $params['store_id']])->one(); //代理收益 $agent_commission_total = 0; $agent_level_list = empty($setting['agent_list']) ? [] : json_decode($setting['agent_list'], true); $agent_level_list = array_column($agent_level_list, null, 'level'); //业务员 $business_level_list = empty($setting['business_list']) ? [] : json_decode($setting['business_list'], true); $business_level_list = array_column($business_level_list, null, 'level'); //省代 $province_agent = HappinessAgent::findOne(['mall_id' => $this->mall_id, 'province_id' => $store['province_id'], 'role' => HappinessEnum::AGENT_PROVINCE, 'status' => StatusEnum::ENABLED]); if (!empty($province_agent) && isset($agent_level_list[$province_agent['level']])) { $agent_commission_total = bcmul($order['pay_money'], bcdiv($agent_level_list[$province_agent['level']]['income_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $province_agent['user_id'], 'money' => $agent_commission_total, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_AGENT, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $province_agent['user_id'] . ')获得小店省级代理收益', 'mall_id' => $params['mall_id'], 'agent_id' => $province_agent['id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; //业务员奖励 $parent_business = HappinessBusiness::find()->where(['user_id' => $province_agent['parent_id'], 'status' => StatusEnum::ENABLED, 'mall_id' => $params['mall_id']])->asArray()->one(); if (!empty($parent_business) && isset($business_level_list[$parent_business['level']])) { $parent_business_commission = bcmul($agent_commission_total, bcdiv ($business_level_list[$parent_business['level']]['share_agent_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $parent_business['user_id'], 'money' => $parent_business_commission, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_COMMAND_AGENT, 'agent_id' => $province_agent['id'], 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $parent_business['user_id'] . ')获得小店推广省级代理收益', 'mall_id' => $params['mall_id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; } } //市代和区代 $city_agent = HappinessAgent::findOne(['mall_id' => $this->mall_id, 'city_id' => $store['city_id'], 'role' => HappinessEnum::AGENT_CITY, 'status' => StatusEnum::ENABLED]); if (!empty($city_agent) && isset($agent_level_list[$city_agent['level']])) { $agent_commission_total = bcmul($order['pay_money'], bcdiv($agent_level_list[$city_agent['level']]['income_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $city_agent['user_id'], 'money' => $agent_commission_total, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_AGENT, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $city_agent['user_id'] . ')获得小店城市代理收益', 'mall_id' => $params['mall_id'], 'agent_id' => $city_agent['id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; //业务员奖励 $parent_business = HappinessBusiness::find()->where(['user_id' => $city_agent['parent_id'], 'status' => StatusEnum::ENABLED, 'mall_id' => $params['mall_id']])->asArray()->one(); if (!empty($parent_business) && isset($business_level_list[$parent_business['level']])) { $parent_business_commission = bcmul($agent_commission_total, bcdiv ($business_level_list[$parent_business['level']]['share_agent_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $parent_business['user_id'], 'money' => $parent_business_commission, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_COMMAND_AGENT, 'agent_id' => $city_agent['id'], 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $parent_business['user_id'] . ')获得小店推广城市代理收益', 'mall_id' => $params['mall_id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; } } $district_agent = HappinessAgent::findOne(['mall_id' => $params['mall_id'], 'district_id' => $store['district_id'], 'role' => HappinessEnum::AGENT_DISTRICT, 'status' => StatusEnum::ENABLED]); if (!empty($district_agent) && isset($agent_level_list[$district_agent['level']])) { $agent_commission_total = bcmul($order['pay_money'], bcdiv($agent_level_list[$district_agent['level']]['income_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $district_agent['user_id'], 'money' => $agent_commission_total, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_AGENT, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $district_agent['user_id'] . ')获得小店区代理收益', 'mall_id' => $params['mall_id'], 'agent_id' => $district_agent['id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; //业务员奖励 $parent_business = HappinessBusiness::find()->where(['user_id' => $district_agent['parent_id'], 'status' => StatusEnum::ENABLED, 'mall_id' => $params['mall_id']])->asArray()->one(); if (!empty($parent_business) && isset($business_level_list[$parent_business['level']])) { $parent_business_commission = bcmul($agent_commission_total, bcdiv ($business_level_list[$parent_business['level']]['share_agent_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $parent_business['user_id'], 'money' => $parent_business_commission, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_COMMAND_AGENT, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'agent_id' => $district_agent['id'], 'remark' => '用户(' . $parent_business['user_id'] . ')获得小店推广区域代理收益', 'mall_id' => $params['mall_id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; } } //推广小店收益 $business_commission_total = 0; $businessAgent = HappinessBusiness::findOne(['user_id' => $store['business_id'], 'mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]); if (!empty($businessAgent) && isset($business_level_list[$businessAgent['level']])) { $business_commission_total = bcmul($order['pay_money'], bcdiv($business_level_list[$businessAgent['level']]['share_store_scale'], 100, 4), 2); $commission_arr[] = [ 'user_id' => $businessAgent['user_id'], 'money' => $business_commission_total, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'commission_type' => HappinessRewardEnum::COMMISSION_TYPE_COMMAND, 'commission_status' => HappinessRewardEnum::NO_SETTLE, 'remark' => '用户(' . $businessAgent['user_id'] . ')获得小店推广收益', 'mall_id' => $params['mall_id'], 'store_id' => $params['store_id'], 'order_money' => $order['pay_money'], ]; } return $commission_arr; } public static function cancelCommission($order_id) { HappinessCommissionLog::updateAll(['commission_status'=>HappinessRewardEnum::CANCEL],['order_id'=>$order_id]); } }