799 lines
31 KiB
PHP
799 lines
31 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
*
|
|
*
|
|
*
|
|
* Date: 2021/9/22
|
|
* Time: 13:37
|
|
*/
|
|
|
|
|
|
namespace business\common\services;
|
|
|
|
use app\backend\modules\member\models\Member;
|
|
use business\common\models\Department;
|
|
use business\common\models\DepartmentStaff;
|
|
use business\common\models\Staff;
|
|
use business\common\models\StaffTicket;
|
|
use Exception;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Redis;
|
|
use Yunshop\WorkWechat\common\models\Employee;
|
|
|
|
class StaffService
|
|
{
|
|
|
|
|
|
/*
|
|
* 校验成员管理权限
|
|
*/
|
|
public static function checkManageRightByKey($function, $staff_id, $department_id_list)
|
|
{
|
|
$function_arr = [
|
|
'updateStaff' => '编辑',
|
|
'createStaff' => '创建',
|
|
'deleteStaff' => '禁用'
|
|
];
|
|
|
|
$right = BusinessService::checkBusinessRight();
|
|
|
|
if ($right['identity'] > 1) {
|
|
return ['result' => 1, 'msg' => '管理员权限无需校验'];
|
|
}
|
|
|
|
if (!$right_department_id = $right['route_department_id'][$function]) {
|
|
return ['result' => 0, 'msg' => '无权' . $function_arr[$function] . '员工'];
|
|
}
|
|
|
|
$isset_department_id = DepartmentStaff::where('staff_id', $staff_id)->pluck('department_id')->toArray();
|
|
$department_list = array_column(Department::business()->get()->toArray(), null, 'id');
|
|
|
|
if ($function == 'updateStaff' || $function == 'deleteStaff') {
|
|
if (empty(array_intersect($right_department_id, $isset_department_id))) {
|
|
return ['result' => 0, 'msg' => '无权' . $function_arr[$function] . '当前员工'];
|
|
}
|
|
}
|
|
|
|
if (($function == 'updateStaff' && request()->is_edit == 1) || $function == 'createStaff') {
|
|
$add_department_id = array_diff($department_id_list, $isset_department_id);
|
|
$delete_department_id = array_diff($isset_department_id, $department_id_list);
|
|
|
|
if ($add_diff_id = array_diff($add_department_id, $right_department_id)) {
|
|
foreach ($add_diff_id as $v) {
|
|
if (!$department_list[$v]) {
|
|
continue;
|
|
} else {
|
|
return ['result' => 0, 'msg' => '无权将当前员工加入' . $department_list[$v]['name']];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($delete_diff_id = array_diff($delete_department_id, $right_department_id)) {
|
|
foreach ($delete_diff_id as $v) {
|
|
if (!$department_list[$v]) {
|
|
continue;
|
|
} else {
|
|
return ['result' => 0, 'msg' => '无权将当前员工移出' . $department_list[$v]['name']];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return ['result' => 1, 'msg' => '校验通过'];
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* 禁用/解禁部门成员
|
|
*/
|
|
public static function deleteStaff($staff_id, $disabled = 1)
|
|
{
|
|
try {
|
|
|
|
if (!$staff_id) {
|
|
throw new Exception('请选择要禁用的员工');
|
|
}
|
|
|
|
$where[] = is_array($staff_id) ? [function ($query) use ($staff_id) {
|
|
$query->whereIn('id', $staff_id);
|
|
}] : ['id', $staff_id];
|
|
$count = is_array($staff_id) ? count($staff_id) : 1;
|
|
$staff = Staff::business()->where($where)->get();
|
|
$clean_member_id = [];
|
|
|
|
if ($staff->count() != $count) {
|
|
throw new Exception('员工不存在');
|
|
}
|
|
|
|
DB::beginTransaction();
|
|
$staff->each(function ($v) use ($disabled, &$clean_member_id) {
|
|
if ($v->uid) $clean_member_id[] = $v->uid;
|
|
Staff::where('id', $v->id)->update(['disabled' => $disabled]);
|
|
});
|
|
|
|
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
return self::returnArr(0, $e->getMessage());
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
if ($clean_member_id) {
|
|
BusinessService::flush(0, $clean_member_id); //清除会员缓存
|
|
}
|
|
return self::returnArr(1, '禁用成功');
|
|
}
|
|
|
|
/*
|
|
* 设置部门领导
|
|
*/
|
|
public static function setStaffLeader($department_id, $staff_id = [])
|
|
{
|
|
try {
|
|
|
|
if (!$department = Department::business()->find($department_id)) {
|
|
throw new Exception('部门不存在');
|
|
}
|
|
|
|
|
|
$where = [
|
|
['department_id', $department->id],
|
|
['is_leader', 1]
|
|
];
|
|
|
|
if ($staff_id) {
|
|
$staff_arr = DepartmentStaff::business()->where('department_id', $department->id)
|
|
->whereIn('staff_id', $staff_id)
|
|
->with('hasOneStaff')
|
|
->groupBy('staff_id', 'department_id')
|
|
->get()->toArray();
|
|
|
|
if (count($staff_arr) != count($staff_id)) {
|
|
throw new Exception('存在员工未加入此部门');
|
|
}
|
|
|
|
$where[] = [function ($query) use ($staff_id) {
|
|
$query->whereNotIn('staff_id', $staff_id);
|
|
}];
|
|
}
|
|
$msg = [];
|
|
|
|
if ($department->wechat_department_id && SettingService::EnabledQyWx()) {
|
|
|
|
$delete_staff = DepartmentStaff::business()->where($where)->with('hasOneStaff')->get()->toArray();
|
|
if ($delete_staff) {
|
|
foreach ($delete_staff as $v) {
|
|
if (empty($v['has_one_staff']['status'])) {
|
|
continue;
|
|
}
|
|
DB::beginTransaction();
|
|
DepartmentStaff::where('id', $v['id'])->update(['is_leader' => 0]);
|
|
$res = self::pushStaff($v['staff_id']);
|
|
if (!$res['result']) {
|
|
DB::rollBack();
|
|
$msg[] = '员工' . $v['has_one_staff']['name'] . '企业微信推送,' . $res['msg'];
|
|
continue;
|
|
}
|
|
DB::commit();
|
|
}
|
|
}
|
|
|
|
foreach ($staff_arr as $v) {
|
|
if (empty($v['has_one_staff']['status'])) {
|
|
$msg[] = "员工{$v['has_one_staff']['name']}未与企业微信同步";
|
|
continue;
|
|
}
|
|
DB::beginTransaction();
|
|
DepartmentStaff::where('id', $v['id'])->update(['is_leader' => 1]);
|
|
$res = self::pushStaff($v['staff_id']);
|
|
if (!$res['result']) {
|
|
DB::rollBack();
|
|
$msg[] = '员工' . $v['has_one_staff']['name'] . '企业微信推送,' . $res['msg'];
|
|
continue;
|
|
}
|
|
DB::commit();
|
|
}
|
|
|
|
if ($msg) {
|
|
throw new Exception(implode(',', $msg));
|
|
}
|
|
} else {
|
|
DepartmentStaff::business()->where($where)->update(['is_leader' => 0]);
|
|
DepartmentStaff::business()->whereIn('staff_id', $staff_id)->where('department_id', $department->id)->update(['is_leader' => 1]);
|
|
}
|
|
} catch (Exception $e) {
|
|
return self::returnArr(0, $e->getMessage());
|
|
}
|
|
|
|
BusinessService::flush(SettingService::getBusinessId()); //清除企业缓存
|
|
return self::returnArr(1, '设置部门领导成功');
|
|
}
|
|
|
|
|
|
/*
|
|
* 创建/编辑 员工
|
|
*/
|
|
public static function changeStaff($data)
|
|
{
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
|
|
$business_id = SettingService::getBusinessId();
|
|
|
|
if (!$data->mobile || !$data->name) {
|
|
throw new Exception('手机、姓名不能为空');
|
|
}
|
|
|
|
$staff = null;
|
|
if ($data->id && (!$staff = Staff::business()->find($data->id))) {
|
|
throw new Exception('员工不存在');
|
|
}
|
|
|
|
if ($data->uid) {
|
|
if (!$member = Member::uniacid()->find($data->uid)) {
|
|
throw new Exception('系统会员不存在');
|
|
}
|
|
if (!$member->mobile) {
|
|
throw new Exception('系统会员未绑定手机号');
|
|
}
|
|
if ($data->mobile != $member->mobile) {
|
|
throw new Exception('系统会员手机号与员工手机号不一致');
|
|
}
|
|
}
|
|
|
|
/*判断是否有手机号或绑定系统会员冲突的员工*/
|
|
$where = [
|
|
['business_id', $business_id],
|
|
[function ($query) use ($member) {
|
|
$query->where('uid', $member->uid)->orWhere('mobile', $member->mobile);
|
|
}],
|
|
];
|
|
if ($staff) {
|
|
$where[] = ['id', '<>', $staff->id];
|
|
}
|
|
$isset_staff = Staff::uniacid()->where($where)->first();
|
|
|
|
if ($isset_staff) {
|
|
throw new Exception($isset_staff->uid == $member->uid ? '系统会员已经绑定其他员工' : '系统会员手机号与已存在员工重复');
|
|
}
|
|
/*判断是否有手机号或绑定系统会员冲突的员工*/
|
|
|
|
$name = trim($data->name);
|
|
$user_id = $staff ? $staff->user_id : self::overTrue($name, 21) . '_' . time();
|
|
$update_data = [
|
|
'user_id' => $user_id,
|
|
'name' => $name ?: '',
|
|
'uid' => $member->uid,
|
|
'mobile' => $member->mobile ?: '',
|
|
'position' => trim($data->position) ?: '',
|
|
'gender' => in_array($data->gender, [0, 1, 2]) ?: 0,
|
|
'telephone' => trim($data->telephone) ?: '',
|
|
'email' => trim($data->email) ?: '',
|
|
'avatar' => $data->avatar ?: '',
|
|
'alias' => $data->alias ?: '',
|
|
'address' => $data->address ?: '',
|
|
'open_userid' => $business_id . '_' . $user_id,
|
|
];
|
|
|
|
if ($staff) {
|
|
if (SettingService::EnabledQyWx() && !in_array($staff->status, [0, 4]) && $staff->mobile != $update_data['mobile']) {
|
|
throw new Exception('该成员已激活企业微信,需自行修改手机号');
|
|
}
|
|
$staff->fill($update_data);
|
|
$staff->save();
|
|
} else {
|
|
$staff = Staff::create(array_merge($update_data, [
|
|
'uniacid' => \YunShop::app()->uniacid,
|
|
'business_id' => $business_id,
|
|
]));
|
|
}
|
|
|
|
if (!$department_id = is_array($data->department_id) && $data->department_id ? $data->department_id : []) {
|
|
throw new Exception('请选择成员所属部门');
|
|
}
|
|
|
|
$department_list = Department::business()->get();
|
|
if ($department_list->whereIn('id', $department_id)->isEmpty()) {
|
|
throw new Exception('请选择有效部门');
|
|
}
|
|
|
|
$department_staff_list = DepartmentStaff::uniacid()->where('staff_id', $staff->id)->get()->toArray();
|
|
$department_list = $department_list->isNotEmpty() ? array_column($department_list->toArray(), null, 'id') : [];
|
|
$department_staff_list = $department_staff_list ? array_column($department_staff_list, null, 'department_id') : [];
|
|
|
|
foreach ($department_id as $k => $v) {
|
|
|
|
if (!$this_department = $department_list[$v]) {
|
|
throw new Exception('部门不存在');
|
|
}
|
|
|
|
if (!$this_department_staff = $department_staff_list[$this_department['id']]) {
|
|
DepartmentStaff::create([
|
|
'uniacid' => \YunShop::app()->uniacid,
|
|
'staff_id' => $staff->id,
|
|
'business_id' => $business_id,
|
|
'department_id' => $this_department['id'],
|
|
'is_leader' => 0,
|
|
'sort' => 1,
|
|
]);
|
|
}
|
|
}
|
|
|
|
foreach ($department_staff_list as $v) {
|
|
if (!in_array($v['department_id'], $department_id) || !isset($department_list[$v['department_id']])) {
|
|
DepartmentStaff::where('id', $v['id'])->delete();
|
|
}
|
|
}
|
|
|
|
//企业微信开启 并且 员工不是未关联且被禁用 时,进行同步
|
|
if (SettingService::EnabledQyWx() && ($staff->disabled != 1)) {
|
|
$push_res = self::pushStaff($staff->id);
|
|
if (!$push_res['result']) {
|
|
throw new Exception($push_res['msg']);
|
|
}
|
|
if ($staff->status == 0) {
|
|
$staff->status = 4;
|
|
$staff->save();
|
|
}
|
|
}
|
|
|
|
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
return self::returnArr(0, $e->getMessage());
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
if ($staff->uid) {
|
|
BusinessService::flush(0, $staff->uid);
|
|
}
|
|
|
|
return self::returnArr(1, '成功', ['staff' => $staff]);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* 推送成员信息到企业微信
|
|
*/
|
|
public static function pushStaff($staff_id)
|
|
{
|
|
|
|
try {
|
|
|
|
if (!SettingService::EnabledQyWx()) {
|
|
throw new Exception('未开启企业微信同步');
|
|
}
|
|
|
|
$staff = Staff::business()
|
|
->with(['hasManyDepartmentStaff' => function ($query) {
|
|
$query->with('hasOneDepartment');
|
|
}])->find($staff_id);
|
|
|
|
if (!$staff) {
|
|
throw new Exception('员工不存在');
|
|
}
|
|
|
|
$department_id_arr = [];
|
|
$department_order_arr = [];
|
|
$department_leader_arr = [];
|
|
|
|
if ($staff->hasManyDepartmentStaff->isNotEmpty()) {
|
|
$staff->hasManyDepartmentStaff->each(function ($v) use (&$department_id_arr, &$department_order_arr, &$department_leader_arr) {
|
|
if ($v->hasOneDepartment->wechat_department_id) {
|
|
$department_id_arr[] = $v->hasOneDepartment->wechat_department_id;
|
|
$department_order_arr[] = intval($v->order) ?: 1;
|
|
$department_leader_arr[] = $v->is_leader ? 1 : 0;
|
|
}
|
|
});
|
|
}
|
|
|
|
$request_data = Staff::getQyWxStaff($staff, $department_id_arr, $department_order_arr, $department_leader_arr);
|
|
|
|
$res = (new QyWechatRequestService())->request($staff->status == 0 ? 'createMember' : 'updateMember', $request_data);
|
|
if (!$res['result']) {
|
|
throw new Exception($res['msg']);
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
return self::returnArr(0, $e->getMessage());
|
|
}
|
|
|
|
return self::returnArr(1, '推送成员成功');
|
|
}
|
|
|
|
|
|
/*
|
|
* 从企业微信同步成员
|
|
*/
|
|
public static function refreshStaff($department_id = 0, $staff_id = 0, $wechat_user_id = '')
|
|
{
|
|
if (!$business_id = SettingService::getBusinessId()) {
|
|
return self::returnArr(0, '请先选择要管理的企业');
|
|
}
|
|
|
|
$res = self::getWechatStaffList($department_id, $staff_id, $wechat_user_id);
|
|
|
|
if (!$res['result']) {
|
|
return $res;
|
|
}
|
|
$staff_list = $res['data'];
|
|
|
|
$wechat_department = Department::getWechatBusinessDepartment($business_id); //获取该企业已经关联企业微信部门
|
|
|
|
//获取员工与企业微信部门的关联信息
|
|
$department_staff_list = $wechat_department->isNotEmpty() ? DepartmentStaff::uniacid()->select('staff_id', 'department_id', 'is_leader')->whereIn('department_id', array_column($wechat_department->toArray(), 'id'))->get() : collect((object)[]);
|
|
$department_staff_list = $department_staff_list->map(function ($v) use ($wechat_department) {
|
|
if ($this_department_staff = $wechat_department->where('id', $v->department_id)->first()) {
|
|
$v->wechat_department_id = $this_department_staff->wechat_department_id;
|
|
}
|
|
return $v;
|
|
});
|
|
$user_id_list = [];
|
|
|
|
// $isset_staff = Staff::business()->get(); //获取该企业已经存在的员工
|
|
if ($staff_list) {
|
|
$insert_data = [];
|
|
$mobile_list = Member::uniacid()->select('uid', 'mobile')->whereIn('mobile', array_values(array_filter(array_column($staff_list, 'mobile'))))->get()->toArray();
|
|
$mobile_list = $mobile_list ? array_column($mobile_list, 'uid', 'mobile') : [];
|
|
$time = time();
|
|
$extra_columns = ['address', 'mobile', 'email', 'avatar', 'qr_code'];
|
|
foreach ($staff_list as $k => $v) {
|
|
$user_id_list[] = $v['userid'];
|
|
$form_data = self::formWechatStaff($business_id, $v);
|
|
if ($mobile_list[$v['mobile']]) {
|
|
$form_data['uid'] = $mobile_list[$v['mobile']];
|
|
}
|
|
//如果存在user_id相同的员工
|
|
$this_staff = Staff::business()->where('user_id', $v['userid'])->first();
|
|
if (!$this_staff && $v['mobile']) {
|
|
//如果存在手机号相同的员工
|
|
$this_staff = Staff::business()->where('mobile', $v['mobile'])->first();
|
|
}
|
|
|
|
if ($this_staff) {
|
|
if (self::checkRepeatStaff($form_data['uid'], $this_staff->id)) {
|
|
$form_data['uid'] = 0;
|
|
}
|
|
foreach ($extra_columns as $ec) {
|
|
if ($this_staff->$ec && !$form_data[$ec]) {
|
|
unset($form_data[$ec]);
|
|
}
|
|
}
|
|
$this_staff->fill($form_data);
|
|
$this_staff->save();
|
|
} else { //否则新建员工
|
|
foreach ($extra_columns as $ec) {
|
|
$form_data[$ec] = $form_data[$ec] ?: '';
|
|
}
|
|
$form_data['mobile'] = $form_data['mobile'] ?: '';
|
|
$form_data['email'] = $form_data['email'] ?: '';
|
|
$key = 'create_staff_' . $form_data['business_id'] . '_' . $form_data['user_id'];
|
|
if (Redis::setnx($key, 1)) {
|
|
Redis::expire($key, 10);
|
|
} else {
|
|
continue;
|
|
}
|
|
$form_data['uniacid'] = \YunShop::app()->uniacid;
|
|
$form_data['uid'] = self::getConnectionMember($form_data, 1);
|
|
$form_data['mobile'] = $form_data['mobile'] ?: '';
|
|
$this_staff = Staff::create($form_data);
|
|
}
|
|
|
|
$delete_department_id = [];
|
|
|
|
//获取该员工的部门关联
|
|
$this_department_staff_list = $department_staff_list->isNotEmpty() ? $department_staff_list->where('staff_id', $this_staff->id)->toArray() : [];
|
|
|
|
/*如果存在本地与微信部门关联,但返回的信息中不存在的,删除关联*/
|
|
foreach ($this_department_staff_list as $vv) {
|
|
if (in_array($vv['wechat_department_id'], $v['department'])) {
|
|
continue;
|
|
}
|
|
if ($this_delete_department = $wechat_department->where('wechat_department_id', $vv['wechat_department_id'])->first()) {
|
|
$delete_department_id[] = $this_delete_department->id;
|
|
}
|
|
}
|
|
if ($delete_department_id) {
|
|
DepartmentStaff::where('staff_id', $this_staff->id)->whereIn('department_id', $delete_department_id)->delete();
|
|
}
|
|
/*如果存在本地与微信部门关联,但返回的信息中不存在的,删除关联*/
|
|
|
|
//获取该员工本地已存在的微信部门关联
|
|
$this_isset_department_id = $this_department_staff_list ? array_column($this_department_staff_list, null, 'wechat_department_id') : [];
|
|
/*如果员工信息中存在 本地存在的微信部门 并且 未与员工关联的部门 ,新增关联*/
|
|
foreach ($v['department'] as $kk => $vv) {
|
|
if (in_array($vv, array_keys($this_isset_department_id))) {
|
|
if ($this_isset_department_id[$vv]['is_leader'] != $v['is_leader_in_dept'][$kk]) {
|
|
DepartmentStaff::uniacid()->where('department_id', $this_isset_department_id[$vv]['department_id'])->where('staff_id', $this_staff->id)->update(['is_leader' => $v['is_leader_in_dept'][$kk] ? 1 : 0]);
|
|
}
|
|
continue;
|
|
}
|
|
if ($this_insert_department = $wechat_department->where('wechat_department_id', $vv)->first()) {
|
|
$insert_data[] = [
|
|
'uniacid' => \YunShop::app()->uniacid,
|
|
'business_id' => $business_id,
|
|
'staff_id' => $this_staff->id,
|
|
'department_id' => $this_insert_department->id,
|
|
'is_leader' => $v['is_leader_in_dept'][$kk] ? 1 : 0,
|
|
'sort' => intval($v['order'][$kk]),
|
|
'created_at' => $time,
|
|
'updated_at' => $time,
|
|
];
|
|
}
|
|
}
|
|
/*如果员工信息中存在 本地存在的微信部门 并且 未与员工关联的部门 ,新增关联*/
|
|
}
|
|
|
|
if ($insert_data) {
|
|
$insert_data = array_chunk($insert_data, 2000);
|
|
foreach ($insert_data as $v) {
|
|
DepartmentStaff::insert($v);
|
|
}
|
|
}
|
|
}
|
|
|
|
self::cleanWechatDepartemntStaff($department_id, $user_id_list); //清除无关联员工
|
|
BusinessService::flush(SettingService::getBusinessId()); //清除企业缓存
|
|
return self::returnArr(1, '同步企业微信员工成功');
|
|
|
|
}
|
|
|
|
/*
|
|
* 检测是否有重复绑定商城会员
|
|
*/
|
|
public static function checkRepeatStaff($uid, $expect_staff_id)
|
|
{
|
|
if ($uid == 0) return false;
|
|
return Staff::business()->where('uid', $uid)->where('id', '<>', $expect_staff_id)->first();
|
|
}
|
|
|
|
/*
|
|
* 清除无关企业微信部门员工
|
|
*/
|
|
public static function cleanWechatDepartemntStaff($department_id, $user_id_list)
|
|
{
|
|
if (!$department_id) return;
|
|
if (!$staff_id = DepartmentStaff::where('department_id', $department_id)->groupBy('staff_id')->pluck('staff_id')->toArray()) return;
|
|
|
|
// $sub_department_id = Department::getAllDepartmentSubId([$department_id]);
|
|
$where = [
|
|
['uniacid', \YunShop::app()->uniacid],
|
|
['business_id', SettingService::getBusinessId()],
|
|
['status', '<>', 0],
|
|
[function ($query) use ($staff_id) {
|
|
$query->whereIn('id', $staff_id);
|
|
}]
|
|
];
|
|
if ($user_id_list) {
|
|
$where[] = [function ($query) use ($user_id_list) {
|
|
$query->whereNotIn('user_id', $user_id_list);
|
|
}];
|
|
}
|
|
|
|
$staff_id_list = Staff::where($where)->pluck('id')->toArray();
|
|
if ($staff_id_list) { // 禁用会员中关联了部门且关联了企业微信,但企业微信返回数据中不存在的员工
|
|
DepartmentStaff::whereIn('staff_id', $staff_id_list)->where('department_id', $department_id)->delete();
|
|
$isset_staff_id_list = DepartmentStaff::whereIn('staff_id', $staff_id_list)->groupBy('staff_id')->pluck('staff_id')->toArray();
|
|
if ($delete_staff_id = array_diff($staff_id_list, $isset_staff_id_list)) { //禁用无部门归属的员工
|
|
Staff::whereIn('id', $delete_staff_id)->update(['disabled' => 1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* 获取微信员工列表
|
|
*/
|
|
public static function getWechatStaffList($department_id, $staff_id, $wechat_user_id)
|
|
{
|
|
$class = new QyWechatRequestService();
|
|
if ($department_id) { //更新全部员工
|
|
$department = Department::business()->find($department_id);
|
|
if (!$department->wechat_department_id) {
|
|
return self::returnArr(0, '该部门未与企业微信关联');
|
|
}
|
|
$res = $class->request('getStaffDetailList', ['department_id' => $department->wechat_department_id]);
|
|
if (!$res['result']) {
|
|
return self::returnArr(0, $res['msg']);
|
|
}
|
|
$staff_list = $res['data']['userlist'];
|
|
} elseif ($staff_id) { //更新指定id员工
|
|
if (!$staff = Staff::business()->find($staff_id)) {
|
|
return self::returnArr(0, '员工不存在');
|
|
}
|
|
$res = $class->request('getStaffDetail', ['userid' => $staff->user_id]);
|
|
if (!$res['result']) {
|
|
return self::returnArr(0, $res['msg']);
|
|
}
|
|
$staff_list = [$res['data']];
|
|
} elseif ($wechat_user_id) { //更新指定userid员工
|
|
$res = $class->request('getStaffDetail', ['userid' => $wechat_user_id]);
|
|
if (!$res['result']) {
|
|
return self::returnArr(0, $res['msg']);
|
|
}
|
|
$staff_list = [$res['data']];
|
|
} else {
|
|
return self::returnArr(0, '请选择要同步的部门或员工');
|
|
}
|
|
|
|
return self::returnArr(1, '成功', $staff_list);
|
|
}
|
|
|
|
|
|
/*
|
|
* 获取可能跟员工相关联的商城会员
|
|
*/
|
|
public static function getConnectionMember($wechat_staff, $check_isset = 1)
|
|
{
|
|
$uid = 0;
|
|
|
|
if (app('plugins')->isEnabled('work-wechat')) { //判断旧雇员表是否有相关数据
|
|
$old_staff = Employee::uniacid()->with('hasOneMember')
|
|
->where('crop_id', SettingService::getBusinessId())
|
|
->where('userid', $wechat_staff['user_id'])
|
|
->first();
|
|
if ($old_staff->hasOneMember->uid) {
|
|
$uid = $old_staff->hasOneMember->uid;
|
|
}
|
|
}
|
|
|
|
if (!$uid && $wechat_staff['mobile']) { //判断商城会员是否有手机号关联会员
|
|
if ($member = Member::uniacid()->where('mobile', $wechat_staff['mobile'])->first()) $uid = $member->uid;
|
|
}
|
|
|
|
|
|
if ($uid && $check_isset) { //判断是否有重复绑定商城会员的员工
|
|
if (Staff::business()->where('uid', $uid)->first()) $uid = 0;
|
|
}
|
|
|
|
return $uid;
|
|
}
|
|
|
|
|
|
/*
|
|
* 组装企业微信员工数据
|
|
*/
|
|
public static function formWechatStaff($business_id, $v)
|
|
{
|
|
;
|
|
//企业微信隐私数据限制
|
|
if (!isset($v['mobile']) && ($ticket = StaffTicket::uniacid()->business($business_id)->userId($v['userid'])->orderBy('id', 'DESC')->first())) {
|
|
$res = (new QyWechatRequestService($business_id))->request('getUserDetail', ['user_ticket' => $ticket->ticket]);
|
|
if ($res['result']) {
|
|
$columns = ['gender', 'avatar', 'qr_code', 'mobile', 'email', 'address'];
|
|
foreach ($columns as $column) {
|
|
if ($res['data'][$column]) {
|
|
$v[$column] = $res['data'][$column];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return [
|
|
'business_id' => $business_id,
|
|
'user_id' => $v['userid'],
|
|
'name' => $v['name'],
|
|
'mobile' => $v['mobile'],
|
|
'position' => $v['position'] ?: '',
|
|
'gender' => $v['gender'] ?: 0,
|
|
'telephone' => $v['telephone'] ?: '',
|
|
'email' => $v['email'] ?: '',
|
|
'avatar' => $v['avatar'] ?: '',
|
|
'alias' => $v['alias'] ?: '',
|
|
'status' => $v['status'],
|
|
'qr_code' => $v['qr_code'] ?: '',
|
|
'address' => $v['address'] ?: '',
|
|
'open_userid' => $business_id . '_' . $v['userid'],
|
|
'main_department' => $v['main_department'] ?: '',
|
|
];
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* 为员工列表添加权限数据
|
|
*/
|
|
public static function addStaffPremission(&$data)
|
|
{
|
|
$right_arr = BusinessService::checkBusinessRight();
|
|
$function_arr = ['updateStaff', 'deleteStaff'];
|
|
if ($right_arr['identity'] < 2) {
|
|
$department_staff = DepartmentStaff::whereIn('staff_id', array_column($data, 'staff_id'))->get();
|
|
}
|
|
// $array = ['']
|
|
foreach ($data as &$v) {
|
|
$v['premission']['setAuth'] = $right_arr['identity'] < 2 ? 0 : 1;
|
|
foreach ($function_arr as $vv) {
|
|
if ($right_arr['identity'] > 1) {
|
|
$v['premission'][$vv] = 1;
|
|
} elseif (!$right_arr['route_department_id'][$vv]) {
|
|
$v['premission'][$vv] = 0;
|
|
} elseif ($department_staff->where('staff_id', $v['staff_id'])->whereIn('department_id', $right_arr['route_department_id'][$vv])->isNotEmpty()) {
|
|
$v['premission'][$vv] = 1;
|
|
} else {
|
|
$v['premission'][$vv] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* 获取员工列表
|
|
*/
|
|
public static function getStaffList($department_id, $data = [])
|
|
{
|
|
$where = [];
|
|
if (is_array($department_id)) {
|
|
$where[] = [function ($query) use ($department_id) {
|
|
$query->whereIn('department_id', $department_id);
|
|
}];
|
|
} else {
|
|
$where[] = ['department_id', $department_id];
|
|
}
|
|
|
|
$staff_where = [];
|
|
if ($kwd = $data['kwd']) {
|
|
$staff_where[] = [function ($q_kwd) use ($kwd) {
|
|
$q_kwd->where('name', 'like', "%{$kwd}%")->orWhere('mobile', 'like', "%{$kwd}%");
|
|
}];
|
|
}
|
|
|
|
if ($id = $data['id']) {
|
|
$staff_where[] = ['id', $id];
|
|
}
|
|
|
|
if ($data['status'] || $data['status'] === 0 || $data['status'] === '0') {
|
|
$staff_where[] = ['status', $data['status']];
|
|
}
|
|
|
|
if ($data['disabled'] === 0 || $data['disabled'] === '0') {
|
|
$staff_where[] = ['disabled', 0];
|
|
} elseif ($data['disabled'] == 1) {
|
|
$staff_where[] = ['disabled', 1];
|
|
}
|
|
|
|
|
|
if ($staff_where) {
|
|
$staff_id_list = Staff::business()->where($staff_where)->pluck('id')->toArray() ?: [-1];
|
|
$where[] = [function ($query) use ($staff_id_list) {
|
|
$query->whereIn('staff_id', $staff_id_list);
|
|
}];
|
|
}
|
|
|
|
$list = DepartmentStaff::business()->where($where)->with(['hasOneStaff' => function ($query) use ($data) {
|
|
$query->with(['hasOneMember' => function ($query1) {
|
|
$query1->select('uid', 'avatar', 'nickname', 'realname');
|
|
}]);
|
|
}])->groupBy('staff_id')->select('id', 'staff_id', 'department_id', 'is_leader');
|
|
|
|
return $list;
|
|
|
|
}
|
|
|
|
/*
|
|
* 将中文转换成拼音字符串
|
|
*/
|
|
public static function overTrue($string, $length = 0)
|
|
{
|
|
$arr = (new \Overtrue\Pinyin\Pinyin())->convert($string);
|
|
$return_string = '';
|
|
foreach ($arr as $v) {
|
|
$return_string .= strtoupper($v);
|
|
}
|
|
|
|
return $length ? substr($return_string, 0, $length) : $return_string;
|
|
}
|
|
|
|
public static function returnArr($result, $msg = '', $data = [])
|
|
{
|
|
return ['result' => $result, 'msg' => $msg, 'data' => $data];
|
|
}
|
|
|
|
}
|