文件
mashangyoujiu/Application/Common/Business/Role.class.php

1189 行
51 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Common\Business;
use Common\Model\JurisdictionRecordModel;
use Common\Model\JurisdictionGroupModel;
use Common\Model\JurisdictionListModel;
use Common\Model\JurisdictionUserModel;
use Common\Model\RetailManagerModel;
use Common\Model\RetailStoreModel;
use Common\Validate\CustomValidate;
//[1.9.13]
/**
* 角色类
* Class Role
* [
* 公有方法
* storeUseLimit 商户后台->门店管理->门店的使用限制
* storeUseLimitNeedGather 门店的使用限制 需要验证的权限id集合
* getRole 获取权限
* setRole 保存权限
* getRoleRecord 获取权限修改记录
* getOperatorList 获取操作者列表-供选择
* createSystemGroup 新增代理商、商户、门店、导购员、收银员时生成系统权限
* getRoleList 获取用户自定义的角色列表
* changeRoleStatus 修改自定义角色的状态
* delCustomerRole 删除自定义角色
* resetUserRole 重置系统角色用户权限为初始状态
* 私有方法
* generateTree 数组转换为树型数据
* getActualCheckIds 处理实际需要保存的ID列表
* getOperateContent 获取操作用户权限的名称集合
* delChildJur 删除子集权限
* delArrKey 去除被删除的ID列表
* verifyParam 验证请求参数
* ]
* @package Common\Business
*/
class Role
{
public $errMsg;
/**
* 获取权限节点进行编辑
* @param $param
* $param['operate_type'] 操作类型 1自己权限详细的节点(给自己后台的自定义用户组权限) 2菜单栏(给下级用户组的权限)
* $param['group_id'] 自己权限的分组的列表的ID
* $param['operator_id'] 操作的用户在权限用户表的ID
* $param['next_user_type'] 子集所属后台角色功能类型/下级用户类型 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['next_id'] 下级用户对应的表的ID(operate_type==1:权限组表的ID;operate_type==2:代理商/商户/门店/导购员/收银员表ID)
* @return mixed
*/
public function getRole($param)
{
if (!$this->verifyParam($param)) {
return callBack(statusCode()['error'], $this->errMsg);
}
$JurUserModel = new JurisdictionUserModel();
$JurListModel = new JurisdictionListModel();
$JurGroupModel = new JurisdictionGroupModel();
$fields = [
'id',
'name as label',
'pid',
'tips',
];
switch ($param['operate_type']) {
case 1:
//获取自己的角色权限节点 所有
//1.获取用户自己拥有的权限列表
// 1.1获取权限列表ID
$jur_id = $JurGroupModel->getFindField(['id' => $param['group_id']], 'jurisdiction_id');
if (!$jur_id) {
return callBack(statusCode()['error'], '操作有误');
}
// 1.2获取权限列表
$idMap = ['id' => ['in', $jur_id]];
if ($param['next_user_type'] == 3) {
//是商户编辑自定义角色权限 则删除门店权限节点
$idMap = [
$idMap,
['id' => ['not in', [705, 709]]]
];
}
$listMap = [
$idMap,
'user_type' => $param['next_user_type'],
];
if (!empty($param['next_id'])) {
//2.获取已选节点列表
$roleInfo = $JurGroupModel->getFind(['id' => $param['next_id']], 'id,status,role_name,jurisdiction_id');
if (!$roleInfo) {
return callBack(statusCode()['error'], '操作有误1');
}
// 2.3获取已有权限id列表
$checkMap = ['id' => ['in', $roleInfo['jurisdiction_id']], 'user_type' => $param['next_user_type']];
unset($roleInfo['jurisdiction_id']);
}
break;
case 2:
//获取下级用户类型的所有可选的菜单节点
$jur_id = $JurGroupModel->getFindField(['id' => $param['next_user_type']], 'jurisdiction_id');
$listMap = [
'user_type' => $param['next_user_type'],
'is_menu' => 1,
];
//获取下级已选节点列表
switch ($param['next_user_type']) {
case 2:
case 5:
case 6:
//代理商 导购员 收银员
$next_group_id = $JurUserModel->getFindField([
'user_type' => $param['next_user_type'],
'system_user_id' => $param['next_id']
], 'jurisdiction_group_id');
break;
case 3:
case 4:
//商户 门店
$Merchant = new Merchant();
if ($param['next_user_type'] == 3) {
$next_group_id = $JurUserModel->getFindField([
'user_type' => $param['next_user_type'],
'system_user_id' => $param['next_id']
], 'jurisdiction_group_id');
$platform_type = $Merchant->getMerPlatFormType($param['next_id']);
$id = $platform_type == 2 ? [206, 936] : [];
} else {
$StoreModel = new RetailStoreModel();
$store = $StoreModel->getFind(['id' => $param['next_id']], 'merchantid,jur_group_id,store_class');
$next_group_id = $store['jur_group_id'];
$platform_type = $Merchant->getMerPlatFormType($store['merchantid']);
$id = $platform_type == 2 ? [808, 946] : [];
if ($store['store_class'] == 1) {
//非加盟店,去除收入管理权限
$id[] = 1048;
}
}
if ($platform_type == 2 || $param['next_user_type'] == 4 && $store['store_class'] == 1) {
//Q3ERP 去除进销存及资金管理 非加盟店,去除收入管理权限
$authList = $JurListModel->getSelect(['id' => ['in', $id]], 'id,pid,type');
$del_q3_jur = [];
$this->getActualCheckIds($authList, $del_q3_jur, 2, ['is_menu' => 1]);
$jur_id = $this->delArrKey($jur_id, $del_q3_jur);
}
break;
default:
$next_group_id = 0;
}
$listMap['id'] = ['in', $jur_id];
if (!$next_group_id) {
return callBack(statusCode()['error'], '操作有误');
}
$next_jur_id = $JurGroupModel->getFindField(['id' => $next_group_id], 'jurisdiction_id');
if (!$next_jur_id) {
return callBack(statusCode()['error'], '操作有误2');
}
$checkMap = [
'id' => ['in', $next_jur_id],
'is_menu' => 1,
'user_type' => $param['next_user_type'],
];
break;
default:
$listMap = [];
$checkMap = [];
}
// 1.2获取权限列表
$list = $JurListModel->getSelect($listMap, $fields, 'type asc,sort asc');
// 2.3获取已有权限id列表
$checkIds = [];
if (!empty($param['next_id']) && !empty($checkMap)) {
$checkIds = $JurListModel->getFindField($checkMap, 'id', true);
if (empty($list)) {
return callBack(statusCode()['error'], '操作有误');
}
}
$newList = $this->generateTree($list, $checkIds);
if ($param['operate_type'] == 2) {
//处理含有下级菜单、但是下级菜单权限全部被限制的情况的菜单栏
$newList = $this->handleOutMenuAuth($newList);
}
if (empty($newList)) {
return callBack(statusCode()['error'], '操作有误');
}
$data = [
'list' => $newList,
'checkIds' => $checkIds,
];
if ($param['operate_type'] == 1) {
$data['roleInfo'] = $roleInfo;
}
return callBack(statusCode()['success'], '获取成功', $data);
}
/**
* 保存权限节点设置
* @param $param
* $param['operate_type'] 操作类型 1自己权限详细的节点(给自己后台的自定义用户组权限) 2菜单栏(给下级用户组的权限)
* $param['group_id'] 自己权限的分组的列表的ID
* $param['operator_id'] 操作的用户在权限用户表的ID
* $param['next_user_type'] 子集所属后台角色功能类型/下级用户类型 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['next_id'] 下级用户对应的表的ID(operate_type==1:权限组表的ID;operate_type==2:代理商/商户/门店/导购员/收银员表ID)
* $param['checkIds'] 已选的权限节点ID列表(逗号','拼接的字符串)
* $param['role_name'] 操作子集角色时:角色名称
* $param['status'] 操作子集角色时:子集角色的状态
* @return mixed
*/
public function setRole($param)
{
if (!$this->verifyParam($param)) {
return callBack(statusCode()['error'], $this->errMsg);
}
if (!$param['checkIds']) {
return callBack(statusCode()['error'], '权限不能为空');
}
//获取已选权限详情
$JurListModel = new JurisdictionListModel();
$authList = $JurListModel->getSelect(['id' => ['in', $param['checkIds']]], 'id,pid,type');
if (empty($authList)) {
return callBack(statusCode()['error'], '操作有误');
}
//获取下级的权限ID
$JurGroupModel = new JurisdictionGroupModel();
$JurUserModel = new JurisdictionUserModel();
$StoreModel = new RetailStoreModel();
$ManagerModel = new RetailManagerModel();
$next_user_id = 0;//被操作的用户在用户表的ID
switch ($param['operate_type']) {
case 1:
//自定义角色的权限
if (empty($param['role_name'])) {
return callBack(statusCode()['error'], '角色名称不能为空');
}
if (!in_array($param['status'], ['1', '2'])) {
return callBack(statusCode()['error'], '角色状态有误');
}
$fMap = [
'role_name' => $param['role_name'],
'create_user_id' => $param['operator_id'],
'state' => 1,
'id' => ['neq', $param['next_id'] ? $param['next_id'] : 0],
];
$find = $JurGroupModel->getCount($fMap);
if (!empty($find)) {
return callBack(statusCode()['error'], '该角色名称被使用,请更换名称');
}
$next_group_id = $param['next_id'];
break;
case 2:
//下级用户的权限
switch ($param['next_user_type']) {
case 2:
case 3:
case 5:
case 6:
//代理商 商户 导购员 收银员
$next_user = $JurUserModel->getFind([
'user_type' => $param['next_user_type'],
'system_user_id' => $param['next_id']
], 'id,jurisdiction_group_id');
$next_user_id = $next_user['id'];
$next_group_id = $next_user['jurisdiction_group_id'];
break;
case 4:
//门店
$next_group_id = $StoreModel->getFindField(['id' => $param['next_id']], 'jur_group_id');
//获取所有店长的ID
$manager_id = $ManagerModel->getFindField(['storeid' => $param['next_id'], 'status' => 1], 'id', true);
if (!empty($manager_id)) {
//获取所有店长在用户表的ID
$next_user_id = $JurUserModel->getFindField(['system_user_id' => ['in', $manager_id], 'user_type' => 1, 'state' => 1], 'id', true);
}
break;
default:
$next_group_id = 0;
}
break;
default:
$next_group_id = 0;
}
if ($param['operate_type'] == 2 || !empty($param['next_id'])) {
if (empty($next_group_id)) {
return callBack(statusCode()['error'], '操作有误');
}
//原始权限ID列表
$before_jur = $JurGroupModel->getFindField(['id' => $next_group_id], 'jurisdiction_id');
$before_arr = explode(',', $before_jur);
// print_r($before_arr);
} else {
$before_jur = '';
$before_arr = [];
}
//实际已选的权限ID列表
$after_jur = explode(',', $param['checkIds']);
//查询之前下级用户是否拥有被删除的权限
$limitMap['id'] = ['in', $before_jur];
$old_limit_id = $JurListModel->getFindField($limitMap, 'limit_id', true);
$old_limit_id = implode(',', $old_limit_id);
$old_limit_id = explode(',', $old_limit_id);
//处理实际操作后的权限
$this->getActualCheckIds($authList, $after_jur);
//查询有限制下级权限的权限的权限ID
$limitMap = [
'is_menu' => 1,
'id' => ['not in', $after_jur],
'limit_id' => ['neq', ''],
'user_type' => $param['next_user_type'],
];
$del_limit_id = $JurListModel->getFindField($limitMap, 'limit_id', true);
if ($del_limit_id) {
$del_limit_id = implode(',', $del_limit_id);
$del_limit_id = explode(',', $del_limit_id);
}
if ($param['operate_type'] == 2 && $param['next_user_type'] == 3) {
//商户需要查询原有的门店权限 且追加门店权限
$store_jur_id = $JurListModel->getFindField(['id' => ['in', $before_jur], 'user_type' => 4], 'id', true);
if (!empty($old_limit_id) && !empty($del_limit_id)) {
//去除被删除的门店被限制的权限
$new_store_jur_id = $this->delArrKey(implode(',', $store_jur_id), $del_limit_id, false);
$after_jur = array_merge($after_jur, $new_store_jur_id);
} else if (!empty($store_jur_id)) {
$after_jur = array_merge($after_jur, $store_jur_id);
}
//给商户增加新增的限制的门店权限
$temp_add_jur = array_diff($after_jur, $before_arr);
if (!empty($temp_add_jur)) {
$addLimitMap = [
'is_menu' => 1,
'limit_id' => ['neq', ''],
'user_type' => $param['next_user_type'],
'id' => ['in', $temp_add_jur],//ID在新增的已选权限里
];
$add_limit_id = $JurListModel->getFindField($addLimitMap, 'limit_id', true);
if (!empty($add_limit_id)) {
$add_limit_id = implode(',', $add_limit_id);
$add_limit_id = explode(',', $add_limit_id);
$after_jur = array_merge($after_jur, $add_limit_id);
}
}
}
sort($after_jur);//排序
//把保存的权限转为逗号','拼接的字符串
$after_str = implode(',', $after_jur);
//提取删除的权限ID列表
$del_jur = array_diff($before_arr, $after_jur);
$del_jur = array_reverse($del_jur);//从0开始排序
//提取新增的权限ID列表
$add_jur = array_diff($after_jur, $before_arr);
M()->startTrans();
$saveData = [
'jurisdiction_id' => $after_str,
];
if ($param['operate_type'] == 1) {
$saveData['role_name'] = $param['role_name'];
$saveData['create_user'] = $param['next_user_type'];
$saveData['create_user_id'] = $param['operator_id'];
$saveData['status'] = $param['status'];
}
if ($param['operate_type'] == 2 || !empty($param['next_id'])) {
//修改角色或用户的权限
$update = $JurGroupModel->updateOrder(['id' => $next_group_id], $saveData);
} else {
//新增角色
$saveData['add_time'] = time();
$update = $JurGroupModel->addOrder($saveData);
$next_group_id = $update;
}
if ($update) {
$details = [];
$map = [
'is_menu' => 1,
];
switch ($param['operate_type']) {
case 1:
unset($map['is_menu']);
break;
case 2:
$map['user_type'] = $param['next_user_type'];
break;
}
if (!empty($del_jur)) {
$map['id'] = ['in', $del_jur];
$data = $JurListModel->getSelect($map, 'id,pid,name,is_menu');
$delTree = $this->generateTree($data);
$this->getOperateContent($delTree, $details, '关闭:');
//删除下级用户的已选权限
if (!empty($next_user_id)) {
switch ($param['operate_type']) {
case 1:
break;
case 2:
//需要删除被操作的用户的子集和下级的权限
//1 删除子集权限
//1.1 获取被操作的用户在权限组表的ID
$childMap = [
'first_pid' => ['in', $next_user_id],
'user_type' => 0,
'state' => 1,
];
$next_user_group_id = $JurUserModel->getFindField($childMap, 'jurisdiction_group_id', true);
$del = !empty($next_user_group_id) ? $this->delChildJur($next_user_group_id, $del_jur) : true;
if (!$del) {
M()->rollback();
return callBack(statusCode()['error'], '保存失败');
}
//2 删除下级的权限
//2.1 查询需要删除的权限ID列表
switch ($param['next_user_type']) {
case 3:
//商户 查询是否有限制门店使用的权限被删除
if (!empty($old_limit_id) && !empty($del_limit_id)) {
//删除商户下的门店被限制的ID
$store_jur_list = $StoreModel->getSelect(['merchantid' => $param['next_id'], 'state' => 0], 'jur_group_id');
foreach ($store_jur_list as $value) {
$del = $this->delChildJur($value['jur_group_id'], $del_limit_id);
if (!$del) {
M()->rollback();
return callBack(statusCode()['error'], '保存失败');
}
}
//获取所有的店长ID,找到店长添加的新角色的列表,删除门店被限制的ID
$store_manager_id = $ManagerModel->getFindField(['merchantid' => $param['next_id'], 'status' => 1], 'id', true);
if (!empty($store_manager_id)) {
//获取店长在角色表的ID列表
$manager_user_id = $JurUserModel->getFindField(['system_user_id' => ['in', $store_manager_id], 'user_type' => 4], 'id', true);
if (!empty($manager_user_id)) {
//获取下级用户的权限组表ID列表
$childMap['first_pid'] = ['in', $manager_user_id];
$store_user_group_id = $JurUserModel->getSelect($childMap, 'jurisdiction_group_id');
foreach ($store_user_group_id as $val) {
$del = $this->delChildJur($val['jurisdiction_group_id'], $del_limit_id);
if (!$del) {
M()->rollback();
return callBack(statusCode()['error'], '保存失败');
}
}
}
}
}
break;
case 4:
//门店
break;
}
break;
}
}
}
if (!empty($add_jur)) {
$map['id'] = ['in', $add_jur];
$data = $JurListModel->getSelect($map, 'id,pid,name');
$addTree = $this->generateTree($data);
$this->getOperateContent($addTree, $details, '开启:');
}
$record = [
'add_time' => time(),
'operator_id' => $param['operator_id'],
'jur_group_id' => $next_group_id,
'before_jur_id' => $before_jur,
'after_jur_id' => $after_str,
'details' => implode(',', $details),
];
$JurRecordModel = new JurisdictionRecordModel();
$add_record = $JurRecordModel->addOrder($record);
if ($add_record) {
M()->commit();
return callBack(statusCode()['success'], '保存成功');
} else {
M()->rollback();
return callBack(statusCode()['error'], '保存失败');
}
} else {
return callBack(statusCode()['error'], '暂无修改');
}
}
/**
* 获取权限修改记录
* @param $param
* $param['operate_type'] 操作类型 1自己权限详细的节点(给自己后台的自定义用户组权限) 2菜单栏(给下级用户组的权限)
* $param['group_id'] 自己权限的分组的列表的ID
* $param['operator_id'] 操作的用户在权限用户表的ID
* $param['next_user_type'] 下级用户类型 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['next_id'] 下级用户对应的表的ID(operate_type==1:权限组表的ID;operate_type==2:代理商/商户/门店/导购员/收银员表ID)
* $param['checkIds'] 已选的权限节点ID列表(逗号','拼接的字符串)
* $param['operator_user_id'] 添加记录的用户ID
* $param['page'] 页码
* $param['limit'] 每页读取数量
* @return mixed
*/
public function getRoleRecord($param)
{
if (!$this->verifyParam($param)) {
return callBack(statusCode()['error'], $this->errMsg);
}
if (!$param['page'] || !$param['limit']) {
return callBack(statusCode()['error'], '页码和每页读取数量不能为空');
}
$JurRecordModel = new JurisdictionRecordModel();
$map = [];
$JurUserModel = new JurisdictionUserModel();
switch ($param['operate_type']) {
case 1:
$map['jur_group_id'] = $param['next_id'];
break;
case 2:
switch ($param['next_user_type']) {
case 2:
case 3:
case 5:
case 6:
//代理商 商户 导购员 收银员
$next_group_id = $JurUserModel->getFindField([
'user_type' => $param['next_user_type'],
'system_user_id' => $param['next_id']
], 'jurisdiction_group_id');
break;
case 4:
//门店
$StoreModel = new RetailStoreModel();
$next_group_id = $StoreModel->getFindField(['id' => $param['next_id']], 'jur_group_id');
break;
default:
$next_group_id = 0;
}
$map['jur_group_id'] = $next_group_id;
break;
}
if (!empty($param['operator_user_id'])) {
$map['operator_id'] = $param['operator_user_id'];
}
$list = $JurRecordModel->getSelect($map, 'id,operator_id,add_time,details', 'id desc', $param['page'] . ',' . $param['limit']);
$operator = [];
$count = 0;
if ($list) {
foreach ($list as &$val) {
$val['add_time'] = newDate('Y-m-d H:i:s', $val['add_time']);
$val['details'] = explode(',', $val['details']);
if (!isset($operator[$val['operator_id']])) {
$operator[$val['operator_id']] = $JurUserModel->getFindField(['id' => $val['operator_id']], 'name');
}
$val['operator_name'] = $operator[$val['operator_id']];
}
$count = $JurRecordModel->getCount($map);
}
return callBack(statusCode()['success'], $list ? '获取成功' : '暂无数据', [
'list' => $list,
'count' => $count,
]);
}
/**
* 获取操作者列表-供选择
* @param $param
* $param['user_id'] 当前登录的用户在角色用户表的ID
* $param['user_type'] 当前登录的用户类型 0自定义用户 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['first_pid'] 当前登录的用户所属系统角色在用户表的ID
* $param['operator_id'] 操作人ID,可按照操作的人进行筛选
* @return mixed
*/
public function getOperatorList($param)
{
if (empty($param['user_id']) || !isset($param['user_type']) || $param['user_type'] === 0 && empty($param['first_pid'])) {
return callBack(statusCode()['error'], '缺少参数');
}
switch ($param['user_type']) {
case 0:
//自定义角色的用户
$first_pid = $param['first_pid'];
break;
default:
//系统用户
$first_pid = $param['user_id'];
}
$map = [
'state' => 1,
'status' => 1,
[
['user_type' => 0, 'first_pid' => $first_pid,],
'id' => $first_pid,
'_logic' => 'OR',
]
];
if (!empty($param['operator_id'])) {
$map['operator_id'] = $param['operator_id'];
}
$JurUserModel = new JurisdictionUserModel();
$list = $JurUserModel->getSelect($map, 'id,name', 'id asc');
return callBack(statusCode()['success'], '获取成功', [
'list' => $list
]);
}
/**
* 新增代理商、商户、门店、导购员、收银员时生成系统权限
* @param
* $param['type'] 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['platform_type'] 添加商户时所需商户类型 1系统默认类型 2第三方微礼平台
* $param['store_id'] 门店ID
* $param['merchant_id'] 商户ID
* @return mixed
*/
public function createSystemGroup($param)
{
$group_id = '';
$JurGroupModel = new JurisdictionGroupModel();
switch ($param['type']) {
case 1:
//合伙人暂不支持生成权限
break;
case 2:
case 3:
case 5:
case 6:
//代理商 商户 导购员 收银员
$group = $JurGroupModel->getFindTrue(['id' => $param['type']], 'id');
if ($param['type'] == 3 && $param['platform_type'] == 2) {
//添加商户时商户类型为第三方Q3平台
//去除进销存与采购资金管理权限
$JurListModel = new JurisdictionListModel();
$authList = $JurListModel->getSelect(['id' => ['in', [206, 808, 936, 946]]], 'id,pid,type');
$group_arr = explode(',', $group['jurisdiction_id']); //全部权限集合
$reject_group_arr = []; //拒绝的权限id
$this->getActualCheckIds($authList, $reject_group_arr, 2);
$diff = array_diff($group_arr, $reject_group_arr);
if (!empty($diff)) {
$group['jurisdiction_id'] = implode(',', $diff);
}
}
$group['add_time'] = time();
$group_id = $JurGroupModel->addOrder($group);
break;
case 4:
//添加门店
//获取系统门店权限
$store_jur = $JurGroupModel->getFindField(['id' => $param['type']], 'jurisdiction_id');
$store_jur = explode(',', $store_jur);
$JurUserModel = new JurisdictionUserModel();
//获取商户权限组ID
$merchant_jur_id = $JurUserModel->getFindField(['system_user_id' => $param['merchant_id'], 'user_type' => 3], 'jurisdiction_group_id');
//获取商户权限
$merchant_jur = $JurGroupModel->getFindField(['id' => $merchant_jur_id], 'jurisdiction_id');
$merchant_jur = explode(',', $merchant_jur);
//剔除门店不该有的权限
$del_jur = array_diff($store_jur, $merchant_jur);
$del_jur = array_reverse($del_jur);//从0开始排序
$jur_id_str = $this->delArrKey($store_jur, $del_jur, false);
//追加门店用户管理和角色管理(这个权限商户没有)
$JurListModel = new JurisdictionListModel();
$authList = $JurListModel->getSelect(['id' => ['in', [705, 709]]], 'id,pid,type');
$this->getActualCheckIds($authList, $jur_id_str);
//生成门店权限
$item = [
'role_name' => '门店',
'jurisdiction_id' => implode(',', $jur_id_str),
'add_time' => time(),
'create_user' => 0,
'create_user_id' => 0,
];
$group_id = $JurGroupModel->addOrder($item);
break;
case -4:
//店长
$StoreModel = new RetailStoreModel();
$group_id = $StoreModel->getFindField(['id' => $param['store_id']], 'jur_group_id');
break;
}
return $group_id;
}
/**
* 获取用户自定义的角色列表
* @param $param
* $param['operator_id'] 当前操作者ID
* $param['user_type'] 当前操作者登录类型
* $param['page'] 页码
* $param['limit'] 每页数量
* @return mixed
*/
public function getRoleList($param)
{
if (empty($param['operator_id']) || empty($param['user_type'])) {
return callBack(statusCode()['error'], '参数有误');
} else {
$map = [
'create_user_id' => $param['operator_id'],
'create_user' => $param['user_type'],
'state' => 1,
];
$JurGroupModel = new JurisdictionGroupModel();
$list = $JurGroupModel->getSelect($map, '*', 'id asc', $param['page'] . ',' . $param['limit']);
$count = $JurGroupModel->getCount($map);
foreach ($list as $key => &$value) {
$value['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
}
return callBack(statusCode()['success'], !empty($list) ? '获取成功' : '暂无数据', [
'list' => $list,
'count' => $count,
]);
}
}
/**
* 修改自定义角色的状态
* @param $param
* $param['id'] 角色ID
* $param['source'] 来源:0pc后台系统 1小助手
* $param['user_type'] 平台:1合伙人端 2代理商端 3商户端 4门店端
* @return mixed
*/
public function changeCustomerRoleStatus($param)
{
if (empty($param['id']) || !in_array($param['source'], [0, 1]) || !in_array($param['user_type'], [1, 2, 3, 4])) {
return callBack(statusCode()['success'], '请求参数有误');
}
$JurGroupModel = new JurisdictionGroupModel();
$status = $JurGroupModel->getFindField(['id' => $param['id']], 'status');
$save = $JurGroupModel->updateOrder(['id' => $param['id']], ['status' => $status == 1 ? 2 : 1]);
if ($save) {
//操作日志记录
$request_data = json_encode($_POST);//请求参数 json数据
if ($status == 1) {
$desc = '角色管理-开启状态';//操作行为描述
} else {
$desc = '角色管理-关闭状态';//操作行为描述
}
action_log($param['source'], $param['user_type'], $request_data, $desc);
return callBack(statusCode()['success'], '修改成功');
} else {
return callBack(statusCode()['error'], '修改失败');
}
}
/**
* 删除自定义角色
* @param $param
* $param['id'] 角色ID
* $param['source'] 来源:0pc后台系统 1小助手
* $param['user_type'] 平台:1合伙人端 2代理商端 3商户端 4门店端
* @return mixed
*/
public function delCustomerRole($param)
{
if (empty($param['id']) || !in_array($param['source'], [0, 1]) || !in_array($param['user_type'], [1, 2, 3, 4])) {
return callBack(statusCode()['success'], '请求参数有误');
}
$JurUserModel = new JurisdictionUserModel();
$map = [
'jurisdiction_group_id' => $param['id'],
'state' => 1,
];
$user = $JurUserModel->getCount($map);
if (!empty($user)) {
return callBack(statusCode()['error'], '该角色下有用户,不能删除');
}
$JurGroupModel = new JurisdictionGroupModel();
$del = $JurGroupModel->updateOrder(['id' => $param['id']], ['state' => 0]);
if ($del) {
//操作日志记录
$request_data = json_encode($_POST);//请求参数 json数据
$desc = '角色管理-删除';//操作行为描述
action_log($param['source'], $param['user_type'], $request_data, $desc);
return callBack(statusCode()['success'], '删除成功');
} else {
return callBack(statusCode()['error'], '删除失败');
}
}
/**
* 商户后台->门店管理->门店的使用限制
* @param $store_id 门店id
* @return mixed
*/
public function storeUseLimit($store_id)
{
//获取门店的权限组id
$StoreModel = new RetailStoreModel();
$group_id = $StoreModel->getFindField([
'id' => $store_id
], 'jur_group_id');
if (empty($group_id)) {
return callBack(statusCode()['error'], '该门店缺少权限组标识');
}
//获取权限id
$GroupModel = new JurisdictionGroupModel();
$jurisdiction_id = $GroupModel->getFindField([
'id' => $group_id
], 'jurisdiction_id');
$jurisdiction_id = explode(',', $jurisdiction_id);
//生成暂无权限的集合
$not_arr = []; //无权限的集合
$result = $this->storeUseLimitNeedGather();
$verify_id_arr = $result['verify_id_arr']; //需要验证的权限id集合
$arr = $result['arr']; //id对应的标识集合
$difference = array_diff($verify_id_arr, $jurisdiction_id);//差集
if (!empty($difference)) {
foreach ($difference as $val) {
$data = $arr[$val];
if (is_array($data)) {
foreach ($data as $v) {
if (in_array($v, $not_arr)) {
continue;
}
$not_arr[] = $v;
}
} else {
if (in_array($data, $not_arr)) {
continue;
}
$not_arr[] = $data;
}
}
}
return $not_arr;
}
/**
* 门店使用限制需要验证的权限id集合
* @return array
*/
public function storeUseLimitNeedGather()
{
//需要验证的权限id集合
$verify_id_arr = [
430, 433, 434, 440, 441, 442, 444, 450, 471, 472, 490, 518, 582, 583, 584, 585, 586, 587, 594, 686, 694, 809, 875, 880,
946, 971, 1120, 1139, 1163, 1175,
];
//id对应的标识集合
$arr = [
430 => ['addgoods', 'editgoods', 'showpurch_price', 'edit_price'],//添加商品 编辑商品 查看进价 修改商品价格
434 => ['synchro_goods', 'cost_price'], //门店同步商品 同步成本价
440 => 'batch_editgoods', //批量修改商品
441 => 'batch_editgoodsclass', //批量修改分类
442 => 'delgoods', //批量删除商品
444 => 'batch_delgoods', //删除商品
450 => 'edit_goods_class', //管理商品分类
471 => 'store_xcx_info', //门店设置
472 => 'store_xcx_distribution_fee', //配送费
490 => 'store_goods_promotion', //促销商品
518 => 'store_coupon', //门店优惠券
582 => 'store_show_vip_info', //是否显示所有会员
583 => 'store_operation_vip', //会员操作权限
584 => 'store_operation_vip', //会员操作权限
585 => 'store_operation_vip', //会员操作权限
586 => 'store_operation_vip', //会员操作权限
587 => ['store_operation_vip', 'store_edit_vip_info'], //会员操作权限 编辑会员信息
594 => 'store_edit_vip_info', //编辑会员信息
686 => 'addcashier', //添加收银员
694 => 'addguide', //添加导购员
809 => 'purchase', //是否开启采购管理
875 => 'allocation', //是否可以编辑调拨价
880 => 'store_allocation', //门店之间调拨审核
946 => 'capital', //资金管理
971 => 'store_operation_vip', //会员操作权限
1120 => 'home_diy', //diy设置
1139 => 'operate_vip_coupon', //门店会员优惠券
1163 => 'edit_goods_label', //标签
1175 => 'store_ordinary_operation_vip', //普通成员操作权限
]; //需要验证的权限id集合
return [
'verify_id_arr' => $verify_id_arr,
'arr' => $arr
];
}
/**
* 新增权限后,给系统角色补充权限
* @param $user_type 用户类型
* @param $jur_str 权限字符集,逗号拼接
*/
public function updateSystemUserAuth($user_type, $jur_str)
{
if (!in_array($user_type, ['2', '3', '4', '5', '6']) || !$jur_str) return;
$map = [
'u.state' => 1,
'u.user_type' => $user_type,
];
$list = M('jurisdiction_user as u')
->join('ls_jurisdiction_group as g ON u.jurisdiction_group_id=g.id')
->where($map)->field('g.id,g.jurisdiction_id')
->group('u.jurisdiction_group_id')->select();
foreach ($list as $value) {
$jur = $value['jurisdiction_id'] ? ($value['jurisdiction_id'] . ',' . $jur_str) : $jur_str;
$jur = explode(',', $jur);
$jur = array_flip($jur);
$jur = array_flip($jur);
sort($jur);
$save = [
'jurisdiction_id' => implode(',', $jur),
];
M('jurisdiction_group')->where(['id' => $value['id']])->save($save);
}
}
/**
* 重置系统角色用户权限为初始状态
* @param $param
* $param['operator_id'] 操作的用户在权限用户表的ID
* $param['next_id'] 下级用户对应的表的ID(operate_type==1:权限组表的ID;operate_type==2:代理商/商户/门店/导购员/收银员表ID)
* $param['next_user_type'] 子集所属后台角色功能类型/下级用户类型 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* @return mixed
*/
public function resetUserRole($param)
{
$JurUserModel = new JurisdictionUserModel();
$StoreModel = new RetailStoreModel();
switch ($param['next_user_type']) {
case 2:
case 3:
case 5:
case 6:
//代理商 商户 导购员 收银员
$next_group_id = $JurUserModel->getFindField([
'user_type' => $param['next_user_type'],
'system_user_id' => $param['next_id']
], 'jurisdiction_group_id');
break;
case 4:
//门店
$next_group_id = $StoreModel->getFindField(['id' => $param['next_id']], 'jur_group_id');
break;
default:
$next_group_id = 0;
}
if (empty($next_group_id)) {
return callBack(statusCode()['error'], '操作有误');
}
$JurGroupModel = new JurisdictionGroupModel();
//获取用户类型该有的所有权限
$after_str = $JurGroupModel->getFindField(['id' => $param['next_user_type']], 'jurisdiction_id');
//获取用户原有权限
$before_jur = $JurGroupModel->getFindField(['id' => $next_group_id], 'jurisdiction_id');
//更新用户权限
M()->startTrans();
$update = $JurGroupModel->updateOrder(['id' => $next_group_id], ['jurisdiction_id' => $after_str]);
if ($update) {
//添加权限操作记录
$record = [
'add_time' => time(),
'operator_id' => $param['operator_id'],
'jur_group_id' => $next_group_id,
'before_jur_id' => $before_jur,
'after_jur_id' => $after_str,
'details' => '重置权限',
];
$JurRecordModel = new JurisdictionRecordModel();
$add_record = $JurRecordModel->addOrder($record);
if ($add_record) {
M()->commit();
return callBack(statusCode()['success'], '操作成功');
} else {
M()->rollback();
return callBack(statusCode()['error'], '保存失败');
}
} else {
return callBack(statusCode()['error'], '操作失败');
}
}
/**************************以下为私有方法****************************/
/**
* 数组转换为树型数据
* @param array $array 需要转换的数组
* @param array &$checkIds 选中的唯一值列表(处理成为仅有最底级的唯一值数组),空数组则不处理
* @param string $pkName 唯一值的字段名
* @param string $pIdName 与唯一值进行关联的字段名
* @param string $childName 定义子集的名称
* @return array
*/
function generateTree($array = [], &$checkIds = [], $pkName = 'id', $pIdName = 'pid', $childName = 'children')
{
//第一步 构造数据
$new_check = array_flip($checkIds);
$items = array_column($array, null, $pkName);
//第二步 遍历构造的数据
$tree = [];
$len = count($checkIds);
foreach ($items as $key => $value) {
//如果$pIdName这个节点存在
if (isset($items[$value[$pIdName]])) {
//把当前的$value放到$pIdName节点的$childName中 注意 这里传递的是引用 因为当对items做更改时,tree数组中的相对应的值也一并做了更改
$items[$value[$pIdName]][$childName][] = &$items[$key];
//删除已选唯一值列表中的父级
if ($len > 0 && isset($new_check[$items[$value[$pIdName]][$pkName]])) {
unset($new_check[$items[$value[$pIdName]][$pkName]]);
}
} else {
$tree[] = &$items[$key];
}
}
$checkIds = [];
foreach ($new_check as $k => $v) {
$checkIds[] = $k;
}
return $tree;
}
/**
* 处理实际需要保存的ID列表
* @param $data 前台传输的ID对应的数据列表
* @param $ids 当前已保存的ID列表
* @param int $type 获取类型 0上下级都需要查询 1往上查询 2往下查询
* @param string $fields 读取的字段
* @param array $map 读取字段的条件
*/
function getActualCheckIds($data, &$ids, $type = 0, $map = [])
{
$JurListModel = new JurisdictionListModel();
foreach ($data as $value) {
if (($type == 0 || $type == 1) && $value['pid'] > 0) {
//查找上一级
if (isset($map['pid'])) unset($map['pid']);
$map['id'] = $value['pid'];
$tempList = $JurListModel->getFind($map, 'id,pid');
if (!empty($tempList)) $this->getActualCheckIds([$tempList], $ids, 1, $map);
}
if ($type == 0 || $type == 2 && !in_array($value['id'], $ids)) {
//查找下一级
if (isset($map['id'])) unset($map['id']);
$map['pid'] = $value['id'];
$tempList = $JurListModel->getSelect($map, 'id,pid');
if (!empty($tempList)) $this->getActualCheckIds($tempList, $ids, 2, $map);
}
if (!in_array($value['id'], $ids)) {
$ids[] = $value['id'];
}
}
}
/**
* 获取操作用户权限的名称集合
* @param $tree
* @param array $details
* @param string $str
*/
function getOperateContent($tree, &$details = [], $str = '')
{
foreach ($tree as $value) {
if (isset($value['children'])) {
$this->getOperateContent($value['children'], $details, $str . $value['name'] . '-');
} else {
$details[] = $str . $value['name'];
}
}
}
/**
* 删除子集权限
* @param $group_id 权限组的ID列表
* @param $del_jur 被删除的ID数组
* @return bool
*/
function delChildJur($group_id, $del_jur)
{
$JurGroupModel = new JurisdictionGroupModel();
//1.2 获取子集权限组列表数据
$group_list = $JurGroupModel->getSelect(['id' => ['in', $group_id]], 'id,jurisdiction_id');
//1.3 删除子集权限组列表中父级被删除的数据
foreach ($group_list as $value) {
$jur_id_str = $this->delArrKey($value['jurisdiction_id'], $del_jur);
if ($jur_id_str != $value['jurisdiction_id']) {
$update = $JurGroupModel->updateOrder(['id' => $value['id']], ['jurisdiction_id' => $jur_id_str]);
if (!$update) {
return false;
}
}
}
return true;
}
/**
* 去除被删除的ID列表
* @param $arrayStr 当前权限ID列表
* @param $delArr 被删除的权限ID列表
* @param bool $get_string 是否返回字符串
* @return string
*/
function delArrKey($arrayStr, $delArr, $get_string = true)
{
//字符串转数组
$array = is_array($arrayStr) ? $arrayStr : explode(',', $arrayStr);
//取出需要删除的ID及下标列表
$intersect = array_intersect($array, $delArr);
if (!empty($intersect)) {
foreach ($intersect as $k => $val) {
unset($array[$k]);
}
//数组顺序还原
$tempArr = [];
foreach ($array as $val) {
$tempArr[] = $val;
}
$array = $tempArr;
}
return $get_string ? implode(',', $array) : $array;
}
function handleOutMenuAuth($list)
{
$JurListModel = new JurisdictionListModel();
$tempList = [];
foreach ($list as &$value) {
if (empty($value['children'])) {
$child_menu = $JurListModel->getFindField(['pid' => $value['id'], 'is_menu' => 1], 'id');
if (empty($child_menu)) $tempList[] = $value;
} else {
$temp = $this->handleOutMenuAuth($value['children']);
if (!empty($temp)) {
$value['children'] = $temp;
$tempList[] = $value;
}
}
}
return $tempList;
}
/**
* 验证请求参数
* @param $param
* $param['operate_type'] 获取类型 1详细的节点 2菜单栏
* $param['group_id'] 自己权限的分组的列表的ID
* $param['operator_id'] 操作的用户在权限用户表的ID
* $param['next_user_type'] 子集所属后台角色功能类型/下级用户类型 1合伙人 2代理商 3商户 4门店 5导购员 6收银员
* $param['next_id'] 下级用户对应的表的ID(operate_type==1:权限组表的ID;operate_type==2:代理商/商户/门店/导购员/收银员表ID)
* @return bool
*/
function verifyParam($param)
{
$role = [
'operate_type' => ['type' => 'number', 'in' => [1, 2]],
'operator_id' => ['type' => 'string'],
'group_id' => ['required' => $param['operate_type'] == 1 ? true : false, 'type' => 'number'],
'next_id' => ['required' => $param['operate_type'] == 2 ? true : false, 'type' => 'string'],
'next_user_type' => ['in' => $param['operate_type'] == 2 ? [2, 3, 4, 5, 6] : [1, 2, 3, 4, 5, 6]],
];
$CustomValidate = new CustomValidate([
'operate_type' => '获取类型',
'group_id' => '权限组ID',
'next_id' => $param['operate_type'] == 2 ? '下级用户ID' : '权限组ID',
'operator_id' => '操作者ID',
'next_user_type' => '下级用户类型',
]);
$result = $CustomValidate->validate($param, $role);
if ($result['error'] == 1) {
$this->errMsg = $result['message'];
return false;
}
return true;
}
}