|
|
@@ -282,360 +282,365 @@ class SettleService extends BaseService
|
|
|
*/
|
|
|
public function commissionSettle($orderId)
|
|
|
{
|
|
|
- $info = OrderModel::with(['commission'])
|
|
|
- ->where(['id' => $orderId, 'mark' => 1])
|
|
|
- ->select(['id', 'order_no', 'type', 'user_id', 'total', 'pay_total', 'bd_score', 'pay_status', 'status', 'refund_status'])
|
|
|
- ->first();
|
|
|
- $info = $info ? $info->toArray() : [];
|
|
|
- if (empty($info)) {
|
|
|
- $this->error = '结算订单不存在';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if ($info['status'] <= 1 || $info['pay_status'] == 10) {
|
|
|
- $this->error = '订单未支付';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (in_array($info['refund_status'], [1, 2, 3])) {
|
|
|
- $this->error = '订单已退款';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $orderType = isset($info['type']) ? $info['type'] : 1;
|
|
|
- $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
|
|
|
- $orderUserId = isset($info['user_id']) ? $info['user_id'] : 0;
|
|
|
- $commission = isset($info['commission']) ? $info['commission'] : [];
|
|
|
- $commissionId = isset($commission['id']) ? $commission['id'] : 0;
|
|
|
- if (empty($commission) || $commissionId <= 0) {
|
|
|
- $this->error = '结算订单收益参数错误';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if ($commission['status'] == 1) {
|
|
|
- $this->error = '订单收益已结算';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $cacheKey = "caches:ordersCommission:{$orderNo}_{$orderUserId}:";
|
|
|
- if (RedisService::get("{$cacheKey}lock")) {
|
|
|
- $this->error = '订单结算中';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 创业订单
|
|
|
- $logs = [];
|
|
|
- RedisService::set("{$cacheKey}lock", $info, 300);
|
|
|
- DB::beginTransaction();
|
|
|
- if ($orderType == 2) {
|
|
|
- // TODO 结算直推奖
|
|
|
- $directData = isset($commission['direct_bonus']) && $commission['direct_bonus'] ? json_decode($commission['direct_bonus'], true) : [];
|
|
|
- $directUserId = isset($commission['direct_uid']) ? $commission['direct_uid'] : 0;
|
|
|
- $directBonus = isset($directData['bonus']) ? $directData['bonus'] : 0;
|
|
|
- if ($directUserId > 0 && $directBonus > 0) {
|
|
|
- $directUser = isset($commission['direct_user']) ? $commission['direct_user'] : [];
|
|
|
- $directUserBalance = isset($directUser['balance']) ? $directUser['balance'] : 0;
|
|
|
- if ($directUser) {
|
|
|
- $updateData = [
|
|
|
- 'balance' => DB::raw("balance + {$directBonus}"),
|
|
|
- 'bonus_total' => DB::raw("bonus_total + {$directBonus}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!MemberModel::where(['id' => $directUserId])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- $this->error = '直推奖励结算错误';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $data = [
|
|
|
- 'user_id' => $directUserId,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 1,
|
|
|
- 'account_type' => 1, // 余额
|
|
|
- 'type' => 8,
|
|
|
- 'bonus_type' => 1,
|
|
|
- 'money' => $directBonus,
|
|
|
- 'after_money' => moneyFormat($directUserBalance + $directBonus, 2),
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time(),
|
|
|
- 'remark' => '直推奖',
|
|
|
- 'remark1' => "用户ID:{$orderUserId}购买礼包直推奖励",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // TODO 结算见单奖+分红
|
|
|
- $bonusUids = [];
|
|
|
- for ($i = 1; $i <= 6; $i++) {
|
|
|
- $uid = isset($commission["bonus_{$i}_uid"]) ? $commission["bonus_{$i}_uid"] : 0;
|
|
|
- if ($uid) {
|
|
|
- $bonusUids[] = $uid;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- $bonusUsers = MemberModel::whereIn('id', $bonusUids)
|
|
|
- ->select(['id', 'openid', 'balance', 'mobile', 'nickname', 'property', 'ls_score', 'status'])
|
|
|
- ->get()
|
|
|
- ->keyBy('id');
|
|
|
- $bonusUsers = $bonusUsers ? $bonusUsers->toArray() : [];
|
|
|
- for ($i = 1; $i <= 6; $i++) {
|
|
|
- $uid = isset($commission["bonus_{$i}_uid"]) ? $commission["bonus_{$i}_uid"] : 0;
|
|
|
- $bonusData = isset($commission["bonus_{$i}_data"]) ? $commission["bonus_{$i}_data"] : '';
|
|
|
- $bonusData = $bonusData ? json_decode($bonusData, true) : [];
|
|
|
- $jdBonus = isset($bonusData['jd_bonus']) ? $bonusData['jd_bonus'] : 0;
|
|
|
- $levelName = isset($bonusData['level_name']) ? $bonusData['level_name'] : '';
|
|
|
- $levelBonus = isset($bonusData['level_bonus']) ? $bonusData['level_bonus'] : 0;
|
|
|
- $bonusUser = isset($bonusUsers[$uid]) ? $bonusUsers[$uid] : [];
|
|
|
- $bonusUserBalance = isset($bonusUser['balance']) ? $bonusUser['balance'] : 0;
|
|
|
- $bonusTotal = moneyFormat($jdBonus + $levelBonus, 2);
|
|
|
- if ($uid && $bonusUser && $bonusTotal > 0) {
|
|
|
- $updateData = [
|
|
|
- 'balance' => DB::raw("balance + {$bonusTotal}"),
|
|
|
- 'bonus_total' => DB::raw("bonus_total + {$bonusTotal}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!MemberModel::where(['id' => $uid])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '见单和分红奖励结算错误';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if ($jdBonus > 0) {
|
|
|
- $bonusUserBalance = moneyFormat($bonusUserBalance + $jdBonus, 2);
|
|
|
- $data = [
|
|
|
- 'user_id' => $uid,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 1,
|
|
|
- 'account_type' => 1, // 余额
|
|
|
- 'type' => 8,
|
|
|
- 'bonus_type' => 2,
|
|
|
- 'money' => $jdBonus,
|
|
|
- 'after_money' => $bonusUserBalance,
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time() + $i,
|
|
|
- 'remark' => '见单奖',
|
|
|
- 'remark1' => "下{$i}级用户ID:{$orderUserId}购买礼包见单奖",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
-
|
|
|
- if ($levelBonus > 0) {
|
|
|
- $bonusUserBalance = moneyFormat($bonusUserBalance + $levelBonus, 2);
|
|
|
- $data = [
|
|
|
- 'user_id' => $uid,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 1,
|
|
|
- 'account_type' => 1, // 余额
|
|
|
- 'type' => 8,
|
|
|
- 'bonus_type' => 3,
|
|
|
- 'money' => $levelBonus,
|
|
|
- 'after_money' => $bonusUserBalance,
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time() + $i,
|
|
|
- 'remark' => '分红收益',
|
|
|
- 'remark1' => "下{$i}级用户ID:{$orderUserId}购买礼包等级[{$levelName}]分红收益",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } // 商城订单
|
|
|
- else {
|
|
|
- // TODO 商家结算
|
|
|
- $storeInfo = isset($commission['store']) ? $commission['store'] : [];
|
|
|
- $storeId = isset($commission['store_id']) ? $commission['store_id'] : 0;
|
|
|
- $storeBonus = isset($commission['bonus']) ? $commission['bonus'] : 0;
|
|
|
- $storeUserId = isset($storeInfo['user_id']) ? $storeInfo['user_id'] : 0;
|
|
|
- $storeBalance = isset($storeInfo['balance']) ? $storeInfo['balance'] : 0;
|
|
|
- if ($storeId > 0 && $storeInfo && $storeBonus > 0) {
|
|
|
- $updateData = [
|
|
|
- 'balance' => DB::raw("balance + {$storeBonus}"),
|
|
|
- 'income' => DB::raw("income + {$storeBonus}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!StoreModel::where(['id' => $storeId])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '商家提成结算失败';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $storeBalance = moneyFormat($storeBalance + $storeBonus, 2);
|
|
|
- $data = [
|
|
|
- 'user_id' => $storeUserId,
|
|
|
- 'store_id' => $storeId,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 2,
|
|
|
- 'account_type' => 1, // 余额
|
|
|
- 'type' => 7,
|
|
|
- 'bonus_type' => 0,
|
|
|
- 'money' => $storeBonus,
|
|
|
- 'after_money' => $storeBalance,
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time(),
|
|
|
- 'remark' => '商家提成结算',
|
|
|
- 'remark1' => "用户ID:{$orderUserId}购买商品提成结算",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
-
|
|
|
- // TODO 绿色积分结算
|
|
|
- $userInfo = isset($commission['user']) ? $commission['user'] : [];
|
|
|
- $userId = isset($commission['user_id']) ? $commission['user_id'] : 0;
|
|
|
- $userLsScore = isset($userInfo['ls_score']) ? $userInfo['ls_score'] : 0;
|
|
|
- $lsScore = isset($commission['ls_score']) ? $commission['ls_score'] : 0;
|
|
|
- if ($userId > 0 && $userInfo && $lsScore > 0) {
|
|
|
- $updateData = [
|
|
|
- 'ls_score' => DB::raw("ls_score + {$lsScore}"),
|
|
|
- 'ls_score_total' => DB::raw("ls_score_total + {$lsScore}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!MemberModel::where(['id' => $userId])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '绿色积分奖励结算错误';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $data = [
|
|
|
- 'user_id' => $userId,
|
|
|
- 'store_id' => 0,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 1,
|
|
|
- 'account_type' => 4, // 绿色积分
|
|
|
- 'type' => 8,
|
|
|
- 'bonus_type' => 4,
|
|
|
- 'money' => $lsScore,
|
|
|
- 'after_money' => moneyFormat($userLsScore + $lsScore, 2),
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time(),
|
|
|
- 'remark' => '绿色积分奖励',
|
|
|
- 'remark1' => "用户ID:{$orderUserId}购买商品绿色积分奖励",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // TODO 数字资产和底池
|
|
|
- $property = isset($commission['property']) ? $commission['property'] : 0;
|
|
|
- $userProperty = isset($userInfo['property']) ? $userInfo['property'] : 0;
|
|
|
- if ($userId > 0 && $userInfo && $property > 0) {
|
|
|
- $updateData = [
|
|
|
- 'property' => DB::raw("property + {$property}"),
|
|
|
- 'property_total' => DB::raw("property_total + {$property}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!MemberModel::where(['id' => $userId])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '数字资产奖励结算错误';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $data = [
|
|
|
- 'user_id' => $userId,
|
|
|
- 'store_id' => 0,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 1,
|
|
|
- 'account_type' => 2, // 数字资产
|
|
|
- 'type' => 8,
|
|
|
- 'bonus_type' => 5,
|
|
|
- 'money' => $property,
|
|
|
- 'after_money' => moneyFormat($userProperty + $property, 2),
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time(),
|
|
|
- 'remark' => '数字资产奖励',
|
|
|
- 'remark1' => "用户ID:{$orderUserId}购买商品数字资产奖励",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
-
|
|
|
- // 平台底池结算
|
|
|
- $ptAccount = PtAccountModel::where(['mark' => 1])->first();
|
|
|
- $accountId = isset($ptAccount['id']) ? $ptAccount['id'] : 0;
|
|
|
- $poolTotal = isset($ptAccount['pool_total']) ? $ptAccount['pool_total'] : 0;
|
|
|
- $ptPool = isset($commission['pt_pool']) ? $commission['pt_pool'] : 0;
|
|
|
- if ($ptAccount && ($ptPool > 0 || $property > 0)) {
|
|
|
- $updateData = [
|
|
|
- 'pool_total' => DB::raw("pool_total + {$ptPool}"),
|
|
|
- 'today_pool' => DB::raw("today_pool + {$ptPool}"),
|
|
|
- 'today_property' => DB::raw("today_property + {$property}"),
|
|
|
- 'update_time' => time()
|
|
|
- ];
|
|
|
- if (!PtAccountModel::where(['id' => $accountId])->update($updateData)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '平台底池和资产结算错误';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 底池明细
|
|
|
- if ($ptPool > 0) {
|
|
|
- $data = [
|
|
|
- 'user_id' => 0,
|
|
|
- 'store_id' => 0,
|
|
|
- 'source_order_no' => $orderNo,
|
|
|
- 'user_type' => 0,
|
|
|
- 'account_type' => 5, // 平台账户
|
|
|
- 'type' => 10,
|
|
|
- 'bonus_type' => 6,
|
|
|
- 'money' => $ptPool,
|
|
|
- 'after_money' => moneyFormat($poolTotal + $ptPool, 2),
|
|
|
- 'date' => date('Y-m-d'),
|
|
|
- 'create_time' => time(),
|
|
|
- 'remark' => '返回底池',
|
|
|
- 'remark1' => "用户ID:{$orderUserId}购买商品返回底池",
|
|
|
- 'status' => 1,
|
|
|
- 'mark' => 1
|
|
|
- ];
|
|
|
-
|
|
|
- $logs[] = $data;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // TODO 明细入表
|
|
|
- RedisService::set("{$cacheKey}logs", $logs, 3600);
|
|
|
- if ($logs && !AccountLogModel::insert($logs)) {
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '奖励明细结算处理错误';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 订单结算状态更新
|
|
|
- if(!OrderCommissionModel::where(['id'=>$commissionId])->update(['status'=>1,'arrival_at'=>date('Y-m-d H:i:s'),'update_time'=>time()])){
|
|
|
- DB::rollBack();
|
|
|
- $this->error = '订单结算状态更新失败';
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- DB::commit();
|
|
|
- $this->error = '订单结算完成';
|
|
|
- RedisService::clear("{$cacheKey}lock");
|
|
|
- RedisService::set("{$cacheKey}result", $info, 3600);
|
|
|
- return ['id' => $orderId, 'user_id' => $orderUserId, 'logs' => $logs, 'commission' => $commission];
|
|
|
+ try {
|
|
|
+ $info = OrderModel::with(['commission'])
|
|
|
+ ->where(['id' => $orderId, 'mark' => 1])
|
|
|
+ ->select(['id', 'order_no', 'type', 'user_id', 'total', 'pay_total', 'bd_score', 'pay_status', 'status', 'refund_status'])
|
|
|
+ ->first();
|
|
|
+ $info = $info ? $info->toArray() : [];
|
|
|
+ if (empty($info)) {
|
|
|
+ $this->error = '结算订单不存在';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($info['status'] <= 1 || $info['pay_status'] == 10) {
|
|
|
+ $this->error = '订单未支付';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (in_array($info['refund_status'], [1, 2, 3])) {
|
|
|
+ $this->error = '订单已退款';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $orderType = isset($info['type']) ? $info['type'] : 1;
|
|
|
+ $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
|
|
|
+ $orderUserId = isset($info['user_id']) ? $info['user_id'] : 0;
|
|
|
+ $commission = isset($info['commission']) ? $info['commission'] : [];
|
|
|
+ $commissionId = isset($commission['id']) ? $commission['id'] : 0;
|
|
|
+ if (empty($commission) || $commissionId <= 0) {
|
|
|
+ $this->error = '结算订单收益参数错误';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($commission['status'] == 1) {
|
|
|
+ $this->error = '订单收益已结算';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $cacheKey = "caches:ordersCommission:{$orderNo}_{$orderUserId}:";
|
|
|
+ if (RedisService::get("{$cacheKey}lock")) {
|
|
|
+ $this->error = '订单结算中';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创业订单
|
|
|
+ $logs = [];
|
|
|
+ RedisService::set("{$cacheKey}lock", $info, 300);
|
|
|
+ DB::beginTransaction();
|
|
|
+ if ($orderType == 2) {
|
|
|
+ // TODO 结算直推奖
|
|
|
+ $directData = isset($commission['direct_bonus']) && $commission['direct_bonus'] ? json_decode($commission['direct_bonus'], true) : [];
|
|
|
+ $directUserId = isset($commission['direct_uid']) ? $commission['direct_uid'] : 0;
|
|
|
+ $directBonus = isset($directData['bonus']) ? $directData['bonus'] : 0;
|
|
|
+ if ($directUserId > 0 && $directBonus > 0) {
|
|
|
+ $directUser = isset($commission['direct_user']) ? $commission['direct_user'] : [];
|
|
|
+ $directUserBalance = isset($directUser['balance']) ? $directUser['balance'] : 0;
|
|
|
+ if ($directUser) {
|
|
|
+ $updateData = [
|
|
|
+ 'balance' => DB::raw("balance + {$directBonus}"),
|
|
|
+ 'bonus_total' => DB::raw("bonus_total + {$directBonus}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!MemberModel::where(['id' => $directUserId])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ $this->error = '直推奖励结算错误';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $directUserId,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 1,
|
|
|
+ 'account_type' => 1, // 余额
|
|
|
+ 'type' => 8,
|
|
|
+ 'bonus_type' => 1,
|
|
|
+ 'money' => $directBonus,
|
|
|
+ 'after_money' => moneyFormat($directUserBalance + $directBonus, 2),
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time(),
|
|
|
+ 'remark' => '直推奖',
|
|
|
+ 'remark1' => "用户ID:{$orderUserId}购买礼包直推奖励",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO 结算见单奖+分红
|
|
|
+ $bonusUids = [];
|
|
|
+ for ($i = 1; $i <= 6; $i++) {
|
|
|
+ $uid = isset($commission["bonus_{$i}_uid"]) ? $commission["bonus_{$i}_uid"] : 0;
|
|
|
+ if ($uid) {
|
|
|
+ $bonusUids[] = $uid;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $bonusUsers = MemberModel::whereIn('id', $bonusUids)
|
|
|
+ ->select(['id', 'openid', 'balance', 'mobile', 'nickname', 'property', 'ls_score', 'status'])
|
|
|
+ ->get()
|
|
|
+ ->keyBy('id');
|
|
|
+ $bonusUsers = $bonusUsers ? $bonusUsers->toArray() : [];
|
|
|
+ for ($i = 1; $i <= 6; $i++) {
|
|
|
+ $uid = isset($commission["bonus_{$i}_uid"]) ? $commission["bonus_{$i}_uid"] : 0;
|
|
|
+ $bonusData = isset($commission["bonus_{$i}_data"]) ? $commission["bonus_{$i}_data"] : '';
|
|
|
+ $bonusData = $bonusData ? json_decode($bonusData, true) : [];
|
|
|
+ $jdBonus = isset($bonusData['jd_bonus']) ? $bonusData['jd_bonus'] : 0;
|
|
|
+ $levelName = isset($bonusData['level_name']) ? $bonusData['level_name'] : '';
|
|
|
+ $levelBonus = isset($bonusData['level_bonus']) ? $bonusData['level_bonus'] : 0;
|
|
|
+ $bonusUser = isset($bonusUsers[$uid]) ? $bonusUsers[$uid] : [];
|
|
|
+ $bonusUserBalance = isset($bonusUser['balance']) ? $bonusUser['balance'] : 0;
|
|
|
+ $bonusTotal = moneyFormat($jdBonus + $levelBonus, 2);
|
|
|
+ if ($uid && $bonusUser && $bonusTotal > 0) {
|
|
|
+ $updateData = [
|
|
|
+ 'balance' => DB::raw("balance + {$bonusTotal}"),
|
|
|
+ 'bonus_total' => DB::raw("bonus_total + {$bonusTotal}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!MemberModel::where(['id' => $uid])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '见单和分红奖励结算错误';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($jdBonus > 0) {
|
|
|
+ $bonusUserBalance = moneyFormat($bonusUserBalance + $jdBonus, 2);
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 1,
|
|
|
+ 'account_type' => 1, // 余额
|
|
|
+ 'type' => 8,
|
|
|
+ 'bonus_type' => 2,
|
|
|
+ 'money' => $jdBonus,
|
|
|
+ 'after_money' => $bonusUserBalance,
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time() + $i,
|
|
|
+ 'remark' => '见单奖',
|
|
|
+ 'remark1' => "下{$i}级用户ID:{$orderUserId}购买礼包见单奖",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($levelBonus > 0) {
|
|
|
+ $bonusUserBalance = moneyFormat($bonusUserBalance + $levelBonus, 2);
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 1,
|
|
|
+ 'account_type' => 1, // 余额
|
|
|
+ 'type' => 8,
|
|
|
+ 'bonus_type' => 3,
|
|
|
+ 'money' => $levelBonus,
|
|
|
+ 'after_money' => $bonusUserBalance,
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time() + $i,
|
|
|
+ 'remark' => '分红收益',
|
|
|
+ 'remark1' => "下{$i}级用户ID:{$orderUserId}购买礼包等级[{$levelName}]分红收益",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // 商城订单
|
|
|
+ else {
|
|
|
+ // TODO 商家结算
|
|
|
+ $storeInfo = isset($commission['store']) ? $commission['store'] : [];
|
|
|
+ $storeId = isset($commission['store_id']) ? $commission['store_id'] : 0;
|
|
|
+ $storeBonus = isset($commission['bonus']) ? $commission['bonus'] : 0;
|
|
|
+ $storeUserId = isset($storeInfo['user_id']) ? $storeInfo['user_id'] : 0;
|
|
|
+ $storeBalance = isset($storeInfo['balance']) ? $storeInfo['balance'] : 0;
|
|
|
+ if ($storeId > 0 && $storeInfo && $storeBonus > 0) {
|
|
|
+ $updateData = [
|
|
|
+ 'balance' => DB::raw("balance + {$storeBonus}"),
|
|
|
+ 'income' => DB::raw("income + {$storeBonus}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!StoreModel::where(['id' => $storeId])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '商家提成结算失败';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $storeBalance = moneyFormat($storeBalance + $storeBonus, 2);
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $storeUserId,
|
|
|
+ 'store_id' => $storeId,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 2,
|
|
|
+ 'account_type' => 1, // 余额
|
|
|
+ 'type' => 7,
|
|
|
+ 'bonus_type' => 0,
|
|
|
+ 'money' => $storeBonus,
|
|
|
+ 'after_money' => $storeBalance,
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time(),
|
|
|
+ 'remark' => '商家提成结算',
|
|
|
+ 'remark1' => "用户ID:{$orderUserId}购买商品提成结算",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO 绿色积分结算
|
|
|
+ $userInfo = isset($commission['user']) ? $commission['user'] : [];
|
|
|
+ $userId = isset($commission['user_id']) ? $commission['user_id'] : 0;
|
|
|
+ $userLsScore = isset($userInfo['ls_score']) ? $userInfo['ls_score'] : 0;
|
|
|
+ $lsScore = isset($commission['ls_score']) ? $commission['ls_score'] : 0;
|
|
|
+ if ($userId > 0 && $userInfo && $lsScore > 0) {
|
|
|
+ $updateData = [
|
|
|
+ 'ls_score' => DB::raw("ls_score + {$lsScore}"),
|
|
|
+ 'ls_score_total' => DB::raw("ls_score_total + {$lsScore}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!MemberModel::where(['id' => $userId])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '绿色积分奖励结算错误';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'store_id' => 0,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 1,
|
|
|
+ 'account_type' => 4, // 绿色积分
|
|
|
+ 'type' => 8,
|
|
|
+ 'bonus_type' => 4,
|
|
|
+ 'money' => $lsScore,
|
|
|
+ 'after_money' => moneyFormat($userLsScore + $lsScore, 2),
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time(),
|
|
|
+ 'remark' => '绿色积分奖励',
|
|
|
+ 'remark1' => "用户ID:{$orderUserId}购买商品绿色积分奖励",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // TODO 数字资产和底池
|
|
|
+ $property = isset($commission['property']) ? $commission['property'] : 0;
|
|
|
+ $userProperty = isset($userInfo['property']) ? $userInfo['property'] : 0;
|
|
|
+ if ($userId > 0 && $userInfo && $property > 0) {
|
|
|
+ $updateData = [
|
|
|
+ 'property' => DB::raw("property + {$property}"),
|
|
|
+ 'property_total' => DB::raw("property_total + {$property}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!MemberModel::where(['id' => $userId])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '数字资产奖励结算错误';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'store_id' => 0,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 1,
|
|
|
+ 'account_type' => 2, // 数字资产
|
|
|
+ 'type' => 8,
|
|
|
+ 'bonus_type' => 5,
|
|
|
+ 'money' => $property,
|
|
|
+ 'after_money' => moneyFormat($userProperty + $property, 2),
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time(),
|
|
|
+ 'remark' => '数字资产奖励',
|
|
|
+ 'remark1' => "用户ID:{$orderUserId}购买商品数字资产奖励",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 平台底池结算
|
|
|
+ $ptAccount = PtAccountModel::where(['mark' => 1])->first();
|
|
|
+ $accountId = isset($ptAccount['id']) ? $ptAccount['id'] : 0;
|
|
|
+ $poolTotal = isset($ptAccount['pool_total']) ? $ptAccount['pool_total'] : 0;
|
|
|
+ $ptPool = isset($commission['pt_pool']) ? $commission['pt_pool'] : 0;
|
|
|
+ if ($ptAccount && ($ptPool > 0 || $property > 0)) {
|
|
|
+ $updateData = [
|
|
|
+ 'pool_total' => DB::raw("pool_total + {$ptPool}"),
|
|
|
+ 'today_pool' => DB::raw("today_pool + {$ptPool}"),
|
|
|
+ 'today_property' => DB::raw("today_property + {$property}"),
|
|
|
+ 'update_time' => time()
|
|
|
+ ];
|
|
|
+ if (!PtAccountModel::where(['id' => $accountId])->update($updateData)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '平台底池和资产结算错误';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 底池明细
|
|
|
+ if ($ptPool > 0) {
|
|
|
+ $data = [
|
|
|
+ 'user_id' => 0,
|
|
|
+ 'store_id' => 0,
|
|
|
+ 'source_order_no' => $orderNo,
|
|
|
+ 'user_type' => 0,
|
|
|
+ 'account_type' => 5, // 平台账户
|
|
|
+ 'type' => 10,
|
|
|
+ 'bonus_type' => 6,
|
|
|
+ 'money' => $ptPool,
|
|
|
+ 'after_money' => moneyFormat($poolTotal + $ptPool, 2),
|
|
|
+ 'date' => date('Y-m-d'),
|
|
|
+ 'create_time' => time(),
|
|
|
+ 'remark' => '返回底池',
|
|
|
+ 'remark1' => "用户ID:{$orderUserId}购买商品返回底池",
|
|
|
+ 'status' => 1,
|
|
|
+ 'mark' => 1
|
|
|
+ ];
|
|
|
+
|
|
|
+ $logs[] = $data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO 明细入表
|
|
|
+ RedisService::set("{$cacheKey}logs", $logs, 3600);
|
|
|
+ if ($logs && !AccountLogModel::insert($logs)) {
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '奖励明细结算处理错误';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 订单结算状态更新
|
|
|
+ if(!OrderCommissionModel::where(['id'=>$commissionId])->update(['status'=>1,'arrival_at'=>date('Y-m-d H:i:s'),'update_time'=>time()])){
|
|
|
+ DB::rollBack();
|
|
|
+ $this->error = '订单结算状态更新失败';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ $this->error = '订单结算完成';
|
|
|
+ RedisService::clear("{$cacheKey}lock");
|
|
|
+ RedisService::set("{$cacheKey}result", $info, 3600);
|
|
|
+ return ['id' => $orderId, 'user_id' => $orderUserId, 'logs' => $logs, 'commission' => $commission];
|
|
|
+ } catch (\Exception $exception){
|
|
|
+ RedisService::set("caches:settles:{$orderId}", ['error'=>$exception->getMessage(),'trace'=>$exception->getTrace()], 7200);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|