From 9c19cca671065bd11c6fa752f43c94197bf9be23 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Tue, 12 Aug 2025 13:53:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=BB=84=E5=91=98=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/controller/UserController.php | 49 ++++++++++++++++ app/common/logic/UserLogic.php | 8 +++ app/common/model/User.php | 4 +- app/common/service/UserService.php | 68 +++++++++++++++++++++++ app/crm/controller/CustomerController.php | 45 +++++++++++++++ config/route.php | 3 + 6 files changed, 176 insertions(+), 1 deletion(-) diff --git a/app/common/controller/UserController.php b/app/common/controller/UserController.php index d725166..bf14859 100644 --- a/app/common/controller/UserController.php +++ b/app/common/controller/UserController.php @@ -2,12 +2,61 @@ namespace app\common\controller; +use app\common\traits\crud\CrudControllerTrait; use support\Request; use app\common\service\UserService; class UserController extends BaseController { + use CrudControllerTrait; + + protected $service; + + public function __construct() + { + $this->service = new UserService(); + } + + /** + * 获取组员列表 + * + * @param Request $request 请求对象 + * @return mixed 返回分页数据及总数 + */ + public function team(Request $request) + { + try { + $raw = $this->service->serviceTeam($request); + $data = $this->transformData($raw, method_exists($this, 'indexFormat') + ? [$this, 'indexFormat'] + : null); + return $this->success($data); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + + /** + * 标记组员离职 + * + * @param Request $request 请求对象 + * @return mixed 返回分页数据及总数 + */ + public function resignMember(Request $request) + { + try { + $userId = $request->post('user_id'); + if(empty($userId)){ + return $this->error('组员id不能为空'); + } + $user = $this->service->resignMember($request); + return $this->success($user, '获取用户信息'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + /** * 用户信息 */ diff --git a/app/common/logic/UserLogic.php b/app/common/logic/UserLogic.php index 9f5ae44..c7d5343 100644 --- a/app/common/logic/UserLogic.php +++ b/app/common/logic/UserLogic.php @@ -3,10 +3,18 @@ namespace app\common\logic; use app\common\model\User; +use app\common\traits\crud\CrudLogicTrait; use support\exception\BusinessException; class UserLogic { + use CrudLogicTrait; + + /** + * 指定当前要操作的模型 + */ + protected string $modelClass = User::class; + /** * 用户信息 */ diff --git a/app/common/model/User.php b/app/common/model/User.php index 446ed46..88c670d 100644 --- a/app/common/model/User.php +++ b/app/common/model/User.php @@ -15,7 +15,8 @@ use support\Model; * @property string $email 邮箱 * @property integer $status 状态 * @property string $system_code 系统码 - * @property string $created_at + * @property string $report_to 上级用户ID + * @property string $created_at * @property string $updated_at */ class User extends Model @@ -69,6 +70,7 @@ class User extends Model 'position', 'socialize', 'socialize_pic', + 'report_to', ]; // 用户所有角色 diff --git a/app/common/service/UserService.php b/app/common/service/UserService.php index 1d5dab4..bfcf345 100644 --- a/app/common/service/UserService.php +++ b/app/common/service/UserService.php @@ -5,12 +5,21 @@ namespace app\common\service; use app\common\logic\UserLogic; use app\common\model\Corp; use app\common\model\User; +use app\common\traits\crud\CrudLogicTrait; +use app\common\traits\crud\CrudServiceTrait; use app\common\utils\CrudUtil; use app\crm\model\Country; use support\exception\BusinessException; +use support\Request; class UserService { + use CrudServiceTrait; + + /** + * 指定当前要操作的模型 + */ + protected string $modelClass = User::class; protected $logic; @@ -110,4 +119,63 @@ class UserService { return $this->logic->getList(); } + + /** 分页列表 */ + public function serviceTeam(Request $request) + { + if (method_exists($this, 'complexQuery')) { + $result = $this->complexQuery($request->get()); + } else { + $config = $this->buildQueryConfig($request, 'team'); + $limit = (int)$request->get('size', 15); + $page = (int)$request->get('current', 1); + $result = $this->logicList($config, $limit, $page); + } + return $this->postProcess('List', $result); + } + + /** 分页列表 */ + public function resignMember(Request $request) + { + $uid = $request->user->uid; + $userId = $request->post('user_id'); + $user = User::find($userId); + if ($user->report_to != $uid) { + throw new BusinessException('禁止操作非组员'); + } + + $data = [ + 'status' => 2, + ]; + $user = $this->logic->edit($userId,$data); + $user = $user->toArray(); + unset($user['password']); + unset($user['open_id']); + unset($user['tenant_key']); + unset($user['union_id']); + return $user; + } + + /** + * 构造 CrudUtil 查询配置 + */ + protected function buildQueryConfig(Request $request, string $scene = 'default'): array + { + $p = $request->all(); + + $config = []; + $config['model'] = $this->modelClass; + switch ($scene) { + case 'team': +// $config['where']['status'] = 1; // 关键字 + $config['order']['id'] = 'desc'; + + $config['dataLimit']['type'] = 'relation'; + $config['dataLimit']['userId'] = $request->user->uid; + $config['dataLimit']['userField'] = 'report_to'; + break; + } + + return $config; + } } \ No newline at end of file diff --git a/app/crm/controller/CustomerController.php b/app/crm/controller/CustomerController.php index d1e7cdb..8b141a2 100644 --- a/app/crm/controller/CustomerController.php +++ b/app/crm/controller/CustomerController.php @@ -526,6 +526,51 @@ class CustomerController extends BaseController } } + /** + * 客户转移至公海 + * @param Request $request + * @return \support\Response + */ + public function putSeas(Request $request) + { + $customerId = Util::getParam($request, 'customer_id'); + $userId = $request->user->uid; + if (Util::isEmpty($customerId)) { + return $this->error(trans('customer_id').trans('not_null')); + } + + try { + Db::beginTransaction(); + $customer= Customer::withTrashed()->where('user_id',$userId)->find($customerId); + + if(empty($customer)){ + return $this->error( 'customer_id错误'); + } + $data = [ + 'user_id' => 0, + ]; + + $res = $customer->update($data); + + //记录客户关系变化 + $his = CustomerHis::create([ + 'customer_id' => $customerId, + 'user_his' => $userId, + 'user_id' => 0, + ]); + Db::commit(); + } catch (\Throwable $e) { + Db::rollback(); + return $this->error($e->getMessage()); + } + + if ($res) { + return $this->success($res, trans('success')); + } else { + return $this->error(trans('fail')); + } + } + /** diff --git a/config/route.php b/config/route.php index 0c928eb..44bbe64 100644 --- a/config/route.php +++ b/config/route.php @@ -52,6 +52,8 @@ Route::group('/common', function () { Route::group('/user', function () { Route::any('/info', [app\common\controller\UserController::class, 'info']); Route::any('/get', [app\common\controller\UserController::class, 'getUser']); + Route::any('/team', [app\common\controller\UserController::class, 'team']); + Route::any('/resign', [app\common\controller\UserController::class, 'resignMember']); }); Route::group('/preset', function () { @@ -170,6 +172,7 @@ Route::group('/crm', function () { Route::any('/customer/getCountry', [app\crm\controller\CustomerController::class, 'getCountry']); Route::any('/customer/followNext', [app\crm\controller\CustomerController::class, 'followNext']); Route::any('/customer/report', [app\crm\controller\CustomerController::class, 'report']); + Route::any('/customer/seas', [app\crm\controller\CustomerController::class, 'putSeas']); Route::any('/tagGroup/list', [app\crm\controller\TagGroupController::class, 'list']); Route::any('/tagGroup/updatePivot', [app\crm\controller\TagGroupController::class, 'updatePivot']); From 67861532ec2e193caf5aea03d200511490d1a027 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Wed, 13 Aug 2025 09:16:02 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=85=AC=E6=B5=B7?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E8=AF=A6=E6=83=85=E8=B7=9F=E8=BF=9B?= =?UTF-8?q?=E3=80=81=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/UserController.php | 37 +++++++++++++ app/admin/service/UserService.php | 29 +++++++++- app/common/validate/UserValidate.php | 3 +- app/crm/controller/CustomerController.php | 13 +++-- app/crm/service/CustomerService.php | 5 ++ .../controller/CustomerController.php | 53 +++++++++++++++++++ app/crmAdmin/logic/CustomerLogic.php | 8 ++- app/crmAdmin/service/CustomerService.php | 53 ++++++++++++++++++- app/queue/redis/InquiryToCrm.php | 1 + config/route.php | 3 ++ 10 files changed, 198 insertions(+), 7 deletions(-) diff --git a/app/admin/controller/UserController.php b/app/admin/controller/UserController.php index dfcebd7..3975aa3 100644 --- a/app/admin/controller/UserController.php +++ b/app/admin/controller/UserController.php @@ -6,6 +6,7 @@ use app\common\model\Corp; use app\common\traits\crud\CrudControllerTrait; use app\admin\service\UserService; use app\crm\model\Customer; +use support\Request; class UserController extends BaseController { @@ -18,6 +19,42 @@ class UserController extends BaseController $this->service = new UserService(); } + + /** + * 修改密码 + * @param Request $request + * @return \support\Response + * @throws \Random\RandomException + */ + public function savePassword(Request $request) + { + try { + $data = $this->validate($this->service->getValidator(), $request->post(), 'password'); + $data = $request->all(); + $result = $this->service->savePassword($request,$data);; + return $this->success($result, '编辑成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + + /** + * 更新 + * + * @param Request $request 请求对象 + * @return mixed 返回更新成功的数据或信息 + */ + public function edit(Request $request) + { + try { + $data = $this->validate($this->service->getValidator(), $request->post(), 'update'); + $res = $this->service->serviceUpdate($request, $data); + return $this->success([], '更新成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + /** * 列表页数据格式化 * diff --git a/app/admin/service/UserService.php b/app/admin/service/UserService.php index f2e07fd..adbfd95 100644 --- a/app/admin/service/UserService.php +++ b/app/admin/service/UserService.php @@ -2,9 +2,11 @@ namespace app\admin\service; -use app\admin\validate\UserValidate; +use app\admin\logic\UserLogic; use app\common\traits\crud\CrudServiceTrait; use app\common\model\User; +use app\common\validate\UserValidate; +use support\exception\BusinessException; use support\Request; class UserService @@ -30,6 +32,14 @@ class UserService return new $this->validator; } + /** 更新 */ + public function serviceUpdate(Request $request, array $data = []) + { + $data = $this->preProcess('Update', $data, $request); + $config = $this->buildQueryConfig($request, 'edit'); + $updated = $this->logicUpdateBy($config, $data); + return $this->postProcess('Update', $data); + } /** * 构造 CrudUtil 查询配置 @@ -74,8 +84,25 @@ class UserService case 'destroy': $config['where']['id'] = $p['id']; break; + case 'savePassword': + $config['where']['id'] = $p['id']; + break; + case 'edit': + $config['where']['id'] = $request->user->uid; + break; } return $config; } + + /** + * 修改用户密码 + */ + public function savePassword(Request $request, array $data) + { + $config = $this->buildQueryConfig($request, 'savePassword'); + $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT); + $user = $this->logicUpdateBy($config,$data); + return $user; + } } \ No newline at end of file diff --git a/app/common/validate/UserValidate.php b/app/common/validate/UserValidate.php index 7db260d..6330cb5 100644 --- a/app/common/validate/UserValidate.php +++ b/app/common/validate/UserValidate.php @@ -55,7 +55,8 @@ class UserValidate extends Validate 'feishu_register' => ['feishu_code'], 'upwd_login' => ['account' => 'require|checkAccount', 'password'], 'feishu_auth' => ['corp_abbr', 'system_code', 'login_type'], - 'feishu_login' => ['feishu_code'] + 'feishu_login' => ['feishu_code'], + 'password' => ['password'], ]; /** diff --git a/app/crm/controller/CustomerController.php b/app/crm/controller/CustomerController.php index 8b141a2..48744e4 100644 --- a/app/crm/controller/CustomerController.php +++ b/app/crm/controller/CustomerController.php @@ -325,6 +325,7 @@ class CustomerController extends BaseController 'lng' => Util::getParam($request, 'lng', 0), 'address' => Util::getParam($request, 'address', ''), 'sex' => Util::getParam($request, 'sex', 0), + 'obtain' => time(), ]; if (Util::isEmpty($id)) { @@ -485,10 +486,10 @@ class CustomerController extends BaseController return $this->error(trans('customer_id').trans('not_null')); } $data = [ - 'user_id' => $request->user->uid + 'user_id' => $request->user->uid, + 'obtain' => time(), ]; - try { Db::beginTransaction(); $customer= Customer::withTrashed()->find($customerId); @@ -592,6 +593,7 @@ class CustomerController extends BaseController try { $customer = $query->get(); + Db::beginTransaction(); foreach ($customer as $item) { //记录客户关系变化 $his = CustomerHis::create([ @@ -607,7 +609,12 @@ class CustomerController extends BaseController } } } - $res = $query->update(['user_id' => $user->id]); + + $data = [ + 'user_id' => $user->id, + 'obtain' => time(), + ]; + $res = $query->update($data); Db::commit(); } catch (\Throwable $e) { diff --git a/app/crm/service/CustomerService.php b/app/crm/service/CustomerService.php index 8621636..c41aace 100644 --- a/app/crm/service/CustomerService.php +++ b/app/crm/service/CustomerService.php @@ -162,6 +162,11 @@ class CustomerService return $config; } + /** + * 无用线索举报 + * @param $params + * @return false + */ public function report($params) { $id = $params['id']; diff --git a/app/crmAdmin/controller/CustomerController.php b/app/crmAdmin/controller/CustomerController.php index 153941a..a3dc0e2 100644 --- a/app/crmAdmin/controller/CustomerController.php +++ b/app/crmAdmin/controller/CustomerController.php @@ -3,6 +3,7 @@ namespace app\crmAdmin\controller; use app\common\model\Corp; +use app\crm\model\Customer; use app\crmAdmin\service\CustomerService; use support\Request; @@ -133,6 +134,37 @@ class CustomerController extends BaseController } } + /** + * 移除 + * @param Request $request + * @return \support\Response + */ + public function delete(Request $request) + { + try { + $param = $request->all(); + if (empty($param['customer_id'])) { + return $this->error('customer_id'.trans('not_null')); + } + + $where = [ + 'id' => $param['customer_id'], + ]; + $customer = Customer::where($where)->withTrashed()->first(); + if(empty($customer)){ + return $this->error( trans('fail')); + } + //软删除 + $customer->status = 3; + $res = $customer->save(); + $customer->delete(); + + return $this->success($res); + } catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + } + /** * 客户详情 * @param Request $request @@ -154,4 +186,25 @@ class CustomerController extends BaseController } } + /** + * 客户详情 + * @param Request $request + * @return \support\Response + */ + public function follow(Request $request) + { + try { + $param = $request->all(); + if (empty($param['id'])) { + return $this->error('id'.trans('not_null')); + } + + $result = (new CustomerService())->follow($param); + + return $this->success($result); + } catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + } + } \ No newline at end of file diff --git a/app/crmAdmin/logic/CustomerLogic.php b/app/crmAdmin/logic/CustomerLogic.php index 869982f..83ba426 100644 --- a/app/crmAdmin/logic/CustomerLogic.php +++ b/app/crmAdmin/logic/CustomerLogic.php @@ -13,6 +13,10 @@ class CustomerLogic $customer->status = $status; $res = $customer->save(); + if($status == 1){ + $customer->restore(); + } + return $res; } @@ -20,7 +24,9 @@ class CustomerLogic { $customer = Customer::withTrashed()->find($id); //强制删除 - $res = $customer->forceDelete(); +// $res = $customer->forceDelete(); + $customer->status = 3; + $res = $customer->save(); return $res; } } \ No newline at end of file diff --git a/app/crmAdmin/service/CustomerService.php b/app/crmAdmin/service/CustomerService.php index 5f08943..041a514 100644 --- a/app/crmAdmin/service/CustomerService.php +++ b/app/crmAdmin/service/CustomerService.php @@ -4,6 +4,7 @@ namespace app\crmAdmin\service; use app\common\model\InquiryLog; use app\common\model\User; +use app\common\service\OssService; use app\crm\model\CustomerHis; use app\crmAdmin\logic\CustomerLogic; use app\crm\model\CarType; @@ -315,7 +316,42 @@ class CustomerService } } } - $res = $query->update(['user_id' => $userId]); + $data = [ + 'user_id' => $userId, + 'obtain' => time(), + ]; + $res = $query->update($data); + + Db::commit(); + return $res; + } catch (\Throwable $e) { + Db::rollback(); + throw $e; + } + } + + /** + * @param $params + * @return bool + */ + public function delete($params) + { + try { + Db::beginTransaction(); + $customerId = $params['customer_id']; + + $query= Customer::whereIn('id',explode(',',$customerId)); + $customer = $query->get(); + + foreach ($customer as $item) { + //记录客户关系变化 + $his = CustomerHis::create([ + 'customer_id' => $item->id, + 'user_his' => $item->user_id, + 'user_id' => 0, + ]); + } + $res = $query->update(['user_id' => 0]); Db::commit(); return $res; @@ -394,4 +430,19 @@ class CustomerService return $customer; } + + public function follow($params) + { + $id = $params['id']; + $follow = Follow:: + where('customer_id', $id) + ->first(); + + $ossservice = new OssService(); + foreach ($follow as $item) { + $item['picture_full'] = $item->picture??$ossservice->generatePrivateUrl($item->picture); + } + + return $follow; + } } \ No newline at end of file diff --git a/app/queue/redis/InquiryToCrm.php b/app/queue/redis/InquiryToCrm.php index 8e1ae51..7bec9ca 100644 --- a/app/queue/redis/InquiryToCrm.php +++ b/app/queue/redis/InquiryToCrm.php @@ -60,6 +60,7 @@ class InquiryToCrm implements Consumer $crmCustomer->contacts = $info->contacts; $crmCustomer->desc_collect = $info->content; $crmCustomer->enter_user_id = $info->enter_user_id; + $crmCustomer->obtain = time(); // 修改同步CRM状态 $info->sync_crm = 1; // 保存 diff --git a/config/route.php b/config/route.php index 44bbe64..e86a342 100644 --- a/config/route.php +++ b/config/route.php @@ -79,6 +79,7 @@ Route::group('/admin', function () { Route::any('/list', [app\admin\controller\UserController::class, 'index']); Route::any('/show', [app\admin\controller\UserController::class, 'show']); Route::any('/update', [app\admin\controller\UserController::class, 'update']); + Route::any('/update/password', [app\admin\controller\UserController::class, 'savePassword']); }); // 公司 @@ -119,6 +120,8 @@ Route::group('/admin', function () { Route::any('/audit', [app\crmAdmin\controller\CustomerController::class, 'audit']); Route::any('/transfer', [app\crmAdmin\controller\CustomerController::class, 'transfer']); Route::any('/detail', [app\crmAdmin\controller\CustomerController::class, 'detail']); + Route::any('/delete', [app\crmAdmin\controller\CustomerController::class, 'delete']); + Route::any('/follow', [app\crmAdmin\controller\CustomerController::class, 'follow']); }); }); });