Browse Source

Merge branch 'master' of http://39.98.194.76:3000/txct/wanyue_app

yxjapp 7 months ago
parent
commit
c1fd2b44c6

+ 8 - 5
app/admin/controller/member/BenefitController.php

@@ -138,8 +138,8 @@ class BenefitController extends Curd
             $times = date('Y-m-d H:i:s', strtotime($times));
         }
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             // 减额度
             $benefit->member_benefit_used_count = $benefit->member_benefit_used_count + $nbr;
             $benefit->save();
@@ -179,7 +179,7 @@ class BenefitController extends Curd
         }
     }
 
-    public static function doWriteOff($paramsData)
+    public static function doWriteOff($paramsData,$appointmentNofee)
     {
         $benefit = MemberBenefit::where('member_benefit_id', $paramsData['benefit_id'])
             ->where('join_benefit_member_id', $paramsData['member_id'])
@@ -195,8 +195,8 @@ class BenefitController extends Curd
             $times = date('Y-m-d H:i:s', strtotime($paramsData['times']));
         }
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             // 减额度
             $benefit->member_benefit_used_count = $benefit->member_benefit_used_count + $paramsData['nbr'];
             if($benefit->member_benefit_used_count == $benefit->member_benefit_limit_count){
@@ -216,7 +216,7 @@ class BenefitController extends Curd
             $writeOffData = OrderService::generateWriteOffData($params);
 
             $appointments = Appointment::where('join_appointment_member_benefit_id', $paramsData['benefit_id'])
-                ->where('appointment_status', 'INIT')
+                ->whereIn('appointment_status', ['INIT','WAITING','PENDING','DOING'])
                 ->limit($paramsData['nbr'])
                 ->get();
             foreach ($appointments as $appointment) {
@@ -226,7 +226,10 @@ class BenefitController extends Curd
                     'appointment_apply_datetime' => $times,
                     'appointment_doing_datetime' => $times,
                     'appointment_done_datetime' => $times,
-                    'appointment_done_json' => json_encode($writeOffData)
+                    'appointment_done_json' => json_encode($writeOffData),
+                    'appointment_apply_json'=>$appointmentNofee->appointment_apply_json,
+                    'appointment_process_json'=>$appointmentNofee->appointment_process_json,
+                    'settlement_mode'=>$appointmentNofee->settlement_mode
                 ]);
             }
 

+ 10 - 0
app/admin/controller/member/MemberController.php

@@ -255,6 +255,16 @@ class MemberController
         return MemberService::info($memberId);
     }
 
+    public function welfareInfo(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        if (!$memberId) {
+            return json_fail("参数错误");
+        }
+
+        return MemberService::welfareInfo($request);
+    }
+
     public function balanceInfo(Request $request)
     {
         $memberId = $request->get('member_id', '');

+ 1 - 0
app/admin/controller/member/QuotaController.php

@@ -374,6 +374,7 @@ class QuotaController extends Curd
                 ->toArray();
                 
                 if ($quotas[0]['member_quota_nbr'] != '-99.00' && count($quotas) < intval($nbr)) {
+                    Db::rollBack();
                     return json_fail("可核销数量不足");
                 }
                 // 生成核销数据

+ 3 - 2
app/admin/controller/notify/RechargeController.php

@@ -47,6 +47,7 @@ class RechargeController
         if (is_json($data)) {
             $data = json_decode($data, true);
         }
+        _syslog("APP充值","APP充值回调开始",$data,$data,1001);
         if (!$data['pay_id']) {
             return json_fail('参数异常');
         }
@@ -92,8 +93,8 @@ class RechargeController
             }
         }
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             $extendJson['notify'] = 'success';
             $payDetail->pay_extend_json = json_encode($extendJson);
             $payDetail->save();
@@ -102,7 +103,7 @@ class RechargeController
             $addedNbr = 0;
             if (isset($objectJson['order_id'])) {
                 // 对应订单设置已完成
-                Order::where('order_groupby',$payDetail->join_pay_order_id)->update(['order_status_system'=>'DONE','order_is_complete'=>'Y']);
+                Order::where('order_groupby',$payDetail->join_pay_order_id)->update(['order_status_system'=>'DONE','order_is_complete'=>'Y','order_status_storage'=>'DONE']);
                 $addedNbr = RechargeService::disposeOrder($objectJson['order_id']);
                 
 

+ 207 - 60
app/admin/controller/order/PayDetailController.php

@@ -6,6 +6,7 @@ use app\admin\controller\notify\RechargeController;
 use app\controller\Curd;
 use app\model\Goods;
 use app\model\GoodsSku;
+use app\model\MemberAccount;
 use app\model\Order;
 use app\model\OrderSheet;
 use app\model\PayDetail;
@@ -14,6 +15,8 @@ use support\exception\BusinessException;
 use support\Request;
 use support\Response;
 
+use function PHPSTORM_META\type;
+
 class PayDetailController extends Curd
 {
     public function __construct()
@@ -31,13 +34,18 @@ class PayDetailController extends Curd
             $where['pay_status'] = 'SUCCESS';
             $where['pay_category'] = ['<>', 'RECHARGE'];
         }
+        // else if ($where['pay_category'] == 'RECHARGE') {
+        //     $where['pay_status'] = 'SUCCESS';
+        //     $where['pay_category'] = 'RECHARGE';
+        //     $where['pay_prepayid'] = ['in','WXPAY,ALIPAY'];
+        // }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
 
     protected function doSelect(array $where, string $field = null, string $order = 'desc')
     {
-        $model = $this->model->with(['member', 'cert']);
+        $model = $this->model->with(['member', 'cert', 'memberAccount']);
         foreach ($where as $column => $value) {
             if (is_array($value)) {
                 if ($value[0] === 'like' || $value[0] === 'not like') {
@@ -67,11 +75,96 @@ class PayDetailController extends Curd
                 $model = $model->where($column, $value);
             }
         }
+        $model = $model->where(function ($query) {
+            $query->whereIn('pay_prepayid',['ALIPAY','WXPAY'])
+                ->orWhere('pay_prepayid','like','%CASH%');
+        });
+
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
         return $model;
     }
+    public function selectWelfare(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'pay_addtimes';
+//        $where['pay_status'] = 'SUCCESS';
+        if ($where['pay_category'] == 'OTHER') {
+            $where['pay_status'] = 'SUCCESS';
+            $where['pay_category'] = ['<>', 'RECHARGE'];
+        }
+        // else if ($where['pay_category'] == 'RECHARGE') {
+        //     $where['pay_status'] = 'SUCCESS';
+        //     $where['pay_category'] = 'RECHARGE';
+        //     $where['pay_prepayid'] = ['in','WXPAY,ALIPAY'];
+        // }
+        $query = $this->doSelectWelfare($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelectWelfare(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with(['member', 'cert', 'memberAccount']);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        $model = $model->where(function ($query) {
+            $query->Where('pay_prepayid','like','%WELFARE%');
+        });
+
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            $prepayId = explode('-', $item->pay_prepayid);
+            if (count($prepayId) > 1) {
+                $item->pay_prepayid = $prepayId[1];
+            }
+            $memberAccount = [];
+            if(!empty($item->memberAccount)){
+                foreach($item->memberAccount as $account){
+                    $memberAccount[strtolower($account->member_account_classify)] = $account;
+                }
+
+                $item->memberAccount = $memberAccount;
+            }
+        }
+
+        return $items;
+    }
 
     /**
      * @Desc 产品订单
@@ -104,20 +197,25 @@ class PayDetailController extends Curd
         return json_success('', $orderSheet);
     }
 
+    /**
+     * 余额账户充值
+     */
     public function insertRecharge(Request $request): Response
     {
         if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) {
             return json_fail($this->validateClass->getError());
         }
 
-        $password = $request->post('recharge_password','');
-        if(!$password || $password != '123456'){
+        $password = $request->post('recharge_password', '');
+        if (!$password || $password != '123456') {
             return json_fail('充值密码错误');
         }
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             $data = $this->insertRechargeInput($request);
+            $data['pay_prepayid'] = $data['join_pay_member_id'] . '-CASH';
+
             $payDetailId = $this->doInsert($data);
             (new RechargeController)->disposePaySuccess($payDetailId);
 
@@ -133,6 +231,46 @@ class PayDetailController extends Curd
         return json_success('success');
     }
 
+
+    /**
+     * 福利账户充值
+     */
+    public function insertRechargeWelfare(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        $password = $request->post('recharge_password', '');
+        if (!$password || $password != '123456') {
+            return json_fail('充值密码错误');
+        }
+
+        Db::beginTransaction();
+        try {
+            $data = $this->insertRechargeInput($request, 'WELFARE');
+            $data['pay_prepayid'] = $data['join_pay_member_id'] . '-WELFARE';
+
+            $this->doInsert($data);
+
+            // 金额累加到福利账户
+            $memberAccount = MemberAccount::where('join_account_member_id', $data['join_pay_member_id'])->where('member_account_classify', 'WELFARE')->first();
+            $memberAccount->member_account_income = $memberAccount->member_account_income + $data['pay_amount'];
+            $memberAccount->member_account_surplus = $memberAccount->member_account_surplus + $data['pay_amount'];
+            $memberAccount->save();
+
+            Db::commit();
+        } catch (BusinessException $customException) {
+            Db::rollBack();
+            return json_fail($customException->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail('数据写入失败11');
+        }
+        return json_success('success');
+    }
+
     /**
      * @Desc
      * @Author Gorden
@@ -142,74 +280,83 @@ class PayDetailController extends Curd
      * @return array
      * @throws BusinessException
      */
-    protected function insertRechargeInput(Request $request): array
+    protected function insertRechargeInput(Request $request, $type = "CASH"): array
     {
         $params = $request->post();
         $data = $this->inputFilter($params);
         $goods = Goods::find($params['goods_id']);
         $extendJson = [];
-        if (!$params['is_custom']) {
-            try {
-                Db::beginTransaction();
+        // if (!$params['is_custom']) {
+        Db::beginTransaction();
+        try {
+            if (!$params['is_custom']) {
                 $data['pay_amount'] = $goods->goods_sales_price;
+            }
 
-                $orderId = "OD" . date("YmdHis") . random_string(6, 'up');
-                $orderGroupId = "OD" . date("YmdHis") . random_string(6, 'up');
-                $orderData = [
-                    'order_id' => $orderId,
-                    'order_groupby' => $orderGroupId,
-                    'join_order_member_id' => $data['join_pay_member_id'],
-                    'order_name' => date('Y-m-d H:i:s') . '-订单',
-                    'order_amount_total' => $data['pay_amount'],
-                    'order_amount_pay' => $data['pay_amount'],
-                    'order_amount_json' => '{"tax": 0, "freight": 0}',
-                    'order_status_payment' => 'SUCCESS',
-                    'order_category' => 'NORMAL',
-                    'order_status_system' => 'WAITING',
-                    'order_status_storage' => 'PENDING',
-                    'order_addtimes' => time()
-                ];
-                $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first();
-
-                Order::insert($orderData);
-                $orderSheetData = [
-                    'join_sheet_member_id' => $data['join_pay_member_id'],
-                    'join_sheet_order_id' => $orderId,
-                    'join_sheet_goods_id' => $params['goods_id'],
-                    'join_sheet_goods_sku_id' => $sku ? $sku->goods_sku_id : 0,
-                    'order_sheet_status' => 'PAYING',
-                    'order_sheet_category' => 'NORMAL',
-                    'order_sheet_num' => 1,
-                    'order_sheet_price' => $data['pay_amount'],
-                    'order_sheet_amount' => $data['pay_amount'],
-                    'order_sheet_pay' => $data['pay_amount'],
-                    'order_sheet_addtimes' => time()
-                ];
-
-                OrderSheet::insert($orderSheetData);
-
-                Db::commit();
-            } catch (\Exception $e) {
-                dump($e->getMessage());
-                Db::rollBack();
-
-                throw new BusinessException("数据错误");
+            $orderId = "OD" . date("YmdHis") . random_string(6, 'up');
+            $orderGroupId = "OD" . date("YmdHis") . random_string(6, 'up');
+            $orderData = [
+                'order_id' => $orderId,
+                'order_groupby' => $orderGroupId,
+                'join_order_member_id' => $data['join_pay_member_id'],
+                'order_name' => date('Y-m-d H:i:s') . '-订单',
+                'order_amount_total' => $data['pay_amount'],
+                'order_amount_pay' => $data['pay_amount'],
+                'order_amount_json' => '{"tax": 0, "freight": 0}',
+                'order_status_payment' => 'SUCCESS',
+                'order_category' => 'RECHARGE',
+                'order_status_system' => 'PAYING',
+                'order_status_storage' => 'PENDING',
+                'order_addtimes' => time()
+            ];
+            if ($type == 'WELFARE') {
+                $orderData['order_is_complete'] = 'Y';
+                $orderData['order_status_system'] = 'DONE';
+                $orderData['order_status_storage'] = 'DONE';
             }
-            $data['join_pay_order_id'] = $orderGroupId;
-            $data['join_pay_object_json'] = json_encode(['order_id' => $orderId]);
+            $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first();
+
+            Order::insert($orderData);
+            $orderSheetData = [
+                'join_sheet_member_id' => $data['join_pay_member_id'],
+                'join_sheet_order_id' => $orderId,
+                'join_sheet_goods_id' => $params['goods_id'],
+                'join_sheet_goods_sku_id' => $sku ? $sku->goods_sku_id : 0,
+                'order_sheet_status' => 'DONE',
+                'order_sheet_category' => 'RECHARGE',
+                'order_sheet_num' => 1,
+                'order_sheet_price' => $data['pay_amount'],
+                'order_sheet_amount' => $data['pay_amount'],
+                'order_sheet_pay' => $data['pay_amount'],
+                'order_sheet_addtimes' => time()
+            ];
+
+            OrderSheet::insert($orderSheetData);
+
+            Db::commit();
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            Db::rollBack();
+
+            throw new BusinessException("数据错误");
+        }
+        $data['join_pay_order_id'] = $orderGroupId;
+        $data['join_pay_object_json'] = json_encode(['order_id' => $orderId]);
 
-            $rate = 0;
-            if (!empty($goods->goods_attribute_json)) {
-                $attributeJson = json_decode($goods->goods_attribute_json, true);
+        $rate = 0;
+        if (!empty($goods->goods_attribute_json) && $type == "CASH") {
+            $attributeJson = json_decode($goods->goods_attribute_json, true);
+            if (isset($attributeJson['added'])) {
                 $rate = $attributeJson['added'] ? $attributeJson['added']['nbr'] : 0;
             }
-
-            $extendJson['added_amount'] = number_format($data['pay_amount'] * $rate, 2, '.', '');
-            $extendJson['added_rate'] = $rate;
-        } else {
-//            $extendJson['notify'] = 'success';
-            $extendJson['is_custom'] = $params['is_custom'];
         }
+
+        $extendJson['added_amount'] = number_format($data['pay_amount'] * $rate, 2, '.', '');
+        $extendJson['added_rate'] = $rate;
+//         } else {
+// //            $extendJson['notify'] = 'success';
+//             $extendJson['is_custom'] = $params['is_custom'];
+//         }
         $data['pay_extend_json'] = json_encode($extendJson);
         $data['pay_paytimes'] = date('Y-m-d H:i:s', strtotime($data['pay_paytimes']));
         $data['pay_prepayid'] = 0;

+ 15 - 1
app/admin/controller/order/ReturnController.php

@@ -16,6 +16,7 @@ use support\exception\BusinessException;
 use support\Request;
 use support\Response;
 use Tinywan\Jwt\JwtToken;
+use Webman\Event\Event;
 
 class ReturnController extends Curd
 {
@@ -92,6 +93,14 @@ class ReturnController extends Curd
         return [$id, $data];
     }
 
+    /**
+     * @Desc 退货退款状态变更通知
+     * @Author Gorden
+     * @Date 2024/7/16 14:22
+     *
+     * @param Request $request
+     * @return Response
+     */
     public function updateStatus(Request $request)
     {
         try {
@@ -103,6 +112,12 @@ class ReturnController extends Curd
             }
 
             $this->doUpdate($id, $data);
+
+            // 退货、退款状态变更通知
+            $data['orders_return_id'] = $id;
+            Event::dispatch('client_message.return_status',$data);
+
+            return json_success('success');
         } catch (BusinessException $e) {
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
@@ -110,6 +125,5 @@ class ReturnController extends Curd
             return json_fail('数据更新失败');
         }
 
-        return json_success('success');
     }
 }

+ 13 - 8
app/admin/controller/order/WholeController.php

@@ -65,6 +65,9 @@ class WholeController extends Curd
             $where['order_addtimes'][0] = strtotime($where['order_addtimes'][0]);
             $where['order_addtimes'][1] = strtotime($where['order_addtimes'][1]);
         }
+        // 充值订单不显示
+        $where['order_category'] = ['<>','RECHARGE'];
+
         $order = $request->get('order', 'desc');
         $field = $field ?? 'order_addtimes';
 
@@ -150,7 +153,7 @@ class WholeController extends Curd
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
-        $model = $model->select('order.*','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status');
+        $model = $model->select('order.*','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
         return $model;
     }
 
@@ -173,7 +176,9 @@ class WholeController extends Curd
                 $item['return'] = [
                     'orders_return_id'=>$item['orders_return_id'],
                     'join_return_order_id' => $item['join_return_order_id'],
-                    'order_return_status' => $item['order_return_status']
+                    'order_return_status' => $item['order_return_status'],
+                    'order_return_apply_json' => $item['order_return_apply_json'],
+                    'order_return_remark'=>$item['order_return_remark']
                 ];
             }
         }
@@ -384,8 +389,8 @@ class WholeController extends Curd
     {
         $params = $request->post();
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
 
             // 修改主订单
             // $this->updateMain($params);
@@ -442,8 +447,8 @@ class WholeController extends Curd
     {
         $params = $request->post();
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
 
             $order = Order::where('order_id', $params['order_id'])
                 ->where('order_status_system', 'CANCEL')
@@ -500,8 +505,8 @@ class WholeController extends Curd
     public function insert(Request $request): Response
     {
         $params = $request->post();
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             // 余额支付
             if ($params['pay_category'] == 'CASH') {
                 $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
@@ -877,8 +882,8 @@ class WholeController extends Curd
 
         $params = $request->post();
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             if ($params['express_type'] == '自提') {
                 $premises = SysDept::where('dept_name', $params['order_express_premises'])->first();
                 if (!$premises) {
@@ -1013,8 +1018,8 @@ class WholeController extends Curd
             $times = date('Y-m-d H:i:s', strtotime($times));
         }
 
+        Db::beginTransaction();
         try {
-            Db::beginTransaction();
             // 减额度
             $benefit->member_benefit_used_count = $benefit->member_benefit_used_count + $nbr;
             // 用完了
@@ -1145,7 +1150,6 @@ class WholeController extends Curd
         if ($redisCode != $code) {
             return json_fail("验证码错误,请重新输入");
         }
-        Redis::del($key);
 
         $benefits = MemberBenefit::whereIn('member_benefit_id', $benefitIds)
             ->where('join_benefit_member_id', $memberId)
@@ -1208,6 +1212,7 @@ class WholeController extends Curd
                 }
             }
 
+            Redis::del($key);
             
             Db::commit();
 

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

@@ -450,6 +450,8 @@ class GoodsService
             ->when($goodsClassify != '', function ($query) use ($goodsClassify) {
                 if($goodsClassify == 'NOPACKAGE'){
                     $query->where('goods_classify','<>', 'PACKAGE');
+                }else if($goodsClassify == 'SERVICE'){
+                    $query->whereIn('goods_classify', ['SERVICE','CHNMED','CHNNCD']);
                 }else{
                     $query->where('goods_classify', $goodsClassify);
                 }

+ 125 - 2
app/admin/service/member/MemberService.php

@@ -95,7 +95,15 @@ class MemberService
             $account = [];
             if (!empty($row['account'])) {
                 foreach ($row['account'] as $item) {
-                    if ($item['member_account_classify'] == 'POINTS') {
+                    if ($item['member_account_classify'] == 'WELFARE') {
+                        $account['welfare'] = [
+                            'member_account_name' => $item['member_account_name'],
+                            'member_account_income' => $item['member_account_income'],
+                            'member_account_expend' => $item['member_account_expend'],
+                            'member_account_surplus' => $item['member_account_surplus'],
+                            'member_account_added' => $item['member_account_added'],
+                        ];
+                    } else if ($item['member_account_classify'] == 'POINTS') {
                         $account['points'] = [
                             'member_account_name' => $item['member_account_name'],
                             'member_account_income' => $item['member_account_income'],
@@ -271,6 +279,118 @@ class MemberService
         return json_success('', $member);
     }
 
+    public static function welfareInfo(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+
+        $account = MemberAccount::where('join_account_member_id', $memberId)
+            ->where('member_account_classify', 'WELFARE')
+            ->first();
+        $balance = $account->member_account_surplus + $account->member_account_added;
+
+        $info = PayDetail::where(function ($query) use ($memberId) {
+            $query->where('join_pay_member_id', $memberId)
+                // ->whereIn('pay_prepayid', ['W06', 'A01'])
+                ->where('pay_category', 'RECHARGE')
+                ->where('pay_prepayid','WELFARE')
+                ->where('pay_status', 'SUCCESS');
+        })->orWhere(function ($query) use ($memberId) {
+            $query->where('join_pay_member_id', $memberId)
+                ->where('pay_prepayid','like', '%WELFARE%')
+                ->where('pay_status', 'SUCCESS');
+        })->orderByDesc('pay_addtimes')
+            ->get()
+            ->toArray();
+        $data = [];
+        foreach ($info as $key => $item) {
+            $categoryIds = [];
+            if(!empty($item['join_pay_order_id'])){
+                $orderIds = Order::where('order_groupby', $item['join_pay_order_id'])->pluck('order_id');
+                $goodsIds = OrderSheet::whereIn('join_sheet_order_id', $orderIds)->pluck('join_sheet_goods_id');
+                $categoryIds = Goods::whereIn('goods_id', $goodsIds)->pluck('join_goods_category_id');
+            }
+            
+
+            $categoryName = [];
+            foreach ($categoryIds as $id) {
+                $category = SysCategory::where('category_id', $id)->first();
+                if (!empty($category->category_super_path)) {
+                    $path = explode('#', $category->category_super_path);
+                    $ids = array_filter($path);
+                    $categoryName[] = SysCategory::where('category_id', current($ids))->value('category_name');
+                } else {
+                    $categoryName[] = $category->category_name;
+                }
+            }
+            $item['goods_category'] = implode(',', array_unique($categoryName));
+            if(mb_substr($item['goods_category'],0,7) == '自定义金额充值'){
+                $item['goods_category'] = '自定义金额充值';
+            }
+
+            if (in_array($item['pay_category'], ['RECHARGE', 'REFUND'])) {
+                $item['balance_type'] = 'add';
+            } else {
+                $item['balance_type'] = 'cut';
+            }
+            if ($key == 0 && in_array($item['pay_category'], ['RECHARGE', 'REFUND'])) {
+                if (!empty($item['pay_extend_json'])) {
+                    $extendJson = json_decode($item['pay_extend_json'], true);
+                    if (!isset($extendJson['added_amount'])) {
+                        $extendJson['added_amount'] = 0;
+                    }
+                    if (isset($extendJson['added_amount']) && floatval($extendJson['added_amount']) > 0) {
+                        $data[] = [
+                            'join_pay_member_id' => $item['join_pay_member_id'],
+                            'pay_addtimes' => $item['pay_addtimes'],
+                            'pay_amount' => $extendJson['added_amount'],
+                            'pay_category' => 'ADDED',
+                            'balance' => number_format($balance, 2, '.', ''),
+                            'balance_type' => 'add',
+                        ];
+                    }
+                    $balance = $balance - $extendJson['added_amount'];
+                }
+
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance - $item['pay_amount'];
+                $data[] = $item;
+                continue;
+            }
+
+            if (in_array($item['pay_category'], ['RECHARGE', 'REFUND'])) {
+                if (!empty($item['pay_extend_json'])) {
+                    $extendJson = json_decode($item['pay_extend_json'], true);
+                    if (isset($extendJson['added_amount']) && floatval($extendJson['added_amount']) > 0) {
+                        $data[] = [
+                            'join_pay_member_id' => $item['join_pay_member_id'],
+                            'pay_addtimes' => $item['pay_addtimes'],
+                            'pay_amount' => $extendJson['added_amount'],
+                            'pay_category' => 'ADDED',
+                            'balance' => number_format($balance, 2, '.', ''),
+                            'balance_type' => 'add',
+                        ];
+                        $balance = $balance - $extendJson['added_amount'];
+                    }
+                }
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance - $item['pay_amount'];
+            } else {
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance + $item['pay_amount'];
+            }
+
+            $data[] = $item;
+        }
+
+        $total = count($data);
+        $start = ($page-1)*$pageSize;
+        $rows = array_slice($data,$start,$pageSize);
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
     public static function balanceInfo(Request $request)
     {
         $memberId = $request->get('member_id', '');
@@ -286,6 +406,7 @@ class MemberService
             $query->where('join_pay_member_id', $memberId)
                 // ->whereIn('pay_prepayid', ['W06', 'A01'])
                 ->where('pay_category', 'RECHARGE')
+                ->where('pay_prepayid','<>','WELFARE')
                 ->where('pay_status', 'SUCCESS');
         })->orWhere(function ($query) use ($memberId) {
             $query->where('join_pay_member_id', $memberId)
@@ -316,7 +437,9 @@ class MemberService
                 }
             }
             $item['goods_category'] = implode(',', array_unique($categoryName));
-
+            if(mb_substr($item['goods_category'],0,7) == '自定义金额充值'){
+                $item['goods_category'] = '自定义金额充值';
+            }
             if (in_array($item['pay_category'], ['RECHARGE', 'REFUND'])) {
                 $item['balance_type'] = 'add';
             } else {

+ 25 - 17
app/admin/service/order/AppointmentService.php

@@ -73,6 +73,8 @@ class AppointmentService
             $row->appointment_apply_json = !empty($row->appointment_apply_json) ? json_decode($row->appointment_apply_json,true) : [];
             if ($row->appointment_category == 'NOFEE') {
                 $row->member_benefit_name = "后付费预约";
+            }elseif ($row->appointment_category == 'GREENWAY'){
+                $row->member_benefit_name = "就医绿通";
             }
             if (!empty($row->appointment_apply_json)) {
                 $applyJson = $row->appointment_apply_json;
@@ -255,7 +257,7 @@ class AppointmentService
                     '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' => 'OTHER',
+                    'order_category' => $goods->goods_classify,
                     'order_status_system' => 'PAYING',
                     'order_status_payment' => 'PENDING',
                     'order_status_storage' => 'PENDING',
@@ -313,16 +315,16 @@ class AppointmentService
                         ]);
                         $pay['pay_status'] = 'SUCCESS';
                         // 更新订单状态
-                        Order::where('order_id', $orderId)->update(['order_status_system' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
-                        OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
+                        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' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
-                    OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
+                    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']);
                 }
             }
 
@@ -438,7 +440,7 @@ class AppointmentService
                     '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' => 'OTHER',
+                    'order_category' => $goods->goods_classify,
                     'order_status_system' => 'PAYING',
                     'order_status_payment' => 'PENDING',
                     'order_status_storage' => 'PENDING',
@@ -502,8 +504,9 @@ class AppointmentService
                         $pay['pay_status'] = 'SUCCESS';
                         $pay['join_pay_object_json'] = json_encode(['payment' => ['member_account_id' => $account->member_account_id]]);
                         // 更新订单状态
-                        Order::where('order_id', $orderId)->update(['order_status_system' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
-                        OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
+
+                        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']);
                     }
                     // $pay['pay_category'] = 'CASH';
                     PayDetail::insert($pay);
@@ -525,8 +528,8 @@ class AppointmentService
                         $pay['pay_status'] = 'SUCCESS';
                         $pay['join_pay_object_json'] = json_encode(['payment' => ['member_account_id' => $account->member_account_id]]);
                         // 更新订单状态
-                        Order::where('order_id', $orderId)->update(['order_status_system' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
-                        OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
+                        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']);
                     }
                     // $pay['pay_category'] = 'CASH';
                     PayDetail::insert($pay);
@@ -535,8 +538,8 @@ class AppointmentService
                     $pay['pay_status'] = 'SUCCESS';
                     PayDetail::insert($pay);
                     // 更新订单状态
-                    Order::where('order_id', $orderId)->update(['order_status_system' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
-                    OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
+                    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']);
                 }
 
                 // 回写权益表
@@ -592,13 +595,18 @@ class AppointmentService
                     $paramsData['component_id'] = $quota['join_member_rule_added_component_id'];
 
                     QuotaController::doWriteOff($paramsData);
+                    // 回写权益ID
+                    if(empty($appointment->join_appointment_member_benefit_id)){
+                        Appointment::where('appointment_id', $appointmentId)->update(['join_appointment_member_benefit_id' => $params['quota_id']]);
+                    }
                 }else if($quotaType == 'BF'){
                     $paramsData['benefit_id'] = $params['quota_id'];
-                    BenefitController::doWriteOff($paramsData);
-                }
-                // 回写权益ID
-                if(empty($appointment->join_appointment_member_benefit_id)){
-                    Appointment::where('appointment_id', $appointmentId)->update(['join_appointment_member_benefit_id' => $params['quota_id']]);
+                    BenefitController::doWriteOff($paramsData,$appointment);
+
+                    // 清除后付费预约
+                    if($appointment->appointment_category == 'NOFEE'){
+                        Appointment::where('appointment_id', $appointmentId)->delete();
+                    }
                 }
 
                 _syslog("预约","已有服务核销");

+ 30 - 0
app/admin/service/order/PayDetailService.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\admin\service\order;
+
+use app\model\PayDetail;
+use support\Db;
+
+class PayDetailService
+{
+    public static function checkPaying()
+    {
+        Db::beginTransaction();
+        try {
+            $timeUnix = strtotime("-30 minutes");
+            $payDetails = PayDetail::where('pay_status', 'WAITING')
+                ->where('pay_addtimes', '<', $timeUnix)
+                ->get();
+            foreach ($payDetails as $payDetail) {
+                // 订单主表
+                PayDetail::where('pay_id', $payDetail->pay_id)->update([
+                    'pay_status' => 'CANCEL',
+                ]);
+            }
+
+            Db::commit();
+        } catch (\Exception $e) {
+            Db::rollBack();
+        }
+    }
+}

+ 87 - 0
app/command/WelfareAccountCommand.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace app\command;
+
+use app\model\Member;
+use app\model\MemberAccount;
+use app\model\Order;
+use app\model\PayDetail;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class WelfareAccountCommand extends Command
+{
+
+    protected static $defaultName = 'WelfareAccountCommand';
+    protected static $defaultDescription = 'WelfareAccountCommand';
+
+    /**
+     * @return void
+     */
+    protected function configure()
+    {
+        $this->addArgument('name', InputArgument::OPTIONAL, '余额账户转福利账户');
+    }
+
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $members = Member::select('member_id', 'member_classify')->get()->toArray();
+        foreach ($members as $member) {
+            if (!MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'WELFARE')->exists()) {
+                if (!$this->generateWelfareAccount($member['member_id'])) {
+                    echo "会员【" . $member['member_id'] . "】跳过\n";
+                    continue;
+                }
+            }
+            if ($member['member_classify'] != 'EMPLOY') {
+                Member::where('member_id', $member['member_id'])->update(['member_classify' => 'EMPLOY']);
+            }
+            // 改所有的充值记录
+            PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_category', 'RECHARGE')->where('pay_amount','1000.00')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
+
+            // 改所有的付款记录
+            PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_prepayid', $member['member_id'] . '-CASH')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
+
+            // 余额账户清空
+           MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'CASH')->update([
+               'member_account_income' => 0,
+               'member_account_expend' => 0,
+               'member_account_surplus' => 0,
+               'member_account_added' => 0,
+
+           ]);
+
+
+            echo "会员【" . $member['member_id'] . "】已处理完成\n";
+        }
+
+        return self::SUCCESS;
+    }
+
+    private function generateWelfareAccount($memberId)
+    {
+        $cashAccount = MemberAccount::where('join_account_member_id', $memberId)->where('member_account_classify', 'CASH')->first();
+        if (!$cashAccount) {
+            return false;
+        }
+
+        MemberAccount::insert([
+            'join_account_member_id' => $memberId,
+            'member_account_classify' => 'WELFARE',
+            'member_account_status' => 'ACTIVED',
+            'member_account_category' => 'NORMAL',
+            'member_account_nbr' => $memberId . '-WELFARE',
+            'member_account_name' => '福利账户',
+            'member_account_income' => $cashAccount->member_account_income,
+            'member_account_expend' => $cashAccount->member_account_expend,
+            'member_account_surplus' => $cashAccount->member_account_surplus,
+            'member_account_added' => $cashAccount->member_account_added,
+            'member_account_addtimes' => time()
+        ]);
+
+        return true;
+    }
+}

+ 47 - 0
app/event/ClientMessageEvent.php

@@ -4,6 +4,7 @@ namespace app\event;
 
 use app\model\ClientMessage;
 use app\model\Order;
+use app\model\OrderReturn;
 use app\model\OrderSheet;
 
 class ClientMessageEvent
@@ -56,7 +57,53 @@ class ClientMessageEvent
         }
     }
 
+    /**
+     * @Desc 退货/退款状态变更站内信
+     * @Author Gorden
+     * @Date 2024/7/16 14:19
+     *
+     * @param $params
+     * @return void
+     */
+    public function returnStatus($params)
+    {
+        try {
+            $orderReturn = OrderReturn::where('orders_return_id',$params['orders_return_id'])->first();
+            if (!$orderReturn){
+                return;
+            }
+
+            if ($params['order_return_status'] == 'DOING'){
+                $content = "商家已同意您的退货/退款申请。";
+            }else{
+                $content = "商家已拒绝您的退货/退款申请。";
+            }
 
+            $clientMessage = new ClientMessage();
+            $clientMessage->client_message_classify = 'ORDER';
+            $clientMessage->join_client_message_send = 'SYSTEM';
+            $clientMessage->join_client_message_recv_member_id = $orderReturn->join_return_member_id;
+            $clientMessage->client_message_sendtime = date('Y-m-d H:i:s');
+            $clientMessage->client_message_status = 'PENDING';
+            $clientMessage->client_message_category = 'NORMAL';
+            $clientMessage->client_message_header_json = json_encode(['title' => '订单消息']);
+            $clientMessage->client_message_body_json = json_encode(['content' => '退货/退款通知:'.$content]);
+            $clientMessage->client_message_addtimes = time();
+            $clientMessage->save();
+
+        } catch (\Exception $e) {
+        }
+    }
+
+
+    /**
+     * @Desc 退款成功通知
+     * @Author Gorden
+     * @Date 2024/7/16 14:09
+     *
+     * @param $memberId
+     * @return void
+     */
     public function refund($memberId)
     {
         try {

+ 6 - 0
app/model/PayDetail.php

@@ -33,4 +33,10 @@ class PayDetail extends Model
         return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_pay_member_id')
             ->select('join_cert_member_id', 'member_cert_name');
     }
+
+    public function memberAccount()
+    {
+        return $this->hasMany(MemberAccount::class, 'join_account_member_id', 'join_pay_member_id')
+            ->select('join_account_member_id','member_account_surplus','member_account_added','member_account_classify','member_account_name');
+    }
 }

+ 3 - 0
config/event.php

@@ -7,4 +7,7 @@ return [
     'client_message.refund' => [
         [\app\event\ClientMessageEvent::class, 'refund']
     ],
+    'client_message.return_status' => [
+        [\app\event\ClientMessageEvent::class, 'returnStatus']
+    ],
 ];

+ 3 - 0
process/Task.php

@@ -6,6 +6,7 @@ use app\admin\controller\notify\RechargeController;
 use app\admin\service\client\MessageService;
 use app\admin\service\goods\GoodsService;
 use app\admin\service\order\OrderService;
+use app\admin\service\order\PayDetailService;
 use Workerman\Crontab\Crontab;
 
 class Task
@@ -22,6 +23,8 @@ class Task
 //            GoodsService::checkOffListing();
             // 未支付30分钟取消
             OrderService::checkPayingOrder();
+            // 支付记录:未支付30分钟取消
+            PayDetailService::checkPaying();
 
             // 会员消息 30分钟未读,发送站内信
             MessageService::unreadChatMessage();

+ 3 - 0
route/admin.php

@@ -612,6 +612,7 @@ Route::group('/admin', function () {
             Route::get('/selectWriteOffMember', [\app\admin\controller\member\MemberController::class, 'selectWriteOffMember']);
             Route::get('/selectFamilyMemberList', [\app\admin\controller\member\MemberController::class, 'selectFamilyMemberList']);
             Route::get('/selectMemberAllQuota', [\app\admin\controller\member\MemberController::class, 'selectMemberAllQuota']);
+            Route::get('/welfareInfo', [\app\admin\controller\member\MemberController::class, 'welfareInfo']);
             Route::get('/balanceInfo', [\app\admin\controller\member\MemberController::class, 'balanceInfo']);
             Route::get('/pointInfo', [\app\admin\controller\member\MemberController::class, 'pointInfo']);
             Route::get('/list', [\app\admin\controller\member\MemberController::class, 'list']);
@@ -866,8 +867,10 @@ Route::group('/admin', function () {
         // 支付记录
         Route::group('/payDetail', function () {
             Route::get('/list', [\app\admin\controller\order\PayDetailController::class, 'select']);
+            Route::get('/welfareList', [\app\admin\controller\order\PayDetailController::class, 'selectWelfare']);
             Route::get('/goodsOrder',[\app\admin\controller\order\PayDetailController::class,'goodsOrder']);
             Route::post('/insertRecharge',[\app\admin\controller\order\PayDetailController::class,'insertRecharge']);
+            Route::post('/insertRechargeWelfare',[\app\admin\controller\order\PayDetailController::class,'insertRechargeWelfare']);
 //            Route::get('/info', [\app\admin\controller\order\AppointmentController::class, 'info']);
         });
     });