Browse Source

完善功能

gorden 9 months ago
parent
commit
f594b70b1a

+ 14 - 0
app/admin/controller/goods/RechargeGoodsController.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace app\admin\controller\goods;
+
+use app\admin\service\goods\GoodsService;
+use support\Request;
+
+class RechargeGoodsController
+{
+    public function select(Request $request)
+    {
+        return GoodsService::select($request, 'RECHARGE');
+    }
+}

+ 70 - 0
app/admin/controller/notify/RechargeController.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace app\admin\controller\notify;
+
+use app\admin\service\notify\RechargeService;
+use app\model\Member;
+use app\model\MemberAccount;
+use app\model\PayDetail;
+use support\Db;
+use support\exception\BusinessException;
+use support\Request;
+
+class RechargeController
+{
+    public function paySuccess(Request $request)
+    {
+        $id = $request->post('pay_id', null);
+        if (!$id) {
+            return json_fail('参数异常');
+        }
+
+        $payDetail = PayDetail::find($id);
+        if ($payDetail->pay_status != 'SUCCESS') {
+            return json_fail("支付状态异常");
+        }
+        $extendJson = [];
+        if (!empty($payDetail->pay_extend_json)) {
+            $extendJson = json_decode($payDetail->pay_extend_json, true);
+            if (isset($extendJson['notify']) && $extendJson['notify'] == 'success') {
+                return json_success('处理完成');
+            }
+        }
+
+        try {
+            Db::beginTransaction();
+            $extendJson['notify'] = 'success';
+            $payDetail->pay_extend_json = json_encode($extendJson);
+            $payDetail->save();
+            // 赠送比例
+            $addedNbr = RechargeService::disposeOrder($payDetail->join_pay_order_id);
+            // 赠送金额累加到 账户表 member_account_added
+            MemberAccount::where('join_account_member_id', $payDetail->join_pay_member_id)
+                ->where('member_account_classify', 'CASH')
+                ->increment('member_account_added', $payDetail->pay_amount * $addedNbr);
+            MemberAccount::where('join_account_member_id', $payDetail->join_pay_member_id)
+                ->where('member_account_classify', 'CASH')
+                ->increment('member_account_income', floatval($payDetail->pay_amount));
+            // 根据最新的数据,更新用户等级
+            $member = Member::find($payDetail->join_pay_member_id);
+            $roleId = RechargeService::disposeRole($payDetail->join_pay_member_id, $payDetail->pay_amount);
+            if ($roleId && $member->join_member_role_id != $roleId) {
+                $member->join_member_role_id = $roleId;
+                $member->save();
+                // 处理增值套包、组件
+                RechargeService::disposeAdded($roleId, $payDetail->join_pay_member_id);
+            }
+            Db::commit();
+
+            return json_success('success');
+        } catch (BusinessException $e) {
+            dump($e->getMessage());
+            Db::rollBack();
+            return json_fail('处理失败');
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            Db::rollBack();
+            return json_fail('处理失败');
+        }
+    }
+}

+ 6 - 5
app/admin/service/goods/GoodsService.php

@@ -42,7 +42,7 @@ class GoodsService
         $goods = Goods::with('sku')
 //            ->where('goods_classify', $category)
             ->when(!empty($categoryIds), function ($query) use ($categoryIds) {
-                $query->whereIn('join_goods_category_id',$categoryIds);
+                $query->whereIn('join_goods_category_id', $categoryIds);
             })->select('goods_id', 'goods_name', 'join_goods_category_id')
             ->get()
             ->toArray();
@@ -479,6 +479,7 @@ class GoodsService
             $extendJson = [];
             if (!empty($data['goods_attribute_json'])) {
                 $extendJson = json_decode($data['goods_attribute_json'], true);
+                $data['goods_attribute_json'] = $extendJson;
             }
             $data['appointment_times'] = [];
             if ($data['is_support_appointment'] == 'Y' && isset($extendJson['dates'])) {
@@ -912,7 +913,7 @@ class GoodsService
 //            $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
             $model->goods_title = $params['goods_title'] ?? '';
             $model->goods_cover = $params['goods_cover'] ?? '';
-            $model->goods_on_addtimes = $params['goods_on_addtimes'] ? strtotime($params['goods_on_addtimes']) : null;
+            $model->goods_on_addtimes = isset($params['goods_on_addtimes']) ? strtotime($params['goods_on_addtimes']) : null;
             $model->goods_sort = $params['goods_sort'] ?? null;
             $model->goods_groupby = $params['goods_groupby'] ?? '';
             $model->goods_remark = $params['goods_remark'] ?? '';
@@ -1139,8 +1140,8 @@ class GoodsService
         try {
             $model = new GoodsRunning();
             $model->join_running_goods_id = $params['goods_id'];
-            $model->goods_running_storage = $params['goods_running_storage'] ?? '';
-            $model->goods_running_sale = $params['goods_running_sale'] ?? '';
+            $model->goods_running_storage = $params['goods_running_storage'] ?? 0;
+            $model->goods_running_sale = $params['goods_running_sale'] ?? 0;
             $model->goods_running_off_type = !empty($params['goods_running_off_type']) ? $params['goods_running_off_type'] : '';
             $model->goods_running_off_json = !empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T' && !empty($params['goods_off_addtimes']) ? json_encode(['time' => strtotime($params['goods_off_addtimes'])]) : '[]';
             if (!$model->save()) {
@@ -1196,7 +1197,7 @@ class GoodsService
             if (!empty($data['goods_cover'])) {
                 $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
             }
-            $data['goods_on_addtimes'] = strtotime($data['goods_on_addtimes']);
+            $data['goods_on_addtimes'] = isset($data['goods_on_addtimes']) ? strtotime($data['goods_on_addtimes']) : 0;
             $data['goods_sku_json'] = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
 
             $row = Goods::find($data['goods_id']);

+ 194 - 0
app/admin/service/notify/RechargeService.php

@@ -0,0 +1,194 @@
+<?php
+
+namespace app\admin\service\notify;
+
+use app\model\Goods;
+use app\model\MemberAccount;
+use app\model\MemberQuota;
+use app\model\MemberRole;
+use app\model\Order;
+use app\model\OrderSheet;
+use app\model\RuleAdded;
+use app\model\RuleAddedComponent;
+use support\exception\BusinessException;
+
+class RechargeService
+{
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 16:50
+     *
+     * @param $orderId
+     * @return mixed
+     * @throws BusinessException
+     */
+    public static function disposeOrder($orderId)
+    {
+        $orderSheet = OrderSheet::where('join_sheet_order_id', $orderId)->first();
+        if (!$orderSheet) {
+            throw new BusinessException('订单数据异常');
+        }
+        $goods = Goods::find($orderSheet->join_sheet_goods_id);
+        if (empty($goods->goods_attribute_json)) {
+            throw new BusinessException('产品数据异常');
+        }
+        $attributeJson = json_decode($goods->goods_attribute_json, true);
+        if (!isset($attributeJson['added'])) {
+            throw new BusinessException('产品数据异常');
+        }
+
+        return $attributeJson['added']['nbr'];
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 17:23
+     *
+     * @param $memberId
+     * @return mixed|void
+     */
+    public static function disposeRole($memberId, $payAmount)
+    {
+        $memberAccount = MemberAccount::where('join_account_member_id', $memberId)->first();
+        if ($memberAccount->member_account_income > $memberAccount->member_account_expend) {
+            $money = $memberAccount->member_account_incom;
+        } else {
+            $money = $memberAccount->member_account_expend;
+        }
+
+        $memberRoles = MemberRole::where('member_role_status', 'ACTIVED')->get()->toArray();
+        foreach ($memberRoles as $role) {
+            $amount = floatval($money) + floatval($payAmount);
+            if ($amount >= floatval($role['member_role_range_begin']) && $amount < floatval($role['member_role_range_end'])) {
+                return $role['member_role_id'];
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 18:03
+     *
+     * @param $roleId
+     * @param $memberId
+     * @return void
+     * @throws BusinessException
+     */
+    public static function disposeAdded($roleId, $memberId)
+    {
+        $role = MemberRole::find($roleId);
+        if (empty($role->member_role_rule_json)) {
+            throw new BusinessException('增值套包数据异常');
+        }
+        $ruleJson = json_decode($role->member_role_rule_json, true);
+        if (!isset($ruleJson['added'])) {
+            throw new BusinessException('增值套包数据异常');
+        }
+        $addedId = $ruleJson['added'];
+        $added = RuleAdded::find($addedId);
+        $diff = $added->rule_added_goods_diff;
+
+        $components = RuleAddedComponent::where('join_component_rule_added_id', $addedId)->get()->toArray();
+        switch ($diff) {
+            case "SUM":
+                self::diffSum($memberId, $components);
+                break;
+            case "REPLACE":
+                self::diffReplace($memberId, $components);
+                break;
+            case "NONE":
+                self::diffNone($memberId, $components);
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 18:03
+     *
+     * @param $memberId
+     * @param $components
+     * @return void
+     */
+    public static function diffSum($memberId, $components)
+    {
+        foreach ($components as $component) {
+            self::saveMemberQuota($memberId, $component);
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 18:02
+     *
+     * @param $memberId
+     * @param $components
+     * @return void
+     */
+    public static function diffReplace($memberId, $components)
+    {
+        foreach ($components as $component) {
+            if (MemberQuota::where('join_quota_member_id', $memberId)->where('join_member_rule_added_component_id', $component['rule_added_component_id'])->exists()) {
+                MemberQuota::where('join_quota_member_id', $memberId)
+                    ->where('join_member_rule_added_component_id', $component['rule_added_component_id'])
+                    ->where('member_quota_status', 'PENDING')
+                    ->delete();
+            }
+
+            self::saveMemberQuota($memberId, $component);
+        }
+
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 18:02
+     *
+     * @param $memberId
+     * @param $components
+     * @return void
+     */
+    public static function diffNone($memberId, $components)
+    {
+        foreach ($components as $component) {
+            if (MemberQuota::where('join_quota_member_id', $memberId)->where('join_member_rule_added_component_id', $component['rule_added_component_id'])->exists()) {
+                continue;
+            }
+
+            self::saveMemberQuota($memberId, $component);
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/5/28 18:02
+     *
+     * @param $memberId
+     * @param $component
+     * @return void
+     */
+    private static function saveMemberQuota($memberId, $component)
+    {
+        for ($i = 0; $i < floatval($component['rule_added_component_goods_nbr']); $i++) {
+            $model = new MemberQuota();
+            $model->member_quota_id = 'MQ' . date('YmdHis') . random_string(6, 'up');
+            $model->join_quota_member_id = $memberId;
+            $model->join_member_rule_added_component_id = $component['rule_added_component_id'];
+            $model->member_quota_status = 'PENDING';
+            $model->member_quota_category = $component['rule_added_component_category'];
+            $model->member_quota_name = $component['rule_added_component_name'];
+            $model->member_quota_nbr = $component['rule_added_component_goods_nbr'];
+            $model->member_quota_json = $component['rule_added_component_goods_json'];
+            $model->member_quota_addtimes = time();
+            $model->save();
+        }
+    }
+}

+ 1 - 1
app/admin/validate/goods/GoodsValidate.php

@@ -10,7 +10,7 @@ class GoodsValidate extends Validate
         'goods_id' => 'require|alphaDash',
         'join_goods_category_id' => 'integer',
         'join_goods_device_id' => 'max:32',
-        'goods_classify|归类' => 'require|in:GOODS,DEVICE,SERVICE,SPECIAL,PACKAGE,OTHER',  // GOODS=实物商品|DEVICE=设备|SERIVCE=服务|SPECIAL=专题业务|PACKAGE=套包|OTHER=其他
+        'goods_classify|归类' => 'require|in:GOODS,DEVICE,SERVICE,SPECIAL,RECHARGE,PACKAGE,OTHER',  // GOODS=实物商品|DEVICE=设备|SERIVCE=服务|SPECIAL=专题业务|PACKAGE=套包|OTHER=其他
         'goods_status|状态' => 'require|in:PENDING,ON,OFF,DISABLED',    // 产品状态 PENDING=待处理|ON=上架(已激活)|OFF=下架|DISABLED=已禁用
         'goods_category|分类' => 'max:32',
         'goods_prefix|前缀' => 'max:64 ',

+ 2 - 0
app/model/PayDetail.php

@@ -10,6 +10,8 @@ class PayDetail extends Model
 
     protected $dateFormat = 'U';
 
+    protected $primaryKey = 'pay_id';
+
     const CREATED_AT = 'pay_addtimes';
 
     const UPDATED_AT = null;

+ 12 - 2
route/admin.php

@@ -19,8 +19,8 @@ Route::group('/admin', function () {
     })->middleware([
         \app\middleware\AdminAuthCheck::class
     ]);
-    Route::group('/content',function (){
-        Route::group('/special',function (){
+    Route::group('/content', function () {
+        Route::group('/special', function () {
             Route::get('/list', [\app\admin\controller\content\SpecialController::class, 'select']);
             Route::post('/add', [\app\admin\controller\content\SpecialController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\content\SpecialController::class, 'update']);
@@ -42,6 +42,11 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        Route::group('/recharge', function () {
+            Route::get('/list', [\app\admin\controller\goods\RechargeGoodsController::class, 'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
         /* 业务服务商品管理 */
         Route::group('/service', function () {
             Route::get('/list', [\app\admin\controller\goods\ServiceGoodsController::class, 'select']);
@@ -819,3 +824,8 @@ Route::group('/admin', function () {
         Route::get('/', [\app\admin\controller\dashboard\DashboardController::class, 'index']);
     });
 });
+
+
+Route::group('/notify', function () {
+    Route::post('/recharge/paySuccess', [\app\admin\controller\notify\RechargeController::class, 'paySuccess']);
+});