dao = $dao; } /** * Common: 公共查询模型 * Author: wu-hui * Time: 2024/02/01 15:01 * @param $search * @return Agent */ public function getSearchModel($search){ return $this->dao->searchList($search); } /** * Common: 获取信息列表 * Author: wu-hui * Time: 2024/01/24 15:41 * @param array $params * @param int $page * @param int $limit * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getList(array $params,int $page,int $limit):array{ $query = $this->dao->searchList($params); $count = $query->count(); $list = $query->page($page,$limit)->select(); return compact('count','list'); } /** * Common: 获取全部信息列表 * Author: wu-hui * Time: 2024/01/29 16:00 * @param array $params * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getAllList(array $params):array{ $query = $this->dao->searchList($params); return $query->select()->toArray(); } /** * Common: 获取单条代理人员信息 * Author: wu-hui * Time: 2024/01/30 9:27 * @param $id * @return array */ public function getSingleInfo($id){ return $this->dao->searchList(['id'=>$id])->findOrEmpty()->toArray(); } /** * Common: 生成对应的二维码 * Author: wu-hui * Time: 2024/01/30 18:39 * @param array $params * @return mixed */ public function createQrCode(array $params){ // 参数获取 switch($params['type']){ case 'supplier': $valueData = 'agent_id=' . $params['agent_id']; $path = 'pages/supplier/apply/apply_join'; return app()->make(QrcodeService::class)->createQrCode($valueData,$path); break; case 'subordinate': // 参数长度超过 简写:lv=level;agent_id=aid $valueData = 'lv=' . $params['level'] . '&aid=' . $params['agent_id']; $path = 'pages/agent/invite/index'; return app()->make(QrcodeService::class)->createQrCode($valueData,$path); break; case 'merchant': // 参数长度超过 简写:aid=agent_id;mt=merchant_type $valueData = 'aid=' . $params['agent_id'].'&mt=' . $params['merchant_type']; $path = 'pages/store/settled/index'; return app()->make(QrcodeService::class)->createQrCode($valueData,$path); break; } throw new ValidateException('小程序码生成失败!'); } /** * Common: 获取用户指定身份列表 * Author: wu-hui * Time: 2024/02/19 17:47 * @param int $uid * @param string $type * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getIdentityList(int $uid,string $type = 'headquarters'):array{ // 根据身份类型,获取代理中心角色类型数组:headquarters=总部,province=省公司,county=区县,wine=烟酒馆 // 类型:1=总部发起人,2=省公司发起人,3=省合伙人(外勤),4=省合伙人(内勤),5=区县运营商,6=区县合伙人,7=餐厅,8=配送商,9=总部外勤,10=总部内勤 switch($type){ case 'headquarters': $agentType = [1,9,10]; break; case 'province': $agentType = [2,3,4]; break; case 'county': $agentType = [5,6,7,8]; break; case 'wine': $agentType = [11]; break; default: throw new ValidateException('身份查询失败!'); } // 获取对应的角色身份列表 return $this->dao->searchList(['uid'=>$uid]) ->whereIn('agent_type', $agentType) ->whereNotIn('agent_type', [7])// 忽略无管理菜单的角色 ->field(['id','uid','agent_type','province_id','city_id','area_id','street_id','address','mer_id','contact_name','pid','corporate_name']) ->select() ->toArray(); } /** * Common: 代理添加/编辑 * Author: wu-hui * Time: 2024/01/25 9:03 * @param int $agentId * @param array $data * @param array $childrenList * @return mixed */ public function editInfo(int $agentId, array $data, array $childrenList){ return Db::transaction(function() use ($agentId, $data, $childrenList){ // 处理当前角色用户信息 if($agentId > 0) $this->currentRoleHandle($agentId, $data); // 处理子类信息 $this->childrenListHandle($agentId, $childrenList); }); } /** * Common: 代理添加/编辑 —— 处理当前角色信息 * Author: wu-hui * Time: 2024/01/25 9:03 * @param int $agentId * @param array $data */ private function currentRoleHandle(int $agentId,array $data){ // 修改基本信息 $keys = array_flip((array)[ "uid", "pid", "agent_type", "agent_stock", "contact_name", "contact_phone", "province_id", "city_id", "area_id", "street_id", "address", "lat", "lng", "mer_id", 'corporate_name' ]); $updateInfo = array_intersect_key($data, $keys); Agent::update($updateInfo,['id'=>$agentId]); // 修改配送商 - 商户关联信息 $merIdList = is_array($data['mer_id_list']) ? $data['mer_id_list'] : []; // 删除已经存在的关联信息 Merchant::update(['agent_id' => null],['agent_id'=>$agentId]); // 建立新的关联信息 if(count($merIdList) > 0) Merchant::whereIn('mer_id',$merIdList)->update(['agent_id' => $agentId]); } /** * Common: 代理添加/编辑 —— 处理子类信息 * Author: wu-hui * Time: 2024/01/25 17:45 * @param int $agentId * @param array $childrenList * @throws \think\db\exception\DbException */ private function childrenListHandle(int $agentId,array $childrenList){ $insertData = []; $updateData = []; $merUpdateData = []; $keys = array_flip((array)[ "id", "uid", "pid", "agent_type", "agent_stock", "contact_name", "contact_phone", "province_id", "city_id", "area_id", "street_id", "address", "lat", "lng", "mer_id", 'corporate_name' ]); $eightUpdateIds = []; // 循环:区分对应的操作 foreach($childrenList as $childrenItem){ unset($childrenItem['user']); $childrenItemId = $childrenItem['id'] ?? 0; $handleData = array_intersect_key($childrenItem, $keys); $handleData['pid'] = $agentId; // 判断:如果为配送商、烟酒馆 处理商户关联信息 if(in_array($childrenItem['agent_type'],[8,11])){ // 判断:应该修改还是编辑 if((int)$childrenItemId > 0) $this->dao->update($childrenItemId,$handleData); else $childrenItemId = Agent::insertGetId($handleData); // 处理商户关联信息 foreach($childrenItem['mer_id_list'] as $merId){ $merUpdateData[] = [ 'mer_id' => $merId, 'agent_id' => $childrenItemId ]; } // 记录配送商ID $eightUpdateIds[] = (int)$childrenItemId; }else{ // 判断:应该修改还是编辑 if((int)$childrenItemId > 0) $updateData[] = $handleData; else $insertData[] = $handleData; } } // 获取需要删除的数据的id 删除思路:先获取总数据、对修改数据比较、删除缺少的项 $allIds = $this->dao->searchList([])->where('pid',$agentId)->column('id'); $updateIds = array_column($updateData,'id'); $delIds = array_diff($allIds, array_merge($eightUpdateIds,$updateIds)); // 处理结果 进行对应的操作;必须按照先删除、在修改、最后添加的顺序进行 if(count($delIds) > 0) Agent::whereIn('id',$delIds)->update(['is_del'=>1]); if(count($updateData) > 0) Agent::batchUpdate(array_values($updateData)); if(count($insertData) > 0) $this->dao->insertAll($insertData); if(count($merUpdateData) > 0) { // 删除已经存在的关联信息 Merchant::whereIn('agent_id',array_column($childrenList,'id'))->update(['agent_id' => null]); // 建立新的关联信息 Merchant::batchUpdate(array_values($merUpdateData),'mer_id','mer_id'); } } /** * Common: 代理添加/编辑 —— 获取需要编辑的信息 * Author: wu-hui * Time: 2024/01/24 16:57 * @param $params * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getEditInfo($params){ // 获取当前信息 编辑类型:0=发起人管理,1=发起人,2=省公司,3=省合伙人(外勤),4=省合伙人(内勤),5=区县运营商,6=区县合伙人,7=餐厅,8=配送商 $info = []; if((int)$params['agent_id'] > 0) { // 非发起人管理:存在info及children_list $info = $this->dao->searchList(['id' => $params['agent_id']])->findOrEmpty(); $children_list = $this->dao ->searchList(['pid' => $params['agent_id']]) ->select() ->toArray(); } else{ // 发起人管理:仅存在children_list $children_list = $this->dao ->searchList(['pid' => 0,'agent_type' => 1]) ->select() ->toArray(); } // 获取已被酒道馆绑定的商户 $shop_mer = $this->getMerchant(1); // 获取已被烟酒店绑定的商户 $wine = $this->getMerchant(3); // 获取已被餐厅绑定的商户 $mer = Agent::hasWhere('mer',function($query){ $query->where('is_del',0); },'Agent.mer_id,Agent.id as agent_id,Agent.contact_name') ->where('Agent.mer_id','>',0) ->where('Agent.is_del',0) ->select() ->toArray(); return compact('info','children_list','shop_mer','wine','mer'); } /** * Common: 获取对应类型已绑定的 酒道馆 || 烟酒馆 * Author: wu-hui * Time: 2024/03/22 10:38 * @param $merchantType * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ private function getMerchant($merchantType){ return Merchant::hasWhere('agent',function($query){ $query->where('is_del',0); },'Merchant.mer_id,Merchant.agent_id,Merchant.merchant_type') ->where('agent_id','>',0) ->where('merchant_type',$merchantType) ->with([ 'agent' => function($query){ $query->field(['id','contact_name']) ->bind(['contact_name']); } ]) ->select() ->toArray(); } /** * Common: 获取配置 * Author: wu-hui * Time: 2024/01/31 14:43 * @return mixed */ public function getConfig(){ $config = systemConfig([ 'delivery_money', 'delivery_money_field_staff', 'delivery_money_initiator', 'delivery_money_operator', 'delivery_money_partner', 'delivery_money_platform', 'delivery_money_province', 'delivery_process', 'field_staff_money', 'field_staff_money_initiator', 'field_staff_money_platform', 'field_staff_money_province', 'field_staff_process', 'internal_staff_money', 'internal_staff_money_initiator', 'internal_staff_money_platform', 'internal_staff_money_province', 'internal_staff_process', 'mer_money', 'mer_money_field_staff', 'mer_money_initiator', 'mer_money_operator', 'mer_money_partner', 'mer_money_platform', 'mer_money_province', 'mer_process', 'operator_money', 'operator_money_field_staff', 'operator_money_initiator', 'operator_money_platform', 'operator_money_province', 'operator_process', 'partner_money', 'partner_money_field_staff', 'partner_money_initiator', 'partner_money_operator', 'partner_money_platform', 'partner_money_province', 'partner_process', 'province_money', 'province_money_initiator', 'province_money_platform', 'province_process', // 总部外勤相关 'province_money_field_personnel', 'field_staff_money_field_personnel', 'internal_staff_money_field_personnel', 'operator_money_field_personnel', 'partner_money_field_personnel', 'mer_money_field_personnel', 'delivery_money_field_personnel', 'field_personnel_money', 'field_personnel_process', 'field_personnel_money_platform', 'field_personnel_money_initiator', 'external_personnel_money', 'external_personnel_process', 'external_personnel_money_platform', 'external_personnel_money_initiator', // 邀请限制 'invite_limit' ]); $config['delivery_process'] = (int)$config['delivery_process']; $config['field_staff_process'] = (int)$config['field_staff_process']; $config['internal_staff_process'] = (int)$config['internal_staff_process']; $config['mer_process'] = (int)$config['mer_process']; $config['operator_process'] = (int)$config['operator_process']; $config['partner_process'] = (int)$config['partner_process']; $config['province_process'] = (int)$config['province_process']; $config['field_personnel_process'] = (int)$config['field_personnel_process']; $config['external_personnel_process'] = (int)$config['external_personnel_process']; $config['invite_limit'] = $config['invite_limit'] ? (array)$config['invite_limit'] : []; return $config; } /** * Common: 获取全部的上级信息 * Author: wu-hui * Time: 2024/02/02 13:52 * @param $pid * @param array $data * @return array|mixed */ public function getAllUp($pid,array $data = []){ $info = $this->getSingleInfo($pid); $infoPid = $info['pid'] ?? 0; if($infoPid > 0) $data = $this->getAllUp($infoPid, $data); else $data[] = $info; return $data; } }