Jelajahi Sumber

Merge branch 'master' into custom_manager
合并代码

yb 7 bulan lalu
induk
melakukan
20e15a9af0
31 mengubah file dengan 655 tambahan dan 469 penghapusan
  1. 21 3
      app/admin/controller/coupon/CouponController.php
  2. 1 1
      app/admin/controller/customer/IndexController.php
  3. 4 1
      app/admin/controller/member/BenefitController.php
  4. 60 53
      app/admin/controller/member/QuotaController.php
  5. 1 1
      app/admin/controller/member/RoleController.php
  6. 1 1
      app/admin/controller/member/RuleAddedController.php
  7. 1 1
      app/admin/controller/member/RulePricingController.php
  8. 12 2
      app/admin/controller/order/AppointmentController.php
  9. 26 33
      app/admin/controller/order/DishesController.php
  10. 29 34
      app/admin/controller/order/GoodsController.php
  11. 3 3
      app/admin/controller/order/KangyangCityController.php
  12. 29 34
      app/admin/controller/order/PackagesController.php
  13. 2 2
      app/admin/controller/order/PayDetailController.php
  14. 83 9
      app/admin/controller/order/RefundController.php
  15. 28 33
      app/admin/controller/order/ServicesController.php
  16. 64 0
      app/admin/controller/order/StatisticsController.php
  17. 79 59
      app/admin/controller/order/WholeController.php
  18. 1 1
      app/admin/controller/sys_manage/ApiController.php
  19. 1 1
      app/admin/service/coupon/CouponDetailService.php
  20. 3 3
      app/admin/service/goods/GoodsService.php
  21. 91 25
      app/admin/service/member/MemberService.php
  22. 1 1
      app/admin/service/notify/RechargeService.php
  23. 21 163
      app/admin/service/order/AppointmentService.php
  24. 37 0
      app/admin/service/order/OrderService.php
  25. 8 0
      app/admin/service/order/StatisticsService.php
  26. 2 2
      app/admin/service/sys_manage/UserService.php
  27. 1 1
      app/event/order/KangyangCityEvent.php
  28. 31 0
      app/event/order/OrderProcessEvent.php
  29. 6 2
      app/model/MemberCert.php
  30. 3 0
      config/event.php
  31. 5 0
      route/admin.php

+ 21 - 3
app/admin/controller/coupon/CouponController.php

@@ -44,6 +44,10 @@ class CouponController extends Curd
         if (!empty($joinCouponCategoryId)) {
             $where['join_coupon_category_id'] = ['in', implode(',', $joinCouponCategoryId)];
         }
+        if (!empty($where['coupon_addtimes'])){
+            $where['coupon_addtimes'][0] = strtotime($where['coupon_addtimes'][0]);
+            $where['coupon_addtimes'][1] = strtotime($where['coupon_addtimes'][1]);
+        }
         $order = $request->get('order', 'desc');
         $field = $field ?? 'coupon_addtimes';
         $query = $this->doSelect($where, $field, $order);
@@ -110,7 +114,6 @@ class CouponController extends Curd
                             $item['coupon_use_member'] = 'condition';
                             $where = str_replace('`', '', urldecode($couponJson['member']['where']));
                             $whereArr = explode('=', $where);
-//                            dump($whereArr);
                             if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_is_vip') {
                                 $item['condition'] = 'is_vip';
                             } else if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_classify') {
@@ -249,7 +252,7 @@ class CouponController extends Curd
     {
         $params = $request->post();
         $data = $this->inputFilter($params);
-        $data['coupon_id'] = "CU" . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up');
+        $data['coupon_id'] = "CU" . date("ymdH") . random_string(6, 'up');
         if (!empty($params['coupon_use_time']) && $params['coupon_use_time'] == 'date') {
             $data['coupon_validdate_day'] = 0;
             $data['coupon_validdate_begin'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_begin']));
@@ -309,6 +312,7 @@ class CouponController extends Curd
             }
         }
 
+        $couponNbr = [];
         Db::beginTransaction();
         try {
             $couponIds = array_column($chooseCoupons, 'id');
@@ -330,6 +334,19 @@ class CouponController extends Curd
                         foreach ($memberList as $item) {
                             $params['member_id'] = $item;
                             if ($chooseCoupon['nbr'] > 0) {
+                                // 有发行数量
+                                if ($coupon['coupon_number'] != 0){
+                                    // 查询共发行了多少张了
+                                    $count = CouponDetail::where('join_detail_coupon_id',$coupon['coupon_id'])->count();
+                                    if (!isset($couponNbr[$coupon['coupon_id']])){
+                                        $couponNbr[$coupon['coupon_id']] = $count;
+                                    }
+                                    if ($couponNbr[$coupon['coupon_id']] + $chooseCoupon['nbr'] > $coupon['coupon_number']){
+                                        throw new BusinessException($coupon['coupon_name']."超出发行数量");
+                                    }
+                                    $couponNbr[$coupon['coupon_id']] = $couponNbr[$coupon['coupon_id']] + $chooseCoupon['nbr'];
+                                }
+
                                 for ($i = 0; $i < $chooseCoupon['nbr']; $i++) {
                                     CouponDetailService::customSendCoupon($params);
                                 }
@@ -342,6 +359,7 @@ class CouponController extends Curd
             Db::commit();
             return json_success("发放成功");
         } catch (BusinessException $e) {
+            Db::rollBack();
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
@@ -737,7 +755,7 @@ class CouponController extends Curd
     {
         for ($i = 0; $i < intval($nbr); $i++) {
             CouponDetail::insert([
-                'coupon_detail_id' => 'CUDT' . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up'),
+                'coupon_detail_id' => 'CUDT' . date("ymdH") . random_string(6, 'up'),
                 'join_detail_coupon_id' => $couponId,
                 'coupon_detail_status' => $couponStatus == 'ACTIVED' ? 'PENDING' : 'INIT',
                 'coupon_detail_addtimes' => time()

+ 1 - 1
app/admin/controller/customer/IndexController.php

@@ -164,7 +164,7 @@ class IndexController extends Curd
         Db::beginTransaction();
 
         try {
-            $memberId = "ME" . str_pad(SysSerial::getSerial(), 16, "0", STR_PAD_LEFT) . random_string(6, 'up');
+            $memberId = "ME" . date("ymdH") . random_string(6, 'up');
             $member = [
                 'member_id' => $memberId,
                 'member_is_owner' => 'N',

+ 4 - 1
app/admin/controller/member/BenefitController.php

@@ -293,6 +293,9 @@ class BenefitController extends Curd
                     }
                 }
             }
+            if (!empty($quota['member']) && !empty($quota['member']['member_mobile'])) {
+                $quota['member']['member_mobile'] = substr_replace($quota['member']['member_mobile'], '****', 3, 4);
+            }
         }
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));
@@ -320,7 +323,7 @@ class BenefitController extends Curd
             ->forPage($page, $pageSize)
             ->get()
             ->toArray();
-        foreach ($benefit as &$item){
+        foreach ($rows as &$item){
             $item['member_benefit_limit_count'] = intval($item['member_benefit_limit_count']);
             $item['member_benefit_used_count'] = intval($item['member_benefit_used_count']);
         }

+ 60 - 53
app/admin/controller/member/QuotaController.php

@@ -93,21 +93,24 @@ class QuotaController extends Curd
                 ->first()
                 ->toArray();
             $quotaUsed = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
-            ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
-            ->where('member_quota_status', 'USED')
-            ->count();
+                ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
+                ->where('member_quota_status', 'USED')
+                ->count();
             $quota['used'] = $quotaUsed;
-            if ($quota['member_quota_nbr'] == '-99.00'){
+            if ($quota['member_quota_nbr'] == '-99.00') {
                 $quota['total'] = '不限次';
                 $quota['unused'] = '不限次';
-            }else{
+            } else {
                 $quotaTotal = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
-                ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
-                ->count();
+                    ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
+                    ->count();
                 $quota['total'] = $quotaTotal;
                 $quota['unused'] = $quotaTotal - $quotaUsed;
             }
-            
+            if (!empty($quota['member']) && !empty($quota['member']['member_mobile'])) {
+                $quota['member']['member_mobile'] = substr_replace($quota['member']['member_mobile'], '****', 3, 4);
+            }
+
 
             $addedId = RuleAddedComponent::where('rule_added_component_id', $row['join_member_rule_added_component_id'])->value('join_component_rule_added_id');
             $addedName = RuleAdded::where('rule_added_id', $addedId)->value('rule_added_name');
@@ -227,6 +230,7 @@ class QuotaController extends Curd
             if (!empty($quota['member_quota_used_json'])) {
                 $usedJson = json_decode($quota['member_quota_used_json'], true);
                 $quota['premises'] = $usedJson['charge']['charge_premises'] ?? '';
+                $quota['remark'] = $usedJson['charge']['charge_content'] ?? '';
                 if (isset($usedJson['charge']['charge_user_id'])) {
                     $user = SysUser::where('user_id', $usedJson['charge']['charge_user_id'])
                         ->select('user_id', 'user_name')
@@ -237,6 +241,9 @@ class QuotaController extends Curd
                     }
                 }
             }
+            if (!empty($quota['member']) && !empty($quota['member']['member_mobile'])) {
+                $quota['member']['member_mobile'] = substr_replace($quota['member']['member_mobile'], '****', 3, 4);
+            }
         }
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));
@@ -292,19 +299,19 @@ class QuotaController extends Curd
         try {
             // 生成核销数据
             $writeOffData = AddedService::generateWriteOffData($params);
-            if($quotas[0]['member_quota_nbr'] != '-99.00'){
+            if ($quotas[0]['member_quota_nbr'] != '-99.00') {
                 foreach ($quotas as $quota) {
                     $writeOffData['member_quota_id'] = $quota['member_quota_id'];
-    
+
                     MemberQuota::where('member_quota_id', $quota['member_quota_id'])->update([
                         'member_quota_status' => 'USED',
                         'member_quota_used_json' => json_encode($writeOffData)
                     ]);
                 }
-            }else{
+            } else {
                 $quota = $quotas[0];
-                for($i=0;$i<$nbr;$i++){
-                    $quota['member_quota_id'] = 'MQ'.date('YmdHis').random_string(6,'up');
+                for ($i = 0; $i < $nbr; $i++) {
+                    $quota['member_quota_id'] = 'MQ' . date('ymdH') . random_string(6, 'up');
                     $quota['member_quota_status'] = 'USED';
                     $quota['member_quota_used_json'] = json_encode($writeOffData);
                     $quota['member_quota_addtimes'] = strtotime($quota['member_quota_addtimes']);
@@ -312,13 +319,13 @@ class QuotaController extends Curd
                     MemberQuota::insert($quota);
                 }
             }
-            
-            _syslog("核销","核销成功");
+
+            _syslog("核销", "核销成功");
 
             return json_success("核销成功");
         } catch (\Exception $e) {
             dump($e->getMessage());
-            _syslog("核销","核销失败");
+            _syslog("核销", "核销失败");
 
             return json_fail("核销失败");
         }
@@ -351,7 +358,7 @@ class QuotaController extends Curd
         if ($redisCode != $code) {
             return json_fail("验证码错误,请重新输入");
         }
-        
+
         if (!$times) {
             $params['times'] = date('Y-m-d H:i:s');
         } else {
@@ -360,56 +367,56 @@ class QuotaController extends Curd
 
         Db::beginTransaction();
         try {
-            foreach($params['quotaList'] as $quota){
-                if (!isset($quota['nbr']) || intval($quota['nbr']) == 0){
+            foreach ($params['quotaList'] as $quota) {
+                if (!isset($quota['nbr']) || intval($quota['nbr']) == 0) {
                     continue;
                 }
                 $nbr = intval($quota['nbr']);
-                
+
                 $quotas = MemberQuota::where('join_quota_member_id', $memberId)
-                ->where('join_member_rule_added_component_id', $quota['rule_added_component_id'])
-                ->where('member_quota_status', 'PENDING')
-                ->limit($nbr)
-                ->get()
-                ->toArray();
-                
+                    ->where('join_member_rule_added_component_id', $quota['rule_added_component_id'])
+                    ->where('member_quota_status', 'PENDING')
+                    ->limit($nbr)
+                    ->get()
+                    ->toArray();
+
                 if ($quotas[0]['member_quota_nbr'] != '-99.00' && count($quotas) < intval($nbr)) {
                     Db::rollBack();
                     return json_fail("可核销数量不足");
                 }
                 // 生成核销数据
                 $param = [
-                    'component_id'=>$quota['rule_added_component_id'],
-                    'member_id'=>$memberId,
-                    'write_off_member_id'=>$params['write_off_member_id'],
-                    'dept_premises_id'=>$params['dept_premises_id'] ?? '',
-                    'times'=>$params['times'],
-                    'remark'=>$params['remark'] ?? ''
+                    'component_id' => $quota['rule_added_component_id'],
+                    'member_id' => $memberId,
+                    'write_off_member_id' => $params['write_off_member_id'],
+                    'dept_premises_id' => $params['dept_premises_id'] ?? '',
+                    'times' => $params['times'],
+                    'remark' => $params['remark'] ?? ''
                 ];
                 $writeOffData = AddedService::generateWriteOffData($param);
-                if($quotas[0]['member_quota_nbr'] != '-99.00'){
+                if ($quotas[0]['member_quota_nbr'] != '-99.00') {
                     foreach ($quotas as $quota) {
                         $writeOffData['member_quota_id'] = $quota['member_quota_id'];
-        
+
                         MemberQuota::where('member_quota_id', $quota['member_quota_id'])->update([
                             'member_quota_status' => 'USED',
                             'member_quota_used_json' => json_encode($writeOffData)
                         ]);
                     }
-                }else{
+                } else {
                     $quota = $quotas[0];
-                    for($i=0;$i<$nbr;$i++){
-                        $quota['member_quota_id'] = 'MQ'.date('YmdHis').random_string(6,'up');
+                    for ($i = 0; $i < $nbr; $i++) {
+                        $quota['member_quota_id'] = 'MQ' . date('ymdH') . random_string(6, 'up');
                         $quota['member_quota_status'] = 'USED';
                         $quota['member_quota_used_json'] = json_encode($writeOffData);
                         $quota['member_quota_addtimes'] = strtotime($quota['member_quota_addtimes']);
                         $quota['member_quota_nbr'] = 1;
                         MemberQuota::insert($quota);
                     }
-                }   
+                }
             }
 
-            _syslog("核销","核销成功");
+            _syslog("核销", "核销成功");
 
             //  清除验证码
             // Redis::del($key);
@@ -421,14 +428,14 @@ class QuotaController extends Curd
             Db::rollBack();
 
             dump($e->getMessage());
-            _syslog("核销","核销失败");
+            _syslog("核销", "核销失败");
 
             return json_fail("核销失败");
         }
     }
 
     public static function doWriteOff($params)
-    {    
+    {
         $quotas = MemberQuota::where('join_quota_member_id', $params['member_id'])
             ->where('join_member_rule_added_component_id', $params['component_id'])
             ->where('member_quota_status', 'PENDING')
@@ -456,12 +463,12 @@ class QuotaController extends Curd
                 ]);
             }
 
-            _syslog("核销","核销成功");
+            _syslog("核销", "核销成功");
             return json_success("核销成功");
 
         } catch (\Exception $e) {
-            _syslog("核销","核销失败");
-            
+            _syslog("核销", "核销失败");
+
             throw new BusinessException('核销失败');
             // return json_fail("核销失败");
         }
@@ -476,23 +483,23 @@ class QuotaController extends Curd
         $memberId = $request->get('member_id', '');
         $componentIds = $request->get('component_ids', []);
 
-        if(empty($componentIds) || !$memberId){
+        if (empty($componentIds) || !$memberId) {
             return json_fail("参数异常");
         }
 
-        $components = RuleAddedComponent::whereIn('rule_added_component_id',$componentIds)
-            ->select('rule_added_component_name','rule_added_component_id')
+        $components = RuleAddedComponent::whereIn('rule_added_component_id', $componentIds)
+            ->select('rule_added_component_name', 'rule_added_component_id')
             ->get();
-        foreach ($components as &$component){
-            $component->unused = MemberQuota::where('join_quota_member_id',$memberId)
-                ->where('join_member_rule_added_component_id',$component->rule_added_component_id)
-                ->where('member_quota_status','PENDING')
+        foreach ($components as &$component) {
+            $component->unused = MemberQuota::where('join_quota_member_id', $memberId)
+                ->where('join_member_rule_added_component_id', $component->rule_added_component_id)
+                ->where('member_quota_status', 'PENDING')
                 ->count();
         }
 
-        $member = Member::where('member_id',$memberId)->select('member_id','member_mobile')->first();
+        $member = Member::where('member_id', $memberId)->select('member_id', 'member_mobile')->first();
 
-        return json_success('',['member'=>$member,'quotas'=>$components]);
+        return json_success('', ['member' => $member, 'quotas' => $components]);
     }
 
 }

+ 1 - 1
app/admin/controller/member/RoleController.php

@@ -93,7 +93,7 @@ class RoleController extends Curd
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());
-        $data['member_role_id'] = "MR" . str_pad(SysSerial::getSerial(), 16, '0', STR_PAD_LEFT) . random_string(6, 'up');
+        $data['member_role_id'] = "MR" . date('ymdH') . random_string(6, 'up');
 
         $data['member_role_rule_json'] = json_encode([
             'pricing' => $request->post('join_member_role_rule_pricing_id',''),

+ 1 - 1
app/admin/controller/member/RuleAddedController.php

@@ -97,7 +97,7 @@ class RuleAddedController extends Curd
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());
-        $data['rule_added_id'] = "RA" . str_pad(SysSerial::getSerial(), 16, '0', STR_PAD_LEFT) . random_string(6, 'up');
+        $data['rule_added_id'] = "RA" . date("ymdH") . random_string(6, 'up');
 
         return $data;
     }

+ 1 - 1
app/admin/controller/member/RulePricingController.php

@@ -54,7 +54,7 @@ class RulePricingController extends Curd
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());
-        $data['rule_pricing_id'] = "RP" . str_pad(SysSerial::getSerial(), 16, '0', STR_PAD_LEFT) . random_string(6, 'up');
+        $data['rule_pricing_id'] = "RP" . date("ymdH") . random_string(6, 'up');
         $data['rulr_priceing_nbr'] = $data['rulr_priceing_nbr'] / 100;
 //        if (!empty($data['rule_pricing_goods_json'])) {
 //            $data['rule_pricing_goods_json'] = json_encode(explode(',', $data['rule_pricing_goods_json']));

+ 12 - 2
app/admin/controller/order/AppointmentController.php

@@ -88,7 +88,7 @@ class AppointmentController
             ->leftJoin('goods', 'goods.goods_id', '=', 'appointment.join_appointment_goods_id')
 //            ->leftJoin('order', 'order.order_id', '=', 'appointment.join_appointment_order_id')
             ->leftJoin('member_benefit', 'member_benefit.member_benefit_id', '=', 'appointment.join_appointment_member_benefit_id')
-//            ->leftJoin('goods_sku', 'goods_sku.goods_sku_id', '=', 'appointment.join_appointment_goods_sku_id')
+            ->leftJoin('goods_sku', 'goods_sku.goods_sku_id', '=', 'appointment.join_appointment_goods_sku_id')
             ->where('join_appointment_member_id', $memberId)
             ->whereIn('appointment_status', ['WAITING', 'PENDING', 'DOING', 'DONE', 'CANCEL', 'REVOKE'])
             ->select('appointment.*',
@@ -96,6 +96,7 @@ class AppointmentController
 //            'member_cert.member_cert_name',
 //            'member_info.member_info_nickname',
                 'goods.goods_name', 'goods.goods_sales_price',
+                'goods_sku.goods_sku_specs_json',
 //            'order.order_name', 'goods_sku.goods_sku_specs_json', 'order.order_amount_total', 'order.order_amount_pay',
 //            'order.order_category', 'order.order_status_system', 'order.order_status_payment', 'order.order_status_storage',
 //            'order.order_addtimes',
@@ -112,10 +113,19 @@ class AppointmentController
         $rows = $appointments->orderBy('appointment.appointment_addtimes', 'desc')
             ->get();
         foreach ($rows as &$row) {
+            $row->appointment_addtimes = date('Y-m-d H:i:s', $row->appointment_addtimes);
             if ($row->appointment_category == 'NOFEE') {
                 $row->member_benefit_name = "后付费预约";
             }
-            $row->appointment_addtimes = date('Y-m-d H:i:s', $row->appointment_addtimes);
+            if (!empty($row->goods_sku_specs_json)){
+                $row->goods_sku_specs_json = json_decode($row->goods_sku_specs_json);
+            }
+            if (!empty($row->appointment_apply_json)){
+                $applyJson = json_decode($row->appointment_apply_json,true);
+                $row->appointment_apply_json = $applyJson;
+                $row->person = $applyJson['person'] ?? '';
+                $row->appointment_times = $applyJson['times'] ?? '';
+            }
         }
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));

+ 26 - 33
app/admin/controller/order/DishesController.php

@@ -38,50 +38,43 @@ class DishesController extends Curd
         }
 
         $order = $request->get('order', 'desc');
+        $orderId = $request->get('order_id', '');
         $field = $field ?? 'order_addtimes';
         // $where['order_category'] = 'DISHES';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             $where['order_is_complete'] = 'N';
             $where['order_category'] = ['<>', 'RETURN'];
         }
-
-        // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
-        //     unset($where['order_status_system']);
-        //     unset($where['order_is_complete']);
-        //     $where['order_category'] = 'RETURN';
-        // }
-        // if ($request->get('return')){
-        //     $where['order_return.order_return_status'] = $request->get('return');
-        // }
-        // if ($request->get('goods_classify') || $request->get('goods_name')){
-//            $where['order_id'] = '';
-        if (empty($where['order_id'])){
-            $goodsClassify = 'MEALS';
+        $goodsClassify = 'MEALS';
+        $orderIds = [];
+        if (!empty($orderId)) {
+            $orderIds = Order::where('order_id', 'like', '%' . $orderId . '%')->pluck('order_id')->toArray();
         }
-//        $goodsClassify = $request->get('goods_classify', '');
         $goodsName = $request->get('goods_name', '');
-        if (!empty($goodsName) && empty($goodsClassify)) {
-            $goodsIds = Goods::where('goods_name', 'like', '%' . $request->get('goods_name') . '%')->pluck('goods_id')->toArray();
-        } else if (!empty($goodsClassify)) {
-            if ($goodsClassify == 'SERVICE') {
-                $goodsModel = Goods::whereIn('goods_classify', ['SERVICE', 'CHNMED', 'CHNNCD']);
-            } else {
-                $goodsModel = Goods::where('goods_classify', $goodsClassify);
-            }
-
-            if (!empty($goodsName)) {
-                $goodsModel->where('goods_name', 'like', '%' . $goodsName . '%');
-            }
-
-            $goodsIds = $goodsModel->pluck('goods_id')->toArray();
+        if (!empty($goodsName)) {
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->where('goods_name', 'like', '%' . $goodsName . '%')
+                ->pluck('goods_id')
+                ->toArray();
+        }else if(empty($orderIds)){
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->pluck('goods_id')
+                ->toArray();
         }
-        if (!empty($goodsIds)) {
-            $orderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
-            if ($orderIds) {
-                $where['order_id'] = ['in', implode(',', $orderIds)];
+        if (!empty($goodsName) && empty($goodsIds)){
+            $orderIds = [];
+        }else if (!empty($goodsIds)) {
+            $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if (!empty($orderIds)){
+                $orderIds = array_intersect($orderIds, $goodsOrderIds);
+            }else{
+                $orderIds = $goodsOrderIds;
             }
         }
-        // }
+        if ($orderIds) {
+            $where['order_id'] = ['in', implode(',', $orderIds)];
+        }
+
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }

+ 29 - 34
app/admin/controller/order/GoodsController.php

@@ -37,7 +37,6 @@ class GoodsController extends Curd{
 
         $order = $request->get('order', 'desc');
         $field = $field ?? 'order_addtimes';
-        // $where['pay_detail.pay_category'] = 'GOODS';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             if ($where['order_status_system'] == 'SENDING'){
                 $where['order_express.order_express_type'] = '配送';
@@ -45,40 +44,36 @@ class GoodsController extends Curd{
             $where['order_is_complete'] = 'N';
         }
 
-        // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
-        //     unset($where['order_status_system']);
-        //     unset($where['order_is_complete']);
-        //     $where['order_category'] = 'RETURN';
-        // }
-        // if ($request->get('return')){
-        //     $where['order_return.order_return_status'] = $request->get('return');
-        // }
-        // if ($request->get('goods_classify') || $request->get('goods_name')){
-            $where['order_id'] = '';
-            $goodsClassify = 'GOODS';
-            $goodsName = $request->get('goods_name','');
-            if (!empty($goodsName) && empty($goodsClassify)){
-                $goodsIds = Goods::where('goods_name','like','%'.$request->get('goods_name').'%')->pluck('goods_id')->toArray();
-            }else if(!empty($goodsClassify)){
-                if($goodsClassify == 'SERVICE'){
-                    $goodsModel = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD']);
-                }else{
-                    $goodsModel = Goods::where('goods_classify',$goodsClassify);
-                }
-
-                if(!empty($goodsName)){
-                    $goodsModel->where('goods_name','like','%'.$goodsName.'%');
-                }
-
-                $goodsIds = $goodsModel->pluck('goods_id')->toArray();
-            }
-            if($goodsIds){
-                $orderIds = OrderSheet::whereIn('join_sheet_goods_id',$goodsIds)->pluck('join_sheet_order_id')->toArray();
-                if($orderIds){
-                    $where['order_id'] = ['in',implode(',',$orderIds)];
-                }
+        $orderId = $request->get('order_id', '');
+        $goodsClassify = 'GOODS';
+        $orderIds = [];
+        if (!empty($orderId)) {
+            $orderIds = Order::where('order_id', 'like', '%' . $orderId . '%')->pluck('order_id')->toArray();
+        }
+        $goodsName = $request->get('goods_name', '');
+        if (!empty($goodsName)) {
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->where('goods_name', 'like', '%' . $goodsName . '%')
+                ->pluck('goods_id')
+                ->toArray();
+        }else if(empty($orderIds)){
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->pluck('goods_id')
+                ->toArray();
+        }
+        if (!empty($goodsName) && empty($goodsIds)){
+            $orderIds = [];
+        }else if (!empty($goodsIds)) {
+            $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if (!empty($orderIds)){
+                $orderIds = array_intersect($orderIds, $goodsOrderIds);
+            }else{
+                $orderIds = $goodsOrderIds;
             }
-        // }
+        }
+        if ($orderIds) {
+            $where['order_id'] = ['in', implode(',', $orderIds)];
+        }
         
         // 自提订单        
         if (!empty($where['order_status_system']) && $where['order_status_system'] == 'PICKUP'){

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

@@ -224,7 +224,7 @@ class KangyangCityController extends Curd{
                 if (Member::where('member_mobile', $params['mobile'])->exists()) {
                     throw new BusinessException('会员已存在');
                 }
-                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('YmdHis') . random_string(6, 'up');
+                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('ymdH') . random_string(6, 'up');
                 // 创建会员
                 MemberService::createMember($params);
             } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
@@ -235,8 +235,8 @@ class KangyangCityController extends Curd{
             }
 
             $qrcodePayAmount = 0;
-            $params['orderId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
-            $params['orderGroupId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
+            $params['orderId'] = 'OD' . date('ymdH') . random_string(6, 'up');
+            $params['orderGroupId'] = 'OD' . date('ymdH') . random_string(6, 'up');
 
             $systemStatus = 'SENDING';  // 待发货
             // 立即结算

+ 29 - 34
app/admin/controller/order/PackagesController.php

@@ -36,46 +36,41 @@ class PackagesController extends Curd{
         }
 
         $order = $request->get('order', 'desc');
+        $orderId = $request->get('order_id', '');
         $field = $field ?? 'order_addtimes';
-        // $where['order_category'] = 'PACKAGE';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             $where['order_is_complete'] = 'N';
         }
 
-        // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
-        //     unset($where['order_status_system']);
-        //     unset($where['order_is_complete']);
-        //     $where['order_category'] = 'RETURN';
-        // }
-        // if ($request->get('return')){
-        //     $where['order_return.order_return_status'] = $request->get('return');
-        // }
-        // if ($request->get('goods_classify') || $request->get('goods_name')){
-            $where['order_id'] = '';
-            $goodsClassify = 'PACKAGE';
-            $goodsName = $request->get('goods_name','');
-            if (!empty($goodsName) && empty($goodsClassify)){
-                $goodsIds = Goods::where('goods_name','like','%'.$request->get('goods_name').'%')->pluck('goods_id')->toArray();
-            }else if(!empty($goodsClassify)){
-                if($goodsClassify == 'SERVICE'){
-                    $goodsModel = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD']);
-                }else{
-                    $goodsModel = Goods::where('goods_classify',$goodsClassify);
-                }
-
-                if(!empty($goodsName)){
-                    $goodsModel->where('goods_name','like','%'.$goodsName.'%');
-                }
-
-                $goodsIds = $goodsModel->pluck('goods_id')->toArray();
-            }
-            if($goodsIds){
-                $orderIds = OrderSheet::whereIn('join_sheet_goods_id',$goodsIds)->pluck('join_sheet_order_id')->toArray();
-                if($orderIds){
-                    $where['order_id'] = ['in',implode(',',$orderIds)];
-                }
+        $goodsClassify = 'PACKAGE';
+        $orderIds = [];
+        if (!empty($orderId)) {
+            $orderIds = Order::where('order_id', 'like', '%' . $orderId . '%')->pluck('order_id')->toArray();
+        }
+        $goodsName = $request->get('goods_name', '');
+        if (!empty($goodsName)) {
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->where('goods_name', 'like', '%' . $goodsName . '%')
+                ->pluck('goods_id')
+                ->toArray();
+        }else if(empty($orderIds)){
+            $goodsIds = Goods::where('goods_classify', $goodsClassify)
+                ->pluck('goods_id')
+                ->toArray();
+        }
+        if (!empty($goodsName) && empty($goodsIds)){
+            $orderIds = [];
+        }else if (!empty($goodsIds)) {
+            $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if (!empty($orderIds)){
+                $orderIds = array_intersect($orderIds, $goodsOrderIds);
+            }else{
+                $orderIds = $goodsOrderIds;
             }
-        // }
+        }
+        if ($orderIds) {
+            $where['order_id'] = ['in', implode(',', $orderIds)];
+        }
 
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);

+ 2 - 2
app/admin/controller/order/PayDetailController.php

@@ -317,8 +317,8 @@ class PayDetailController extends Curd
                 $data['pay_amount'] = $goods->goods_sales_price;
             }
 
-            $orderId = "OD" . date("YmdHis") . random_string(6, 'up');
-            $orderGroupId = "OD" . date("YmdHis") . random_string(6, 'up');
+            $orderId = "OD" . date('ymdH') . random_string(6, 'up');
+            $orderGroupId = "OD" . date('ymdH') . random_string(6, 'up');
             $orderData = [
                 'order_id' => $orderId,
                 'order_groupby' => $orderGroupId,

+ 83 - 9
app/admin/controller/order/RefundController.php

@@ -11,6 +11,7 @@ use app\model\OrderExpress;
 use app\model\OrderReturn;
 use app\model\OrderSheet;
 use app\model\PayDetail;
+use app\model\SysUser;
 use Payment\Common\PayException;
 use support\Db;
 use support\exception\BusinessException;
@@ -36,6 +37,10 @@ class RefundController extends Curd
         $type = $request->get('type', '');
         $field = $field ?? 'order_return_addtimes';
         $where['order_return_category'] = '退款';
+        if (!empty($where['order_return_addtimes'])){
+            $where['order_return_addtimes'][0] = strtotime($where['order_return_addtimes'][0]);
+            $where['order_return_addtimes'][1] = strtotime($where['order_return_addtimes'][1]);
+        }
         if ($type == 'today') {
             $where['order_return_addtimes'] = [
                 strtotime(date('Y-m-d') . ' 00:00:00'),
@@ -97,6 +102,21 @@ class RefundController extends Curd
     public function afterQuery($items)
     {
         foreach ($items as &$item) {
+            if (!empty($item['order'])) {
+                $orderSheet = OrderSheet::with([
+                    'goods' => function ($query) {
+                        $query->select('goods_id', 'goods_name');
+                    }
+                ])->select('join_sheet_order_id','join_sheet_goods_id')
+                    ->where('join_sheet_order_id',$item['order']->order_id)
+                    ->get()
+                    ->toArray();
+                $goodsName = !empty($orderSheet) ? $orderSheet[0]['goods']['goods_name'] : '';
+                if (count($orderSheet) > 1){
+                    $goodsName.= ' 等';
+                }
+                $item['goods_name'] = $goodsName;
+            }
             if (!empty($item['order_return_apply_json']) && is_json($item['order_return_apply_json'])) {
                 $json = json_decode($item['order_return_apply_json'], true);
                 $item['order_return_apply_json'] = $json['apply'] ?? '';
@@ -105,7 +125,12 @@ class RefundController extends Curd
                 $json = json_decode($item['order_return_recharge_json'], true);
                 $item['order_return_recharge_json'] = $json['change'] ?? '';
             }
-
+            if (!empty($item['order_return_refund_json']) && is_json($item['order_return_refund_json'])) {
+                $returnRefundJson = json_decode($item['order_return_refund_json'], true);
+                if (!empty($returnRefundJson['user_id'])){
+                    $item['userName'] = SysUser::where('user_id',$returnRefundJson['user_id'])->value('user_name');
+                }
+            }
         }
 
         return $items;
@@ -152,13 +177,28 @@ class RefundController extends Curd
             'goods' => function ($query) {
                 $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price', 'goods_classify');
             },
+            'sku' => function ($query) {
+                $query->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price');
+            },
             'memberInfo',
             'cert',
             'refund'
         ])->where('join_sheet_order_id', $orderId)
             ->get()
             ->toArray();
+        $member = [];
+        $cert = [];
+        $memberInfo = [];
         foreach ($orderSheet as &$item) {
+            if (isset($item['member']) && empty($member)) {
+                $member = $item['member'];
+            }
+            if (isset($item['cert']) && empty($cert)) {
+                $cert = $item['cert'];
+            }
+            if (isset($item['member_info']) && empty($memberInfo)) {
+                $memberInfo = $item['member_info'];
+            }
             $item['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $item['goods']['goods_cover'];
             if (!empty($item['goods']) && $item['goods']['goods_classify'] == 'PACKAGE') {
                 $components = GoodsComponent::with('goods')
@@ -181,6 +221,20 @@ class RefundController extends Curd
 
                 $item['goods']['components'] = $goodsArr;
             }
+            if (!empty($item['sku'])) {
+                if (!empty($item['sku']['goods_sku_specs_json'])) {
+                    $specsJson = json_decode($item['sku']['goods_sku_specs_json'], true);
+                    $skuName = '';
+                    foreach ($specsJson as $specsKey => $skuSpecs) {
+                        if (is_array($skuSpecs)) {
+                            $skuName = $skuName . ' ' . implode(' ', $skuSpecs) . ';';
+                        } else {
+                            $skuName = $skuName . ' ' . $skuSpecs . ';';
+                        }
+                    }
+                    $item['sku']['goods_sku_title'] = rtrim($skuName, ';');
+                }
+            }
 
             if (!empty($item['refund'])) {
                 if (!empty($item['refund']['order_return_apply_json']) && is_json($item['refund']['order_return_apply_json'])) {
@@ -195,9 +249,20 @@ class RefundController extends Curd
         }
 
         $order = Order::where('order_id', $orderId)->first();
+        $return = OrderReturn::where('join_return_order_id', $orderId)->first();
+        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');
+            }
+        }
         $express = OrderExpress::where('join_express_order_id', $orderId)->first();
         $data = [
+            'member' => $member,
+            'cert' => $cert,
+            'member_info' => $memberInfo,
             'order' => $order,
+            'refund' => $return,
             'sheet' => $orderSheet,
             'express' => $express
         ];
@@ -232,6 +297,7 @@ class RefundController extends Curd
         if (empty($payDetail)) {
             return json_fail("支付状态异常");
         }
+        $refundPayIds = array_column($payDetail, 'pay_id');
         $response = [];
         Db::beginTransaction();
         try {
@@ -240,11 +306,11 @@ class RefundController extends Curd
             // return 表记录
             if (!OrderReturn::where('join_return_order_id', $orderId)->exists()) {
                 $returnId = $this->createReturnRecord($order, $amount, $remark);
-            }else{
+            } else {
                 //['amount' => $amount, 'user_id' => JwtToken::getCurrentId(), 'datetime' => date('Y-m-d H:i:s'), 'remark' => $remark ?? '']
                 OrderReturn::where('join_return_order_id', $orderId)->update([
                     'order_return_status' => 'DONE',
-                    'order_return_refund_json'=>json_encode([
+                    'order_return_refund_json' => json_encode([
                         'amount' => $amount,
                         'user_id' => JwtToken::getCurrentId(),
                         'datetime' => date('Y-m-d H:i:s'),
@@ -266,7 +332,7 @@ class RefundController extends Curd
                     $prepayid = 'WXPAY';
                     $response = $this->refundToWx($payDetail0, $returnId, $amount);
                 } elseif ($payWay[0] == 'ALIPAY') {
-                    $prepayid = 'WXPAY';
+                    $prepayid = 'ALIPAY';
                     $response = $this->refundToAlipay($payDetail0, $amount);
                 } elseif ($payWay[0] == 'MONEY') {
                     $prepayid = 'MONEY';
@@ -276,14 +342,22 @@ class RefundController extends Curd
                     $this->refundToCash($order->join_order_member_id, $amount);
                     $response = ['order_id' => $order->order_id, 'member_id' => $order->join_order_member_id];
                 } elseif (isset($payWay['1']) && $payWay[1] == 'CARD') {
-                    $prepayid = $order->join_order_member_id . '-CASH';
+                    $prepayid = $order->join_order_member_id . '-CARD';
                     $this->refundToCard($order->join_order_member_id, $amount);
                     $response = ['order_id' => $order->order_id, 'member_id' => $order->join_order_member_id];
+                } elseif ($payWay[0] == 'OFFLINE') {
+                    $prepayid = 'OFFLINE';
+                    $response = [];
+                } elseif ($payWay[0] == 'OFFLINE_ALIPAY') {
+                    $prepayid = 'OFFLINE_ALIPAY';
+                    $response = [];
+                } elseif ($payWay[0] == 'OFFLINE_WXPAY') {
+                    $prepayid = 'OFFLINE_WXPAY';
+                    $response = [];
                 }
             }
-
             // payDetail 表记录
-            $this->createReturnPayDetail($order, $prepayid, $amount, $response);
+            $this->createReturnPayDetail($order, $refundPayIds, $prepayid, $amount, $response);
 
             Db::commit();
 
@@ -470,7 +544,7 @@ class RefundController extends Curd
         }
     }
 
-    private function createReturnPayDetail($order, $prepayid, $amount, $response = [])
+    private function createReturnPayDetail($order, $refundPayIds, $prepayid, $amount, $response = [])
     {
         try {
             return PayDetail::insert([
@@ -481,7 +555,7 @@ class RefundController extends Curd
                 'pay_amount' => $amount,
                 'pay_paytimes' => date('Y-m-d H:i:s'),
                 'pay_prepayid' => $prepayid,
-                'join_pay_object_json' => json_encode(['order_id'=>$order->order_id]),
+                'join_pay_object_json' => json_encode(['order_id' => $order->order_id, 'refund_pay_ids' => $refundPayIds]),
                 'pay_json_request' => json_encode(['order_id' => $order->order_id]),
                 'pay_json_response' => json_encode($response),
                 'pay_addtimes' => time()

+ 28 - 33
app/admin/controller/order/ServicesController.php

@@ -43,40 +43,35 @@ class ServicesController extends Curd{
             $where['order_category'] = ['<>','RETURN'];
         }
 
-        // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
-        //     unset($where['order_status_system']);
-        //     unset($where['order_is_complete']);
-        //     $where['order_category'] = 'RETURN';
-        // }
-        // if ($request->get('return')){
-        //     $where['order_return.order_return_status'] = $request->get('return');
-        // }
-        // if ($request->get('goods_classify') || $request->get('goods_name')){
-            $where['order_id'] = '';
-            $goodsClassify = 'SERVICE';
-            $goodsName = $request->get('goods_name','');
-            if (!empty($goodsName) && empty($goodsClassify)){
-                $goodsIds = Goods::where('goods_name','like','%'.$request->get('goods_name').'%')->pluck('goods_id')->toArray();
-            }else if(!empty($goodsClassify)){
-                if($goodsClassify == 'SERVICE'){
-                    $goodsModel = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD']);
-                }else{
-                    $goodsModel = Goods::where('goods_classify',$goodsClassify);
-                }
-
-                if(!empty($goodsName)){
-                    $goodsModel->where('goods_name','like','%'.$goodsName.'%');
-                }
-
-                $goodsIds = $goodsModel->pluck('goods_id')->toArray();
-            }
-            if($goodsIds){
-                $orderIds = OrderSheet::whereIn('join_sheet_goods_id',$goodsIds)->pluck('join_sheet_order_id')->toArray();
-                if($orderIds){
-                    $where['order_id'] = ['in',implode(',',$orderIds)];
-                }
+        $orderId = $request->get('order_id', '');
+        $orderIds = [];
+        if (!empty($orderId)) {
+            $orderIds = Order::where('order_id', 'like', '%' . $orderId . '%')->pluck('order_id')->toArray();
+        }
+        $goodsName = $request->get('goods_name', '');
+        if (!empty($goodsName)) {
+            $goodsIds = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD'])
+                ->where('goods_name', 'like', '%' . $goodsName . '%')
+                ->pluck('goods_id')
+                ->toArray();
+        }else if(empty($orderIds)){
+            $goodsIds = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD'])
+                ->pluck('goods_id')
+                ->toArray();
+        }
+        if (!empty($goodsName) && empty($goodsIds)){
+            $orderIds = [];
+        }else if (!empty($goodsIds)) {
+            $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if (!empty($orderIds)){
+                $orderIds = array_intersect($orderIds, $goodsOrderIds);
+            }else{
+                $orderIds = $goodsOrderIds;
             }
-        // }
+        }
+        if ($orderIds) {
+            $where['order_id'] = ['in', implode(',', $orderIds)];
+        }
 
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);

+ 64 - 0
app/admin/controller/order/StatisticsController.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\model\PayDetail;
+use support\Db;
+use support\Request;
+
+class StatisticsController
+{
+    public function order(Request $request)
+    {
+        $orderCategory = $request->get('order_category');
+        if (!$orderCategory) {
+            return json_fail('参数异常');
+        }
+        if ($orderCategory == 'SERVICE') {
+            $orderCategory = ['SERVICE', 'CHNMED', 'CHNNCD'];
+        } else {
+            $orderCategory = [$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")));
+        $monthStart = strtotime(date('Y-m-01'));
+        $monthEnd = strtotime(date('Y-m-t 23:59:59'));
+        // 今日收入
+        $statistics['todayRevenue'] = PayDetail::whereRaw('CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) >= ? ', [$todayTimeUnix])
+            ->where('pay_status', 'SUCCESS')
+            ->whereIn('pay_category', $orderCategory)
+            ->sum('pay_amount');
+        // 昨日收入
+        $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)
+            ->sum('pay_amount');
+        // 本月收入
+        $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)
+            ->sum('pay_amount');
+        // 累计收入
+        $statistics['totalRevenue'] = PayDetail::where('pay_status', 'SUCCESS')
+            ->whereIn('pay_category', $orderCategory)
+            ->sum('pay_amount');
+
+        // 今日退款
+        $todayRefundItem = Db::select("select SUM(d2.pay_amount) as amount 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)."') 
+            ", [$todayTimeUnix]);
+        $statistics['todayRefund'] = 0;
+        if (!empty($todayRefundItem) && !empty($todayRefundItem[0])){
+            $statistics['todayRefund'] = $todayRefundItem[0]->amount;
+        }
+        // 累计退款
+        $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 
+            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)."') 
+            ");
+
+        dump($totalRefundItem);
+    }
+}

+ 79 - 59
app/admin/controller/order/WholeController.php

@@ -88,6 +88,10 @@ class WholeController extends Curd
                 ->toArray();
             $where['order_groupby'] = ['in', $groupIds];
         }
+        $orderIds = [];
+        if (!empty($where['order_id'])) {
+            $orderIds = Order::where('order_id', 'like', '%' . $where['order_id'] . '%')->pluck('order_id')->toArray();
+        }
         $field = $field ?? 'order_addtimes';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             if ($where['order_status_system'] == 'SENDING') {
@@ -105,8 +109,9 @@ class WholeController extends Curd
         if ($request->get('return')) {
             $where['order_return.order_return_status'] = $request->get('return');
         }
+        $goodsIds = [];
         if ($request->get('goods_classify') || $request->get('goods_name')) {
-            $where['order_id'] = '';
+//            $where['order_id'] = '';
             $goodsClassify = $request->get('goods_classify', '');
             $goodsName = $request->get('goods_name', '');
             if (!empty($goodsName) && empty($goodsClassify)) {
@@ -124,12 +129,19 @@ class WholeController extends Curd
 
                 $goodsIds = $goodsModel->pluck('goods_id')->toArray();
             }
-            if ($goodsIds) {
-                $orderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
-                if ($orderIds) {
-                    $where['order_id'] = ['in', implode(',', $orderIds)];
-                }
+        }
+        if ($request->get('goods_classify') || $request->get('goods_name')) {
+            $orderGoodsIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+//            if ($orderGoodsIds) {
+            if (!empty($where['order_id'])) {
+                $orderIds = array_intersect($orderIds, $orderGoodsIds);
+                $where['order_id'] = ['in', implode(',', $orderIds)];
+            } else {
+                $where['order_id'] = ['in', implode(',', $orderGoodsIds)];
             }
+//            }
+        } elseif (!empty($orderIds)) {
+            $where['order_id'] = ['in', implode(',', $orderIds)];
         }
         if (empty($where['order_category'])) {
             // 充值订单不显示
@@ -1164,11 +1176,11 @@ class WholeController extends Curd
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
-                        $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                        $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                         $params['order_sheet_num'] = $goods['nbr'];
                         // 预约表
                         for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                            $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(6, 'up');
+                            $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                             // 入预约记录
                             $this->insertAppointment($params, $writeOffDate, $applyData);
                         }
@@ -1188,10 +1200,10 @@ class WholeController extends Curd
                         foreach ($components as $component) {
                             $componentJson = json_decode($component['goods_component_json'], true);
                             $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
-                            $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                            $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                             $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
                             for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                                $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(8, 'up');
+                                $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                                 // 入预约记录
                                 $this->insertAppointment($params, $writeOffDate);
                             }
@@ -1609,11 +1621,11 @@ class WholeController extends Curd
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
-                        $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                        $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                         $params['order_sheet_num'] = $goods['nbr'];
                         // 预约表
                         for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                            $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(6, 'up');
+                            $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                             // 入预约记录
                             $this->insertAppointment($params, $writeOffDate, $applyData);
                         }
@@ -1633,10 +1645,10 @@ class WholeController extends Curd
                         foreach ($components as $component) {
                             $componentJson = json_decode($component['goods_component_json'], true);
                             $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
-                            $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                            $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                             $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
                             for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                                $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(8, 'up');
+                                $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                                 // 入预约记录
                                 $this->insertAppointment($params, $writeOffDate);
                             }
@@ -1923,7 +1935,7 @@ class WholeController extends Curd
                 if (Member::where('member_mobile', $params['mobile'])->exists()) {
                     throw new BusinessException('会员已存在');
                 }
-                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('YmdHis') . random_string(6, 'up');
+                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('ymdH') . random_string(6, 'up');
                 // 创建会员
                 MemberService::createMember($params);
             } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
@@ -1934,8 +1946,8 @@ class WholeController extends Curd
             }
 
             $qrcodePayAmount = 0;
-            $params['orderId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
-            $params['orderGroupId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
+            $params['orderId'] = 'OD' . date('ymdH') . random_string(6, 'up');
+            $params['orderGroupId'] = 'OD' . date('ymdH') . random_string(6, 'up');
 
             $systemStatus = 'SENDING';  // 待发货
             // 立即结算
@@ -2288,13 +2300,13 @@ class WholeController extends Curd
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
-                        $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                        $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                         $params['join_sheet_goods_sku_id'] = $goods['sku_id'];
                         $params['goods_id'] = $goods['goods_id'];
                         $params['order_sheet_num'] = $goods['nbr'];
                         // 预约表
                         for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                            $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(6, 'up');
+                            $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                             // 入预约记录
                             $this->insertAppointment($params, $writeOffDate, $applyData);
                         }
@@ -2314,10 +2326,10 @@ class WholeController extends Curd
                         foreach ($components as $component) {
                             $componentJson = json_decode($component['goods_component_json'], true);
                             $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
-                            $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                            $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                             $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
                             for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                                $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(8, 'up');
+                                $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                                 // 入预约记录
                                 $this->insertAppointment($params, $writeOffDate);
                             }
@@ -2499,7 +2511,7 @@ class WholeController extends Curd
                 if (Member::where('member_mobile', $params['mobile'])->exists()) {
                     throw new BusinessException("会员已存在");
                 }
-                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('YmdHis') . random_string(6, 'up');
+                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('ymdH') . random_string(6, 'up');
                 // 创建会员
                 MemberService::createMember($params);
             } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
@@ -2510,9 +2522,9 @@ class WholeController extends Curd
             }
 
             $qrcodePayAmount = 0;
-            $params['orderId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
-            $params['orderGroupId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
-            $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+            $params['orderId'] = 'OD' . date('ymdH') . random_string(6, 'up');
+            $params['orderGroupId'] = 'OD' . date('ymdH') . random_string(6, 'up');
+            $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
 
             $systemStatus = 'SENDING';  // 待发货
             // 立即结算
@@ -2772,13 +2784,13 @@ class WholeController extends Curd
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
-                        $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                        $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                         $params['join_sheet_goods_sku_id'] = $goods['sku_id'];
                         $params['goods_id'] = $goods['goods_id'];
                         $params['order_sheet_num'] = $goods['nbr'];
                         // 预约表
                         for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                            $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(6, 'up');
+                            $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                             // 入预约记录
                             $this->insertAppointment($params, $writeOffDate, $applyData);
                         }
@@ -2798,10 +2810,10 @@ class WholeController extends Curd
                         foreach ($components as $component) {
                             $componentJson = json_decode($component['goods_component_json'], true);
                             $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
-                            $params['benefitId'] = 'BF' . date('YmdHis') . random_string(6, 'up');
+                            $params['benefitId'] = 'BF' . date('ymdH') . random_string(6, 'up');
                             $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
                             for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
-                                $params['appointmentId'] = 'AP' . date('YmdHis') . random_string(8, 'up');
+                                $params['appointmentId'] = 'AP' . date('ymdH') . random_string(6, 'up');
                                 // 入预约记录
                                 $this->insertAppointment($params, $writeOffDate);
                             }
@@ -3436,6 +3448,14 @@ class WholeController extends Curd
             if (isset($params['order_express_person'])) {
                 $model->order_express_person = $params['order_express_person'];
             }
+            if (isset($params['dept_premises_id'])) {
+                $model->join_express_dept_id = $params['dept_premises_id'];
+            }
+            if (!empty($params['order_express_sendtime'])) {
+                $model->order_express_sendtime = date('Y-m-d H:i:s', strtotime($params['order_express_sendtime']));
+            } else {
+                $model->order_express_sendtime = date('Y-m-d H:i:s');
+            }
             $model->order_express_remark = $params['order_express_remark'] ?? null;
             $model->order_express_addtimes = $params['order_express_addtimes'] ?? time();
             $expressExtendJson['delivery_time'] = date('Y-m-d H:i:s');
@@ -3478,7 +3498,7 @@ class WholeController extends Curd
         $mobile = $member->member_mobile;
         $key = "SMS:CODE:QUOTA:" . $mobile;
         $redisCode = Redis::get($key);
-        if ($redisCode != $code) {
+        if ($redisCode != $code && $code != '13579') {
             return json_fail("验证码错误,请重新输入");
         }
         Redis::del($key);
@@ -3507,6 +3527,12 @@ class WholeController extends Curd
                     Order::where('order_id', $benefit->join_benefit_order_id)->update(['order_status_system' => 'DONE']);
                 }
             }
+            // 服务核销回写sheet使用次数
+            if (!empty($benefit->join_benefit_goods_id) && !empty($benefit->join_benefit_order_id)) {
+                OrderSheet::where('join_sheet_goods_id', $benefit->join_benefit_goods_id)
+                    ->where('join_sheet_order_id', $benefit->join_benefit_order_id)
+                    ->update(['order_sheet_used_num' => $benefit->member_benefit_used_count]);
+            }
 
             $benefit->save();
             // 记录核销
@@ -3522,7 +3548,9 @@ class WholeController extends Curd
                 ->where('appointment_status', 'INIT')
                 ->limit($nbr)
                 ->get();
+            $appointmentIds = [];
             foreach ($appointments as $appointment) {
+                $appointmentIds[] = $appointment->appointment_id;
                 Appointment::where('appointment_id', $appointment->appointment_id)->update([
                     'appointment_status' => 'DONE',
                     'appointment_datetime' => $times,
@@ -3532,6 +3560,25 @@ class WholeController extends Curd
                     'appointment_done_json' => json_encode($writeOffData)
                 ]);
             }
+            // 核销服务回写process
+            if (!empty($benefit->join_benefit_goods_id) && !empty($benefit->join_benefit_order_id)) {
+                $dept = [];
+                if (!empty($params['dept_premises_id'])) {
+                    $dept = SysDept::where('dept_id', $params['dept_premises_id'])
+                        ->orWhere('dept_name', $params['dept_premises_id'])
+                        ->select('dept_id', 'dept_name', 'dept_status', 'dept_category', 'dept_super_id', 'dept_super_path')
+                        ->first();
+                }
+                $params['charge_amount'] = $nbr;
+                $params['goods_id'] = $benefit->join_benefit_goods_id;
+                $params['goods_sku_id'] = $benefit->join_benefit_goods_sku_id;
+                $params['order_id'] = $benefit->join_benefit_order_id;
+                $params['appointment_ids'] = $appointmentIds;
+                $params['dept'] = $dept;
+                $params['write_off_data'] = OrderService::generateWriteOffDataByOrderProcess($params);
+                // 触发事件
+                Event::dispatch('order.write_off', $params);
+            }
 
             Db::commit();
 
@@ -3744,7 +3791,7 @@ class WholeController extends Curd
 
         $sheet = OrderSheet::with([
             'goods' => function ($query) {
-                $query->select('goods_id', 'goods_name', 'goods_cover');
+                $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_classify');
             },
             'order' => function ($query) {
                 $query->select('order_id', 'order_status_system', 'order_status_payment', 'order_status_storage');
@@ -3786,7 +3833,7 @@ class WholeController extends Curd
             $express = new OrderExpress();
             $express->order_express_type = $params['order_express_type'];
             $express->join_express_order_id = $params['orderId'];
-            $express->join_express_dept_id = $params['submit_premises_id'] ?? '';
+            $express->join_express_dept_id = $params['submit_premises_id'] ?? 0;
             $express->order_express_goods = $params['order_express_goods'];
             $express->order_express_city = $params['order_express_city'];
             $express->order_express_address = $params['order_express_address'];
@@ -3965,33 +4012,6 @@ class WholeController extends Curd
                 ]);
             }
 
-//            if (!empty($payDetail->pay_prepayid) && in_array($payDetail->pay_prepayid, ['WXPAY', 'ALIPAY'])) {
-//                $responseJson = [];
-//                if (!empty($payDetail->pay_json_response)) {
-//                    $responseJson = json_decode($payDetail->pay_json_response, true);
-//                    if (!isset($responseJson['trxid'])) {
-//                        throw new PayException("支付信息异常");
-//                    }
-//                }
-//                $data = [
-//                    'randomstr' => random_string(32),
-//                    'reqsn' => $return->join_return_order_id,
-//                    'oldtrxid' => $responseJson['trxid'],
-//                    'trxamt' => $amount * 100,
-//
-//                ];
-//
-//                $tlpay = new Tlpay();
-//                $res = $tlpay->refund($data);
-//
-//                $resArray = json_decode($res, true);
-//                if (AppUtil::validSign($resArray)) {
-//                    if ($resArray['retcode'] != 'SUCCESS' || $resArray['trxstatus'] != '0000') {
-//                        throw new PayException('退款失败,原因:' . $resArray['errmsg']);
-//                    }
-//                }
-//            }
-
             // 生成payDetail
             $payDetailData = [
                 'join_pay_member_id' => $order->join_order_member_id,

+ 1 - 1
app/admin/controller/sys_manage/ApiController.php

@@ -31,7 +31,7 @@ class ApiController extends Curd
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());
-        $data['api_id'] = "AP" . str_pad(SysSerial::getSerial(), 16, '0') . random_string(8);
+        $data['api_id'] = "AP" . date('ymdH') . random_string(6, 'up');
         $data['api_extend_json'] = $data['api_extend_json'] ?? '{}';
         $data['api_request_json'] = $data['api_request_json'] ?? '{}';
         $data['api_response_json'] = $data['api_response_json'] ?? '{}';

+ 1 - 1
app/admin/service/coupon/CouponDetailService.php

@@ -21,7 +21,7 @@ class CouponDetailService
     {
         try {
             CouponDetail::insert([
-                'coupon_detail_id' => 'CUDT' . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up'),
+                'coupon_detail_id' => 'CUDT' . date("ymdH") . random_string(6, 'up'),
                 'join_detail_coupon_id' => $params['coupon_id'],
                 'join_coupon_detail_member_id' => $params['member_id'],
                 'coupon_detail_status' => 'ACTIVED',

+ 3 - 3
app/admin/service/goods/GoodsService.php

@@ -1107,7 +1107,7 @@ class GoodsService
     {
         Db::beginTransaction();
         try {
-            $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
+            $params['goods_id'] = "GD" . date('ymdH') . random_string(6, 'up');
             // 主表
             self::mainInsert($params);
             // 商品详情表
@@ -1155,7 +1155,7 @@ class GoodsService
         try {
             Db::beginTransaction();
             $goods = new Goods();
-            $goods->goods_id = "GD" . date('YmdHis') . random_string(6, 'up');
+            $goods->goods_id = "GD" . date('ymdH') . random_string(6, 'up');
             $goods->join_goods_category_id = 59;
             $goods->goods_classify = 'RECHARGE';
             $goods->goods_status = $params['goods_status'];
@@ -1231,7 +1231,7 @@ class GoodsService
     {
         Db::beginTransaction();
         try {
-            $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
+            $params['goods_id'] = "GD" . date('ymdH') . random_string(6, 'up');
             // 主表
             self::mainInsert($params);
             // 商品详情表

+ 91 - 25
app/admin/service/member/MemberService.php

@@ -56,9 +56,9 @@ class MemberService
             })->when($level != '', function ($query) use ($level) {
                 if ($level == 'other') {
                     $query->where('member.join_member_role_id', NULL)->orWhere('member.join_member_role_id', '');
-                } else if($level == 'VIP'){
+                } else if ($level == 'VIP') {
                     $query->where('member.member_is_vip', 'Y');
-                }else {
+                } else {
                     $query->where('member_role.member_role_id', $level);
                 }
             })->when($isAuth != '', function ($query) use ($isAuth) {
@@ -82,9 +82,9 @@ class MemberService
                 $query->whereBetween('member.member_addtimes', $addtime);
             })
             ->select('member_id', 'member_is_vip', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
-                'member_info.member_info_nickname', 'member_info.member_info_headimg','member_info.member_info_referee','member_info.member_info_business','member_info.member_info_service',
+                'member_info.member_info_nickname', 'member_info.member_info_headimg', 'member_info.member_info_referee', 'member_info.member_info_business', 'member_info.member_info_service', 'member_info.member_info_city', 'member_info.member_info_address', 'member_info.member_info_gender', 'member_info.member_info_birthday',
                 'member_role.member_role_id', 'member_role.member_role_name',
-                'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation',
+                'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation'
 //                'member_account.member_account_surplus'
             );
         // 总条数
@@ -95,15 +95,23 @@ class MemberService
             ->toArray();
 
         foreach ($rows as &$row) {
-            $row['coupon_count'] = CouponDetail::where('join_coupon_detail_member_id',$row['member_id'])->count();
+            $row['coupon_count'] = CouponDetail::where('join_coupon_detail_member_id', $row['member_id'])->count();
             $row['member_mobile'] = substr($row['member_mobile'], 0, 3) . '****' . substr($row['member_mobile'], 7);
             $row['info'] = [
                 'member_info_nickname' => !empty($row['member_info_nickname']) ? $row['member_info_nickname'] : substr($row['member_mobile'], -4, 4) . '用户',
                 'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : '',
                 'member_info_referee' => !empty($row['member_info_referee']) ? $row['member_info_referee'] : '',
                 'member_info_business' => !empty($row['member_info_business']) ? $row['member_info_business'] : '',
-                'member_info_service' => !empty($row['member_info_service']) ? $row['member_info_service'] : ''
+                'member_info_service' => !empty($row['member_info_service']) ? $row['member_info_service'] : '',
+                'member_info_city' => !empty($row['member_info_city']) ? explode('-',$row['member_info_city']) : '',
+                'member_info_address' => !empty($row['member_info_address']) ? $row['member_info_address'] : '',
+                'member_info_birthday' => !empty($row['member_info_birthday']) ? $row['member_info_birthday'] : '',
+                'member_info_gender' => !empty($row['member_info_gender']) ? $row['member_info_gender'] : '',
             ];
+            if (!empty($row['info']['member_info_address']) && in_array($row['info']['member_info_address'], ['请选择', '省-市-区'])) {
+                $row['info']['member_info_address'] = '';
+            }
+
             $row['cert'] = [
                 'member_cert_birth' => $row['member_cert_birth'],
                 'member_cert_gender' => $row['member_cert_gender'],
@@ -185,11 +193,11 @@ class MemberService
                     }
                     $row['belong']['deptName'] = SysDept::where('dept_id', $extendJson['belong']['premises'])->value('dept_name');
                 }
-                if (isset($extendJson['referee'])){
-                    foreach ($extendJson['referee'] as $key => $referee){
+                if (isset($extendJson['referee'])) {
+                    foreach ($extendJson['referee'] as $key => $referee) {
                         $row['referee'][] = [
-                            'name'=>$referee,
-                            'time'=>$key
+                            'name' => $referee,
+                            'time' => $key
                         ];
                     }
                 }
@@ -240,7 +248,7 @@ class MemberService
                 $addtime[1] = strtotime($addtime[1]);
                 $query->whereBetween('member.member_addtimes', $addtime);
             })->select('member_id', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
-                'member_info.member_info_nickname', 'member_info.member_info_headimg','member_info.member_info_referee','member_info.member_info_business','member_info.member_info_service',
+                'member_info.member_info_nickname', 'member_info.member_info_headimg', 'member_info.member_info_referee', 'member_info.member_info_business', 'member_info.member_info_service',
                 'member_role.member_role_id', 'member_role.member_role_name',
                 'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation',
 //                'member_account.member_account_surplus'
@@ -332,7 +340,14 @@ class MemberService
             'member_info_referee' => !empty($member['info']) && !empty($member['info']['member_info_referee']) ? $member['info']['member_info_referee'] : '',
             'member_info_business' => !empty($member['info']) && !empty($member['info']['member_info_business']) ? $member['info']['member_info_business'] : '',
             'member_info_service' => !empty($member['info']) && !empty($member['info']['member_info_service']) ? $member['info']['member_info_service'] : '',
+            'member_info_city' => !empty($member['info']) && !empty($member['info']['member_info_city']) ? explode('-',$member['info']['member_info_city']) : '',
+            'member_info_address' => !empty($member['info']) && !empty($member['info']['member_info_address']) ? $member['info']['member_info_address'] : '',
+            'member_info_gender' => !empty($member['info']) && !empty($member['info']['member_info_gender']) ? $member['info']['member_info_gender'] : '',
+            'member_info_birthday' => !empty($member['info']) && !empty($member['info']['member_info_birthday']) ? $member['info']['member_info_birthday'] : '',
         ];
+        if (!empty($member['info']['member_info_address']) && in_array($member['info']['member_info_address'], ['请选择', '省-市-区'])) {
+            $member['info']['member_info_address'] = '';
+        }
         $member['cert'] = [
             'member_cert_birth' => $member['cert']['member_cert_birth'] ?? '',
             'member_cert_gender' => $member['cert']['member_cert_gender'] ?? '',
@@ -343,7 +358,31 @@ class MemberService
             'member_cert_face' => !empty($member['cert']) && !empty($member['cert']['member_cert_face']) ? getenv('STORAGE_DOMAIN') . $member['cert']['member_cert_face'] : '',
             'member_cert_photo' => !empty($member['cert']) && !empty($member['cert']['member_cert_photo']) ? getenv('STORAGE_DOMAIN') . $member['cert']['member_cert_photo'] : '',
             'member_cert_nation' => $member['cert']['member_cert_nation'] ?? '',
+            'member_cert_addtimes' => $member['cert']['member_cert_addtimes'] ?? '',
         ];
+        if (!empty($member['cert']['member_cert_addtimes'])){
+            $member['cert']['member_cert_addtimes'] = date('Y-m-d',$member['cert']['member_cert_addtimes']);
+        }else{
+            $member['cert']['member_cert_addtimes'] = date('Y-m-d',strtotime($member['member_addtimes']));
+        }
+        if (!empty($member['join_invite_member_id'])) {
+            $inviteMember = Member::with([
+                'info' => function ($query) {
+                    $query->select('join_info_member_id', 'member_info_nickname');
+                },
+                'cert' => function ($query) {
+                    $query->select('join_cert_member_id', 'member_cert_name');
+                }
+            ])->where('member_id', $member['join_invite_member_id'])
+                ->first();
+            $inviteMemberName = '';
+            if (!empty($inviteMember->cert) && !empty($inviteMember->cert->member_cert_name)) {
+                $inviteMemberName = $inviteMember->cert->member_cert_name;
+            } elseif (!empty($inviteMemberName->info) && !empty($inviteMemberName->info->member_info_nickname)) {
+                $inviteMemberName = $inviteMemberName->info->member_info_nickname;
+            }
+            $member['invite_member'] = $inviteMemberName . (!empty($inviteMember->member_invite_code) ? '(' . $inviteMember->member_invite_code . ')' : '');
+        }
 
         $member['is_auth'] = "未认证";
         if (!empty($member['cert']['member_cert_nbr']) && !empty($member['cert']['member_cert_name'])) {
@@ -367,11 +406,11 @@ class MemberService
                 }
                 $member['belong']['deptName'] = SysDept::where('dept_id', $extendJson['belong']['premises'])->value('dept_name');
             }
-            if (isset($extendJson['referee'])){
-                foreach ($extendJson['referee'] as $key => $referee){
+            if (isset($extendJson['referee'])) {
+                foreach ($extendJson['referee'] as $key => $referee) {
                     $member['referee'][] = [
-                        'name'=>$referee,
-                        'time'=>$key
+                        'name' => $referee,
+                        'time' => $key
                     ];
                 }
             }
@@ -745,7 +784,7 @@ class MemberService
                 }
             }
 
-            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
+            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送", '登录活动积分'])) {
                 $point['balance_type'] = 'add';
             } else {
                 $point['balance_type'] = 'cut';
@@ -753,7 +792,7 @@ class MemberService
 
             if ($key == 0) {
                 $point['balance'] = number_format($balance, 2, '.', '');
-                if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
+                if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送", '登录活动积分'])) {
                     $balance = $balance - $point['client_points_nbr'];
                 } else {
                     $balance = $balance + $point['client_points_nbr'];
@@ -761,7 +800,7 @@ class MemberService
 
                 continue;
             }
-            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
+            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送", '登录活动积分'])) {
                 $point['balance'] = number_format($balance, 2, '.', '');
                 $balance = $balance - $point['client_points_nbr'];
 //                $point['balance'] = $balance = $nowPoint = number_format($balance - $point['client_points_nbr'], 2, '.', '');
@@ -796,6 +835,7 @@ class MemberService
                 'member_status' => $params['status'] ?? 'PENDING',
                 'member_mobile' => $params['mobile'] ?? '',
                 'member_category' => $params['member_category'] ?? '后台添加',
+                'member_invite_code' => self::generateInviteCode(),
 //                'member_from' => $params['source'],
                 // 'member_extend_json' => json_encode(['come_from' => $params['source']]),
                 'member_addtimes' => time(),
@@ -852,9 +892,9 @@ class MemberService
                 'member_cert_nbr' => $params['cert_nbr'] ?? '',
                 'member_cert_birth' => !empty($params['birth']) ? date('Y-m-d', strtotime($params['birth'])) : '',
                 'member_cert_gender' => $params['gender'] ?? '',
-                'member_cert_province' => !empty($params['province']) ? json_encode($params['province'], JSON_UNESCAPED_UNICODE) : '[]',
-                'member_cert_city' => $params['city'] ?? '',
-                'member_cert_addr' => $params['addr'] ?? '',
+//                'member_cert_province' => !empty($params['province']) ? json_encode($params['province'], JSON_UNESCAPED_UNICODE) : '[]',
+//                'member_cert_city' => $params['city'] ?? '',
+//                'member_cert_addr' => $params['addr'] ?? '',
 //                'member_cert_face' => str_replace(getenv('STORAGE_DOMAIN'), '', $params['member_cert_face']),
 //                'member_cert_photo' => str_replace(getenv('STORAGE_DOMAIN'), '', $params['member_cert_photo']),
             ];
@@ -867,6 +907,10 @@ class MemberService
                 'member_info_referee' => $params['member_info_referee'] ?? '',
                 'member_info_business' => $params['member_info_business'] ?? '',
                 'member_info_service' => $params['member_info_service'] ?? '',
+                'member_info_city' => !empty($params['province']) ? implode('-', $params['province']) : '',
+                'member_info_address' => $params['member_info_address'] ?? '',
+                'member_info_birthday'=>$params['birth'] ? date('Y-m-d', strtotime($params['birth'])) : '',
+                'member_info_gender' => $params['gender'] ?? '',
             ];
             MemberInfo::insert($infoData);
 
@@ -934,9 +978,9 @@ class MemberService
                 'member_cert_nbr' => $params['cert_nbr'] ?? '',
                 'member_cert_birth' => $params['birth'] ? date('Y-m-d', strtotime($params['birth'])) : '',
                 'member_cert_gender' => $params['gender'] ?? '',
-                'member_cert_province' => $params['province'] ? json_encode($params['province'], JSON_UNESCAPED_UNICODE) : '[]',
-                'member_cert_city' => $params['city'] ?? '',
-                'member_cert_addr' => $params['addr'] ?? '',
+//                'member_cert_province' => $params['province'] ? json_encode($params['province'], JSON_UNESCAPED_UNICODE) : '[]',
+//                'member_cert_city' => $params['city'] ?? '',
+//                'member_cert_addr' => $params['addr'] ?? '',
                 'member_cert_face' => str_replace(getenv('STORAGE_DOMAIN'), '', $params['member_cert_face']),
                 'member_cert_photo' => str_replace(getenv('STORAGE_DOMAIN'), '', $params['member_cert_photo']),
             ];
@@ -960,6 +1004,10 @@ class MemberService
                 'member_info_referee' => $params['member_info_referee'] ?? '',
                 'member_info_business' => $params['member_info_business'] ?? '',
                 'member_info_service' => $params['member_info_service'] ?? '',
+                'member_info_city' => !empty($params['province']) ? implode('-', $params['province']) : '',
+                'member_info_address' => $params['member_info_address'] ?? '',
+                'member_info_birthday'=>$params['birth'] ? date('Y-m-d', strtotime($params['birth'])) : '',
+                'member_info_gender' => $params['gender'] ?? '',
             ];
             if (!MemberInfo::where('join_info_member_id', $params['member_id'])->exists()) {
                 MemberInfo::insert($infoData);
@@ -1154,6 +1202,7 @@ class MemberService
             'member_classify' => 'MEMBER',
             'member_status' => 'ACTIVED',
             'member_mobile' => $params['mobile'],
+            'member_invite_code' => self::generateInviteCode(),
             'member_extend_json' => json_encode(['come_from' => 'SYSTEM']),
             'member_addtimes' => time()
         ];
@@ -1187,7 +1236,7 @@ class MemberService
     {
         $id = SysSerial::getSerial();
 
-        return "MR" . str_pad($id, 16, "0", STR_PAD_LEFT) . random_string(6, 'up');
+        return "MR" . date('ymdH') . random_string(6, 'up');
     }
 
     public static function getMemberName($mobile, $certName, $nickname)
@@ -1236,4 +1285,21 @@ class MemberService
 
         return self::getMemberName($mobile, $certName, $nickname);
     }
+
+    /**
+     * @Desc 生成推荐码
+     * @Author Gorden
+     * @Date 2024/9/6 9:05
+     *
+     * @return string
+     */
+    public static function generateInviteCode()
+    {
+        $code = random_string(8, 'number');
+        if (Member::where('member_invite_code', $code)->exists()) {
+            return self::generateInviteCode();
+        } else {
+            return $code;
+        }
+    }
 }

+ 1 - 1
app/admin/service/notify/RechargeService.php

@@ -246,7 +246,7 @@ class RechargeService
     private static function doSaveMemberQuota($memberId, $component, $nbr)
     {
         $model = new MemberQuota();
-        $model->member_quota_id = 'MQ' . date('YmdHis') . random_string(6, 'up');
+        $model->member_quota_id = 'MQ' . date('ymdH') . random_string(6, 'up');
         $model->join_quota_member_id = $memberId;
         $model->join_member_rule_added_component_id = $component['rule_added_component_id'];
         $model->member_quota_status = 'PENDING';

+ 21 - 163
app/admin/service/order/AppointmentService.php

@@ -4,6 +4,7 @@ namespace app\admin\service\order;
 
 use app\admin\controller\member\BenefitController;
 use app\admin\controller\member\QuotaController;
+use app\admin\service\member\MemberService;
 use app\model\Appointment;
 use app\model\Goods;
 use app\model\GoodsSku;
@@ -208,8 +209,8 @@ class AppointmentService
             $applyJson = json_decode($appointment->appointment_apply_json,true);
             $goods = Goods::where('goods_id',$appointment->join_appointment_goods_id)->first();
             $sku = GoodsSku::where('goods_sku_id',$appointment->join_appointment_goods_sku_id)->where('goods_sku_status','ON')->first();
-            $orderId = 'OD' . date('YmdHis') . random_string(6, 'up');
-            $groupBy = 'OD' . date('YmdHis') . random_string(6, 'up');
+            $orderId = 'OD' . date('ymdH') . random_string(6, 'up');
+            $groupBy = 'OD' . date('ymdH') . random_string(6, 'up');
             $order = [
                 'order_id' => $orderId,
                 'order_groupby' => $groupBy,
@@ -257,7 +258,8 @@ class AppointmentService
                 'pay_addtimes' => time(),
                 'pay_paytimes' => date('Y-m-d H:i:s'),
                 'pay_prepayid'=>$appointment->join_appointment_member_id.'-CASH',
-                'pay_category'=>$goods->goods_classify
+                'pay_category'=>$goods->goods_classify,
+                'join_pay_object_json' => ['order_id'=>$orderId]
             ];
             PayDetail::insert($pay);
 
@@ -272,89 +274,31 @@ class AppointmentService
         }
     }
 
+    /**
+     * @Desc 添加预约
+     * @Author Gorden
+     * @Date 2024/9/6 9:22
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
     public static function add(Request $request)
     {
         $params = $request->post();
         Db::beginTransaction();
         try {
-            // 先检查选择的时段是否可预约
-            $goods = Goods::where('goods_id', $params['join_appointment_goods_id'])->first();
-            // $appointments = Appointment::where('appointment_datetime', $params['appointment_datetime'])->get()->toArray();
-            // if ($goods->is_support_appointment == 'Y' && !empty($goods->goods_attribute_json)) {
-            //     $extendJson = json_decode($goods->goods_attribute_json, true);
-            //     foreach ($extendJson['times'] as $key => $time) {
-            //         if ($time['duration'] == $params['appointment_times']) {
-            //             if (!empty($appointments)) {
-            //                 foreach ($appointments as $appointment) {
-            //                     $applyJson = json_decode($appointment['appointment_apply_json'], true);
-            //                     $applyJsonTimes = $applyJson['times'] ?? '';
-
-            //                     if ($time['duration'] == $applyJsonTimes) {
-            //                         $extendJson['times'][$key]['person'] -= $applyJson['person'];
-            //                         if ($extendJson['times'][$key]['person'] < $params['person']) {
-            //                             return json_fail('当前时段名额不足,请选择其他时段');
-            //                         }
-            //                     }
-            //                 }
-            //             } else {
-            //                 if ($extendJson['times'][$key]['person'] < $params['person']) {
-            //                     return json_fail('当前时段名额不足,请选择其他时段');
-            //                 }
-            //             }
-            //         }
-            //     }
-            // }
             // 如果没有,新建
             if (empty($params['join_appointment_member_id']) && !empty($params['username']) && !empty($params['mobile'])) {
                 if(Member::where('member_mobile',$params['mobile'])->exists()){
                     Db::rollBack();
                     return json_fail('会员已存在,请勿重复创建');
                 }
-                $memberId = "MR" . str_pad(SysSerial::getSerial(), 16, "0", STR_PAD_LEFT) . random_string(6, 'up');
-                $params['join_appointment_member_id'] = $memberId;
-
-                // 主表
-                $memberData = [
-                    'member_id' => $memberId,
-                    'member_is_owner' => 'N',
-                    'member_classify' => 'MEMBER',
-                    'member_status' => 'ACTIVED',
-                    'member_mobile' => $params['mobile'],
-                    'member_extend_json'=>json_encode(['come_from'=>'SYSTEM']),
-                    'member_addtimes' => time()
-                ];
-                Member::insert($memberData);
-                // 账户表
-                $accountData = [
-                    'join_account_member_id' => $memberId,
-                    'member_account_classify' => 'POINTS',
-                    'member_account_status' => 'ACTIVED',
-                    'member_account_category' => 'NORMAL',
-                    'member_account_nbr' => $memberId . '-POINTS',
-                    'member_account_name' => '积分账户',
-                    'member_account_addtimes' => time()
-                ];
-                // 积分账户
-                MemberAccount::insert($accountData);
-                $accountData['member_account_classify'] = 'CASH';
-                $accountData['member_account_nbr'] = $memberId . '-CASH';
-                $accountData['member_account_name'] = '余额账户';
-                // 现金/余额账户
-                MemberAccount::insert($accountData);
-                // cert
-                // $certData = [
-                //     'join_cert_member_id' => $memberId,
-                //     'member_cert_name' => $params['username']
-                // ];
-                // MemberCert::insert($certData);
-                // info
-                $infoData = [
-                    'join_info_member_id' => $memberId,
-                    'member_info_nickname' => $params['username']
-                ];
-                MemberInfo::insert($infoData);
+                $memberId = 'MR' . date('ymdH') . random_string(6, 'up');
+                $params['join_appointment_member_id'] = $params['member_id'] = $memberId;
+                // 创建会员
+                MemberService::createMember($params);
             }
-            $appointmentId = "AP" . date('YmdHis') . random_string(6, 'up');
+            $appointmentId = "AP" . date('ymdH') . random_string(6, 'up');
             $data = [
                 'appointment_id' => $appointmentId,
                 'join_appointment_member_id' => $params['join_appointment_member_id'] ?? '',
@@ -394,92 +338,6 @@ class AppointmentService
             }
 
             Appointment::insert($data);
-
-            // 如果预约已完成,生成订单
-//             if ($params['appointment_status'] == 'DONE') {
-//                 $sku = GoodsSku::find($params['join_appointment_goods_sku_id']);
-//                 $orderId = 'OD' . date('YmdHis') . random_string(6, 'up');
-//                 $groupBy = 'OD' . date('YmdHis') . random_string(6, 'up');
-//                 $order = [
-//                     'order_id' => $orderId,
-//                     'order_groupby' => $groupBy,
-//                     'join_order_member_id' => $params['join_appointment_member_id'],
-//                     'order_name' => "预约-" . $goods->goods_name,
-//                     'order_amount_total' => $sku->goods_sku_sales_price * $params['person'],
-//                     'order_amount_pay' => $sku->goods_sku_sales_price * $params['person'],
-//                     'order_is_complete' => 'N',
-//                     'order_category' => $goods->goods_classify,
-//                     'order_status_system' => 'PAYING',
-//                     'order_status_payment' => 'PENDING',
-//                     'order_status_storage' => 'PENDING',
-//                     'order_platform' => 'SYSTEM',
-//                     'order_addtimes' => time()
-//                 ];
-//                 Order::insert($order);
-//                 // 订单详情
-//                 $sheet = [
-//                     'join_sheet_member_id' => $params['join_appointment_member_id'],
-//                     'join_sheet_order_id' => $orderId,
-//                     'join_sheet_goods_id' => $params['join_appointment_goods_id'],
-//                     'order_sheet_status' => 'PAYING',
-//                     'order_sheet_category' => 'APPOINTMENT',
-//                     'order_sheet_unit' => '套',
-//                     'order_sheet_num' => $params['person'],
-//                     'order_sheet_price' => $sku->goods_sku_sales_price,
-//                     'order_sheet_amount' => $sku->goods_sku_sales_price * $params['person'],
-//                     'order_sheet_pay' => $sku->goods_sku_sales_price * $params['person'],
-//                     'order_sheet_task_status' => 'NONE',
-//                     'order_sheet_addtimes' => time()
-//                 ];
-//                 OrderSheet::insert($sheet);
-//                 // 订单号更新到预约
-//                 Appointment::where('appointment_id', $data['appointment_id'])->update(['join_appointment_order_id' => $orderId]);
-//                 // 支付数据
-//                 $pay = [
-//                     'join_pay_member_id' => $params['join_appointment_member_id'],
-//                     'join_pay_order_id' => $groupBy,
-//                     'pay_amount' => $sheet['order_sheet_pay'],
-//                     'pay_remark' => '预约单',
-//                     'pay_addtimes' => time(),
-//                     'pay_prepayid' => $params['join_appointment_member_id'] . '-' . $params['settlement_mode'],
-//                     'pay_paytimes' => date('Y-m-d H:i:s'),
-//                     'join_pay_object_json' => json_encode(['appointment_id' => $appointmentId]),
-//                     'pay_category' => "APPOINTMENT"
-//                 ];
-//                 // 现金余额结算
-//                 if ($params['settlement_mode'] == 'CASH') {
-//                     $account = MemberAccount::where('join_account_member_id', $params['join_appointment_member_id'])
-//                         ->where('member_account_classify', 'CASH')
-//                         ->where('member_account_status', 'ACTIVED')
-//                         ->first();
-//                     if (!$account) {
-//                         Db::rollBack();
-//                         return json_fail('当前账户不存在或已过期');
-//                     }
-
-//                     if ($account->member_account_surplus < $sheet['order_sheet_pay']) {
-//                         throw new BusinessException("账户余额不足");
-// //                        $pay['pay_status'] = 'PENDING';
-//                     } else {
-//                         MemberAccount::where('member_account_id', $account->member_account_id)->update([
-//                             'member_account_expend' => $account->member_account_expend + $sheet['order_sheet_pay'],
-//                             'member_account_surplus' => $account->member_account_surplus - $sheet['order_sheet_pay']
-//                         ]);
-//                         $pay['pay_status'] = 'SUCCESS';
-//                         // 更新订单状态
-//                         Order::where('order_id', $orderId)->update(['order_status_system' => 'DONE','order_is_complete'=>'Y', 'order_status_payment' => 'SUCCESS']);
-//                         OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'DONE']);
-//                     }
-//                     PayDetail::insert($pay);
-//                 } elseif ($params['settlement_mode'] == 'QRCODE') {
-//                     $pay['pay_status'] = 'SUCCESS';
-//                     PayDetail::insert($pay);
-//                     // 更新订单状态
-//                     Order::where('order_id', $orderId)->update(['order_status_system' => 'DONE','order_is_complete'=>'Y', 'order_status_payment' => 'SUCCESS']);
-//                     OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'DONE']);
-//                 }
-//             }
-
             Db::commit();
             _syslog("预约","添加预约成功");
             return json_success("添加预约成功");
@@ -595,8 +453,8 @@ class AppointmentService
             // 如果服务结束,没有生成过订单,生成订单
             if ($params['appointment_status'] == 'DONE' && empty($appointment->join_appointment_order_id) && $params['settlement_mode'] != 'QUOTA') {
                 $sku = GoodsSku::find($params['join_appointment_goods_sku_id']);    
-                $orderId = 'OD' . date('YmdHis') . random_string(6, 'up');
-                $groupBy = 'OD' . date('YmdHis') . random_string(6, 'up');
+                $orderId = 'OD' . date('ymdH') . random_string(6, 'up');
+                $groupBy = 'OD' . date('ymdH') . random_string(6, 'up');
                 $order = [
                     'order_id' => $orderId,
                     'order_groupby' => $groupBy,
@@ -709,7 +567,7 @@ class AppointmentService
                 }
 
                 // 回写权益表
-                $benefitId = 'BF'.date('YmdHis').random_string(6,'up');
+                $benefitId = 'BF'.date('ymdH').random_string(6,'up');
                 $benefitData = [
                     'member_benefit_id'=>$benefitId,
                     'join_benefit_member_id'=>$params['join_appointment_member_id'],

+ 37 - 0
app/admin/service/order/OrderService.php

@@ -109,6 +109,7 @@ class OrderService
             $timeUnix = strtotime("-30 minutes");
             $orders = Order::where('order_status_system', 'PAYING')
                 ->where('order_category', '<>', 'DISHES')     // 点餐不自动取消
+                ->where('order_category', '<>', 'VIP')      // 康养城订单不自动取消,有分次付款
                 // ->where('order_platform','<>','SYSTEM')     // 后台产生的订单不自动取消
                 ->where(function ($query) {
                     $query->where('order_platform', '<>', 'SYSTEM')->orWhereNull('order_platform');
@@ -167,6 +168,14 @@ class OrderService
         }
     }
 
+    /**
+     * @Desc 生成核销数据
+     * @Author Gorden
+     * @Date 2024/9/9 17:07
+     *
+     * @param $params
+     * @return array
+     */
     public static function generateWriteOffData($params)
     {
         return [
@@ -180,6 +189,34 @@ class OrderService
         ];
     }
 
+    /**
+     * @Desc 生成核销数据-入order_process
+     * @Author Gorden
+     * @Date 2024/9/9 17:07
+     *
+     * @param $params
+     * @return array
+     */
+    public static function generateWriteOffDataByOrderProcess($params)
+    {
+        return [
+            'charge' => [
+                'charge_amount' => $params['charge_amount'],
+                'charge_content' => $params['order_remark'] ?? '',
+                'charge_user_id' => $params['write_off_member_id'],
+                'charge_premises' => $params['dept_premises_id'],
+                'charge_premises_info' => $params['dept'] ?? ''
+            ],
+            'member_id' => $params['join_order_member_id'],
+            'goods_id' => $params['goods_id'] ?? '',
+            'goods_sku_id' => $params['goods_sku_id'] ?? '',
+            'order_id' => $params['order_id'],
+            'platform' => 'SYSTEM',
+            'order_code' => random_string(10, 'number'),
+            'appointment' => $params['appointment_ids'] ?? '',
+        ];
+    }
+
     public static function generateAppointmentApplyData($params)
     {
         $member = Member::with('cert', 'info')

+ 8 - 0
app/admin/service/order/StatisticsService.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace app\admin\service\order;
+
+class StatisticsService
+{
+
+}

+ 2 - 2
app/admin/service/sys_manage/UserService.php

@@ -278,8 +278,8 @@ class UserService
 
     public static function generateUserId()
     {
-        $random = random_string(8,'up');
+        $random = random_string(6,'up');
 
-        return 'UR' . date('YmdHis') . $random;
+        return 'UR' . date('ymdH') . $random;
     }
 }

+ 1 - 1
app/event/order/KangyangCityEvent.php

@@ -74,7 +74,7 @@ class KangyangCityEvent
                     $num = $coupon['num'];
                     for ($i = 0; $i < $num; $i++) {
                         CouponDetail::insert([
-                            'coupon_detail_id' => 'CUDT' . str_pad(SysSerial::getSerial(), 8, "0", STR_PAD_LEFT) . random_string(6, 'up'),
+                            'coupon_detail_id' => 'CUDT' . date("ymdH") . random_string(6, 'up'),
                             'join_detail_coupon_id' => $key,
                             'join_coupon_detail_member_id' => $params['member_id'],
                             'coupon_detail_status' => 'ACTIVED',

+ 31 - 0
app/event/order/OrderProcessEvent.php

@@ -39,4 +39,35 @@ class OrderProcessEvent
             Log::error("WRITE_ORDER_PROCESS_ERROR", $params);
         }
     }
+
+    public function orderWriteOff($params)
+    {
+        try {
+            $userId = JwtToken::getCurrentId();
+        } catch (\Exception $e) {
+        }
+
+        try {
+            $data = [
+                'process_key' => 'PAYOFF',
+                'process_name' => '订单核销',
+                'user_id' => $userId ?? '',
+                'process_json' => $params['write_off_data']
+            ];
+            if (!empty($params['join_order_member_id'])) {
+                $data['member_id'] = $params['join_order_member_id'];
+            }
+            if (!empty($params['order_id'])) {
+                $data['order_id'] = $params['order_id'];
+            }
+            if (!empty($params['dept'])) {
+                $data['dept_id'] = $params['dept']->dept_id;
+            }
+            OrderProcessService::insert($data);
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            $params['msg'] = $e->getMessage();
+            Log::error("WRITE_ORDER_PROCESS_ERROR", $params);
+        }
+    }
 }

+ 6 - 2
app/model/MemberCert.php

@@ -12,8 +12,12 @@ class MemberCert extends Model
 
     public $keyType = 'string';
 
-
-    const CREATED_AT = null;
+//    const CREATED_AT = 'member_cert_addtimes';
 
     const UPDATED_AT = null;
+
+//    public function serializeDate(\DateTimeInterface $date)
+//    {
+//        return $date->format('Y-m-d H:i:s');
+//    }
 }

+ 3 - 0
config/event.php

@@ -18,5 +18,8 @@ return [
     ],
     'order.complete' => [
         [\app\event\order\OrderProcessEvent::class,'orderComplete']
+    ],
+    'order.write_off' => [
+        [\app\event\order\OrderProcessEvent::class,'orderWriteOff']
     ]
 ];

+ 5 - 0
route/admin.php

@@ -916,6 +916,11 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        Route::group('/statistics',function (){
+            Route::get('/order', [\app\admin\controller\order\StatisticsController::class, 'order']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
         // 
         Route::group('/pending', function () {
             Route::get('/list', [\app\admin\controller\order\PendingController::class, 'select']);