门店管理->门店的使用限制 * 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; } }