Prechádzať zdrojové kódy

会员、商品统计导出

gorden 4 mesiacov pred
rodič
commit
59d1cd918f

+ 144 - 0
app/admin/controller/finance/GoodsSalesController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\finance;
 
+use app\admin\service\goods\GoodsService;
 use app\admin\service\goods\GoodsSkuService;
 use app\model\DataInout;
 use app\model\Goods;
@@ -85,6 +86,7 @@ class GoodsSalesController
             'combine' => ['total' => 0, 'amount' => 0],
             'partner' => ['total' => 0, 'amount' => 0],
             'referrer' => ['total' => 0, 'amount' => 0],
+            'franchisee' => ['total' => 0, 'amount' => 0],
         ];
         foreach ($dataInOuts as $dataInOut) {
             if (empty($dataInOut['join_data_inout_object_json'])) {
@@ -237,4 +239,146 @@ class GoodsSalesController
 
         return json_success('success', $goods);
     }
+
+    public function exportGoodsSales(Request $request)
+    {
+        $days = $request->get('days', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')]);
+        $classify = $request->get('classify', '');
+        $categoryId = $request->get('category_id', '');
+        $goodsName = $request->get('goods_name', '');
+        $payType = $request->get('pay_type', '');
+        $paramsGoodsIds = $request->get('goods_ids');
+        if (!empty($days)) {
+            $days[0] = strtotime($days[0]);
+            $days[1] = strtotime($days[1]);
+        }
+        $searchGoodsIds = [];
+        if (!empty($classify)) {
+            if ($classify == 'SERVICE') {
+                $classify = ['SERVICE', 'CHNMED', 'CHNNCD'];
+            } else {
+                $classify = [$classify];
+            }
+            $searchGoodsIds = Goods::whereIn('goods_classify', $classify)->pluck('goods_id')->toArray();
+        }
+        if (!empty($categoryId)) {
+            $categorySuperPath = SysCategory::where('category_id', $categoryId)->value('category_super_path');
+            if (empty($categorySuperPath)) {
+                $categorySuperPath = '#' . $categoryId . '#';
+            }
+            $searchCategoryIds = SysCategory::where('category_super_path', 'like', $categorySuperPath . '%')->pluck('category_id')->toArray();
+            $searchCategoryIds[] = $categoryId;
+            // 按产品类型筛出来的ID
+            $oldSearchGoodsIds = $searchGoodsIds;
+
+            $searchGoodsIds = Goods::whereIn('join_goods_category_id', $searchCategoryIds)->pluck('goods_id')->toArray();
+            if (!empty($oldSearchGoodsIds)) {
+                $searchGoodsIds = array_intersect($searchGoodsIds, $oldSearchGoodsIds);
+            }
+        }
+        if (!empty($goodsName)) {
+            // 按产品类型和分类筛出来的ID
+            $oldSearchGoodsIds = $searchGoodsIds;
+            $searchGoodsIds = Goods::where('goods_name', 'like', '%' . $goodsName . '%')->pluck("goods_id")->toArray();
+            if (!empty($oldSearchGoodsIds)) {
+                $searchGoodsIds = array_intersect($searchGoodsIds, $oldSearchGoodsIds);
+            }
+        }
+
+        $dataInOuts = DataInout::where('data_inout_status', 'VALID')
+            ->where('data_inout_classify', 'IN')
+            ->when(!empty($days), function ($query) use ($days) {
+                $query->whereBetween('data_inout_addtimes', $days);
+            })->when(!empty($payType), function ($query) use ($payType) {
+                $query->where('data_inout_pay_type', $payType);
+            })->select('join_data_inout_object_json')
+            ->get()
+            ->toArray();
+
+        $goods = [];
+        $goodsIds = [];
+        foreach ($dataInOuts as $dataInOut) {
+            if (empty($dataInOut['join_data_inout_object_json'])) {
+                continue;
+            }
+            $intoObjectJson = json_decode($dataInOut['join_data_inout_object_json'], true);
+            if (empty($intoObjectJson['order'])) {
+                continue;
+            }
+            foreach ($intoObjectJson['order'] as $order) {
+                if (empty($order['goods'])) {
+                    continue;
+                }
+                foreach ($order['goods'] as $good) {
+                    if ((!empty($classify) || !empty($categoryId) || !empty($goodsName)) && !in_array($good['goods_id'], $searchGoodsIds)) {
+                        continue;
+                    }
+                    $goodKey = $good['goods_id'];
+                    if (!empty($good['goods_sku_id'])) {
+                        $goodKey .= '_' . $good['goods_sku_id'];
+                    }
+                    if (!key_exists($goodKey, $goods)) {
+                        $goodsIds[] = $good['goods_id'];
+                        $goods[$goodKey] = [
+                            'goods_id' => $good['goods_id'],
+                            'goods_name' => $good['goods_name'],
+                            'goods_sku_id' => $good['goods_sku_id'] ?? '',
+                            'order_sheet_num' => floatval($good['order_sheet_num']),
+                            'order_sheet_pay' => floatval($good['order_sheet_pay'])
+                        ];
+                    } else {
+                        $goods[$goodKey]['order_sheet_num'] += $good['order_sheet_num'];
+                        $goods[$goodKey]['order_sheet_pay'] += $good['order_sheet_pay'];
+                    }
+                }
+            }
+        }
+
+        // 交集
+        if (!empty($classify) || !empty($categoryId) || !empty($paramsGoodsIds)) {
+            $goodsIds = array_intersect($goodsIds, $searchGoodsIds);
+            if (!empty($paramsGoodsIds) && !empty($goodsIds)){
+                $goodsIds = array_intersect($goodsIds,$paramsGoodsIds);
+            }else if (!empty($paramsGoodsIds) && empty($goodsIds)){
+                $goodsIds = $paramsGoodsIds;
+            }
+
+            $goods = array_filter($goods, function ($item) use ($goodsIds) {
+                return in_array($item['goods_id'], $goodsIds);
+            });
+        }
+
+        // 排序
+        usort($goods, function ($a, $b) {
+            return $b['order_sheet_num'] <=> $a['order_sheet_num'];
+        });
+        $dataArray = [];
+        $data = [];
+        foreach ($goods as $row) {
+            $data['goods_name'] = $row['goods_name'];
+            $data['order_sheet_num'] = $row['order_sheet_num'];
+            $rowGoods = Goods::with([
+                'category',
+                'skuOne' => function ($query) use ($row) {
+                    $query->where('goods_sku_id', $row['goods_sku_id']);
+                }
+            ])->where('goods_id', $row['goods_id'])->first();
+            $data['goods_classify'] = !empty($rowGoods->goods_classify) ? GoodsService::$goodsClassify[$rowGoods->goods_classify] : '--';;
+            $data['goods_sales_price'] = !empty($rowGoods->goods_sales_price) ? $rowGoods->goods_sales_price : '--';
+            $data['category'] = !empty($rowGoods->category) ? $rowGoods->category : '--';
+            if (!empty($rowGoods->skuOne)) {
+                $data['goods_sku_title'] = GoodsSkuService::getSkuTitle($rowGoods->skuOne->goods_sku_specs_json);
+                $data['goods_sku_sales_price'] = $rowGoods->skuOne->goods_sku_sales_price;
+            }
+            if(!empty($rowGoods->category)){
+                $data['goods_category'] = $rowGoods->category->category_name;
+            }
+
+            $data['order_sheet_pay'] = sprintf('%.2f', $row['order_sheet_pay']);
+            $dataArray[] = $data;
+        }
+
+
+        return json_success('', $dataArray);
+    }
 }

+ 92 - 1
app/admin/controller/finance/MemberAccountController.php

@@ -97,7 +97,7 @@ class MemberAccountController
             })->count();
 
         $rows = $rows->select('member.member_id', 'member.member_mobile', 'member.member_addtimes', 'member.join_member_role_id',
-            'ma.member_account_income as member_account_income', 'ma.member_account_expend as member_account_expend', 'ma.member_account_surplus as member_account_surplus', 'ma.member_account_added as member_account_added'
+            'ma.member_account_id as member_account_id','ma.member_account_income as member_account_income', 'ma.member_account_expend as member_account_expend', 'ma.member_account_surplus as member_account_surplus', 'ma.member_account_added as member_account_added'
         )
             ->orderBy('member.member_addtimes', 'DESC')
             ->forPage($page, $pageSize)
@@ -106,4 +106,95 @@ class MemberAccountController
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total', 'statistics'));
     }
+
+    /**
+     * @Desc 导出
+     * @Author Gorden
+     * @Date 2024/11/19 8:56
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public function exportMemberAccount(Request $request)
+    {
+        $days = $request->get('member_addtimes', []);
+        $level = $request->get('level', '');
+        $memberId = $request->get('member_id');
+        $accountType = $request->get('account_type', 'CASH');
+        $premisesId = intval($request->get('premises_id', ''));
+        $memberAccountIds = $request->get('member_account_ids');
+        if (!empty($days)) {
+            $days[0] = strtotime($days[0]);
+            $days[1] = strtotime($days[1]);
+
+            $month = date('Ym', $days[0]);
+            $days[1] = strtotime(date('Y-m-d', $days[1]) . " 23:59:59");
+        } else {
+            $month = date('Ym');
+        }
+
+        // 兼容老等级搜索
+        $levelIds = [];
+        if (!empty($level)) {
+            $levelName = MemberRole::where('member_role_id', $level)->value('member_role_name');
+            if (!empty($levelName)) {
+                $levelIds = MemberRole::where('member_role_name', $levelName)->pluck('member_role_id')->toArray();
+            }
+        }
+        $rows = Member::with([
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+            'info' => function ($query) {
+                $query->select('join_info_member_id', 'member_info_nickname');
+            },
+            'role' => function ($query) {
+                $query->select('member_role_id', 'member_role_name');
+            }
+        ])->join('member_account as ma', function ($join) use ($accountType) {
+            $join->on('member.member_id', '=', 'ma.join_account_member_id')->where('ma.member_account_classify', '=', $accountType);
+        })->leftJoin('member_role', 'member_role.member_role_id', 'member.join_member_role_id')
+            ->when(!empty($level), function ($query) use ($level, $levelIds) {
+                if ($level == '00') {
+                    $query->where('join_member_role_id', '')->orWhere('join_member_role_id', NULL);
+                } else if ($level == 'VIP') {
+                    $query->where('member.member_is_vip', 'Y');
+                } else if (!empty($levelIds)) {
+                    $query->whereIn('member_role.member_role_id', $levelIds);
+                } else {
+                    $query->where('join_member_role_id', $level);
+                }
+
+            })->when(!empty($memberId), function ($query) use ($memberId) {
+                $query->where('member.member_id', $memberId);
+            })->when(!empty($days), function ($query) use ($days) {
+                $query->whereBetween('member.member_addtimes', $days);
+            })->when(!empty($premisesId), function ($query) use ($premisesId) {
+                $query->whereJsonContains('member.member_extend_json->belong->premises', $premisesId);
+            })->when(!empty($memberAccountIds),function($query) use ($memberAccountIds){
+                $query->whereIn('member_account_id',$memberAccountIds);
+            })->where('member.member_mobile', '<>', '0000')
+            ->select('member.member_id', 'member.member_mobile', 'member.member_addtimes', 'member.join_member_role_id',
+                'ma.member_account_id as member_account_id','ma.member_account_income as member_account_income', 'ma.member_account_expend as member_account_expend', 'ma.member_account_surplus as member_account_surplus', 'ma.member_account_added as member_account_added'
+            )
+            ->orderBy('member.member_addtimes', 'DESC')
+            ->get()
+            ->toArray();
+
+        $data = [];
+        foreach ($rows as $row) {
+            $data[] = [
+                'nickname' => $row['info']['member_info_nickname'] ?? '--',
+                'mobile' => $row['member_mobile'] ?? '--',
+                'role_name' => $row['role']['member_role_name'] ?? '--',
+                'balance' => sprintf('%.2f', $row['member_account_surplus'] + $row['member_account_added']),
+                'income' => $row['member_account_income'],
+                'expend' => $row['member_account_expend'],
+                'added' => $row['member_account_added'],
+                'addtimes' => $row['member_addtimes']
+            ];
+        }
+
+        return json_success('success', $data);
+    }
 }

+ 34 - 5
app/admin/controller/member/AccountController.php

@@ -3,8 +3,10 @@
 namespace app\admin\controller\member;
 
 use app\controller\Curd;
+use app\model\Card;
 use app\model\MemberAccount;
 use app\model\MemberBenefit;
+use support\Db;
 use support\exception\BusinessException;
 use support\Request;
 use Tinywan\Jwt\JwtToken;
@@ -127,19 +129,46 @@ class AccountController extends Curd
     {
         $accountId = $request->post('account_id');
         $status = $request->post('status');
-        if (!$accountId || !$status || !in_array($status,['DISABLED','ACTIVED','EXPIRED'])){
+        if (!$accountId || !$status || !in_array($status, ['DISABLED', 'ACTIVED', 'EXPIRED'])) {
             return json_fail('参数异常');
         }
         try {
-            $account = MemberAccount::where('member_account_id',$accountId)->first();
+            $account = MemberAccount::where('member_account_id', $accountId)->first();
             $account->member_account_status = $status;
             $account->save();
 
-            _syslog("修改账户状态",'修改账户状态成功');
+            _syslog("修改账户状态", '修改账户状态成功');
             return json_success('账户状态修改成功');
-        }catch (\Exception $e){
-            _syslog("修改账户状态",'账户状态修改失败');
+        } catch (\Exception $e) {
+            _syslog("修改账户状态", '账户状态修改失败');
             return json_fail('账户状态修改失败');
         }
     }
+
+    public function bindCard(Request $request)
+    {
+        $cardId = $request->post('card_id');
+        $cardKey = $request->post('card_cdkey');
+        $memberId = $request->post('member_id');
+        $card = Card::where('card_id',$cardId)->where('card_cdkey',$cardKey)->first();
+        if (!$card){
+            return json_fail("卡号不存在");
+        }
+        if ($card->is_issue == 'N'){
+            return json_fail("卡号未发行");
+        }
+        if (!in_array($card->card_status,['INIT','WAITING','PENDING'])){
+            return json_fail("卡号不是可绑定状态");
+        }
+
+        Db::beginTransaction();
+        try {
+            //
+
+            Db::commit();
+        }catch (\Exception $e){
+
+            Db::rollBack();
+        }
+    }
 }

+ 18 - 0
app/admin/service/goods/GoodsService.php

@@ -2919,4 +2919,22 @@ class GoodsService
         '周六' => 6,
         '周日' => 7,
     ];
+
+    /**
+     * 产品类型
+     */
+    public static $goodsClassify = [
+        'RECHARGE'=>'充值',
+        'COMBINE'=>'新客专享',
+        'PARTNER'=>'会员合伙人',
+        'FRANCHISEE'=>'加盟合伙人',
+        'REFERRER'=>'康养推荐管',
+        'VIP'=>'康养城',
+        'GOODS'=>'健康产品',
+        'SERVICE'=>'服务产品',
+        'CHNMED'=>'服务产品',
+        'CHNNCD'=>'服务产品',
+        'PACKAGE'=>'套包',
+        'MEALS'=>'餐饮'
+    ];
 }

+ 2 - 0
route/admin.php

@@ -164,9 +164,11 @@ Route::group('/admin', function () {
         Route::group('/goodsSales', function () {
             Route::get('/info', [\app\admin\controller\finance\GoodsSalesController::class, 'info']);
             Route::get('/list', [\app\admin\controller\finance\GoodsSalesController::class, 'list']);
+            Route::get('/export', [\app\admin\controller\finance\GoodsSalesController::class, 'exportGoodsSales']);
         });
         Route::group('/memberAccount', function () {
             Route::get('/list', [\app\admin\controller\finance\MemberAccountController::class, 'list']);
+            Route::get('/export', [\app\admin\controller\finance\MemberAccountController::class, 'exportMemberAccount']);
         });
         Route::group('/premisesMember', function () {
             Route::get('/list', [\app\admin\controller\finance\PremisesMemberController::class, 'list']);