multi-store/app/api/controller/user/UserController.php
mkm 40ec3e5ee0 feat: 修改了订单相关的API,优化了支付逻辑;
fix: 修复了用户地址、商品库存等错误;
refactor: 重构了登录逻辑,提高了代码可读性;
style: 调整了代码格式,使其更加规范;
test: 增加了订单支付的测试用例;
docs: 更新了相关文档;
build: 更新了依赖;
ops: 优化了服务器性能;
chore: 更新了.gitignore文件;
2024-08-27 11:56:48 +08:00

368 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\controller\user;
use app\api\controller\BaseApiController;
use app\api\lists\user_sign\UserSignLists;
use app\api\lists\user_sign_log\UserSignLogLists;
use app\api\logic\user\UserLogic;
use app\api\service\UserTokenService;
use app\api\validate\UserValidate;
use app\common\enum\PayEnum;
use app\common\logic\CapitalFlowLogic;
use app\common\logic\PaymentLogic;
use app\common\model\store_extract\StoreExtract;
use app\common\model\user\User;
use app\common\model\user\UserAddress;
use app\common\model\user_ship\UserShip;
use app\common\model\user_sign\UserSign;
use support\Cache;
use think\Exception;
use think\facade\Db;
/**
* 用户控制器
* Class UserController
* @package app\api\controller
*/
class UserController extends BaseApiController
{
public $notNeedLogin = ['login_sms'];
// #[
// ApiDoc\Title('获取小程序手机号'),
// ApiDoc\url('/api/user/user/getMobileByMnp'),
// ApiDoc\Method('POST'),
// ApiDoc\Param(name: "code", type: "string", require: true, desc: "换取手机的code"),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function getMobileByMnp()
{
$params = (new UserValidate())->post()->goCheck('getMobileByMnp');
$params['user_id'] = $this->userId;
$result = UserLogic::getMobileByMnp($params);
if ($result && is_numeric($result)) {
$data = UserLogic::info($result);
$userInfo = UserTokenService::setToken($result, 1);
$data['token'] = $userInfo['token'];
} else {
$data = UserLogic::info($this->userId);
}
return $this->success('绑定成功', $data, 1, 1);
}
// #[
// ApiDoc\Title('用户个人信息'),
// ApiDoc\url('/api/user/user/info'),
// ApiDoc\Method('POST'),
// ApiDoc\Param(),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function info()
{
$params=$this->request->post();
return $this->success('success', UserLogic::info($this->userId,$params));
}
// #[
// ApiDoc\Title('充值金额'),
// ApiDoc\url('/api/user/user/rechange_amount'),
// ApiDoc\Method('Get'),
// ApiDoc\Param(),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function rechange_amount()
{
$res = UserLogic::rechange_level();
return $this->success('ok', $res);
}
// #[
// ApiDoc\Title('小程序充值'),
// ApiDoc\url('/api/user/user/recharge'),
// ApiDoc\Method('POST'),
// ApiDoc\Param(name: "price", type: "string", require: true, desc: "金额"),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function recharge()
{
$params = (new UserValidate())->post()->goCheck('rechargeMoney');
$params['uid'] = $this->userId;
$params['channel_type'] = $this->userInfo['terminal'];
$order = UserLogic::recharge($params);
$redirectUrl = $params['redirect'] ?? '/pages/payment/payment';
$result = PaymentLogic::pay(PayEnum::WECHAT_PAY_MINI, 'recharge', $order, $this->userInfo['terminal'], $redirectUrl);
return $this->success('', $result);
}
// #[
// ApiDoc\Title('会员账户详情'),
// ApiDoc\url('/api/user/user/capital_flow'),
// ApiDoc\Method('POST'),
// ApiDoc\Param(name: "page_no", type: "int", require: true, desc: "默认1页数"),
// ApiDoc\Param(name: "page_size", type: "int", require: false, desc: "条数默认15"),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function capital_flow()
{
$page_no = (int)$this->request->post('page_no', 1);
$page_size = (int)$this->request->post('page_size', 15);
$params['page_no'] = $page_no;
$params['page_size'] = $page_size;
if (empty($page_no) || empty($page_size)) {
$params['page_no'] = 1;
$params['page_size'] = 15;
}
$res = UserLogic::capital_list($this->userId, $params);
$res['page_no'] = $params['page_no'];
$res['page_size'] = $params['page_size'];
return $this->success('ok', $res);
}
// #[
// ApiDoc\Title('会员账户统计'),
// ApiDoc\url('/api/user/user/capital_count'),
// ApiDoc\Method('POST'),
// ApiDoc\Param(),
// ApiDoc\NotHeaders(),
// ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
// ApiDoc\ResponseSuccess("data", type: "array"),
// ]
public function capital_count()
{
$res = UserLogic::capital_count($this->userId);
return $this->success('ok', $res);
}
public function send_sms()
{
$res = (new UserLogic())->dealSendSms($this->userId);
if ($res) {
return $this->success('发送成功');
}
return $this->fail('发送失败');
}
//登录
public function login_sms()
{
$params = (new UserValidate())->post()->goCheck('login');
$res = (new UserLogic())->dealLoginSms($params['account']);
if ($res) {
return $this->success('发送成功');
}
return $this->fail('发送失败');
}
//报备
public function reporting_sms()
{
$params = (new UserValidate())->post()->goCheck('login');
$res = (new UserLogic())->dealReportingSms($params['account']);
if ($res) {
return $this->success('发送成功', [], 1, 1);
}
return $this->fail('发送失败');
}
public function set_payPassword()
{
$params = (new UserValidate())->post()->goCheck('setPayPassword');
$remark = $this->userId . '_payPassword';
$code = Cache::get($remark);
if ($code && isset($params['code']) && $code !== $params['code']) {
return $this->fail('验证码错误');
}
if ($params['rePassword'] !== $params['password'])
return $this->fail('两次密码不一致');
$result = UserLogic::dealPayPassword($params, $this->userId);
if (!$result) {
return $this->fail('设置失败');
}
return $this->success('设置成功');
}
//修改
// public function withdrawalPassword()
// {
// $data = $this->request->params(['repassword', 'password', 'sms_code']);
// $sms_code = app()->make(SmsService::class)->checkSmsCode($this->user->phone, $data['sms_code'], 'change_pwd');
// if (!$data['sms_code'] || !$sms_code) {
// return app('json')->fail('验证码不正确');
// }
// if (!$this->user->phone)
// return app('json')->fail('请先绑定手机号');
// if (empty($data['repassword']) || empty($data['password']))
// return app('json')->fail('请输入提现密码');
// if ($data['repassword'] !== $data['password'])
// return app('json')->fail('两次密码不一致');
// $password = $this->repository->encodePassword($data['password']);
// $this->repository->update($this->request->uid(), ['withdrawal_pwd' => $password]);
// return app('json')->success('绑定成功');
//
// }
//采购款明细、余额明细、礼品券明细、返还金明细
public function fundList()
{
(new UserValidate())->get()->goCheck('fund');
$page_no = (int)$this->request->get('page_no', 1);
$page_size = (int)$this->request->get('page_size', 15);
$params = $this->request->get();
$params['page_no'] = $page_no > 0 ? $page_no : 1;
$params['page_size'] = $page_size > 0 ? $page_size : 15;
$res = UserLogic::dealDetails($params, $this->userId);
$integral = User::where('id', $this->userId)->value('integral');
$number = UserSign::where('id', $this->userId)->where('status', 0)->sum('number');
$GetNumber = UserSign::where('id', $this->userId)->where('status', 1)->sum('number');
$res['page_no'] = $params['page_no'];
$res['page_size'] = $params['page_size'];
$res['extend'] = [
'integral' => $integral,
'number' => $number,
'get_number' => $GetNumber
];
return $this->success('ok', $res);
}
/**
* 礼品券/冻结券
*/
public function userSing()
{
(new UserValidate())->get()->goCheck('fund');
$type = (int)$this->request->get('type', 1);
if ($type == 1) {
return $this->dataLists(new UserSignLists());
} else {
return $this->dataLists(new UserSignLogLists());
}
}
/**
* 用户信息
*/
public function other_user_info()
{
$mobile = $this->request->get('mobile');
if ($mobile) {
$user = User::where('mobile', $mobile)->field('id,avatar,real_name,nickname,mobile,user_ship,purchase_funds,label_id')->find();
if ($user) {
$address = UserAddress::where('uid', $user['id'])->where('is_default', 1)->find();
if ($address) {
$city_name = Db::name('geo_city')->where('city_code', $address['city'])->value('city_name');
$area_name = Db::name('geo_area')->where('area_code', $address['area'])->value('area_name');
$street_name = Db::name('geo_street')->where('street_code', $address['street'])->value('street_name');
$village_name = Db::name('geo_village')->where('village_code', $address['village'])->value('village_name');
$brigade_name = Db::name('geo_brigade')->where('id', $address['brigade'])->value('brigade_name');
$address['address_like'] = $city_name . $area_name . $street_name . $village_name . $brigade_name;
}
$user['ship_name'] = $user['user_ship'] > 0 ? UserShip::where('id', $user['user_ship'])->value('title') : '';
$user['address_info'] = $address;
return $this->success('ok', $user->toArray());
} else {
return $this->fail('用户不存在', [], 0, 0);
}
}
return $this->success('ok', []);
}
/**
* 提现信息
*/
public function cash_info()
{
$info = User::where('id', $this->userId)->field('id,real_name,mobile,now_money,id_card')->find();
$info['notes'] = '提现金额需大于1元提现到微信零钱并财务审核审核通过后提现金额将自动到账。若本月提现超过800元将产生个人所得税款具体税率及金额根据《中华人民共和国个人所得税法》第二条、第三条、第六条规定扣缴。';
$info['extract_price'] =StoreExtract::where('uid',$this->userId)->sum('extract_price');
return $this->data($info);
}
/**
* 提交提现申请
*/
public function cash_application()
{
$money = $this->request->post('money');
$find = User::where('id', $this->userId)->find();
if ($find && $money > $find['now_money']) {
return $this->fail('提现金额不能大于余额');
}
if ($money < 1) {
return $this->fail('提现金额不能小于1元');
}
if ($find['id_card']=='') {
return $this->fail('请先完成身份认证');
}
$data['uid'] = $this->userId;
$data['create_time'] = time();
$data['status'] = 0;
$data['extract_price'] = $money;
$data['balance'] = bcsub($find['now_money'], $money, 2);
$data['before_balance'] = $find['now_money'];
$data['extract_type'] = 'wx';
Db::startTrans();
try {
$res = StoreExtract::create($data);
$capitalFlowDao = new CapitalFlowLogic($find);
$capitalFlowDao->userExpense('user_withdrawal', 'withdrawal', $res['id'], $money);
User::where('id', $this->userId)->dec('now_money', $money)->update();
Db::commit();
return $this->success('申请成功,等待审核');
} catch (\Throwable $e) {
Db::rollback();
return $this->success('申请失败');
}
}
/**
* 提现申请记录
*/
public function cash_record()
{
$list = StoreExtract::where('uid', $this->userId)->order('id desc')
->field('id,extract_price price,status,pay_status,create_time')
->select()->each(function ($item) {
if ($item->status == -1) {
$item->status_name = '未通过';
} elseif ($item->status == 0) {
$item->status_name = '审核中';
} elseif ($item->status == 1) {
$item->status_name = '已通过';
}
$item->title = '申请提现' . $item->price . '元';
$item->pay_status_name = $item->status == 1 ? '已打款' : '未打款';
})->toArray();
return $this->data($list);
}
/**
* 更新身份证号
*/
public function update_id_card(){
$data= (new UserValidate())->post()->goCheck('card');
if($data){
User::where('id',$this->userId)->update(['id_card'=>$data['id_card'],'real_name'=>$data['real_name'],'nickname'=>$data['real_name']]);
return $this->success('设置成功');
}
return $this->fail('请输入身份证号');
}
}