Commit 033d5f6c by yink

feat: 新增用户积分列表和员工绑定用户列表接口

新增了获取用户积分明细列表的接口,支持分页和按创建时间倒序排列。同时,新增了查询员工绑定用户列表的接口,仅员工角色可访问,支持分页和按绑定时间倒序排列。这些改动旨在提供更详细的数据查询功能,便于用户和管理员查看相关记录。
parent 657119da
...@@ -95,7 +95,7 @@ protected function form() ...@@ -95,7 +95,7 @@ protected function form()
$form = Form::make(Merchant::with(['store_desc']), function (Form $form) { $form = Form::make(Merchant::with(['store_desc']), function (Form $form) {
$form->display('id'); $form->display('id');
$form->text('name')->required(); $form->text('name')->required();
$form->text('contacts', '联系人'); $form->text('contacts', '联系人');
$form->text('phone'); $form->text('phone');
$form->text('account')->required(); $form->text('account')->required();
$form->text('pwd')->help('字母数字组合,长度大于5个字符'); $form->text('pwd')->help('字母数字组合,长度大于5个字符');
......
...@@ -16,4 +16,5 @@ public function getList() ...@@ -16,4 +16,5 @@ public function getList()
return $this->JsonResponse($list); return $this->JsonResponse($list);
} }
} }
...@@ -349,7 +349,7 @@ public function pay(Request $request) ...@@ -349,7 +349,7 @@ public function pay(Request $request)
} }
//扣除积分 //扣除积分
if (!UserPointChangeRec::pointChangeRecord($userObj->id, $order_amount, 0, 2, 1, $order_id)) { if (!UserPointChangeRec::pointChangeRecord($userObj->id, $order_amount, 0, 3, 1, $order_id)) {
return $this->JsonResponse('', '网络异常,积分抵扣失败!002', 500); return $this->JsonResponse('', '网络异常,积分抵扣失败!002', 500);
} }
...@@ -414,7 +414,14 @@ public function orderList(Request $request) ...@@ -414,7 +414,14 @@ public function orderList(Request $request)
$page = $request->page ?? 1; $page = $request->page ?? 1;
$limit = $request->limit ?? 10; $limit = $request->limit ?? 10;
$sql = OrderInfoModel::where(['user_id' => $request->user()->id, 'deleted_at' => null]);
$user_id = $request->user_id ;
//如果传入user_id 则查询该用户的订单,验证当前用户是否核销员
if (!$user_id) {
$user_id =$request->user()->id;
}
$sql = OrderInfoModel::where(['user_id' => $user_id, 'deleted_at' => null]);
if ($status >= 0) { if ($status >= 0) {
$sql = $sql->where(['order_status' => $status]); $sql = $sql->where(['order_status' => $status]);
...@@ -609,7 +616,7 @@ public function scanCodeVerifi(Request $request) ...@@ -609,7 +616,7 @@ public function scanCodeVerifi(Request $request)
//$orderObj->save(); //$orderObj->save();
try { try {
//接入微信小程序发货管理 //接入微信小程序发货管理
Log::add('是否核销126', []); Log::add('scanCodeVerifi', $orderObj);
//付款记录 //付款记录
$recordObj = PaymentRecord::where('order_sn', $orderObj->order_sn)->first(); $recordObj = PaymentRecord::where('order_sn', $orderObj->order_sn)->first();
if (!$recordObj) { if (!$recordObj) {
...@@ -734,11 +741,18 @@ public function OrderInfo(Request $request) ...@@ -734,11 +741,18 @@ public function OrderInfo(Request $request)
if (!$orderObj) { if (!$orderObj) {
return $this->JsonResponse('', '参数错误', 201); return $this->JsonResponse('', '参数错误', 201);
} }
$user_id = $request->user()->id;
if ($orderObj->user_id != $user_id) {
return $this->JsonResponse('', '非本人订单', 201); $user_id = $request->user_id ;
//如果传入user_id 则查询该用户的订单,验证当前用户是否核销员
if (!$user_id) {
$user_id =$request->user()->id;
} }
// if ($orderObj->user_id != $user_id) {
// return $this->JsonResponse('', '非本人订单', 201);
// }
//商品信息 //商品信息
$order_goods = $this->getOrderGoods($order_id); $order_goods = $this->getOrderGoods($order_id);
//快递待收点、收货地址 //快递待收点、收货地址
......
...@@ -21,12 +21,12 @@ public function getList(Request $request) ...@@ -21,12 +21,12 @@ public function getList(Request $request)
$type = $request->type ?? 0; $type = $request->type ?? 0;
$page = $request->page ?? 1; $page = $request->page ?? 1;
$limit = $request->limit ?? 10; $limit = $request->limit ?? 10;
if (!in_array($type, [1, 2, 3])) { if (!in_array($type, [3,5])) {
return $this->JsonResponse('', '参数错误', 201); return $this->JsonResponse('', '参数错误', 201);
} }
$userObj = $request->user(); $userObj = $request->user();
$um_id = ($type == 3) ? $userObj->merchant_id : $userObj->id; $um_id = ($type == 3) ? $userObj->merchant_id : $userObj->member_id;
$sql = OrderDivideRecord::where(['um_id' => $um_id, 'sh_type' => $type, 'deleted_at' => null]); $sql = OrderDivideRecord::where(['um_id' => $um_id, 'sh_type' => $type, 'is_div' => 1, 'deleted_at' => null]);
$total = $sql->count(); $total = $sql->count();
$data = [ $data = [
'total' => $total, 'total' => $total,
...@@ -37,7 +37,7 @@ public function getList(Request $request) ...@@ -37,7 +37,7 @@ public function getList(Request $request)
if ($listData->toArray()) { if ($listData->toArray()) {
foreach ($listData as $kk => $vv) { foreach ($listData as $kk => $vv) {
$data['list'][] = [ $data['list'][] = [
'title' => isset(OrderDivideRecord::COMMISSION_TYPE[$vv->sh_type]) ? OrderDivideRecord::COMMISSION_TYPE[$vv->sh_type] : '', 'title' =>'用户取货佣金',
'created_at' => date("Y-m-d H:i:s", strtotime($vv->created_at)), 'created_at' => date("Y-m-d H:i:s", strtotime($vv->created_at)),
'divide_price' => $vv->divide_price 'divide_price' => $vv->divide_price
]; ];
......
...@@ -6,16 +6,21 @@ ...@@ -6,16 +6,21 @@
use App\Command\Log; use App\Command\Log;
use App\Handlers\FileUploadHandler; use App\Handlers\FileUploadHandler;
use App\Models\Merchant; use App\Models\Merchant;
use App\Models\OrderDivideRecord;
use App\Models\OrderInfo;
use App\Models\Store; use App\Models\Store;
use App\Models\StoreAdminUsers; use App\Models\StoreAdminUsers;
use App\Models\UserPermission; use App\Models\UserPermission;
use App\Models\PersonalAccessToken; use App\Models\PersonalAccessToken;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use App\Models\OrderGoods;
use App\Models\Good;
use Illuminate\Support\Facades\DB;
class StoreAdminUsersController extends BaseController class StoreAdminUsersController extends BaseController
{ {
/** /**
* 用户登录方法 * 用户登录方法
* *
* @param Request $request HTTP请求对象 * @param Request $request HTTP请求对象
...@@ -23,10 +28,11 @@ class StoreAdminUsersController extends BaseController ...@@ -23,10 +28,11 @@ class StoreAdminUsersController extends BaseController
*/ */
public function login(Request $request) public function login(Request $request)
{ {
$user_type = $request->user_type ?? ''; //用户类型,1:商家端,2:核销员端,3:员工端
$username = $request->username ?? ''; $username = $request->username ?? '';
$password = $request->password ?? ''; $password = $request->password ?? '';
$user = StoreAdminUsers::where(['username' => $username])->first(); $user = StoreAdminUsers::where(['username' => $username, 'role_id' => $user_type])->first();
if (!$user) { if (!$user) {
return $this->JsonResponse('', '用户不存在', 201); return $this->JsonResponse('', '用户不存在', 201);
...@@ -70,54 +76,277 @@ public function logout(Request $request) ...@@ -70,54 +76,277 @@ public function logout(Request $request)
public function info(Request $request) public function info(Request $request)
{ {
$muser = $request->user(); $muser = $request->user();
$buycode = '';
$merchant_id = $muser->merchant_id; $merchant_id = $muser->merchant_id;
$store_id = $muser->store_id;
$total_revenue = $balance = $cashout = 0;
$store_name = $merchant_name = '';
if ($merchant_id) {
$merObj = Merchant::where('id', $merchant_id)->first();
$buycode = $merObj->buycode;
$phone = $merObj->phone;
$merchant_name = $merObj->name;
$total_revenue = $merObj->total_revenue ?? 0;
$balanceValue = $merObj->balance ?? 0;
// 使用 Tools 类计算 T+1 未到账金额
$pendingCashout = Tools::calculatePendingCashout($merchant_id);
// 调整金额计算公式
$displayBalance = $balanceValue + $pendingCashout;
$displayCashout = $total_revenue - $displayBalance;
$balance = number_format($displayBalance, 2, '.', '');
$cashout = number_format($displayCashout, 2, '.', '');
Log::add('balance金额', $balance);
Log::add('cashout金额', $cashout);
}
if ($store_id) { $total_revenue = $balance = $cashout = 0; //总收益,冻结中,已体现
$storeObj = Store::where('id', $store_id)->first(); // $store_name = $merchant_name = $phone = $buycode = ''; //店铺名称,商户名称,手机号,购买码
$store_name = $storeObj->title;
$phone = $storeObj->phone; $balance01=$balance02=0;//临时使用
$orderDivideRecord = [];
if ($muser->role_id == 2) { //核销员
//无需任何信息,直接返回
} else {
//查询冻结中+已提现,加起来就是总金额
if ($muser->role_id == 1) { //商户
//分佣记录[商户]
$orderDivideRecord = OrderDivideRecord::where(['um_id' => $merchant_id])->select('divide_price', 'is_div', 'created_at')->orderBy('created_at', 'desc')->get();
//订单状态为已支付,未分账的应该分佣金额
$balance01=$this->getCommissionAmount(1,$merchant_id);
Log::info('balance01:'.$balance01);
} else {//员工
//分佣记录[员工]
$orderDivideRecord = OrderDivideRecord::where(['um_id' => $muser->member_id])->select('divide_price', 'is_div', 'created_at')->orderBy('created_at', 'desc')->get();
//订单状态为已支付,未分账的应该分佣金额
$balance01=$this->getCommissionAmount(2,$muser->id);
}
//分佣记录中,状态为0的,未绑卡的
$balance02= $orderDivideRecord->where('is_div', 0)->sum('divide_price'); //冻结中
//已提现==分佣记录中,状态为2的
$cashout= $orderDivideRecord->where('is_div', 1)->sum('divide_price'); //已分账
//冻结中=分佣记录中,状态为1的+订单状态为已支付,未分账的应该分佣金额
$balance= $balance01+ $balance02; //冻结中
$total_revenue= $balance+ $cashout; //总佣金
Log::info('balance:'.$balance);
} }
return $this->JsonResponse([ $data=[
'user_id' => $muser->id, 'user_id' => $muser->id,
'username' => $muser->username, 'username' => $muser->username,
'merchant_name' => $merchant_name, 'role_id' => $muser->role_id,
'phone' => $phone,
'openid' => $muser->openid ?? '', 'openid' => $muser->openid ?? '',
'avatar' => $muser->avatar ? env('IMAGE_URL') . $muser->avatar : env('NO_AVATAR_IMAGE_URL'), 'avatar' => $muser->avatar ? env('IMAGE_URL') . $muser->avatar : env('NO_AVATAR_IMAGE_URL'),
'merchant_id' => $muser->merchant_id, 'merchant_id' => $muser->merchant_id,
'buycode' => $buycode, 'phone' => '',//前端未展示
'buycode' => $muser->merchant ? $muser->merchant->buycode : '', // 增加空值判断
'total_revenue' => $total_revenue, 'total_revenue' => $total_revenue,
'balance' => $balance, 'balance' => $balance,
'cashout' => $cashout, 'cashout' => $cashout,
'role_id' => $muser->role_id, 'store_name' => $muser->store ? $muser->store->title : '', // 增加空值判断
'store_name' => $store_name 'merchant_name' => $muser->merchant ? $muser->merchant->name : '', // 增加空值判断
];
return $this->JsonResponse($data);
}
/**
* 查询员工绑定用户列表
*
* @param Request $request HTTP请求对象
* @return \Illuminate\Http\JsonResponse JSON响应
*
* 返回数据结构:
* {
* "total": 总记录数,
* "list": [
* {
* "id": 记录ID,
* "user_id": 用户ID,
* "username": 用户名,
* "avatar": 用户头像,
* "created_at": 绑定时间,
* "memo": 备注信息
* }
* ]
* }
*
* 使用示例:
* GET /api/store-admin/employee-user-list
*
* 注意事项:
* 1. 仅员工角色可访问此接口
* 2. 默认返回最近10条记录
* 3. 支持分页参数page和limit
* 4. 按创建时间倒序排列
*/
public function getEmployeeUserList(Request $request)
{
$muser = $request->user();
$page = $request->page ?? 1;
$limit = $request->limit ?? 10;
// 验证员工角色
if ($muser->role_id != 3) {
return $this->JsonResponse('', '无权限访问', 403);
}
$query = DB::table('store_employee_user_rec')
->leftJoin('users', 'users.id', '=', 'store_employee_user_rec.user_id')
->where('store_employee_user_rec.employee_id', $muser->id)
->orderBy('store_employee_user_rec.created_at', 'DESC');
$total = $query->count();
$list = $query->offset(($page - 1) * $limit)
->limit($limit)
->get([
'store_employee_user_rec.user_id',
'users.name',
'users.phone',
'users.avatar',
'store_employee_user_rec.created_at',
'store_employee_user_rec.memo'
])
->map(function ($item) {
$item->avatar = $item->avatar ? env('IMAGE_URL') . $item->avatar : env('NO_AVATAR_IMAGE_URL');
return $item;
});
return $this->JsonResponse([
'total' => $total,
'list' => $list
]); ]);
} }
//------------------------------------------------------------------------------//
//------------------------------以下是内部使用-----------------------------------//
/**
* 查询已支付订单,未分佣,属于对应用户的冻结金额
*
* @param int $type 查询类型:1-商家冻结金额,2-员工冻结金额
* @param int $obj_id 查询对象ID:商家ID或员工ID
* @return float 冻结金额(保留2位小数)
* @throws \Exception 当查询对象不存在时抛出异常
* 注意事项:
* 1. 该方法仅查询已支付(pay_type≠2)且未分佣(is_div=0)的订单
* 2. 商家分佣计算:(商品数量*商品价格*商家佣金比例)/100
* 3. 员工分佣计算:(商品数量*商品价格*商家佣金比例*员工佣金比例)/10000
* 4. 混合支付(pay_type=2)会计算现金支付比例调整分佣金额
* 5. 所有金额计算保留2位小数
*/
public function getCommissionAmount($type, $obj_id)
{
$objUser = [];
$orderObjList = [];
if ($type == 1) {
$objUser = Merchant::find($obj_id);
//查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select('
SELECT
log.id,
loi.pay_type,
log.goods_id,
loi.order_amount,
log.goods_price,
log.goods_number,
-- 计算总的商品价格
COALESCE(log.goods_number*log.goods_price, 0) AS total_price,
-- 计算总的商户佣金
COALESCE((log.goods_number*log.goods_price * lg.merchant_commission)/100, 0) AS total_merchant_commission,
-- 计算总的商户员工佣金
COALESCE((log.goods_number * log.goods_price * lg.merchant_commission * sau.employee_commission) / 10000, 0) AS total_employee_commission
FROM
li_order_goods log
LEFT JOIN
li_order_info loi ON loi.id = log.order_id
LEFT JOIN
store_employee_user_rec seur ON seur.user_id = loi.user_id
LEFT JOIN
store_admin_users sau ON sau.id = seur.employee_id
LEFT JOIN
li_goods lg ON lg.id = log.goods_id
WHERE
loi.pay_type<>2 and loi.is_div=0 and loi.merchant_id = ?; ', [$obj_id]);
// Log::add('zhu3',$obj_id);
// Log::add('zhu2',$orderObjList);
} else {
$objUser = StoreAdminUsers::find($obj_id);
//查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select('
SELECT
log.id,
loi.pay_type,
log.goods_id,
loi.order_amount,
log.goods_price,
log.goods_number,
-- 计算总的商品价格
COALESCE(log.goods_number*log.goods_price, 0) AS total_price,
-- 计算总的商户佣金
COALESCE((log.goods_number*log.goods_price * lg.merchant_commission)/100, 0) AS total_merchant_commission,
-- 计算总的商户员工佣金
COALESCE((log.goods_number * log.goods_price * lg.merchant_commission * sau.employee_commission) / 10000, 0) AS total_employee_commission
FROM
li_order_goods log
LEFT JOIN
li_order_info loi ON loi.id = log.order_id
LEFT JOIN
li_goods lg ON lg.id = log.goods_id
LEFT JOIN
store_admin_users sau ON sau.id = ?
WHERE
loi.pay_type<>2 and loi.is_div=0 and loi.user_id
in (
select user_id from store_employee_user_rec where employee_id=?
); ', [$obj_id, $obj_id]);
Log::add('zhu3',$obj_id);
}
//遍历列表,计算实际佣金
$totalCommission = 0;
//Log::add('zhu',$orderObjList);
foreach ($orderObjList as $orderObj) {
$cash_ratio = 1; //现金支付比例,默认100%
//判断是否是混合支付
if ($orderObj->pay_type == 3) {
//计算现金支付比例
$cash_ratio = number_format(($orderObj->order_amount / $orderObj->total_price) , 4); //保留4位小数
}
//应该分给商家的金额
$merchant_divide_price = number_format($orderObj->total_merchant_commission * $cash_ratio, 2);
//应该分给员工的金额
$employee_divide_price =number_format($merchant_divide_price * ($objUser->employee_commission / 100), 2);
Log::add('zhu7',$employee_divide_price);
//判断计算商家还是员工
if ($type == 1) {
$totalCommission += $merchant_divide_price-$employee_divide_price;
}else{
$totalCommission += $employee_divide_price;
}
}
return $totalCommission;
}
} }
...@@ -499,4 +499,87 @@ public function bindBuycode(Request $request) ...@@ -499,4 +499,87 @@ public function bindBuycode(Request $request)
return $this->JsonResponse(''); return $this->JsonResponse('');
} }
//获取用户积分列表
/**
* 获取用户积分明细列表
*
* @param Request $request HTTP请求对象
* @return \Illuminate\Http\JsonResponse JSON响应
*
* 返回数据结构:
* {
* "total": 总记录数,
* "list": [
* {
* "id": 记录ID,
* "point_amount": 积分变动金额,
* "change_type": 变动类型(1-增加,2-减少),
* "point_state": 积分状态(1-可用,2-解冻中,3-冻结中),
* "source": "来源中文描述",
* "created_at": 创建时间
* }
* ]
* }
*
* 使用示例:
* GET /api/user/point-list
*
* 注意事项:
* 1. 默认返回最近30条记录
* 2. 支持分页参数page和limit
* 3. 按创建时间倒序排列
*/
public function getUserPointList(Request $request)
{
$user = $request->user();
$page = $request->page ?? 1;
$limit = $request->limit ?? 30;
$query = UserPointChangeRec::where('user_id', $user->id)
->orderBy('created_at', 'DESC');
$total = $query->count();
$list = $query->offset(($page - 1) * $limit)
->limit($limit)
->get([
'id',
'point_amount',
'change_type',
'point_state',
'source',
'created_at'
])
->map(function ($item) {
$item->source = UserPointChangeRec::source[$item->source] ?? '未知来源';
return $item;
});
return $this->JsonResponse([
'total' => $total,
'list' => $list
]);
}
} }
...@@ -24,6 +24,8 @@ class OrderDivideRecord extends Model ...@@ -24,6 +24,8 @@ class OrderDivideRecord extends Model
5 => '员工', 5 => '员工',
]; ];
/** /**
* 收益分配 * 收益分配
...@@ -49,6 +51,7 @@ public static function divide($order_id, $payconfirm_no = '') ...@@ -49,6 +51,7 @@ public static function divide($order_id, $payconfirm_no = '')
'employee_amount' => 0, 'employee_amount' => 0,
]; ];
$hfCompanyMObj =[];
//商户是否实名 //商户是否实名
$isMerchantRealName = 0; $isMerchantRealName = 0;
if ($merchant_id) { if ($merchant_id) {
...@@ -60,6 +63,9 @@ public static function divide($order_id, $payconfirm_no = '') ...@@ -60,6 +63,9 @@ public static function divide($order_id, $payconfirm_no = '')
$employee = DB::table('store_employee_user_rec') $employee = DB::table('store_employee_user_rec')
->where('user_id', $buyer_id) ->where('user_id', $buyer_id)
->first(); ->first();
$hfEmployeeMObj =[];
//员工是否实名
$isEmployeeRealName = 0; $isEmployeeRealName = 0;
if ($employee) { if ($employee) {
$employeeObj = StoreAdminUsers::find($employee->employee_id); $employeeObj = StoreAdminUsers::find($employee->employee_id);
...@@ -68,6 +74,22 @@ public static function divide($order_id, $payconfirm_no = '') ...@@ -68,6 +74,22 @@ public static function divide($order_id, $payconfirm_no = '')
} }
$ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品 $ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品
$cash_ratio=1;//现金支付比例,默认100%
//判断支付类型,纯现金还是现金+积分,计算订单内商品金额与实付金额比例,最终分佣为实付金额的比例
if ($orderObj->pay_type == 1) { //纯现金支付
$cash_ratio = 1;
} else if ($orderObj->pay_type == 3) { //混合支付(现金+积分)
//计算订单商品总金额(单价*数量)
$orderGoodCash = OrderGoods::where("order_id", $order_id)
->select(DB::raw('SUM(goods_price * goods_number) as total'))
->value('total');
//计算现金支付比例
$cash_ratio =number_format( ($orderObj->order_amount / $orderGoodCash) * 100,4);//保留4位小数
}
Log::info("订单ID:{$order_id},支付类型:{$orderObj->pay_type},现金支付比例:{$cash_ratio}");
foreach ($ogList as $kk => $item) { foreach ($ogList as $kk => $item) {
$goods_amount = $item->goods_price * $item->goods_number; $goods_amount = $item->goods_price * $item->goods_number;
$total_amount += $goods_amount; $total_amount += $goods_amount;
...@@ -77,36 +99,38 @@ public static function divide($order_id, $payconfirm_no = '') ...@@ -77,36 +99,38 @@ public static function divide($order_id, $payconfirm_no = '')
$merchant_proportion .= $goodObj->merchant_commission . ","; $merchant_proportion .= $goodObj->merchant_commission . ",";
$sp_ogid = $item->id . ","; $sp_ogid = $item->id . ",";
//商户分佣记录 //应该分给商家的金额
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) { $merchant_divide_price = number_format($goods_amount * ($merchant_commission / 100)*$cash_ratio , 2);
$divide_price = number_format($goods_amount * ($merchant_commission / 100), 2); $employee_divide_price =0;
// 如果有员工绑定,扣除员工佣金部分
if ($employee && $employeeObj->commission_rate >= 1 && $employeeObj->commission_rate < 100) {
$employee_divide = number_format($divide_price * ($employeeObj->commission_rate / 100), 2);
$divide_price -= $employee_divide;
}
//收益直接到商户账户
$merObj = Merchant::find($merchant_id);
//汇付参数
$member_id = $hfCompanyMObj->member_id;
if ($member_id) {
$merObj->total_revenue += $divide_price;
$merObj->save();
$commissionPreData['merchant_member_id'] = $member_id;
$commissionPreData['merchant_amount'] += $divide_price;
}
}
//员工分佣记录 //员工分佣记录
if ($employee && $employeeObj->commission_rate >= 1 && $employeeObj->commission_rate < 100) { if ($employee && $employeeObj->commission_rate >= 1 && $employeeObj->commission_rate < 100) {
// 基于商家分到佣金计算员工分佣 // 基于商家分到佣金计算员工分佣
$merchant_divide_price = number_format($goods_amount * ($merchant_commission / 100), 2);
$employee_divide_price = number_format($merchant_divide_price * ($employeeObj->commission_rate / 100), 2); $employee_divide_price = number_format($merchant_divide_price * ($employeeObj->commission_rate / 100), 2);
$employeePreData['employee_amount'] += $employee_divide_price; $employeePreData['employee_amount'] += $employee_divide_price;
$employeePreData['employee_member_id'] = $hfEmployeeMObj->member_id; $employeePreData['employee_member_id'] = $hfEmployeeMObj->member_id;
} }
//商户分佣记录
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) {
$merchant_divide_price = $merchant_divide_price-$employee_divide_price;
$commissionPreData['merchant_amount'] += $merchant_divide_price;
$commissionPreData['merchant_member_id'] = $hfCompanyMObj->member_id;
// //收益直接到商户账户->【改成实时查询了,不记录总的佣金】
// $merObj = Merchant::find($merchant_id);
// //汇付参数
// $member_id = $hfCompanyMObj->member_id;
// if ($member_id) {
// $merObj->total_revenue += $divide_price;
// $merObj->save();
// }
}
} }
//商户佣金 //商户佣金
......
<?php
<?php
namespace App\Models;
use App\Command\Log;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
class OrderDivideRecord extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'order_divide_record';
public const COMMISSION_TYPE = [
1 => '直推佣金',//需求调整,不在分账,改成积分,支付时抵扣
2 => '间推佣金',//需求调整,不在分账,改成积分,支付时抵扣
3 => '用户取货佣金',
4 => '手动调账分账',
];
/**
* 收益分配
* order_id 订单ID
* payconfirm_no 发起确认支付,订单流水号
*/
public static function divide($order_id, $payconfirm_no = '')
{
$div_members = []; //汇付 分账对象
$orderObj = OrderInfo::find($order_id);
$merchant_id = $orderObj->merchant_id; //绑定的商户
$buyer_id = $orderObj->user_id; //下单用户ID
$userObj = User::find($buyer_id);
$spuid = $userObj->spuid; //直推分享人
$second_spuid = $userObj->second_spuid; //间推分享人
$total_amount = 0; //订单商品总价
$first_proportion = $second_proportion = $merchant_proportion = ''; //佣金比例
$sp_ogid = ''; //参与分佣商品ID
$commissionPreData = [
'first_member_id' => '',
'first_amount' => 0,
'second_member_id' => '',
'second_amount' => 0,
'merchant_member_id' => '',
'merchant_amount' => 0,
];
//直推是否实名
$isFirstRealName = 0;
if ($spuid) {
$isFirstRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $spuid])->count();
}
//间推是否实名
$isSecondRealName = 0;
if ($second_spuid) {
$isSecondRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $second_spuid])->count();
}
//商户是否实名
$isMerchantRealName = 0;
if ($merchant_id) {
$hfCompanyMObj = HfCompanyMember::where('merchant_id', $merchant_id)->first();
$isMerchantRealName = ($hfCompanyMObj->status == 'succeeded') ? 1 : 0;
}
$ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品
foreach ($ogList as $kk => $item) {
$goods_amount = $item->goods_price * $item->goods_number;
$total_amount += $goods_amount;
//商品信息
$goodObj = Good::find($item->goods_id);
$merchant_commission = $goodObj->merchant_commission;
$first_commission = $goodObj->first_commission;
$second_commission = $goodObj->second_commission;
$first_proportion .= $goodObj->first_commission . ",";
$second_proportion .= $goodObj->second_commission . ",";
$merchant_proportion .= $goodObj->merchant_commission . ",";
$sp_ogid = $item->id . ",";
//直推佣金
if ($spuid && $first_commission >= 1 && $first_commission < 100) {
$divide_price = number_format($goods_amount * ($first_commission / 100), 2);
$spObj = User::find($spuid);
//汇付参数
if ($spObj->member_id) {
$spObj->total_revenue += $divide_price; //总余额记录
$spObj->save();
//self::addRecord($item->id, $order_id, $goods_amount, $divide_price, $first_commission, $spuid, $user_id, 1, $isExistAccount);
$commissionPreData['first_member_id'] = $spObj->member_id;
$commissionPreData['first_amount'] += $divide_price;
}
}
//间推佣金
if ($second_spuid && $second_commission >= 1 && $second_commission < 100) {
$divide_price = number_format($goods_amount * ($second_commission / 100), 2);
$spObj = User::find($second_spuid);
//汇付参数
if ($spObj->member_id) {
$spObj->total_revenue += $divide_price;
$spObj->save();
$commissionPreData['second_member_id'] = $spObj->member_id;
$commissionPreData['second_amount'] += $divide_price;
}
}
//商户分佣记录
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) {
$divide_price = number_format($goods_amount * ($merchant_commission / 100), 2);
//收益直接到商户账户
$merObj = Merchant::find($merchant_id);
//汇付参数
$member_id = $hfCompanyMObj->member_id;
if ($member_id) {
$merObj->total_revenue += $divide_price;
$merObj->save();
$commissionPreData['merchant_member_id'] = $member_id;
$commissionPreData['merchant_amount'] += $divide_price;
}
}
}
//组合分账参数
//直推佣金
if ($spuid && $first_commission >= 1 && $first_commission < 100 && $commissionPreData['first_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['first_amount'], $first_proportion, $spuid, $buyer_id, 1, $isFirstRealName, $payconfirm_no);
if ($isFirstRealName) {
array_push($div_members, ['member_id' => $commissionPreData['first_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['first_amount']), 'fee_flag' => 'N']);
}
}
//间推佣金
if ($second_spuid && $second_commission >= 1 && $second_commission < 100 && $commissionPreData['second_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['second_amount'], $second_proportion, $second_spuid, $buyer_id, 2, $isSecondRealName, $payconfirm_no);
if ($isSecondRealName) {
array_push($div_members, ['member_id' => $commissionPreData['second_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['second_amount']), 'fee_flag' => 'N']);
}
}
//商户佣金
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100 && $commissionPreData['merchant_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['merchant_amount'], $merchant_proportion, $merchant_id, $buyer_id, 3, $isMerchantRealName, $payconfirm_no);
if ($isMerchantRealName) {
array_push($div_members, ['member_id' => $commissionPreData['merchant_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['merchant_amount']), 'fee_flag' => 'N']);
}
}
//平台本身
$aimeiyuePrice = $total_amount - $commissionPreData['first_amount'] - $commissionPreData['second_amount'] - $commissionPreData['merchant_amount'];
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $aimeiyuePrice, '', 0, $buyer_id, 0, 1, $payconfirm_no);
array_push($div_members, ['member_id' => 0, 'amount' => sprintf("%.2f", $aimeiyuePrice), 'fee_flag' => 'Y']);
//确认分佣金额
if (!$isFirstRealName) {
$commissionPreData['first_amount'] = 0;
}
if (!$isSecondRealName) {
$commissionPreData['second_amount'] = 0;
}
if (!$isMerchantRealName) {
$commissionPreData['merchant_amount'] = 0;
}
$confirm_amt = $aimeiyuePrice + $commissionPreData['first_amount'] + $commissionPreData['second_amount'] + $commissionPreData['merchant_amount'];
return ['div_members' => $div_members, 'confirm_amt' => sprintf("%.2f", $confirm_amt)];
}
//新增分账记录
public static function addRecord($og_id, $order_id, $goods_amount, $divide_price, $commission = '', $um_id = 0, $buyer_id, $sh_type = 0, $isExistAccount, $payconfirm_no)
{
$recordObj = new self();
$recordObj->order_id = $order_id;
$recordObj->user_id = $buyer_id;
$recordObj->og_id = trim($og_id, ',');
$recordObj->order_price = $goods_amount;
$recordObj->divide_price = $divide_price;
$recordObj->proportion = trim($commission, ',');
$recordObj->um_id = $um_id;
$recordObj->sh_type = $sh_type;
$recordObj->is_div = $isExistAccount ? 1 : 0; //是否分账
$recordObj->payconfirm_no = $isExistAccount ? $payconfirm_no : '';
$recordObj->save();
Log::add('订单分佣记录', $recordObj->toArray());
}
public function order()
{
return $this->belongsTo(OrderInfo::class, 'order_id', 'id');
}
public function users()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
}
...@@ -113,6 +113,10 @@ ...@@ -113,6 +113,10 @@
Route::get('user-info', 'UserController@info'); //获取小程序端用户资料 Route::get('user-info', 'UserController@info'); //获取小程序端用户资料
Route::get('get-user-point-list', 'UserController@getUserPointList'); //获取小程序端用户资料
Route::get('get-employee-user-list', 'StoreAdminUsersController@getEmployeeUserList'); //查询员工绑定用户列表
Route::get('merchant-info', 'StoreAdminUsersController@info'); //获取商户端用户资料 Route::get('merchant-info', 'StoreAdminUsersController@info'); //获取商户端用户资料
Route::post('merchant-login', 'LoginController@merchantLogin'); //商户端授权登录 Route::post('merchant-login', 'LoginController@merchantLogin'); //商户端授权登录
...@@ -193,7 +197,7 @@ ...@@ -193,7 +197,7 @@
/*------------------------------商户端------------------------------------*/ /*------------------------------商户端------------------------------------*/
Route::get('commission-list', 'OrderDivideRecordController@getList'); //直推、间推明细 Route::get('commission-list', 'OrderDivideRecordController@getList'); //直推、间推明细--【商户、员工分佣明细】
Route::get('income-list', 'IncomeController@getList'); //用户提现明细 Route::get('income-list', 'IncomeController@getList'); //用户提现明细
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment