Bläddra i källkod

Merge branch 'dev'

gorden 4 månader sedan
förälder
incheckning
44c578d576
29 ändrade filer med 669 tillägg och 341 borttagningar
  1. 42 12
      app/admin/controller/finance/CommissionListController.php
  2. 192 145
      app/admin/controller/finance/GoodsSalesController.php
  3. 19 35
      app/admin/controller/finance/MemberAccountController.php
  4. 7 5
      app/admin/controller/finance/WithdrawalListController.php
  5. 16 21
      app/admin/controller/member/MemberController.php
  6. 1 1
      app/admin/controller/notify/RechargeController.php
  7. 11 5
      app/admin/controller/order/DishesController.php
  8. 4 3
      app/admin/controller/order/GoodsController.php
  9. 4 3
      app/admin/controller/order/KangyangCityController.php
  10. 20 4
      app/admin/controller/order/NewCustomerController.php
  11. 4 3
      app/admin/controller/order/PackagesController.php
  12. 4 3
      app/admin/controller/order/PartnerController.php
  13. 12 6
      app/admin/controller/order/RechargeController.php
  14. 4 3
      app/admin/controller/order/ReferrerController.php
  15. 91 22
      app/admin/controller/order/RefundController.php
  16. 4 3
      app/admin/controller/order/ServicesController.php
  17. 78 10
      app/admin/controller/order/StatisticsController.php
  18. 18 10
      app/admin/controller/order/WholeController.php
  19. 28 16
      app/admin/controller/sys_manage/BellsController.php
  20. 2 1
      app/admin/service/coupon/CouponService.php
  21. 34 10
      app/admin/service/order/PayDetailService.php
  22. 12 5
      app/admin/service/sys_manage/CategoryService.php
  23. 8 5
      app/event/ClientMessageEvent.php
  24. 3 1
      app/event/order/NewCustomerEvent.php
  25. 1 1
      app/event/statistics/InOutEvent.php
  26. 20 7
      app/model/Goods.php
  27. 5 0
      app/model/OrderReturn.php
  28. 24 0
      app/model/SysMessage.php
  29. 1 1
      route/admin.php

+ 42 - 12
app/admin/controller/finance/CommissionListController.php

@@ -4,11 +4,13 @@ namespace app\admin\controller\finance;
 
 use app\admin\service\goods\GoodsSkuService;
 use app\admin\service\member\MemberService;
+use app\admin\service\order\PayDetailService;
 use app\controller\Curd;
 use app\model\Member;
 use app\model\MemberAccountList;
 use app\model\Order;
 use app\model\OrderSheet;
+use app\model\PayDetail;
 use support\Request;
 use support\Response;
 
@@ -90,6 +92,20 @@ class CommissionListController extends Curd
             $item['member_is_referrer'] = isset($item['member']) ? $item['member']['member_is_referrer'] : '';
 
             unset($item['member'], $item['memberInfo'], $item['memberCert']);
+
+            if (!empty($item['member_account_list_json'])) {
+                $memberAccountListJson = json_decode($item['member_account_list_json'], true);
+                $member = Member::with([
+                    'cert' => function ($query) {
+                        $query->select('join_cert_member_id', 'member_cert_name');
+                    }
+                ])->where('member_id', $memberAccountListJson['master_member_id'])
+                    ->first();
+                $mobile = !empty($member->member_mobile) ? $member->member_mobile : '';
+                $certName = !empty($member->cert) ? $member->cert->member_cert_name : '';
+                $item['master_name'] = MemberService::getMemberCertName($mobile, $certName, '');
+            }
+
         }
 
         return $items;
@@ -124,7 +140,7 @@ class CommissionListController extends Curd
             if (isset($accountListJson['master_member_id'])) {
                 $member = Member::with([
                     'info' => function ($query) {
-                        $query->select('join_info_member_id', 'member_info_nickname');
+                        $query->select('join_info_member_id', 'member_info_nickname', 'member_info_headimg');
                     },
                     'cert' => function ($query) {
                         $query->select('join_cert_member_id', 'member_cert_name');
@@ -135,6 +151,7 @@ class CommissionListController extends Curd
                 ])->where('member_id', $accountListJson['master_member_id'])
                     ->first();
                 $info->master_nickname = isset($member->info) && !empty($member->info->member_info_nickname) ? $member->info->member_info_nickname : MemberService::getMemberNickname($member->member_mobile ?? '');
+                $info->master_headimg = MemberService::getAvatarUrl(!empty($member->info) ? $member->info->member_info_headimg : '');
                 $info->master_certname = isset($member->cert) && !empty($member->cert->member_cert_name) ? $member->cert->member_cert_name : '';
                 $info->master_mobile = isset($member) && !empty($member->member_mobile) ? $member->member_mobile : '';
                 $info->master_member_name = MemberService::getMemberName($info->master_mobile, $info->master_certname, $info->master_nickname);
@@ -148,28 +165,41 @@ class CommissionListController extends Curd
             // 订单
             if (isset($accountListJson['order_id'])) {
                 $info->order = Order::where('order_id', $accountListJson['order_id'])
-                    ->select('order_id','order_groupby','order_amount_total','order_amount_pay','order_addtimes')
+                    ->select('order_id', 'order_groupby', 'order_amount_total', 'order_amount_pay', 'order_addtimes')
                     ->first();
                 $sheets = OrderSheet::with([
-                    'goods'=>function($query){
-                        $query->select('goods_id','goods_name','goods_sales_price','goods_cover');
+                    'goods' => function ($query) {
+                        $query->select('goods_id', 'goods_name', 'goods_sales_price', 'goods_cover');
                     },
-                    'sku' => function($query){
-                        $query->select('goods_sku_id','goods_sku_specs_json');
+                    'sku' => function ($query) {
+                        $query->select('goods_sku_id', 'goods_sku_specs_json');
                     }
-                ])->where('join_sheet_order_id',$accountListJson['order_id'])
-                    ->select('join_sheet_order_id','join_sheet_goods_id','join_sheet_goods_sku_id','order_sheet_num','order_sheet_price','order_sheet_amount','order_sheet_addtimes')
+                ])->where('join_sheet_order_id', $accountListJson['order_id'])
+                    ->select('join_sheet_order_id', 'join_sheet_goods_id', 'join_sheet_goods_sku_id', 'order_sheet_num', 'order_sheet_price', 'order_sheet_amount', 'order_sheet_addtimes')
                     ->get()
                     ->toArray();
-                foreach ($sheets as &$sheet){
-                    if (!empty($sheet['goods']) && !empty($sheet['goods']['goods_cover'])){
-                        $sheet['goods']['goods_cover'] = getenv('STORAGE_DOMAIN').$sheet['goods']['goods_cover'];
+                foreach ($sheets as &$sheet) {
+                    if (!empty($sheet['goods']) && !empty($sheet['goods']['goods_cover'])) {
+                        $sheet['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $sheet['goods']['goods_cover'];
                     }
-                    if (!empty($sheet['sku'])){
+                    if (!empty($sheet['sku'])) {
                         $sheet['sku']['sku_title'] = GoodsSkuService::getSkuTitle($sheet['sku']['goods_sku_specs_json']);
                     }
                 }
                 $info->sheet = $sheets;
+
+                // 支付记录
+                $payDetails = PayDetail::whereJsonContains('join_pay_object_json->order_id', $accountListJson['order_id'])
+                    ->select('pay_amount', 'pay_status', 'pay_paytimes', 'pay_prepayid')
+                    ->where('pay_status', 'SUCCESS')
+                    ->orderBy('pay_addtimes', 'DESC')
+                    ->get()
+                    ->toArray();
+                foreach ($payDetails as &$detail) {
+                    $detail['pay_category'] = PayDetailService::getPayWayByPrepayId($detail['pay_prepayid']);
+                }
+
+                $info->payDetails = $payDetails;
             }
         }
 

+ 192 - 145
app/admin/controller/finance/GoodsSalesController.php

@@ -2,6 +2,9 @@
 
 namespace app\admin\controller\finance;
 
+use app\admin\service\goods\GoodsSkuService;
+use app\model\DataInout;
+use app\model\Goods;
 use app\model\OrderSheet;
 use app\model\SysCategory;
 use support\Db;
@@ -9,185 +12,229 @@ use support\Request;
 
 class GoodsSalesController
 {
-
     public function list(Request $request)
     {
         $page = $request->get('page', 1);
         $pageSize = $request->get('pageSize', 20);
-        $days = $request->get('days', []);
-        $classify = $request->get('classify','');
-        $categoryId = $request->get('category_id','');
-        $goodsName = $request->get('goods_name','');
-        $premisesId = $request->get('premises_id','');
-        $payType = $request->get('pay_type','');
+        $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', '');
         if (!empty($days)) {
             $days[0] = strtotime($days[0]);
             $days[1] = strtotime($days[1]);
-            if (date('m', $days[0]) != date('m', $days[1])) {
-                return json_fail('暂不支持跨月查询');
+        }
+        $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);
             }
-
-            $month = date('Ym', $days[0]);
-            $days[1] = strtotime(date('Y-m-d', $days[1]) . " 23:59:59");
-        } else {
-            $month = date('Ym');
         }
 
-        $categorySearchIds = '';
-        if (!empty($categoryId)){
-            $categorySearchPath = SysCategory::where('category_id',$categoryId)->value('category_super_path');
-            $categorySearchPath .= '#'. $categoryId.'#';
-
-            $categorySearchIds = SysCategory::where('category_super_path','like',$categorySearchPath.'%')->pluck('category_id')->toArray();
-            $categorySearchIds = array_merge($categorySearchIds,[$categoryId]);
-            $categorySearchIds = implode(',',$categorySearchIds);
+        $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 = [];
+        $statistics = [
+            'total' => 0,
+            'amount' => 0,
+            'goods' => ['total' => 0, 'amount' => 0],
+            'service' => ['total' => 0, 'amount' => 0],
+            'chnmed' => ['total' => 0, 'amount' => 0],
+            'chnncd' => ['total' => 0, 'amount' => 0],
+            'package' => ['total' => 0, 'amount' => 0],
+            'meals' => ['total' => 0, 'amount' => 0],
+            'dishes' => ['total' => 0, 'amount' => 0],
+            'vip' => ['total' => 0, 'amount' => 0],
+            'recharge' => ['total' => 0, 'amount' => 0],
+            'combine' => ['total' => 0, 'amount' => 0],
+            'partner' => ['total' => 0, 'amount' => 0],
+            'referrer' => ['total' => 0, 'amount' => 0],
+        ];
+        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'];
+                    }
+
+                    $statistics['total'] = round($good['order_sheet_num'] + $statistics['total'], 2);
+                    $statistics['amount'] = round($good['order_sheet_pay'] + $statistics['amount'], 2);
+
+                    $orderClassify = strtolower($order['classify']);
+                    $statistics[$orderClassify]['total'] = round($good['order_sheet_num'] + $statistics[$orderClassify]['total'], 2);
+                    $statistics[$orderClassify]['amount'] = round($good['order_sheet_pay'] + $statistics[$orderClassify]['amount'], 2);
+                }
+            }
         }
+        $statistics['service']['total'] = $statistics['service']['total'] + $statistics['chnmed']['total'] + $statistics['chnncd']['total'];
+        $statistics['service']['amount'] = $statistics['service']['amount'] + $statistics['chnmed']['total'] + $statistics['chnncd']['amount'];
 
-        $recordStart = ($page - 1) * 20;
+        // 交集
+        if (!empty($classify) || !empty($categoryId)) {
+            $goodsIds = array_intersect($goodsIds, $searchGoodsIds);
 
-        $where = "where 1";
-        if (!empty($days)) {
-            $where .= " and di.data_income_addtimes between {$days[0]} and {$days[1]}";
-        }
-        if (!empty($classify)){
-            $where .= " and di.data_income_classify = '{$classify}'";
-        }
-        if (!empty($categorySearchIds)){
-            $where .= " and g.join_goods_category_id in({$categorySearchIds})";
-        }
-        if (!empty($goodsName)){
-            $where .= " and g.goods_name like '%{$goodsName}%' ";
-        }
-        if (!empty($premisesId)){
-            $where .= " and di.join_data_income_dept_id = {$premisesId}";
-        }
-        if (!empty($payType)){
-            $where .= " and di.data_income_pay_type = '{$payType}'";
+            $goods = array_filter($goods, function ($item) use ($goodsIds) {
+                return in_array($item['goods_id'], $goodsIds);
+            });
         }
 
-        $totalSql = "
-            select count(*) as total from (
-                select 
-                    data_income_classify 
-                from app_data_income_{$month} as di
-                    left join app_goods as g on REPLACE(JSON_EXTRACT(di.join_data_income_object_json,'$.sheet[0].goods_id'),'\"','') = g.goods_id 
-                    {$where}
-                group by JSON_EXTRACT(join_data_income_object_json,'$.sheet[0].goods_id'), JSON_EXTRACT(join_data_income_object_json,'$.sheet[0].goods_sku_id'),data_income_classify
-            ) COUNT
-        ";
-        $total = Db::select($totalSql);
-
-        $sql = "select 
-            g.join_goods_category_id,di.data_income_classify,g.goods_id,g.goods_name,g.goods_classify, gs.goods_sku_specs_json,gs.goods_sku_id,gs.goods_sku_sales_price,MAX(di.data_income_addtimes) as addtimes,
-            SUM(JSON_EXTRACT(di.join_data_income_object_json,'$.sheet[0].order_sheet_num')) as num,SUM(di.data_income_amount) as amount,COUNT(*) as count
-            from app_data_income_{$month} as di 
-                left join app_goods as g on REPLACE(JSON_EXTRACT(di.join_data_income_object_json,'$.sheet[0].goods_id'),'\"','') = CAST(g.goods_id AS CHAR)
-                left join app_goods_sku as gs on JSON_EXTRACT(di.join_data_income_object_json,'$.sheet[0].goods_sku_id') = gs.goods_sku_id 
-                {$where} 
-            group by g.goods_id,gs.goods_sku_id,di.data_income_classify 
-            order by addtimes desc 
-            limit " . $recordStart . ',' . $pageSize;
-        $rows = Db::select($sql);
-        $rows = json_decode(json_encode($rows), true);
-
-        $categoryIds = array_unique(array_filter(array_column($rows, 'join_goods_category_id')));
-        $categorys = SysCategory::whereIn('category_id', $categoryIds)->pluck('category_name', 'category_id')->toArray();
+        // 排序
+        usort($goods, function ($a, $b) {
+            return $b['order_sheet_num'] <=> $a['order_sheet_num'];
+        });
+        // 分页
+
+        $total = count($goods);
+        $start = ($page - 1) * $pageSize;
+        $rows = array_slice($goods, $start, $pageSize);
         foreach ($rows as &$row) {
-            if (!empty($row['join_goods_category_id']) && isset($categorys[$row['join_goods_category_id']])) {
-                $row['category_name'] = $categorys[$row['join_goods_category_id']];
-            }
-            if (!empty($row['goods_sku_specs_json'])) {
-                $specsJson = json_decode($row['goods_sku_specs_json'], true);
-                $skuTitle = '';
-                foreach ($specsJson as $k => $value) {
-                    $value = is_array($value) ? $value[0] : $value;
-                    $skuTitle .= $k . ':' . $value . ';';
+            $rowGoods = Goods::with([
+                'category',
+                'skuOne' => function ($query) use ($row) {
+                    $query->where('goods_sku_id', $row['goods_sku_id']);
                 }
-                $row['sku'] = rtrim($skuTitle, ';');
+            ])->where('goods_id', $row['goods_id'])->first();
+            $row['goods_classify'] = !empty($rowGoods->goods_classify) ? $rowGoods->goods_classify : '';
+            $row['goods_sales_price'] = !empty($rowGoods->goods_sales_price) ? $rowGoods->goods_sales_price : '';
+            $row['category'] = !empty($rowGoods->category) ? $rowGoods->category : '';
+            if (!empty($rowGoods->skuOne)) {
+                $row['goods_sku_title'] = GoodsSkuService::getSkuTitle($rowGoods->skuOne->goods_sku_specs_json);
+                $row['goods_sku_sales_price'] = $rowGoods->skuOne->goods_sku_sales_price;
             }
+
+            $row['order_sheet_pay'] = sprintf('%.2f', $row['order_sheet_pay']);
         }
 
+
         return json_success('', [
             'page' => $page,
             'pageSize' => $pageSize,
-            'total' => $total[0]->total,
-            'rows' => $rows
+            'total' => $total,
+            'rows' => $rows,
+            'statistics' => $statistics
         ]);
     }
 
-    public function statistics(Request $request)
+    public function info(Request $request)
     {
-        $days = $request->get('days', []);
-        $classify = $request->get('classify','');
-        $categoryId = $request->get('category_id','');
-        $goodsName = $request->get('goods_name','');
-        $premisesId = $request->get('premises_id','');
-        $payType = $request->get('pay_type','');
-        if (!empty($days)) {
-            $days[0] = strtotime($days[0]);
-            $days[1] = strtotime($days[1]);
-            if (date('m', $days[0]) != date('m', $days[1])) {
-                return json_fail('暂不支持跨月查询');
+        $goodsId = $request->get('goods_id');
+        $skuId = $request->get('sku_id');
+        if (!$goodsId) {
+            return json_fail("参数异常");
+        }
+
+        $goods = Goods::with([
+            'sku' => function ($query) use ($skuId) {
+                $query->where('goods_sku_id', $skuId);
+            },
+            'running' => function ($query) {
+                $query->select('join_running_goods_id', 'goods_running_storage', 'goods_running_sale');
+            },
+            'detail' => function ($query) {
+                $query->select('join_detail_goods_id', 'goods_detail_slider_json');
+            },
+            'user' => function ($query) {
+                $query->select('user_id', 'user_name');
+            },
+            'updateUser' => function ($query) {
+                $query->select('user_id', 'user_name');
+            }
+        ])->where('goods_id', $goodsId)
+            ->first();
+        $goods = $goods ?? [];
+        if (!empty($goods['goods_cover'])) {
+            $goods['goods_cover'] = getenv('STORAGE_DOMAIN') . $goods['goods_cover'];
+        }
+        $sliderArr = [];
+        if (!empty($goods['detail']) && !empty($goods['detail']['goods_detail_slider_json'])) {
+            $sliderJson = json_decode($goods['detail']['goods_detail_slider_json'], true);
+            $sliders = explode(',', $sliderJson['slider']);
+            foreach ($sliders as $slider) {
+                $sliderArr[] = getenv('STORAGE_DOMAIN') . $slider;
             }
-
-            $month = date('Ym', $days[0]);
-            $days[1] = strtotime(date('Y-m-d', $days[1]) . " 23:59:59");
-        } else {
-            $month = date('Ym');
-        }
-
-        $categorySearchIds = '';
-        if (!empty($categoryId)){
-            $categorySearchPath = SysCategory::where('category_id',$categoryId)->value('category_super_path');
-            $categorySearchPath .= '#'. $categoryId.'#';
-
-            $categorySearchIds = SysCategory::where('category_super_path','like',$categorySearchPath.'%')->pluck('category_id')->toArray();
-            $categorySearchIds = array_merge($categorySearchIds,[$categoryId]);
-            $categorySearchIds = implode(',',$categorySearchIds);
         }
+        $goods['slider'] = $sliderArr;
 
-        $where = "where 1";
-        if (!empty($days)) {
-            $where .= " and di.data_income_addtimes between {$days[0]} and {$days[1]}";
-        }
-        if (!empty($classify)){
-            $where .= " and di.data_income_classify = '{$classify}'";
-        }
-        if (!empty($categorySearchIds)){
-            $where .= " and g.join_goods_category_id in({$categorySearchIds})";
+        if (!empty($goods['user'])) {
+            $goods['creator_username'] = $goods['user']['user_name'];
         }
-        if (!empty($goodsName)){
-            $where .= " and g.goods_name like '%{$goodsName}%' ";
+        if (!empty($goods['updateUser'])) {
+            $goods['updator_username'] = $goods['updateUser']['user_name'];
         }
-        if (!empty($premisesId)){
-            $where .= " and di.join_data_income_dept_id = {$premisesId}";
-        }
-        if (!empty($payType)){
-            $where .= " and di.data_income_pay_type = '{$payType}'";
-        }
-
-        $statisticsSql = "
-            select 
-                SUM(JSON_EXTRACT(join_data_income_object_json,'$.sheet[0].order_sheet_num')) as num,SUM(data_income_amount) as amount,COUNT(*) as count 
-            from app_data_income_{$month} as di
-                left join app_goods as g on REPLACE(JSON_EXTRACT(di.join_data_income_object_json,'$.sheet[0].goods_id'),'\"','') = g.goods_id 
-                {$where}
-        ";
-        $statistics = [];
-        $category = ['all', 'entity', 'service', 'package'];
-        foreach ($category as $item) {
-            $execSql = $statisticsSql;
-            if ($item == 'entity') {
-                $execSql .= " and data_income_classify in('GOODS')";
-            } elseif ($item == 'service') {
-                $execSql .= " and data_income_classify in('MEALS','CHNMED')";
-            } elseif ($item == 'package') {
-                $execSql .= " and data_income_classify = 'PACKAGE'";
+        if (!empty($goods['sku'])) {
+            foreach ($goods['sku'] as &$sku) {
+                if (!empty($sku['goods_sku_storage_json']) && !in_array($goods['goods_classify'], ['MEALS', 'PACKAGE'])) {
+                    $storageJson = json_decode($sku['goods_sku_storage_json'], true);
+                    $sku['storage'] = $storageJson['storage'];
+                } else {
+                    $sku['storage'] = !empty($goods['running']) ? $goods['running']['goods_running_storage'] : 0;
+                }
             }
-            $res = Db::select($execSql . ' limit 1');
-            $statistics[$item] = $res[0];
         }
 
-        return json_success('', $statistics);
+        return json_success('success', $goods);
     }
 }

+ 19 - 35
app/admin/controller/finance/MemberAccountController.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\finance;
 
 use app\model\Member;
+use app\model\MemberRole;
 use support\Db;
 use support\Request;
 
@@ -28,36 +29,14 @@ class MemberAccountController
             $month = date('Ym');
         }
 
-        // $rows = Db::table("data_account_{$month} as da")
-        //     ->leftJoin('member as m', 'm.member_id', '=', 'da.join_data_account_member_id')
-        //     ->leftJoin('member_cert as mc', 'mc.join_cert_member_id', '=', 'da.join_data_account_member_id')
-        //     ->leftJoin('member_info as mi', 'mi.join_info_member_id', '=', 'da.join_data_account_member_id')
-        //     ->when(!empty($classify), function ($query) use ($classify) {
-        //         $query->where('da.data_account_classify', $classify);
-        //     })
-        //     ->selectRaw("app_m.member_mobile,app_mc.member_cert_name,app_mi.member_info_nickname,app_m.member_addtimes as member_addtimes,
-        //         GROUP_CONCAT(app_da.data_account_income) as data_account_income,GROUP_CONCAT(app_da.data_account_expend) as data_account_expend,
-        //         GROUP_CONCAT(app_da.data_account_surplus) as data_account_surplus,GROUP_CONCAT(app_da.data_account_added) as data_account_added
-        //         ")
-        //     ->groupBy('da.join_data_account_member_id');
-
-        // $total = $rows->count('*');
-        // $rows = $rows->orderBy('m.member_addtimes','DESC')
-        //     ->forPage($page, $pageSize)
-        //     ->get()
-        //     ->toArray();
-        // $statistics = [];
-        // foreach ($rows as &$row){
-        //     $row->data_account_income = last(explode(',',$row->data_account_income));
-        //     $row->data_account_expend = last(explode(',',$row->data_account_expend));
-        //     $row->data_account_surplus = last(explode(',',$row->data_account_surplus));
-        //     $row->data_account_added = last(explode(',',$row->data_account_added));
-        //     $row->member_addtimes = date('Y-m-d H:i:s',$row->member_addtimes);
-        // }
-
-        // return json_success('', compact('rows', 'page', 'pageSize', 'total','statistics'));
-
-
+        // 兼容老等级搜索
+        $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');
@@ -70,13 +49,18 @@ class MemberAccountController
             }
         ])->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);
-        })->when(!empty($level), function ($query) use ($level) {
-            if ($level == '00'){
-                $query->where('join_member_role_id','')->orWhere('join_member_role_id',NULL);
-            }else{
+        })->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($days), function ($query) use ($days) {
             $query->whereBetween('member.member_addtimes', $days);
         })->when(!empty($premisesId), function ($query) use ($premisesId) {

+ 7 - 5
app/admin/controller/finance/WithdrawalListController.php

@@ -95,9 +95,9 @@ class WithdrawalListController extends Curd
             $item['member_is_referrer'] = isset($item['member']) ? $item['member']['member_is_referrer'] : '';
 
             unset($item['member'], $item['memberInfo'], $item['memberCert']);
-            if (!empty($item['member_account_list_extend_json'])){
-                $memberAccountListExtendJson = json_decode($item['member_account_list_extend_json'],true);
-                if (isset($memberAccountListExtendJson['reason'])){
+            if (!empty($item['member_account_list_extend_json'])) {
+                $memberAccountListExtendJson = json_decode($item['member_account_list_extend_json'], true);
+                if (isset($memberAccountListExtendJson['reason'])) {
                     $item['reason'] = $memberAccountListExtendJson['reason'];
                 }
             }
@@ -132,6 +132,8 @@ class WithdrawalListController extends Curd
         // 获取银行卡信息
         if (!empty($info->member_account_list_json)) {
             $accountListJson = json_decode($info->member_account_list_json, true);
+            $info->out_rate = !empty($accountListJson['out_rate']) ? $accountListJson['out_rate'] / 10 : 0;
+            $info->to_account = sprintf('%.2f',$info->member_account_list_amount - (round($info->member_account_list_amount * $info->out_rate / 100, 2)));
             $info->banks = [
                 [
                     'bank_name' => $accountListJson['bank_name'] ?? '',
@@ -142,10 +144,10 @@ class WithdrawalListController extends Curd
         }
         if (!empty($info->member_account_list_extend_json)) {
             $memberAccountListExtendJson = json_decode($info->member_account_list_extend_json, true);
-            if (isset($memberAccountListExtendJson['reason'])){
+            if (isset($memberAccountListExtendJson['reason'])) {
                 $info->reason = $memberAccountListExtendJson['reason'];
             }
-            if (isset($memberAccountListExtendJson['resulttime'])){
+            if (isset($memberAccountListExtendJson['resulttime'])) {
                 $info->resulttime = $memberAccountListExtendJson['resulttime'];
             }
         }

+ 16 - 21
app/admin/controller/member/MemberController.php

@@ -1127,30 +1127,25 @@ class MemberController
         $params = $request->post();
         Db::beginTransaction();
         try {
-            // 查出所有的充值订单
-            $orders = Order::where('join_order_member_id', $params['member_id'])
-                ->where('order_classify', 'RECHARGE')
-                ->where('order_is_complete', 'Y')
-                ->get()
-                ->toArray();
-            $orderIds = array_column($orders, 'order_id');
-            if (empty($orderIds)) {
-                throw new BusinessException("未查询到充值订单");
-            }
-
-            // 订单改为退款订单
-            Order::whereIn('order_id', $orderIds)->update([
-                'order_is_complete' => 'R'
-            ]);
 
-            OrderReturn::where('join_return_member_id', $params['member_id'])
-                ->where('order_return_status', '<>', 'DONE')
-                ->where('order_return_category', '会员退款')
-                ->delete();
+//            OrderReturn::where('join_return_member_id', $params['member_id'])
+//                ->where('order_return_status', '<>', 'DONE')
+//                ->where('order_return_category', '会员退款')
+//                ->delete();
+            // 验证余额
+            $memberAccount = MemberAccount::where('join_account_member_id', $params['member_id'])
+                ->where('member_account_classify', 'CASH')
+                ->first();
+            if ($params['surplus'] + $params['bank_amount'] > $memberAccount->member_account_surplus) {
+                throw new BusinessException("本金退款金额超出账户本金余额");
+            }
+            if ($params['added'] > $memberAccount->member_account_added) {
+                throw new BusinessException("赠送退款金额超出账户赠送余额");
+            }
 
             $returnApplyJson = [
                 'reason' => '会员退款',
-                'order_id' => $orderIds,
+                'order_id' => 'ROLE_REFUND',
                 'classify' => 'ROLE_REFUND',
                 'username' => $params['username'],
                 'mobile' => $params['mobile'],
@@ -1166,7 +1161,7 @@ class MemberController
             OrderReturn::insert([
                 'join_order_return_user_id' => JwtToken::getCurrentId(),
                 'join_return_member_id' => $params['member_id'],
-                'join_return_order_id' => $orderIds[0],
+                'join_return_order_id' => 'ROLE_REFUND',
                 'order_return_status' => 'PENDING',
                 'order_return_category' => '会员退款',
                 'order_return_apply_datetime' => date('Y-m-d H:i:s'),

+ 1 - 1
app/admin/controller/notify/RechargeController.php

@@ -158,7 +158,7 @@ class RechargeController
 
                     // 入收支明细表
                     $params['orderId'] = $payObjectJson['order_id'];
-                    $params['inout_category'] = '会员充值';
+                    $params['inout_category'] = '会员充值订单';
                     Event::dispatch('statistics.inout.in', $params);
                 }
             }

+ 11 - 5
app/admin/controller/order/DishesController.php

@@ -40,6 +40,11 @@ class DishesController extends Curd
             $where['order_addtimes'][1] = strtotime($where['order_addtimes'][1]);
         }
 
+        if (!empty($where['order_status_system']) && $where['order_status_system'] == 'AWAITING') {
+            $where['order_status_system'] = 'PAYING';
+            $where['order_status_payment'] = 'AWAITING';
+        }
+
         $order = $request->get('order', 'desc');
         $orderId = $request->get('order_id', '');
         $field = $field ?? 'order_addtimes';
@@ -63,23 +68,24 @@ class DishesController extends Curd
             $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
             if (!empty($where['order_id'])) {
                 $orderIds = array_intersect($orderIds, $goodsOrderIds);
-            }else{
+            } else {
                 $orderIds = $goodsOrderIds;
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 
@@ -170,7 +176,7 @@ class DishesController extends Curd
                     }
                 }
             }
-            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'],$item['order_id']);
+            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'], $item['order_id']);
         }
 
         return $items;

+ 4 - 3
app/admin/controller/order/GoodsController.php

@@ -88,18 +88,19 @@ class GoodsController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 

+ 4 - 3
app/admin/controller/order/KangyangCityController.php

@@ -86,18 +86,19 @@ class KangyangCityController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 

+ 20 - 4
app/admin/controller/order/NewCustomerController.php

@@ -11,6 +11,7 @@ use app\controller\Curd;
 use app\model\Appointment;
 use app\model\ClientConfig;
 use app\model\Coupon;
+use app\model\CouponDetail;
 use app\model\Goods;
 use app\model\GoodsComponent;
 use app\model\GoodsRunning;
@@ -87,18 +88,19 @@ class NewCustomerController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 
@@ -865,7 +867,21 @@ class NewCustomerController extends Curd
                             ->toArray();
                         foreach ($coupons as &$coupon) {
                             if (isset($goodsAttributeJson['coupon'][$coupon['coupon_id']])) {
-                                $coupon['num'] = $goodsAttributeJson['coupon'][$coupon['coupon_id']]['num'];
+                                $coupon['num'] = CouponDetail::where('join_detail_coupon_id', $coupon['coupon_id'])
+                                    ->where('join_coupon_detail_member_id', $order->join_order_member_id)
+//                                    ->whereJsonContains('coupon_detail_extend_json->order_id', $order->order_id)
+                                    ->count();
+                                $coupon['used'] = CouponDetail::where('join_detail_coupon_id', $coupon['coupon_id'])
+                                    ->where('join_coupon_detail_member_id', $order->join_order_member_id)
+//                                    ->whereJsonContains('coupon_detail_extend_json->order_id', $order->order_id)
+                                    ->where('coupon_detail_status', 'USED')
+                                    ->count();
+                                $coupon['invalid'] = CouponDetail::where('join_detail_coupon_id', $coupon['coupon_id'])
+                                    ->where('join_coupon_detail_member_id', $order->join_order_member_id)
+//                                    ->whereJsonContains('coupon_detail_extend_json->order_id', $order->order_id)
+                                    ->whereIn('coupon_detail_status', ['DISABLED','CANCEL','EXPIRED'])
+                                    ->count();
+                                $coupon['unused'] = $coupon['num'] - $coupon['used'] - $coupon['invalid'];
                             }
                         }
                     }

+ 4 - 3
app/admin/controller/order/PackagesController.php

@@ -91,18 +91,19 @@ class PackagesController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {

+ 4 - 3
app/admin/controller/order/PartnerController.php

@@ -87,18 +87,19 @@ class PartnerController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 

+ 12 - 6
app/admin/controller/order/RechargeController.php

@@ -89,18 +89,19 @@ class RechargeController extends Curd
         }
 
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 
@@ -311,8 +312,8 @@ class RechargeController extends Curd
             Db::commit();
             if ($params['order_status_payment'] == 'SUCCESS') {
                 // 入收支明细表
-                $params['inout_category'] = '会员充值订单';
-                Event::dispatch('statistics.inout.in', $params);
+//                $params['inout_category'] = '会员充值订单';
+//                Event::dispatch('statistics.inout.in', $params);
 
                 // 充值回调
                 (new \app\admin\controller\notify\RechargeController)->disposePaySuccess($payId);
@@ -823,7 +824,12 @@ class RechargeController extends Curd
                                     ->whereJsonContains('coupon_detail_extend_json->order_id', $order->order_id)
                                     ->where('coupon_detail_status', 'USED')
                                     ->count();
-                                $coupon['unused'] = $coupon['num'] - $coupon['used'];
+                                $coupon['invalid'] = CouponDetail::where('join_detail_coupon_id', $coupon['coupon_id'])
+                                    ->where('join_coupon_detail_member_id', $order->join_order_member_id)
+                                    ->whereJsonContains('coupon_detail_extend_json->order_id', $order->order_id)
+                                    ->whereIn('coupon_detail_status', ['DISABLED','CANCEL','EXPIRED'])
+                                    ->count();
+                                $coupon['unused'] = $coupon['num'] - $coupon['used'] - $coupon['invalid'];
                             }
                         }
                     }

+ 4 - 3
app/admin/controller/order/ReferrerController.php

@@ -87,18 +87,19 @@ class ReferrerController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 

+ 91 - 22
app/admin/controller/order/RefundController.php

@@ -338,6 +338,68 @@ class RefundController extends Curd
         return json_success('', $data);
     }
 
+    /**
+     * @Desc 会员退款详情
+     * @Author Gorden
+     * @Date 2024/10/25 9:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function rechargeSheet(Request $request)
+    {
+        $returnId = $request->get('return_id');
+        if (!$returnId) {
+            return json_fail("参数异常");
+        }
+
+        $return = OrderReturn::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile', 'join_member_role_id', 'member_is_owner', 'member_is_vip', 'member_is_partner', 'member_is_referrer');
+            },
+            'info' => function ($query) {
+                $query->select('join_info_member_id', 'member_info_nickname', 'member_info_headimg');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+        ])->where('orders_return_id', $returnId)
+            ->first();
+        if (!$return) {
+            return json_fail('数据异常');
+        }
+        $return = $return->toArray();
+
+        $return['role_name'] = MemberService::getRoleName(!empty($return['member']) ? $return['member']['join_member_role_id'] : '');
+        $return['info']['member_info_nickname'] = MemberService::getNickname(!empty($return['info']) ? $return['info']['member_info_nickname'] : '', !empty($return['member']) ? $return['member']['member_mobile'] : '');
+        $return['info']['member_info_headimg'] = MemberService::getAvatarUrl(!empty($return['info']) ? $return['info']['member_info_headimg'] : '');
+
+        if (!empty($return['order_return_apply_json']) && is_json($return['order_return_apply_json'])) {
+            $json = json_decode($return['order_return_apply_json'], true);
+            $return['reason'] = $json['reason'] ?? '';
+            $return['order_return_apply_json'] = $json;
+        }
+        if (!empty($return['order_return_recharge_json']) && is_json($return['order_return_recharge_json'])) {
+            $json = json_decode($return['order_return_recharge_json'], true);
+            $return['change'] = $json['change'] ?? '';
+        }
+        if (!empty($return['join_order_return_user_id'])) {
+            $return['disposeUserName'] = SysUser::where('user_id', $return['join_order_return_user_id'])->value('user_name');
+        }
+        if (!empty($return['order_return_refund_json'])) {
+            $returnRefundJson = json_decode($return['order_return_refund_json'], true);
+            if (!empty($returnRefundJson['user_id'])) {
+                $return['userName'] = SysUser::where('user_id', $returnRefundJson['user_id'])->value('user_name');
+            }
+        }
+
+        $data = [
+            'refund' => $return,
+        ];
+
+        return json_success('', $data);
+    }
+
     public function customRefund(Request $request)
     {
         $orderId = $request->post('order_id', '');
@@ -730,22 +792,22 @@ class RefundController extends Curd
      * @param Request $request
      * @return Response
      */
-    public function rechargeSheet(Request $request)
-    {
-        $refundId = $request->get('return_id');
-        if (!$refundId) {
-            return json_fail("参数异常");
-        }
-
-        $refund = OrderReturn::where('orders_return_id', $refundId)
-            ->first();
-        if (!empty($refund->order_return_apply_json)) {
-            $refund->order_return_apply_json = json_decode($refund->order_return_apply_json);
-        }
-
-
-        return json_success('', $refund);
-    }
+//    public function rechargeSheet(Request $request)
+//    {
+//        $refundId = $request->get('return_id');
+//        if (!$refundId) {
+//            return json_fail("参数异常");
+//        }
+//
+//        $refund = OrderReturn::where('orders_return_id', $refundId)
+//            ->first();
+//        if (!empty($refund->order_return_apply_json)) {
+//            $refund->order_return_apply_json = json_decode($refund->order_return_apply_json);
+//        }
+//
+//
+//        return json_success('', $refund);
+//    }
 
     /**
      * @Desc 充值退款
@@ -785,9 +847,9 @@ class RefundController extends Curd
         try {
             Db::beginTransaction();
             $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
-            $amount = $refundApplyJson['surplus'];
+            // 应减金额等于 扣除金额 + 银行打款金额
+            $amount = $refundApplyJson['surplus'] + $refundApplyJson['amount'];
             $addedAmount = $refundApplyJson['added'];
-//            $refundApplyJson['amount'] = $refundApplyJson[''];
             $refundApplyJson['added_amount'] = $addedAmount;
             $refundApplyJson['user_id'] = JwtToken::getCurrentId();
             $refundApplyJson['datetime'] = date('Y-m-d H:i:s');
@@ -824,18 +886,25 @@ class RefundController extends Curd
                     'coupon_detail_status' => 'DISABLED'
                 ]);
 
-            // 产生条退款记录 (pay_detail)
-            PayDetail::insert([
+            // 产生条退款记录 (pay_detail)
+            $payDetailInsertData = [
                 'join_pay_member_id' => $memberId,
                 'join_pay_order_id' => 'ROLE_REFUND',
                 'join_pay_object_json' => '[]',
                 'pay_status' => 'SUCCESS',
                 'pay_category' => 'ROLE_REFUND',
-                'pay_amount' => $amount + $addedAmount,
+                'pay_amount' => $refundApplyJson['amount'],
                 'pay_paytimes' => date('Y-m-d H:i:s'),
                 'pay_prepayid' => $memberId . '-CASH',
                 'pay_addtimes' => time()
-            ]);
+            ];
+            // 退款记录
+            PayDetail::insert($payDetailInsertData);
+            // 扣除记录
+            $payDetailInsertData['join_pay_order_id'] = 'ROLE_DEDUCT';
+            $payDetailInsertData['pay_category'] = 'ROLE_DEDUCT';
+            $payDetailInsertData['pay_amount'] = $refundApplyJson['surplus'] + $addedAmount;
+            PayDetail::insert($payDetailInsertData);
 
             Db::commit();
 

+ 4 - 3
app/admin/controller/order/ServicesController.php

@@ -85,18 +85,19 @@ class ServicesController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
 

+ 78 - 10
app/admin/controller/order/StatisticsController.php

@@ -8,17 +8,41 @@ use support\Request;
 
 class StatisticsController
 {
+    /**
+     * @Desc 标准订单
+     * @Author Gorden
+     * @Date 2024/10/28 9:57
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
     public function order(Request $request)
     {
         $orderCategory = $request->get('order_category');
+        $searchTime = $request->get('order_addtimes');
+        if (!empty($searchTime)) {
+            $searchTime[0] = strtotime($searchTime[0]);
+            $searchTime[1] = strtotime($searchTime[1]);
+        }
+
         if (!$orderCategory) {
             return json_fail('参数异常');
         }
         if ($orderCategory == 'SERVICE') {
             $orderCategory = ['SERVICE', 'CHNMED', 'CHNNCD'];
+        } else if ($orderCategory == 'ALL') {
+            $orderCategory = ['SERVICE', 'CHNMED', 'CHNNCD', 'GOODS', 'PACKAGE', 'MEALS', 'RECHARGE', 'COMBINE', 'PARTNER', 'REFERRER', 'VIP'];
         } else {
             $orderCategory = [$orderCategory];
         }
+
+        $where = '';
+        if (in_array('RECHARGE', $orderCategory)) {
+            $where = " and join_pay_order_id not in ('COMBINE','PARTNER','REFERRER')";
+        }
+
+        $orderCategoryStr = "'" . implode("','", $orderCategory) . "'";
+
         $todayTimeUnix = strtotime(date('Y-m-d'));
         $yesterdayStart = strtotime(date('Y-m-d', strtotime("-1 days")));
         $yesterdayEnd = strtotime(date('Y-m-d 23:59:59', strtotime("-1 days")));
@@ -28,37 +52,81 @@ class StatisticsController
         $statistics['todayRevenue'] = PayDetail::whereRaw('CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= ? ', [$todayTimeUnix])
             ->where('pay_status', 'SUCCESS')
             ->whereIn('pay_category', $orderCategory)
+            ->when(in_array('RECHARGE', $orderCategory), function ($query) {
+                $query->whereNotIn('join_pay_order_id', ['COMBINE', 'PARTNER', 'REFERRER']);
+            })
             ->sum('pay_amount');
+        $todayRevenueOrderNbrModel = Db::select("select count(1) as total from (select JSON_EXTRACT(join_pay_object_json,'$.order_id') as order_id from app_pay_detail where 
+                                                                       CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= {$todayTimeUnix} 
+                                                                        and pay_status = 'SUCCESS' 
+                                                                        and pay_category in ({$orderCategoryStr}) {$where}
+                                                                       group by order_id) count");
+        $statistics['todayRevenueOrderNbr'] = $todayRevenueOrderNbrModel[0]->total;
         // 昨日收入
         $statistics['yesterdayRevenue'] = PayDetail::whereRaw('CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= ? and CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) <= ?', [$yesterdayStart, $yesterdayEnd])
             ->where('pay_status', 'SUCCESS')
             ->whereIn('pay_category', $orderCategory)
+            ->when(in_array('RECHARGE', $orderCategory), function ($query) {
+                $query->whereNotIn('join_pay_order_id', ['COMBINE', 'PARTNER', 'REFERRER']);
+            })
             ->sum('pay_amount');
+        $yesterdayRevenueOrderNbrModel = Db::select("select count(1) as total from (select JSON_EXTRACT(join_pay_object_json,'$.order_id') as order_id from app_pay_detail where 
+                                                                       CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= {$yesterdayStart} and CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) <= {$yesterdayEnd} 
+                                                                        and pay_status = 'SUCCESS' 
+                                                                        and pay_category in ({$orderCategoryStr}) {$where}
+                                                                       group by order_id) count");
+        $statistics['yesterdayRevenueOrderNbr'] = $yesterdayRevenueOrderNbrModel[0]->total;
+
         // 本月收入
         $statistics['monthRevenue'] = PayDetail::whereRaw('CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= ? and CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) <= ?', [$monthStart, $monthEnd])
             ->where('pay_status', 'SUCCESS')
             ->whereIn('pay_category', $orderCategory)
+            ->when(in_array('RECHARGE', $orderCategory), function ($query) {
+                $query->whereNotIn('join_pay_order_id', ['COMBINE', 'PARTNER', 'REFERRER']);
+            })
             ->sum('pay_amount');
+        $monthRevenueOrderNbrModel = Db::select("select count(1) as total from (select JSON_EXTRACT(join_pay_object_json,'$.order_id') as order_id from app_pay_detail where 
+                                                                       CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= {$monthStart} and CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) <= {$monthEnd} 
+                                                                        and pay_status = 'SUCCESS' 
+                                                                        and pay_category in ({$orderCategoryStr}) {$where}
+                                                                       group by order_id) count");
+        $statistics['monthRevenueOrderNbr'] = $monthRevenueOrderNbrModel[0]->total;
         // 累计收入
         $statistics['totalRevenue'] = PayDetail::where('pay_status', 'SUCCESS')
             ->whereIn('pay_category', $orderCategory)
             ->sum('pay_amount');
-
+        $totalRevenueOrderNbrModel = Db::select("select count(1) as total from (select JSON_EXTRACT(join_pay_object_json,'$.order_id') as order_id from app_pay_detail where 
+                                                                        pay_status = 'SUCCESS' 
+                                                                        and pay_category in ({$orderCategoryStr}) {$where}
+                                                                       group by order_id) count");
+        $statistics['totalRevenueOrderNbr'] = $totalRevenueOrderNbrModel[0]->total;
         // 今日退款
-        $todayRefundItem = Db::select("select SUM(d2.pay_amount) as amount from app_pay_detail d1 
+        $todayRefundItem = Db::select("select SUM(d2.pay_amount) as amount,count(1) as total from app_pay_detail d1 
             inner join app_pay_detail d2 ON d1.join_pay_order_id=d2.join_pay_order_id and d2.pay_category='REFUND' 
-            where CAST(UNIX_TIMESTAMP(d2.pay_paytimes) as SIGNED) >= ? AND d1.pay_category in ('".implode("','",$orderCategory)."') 
+            where CAST(UNIX_TIMESTAMP(d2.pay_paytimes) as SIGNED) >= ? AND d1.pay_category in ({$orderCategoryStr}) 
             ", [$todayTimeUnix]);
-        $statistics['todayRefund'] = 0;
-        if (!empty($todayRefundItem) && !empty($todayRefundItem[0])){
-            $statistics['todayRefund'] = $todayRefundItem[0]->amount;
-        }
+        $statistics['todayRefund'] = $todayRefundItem[0]->amount;
+        $statistics['todayRefundNbr'] = $todayRefundItem[0]->total;
+
         // 累计退款
-        $totalRefundItem = Db::select("select SUM(d2.pay_amount) as amount, d1.pay_category as d1_pay_category,d2.pay_category as d2_pay_category from app_pay_detail d1 
+        $totalRefundItem = Db::select("select SUM(d2.pay_amount) as amount,count(1) as total from app_pay_detail d1 
             inner join app_pay_detail d2 ON d1.join_pay_order_id=d2.join_pay_order_id and d2.pay_category='REFUND' 
-            where d1.pay_category in ('".implode("','",$orderCategory)."') 
+            where d1.pay_category in ({$orderCategoryStr})
             ");
+        $statistics['totalRefund'] = $totalRefundItem[0]->amount;
+        $statistics['totalRefundNbr'] = $totalRefundItem[0]->total;
+
+        if (in_array('MEALS', $orderCategory)) {
+            // 挂账
+            $sql = "select SUM(order_amount_pay) as amount, count(1) as total from app_order where order_status_payment = 'AWAITING'";
+            if (!empty($searchTime)) {
+                $sql .= " and order_addtimes > {$searchTime[0]} and order_addtimes < $searchTime[1]";
+            }
+            $awaitingModel = Db::select($sql);
+            $statistics['awaitingRevenue'] = $awaitingModel[0]->amount;
+            $statistics['awaitingRevenueOrderNbr'] = $awaitingModel[0]->total;
+        }
 
-        dump($totalRefundItem);
+        return json_success('success', $statistics);
     }
 }

+ 18 - 10
app/admin/controller/order/WholeController.php

@@ -164,18 +164,19 @@ class WholeController extends Curd
             }
         }
         // 付款时间
+        $payOrderIds = [];
         if ($timeType == 'pay' && !empty($where['order_addtimes'])) {
             $payTimeStart = strtotime($where['order_addtimes'][0]);
             $payTimeEnd = strtotime($where['order_addtimes'][1]);
             unset($where['order_addtimes']);
             $payOrderIds = PayDetailService::getPayOrderId($payTimeStart, $payTimeEnd);
         }
-        if (!empty($orderIds) && !empty($payOrderIds)) {
+        if (!empty($where['order_id']) && $timeType == 'pay') {
             $orderIds = array_intersect($orderIds, $payOrderIds);
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($orderIds)) {
+        } elseif (!empty($where['order_id'])) {
             $where['order_id'] = ['in', implode(',', $orderIds)];
-        } elseif (!empty($payOrderIds)) {
+        } elseif ($timeType == 'pay') {
             $where['order_id'] = ['in', implode(',', $payOrderIds)];
         }
         // 自提订单        
@@ -290,7 +291,7 @@ class WholeController extends Curd
                 unset($item['join_express_order_id'], $item['order_express_type']);
             }
 
-            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'],$item['order_id']);
+            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'], $item['order_id']);
         }
 
         return $items;
@@ -526,6 +527,11 @@ class WholeController extends Curd
                 if (isset($orderExtendJson['free_remark'])) {
                     $order->free_remark = $orderExtendJson['free_remark'];
                 }
+                if ($order->order_status_payment == 'AWAITING' && !empty($orderExtendJson['awaiting_times'])){
+                    $order->awaiting_times = $orderExtendJson['awaiting_times'];
+                }elseif ($order->order_status_payment == 'AWAITING' && empty($orderExtendJson['awaiting_times'])){
+                    $order->awaiting_times = date('Y-m-d H:i:s',strtotime($order->order_addtimes));
+                }
             }
             $discount = ['coupon_name' => '', 'classify' => '', 'value' => 0];
             if (!empty($order->order_discount_json)) {
@@ -1877,8 +1883,8 @@ class WholeController extends Curd
             if (empty($order)) {
                 return json_fail('订单数据异常');
             }
-            if ($order->order_status_system != 'PAYING' || $order->order_category != 'DISHES') {
-                return json_fail('仅未支付的餐饮订单可以取消!');
+            if ($order->order_status_system != 'PAYING') {
+                return json_fail('仅未支付的订单可以取消!');
             }
             if (!empty($order->order_discount_json)) {
                 $orderDiscountJson = json_decode($order->order_discount_json, true);
@@ -5248,9 +5254,15 @@ class WholeController extends Curd
             } else if ($orderStatusPayment == 'FREE' && $order->order_status_payment != 'PENDING') {
                 throw new BusinessException("当前订单不允许免单");
             }
+            $orderExtendJson = [];
+            if (!empty($order->order_extend_json)) {
+                $orderExtendJson = json_decode($order->order_extend_json, true);
+            }
             // 挂账,释放餐桌
             if (in_array($orderStatusPayment, ['AWAITING', 'FREE'])) {
                 $order->order_status_payment = $orderStatusPayment;
+                $orderExtendJson['awaiting_times'] = date('Y-m-d H:i:s');
+                $order->order_extend_json = json_encode($orderExtendJson, JSON_UNESCAPED_UNICODE);
                 // 如果有餐桌,释放
                 if (!empty($order->order_config_json)) {
                     $orderConfigJson = json_decode($order->order_config_json, true);
@@ -5271,10 +5283,6 @@ class WholeController extends Curd
                     'coupon_detail_id' => ['免单'],
                     'coupon_classify_en' => ['free']
                 ];
-                $orderExtendJson = [];
-                if (!empty($order->order_extend_json)) {
-                    $orderExtendJson = json_decode($order->order_extend_json, true);
-                }
                 $orderExtendJson['free_remark'] = $freeRemark;
                 $order->order_discount_json = json_encode($orderDiscountJson, JSON_UNESCAPED_UNICODE);
                 $order->order_extend_json = json_encode($orderExtendJson, JSON_UNESCAPED_UNICODE);

+ 28 - 16
app/admin/controller/sys_manage/BellsController.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\sys_manage;
 
 use app\model\Order;
+use app\model\SysMessage;
 use support\Log;
 use support\Request;
 
@@ -10,41 +11,52 @@ class BellsController
 {
     public function orderNum()
     {
-        $orderNum = Order::whereJsonContains('order_config_json->bell', 'Y')->count();
+        $messageNum = SysMessage::where('message_status', 'PENDING')->count();
 
-        return json_success('success', ['num' => $orderNum]);
+        return json_success('success', ['num' => $messageNum]);
     }
 
     public function orderList()
     {
-        $orders = Order::whereJsonContains('order_config_json->bell', 'Y')
-            ->select('order_id', 'order_addtimes', 'order_status_system')
+        $messages = SysMessage::where('message_status', 'PENDING')
+            ->select('message_id', 'message_title', 'join_message_object_json', 'message_addtimes','message_category')
+            ->orderBy('message_addtimes', 'DESC')
             ->get()
             ->toArray();
+        foreach ($messages as &$message) {
+            if (!empty($message['join_message_object_json'])) {
+                $messageObjectJson = json_decode($message['join_message_object_json'], true);
+                $message['order_id'] = $messageObjectJson['order_id'] ?? '';
+            }
+        }
 
-        return json_success('success', ['orders' => $orders]);
+        return json_success('success', ['messages' => $messages]);
     }
 
+    /**
+     * @Desc 关闭订单提醒
+     * @Author Gorden
+     * @Date 2024/10/28 15:28
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
     public function closeOrderBell(Request $request)
     {
-        $orderId = $request->post('order_id');
-        if (!$orderId) {
+        $messageId = $request->post('message_id');
+        if (!$messageId) {
             return json_fail("参数异常");
         }
 
-        Log::info("订单提醒操作",$request->post());
+        Log::info("订单提醒操作", $request->post());
 
         try {
-            $order = Order::where('order_id', $orderId)->first();
-            if (!empty($order->order_config_json)) {
-                $orderConfigJson = json_decode($order->order_config_json, true);
-                unset($orderConfigJson['bell']);
+            $message = SysMessage::where('message_id', $messageId)->first();
+            $message->message_status = 'DONE';
+            $message->save();
 
-                $order->order_config_json = json_encode($orderConfigJson);
-                $order->save();
-            }
             return json_success('success');
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
             return json_fail('操作失败');
         }
     }

+ 2 - 1
app/admin/service/coupon/CouponService.php

@@ -202,7 +202,7 @@ class CouponService
                         // 发周期券
                         if ($couponModel->coupon_is_period == 'Y') {
                             // 发券参数
-                            $couponSendParams = ['gettype' => $gettype, 'coupon_id' => $key, 'member_id' => $params['member_id']];
+                            $couponSendParams = ['gettype' => $gettype, 'coupon_id' => $key, 'member_id' => $params['member_id'],'order_id' => $params['orderId']];
                             Log::info("发周期券参数", $couponSendParams);
                             CouponDetailService::sendPeriodCoupon($couponSendParams);
                             continue;
@@ -225,6 +225,7 @@ class CouponService
                         $couponSendParams = [
                             'gettype' => $gettype,
                             'coupon_id' => $key,
+                            'order_id' => $params['orderId'],
                             'chooseCouponNbr' => $coupon['num'],
                             'member_id' => $params['member_id'],
                             'coupon_detail_gain_datetime' => date('Y-m-d H:i:s'),

+ 34 - 10
app/admin/service/order/PayDetailService.php

@@ -88,16 +88,17 @@ class PayDetailService
             $data['pay_status'] = $detail['pay_status'];
             $data['pay_amount'] = $detail['pay_amount'];
             $data['pay_category'] = $detail['pay_category'];
-            $payWay = '';
-            if (in_array($detail['pay_prepayid'], ['WXPAY', 'ALIPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY', 'OFFLINE'])) {
-                $payWay = $detail['pay_prepayid'];
-            } else {
-                $prepayid = explode('-', $detail['pay_prepayid']);
-                if (!empty($prepayid[1]) && in_array($prepayid[1], ['CASH', 'WELFARE', 'QRCODE', 'NONE'])) {
-                    $payWay = $prepayid[1];
-                }
-            }
-            if (empty($payWay)){
+//            $payWay = '';
+//            if (in_array($detail['pay_prepayid'], ['WXPAY', 'ALIPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY', 'OFFLINE'])) {
+//                $payWay = $detail['pay_prepayid'];
+//            } else {
+//                $prepayid = explode('-', $detail['pay_prepayid']);
+//                if (!empty($prepayid[1]) && in_array($prepayid[1], ['CASH', 'WELFARE', 'QRCODE', 'NONE'])) {
+//                    $payWay = $prepayid[1];
+//                }
+//            }
+            $payWay = self::getPayWayByPrepayId($detail['pay_prepayid']);
+            if (empty($payWay)) {
                 $data['payWay'] = '';
                 return $data;
             }
@@ -111,4 +112,27 @@ class PayDetailService
 
         return $data;
     }
+
+    /**
+     * @Desc 根据prepayId 获取 支付方式
+     * @Author Gorden
+     * @Date 2024/10/28 14:04
+     *
+     * @param $prepayId
+     * @return mixed|string
+     */
+    public static function getPayWayByPrepayId($prepayId)
+    {
+        $payWay = '';
+        if (in_array($prepayId, ['WXPAY', 'ALIPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY', 'OFFLINE'])) {
+            $payWay = $prepayId;
+        } else {
+            $prepayId = explode('-', $prepayId);
+            if (!empty($prepayid[1]) && in_array($prepayid[1], ['CASH', 'WELFARE', 'QRCODE', 'NONE'])) {
+                $payWay = $prepayid[1];
+            }
+        }
+
+        return $payWay;
+    }
 }

+ 12 - 5
app/admin/service/sys_manage/CategoryService.php

@@ -135,7 +135,14 @@ class CategoryService
             ];
             if ($category->category_super_id != $params['category_super_id'] && $params['category_super_id'] != 0) {
                 $data['category_super_id'] = $params['category_super_id'];
-                $data['category_super_path'] = self::getCategoryPath($params['category_super_id']) . '#' . $params['category_super_id'] . '#';
+                $parentSuperPath = self::getCategoryPath($params['category_super_id']);
+                $superPath = '#' . $params['category_super_id'] . '#';
+                if ($parentSuperPath == $superPath) {
+                    $data['category_super_path'] = $superPath;
+                } else {
+                    $data['category_super_path'] = $parentSuperPath . $superPath;
+                }
+
             }
             if (!SysCategory::where('category_id', $id)->update($data)) {
                 throw new \Exception('分类修改失败');
@@ -225,8 +232,8 @@ class CategoryService
     {
         // 查询当前父级ID下的所有分类
         $list = self::getAllCategories($parentId);
-        $allCategories = self::getTree($list,152);
-        return json_success('',$allCategories);
+        $allCategories = self::getTree($list, 152);
+        return json_success('', $allCategories);
     }
 
     /**
@@ -241,7 +248,7 @@ class CategoryService
     {
         // 查询当前父级ID下的所有分类
         $row = SysCategory::where('category_super_id', $parentId)->where('category_status', 'ACTIVED')->get()->toArray();
-        if(!empty($row)) {
+        if (!empty($row)) {
             foreach ($row as $key => $value) {
                 // 当前分类加入数组
                 $value['label'] = $value['category_name'];
@@ -287,7 +294,7 @@ class CategoryService
      */
     public static function getCategoryInfos($ids)
     {
-        $category = SysCategory::whereIn('category_id', $ids)->select(['category_id','category_name','category_super_id'])->get()->toArray();
+        $category = SysCategory::whereIn('category_id', $ids)->select(['category_id', 'category_name', 'category_super_id'])->get()->toArray();
         if (!$category) {
             return json_fail('分类不存在');
         }

+ 8 - 5
app/event/ClientMessageEvent.php

@@ -6,6 +6,7 @@ use app\model\ClientMessage;
 use app\model\Order;
 use app\model\OrderReturn;
 use app\model\OrderSheet;
+use support\Log;
 
 class ClientMessageEvent
 {
@@ -19,6 +20,7 @@ class ClientMessageEvent
      */
     public function delivery($params)
     {
+        Log::info("发送消息", $params);
         try {
             $order = Order::where('order_id', $params['order_id'])
                 ->select('join_order_member_id')
@@ -54,6 +56,7 @@ class ClientMessageEvent
 
             $clientMessage->save();
         } catch (\Exception $e) {
+            Log::error("消息发送失败", ['msg' => $e->getMessage()]);
         }
     }
 
@@ -68,14 +71,14 @@ class ClientMessageEvent
     public function returnStatus($params)
     {
         try {
-            $orderReturn = OrderReturn::where('orders_return_id',$params['orders_return_id'])->first();
-            if (!$orderReturn){
+            $orderReturn = OrderReturn::where('orders_return_id', $params['orders_return_id'])->first();
+            if (!$orderReturn) {
                 return;
             }
 
-            if ($params['order_return_status'] == 'DOING'){
+            if ($params['order_return_status'] == 'DOING') {
                 $content = "商家已同意您的退货/退款申请。";
-            }else{
+            } else {
                 $content = "商家已拒绝您的退货/退款申请。";
             }
 
@@ -87,7 +90,7 @@ class ClientMessageEvent
             $clientMessage->client_message_status = 'PENDING';
             $clientMessage->client_message_category = 'NORMAL';
             $clientMessage->client_message_header_json = json_encode(['title' => '订单消息']);
-            $clientMessage->client_message_body_json = json_encode(['content' => '退货/退款通知:'.$content]);
+            $clientMessage->client_message_body_json = json_encode(['content' => '退货/退款通知:' . $content]);
             $clientMessage->client_message_addtimes = time();
             $clientMessage->save();
 

+ 3 - 1
app/event/order/NewCustomerEvent.php

@@ -29,7 +29,7 @@ class NewCustomerEvent
             }
 
             //发放优惠券
-            $goods = Goods::where('goods_id', $params['join_sheet_goods_id'])->select('goods_id','goods_name','goods_attribute_json')->first();
+            $goods = Goods::where('goods_id', $params['join_sheet_goods_id'])->select('goods_id', 'goods_name', 'goods_attribute_json')->first();
             if (!empty($goods) && !empty($goods->goods_attribute_json)) {
                 $goodsAttributeJson = json_decode($goods->goods_attribute_json, true);
                 if (isset($goodsAttributeJson['account'])) {
@@ -74,6 +74,7 @@ class NewCustomerEvent
                         if ($couponModel->coupon_is_period == 'Y') {
                             // 发券参数
                             $couponSendParams = [
+                                'order_id' => $params['orderId'],
                                 'gettype' => 'COMBINE',
                                 'coupon_id' => $key,
                                 'member_id' => $params['member_id']
@@ -103,6 +104,7 @@ class NewCustomerEvent
                         $couponSendParams = [
                             'gettype' => 'COMBINE',
                             'coupon_id' => $key,
+                            'order_id' => $params['orderId'],
                             'chooseCouponNbr' => $coupon['num'],
                             'member_id' => $params['member_id'],
                             'coupon_detail_gain_datetime' => date('Y-m-d H:i:s'),

+ 1 - 1
app/event/statistics/InOutEvent.php

@@ -78,7 +78,7 @@ class InOutEvent
                 $data['inout_name'][] = $sheet['goods']['goods_name'] ?? '';
                 if (!isset($inoutObjectJson['order'])) {
                     $inoutObjectJson['order'][$params['orderId']] = [
-                        'ordertime' => date('Y-m-d H:i:s',strtotime($order->order_addtimes)),
+                        'ordertime' => date('Y-m-d H:i:s', strtotime($order->order_addtimes)),
                         'pay' => $order->order_amount_pay,
                         'classify' => $order->order_classify,
                         'discount' => $order->order_discount_json ?? json_decode($order->order_discount_json)

+ 20 - 7
app/model/Goods.php

@@ -42,7 +42,12 @@ class Goods extends Model
     public function category()
     {
         return $this->hasOne(SysCategory::class, 'category_id', 'join_goods_category_id')
-            ->select('category_id','category_name');
+            ->select('category_id', 'category_name');
+    }
+
+    public function detail()
+    {
+        return $this->hasOne(GoodsDetail::class, 'join_detail_goods_id', 'goods_id');
     }
 
     /**
@@ -69,16 +74,24 @@ class Goods extends Model
 
     public function sku()
     {
-        return $this->hasMany(GoodsSku::class,'join_sku_goods_id','goods_id')
+        return $this->hasMany(GoodsSku::class, 'join_sku_goods_id', 'goods_id')
 //            ->where('goods_sku_status','ON')
-            ->select('goods_sku_id','join_sku_goods_id','goods_sku_specs_json','goods_sku_sales_price','goods_sku_status');
+            ->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price', 'goods_sku_status', 'goods_sku_storage_json');
+    }
+
+    public function skuOne()
+    {
+        return $this->hasOne(GoodsSku::class, 'join_sku_goods_id', 'goods_id')
+            ->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price', 'goods_sku_status', 'goods_sku_storage_json');
     }
 
-    public function user(){
-        return $this->hasOne(SysUser::class,'user_id','creator_user_id');
+    public function user()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'creator_user_id');
     }
 
-    public function updateUser(){
-        return $this->hasOne(SysUser::class,'user_id','updator_user_id');
+    public function updateUser()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'updator_user_id');
     }
 }

+ 5 - 0
app/model/OrderReturn.php

@@ -20,6 +20,11 @@ class OrderReturn extends Model
     {
         return $this->hasOne(Member::class, 'member_id', 'join_return_member_id');
     }
+
+    public function info(){
+        return $this->hasOne(MemberInfo::class,'join_info_member_id','join_return_member_id');
+    }
+
     public function cert()
     {
         return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_return_member_id');

+ 24 - 0
app/model/SysMessage.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class SysMessage extends Model
+{
+    protected $table = 'sys_message';
+
+    protected $primaryKey = 'message_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'message_addtimes';
+
+    const UPDATED_AT = null;
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 1 - 1
route/admin.php

@@ -152,7 +152,7 @@ Route::group('/admin', function () {
             Route::get('/statistics', [\app\admin\controller\finance\WriteOffController::class, 'statistics']);
         });
         Route::group('/goodsSales', function () {
-            Route::get('/statistics', [\app\admin\controller\finance\GoodsSalesController::class, 'statistics']);
+            Route::get('/info', [\app\admin\controller\finance\GoodsSalesController::class, 'info']);
             Route::get('/list', [\app\admin\controller\finance\GoodsSalesController::class, 'list']);
         });
         Route::group('/memberAccount', function () {