Browse Source

页面+接口对接

gorden 11 months ago
parent
commit
6b9d5f2068

+ 47 - 1
app/admin/controller/asset/HouseTypeController.php

@@ -5,6 +5,7 @@ namespace app\admin\controller\asset;
 use app\admin\validate\asset\HouseTypeValidate;
 use app\controller\Curd;
 use app\model\Asset;
+use support\exception\BusinessException;
 use support\Request;
 
 class HouseTypeController extends Curd
@@ -16,6 +17,20 @@ class HouseTypeController extends Curd
         $this->validateClass = new HouseTypeValidate();
     }
 
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            $assetHouseJson = json_decode($item->asset_house_json, true);
+            if (!empty($assetHouseJson['floor_plan'])) {
+                $assetHouseJson['floor_plan'] = getenv('STORAGE_DOMAIN') . $assetHouseJson['floor_plan'];
+                $item->asset_house_json = $assetHouseJson;
+            }
+            $item->asset_json = json_decode($item->asset_json, true);
+        }
+
+        return $items;
+    }
+
     /**
      * @Desc 提交数据处理
      * @Author Gorden
@@ -28,8 +43,39 @@ class HouseTypeController extends Curd
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());
-        $data['asset_id'] = date('YmdHis') . mt_rand(1000, 9999);
+        $data['asset_id'] = 'AE' . date('YmdHis') . random_string(6, 'up');
+        $data['asset_house_json'] = json_encode(['floor_plan' => str_replace(getenv('STORAGE_DOMAIN'), '', $data['floor_plan'])]);
+        $data['asset_json'] = json_encode(['address' => $data['asset_house_address']]);
+        dump($data);
 
         return $data;
     }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+
+
+        if (!empty($request->post('floor_plan'))) {
+            $assetHouseJson = json_decode($model->asset_house_json, true);
+            $assetHouseJson['floor_plan'] = str_replace(getenv('STORAGE_DOMAIN'), '', $request->post('floor_plan'));
+            $data['asset_house_json'] = json_encode($assetHouseJson);
+        }
+        if (!empty($request->post('asset_house_address'))) {
+            $assetJson = json_decode($model->asset_json, true);
+            $assetJson['address'] = $request->post('asset_house_address');
+            $data['asset_json'] = json_encode($assetJson);
+        }
+
+        dump($data);
+
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
 }

+ 34 - 0
app/admin/controller/client/AppParamsController.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\SysConfig;
+use support\Request;
+use support\Response;
+
+class AppParamsController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new SysConfig();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['config_category'] = 'APP';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['config_category'] = 'APP';
+        if (empty($data['config_value_json'])){
+            $data['config_value_json'] = '[]';
+        }
+        return $data;
+    }
+}

+ 93 - 0
app/admin/controller/client/MessageController.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientMessage;
+use support\exception\BusinessException;
+use support\Request;
+
+class MessageController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new ClientMessage();
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with('member');
+        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);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+
+        if (!empty($data['client_message_datetimes'])) {
+            $data['client_message_datetimes'] = date('Y-m-d H:i:s', strtotime($data['client_message_datetimes']));
+        }
+        if (!empty($data['client_message_header_json']) && !is_json($data['client_message_header_json'])){
+            $data['client_message_header_json'] = json_encode(['header'=>$data['client_message_header_json']]);
+        }
+        if (!empty($data['client_message_body_json']) && !is_json($data['client_message_body_json'])){
+            $data['client_message_body_json'] = json_encode(['header'=>$data['client_message_body_json']]);
+        }
+        return $data;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+
+        if (!empty($data['client_message_datetimes'])) {
+            $data['client_message_datetimes'] = date('Y-m-d H:i:s', strtotime($data['client_message_datetimes']));
+        }
+        if (!empty($data['client_message_header_json']) && !is_json($data['client_message_header_json'])){
+            $data['client_message_header_json'] = json_encode(['header'=>$data['client_message_header_json']]);
+        }
+        if (!empty($data['client_message_body_json']) && !is_json($data['client_message_body_json'])){
+            $data['client_message_body_json'] = json_encode(['header'=>$data['client_message_body_json']]);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 12 - 0
app/admin/controller/device/DeviceController.php

@@ -27,6 +27,18 @@ class DeviceController extends Curd
         return $this->doFormat($query, $format, $limit);
     }
 
+    /* 设备列表(下拉选项)*/
+    public function selectList()
+    {
+        $class = get_class($this->model);
+        $data = $class::where('device_status', 'ACTIVED')
+            ->select('device_id', 'device_name','device_identify')
+            ->get()
+            ->toArray();
+
+        return json_success('', $data);
+    }
+
     protected function insertInput(Request $request): array
     {
         $data = $this->inputFilter($request->post());

+ 69 - 0
app/admin/controller/member/BenefitController.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace app\admin\controller\member;
+
+use app\controller\Curd;
+use app\model\MemberBenefit;
+use support\exception\BusinessException;
+use support\Request;
+
+class BenefitController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new MemberBenefit();
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with('member','goods');
+        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);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        $data['member_benefit_valid_datetimes'] = date('Y-m-d H:i:s',strtotime($data['member_benefit_valid_datetimes']));
+
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 27 - 4
app/admin/controller/member/MemberController.php

@@ -19,7 +19,7 @@ class MemberController
         $res = Db::table('member')
             ->join('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
             ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name')
-            ->where('member.member_is_owner','N')
+            ->where('member.member_is_owner', 'N')
             ->where(function ($query) use ($keywords) {
                 $query->where('member.member_mobile', 'like', '%' . $keywords . '%')
                     ->orWhere("member.member_id", 'like', '%' . $keywords . '%')
@@ -28,12 +28,12 @@ class MemberController
         $data = [];
         foreach ($res as $item) {
             $data[] = [
-                'key'=>$item->member_id,
-                'value'=>!empty($item->member_cert_name) ? $item->member_cert_name : $item->member_mobile,
+                'key' => $item->member_id,
+                'value' => !empty($item->member_cert_name) ? $item->member_cert_name : $item->member_mobile,
             ];
         }
 
-        return json_success('',$data);
+        return json_success('', $data);
     }
 
     public function list(Request $request)
@@ -59,4 +59,27 @@ class MemberController
 
         return MemberService::add($request->post());
     }
+
+    /**
+     * @Desc 绑定的设备
+     * @Author Gorden
+     * @Date 2024/4/7 10:20
+     *
+     * @param $id
+     * @return \support\Response
+     */
+    public function device($id)
+    {
+        return MemberService::deviceList($id);
+    }
+
+    public function addDevice(Request $request)
+    {
+        return MemberService::addDevice($request);
+    }
+
+    public function updateDevice(Request $request)
+    {
+        return MemberService::updateDevice($request);
+    }
 }

+ 63 - 11
app/admin/controller/order/WholeController.php

@@ -4,13 +4,16 @@ namespace app\admin\controller\order;
 
 use app\admin\validate\coupon\CouponValidate;
 use app\admin\validate\device\DeviceValidate;
+use app\admin\validate\order\OrderExpressValidate;
 use app\admin\validate\order\OrderValidate;
 use app\controller\Curd;
 use app\model\Coupon;
 use app\model\Device;
 use app\model\Order;
+use app\model\OrderExpress;
 use app\model\OrderSheet;
 use app\model\SysSerial;
+use support\Db;
 use support\exception\BusinessException;
 use support\Request;
 use support\Response;
@@ -38,6 +41,10 @@ class WholeController extends Curd
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
         $order = $request->get('order', 'desc');
         $field = $field ?? 'order_addtimes';
+        if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
+            unset($where['order_status_system']);
+            $where['order_category'] = 'RETURN';
+        }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
@@ -76,18 +83,63 @@ class WholeController extends Curd
         return json_success('', $data);
     }
 
-    protected function updateInput(Request $request): array
+//    protected function updateInput(Request $request): array
+//    {
+//        $primary_key = $this->model->getKeyName();
+//        $id = $request->post($primary_key);
+//        $data = $this->inputFilter($request->post());
+//        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+//        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+//        $model = $this->model->find($id);
+//        if (!$model) {
+//            throw new BusinessException('记录不存在', 2);
+//        }
+//        unset($data[$primary_key]);
+//        return [$id, $data];
+//    }
+
+    public function delivery(Request $request)
     {
-        $primary_key = $this->model->getKeyName();
-        $id = $request->post($primary_key);
-        $data = $this->inputFilter($request->post());
-        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
-        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
-        $model = $this->model->find($id);
-        if (!$model) {
-            throw new BusinessException('记录不存在', 2);
+        if (!Order::where('order_id', $request->post('order_id'))->where('order_status_system', 'SENDING')->exists()) {
+            return json_fail('订单状态异常');
+        }
+
+        // 验证
+        $validate = new OrderExpressValidate();
+        if (!$validate->scene('delivery')->check($request->post())) {
+            return json_fail($validate->getError());
+        }
+        try {
+            Db::beginTransaction();
+            // 该订单状态
+            Order::where('order_id', $request->post('order_id'))->update(['order_status_system' => 'RECVING','order_status_storage'=>'EXPRESSING']);
+            // 订单包含的产品
+            $sheet = OrderSheet::where('join_sheet_order_id',$request->post('order_id'))
+                ->select('join_sheet_goods_id')
+                ->get();
+            // 入配送记录表
+            $params = $request->post();
+            $model = new OrderExpress();
+            $model->join_express_order_id = $params['order_id'];
+            $model->order_express_goods = $sheet;
+            $model->order_express_type = $params['order_express_type'];
+            $model->order_express_code = $params['order_express_code'];
+            $model->order_express_city = $params['order_express_city'];
+            $model->order_express_address = $params['order_express_address'];
+            $model->order_express_mobile = $params['order_express_mobile'];
+            $model->order_express_telephone = $params['order_express_telephone'] ?? null;
+            $model->order_express_person = $params['order_express_person'] ?? null;
+            $model->order_express_remark = $params['order_express_remark'] ?? null;
+            $model->order_express_addtimes = time();
+            $model->save();
+
+            Db::commit();
+
+            return json_success('发货成功');
+        } catch (\Exception $e) {
+            Db::rollBack();
+
+            return json_fail('发货失败');
         }
-        unset($data[$primary_key]);
-        return [$id, $data];
     }
 }

+ 37 - 0
app/admin/controller/sys_manage/ConfigController.php

@@ -4,6 +4,7 @@ namespace app\admin\controller\sys_manage;
 
 use app\admin\service\sys_manage\ConfigService;
 use app\admin\validate\sys_manage\ConfigValidate;
+use app\model\SysConfig;
 use support\Request;
 
 class ConfigController
@@ -102,4 +103,40 @@ class ConfigController
     {
         return ConfigService::delConfig($request);
     }
+
+    public function bottomMenuList()
+    {
+        $config = SysConfig::where('config_name', 'APP底部菜单')->first()->toArray();
+
+        return json_success('', json_decode($config['config_value_json']));
+    }
+
+    public function bottomMenuSave(Request $request)
+    {
+        try {
+            SysConfig::where('config_name', 'APP底部菜单')->update(['config_value_json'=>json_encode($request->post())]);
+
+            return json_success('success');
+        }catch (\Exception $e){
+            return json_fail('APP底部菜单保存失败');
+        }
+    }
+
+    public function navMenuList()
+    {
+        $config = SysConfig::where('config_name', 'APP导航菜单')->first()->toArray();
+
+        return json_success('', json_decode($config['config_value_json']));
+    }
+
+    public function navMenuSave(Request $request)
+    {
+        try {
+            SysConfig::where('config_name', 'APP导航菜单')->update(['config_value_json'=>json_encode($request->post())]);
+
+            return json_success('success');
+        }catch (\Exception $e){
+            return json_fail('APP底部菜单保存失败');
+        }
+    }
 }

+ 221 - 0
app/admin/controller/sys_manage/TaskController.php

@@ -0,0 +1,221 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\TaskValidate;
+use app\controller\Curd;
+use app\model\Appointment;
+use app\model\OrderSheet;
+use app\model\Task;
+use app\model\TaskProcess;
+use support\Db;
+use support\Request;
+use support\Response;
+use Tinywan\Jwt\JwtToken;
+
+class TaskController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Task();
+        $this->validate = true;
+        $this->validateClass = new TaskValidate();
+    }
+
+    /**
+     * @Desc 列表查询
+     * @Author Gorden
+     * @Date 2024/4/7 15:52
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'task_addtimes';
+        $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' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'user' => function ($query) {
+                $query->select('user_name', 'user_login_name', 'user_id');
+            }
+        ]);
+        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);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    /**
+     * @Desc 工单详情
+     * @Author Gorden
+     * @Date 2024/4/7 16:15
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('info')->check(['task_id' => $request->get('id')])) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        $data = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'user' => function ($query) {
+                $query->select('user_name', 'user_login_name', 'user_id');
+            }
+
+        ])->where('task_id', $request->get('id'))
+            ->first();
+        if (!empty($data)) {
+            $data = $data->toArray();
+        }
+        // 查订单详情
+        if (!empty($data['join_task_order_id'])) {
+            $order = OrderSheet::with([
+                'goods',
+                'member' => function ($query) {
+                    $query->select('member_id', 'member_mobile');
+                }
+            ])->where('join_sheet_order_id', $data['join_task_order_id'])
+                ->first();
+            if ($order) {
+                $order->goods->goods_cover = getenv('STORAGE_DOMAIN') . $order->goods->goods_cover;
+                $data['order'] = $order ?? null;
+            }
+        }
+        // 查预约详情
+        if (!empty($data['join_task_appointment_id'])) {
+            $appointment = Appointment::with([
+                'goods',
+                'member' => function ($query) {
+                    $query->select('member_id', 'member_mobile');
+                }
+            ])->where('appointment_id', $data['join_task_appointment_id'])
+                ->first();
+            if ($appointment) {
+                $appointment->goods->goods_cover = getenv('STORAGE_DOMAIN') . $appointment->goods->goods_cover;
+
+                $data['appointment'] = $appointment ?? null;
+            }
+        }
+
+        return json_success('', $data);
+    }
+
+    /**
+     * @Desc 处理工单
+     * @Author Gorden
+     * @Date 2024/4/8 10:30
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function process(Request $request)
+    {
+        $params = $request->post();
+        $params['task_id'] = $request->post('id');
+        if ($this->validate && !$this->validateClass->scene('process')->check($params)) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        Db::beginTransaction();
+        try {
+            // 更新工单状态
+            Task::where('task_id', $params['task_id'])->update(['task_status' => $params['task_status']]);
+            // 创建处理记录
+            $process = new TaskProcess();
+            $process->join_process_task_id = $params['task_id'];
+            $process->join_task_process_user_id = JwtToken::getCurrentId();
+            $process->task_process_status = $params['task_process_status'];
+            $process->task_process_category = $params['task_process_category'] ?? null;
+            $process->task_process_begin_datetimes = date('Y-m-d H:i:s', strtotime($params['task_process_datetimes'][0])) ?? null;
+            $process->task_process_end_datetimes = date('Y-m-d H:i:s', strtotime($params['task_process_datetimes'][1])) ?? null;
+            $process->task_process_json = $params['task_process_json'] ?? null;
+            $process->task_process_config_json = $params['task_process_config_json'] ?? null;
+            $process->task_process_notify_json = $params['task_process_notify_json'] ?? null;
+            $process->task_process_remark = $params['task_process_remark'] ?? null;
+            $process->task_process_addtimes = time();
+            $process->save();
+
+            // 写日志
+            _syslog("工单状态变更", "工单状态变更为:" . $params['task_status']);
+            _syslog("工单处理", "处理状态:" . $process->task_process_status . "; 处理分类:" . $process->task_process_category ?? '无');
+
+            Db::commit();
+            return json_success('success');
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('工单处理失败');
+        }
+    }
+
+    /**
+     * @Desc 操作日志
+     * @Author Gorden
+     * @Date 2024/4/8 11:04
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function processLog(Request $request)
+    {
+        if ($this->validate && !$this->validateClass->scene('info')->check(['task_id' => $request->get('id')])) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        $taskId = $request->get('id');
+        $log = TaskProcess::with('user')
+            ->where('join_process_task_id',$taskId)
+            ->get()
+            ->toArray();
+
+        foreach ($log as &$item){
+            $item['datetimes'] = $item['task_process_begin_datetimes'].' ~ '.$item['task_process_end_datetimes'];
+        }
+
+        return json_success('',$log);
+    }
+}

+ 146 - 16
app/admin/service/goods/GoodsService.php

@@ -28,7 +28,7 @@ class GoodsService
             'running' => function ($query) {
                 $query->select('join_running_goods_id', 'goods_running_storage');
             }
-        ])->select('goods_id', 'join_goods_category_id', 'join_goods_device_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
+        ])->select('goods_id', 'join_goods_category_id', 'join_goods_device_ledger_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
             ->when($goodsName != '', function ($query) use ($goodsName) {
                 $query->where(function ($q) use ($goodsName) {
                     $q->where('goods_name', 'like', '%' . $goodsName . '%')
@@ -66,28 +66,96 @@ class GoodsService
     {
         try {
             // 商品主表
-            $main = Goods::where('goods_id', $goodsId)->first()->toArray();
+            $main = Goods::where('goods_id', $goodsId)->first();
+            if (!empty($main)) {
+                $main = $main->toArray();
+                $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
+                $main['specList'] = [];
+                foreach ($main['goods_sku_json'] as $key => $sku) {
+                    $main['specList'][] = [
+                        'label' => $key,
+                        'tags' => $sku
+                    ];
+                }
+
+            } else {
+                $main = [];
+            }
             // 详情表
-            $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first()->toArray();
+            $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
+            if (!empty($detail)) {
+                $detail = $detail->toArray();
+            } else {
+                $detail = [];
+            }
             // 标签表
-            $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first()->toArray();
+            $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
+            if (!empty($label)) {
+                $label = $label->toArray();
+            } else {
+                $label = [];
+            }
             // Running表
-            $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first()->toArray();
+            $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
+            if (!empty($running)) {
+                $running = $running->toArray();
+            } else {
+                $running = [];
+            }
+            // Sku表
+            $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->get();
+            if (!empty($running)) {
+                $skus = $skus->toArray();
+                $submitList = [];
+                foreach ($skus as $key => $sku) {
+                    $skuSpecsJson = json_decode($sku['goods_sku_specs_json'], true);
+                    $skuSpecs = '';
+                    $skuNameValue = [];
+                    $i = 1;
+                    foreach ($skuSpecsJson as $k => $item) {
+//                        dump($item);
+                        $skuSpecs = $skuSpecs . $item . ',';
+                        $skuNameKey = 'skuName' . $i;
+                        $skuValueKey = 'skuValue' . $i;
+                        $skuNameValue[$skuNameKey] = $k;
+                        $skuNameValue[$skuValueKey] = $item;
+                        $skuNameValue[$k] = $item;
+                        $i++;
+                    }
+                    $storage = json_decode($sku['goods_sku_storage_json'], true);
+                    $priceStorage = [
+                        'sku' => rtrim($skuSpecs, ','),
+                        'stock' => $storage['storage'],
+                        'price' => $sku['goods_sku_sales_price'],
+                    ];
+
+                    $submitList[] = array_merge($skuNameValue, $priceStorage);
+                }
+                $skus['submitList'] = $submitList;
+            } else {
+                $skus = [];
+            }
+
             // 合并数据
-            $data = array_merge($main, $detail, $label, $running);
+            $data = array_merge($main, $detail, $label, $running, ['sku' => $skus]);
+            $data['goods_sku_json_label'] = [];
 
-            $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : '';
+            $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
             $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
-            $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
-            $slider = '';
-            foreach ($data['goods_detail_slider_json'] as $item) {
-                $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
+            if (!empty($data['goods_detail_slider_json'])) {
+                $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
+                $slider = '';
+                foreach ($data['goods_detail_slider_json'] as $item) {
+                    $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
+                }
+                $data['goods_detail_slider_json'] = rtrim($slider, ',');
             }
-            $data['goods_detail_slider_json'] = rtrim($slider, ',');
+
             $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
 
             return json_success('', $data);
         } catch (\Exception $e) {
+            dump($e->getTrace());
             return json_fail("查询错误~");
         }
     }
@@ -114,6 +182,8 @@ class GoodsService
             self::labelInsert($params);
             // 产品运行控制信息表
             self::goodsRunningInsert($params);
+            // sku表
+            self::goodsSkuSet($params, 'insert');
 
             Db::commit();
         } catch (\PDOException $e) {
@@ -122,6 +192,7 @@ class GoodsService
             return json_fail('数据写入失败~');
         } catch (BusinessException $e) {
             Db::rollBack();
+            dump($e->getMessage());
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
@@ -144,6 +215,8 @@ class GoodsService
             self::labelUpdate($params);
             // 产品运行控制信息表
             self::goodsRunningUpdate($params);
+            // sku表
+            self::goodsSkuSet($params, 'update');
 
             Db::commit();
         } catch (BusinessException $e) {
@@ -214,7 +287,7 @@ class GoodsService
             $model->goods_name = $params['goods_name'];
             $model->goods_market_price = $params['goods_market_price'] ?? '';
             $model->goods_sales_price = $params['goods_sales_price'] ?? '';
-            $model->goods_sku_json = !empty($params['goods_sku_json']) ? $params['goods_sku_json'] : '{}';
+            $model->goods_sku_json = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
             $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '{}';
             $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
             $model->goods_title = $params['goods_title'] ?? '';
@@ -361,11 +434,13 @@ class GoodsService
                 $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
             }
             $data['goods_on_addtimes'] = strtotime($data['goods_on_addtimes']);
+            $data['goods_sku_json'] = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
 
             self::doUpdate($data['goods_id'], $data, new Goods());
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
+            dump($e->getTrace());
             throw new BusinessException('数据更新异常~1');
         }
     }
@@ -389,7 +464,9 @@ class GoodsService
             }
             // 根据goods_id 查详情ID
             $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first();
-            self::doUpdate($detail->goods_detail_id, $data, new GoodsDetail());
+            if ($detail) {
+                self::doUpdate($detail->goods_detail_id, $data, new GoodsDetail());
+            }
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
@@ -413,7 +490,9 @@ class GoodsService
             $data = self::inputFilter($params, new GoodsLabel());
             // 根据goods_id 查详情ID
             $detail = GoodsLabel::where('join_label_goods_id', $params['goods_id'])->first();
-            self::doUpdate($detail->goods_label_id, $data, new GoodsLabel());
+            if ($detail) {
+                self::doUpdate($detail->goods_label_id, $data, new GoodsLabel());
+            }
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
@@ -436,7 +515,9 @@ class GoodsService
             $data = self::inputFilter($params, new GoodsRunning());
             // 根据goods_id 查详情ID
             $detail = GoodsRunning::where('join_running_goods_id', $params['goods_id'])->first();
-            self::doUpdate($detail->goods_running_id, $data, new GoodsRunning());
+            if ($detail) {
+                self::doUpdate($detail->goods_running_id, $data, new GoodsRunning());
+            }
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
@@ -444,6 +525,54 @@ class GoodsService
         }
     }
 
+    /**
+     * @Desc sku 设置
+     * @Author Gorden
+     * @Date 2024/4/10 10:43
+     *
+     * @param $params
+     * @return void
+     * @throws BusinessException
+     */
+    public static function goodsSkuSet($params, $operation = 'insert')
+    {
+        try {
+            Db::beginTransaction();
+            if ($operation == 'update') {
+                // 删掉原有的
+                GoodsSku::where('join_sku_goods_id', $params['goods_id'])->delete();
+            }
+            // 入新的
+            if (!empty($params['goods_sku_json_value'])) {
+                foreach ($params['goods_sku_json_value'] as $item) {
+                    $skus = explode(',', $item['sku']);
+                    $skuArr = [];
+                    for ($i = 1; $i <= count($skus); $i++) {
+                        $skuName = "skuName" . $i;
+                        $key = $item[$skuName];
+                        $skuArr[$key] = $skus[$i - 1];
+                    }
+
+                    $model = new GoodsSku();
+                    $model->join_sku_goods_id = $params['goods_id'];
+                    $model->goods_sku_status = $params['goods_status'];
+                    $model->goods_sku_specs_json = json_encode($skuArr);
+                    $model->goods_sku_title = str_replace('-', ',', $item['sku']) . $params['goods_name'];
+                    $model->goods_sku_market_price = $params['goods_market_price'];
+                    $model->goods_sku_sales_price = $item['price'];
+                    $model->goods_sku_storage_json = json_encode(['storage' => $item['stock']]);
+                    $model->save();
+
+                }
+            }
+            Db::commit();
+        } catch (\Exception $e) {
+            Db::rollBack();
+
+            throw new BusinessException('数据更新异常~5');
+        }
+    }
+
     /**
      * @Desc
      * @Author Gorden
@@ -472,6 +601,7 @@ class GoodsService
                 $data[$col] = null;
             }
             if (is_array($item)) {
+                dump($item);
                 $data[$col] = implode(',', $item);
             }
             if ($item != '' && (strpos(strtolower($columns[$col]), 'varchar') || strpos(strtolower($columns[$col]), 'text'))) {

+ 68 - 0
app/admin/service/member/MemberService.php

@@ -4,6 +4,7 @@ namespace app\admin\service\member;
 
 use app\model\Member;
 use app\model\MemberCert;
+use app\model\MemberDevice;
 use app\model\MemberInfo;
 use app\model\SysSerial;
 use support\Db;
@@ -97,6 +98,73 @@ class MemberService
         return json_success('数据添加成功');
     }
 
+    /**
+     * @Desc 会员关联设备列表
+     * @Author Gorden
+     * @Date 2024/4/7 9:52
+     *
+     * @param $id
+     * @return \support\Response
+     */
+    public static function deviceList($id)
+    {
+        $rows = MemberDevice::leftJoin('device', 'device.device_id', '=', 'member_device.join_member_device_id')
+            ->where('member_device.join_device_member_id', $id)
+            ->get()
+            ->toArray();
+
+        return json_success('', ['rows' => $rows]);
+    }
+
+    /**
+     * @Desc 绑定设备
+     * @Author Gorden
+     * @Date 2024/4/7 10:27
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public static function addDevice(Request $request)
+    {
+        $params = $request->post();
+        try {
+            $data = [
+                'join_device_member_id' =>$params['join_device_member_id'],
+                'join_member_device_id' => $params['join_member_device_id'],
+                'member_device_status' => $params['member_device_status'],
+                'member_device_key' => $params['member_device_key'],
+                'member_device_config_json' => !empty($params['member_device_config_json']) ? $params['member_device_config_json'] : null,
+                'member_device_remark'=>$params['member_device_remark'] ?? null,
+                'member_device_addtimes'=>time(),
+            ];
+
+            MemberDevice::insert($data);
+        }catch (\Exception $e){
+            dump($e->getMessage());
+            return json_fail('绑定失败');
+        }
+
+        return json_success('绑定成功');
+    }
+    public static function updateDevice(Request $request)
+    {
+        $params = $request->post();
+        try {
+            $data = [
+                'member_device_status' => $params['member_device_status'],
+                'member_device_config_json' => !empty($params['member_device_config_json']) ? $params['member_device_config_json'] : null,
+                'member_device_remark'=>$params['member_device_remark'] ?? null,
+            ];
+
+            MemberDevice::where('member_device_id',$request->post('member_device_id'))->update($data);
+        }catch (\Exception $e){
+            dump($e->getMessage());
+            return json_fail('绑定失败');
+        }
+
+        return json_success('绑定成功');
+    }
+
     private static function generateMemberId()
     {
         $id = SysSerial::getSerial();

+ 2 - 7
app/admin/validate/asset/HouseTypeValidate.php

@@ -9,17 +9,14 @@ class HouseTypeValidate extends Validate
     protected $rule = [
         'asset_id' => 'require|integer',
         'join_asset_category_id' => 'integer',
-        'asset_name' => 'require',
         'asset_key' => 'require|alphaDash',
         'asset_classify' => 'max:32',
         'asset_status' => 'require|in:ACTIVED,DISABLED',
         'asset_category' => 'max:32',
         'asset_house_type' => 'max:32',
-        'asset_house_type_image' => 'regex:/^[0-9a-zA-Z\.\/]+$/',
         'asset_area_building' => 'float',
         'asset_area_floorage' => 'float',
         'asset_area_shared' => 'float',
-        'asset_json' => 'isJson',
         'asset_remark' => 'max:128',
         'asset_extend_json' => 'isJson'
     ];
@@ -27,10 +24,8 @@ class HouseTypeValidate extends Validate
     protected $message = [];
 
     protected $scene = [
-        'add' => ['join_asset_category_id', 'asset_name', 'asset_key', 'asset_classify', 'asset_status', 'asset_category', 'asset_house_type',
-            'asset_house_type_image', 'asset_area_building', 'asset_area_floorage', 'asset_area_shared', 'asset_json', 'asset_remark', 'asset_extend_json'],
-        'update' => ['asset_id', 'join_asset_category_id', 'asset_name', 'asset_key', 'asset_classify', 'asset_status', 'asset_category', 'asset_house_type',
-            'asset_house_type_image', 'asset_area_building', 'asset_area_floorage', 'asset_area_shared', 'asset_json', 'asset_remark', 'asset_extend_json'],
+        'add' => ['join_asset_category_id', 'asset_key', 'asset_classify', 'asset_status', 'asset_category', 'asset_house_type', 'asset_area_building', 'asset_area_floorage', 'asset_area_shared', 'asset_remark', 'asset_extend_json'],
+        'update' => ['asset_id', 'join_asset_category_id', 'asset_key', 'asset_classify', 'asset_status', 'asset_category', 'asset_house_type', 'asset_area_building', 'asset_area_floorage', 'asset_area_shared', 'asset_remark', 'asset_extend_json'],
     ];
 
     public function isJson($value)

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

@@ -12,12 +12,12 @@ class GoodsValidate extends Validate
         'join_goods_device_id' => 'max:32',
         'goods_classify' => 'require|in:GOODS,DEVICE,SERVICE,SPECIAL,PACKAGE,OTHER',  // GOODS=实物商品|DEVICE=设备|SERIVCE=服务|SPECIAL=专题业务|PACKAGE=套包|OTHER=其他
         'goods_status' => 'require|in:PENDING,ON,OFF,DISABLED',    // 产品状态 PENDING=待处理|ON=上架(已激活)|OFF=下架|DISABLED=已禁用
-        'goods_category' => 'require|max:32',
+        'goods_category' => 'max:32',
         'goods_prefix' => 'max:64 ',
         'goods_name' => 'require|max:32',
         'goods_market_price' => 'float',
         'goods_sales_price' => 'float',
-        'goods_sku_json' => 'isJson',
+//        'goods_sku_json' => 'isJson',
         'goods_attribute_json' => 'isJson',
         'goods_service_json' => 'isJson',
         'goods_title' => 'max:128',
@@ -78,7 +78,7 @@ class GoodsValidate extends Validate
         if (is_json($value)) {
             return true;
         }
-
+dump($value);
         return "数据格式错误";
     }
 }

+ 24 - 0
app/admin/validate/order/OrderExpressValidate.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\admin\validate\order;
+
+use think\Validate;
+
+class OrderExpressValidate extends Validate
+{
+    protected $rule = [
+        'order_id' => 'require|alphaDash',
+        'order_express_type' => 'require|in:自营物流,顺丰速递',
+        'order_express_code' => 'require|alphaDash',
+        'order_express_city' => 'require',
+        'order_express_address' => 'require',
+        'order_express_mobile' => 'require|mobile',
+        'order_express_telephone' => 'mobile',
+        'order_express_person' => 'require',
+    ];
+
+    protected $scene = [
+        'delivery' => ['order_id', 'order_express_type', 'order_express_code', 'order_express_city', 'order_express_address',
+            'order_express_mobile', 'order_express_telephone', 'order_express_person']
+    ];
+}

+ 54 - 0
app/admin/validate/sys_manage/TaskValidate.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace app\admin\validate\sys_manage;
+
+use think\Validate;
+
+class TaskValidate extends Validate
+{
+    protected $rule = [
+        'task_id' => 'require|integer',
+        'join_task_apply_user_id' => 'require|regex:/^[0-9a-zA-Z]+$/',
+        'join_task_assign_user_id' => 'regex:/^[0-9a-zA-Z]+$/',
+        'task_status' => 'require|in:INIT,PENDING,RESERVING,PROCESSING,DONE,CONFIRM',
+        'task_classify' => 'in:订单工单,工作工单,服务工单,维保工单',
+        'task_category' => 'in:安装,维修,其他',
+        'join_task_order_id' => 'regex:/^[0-9a-zA-Z]+$/',
+        'join_task_order_json' => 'isJson',
+        'join_task_appointment_id' => 'regex:/^[0-9a-zA-Z]+$/',
+        'join_task_appointment_json' => 'isJson',
+        'task_assign_datetimes' => 'date',
+        'task_accept_datetimes' => 'date',
+        'task_reserv_datetimes' => 'date',
+        'task_name' => 'require|max:64',
+        'task_config_json' => 'isJson',
+        'task_notify_json' => 'isJson',
+        'task_extend_json' => 'isJson',
+        'task_process_status' => 'in:NONE,START,PAUSE,COMPLETE'
+    ];
+
+    protected $scene = [
+        'update' => ['task_id', 'join_task_apply_user_id', 'join_task_assign_user_id', 'task_status', 'task_classify', 'task_category', 'join_task_order_id'
+            , 'join_task_order_json', 'join_task_appointment_id', 'join_task_appointment_json', 'task_assign_datetimes', 'task_accept_datetimes',
+            'task_reserv_datetimes', 'task_name', 'task_config_json', 'task_notify_json', 'task_extend_json'],
+        'info' => ['task_id'],
+        'process' => ['task_id', 'task_status', 'task_process_status']
+    ];
+
+    /**
+     * @Desc 验证json
+     * @Author Gorden
+     * @Date 2024/4/7 14:06
+     *
+     * @param $value
+     * @return bool
+     */
+    public function isJson($value)
+    {
+        if (is_json($value)) {
+            return true;
+        }
+
+        return false;
+    }
+}

+ 2 - 0
app/model/Asset.php

@@ -10,6 +10,8 @@ class Asset extends Model
 
     protected $primaryKey = 'asset_id';
 
+    protected $keyType = 'string';
+
     protected $dateFormat = 'U';
 
     const CREATED_AT = 'asset_addtimes';

+ 30 - 0
app/model/ClientMessage.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class ClientMessage extends Model
+{
+    protected $table = 'client_message';
+
+    protected $primaryKey = 'client_message_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'client_message_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_client_message_recv_member_id')
+            ->select('member_id', 'member_mobile');
+    }
+}

+ 17 - 0
app/model/MemberBenefit.php

@@ -2,6 +2,7 @@
 
 namespace app\model;
 
+use DateTimeInterface;
 use support\Model;
 
 class MemberBenefit extends Model
@@ -18,4 +19,20 @@ class MemberBenefit extends Model
     const CREATED_AT = 'member_benefit_addtimes';
 
     const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_benefit_member_id')
+            ->select('member_id', 'member_mobile');
+    }
+
+    public function goods(){
+        return $this->hasOne(Goods::class, 'goods_id','join_benefit_goods_id')
+            ->select('goods_id','goods_cover','goods_name');
+    }
 }

+ 6 - 0
app/model/MemberDevice.php

@@ -2,6 +2,7 @@
 
 namespace app\model;
 
+use DateTimeInterface;
 use support\Model;
 
 class MemberDevice extends Model
@@ -17,4 +18,9 @@ class MemberDevice extends Model
     const CREATED_AT = 'member_device_addtimes';
 
     const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
 }

+ 24 - 0
app/model/OrderExpress.php

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

+ 8 - 3
app/model/SysConfig.php

@@ -2,6 +2,7 @@
 
 namespace app\model;
 
+use DateTimeInterface;
 use support\Model;
 
 class SysConfig extends Model
@@ -10,10 +11,14 @@ class SysConfig extends Model
 
     public $primaryKey = 'config_id';
 
-    public const UPDATED_AT = null;
+    protected $dateFormat = 'U';
 
-    public function getConfigAddtimesAttribute($value)
+    const CREATED_AT = 'config_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
     {
-        return date('Y-m-d H:i:s', $value);
+        return $date->format('Y-m-d H:i:s');
     }
 }

+ 72 - 0
app/model/Task.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class Task extends Model
+{
+    protected $table = 'task';
+
+    protected $primaryKey = 'task_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'task_addtimes';
+
+    const UPDATED_AT = null;
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 申请人
+     * @Author Gorden
+     * @Date 2024/4/7 15:24
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_task_apply_user_id');
+    }
+
+    /**
+     * @Desc 受理人
+     * @Author Gorden
+     * @Date 2024/4/7 15:24
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function user()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'join_task_assign_user_id');
+    }
+
+    /**
+     * @Desc 关联订单
+     * @Author Gorden
+     * @Date 2024/4/7 16:02
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function order()
+    {
+        return $this->hasOne(Order::class, 'order_id', 'join_task_order_id');
+    }
+
+    /**
+     * @Desc 关联预约
+     * @Author Gorden
+     * @Date 2024/4/7 16:03
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function appointment()
+    {
+        return $this->hasOne(Appointment::class, 'appointment_id', 'join_task_appointment_id');
+    }
+}

+ 37 - 0
app/model/TaskProcess.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class TaskProcess extends Model
+{
+    protected $table = 'task_process';
+
+    protected $primaryKey = 'task_process_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'task_process_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 管理管理员
+     * @Author Gorden
+     * @Date 2024/4/8 11:23
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function user()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'join_task_process_user_id')
+            ->select('user_id','user_name','user_login_name');
+    }
+}

+ 60 - 0
route/admin.php

@@ -133,6 +133,13 @@ Route::group('/admin', function () {
             Route::post('/update/{id:\d+}', [\app\admin\controller\sys_manage\ConfigController::class, 'updateConfig']);
             Route::post('/updateStatus/{id:\d+}', [\app\admin\controller\sys_manage\ConfigController::class, 'updateStatus']);
             Route::delete('/delete', [\app\admin\controller\sys_manage\ConfigController::class, 'delConfig']);
+
+            // 底部菜单
+            Route::get('/bottomMenuList', [\app\admin\controller\sys_manage\ConfigController::class, 'bottomMenuList']);
+            Route::post('/bottomMenuSave', [\app\admin\controller\sys_manage\ConfigController::class, 'bottomMenuSave']);
+            // 导航菜单
+            Route::get('/navMenuList', [\app\admin\controller\sys_manage\ConfigController::class, 'navMenuList']);
+            Route::post('/navMenuSave', [\app\admin\controller\sys_manage\ConfigController::class, 'navMenuSave']);
         });
         /* 运费模板管理 */
         Route::group('/postageTemplate', function () {
@@ -199,6 +206,17 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        /* 工单管理 */
+        Route::group('/task', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\TaskController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\sys_manage\TaskController::class, 'info']);
+            Route::post('/update', [\app\admin\controller\sys_manage\TaskController::class, 'update']);
+            Route::post('/process', [\app\admin\controller\sys_manage\TaskController::class, 'process']);
+            Route::get('/processLog', [\app\admin\controller\sys_manage\TaskController::class, 'processLog']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\TaskController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
 
     /* 业务支撑 */
@@ -455,6 +473,15 @@ Route::group('/admin', function () {
             Route::get('/list', [\app\admin\controller\member\OwnerController::class, 'list']);
             Route::post('/add', [\app\admin\controller\member\OwnerController::class, 'add']);
         });
+        /* 核销管理 */
+        Route::group('/benefit', function () {
+            Route::get('/list', [\app\admin\controller\member\BenefitController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\member\BenefitController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\member\BenefitController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\member\BenefitController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
         /* 档案管理 */
         Route::group('/wellnessRecord', function () {
             Route::get('/my/{id:[0-9a-zA-Z]+}', [\app\admin\controller\member\WellnessRecordController::class, 'my']);
@@ -484,6 +511,15 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        /* 设备管理 */
+        Route::group('/device', function () {
+            Route::get('/{id:[0-9a-zA-Z]+}', [\app\admin\controller\member\MemberController::class, 'device']);
+            Route::post('/add', [\app\admin\controller\member\MemberController::class, 'addDevice']);
+            Route::post('/update', [\app\admin\controller\member\MemberController::class, 'updateDevice']);
+//            Route::delete('/delete', [\app\admin\controller\member\MemberController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
     /* 营销管理 */
     Route::group('/marketing', function () {
@@ -531,6 +567,7 @@ Route::group('/admin', function () {
         ]);
         Route::group('', function () {
             Route::get('/list', [\app\admin\controller\device\DeviceController::class, 'select']);
+            Route::get('/select', [\app\admin\controller\device\DeviceController::class, 'selectList']);
             Route::post('/add', [\app\admin\controller\device\DeviceController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\device\DeviceController::class, 'update']);
             Route::delete('/delete', [\app\admin\controller\device\DeviceController::class, 'delete']);
@@ -555,6 +592,7 @@ Route::group('/admin', function () {
         Route::group('/whole', function () {
             Route::get('/list', [\app\admin\controller\order\WholeController::class, 'select']);
             Route::get('/sheet', [\app\admin\controller\order\WholeController::class, 'sheet']);
+            Route::get('/update', [\app\admin\controller\order\WholeController::class, 'update']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
@@ -612,5 +650,27 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        /* 消息管理 */
+        Route::group('/message', function () {
+            Route::group('', function () {
+                Route::get('/list', [\app\admin\controller\client\MessageController::class, 'select']);
+                Route::post('/add', [\app\admin\controller\client\MessageController::class, 'insert']);
+                Route::post('/update', [\app\admin\controller\client\MessageController::class, 'update']);
+                Route::delete('/delete', [\app\admin\controller\client\MessageController::class, 'delete']);
+            })->middleware([
+                \app\middleware\AdminAuthCheck::class
+            ]);
+        });
+        /* APP参数管理 */
+        Route::group('/appParams', function () {
+            Route::group('', function () {
+                Route::get('/list', [\app\admin\controller\client\AppParamsController::class, 'select']);
+                Route::post('/add', [\app\admin\controller\client\AppParamsController::class, 'insert']);
+                Route::post('/update', [\app\admin\controller\client\AppParamsController::class, 'update']);
+                Route::delete('/delete', [\app\admin\controller\client\AppParamsController::class, 'delete']);
+            })->middleware([
+                \app\middleware\AdminAuthCheck::class
+            ]);
+        });
     });
 });

+ 4 - 1
support/helpers.php

@@ -557,6 +557,7 @@ function input(string $param = null, $default = null)
 function random_string($length, $type = 'all')
 {
     $string = 'abcdefghijklmnopqrstuvwxyz';
+    $stringUp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     $number = '0123456789';
 
     switch ($type) {
@@ -566,6 +567,8 @@ function random_string($length, $type = 'all')
         case 'string':
             $result = $string;
             break;
+        case 'up':
+            $result = $stringUp;
         case 'number':
             $result = $number;
             break;
@@ -637,6 +640,6 @@ function _syslog($name, $operation, $operationData = false, $requestParams = fal
     $model->log_operation = $operation;
     $model->log_ip = \request()->getRealIp();
     $model->log_request_params = $requestParams ? json_encode($requestParams) : json_encode(\request()->all());
-    $model->log_operation_data = $operationData ? json_encode($operationData) : '{}';
+    $model->log_operation_data = $operationData ? json_encode($operationData) : null;
     $model->save();
 }