添加:文创豆转赠和提现功能

This commit is contained in:
wuhui_zzw 2023-11-23 10:23:23 +08:00
parent 70b5c72ff8
commit feb50ab76d
3 changed files with 217 additions and 2 deletions

View File

@ -236,6 +236,8 @@ class ConstService
const BALANCE_THAW = 133;//解冻余额
const CULTURAL_SPACE_LEGUMES = 140;//文创豆提现到余额
protected static $title = '余额';
@ -367,6 +369,7 @@ class ConstService
self::PERFORMANCE => '业绩奖励',
self::BALANCE_FREEZE => '后台冻结',
self::BALANCE_THAW => '后台解冻',
self::CULTURAL_SPACE_LEGUMES => '文创豆提现',
];
$plugin_data = app('ShopAsset')->getData('balance');
foreach ($plugin_data as $key => $value) {

View File

@ -3,10 +3,16 @@
namespace Yunshop\CulturalSpace\Api;
use app\common\components\ApiController;
use app\common\exceptions\ShopException;
use app\common\facades\Setting;
use app\common\models\Income;
use app\common\models\Member;
use app\common\models\member\MemberChildren;
use app\common\models\Order;
use app\common\services\credit\ConstService;
use app\common\services\finance\BalanceChange;
use app\common\services\password\PasswordService;
use Illuminate\Support\Facades\DB;
use Yunshop\CulturalSpace\models\ContributionBonusLog;
use Yunshop\CulturalSpace\models\ContributionLog;
use Yunshop\CulturalSpace\models\CulturalOrderFundLog;
@ -40,7 +46,7 @@ class IndexController extends ApiController{
return $this->successJson('success',$data);
}
/**
* Common: 统计明细变更记录获取
* Common: 统计明细变更记录获取
* Author: wu-hui
* Time: 2023/11/22 16:05
* @return \Illuminate\Http\JsonResponse
@ -87,7 +93,7 @@ class IndexController extends ApiController{
// 文创豆明细
case 'legumes':
$result = CulturalOrderFundLog::uniacid()
->select(['good_name','voucher_number','created_at'])
->select(['good_name','voucher_number','created_at','change_type'])
->where('member_id',$uid)
->orderBy('created_at','DESC')
->paginate(20)
@ -164,5 +170,169 @@ class IndexController extends ApiController{
}
/**
* Common: 获取用户当前持有的文创豆
* Author: wu-hui
* Time: 2023/11/22 17:26
* @return \Illuminate\Http\JsonResponse
*/
public function legumesHold(){
$uid = \YunShop::app()->getMemberId();
$voucher_number = sprintf("%.6f",CulturalSpace::uniacid()->where('uid',$uid)->value('voucher_number'));
$withdrawalCommissionRate = 20;//提现手续费比例
return $this->successJson('success',[
'voucher_number'=>$voucher_number,
'commission_rate'=>$withdrawalCommissionRate
]);
}
/**
* Common: 转赠 - 获取转赠信息
* Author: wu-hui
* Time: 2023/11/22 17:38
* @return \Illuminate\Http\JsonResponse
*/
public function transferInfo(){
// 基本参数
$uid = \YunShop::app()->getMemberId();
$set = Setting::get('plugin.cultural_space_set');
// 信息获取
if ($memberInfo = Member::where('uid', $uid)->first()) {
$data = [
'voucher_number' => sprintf("%.6f",CulturalSpace::uniacid()->where('uid',$uid)->value('voucher_number')),
'has_password' => $memberInfo->yzMember->hasPayPassword(),// 是否存在密码
'need_password' => (int)$set['is_password'],// 是否需要密码
'is_open_commission' => 0,//(int)$set['is_open_commission'],// 是否需要手续费
'commission' => 0//(float)$set['commission'],// 手续费比例
];
return $this->successJson('获取数据成功', $data);
}
return $this->errorJson('未获取到会员数据');
}
/**
* Common: 转赠 - 转赠处理
* Author: wu-hui
* Time: 2023/11/22 18:09
* @return \Illuminate\Http\JsonResponse
*/
public function transfer(){
// 参数获取
$uid = \YunShop::app()->getMemberId();
$transferId = (int)request()->input('transfer_id');
$transferMoney = abs((float)request()->input('transfer_money'));
$password = request()->input('password');
if($transferId <= 0 || $transferMoney <= 0) return $this->errorJson('无受让人或者转赠数量为0');
// 判断:受让人是否存在账号
$isHas = (int)CulturalSpace::uniacid()->where('uid',$transferId)->value('id');
if($isHas <= 0) return $this->errorJson('转增失败,受让人不存在账号!');
// 开始处理
DB::beginTransaction();
try{
$set = Setting::get('plugin.cultural_space_set');
// 判断:受让人不能是本人
if($uid == $transferId) throw new \Exception("身份非法,受让人不能是自己!");
// 判断:密码是否正确
if((int)$set['is_password'] == 1) (new PasswordService())->checkPayPassword($uid, $password);
// 计算手续费和减少金额
$reduceMoney = $transferMoney;// 减少数量 默认为转赠数量
$commission = (int)0;// 默认手续费
// if((int)$set['is_open_commission'] == 1 && (float)$set['commission'] > 0){
// $commission = (float)sprintf("%.2f", $transferMoney * (float)$set['commission'] / 100);// 手续费
// $reduceMoney = (float)sprintf("%.2f",$transferMoney + $commission);// 添加手续费后的减少数量
// }
// 获取用户信息
$currentMemberName = Member::uniacid()->where('uid',$uid)->value('nickname');
$transferMemberName = Member::uniacid()->where('uid',$transferId)->value('nickname');
// 减少当前用户持有文创豆
(new CulturalOrderFundLog())->transferHandle((int)$uid,(float)$reduceMoney,1,"赠送给【{$transferMemberName}");
// 增加受让人持有文创豆
(new CulturalOrderFundLog())->transferHandle((int)$transferId,(float)$transferMoney,0,"来自【{$currentMemberName}】的赠送");
DB::commit();
return $this->successJson('操作成功');
}catch(\Exception $e){
DB::rollBack();
return $this->errorJson($e->getMessage());
}
}
/**
* Common: 提现处理
* Author: wu-hui
* Time: 2023/11/23 10:04
* @return \Illuminate\Http\JsonResponse
*/
public function withdrawal(){
// 参数获取
$uid = \YunShop::app()->getMemberId();
$withdrawalNumber = abs((float)request()->input('withdrawal_number'));
if($withdrawalNumber <= 0) return $this->errorJson('提现数量不能为0');
// 判断:是否超出持有数量
$voucher_number = sprintf("%.6f",CulturalSpace::uniacid()->where('uid',$uid)->value('voucher_number'));
if($withdrawalNumber > $voucher_number) return $this->errorJson('提现数量不能超出持有数量!');
// 开始处理
DB::beginTransaction();
try{
// 计算手续费和减少金额
$realityMoney = $withdrawalNumber;// 实际到账余额数量 默认为提现数量
$commission = (int)0;// 默认手续费
$commissionRate = (int)20;// 手续费比例
if($commissionRate > 0){
$commission = (float)sprintf("%.2f", $withdrawalNumber * (float)$commissionRate / 100);// 手续费
$realityMoney = (float)sprintf("%.2f",$realityMoney - $commission);// 实际到账余额数量
}
// 减少当前用户持有文创豆
$recordId = (new CulturalOrderFundLog())->transferHandle((int)$uid,(float)$withdrawalNumber,1,"提现到余额,手续费{$commission}",2);
// 增加用户余额
$data = [
'member_id' => $uid,
'remark' => "文创豆提现{$withdrawalNumber},手续费{$commission},实际到账{$realityMoney}",
'source' => ConstService::CULTURAL_SPACE_LEGUMES,
'relation' => '',
'operator' => ConstService::OPERATOR_MEMBER,
'operator_id' => $recordId,
'change_value' => $realityMoney
];
$result = (new BalanceChange())->income($data);
if ($result !== true) throw new ShopException("提现失败:{$result}");
DB::commit();
return $this->successJson('操作成功');
}catch(\Exception $e){
DB::rollBack();
return $this->errorJson($e->getMessage());
}
}
/**
* Common: 文创豆变更记录
* Author: wu-hui
* Time: 2023/11/23 10:06
*/
public function legumesChangeRecord(){
// 参数获取
$uid = \YunShop::app()->getMemberId();
$changeSource = request()->input('change_source');
// 记录获取
$result = CulturalOrderFundLog::uniacid()
->select(['good_name','voucher_number','created_at','change_type'])
->where('member_id',$uid)
->where('change_source',$changeSource == 'transfer' ? 1 : 2)
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
return $this->successJson('success',[
'current_page' => (int)$result['current_page'],
'data' => (array)$result['data'],
'last_page' => (int)$result['last_page'],
]);
}
}

View File

@ -39,6 +39,48 @@ class CulturalOrderFundLog extends BaseModel
$data['updated_at'] = time();
return self::insert($data);
}
/**
* Common: 转账变更记录 || 提现变更记录
* Author: wu-hui
* Time: 2023/11/22 18:05
* @param int $uid
* @param float $changeNum
* @param int $changeType
* @param string $remark
* @param int $changeSource
* @return mixed
*/
public function transferHandle(int $uid,float $changeNum,int $changeType,string $remark,int $changeSource = 1){
// 获取当前用户持有数量
$changeFront = (float)CulturalSpace::uniacid()->where('uid',$uid)->value('voucher_number');
// 变更后的数量
$changeAfter = $changeType == 1 ? $changeFront - $changeNum : $changeFront + $changeNum;
// 变更记录
$data = [
'uniacid' => \YunShop::app()->uniacid,
'member_id' => $uid,// 用户id
'order_id' => 0,// 订单id
'goods_id' => 0,// 商品id
'good_name' => $remark,
'voucher_number' => $changeNum,
'created_at' => time(),// 变更时间
'updated_at' => time(),
'change_type' => $changeType,
'change_source' => $changeSource,
];
$id = $this->insertGetId($data);
// 修改用户持有
CulturalSpace::uniacid()->where('uid',$uid)->update(['voucher_number' => $changeAfter]);
return $id;
}
/**
* Common: 一对一关联 用户信息