From 2b728186c745b598e8ccb9dcc37360eed49375f6 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Thu, 30 Oct 2025 18:58:21 +0800
Subject: [PATCH] 完成名片列表功能 完成名片筛选功能 完成查看名片详情 完成购买名片查看联系方式

---
 admin/app/api/controller/plus/business/Business.php |  428 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 427 insertions(+), 1 deletions(-)

diff --git a/admin/app/api/controller/plus/business/Business.php b/admin/app/api/controller/plus/business/Business.php
index 31a57cc..e60799f 100644
--- a/admin/app/api/controller/plus/business/Business.php
+++ b/admin/app/api/controller/plus/business/Business.php
@@ -3,6 +3,10 @@
 
 use app\api\controller\Controller;
 use app\api\model\plus\business\Business as BusinessModel;
+use app\api\model\plus\business\Saving as SavingModel;
+use app\api\model\plus\business\Grade as GradeModel;
+use app\common\service\business\Poster;
+use app\api\model\plus\business\Order as OrderModel;
 
 class Business extends Controller
 {
@@ -12,6 +16,428 @@
     public function getList()
     {
         $model = new BusinessModel();
-        return $this->renderSuccess('',$model->getLists());
+        $params=$this->request->param();
+        $user = $this->getUser();
+        $currentUserId = $user ? $user['user_id'] : 0;
+        if(!empty($params['user_id'])&&$params['user_id']=='undefined'){
+           $params['user_id']=$currentUserId;
+        }
+        $list=$model->getList($params);
+        $user = $this->getUser();
+        $currentUserId = $user ? $user['user_id'] : 0;
+        $orderModel = new OrderModel();
+        
+        foreach ($list as $key => &$value) {
+            // 标记是否已购买
+            $hasPurchased = $orderModel->checkCardPurchase($currentUserId, $value['business_card_id']);
+            $list[$key]['has_purchased'] = $hasPurchased;
+            $needDesensitization = $this->needDesensitizeCard($value, $currentUserId);
+            $posterType = $needDesensitization ? 'desensitization' : 'business';
+            $Qrcode = new Poster($value, $posterType);
+            $value['mp'] = $Qrcode->getImage();
+            $value['posterType'] = $posterType;
+            // 使用封装的方法判断是否需要脱敏
+            if ($needDesensitization) {
+                $list[$key] = $this->desensitizeBusinessData($value);
+            }
+        }
+        
+        return $this->renderSuccess('',$list);
+    }
+    
+    public function mpgl()
+    {
+        $user = $this->getUser();
+        $param['type'] = 20;
+        $param['user_id'] = $user['user_id'];
+        $saving = (new SavingModel())->order('create_time')->distinct(true)->field('business_card_id')->where($param)->select();
+        $business = [];
+        foreach ($saving as $v) {
+            $business = $v['business_card_id'];
+        }
+        $param = request()->param();
+        $paramr = array_merge(['listRow' => 15], $param);
+        $where = [];
+        !empty($paramr['name']) && $where['name'] = ['like', '%' . $paramr['name'] . '%'];
+        !empty($paramr['search']) && $where['name|duties|unit'] = ['like', '%' . $paramr['search'] . '%'];
+        !empty($paramr['user_id']) && $where['user_id'] = $paramr['user_id'];
+        !empty($paramr['search']) && $w['name|duties|unit'] = $where['name|duties|unit'];
+        $w['business_card_id'] = ['in', $business];
+        $model = new BusinessModel();
+        $order=['create_time' => 'desc'];
+        if (!empty($paramr['sort'])) {
+            if ($paramr['sort'] == 'name') {
+                $order['name' ] = "asc";
+            } else if ($paramr['sort'] == 'time') {
+                $order['create_time'] ="asc";
+            } else {
+                $order['unit'] = "asc";
+            }
+        }
+        $data = $model->order($order)->with(['user', 'image', 'logoImage'])->where($where)->whereOr($w)->paginate($paramr['listRow'], false, ['query' => request()->query()]);
+        return $this->renderSuccess('',$data);
+    }
+
+    /**
+     * 列表
+     * @return array
+     * @throws \think\exception\DbException
+     */
+    public function lists()
+    {
+        $param = request()->param();
+        return $this->renderSuccess('',(new BusinessModel())->getList($param));
+    }
+
+    /**
+     * 获取指定名片
+     * @return array
+     * @throws \app\common\exception\BaseException
+     * @throws \think\exception\DbException
+     */
+    public function getImage()
+    {
+        $param = request()->param();
+        $dealer = (new BusinessModel())->get($param['business_card_id'], ['image', 'logoImage']);
+        $image = '';
+        if ($dealer) {
+            $Qrcode = new Poster($dealer);
+            $image = $Qrcode->getImage();
+        }
+        return $this->renderSuccess('',$image);
+    }
+
+    public function add()
+    {
+        $user = $this->getUser();
+        $param = request()->param();
+        $param['user_id'] = $user['user_id'];
+        $param['unit'] = json_encode($param['unit'], JSON_UNESCAPED_UNICODE);
+        $param['duties'] = json_encode($param['duties'], JSON_UNESCAPED_UNICODE);
+
+        !empty($param['position'])?$param['position'] = json_encode($param['position'], JSON_UNESCAPED_UNICODE):'';
+        $param['position'] = $param['duties'];
+        $param['address'] = json_encode($param['address'], JSON_UNESCAPED_UNICODE);
+        if(!(new BusinessModel())->where(['user_id'=>$user['user_id'],'is_default'=>1])->find()){
+            $param['is_default'] = 1;
+        }
+        if ((new BusinessModel())->add($param)) {
+            return $this->renderSuccess('添加成功');
+        }
+        return $this->renderError('添加失败');
+    }
+
+    /**
+     * 名片详情
+     * @param $business_card_id
+     * @return array|\think\response\Json
+     * @throws \app\common\exception\BaseException
+     * @throws \think\exception\DbException
+     */
+    public function detail($business_card_id)
+    {
+        $data = (new BusinessModel())::detail($business_card_id);
+        if ($data) {
+            // 获取当前用户信息
+            $currentUser = $this->getUser();
+            $currentUserId = $currentUser ? $currentUser['user_id'] : 0;
+
+            // 使用封装的方法判断是否需要脱敏
+            $needDesensitization = $this->needDesensitizeCard($data, $currentUserId);
+
+            // 生成海报图
+            $posterType = $needDesensitization ? 'desensitization' : 'business';
+            $Qrcode = new Poster($data, $posterType);
+            $data['mp'] = $Qrcode->getImage();
+            $imageInfo = getimagesize($data['mp']);
+            $data['posterType'] = $posterType;
+
+            // 如果需要脱敏,对返回数据也进行脱敏处理
+            if ($needDesensitization) {
+                $data = $this->desensitizeBusinessData($data);
+            }
+        }
+        return $this->renderSuccess('',$data);
+    }
+
+    /**
+     * 获取默认名片
+     * @param $user_id
+     * @return array
+     * @throws \app\common\exception\BaseException
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function getDetail($user_id)
+    {
+        $model = new BusinessModel();
+        $data = $model->getDefault($user_id);
+        if(!$data){
+            if($model->get(['user_id' => $user_id])){
+                $data = $model->order('create_time', 'desc')->where(['user_id' => $user_id])->find();
+                $model->editDefault($data['business_card_id']);
+                $data = $model->getDefault($user_id);
+            }
+        }
+        
+        if ($data) {
+            // 获取当前用户信息
+            $currentUser = $this->getUser();
+            $currentUserId = $currentUser ? $currentUser['user_id'] : 0;
+            
+            // 使用封装的方法判断是否需要脱敏
+            $needDesensitization = $this->needDesensitizeCard($data, $currentUserId);
+            
+            // 生成海报图
+            $posterType = $needDesensitization ? 'desensitization' : 'business';
+            $Qrcode = new Poster($data, $posterType);
+            $data['mp'] = $Qrcode->getImage();
+            $imageInfo = getimagesize($data['mp']);
+            $data['height'] = (355/$imageInfo[0])*$imageInfo[1];
+            
+            // 如果需要脱敏,对返回数据也进行脱敏处理
+            if ($needDesensitization) {
+                $data = $this->desensitizeBusinessData($data);
+            }
+        }
+        return $this->renderSuccess('',$data);
+    }
+    
+    
+
+    /**
+     * 设置默认名片
+     * @param $business_card_id
+     * @return array
+     * @throws \think\exception\DbException
+     */
+    public function editDefault($business_card_id)
+    {
+        if ((new BusinessModel())->editDefault($business_card_id)) {
+            return $this->renderSuccess('切换成功');
+        }
+        return $this->renderError('切换失败');
+    }
+
+    /**
+     * 获取数量
+     * @return array
+     * @throws \app\common\exception\BaseException
+     * @throws \think\Exception
+     * @throws \think\exception\DbException
+     */
+    public function getStatistics()
+    {
+        $user = $this->getUser();
+        //我看过的
+        $lists['browseUser'] = (new SavingModel)->getQuantity(['type'=>10,'user_id'=>$user['user_id']]);
+        //我的访客
+        $lists['browse'] = (new SavingModel)->getQuantity(['type'=>10,'affiliation_id'=>$user['user_id']]);
+        //我收下的
+        $lists['accept'] = (new SavingModel)->getQuantity(['type'=>20,'user_id'=>$user['user_id']]);
+        //我的名片
+        $lists['card'] = (new BusinessModel())->getQuantity($user['user_id']);
+        //今日访问量
+        $lists['today'] = (new SavingModel)->getQuantity(['type'=>10,'affiliation_id'=>$user['user_id'],'today'=>1]);
+        return $this->renderSuccess('',$lists);
+    }
+
+    public function edit()
+    {
+        $param = request()->param();
+        $model = (new BusinessModel())->where('business_card_id', $param['business_card_id'])->find();
+        if($model){
+            $Qrcode = new Poster($model);
+            $image = $Qrcode->getPosterPath('business');
+            //删除图片
+            if (file_exists($image)) {
+                unlink($image);
+            }
+            $image = $Qrcode->getPosterPath('desensitization');
+            //删除图片
+            if (file_exists($image)) {
+                unlink($image);
+            }
+        }else{
+            $model = new BusinessModel();
+            $user = $this->getUser();
+            $param['user_id'] = $user['user_id'];
+        }
+
+        $param['unit'] = json_encode($param['unit'], JSON_UNESCAPED_UNICODE);
+        $param['duties'] = json_encode($param['duties'], JSON_UNESCAPED_UNICODE);
+        $param['address'] = json_encode($param['address'], JSON_UNESCAPED_UNICODE);
+        !empty($param['position'])?$param['position'] = json_encode($param['position'], JSON_UNESCAPED_UNICODE):'';
+        $param['position'] = $param['duties'];
+        if ($model->add($param)) {
+            return $this->renderSuccess('编辑成功');
+        }
+        return $this->renderError('编辑失败');
+    }
+
+    /**
+     * 删除名片
+     * @return array
+     * @throws \think\exception\DbException
+     */
+    public function delete()
+    {
+        $param = request()->param();
+        if((new BusinessModel())->get(['business_card_id'=>$param['business_card_id'],'is_default'=>1])){
+            return $this->renderError('当前名片为默认名片,无法删除,可切换默认名片后进行删除');
+        }
+        $model = (new BusinessModel())->where('business_card_id', $param['business_card_id'])->find();
+        if ((new BusinessModel())->where('business_card_id', $param['business_card_id'])->delete()) {
+            $Qrcode = new Poster($model);
+            $image = $Qrcode->getPosterPath('business');
+            //删除图片
+            if (file_exists($image)) {
+                unlink($image);
+            }
+            $image = $Qrcode->getPosterPath('desensitization');
+            //删除图片
+            if (file_exists($image)) {
+                unlink($image);
+            }
+            return $this->renderSuccess('删除成功');
+        }
+        return $this->renderError('删除失败');
+    }
+    public function getIlk(){
+        return $this->renderSuccess('',[10=>'个人名片',20=>'企业名片']);
+    }
+    /**
+     * 获取访客列表
+     * @return array
+     * @throws \think\exception\DbException
+     */
+    public function getVisitors()
+    {
+        $user = $this->getUser();
+        $param = request()->param();
+        $param['affiliation_id'] = $user['user_id'];
+        $param['type'] = 10; // 10表示浏览记录
+        $list = (new SavingModel())->lists($param);
+        return $this->renderSuccess('',$list);
+    }
+    
+    /**
+     * 获取概览数据
+     */
+    public function getOverview()
+    {
+        $user = $this->getUser();
+        $param = request()->param();
+        $businessId = $param['business_card_id'] ?? '';
+        
+        $savingModel = new SavingModel();
+        
+        $where = ['affiliation_id' => $user['user_id'], 'type' => 10];
+        if ($businessId) {
+            $where['business_id'] = $businessId;
+        }
+        
+        return $this->renderSuccess('',[
+            'views' => $savingModel->where($where)->count(),
+            'saves' => $savingModel->where(['affiliation_id' => $user['user_id'], 'type' => 20])->count(),
+            'shares' => 0 // 暂不实现分享统计
+        ]);
+    }
+    
+    /**
+     * 判断是否需要对名片进行脱敏处理
+     */
+    private function needDesensitizeCard($cardData, $currentUserId)
+    {
+        // 如果是名片所有者,不需要脱敏
+        if ($currentUserId == $cardData['user_id']) {
+            return false;
+        }
+        
+        // 获取名片等级信息
+        $gradeModel = new GradeModel();
+        $gradeInfo = $gradeModel->detail($cardData['grade_id']);
+        
+        // 检查等级费用是否大于0且用户未购买
+        if ($gradeInfo && $gradeInfo['price'] > 0) {
+            // 检查用户是否已购买该名片
+            $hasPurchased = (new OrderModel())->checkCardPurchase($currentUserId, $cardData['business_card_id']);
+            // 如果未购买,则需要脱敏
+            if (!$hasPurchased) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
+    
+    /**
+     * 对名片数据进行脱敏处理
+     */
+    private function desensitizeBusinessData($detail)
+    {
+        // 手机号脱敏
+        if (!empty($detail['mobile'])) {
+            $detail['mobile'] = $this->maskPhoneNumber($detail['mobile']);
+        }
+        if (!empty($detail['mobile_phone'])) {
+            $detail['mobile_phone'] = $this->maskPhoneNumber($detail['mobile_phone']);
+        }
+        
+        // 微信脱敏
+        if (!empty($detail['wechat'])) {
+            $len = strlen($detail['wechat']);
+            if ($len > 4) {
+                $detail['wechat'] = substr($detail['wechat'], 0, 2) . str_repeat('*', $len - 4) . substr($detail['wechat'], -2);
+            }
+        }
+        
+        // 邮箱脱敏
+        if (!empty($detail['mailbox'])) {
+            $parts = explode('@', $detail['mailbox']);
+            if (count($parts) == 2) {
+                $username = $parts[0];
+                $domain = $parts[1];
+                $len = strlen($username);
+                if ($len > 2) {
+                    $detail['mailbox'] = substr($username, 0, 2) . str_repeat('*', $len - 2) . '@' . $domain;
+                }
+            }
+        }
+        
+        // 电话脱敏
+        if (!empty($detail['phone'])) {
+            $detail['phone'] = $this->maskPhoneNumber($detail['phone']);
+        }
+        
+        return $detail;
+    }
+    
+    /**
+     * 手机号/座机号脱敏处理
+     */
+    private function maskPhoneNumber($phone)
+    {
+        $len = strlen($phone);
+        if ($len <= 7) return $phone;
+        
+        // 检查是否是带区号的座机号
+        if (strpos($phone, '-') !== false || strpos($phone, ' ') !== false) {
+            $parts = preg_split('/[-\s]/', $phone);
+            if (count($parts) >= 2) {
+                $areaCode = $parts[0];
+                $number = end($parts);
+                $separator = strpos($phone, '-') !== false ? '-' : ' ';
+                
+                $numLen = strlen($number);
+                if ($numLen <= 4) return $phone;
+                
+                return $areaCode . $separator . str_repeat('*', $numLen - 4) . substr($number, -4);
+            }
+        }
+        
+        // 普通手机号脱敏
+        return substr($phone, 0, 3) . str_repeat('*', $len - 7) . substr($phone, -4);
     }
 }
\ No newline at end of file

--
Gitblit v1.9.2