Commit 758d00b5 by yink

feat: 添加汇付个人用户管理功能并优化分账逻辑

新增汇付个人用户管理模块,包括路由、控制器及语言文件。优化订单分账逻辑,调整佣金类型顺序,并增加员工实名验证。移除普通小程序用户的汇付绑定逻辑,仅在员工管理中创建汇付账户。同时,优化支付记录和分账记录的管理界面,增加筛选条件和导出功能。
parent ea6c7efb
<?php
namespace App\Admin\Controllers;
use App\Command\Log;
use App\Models\HfSettleAccount;
use App\Models\HfProvAreaCode;
use App\Models\Adapay;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Widgets\Card;
use App\Models\Merchant;
use Illuminate\Support\Facades\DB;
class HfSettleAccountController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new HfSettleAccount(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->model()->orderBy('created_at', 'DESC');
$grid->column('member_type', '用户类型')->display(function ($val) {
return $val == 1 ? '商户' : '普通用户';
});
$grid->column('mid', '用户/商户ID');
$grid->column('card_name', '户名');
$grid->column('cert_id', '证件号')->display(function ($val) {
if (strlen($val) <= 4) {
return $val; // 如果长度小于等于4位,直接显示
}
return substr($val, 0, 2) . '****' . substr($val, -2);
});
$grid->column('tel_no', '手机号');
//$grid->column('bank_name', '开户银行');
$grid->column('bank_acct_type', '账号类型')->display(function ($val) {
return $val == 1 ? '对公' : '对私';
});
$grid->column('account_id', '结算账户号');
$grid->disableViewButton();
$grid->disableDeleteButton();
$grid->disableRowSelector();
$grid->disableViewButton();
$grid->disableEditButton();
$grid->disableCreateButton();
$grid->disableActions();
$grid->simplePaginate();
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->like('card_name', '户名')->width(3);
$filter->like('tel_no', '手机号')->width(3);
$filter->equal('member_type', '用户类型')->select([
0 => '普通用户',
1 => '商户'
])->width(3);
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new HfSettleAccount(), function (Form $form) {
$form->display('id');
$form->radio('member_type', '用户类型')
->options([0 => '普通用户', 1 => '商户'])
->default(0)
->required();
// $form->text('mid', '用户/商户ID')->required();
// $form->text('card_id', '银行卡号')->required();
// $form->text('card_name', '户名')->required();
// $form->text('cert_id', '证件号')->required();
// $form->select('cert_type', '证件类型')
// ->options(['00' => '身份证', '01' => '护照', '02' => '军官证'])
// ->default('00')
// ->required();
// $form->text('tel_no', '手机号')->required();
// $form->text('bank_code', '银行编号')->required();
// $form->text('bank_name', '开户银行')->required();
// $form->radio('bank_acct_type', '账号类型')
// ->options([1 => '对公', 2 => '对私'])
// ->default(1)
// ->required();
// $form->text('account_id', '结算账户号')->required();
// $form->select('prov_code', '省份')
// ->options(HfProvAreaCode::where('parent_id', 0)->pluck('title', 'area_code'))
// ->rules('required')
// ->load('area_code', '/hf-area-code');
// $form->select('area_code', '城市')->required();
$form->disableCreatingCheck();
$form->disableEditingCheck();
$form->disableViewCheck();
$form->disableDeleteButton();
$form->disableViewButton();
});
}
}
......@@ -43,13 +43,16 @@ protected function grid()
$name = '平台';
} else if ($stype == 3) {
$name = Merchant::where('id', $val)->value('name');
}else if($stype == 5){
} else if ($stype == 5) {
$name = StoreAdminUsers::where('id', $val)->value('name');
}
return $name;
});
$grid->column('remark', '备注')->width(80);
$grid->column('created_at');
//$grid->column('updated_at')->sortable();
......@@ -58,6 +61,10 @@ protected function grid()
$grid->disableEditButton();
$grid->disableDeleteButton();
$grid->disableRowSelector();
// 隐藏操作按钮
$grid->disableActions(); // 隐藏所有操作按钮
$grid->disableCreateButton(); // 隐藏新增按钮
$grid->disableDeleteButton(); // 隐藏删除按钮
// 添加导出字段映射
$titles = [
......@@ -76,20 +83,19 @@ protected function grid()
$grid->export($titles)->rows(function ($rows) {
foreach ($rows as $index => &$row) {
// 处理分佣类型显示
$row['is_div'] = $row['is_div'] == 1? '是' : '否';
$row['um_id'] = $row['um_id'] == 0? '平台' : $row['um_id'];
$row['is_div'] = $row['is_div'] == 1 ? '是' : '否';
$row['um_id'] = $row['um_id'] == 0 ? '平台' : $row['um_id'];
// 处理商家/员工显示
if ($row['sh_type'] == 0) {
$row['um_id'] = '平台';
} else if ($row['sh_type'] == 3) {
$row['um_id'] = Merchant::where('id', $row['um_id'])->value('name');
}else if($row['sh_type'] == 5){
} else if ($row['sh_type'] == 5) {
$row['um_id'] = StoreAdminUsers::where('id', $row['um_id'])->value('name');
}
$row['sh_type'] = OrderDivideRecord::COMMISSION_TYPE[$row['sh_type']];
}
return $rows;
});
......@@ -99,28 +105,34 @@ protected function grid()
$filter->panel();
$filter->like('order.order_sn', '订单号')->width(3);
$filter->like('users.phone', '下单会员手机号')->width(3);
// 修改分佣类型筛选为下拉选择
$filter->equal('sh_type', '分佣类型')->select(OrderDivideRecord::COMMISSION_TYPE)->width(3);
// 修改分佣类型筛选为下拉选择
$filter->equal('is_div', '是否已分账')->select([0 => '否', 1 => '是'])->width(3);
// 添加商家筛选
$filter->where('merchant_id', function ($query) {
$query->whereHas('order', function ($q) {
$q->where('merchant_id', $this->input);
});
$filter->where('um_id2', function ($query) {
$query->where('sh_type', 3) // 只筛选sh_type=3的记录
->whereHas('order', function ($q) {
$q->where('um_id', $this->input);
});
}, '商家')->select(Merchant::pluck('name', 'id'))->width(3);
// 添加员工筛选
$filter->where('staff_id', function ($query) {
$query->whereHas('order', function ($q) {
$q->where('staff_id', $this->input);
});
}, '员工')->select(StoreAdminUsers::pluck('name', 'id'))->width(3);
$filter->where('um_id3', function ($query) {
$query->where('sh_type', 5) // 只筛选sh_type=5的记录
->whereHas('order', function ($q) {
$q->where('um_id', $this->input);
});
}, '员工')->select(StoreAdminUsers::where('role_id', 3)->pluck('name', 'id'))->width(3);
// 添加时间范围快捷筛选
$filter->scope('today', '今日')->whereDate('created_at', date('Y-m-d'));
$filter->scope('month', '本月')->whereMonth('created_at', date('m'));
$filter->scope('quarter', '本季度')->where(function ($query) {
$month = date('m');
$year = date('Y');
if ($month >= 1 && $month <= 3) {
// 第一季度 (1-3月)
$start = date('Y-m-d', strtotime('first day of January'));
......@@ -138,11 +150,11 @@ protected function grid()
$start = date('Y-m-d', strtotime('first day of October'));
$end = date('Y-m-d', strtotime('last day of December'));
}
$query->whereBetween('created_at', [$start, $end]);
});
$filter->scope('year', '本年')->whereYear('created_at', date('Y'));
$filter->between('created_at', '创建时间')->datetime()->width(4);
});
......
......@@ -21,27 +21,53 @@ protected function grid()
{
return Grid::make(PaymentRecord::with(['user']), function (Grid $grid) {
$grid->addTableClass(['table-text-center']);
$grid->model()->orderBy('created_at','DESC');
$grid->model()->orderBy('created_at', 'DESC');
$grid->column('id')->sortable();
$grid->column('order_sn','订单号');
$grid->column('other_order','外部订单ID');
$grid->column('payment_id','支付ID')->limit(10);
$grid->column('party_order_id','支付订单ID')->limit(10);
$grid->column('money','金额');
$grid->column('uid','用户ID');
$grid->column('user.name','用户');
$grid->column('created_at','支付时间');
$grid->column('order_sn', '订单号');
$grid->column('other_order', '外部订单ID');
$grid->column('payment_id', '支付ID')->limit(10);
$grid->column('party_order_id', '支付订单ID')->limit(10);
$grid->column('money', '金额');
$grid->column('uid', '用户ID');
$grid->column('user.name', '用户');
$grid->column('created_at', '支付时间');
$grid->disableViewButton();
$grid->disableEditButton();
$grid->disableCreateButton();
$grid->disableActions();
$grid->simplePaginate();
$grid->disableFilterButton();
$grid->quickSearch('user.name')->placeholder('搜索用户');
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->panel();
// 用户ID筛选
$filter->equal('uid', '用户ID')->width(3);
// 用户名称筛选
$filter->like('user.name', '用户名称')->width(3);
// 订单号筛选
$filter->like('order_sn', '订单号')->width(3);
// 金额筛选
$filter->between('money', '金额范围', function ($query) {
if (isset($this->input['min'])) {
$query->where('money', '>=', $this->input['min']);
}
if (isset($this->input['max'])) {
$query->where('money', '<=', $this->input['max']);
}
})->width(4);
// 时间区间筛选
$filter->between('created_at', '支付时间')->datetime()->width(4);
// 快捷时间筛选
$filter->scope('today', '今日')->whereDate('created_at', date('Y-m-d'));
$filter->scope('month', '本月')->whereMonth('created_at', date('m'));
$filter->scope('year', '本年')->whereYear('created_at', date('Y'));
});
});
}
......
......@@ -27,6 +27,7 @@ protected function grid()
$grid->model()->orderBy('created_at', 'DESC');
$grid->column('id')->sortable();
$grid->column('name', '姓名');
$grid->column('phone', '手机号');
$grid->column('username', '登录账号');
$grid->column('merchant.name', '所属商家');
$grid->column('store.title', '所属门店');
......@@ -75,7 +76,8 @@ protected function form()
$form->display('id');
//$form->ignore(['pwd']); // 忽略password字段
$form->text('name')->required();
$form->text('username','登录账号')
$form->text('phone', '手机号')->required();
$form->text('username', '登录账号')
->required()
->help('字母数字组合,长度大于5个字符')
->rules(function (Form $form) {
......@@ -88,7 +90,7 @@ protected function form()
*/
$rule = 'unique:store_admin_users,username';
if ($id = $form->model()->id) {
$rule .= ','.$id;
$rule .= ',' . $id;
}
return $rule;
}, [
......@@ -106,7 +108,7 @@ protected function form()
$form->text('pwd', '密码')->help('密码为空则不修改');
}
$form->text('employee_commission', '员工返佣比例')->help("在商家佣金中的比例,如:20")->required();
$form->hidden('role_id')->default(3); //员工
// 如果是创建模式,执行相关操作
......@@ -115,6 +117,18 @@ protected function form()
->load('store_id', '/get-store-list');
$form->select('store_id', '门店名称');
//判断是否创建汇付账户,先查询是否存在
$user = StoreAdminUsers::find($form->getKey());
//对接汇付-创建个人对象
if ($user && !$user->member_id) {
$result = (new Adapay())->createMember($user->id, $form->input('phone'));
if (isset($result['status']) && $result['status'] == 'succeeded') {
$user->member_id = $result['member_id'];
$user->save();
}
}
$form->disableCreatingCheck();
$form->disableEditingCheck();
$form->disableViewCheck();
......
......@@ -94,5 +94,6 @@
$router->resource('user-point-change-rec', 'UserPointChangeRecController'); //积分记录
$router->resource('payment-record', 'PaymentRecordController'); //支付记录
$router->resource('hf-settle-account', 'HfSettleAccountController'); //汇付普通用户
});
......@@ -105,13 +105,13 @@ public function login(Request $request)
$user->total_revenue = 0;
$user->save();
}
//对接汇付-创建个人对象
if (!$user->member_id) {
$result = (new Adapay())->createMember($user->id, $user->phone);
if (isset($result['status']) && $result['status'] == 'succeeded') {
DB::table('users')->where('id', $user->id)->update(['member_id' => $result['member_id']]);
}
}
// //对接汇付-创建个人对象【普通小程序用户已经不用绑定汇付了】
// if (!$user->member_id) {
// $result = (new Adapay())->createMember(uid: $user->id, $user->phone);
// if (isset($result['status']) && $result['status'] == 'succeeded') {
// DB::table('users')->where('id', $user->id)->update(['member_id' => $result['member_id']]);
// }
// }
//生成token
$accessToken = 'Bearer ' . $user->createToken('Access-token')->plainTextToken;
......@@ -188,10 +188,10 @@ public function testLogin(Request $request)
$user = User::find($uid);
$accessToken = 'Bearer ' . $user->createToken('Access-token')->plainTextToken;
//对接汇付-创建个人对象
if (!$user->member_id) {
(new Adapay())->createMember($user->id, $user->phone);
}
// //对接汇付-创建个人对象
// if (!$user->member_id) {
// (new Adapay())->createMember($user->id, $user->phone);
// }
return $this->JsonResponse(['Authorization' => $accessToken,]);
}
......@@ -228,12 +228,14 @@ public function simulateLogin(Request $request)
public function test(Request $request)
{
$id = $request->id ?? 7;
$orderObj= OrderInfo::find($id);
// $id = $request->id ?? 7;
// $orderObj= OrderInfo::find($id);
userPointChangeRec::pointUnfreezeimg($orderObj);
//userPointChangeRec::pointUnfreezeimg($orderObj);
$result = (new Adapay())->createMember(78, '18173329012');
return $this->JsonResponse(['id' => $id]);
return $this->JsonResponse(['data' => $result]);
}
......
......@@ -325,7 +325,7 @@ public function refundNotify($params)
return false;
}
//创建个人用户
//创建个人用户【小程序用户没有分佣,可以不用了,这个函数给员工用】
public function createMember($uid, $phone)
{
$member = new \NwVVVS\AdapaySdk\Member();
......@@ -333,7 +333,7 @@ public function createMember($uid, $phone)
# app_id
"app_id" => Adapay::APP_ID,
# 用户id
"member_id" => "mm_" . $uid,
"member_id" => "em_" . $uid,
# 用户手机号
"tel_no" => $phone,
);
......
......@@ -17,11 +17,11 @@ class OrderDivideRecord extends Model
//佣金类别-//就是字段sh_type
public const COMMISSION_TYPE = [
0 => '平台',
3 => '商户',
5 => '员工',
1 => '直推', //需求调整,不再分账,改成积分,支付时抵扣
2 => '间推', //需求调整,不再分账,改成积分,支付时抵扣
3 => '商户',
4 => '手动调账分账',
5 => '员工',
];
......@@ -74,10 +74,13 @@ public static function divide($order_id, $payconfirm_no = '')
//打印分账员工
Log::add('divide', "订单ID:{$order_id},分账员工:{$employeeObj->name}");
$hfEmployeeMObj = HfCompanyMember::where('merchant_id', $employeeObj->merchant_id)->first();
$isEmployeeRealName = ($hfEmployeeMObj->status == 'succeeded') ? 1 : 0;
$hfEmployeeMObj = HfSettleAccount::whereNotNull('deleted_at')
::where('mid', $employeeObj->id)->first();
$isEmployeeRealName = ($hfEmployeeMObj) ? 1 : 0;
}
Log::info("实名情况:isMerchantRealName:{$isMerchantRealName};isEmployeeRealName:{$isEmployeeRealName}");
$ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品
$cash_ratio = 1; //现金支付比例,默认100%
......@@ -114,8 +117,6 @@ public static function divide($order_id, $payconfirm_no = '')
//员工分佣记录
if ($employee && $employeeObj->commission_rate >= 1 && $employeeObj->commission_rate < 100) {
//应该分给商家的金额
Log::add('divide', "员工分佣:{$employee}, 员工分佣记录:{$employee_divide_price}, 商户分佣记录:{$merchant_divide_price}");
......
<?php
return [
'labels' => [
'HfSettleAccount' => '汇付个人用户',
'city' => 'City',
],
'fields' => [
'province_id' => '省份',
'city_id' => '城市',
],
'options' => [],
];
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