Commit 033d5f6c by yink

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

新增了获取用户积分明细列表的接口,支持分页和按创建时间倒序排列。同时,新增了查询员工绑定用户列表的接口,仅员工角色可访问,支持分页和按绑定时间倒序排列。这些改动旨在提供更详细的数据查询功能,便于用户和管理员查看相关记录。
parent 657119da
......@@ -16,4 +16,5 @@ public function getList()
return $this->JsonResponse($list);
}
}
......@@ -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);
}
......@@ -414,7 +414,14 @@ public function orderList(Request $request)
$page = $request->page ?? 1;
$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) {
$sql = $sql->where(['order_status' => $status]);
......@@ -609,7 +616,7 @@ public function scanCodeVerifi(Request $request)
//$orderObj->save();
try {
//接入微信小程序发货管理
Log::add('是否核销126', []);
Log::add('scanCodeVerifi', $orderObj);
//付款记录
$recordObj = PaymentRecord::where('order_sn', $orderObj->order_sn)->first();
if (!$recordObj) {
......@@ -734,11 +741,18 @@ public function OrderInfo(Request $request)
if (!$orderObj) {
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);
//快递待收点、收货地址
......
......@@ -21,12 +21,12 @@ public function getList(Request $request)
$type = $request->type ?? 0;
$page = $request->page ?? 1;
$limit = $request->limit ?? 10;
if (!in_array($type, [1, 2, 3])) {
if (!in_array($type, [3,5])) {
return $this->JsonResponse('', '参数错误', 201);
}
$userObj = $request->user();
$um_id = ($type == 3) ? $userObj->merchant_id : $userObj->id;
$sql = OrderDivideRecord::where(['um_id' => $um_id, 'sh_type' => $type, 'deleted_at' => null]);
$um_id = ($type == 3) ? $userObj->merchant_id : $userObj->member_id;
$sql = OrderDivideRecord::where(['um_id' => $um_id, 'sh_type' => $type, 'is_div' => 1, 'deleted_at' => null]);
$total = $sql->count();
$data = [
'total' => $total,
......@@ -37,7 +37,7 @@ public function getList(Request $request)
if ($listData->toArray()) {
foreach ($listData as $kk => $vv) {
$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)),
'divide_price' => $vv->divide_price
];
......
......@@ -499,4 +499,87 @@ public function bindBuycode(Request $request)
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
]);
}
}
......@@ -25,6 +25,8 @@ class OrderDivideRecord extends Model
];
/**
* 收益分配
* @param int $order_id 订单ID
......@@ -49,6 +51,7 @@ public static function divide($order_id, $payconfirm_no = '')
'employee_amount' => 0,
];
$hfCompanyMObj =[];
//商户是否实名
$isMerchantRealName = 0;
if ($merchant_id) {
......@@ -60,6 +63,9 @@ public static function divide($order_id, $payconfirm_no = '')
$employee = DB::table('store_employee_user_rec')
->where('user_id', $buyer_id)
->first();
$hfEmployeeMObj =[];
//员工是否实名
$isEmployeeRealName = 0;
if ($employee) {
$employeeObj = StoreAdminUsers::find($employee->employee_id);
......@@ -68,6 +74,22 @@ public static function divide($order_id, $payconfirm_no = '')
}
$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) {
$goods_amount = $item->goods_price * $item->goods_number;
$total_amount += $goods_amount;
......@@ -77,36 +99,38 @@ public static function divide($order_id, $payconfirm_no = '')
$merchant_proportion .= $goodObj->merchant_commission . ",";
$sp_ogid = $item->id . ",";
//商户分佣记录
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) {
$divide_price = number_format($goods_amount * ($merchant_commission / 100), 2);
// 如果有员工绑定,扣除员工佣金部分
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;
}
}
//应该分给商家的金额
$merchant_divide_price = number_format($goods_amount * ($merchant_commission / 100)*$cash_ratio , 2);
$employee_divide_price =0;
//员工分佣记录
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);
$employeePreData['employee_amount'] += $employee_divide_price;
$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 @@
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::post('merchant-login', 'LoginController@merchantLogin'); //商户端授权登录
......@@ -193,7 +197,7 @@
/*------------------------------商户端------------------------------------*/
Route::get('commission-list', 'OrderDivideRecordController@getList'); //直推、间推明细
Route::get('commission-list', 'OrderDivideRecordController@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