new-admin-api/app/common/repositories/marketing/AgentRepository.php

444 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\repositories\marketing;
use app\common\dao\marketing\AgentDao;
use app\common\model\marketing\Agent;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\BaseRepository;
use crmeb\services\QrcodeService;
use think\exception\ValidateException;
use think\facade\Db;
class AgentRepository extends BaseRepository{
protected $dao;
public function __construct(AgentDao $dao){
$this->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=levelagent_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_idmt=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;
}
}