| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- <?php
- namespace addons\Happiness\common\service;
- use addons\Happiness\common\enums\HappinessEnum;
- use addons\Happiness\common\enums\HappinessRewardEnum;
- use addons\Happiness\common\models\HappinessAgent;
- use addons\Happiness\common\models\HappinessBusiness;
- use addons\Happiness\common\models\HappinessCashierOrder;
- use addons\Happiness\common\models\HappinessCommissionLog;
- use addons\Happiness\common\models\HappinessExpensesLog;
- use addons\Happiness\common\models\HappinessStore;
- use common\enums\StatusEnum;
- use services\common\UserWalletService;
- class CommissionService extends BaseService
- {
- /**
- * 记录用户发放的佣金
- * @param $params
- * @return void
- */
- public function record($params)
- {
- $data['send_time'] = 0;
- $commission_day = \Yii::$app->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]);
- }
- }
|