徐总多门店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jiuhaoshenghuo/app/services/work/WorkDepartmentServices.php

218 lines
7.6 KiB

2 months ago
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\work;
use app\dao\work\WorkDepartmentDao;
use app\jobs\work\WorkMemberJob;
use app\services\BaseServices;
use crmeb\services\wechat\config\WorkConfig;
use crmeb\services\wechat\Work;
use crmeb\traits\ServicesTrait;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\exception\ValidateException;
/**
* 企业微信部门
* Class WorkDepartmentServices
* @package app\services\work
* @mixin WorkDepartmentDao
*/
class WorkDepartmentServices extends BaseServices
{
use ServicesTrait;
/**
* WorkDepartmentServices constructor.
* @param WorkDepartmentDao $dao
*/
public function __construct(WorkDepartmentDao $dao)
{
$this->dao = $dao;
}
/**
* 获取组织架构
* @return mixed
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function getDepartmentList()
{
/** @var WorkConfig $config */
$config = app()->make(WorkConfig::class);
$data = $this->dao->getDataList(['corp_id' => $config->get('corpId')], ['department_id', 'parentid', 'name', 'name_en']);
$departmentId = array_column($data, 'department_id');
if ($departmentId) {
/** @var WorkMemberRelationServices $memberRelationService */
$memberRelationService = app()->make(WorkMemberRelationServices::class);
$memberList = $memberRelationService->getMemberRelationList([
['department', 'in', $departmentId]
], ['member_id', 'department']);
foreach ($data as &$item) {
$memberId = [];
foreach ($memberList as $value) {
if ($value['department'] == $item['department_id']) {
$memberId[] = $value['member_id'];
}
}
$item['count'] = count($memberId);
}
}
return get_tree_children($data, 'children', 'department_id', 'parentid');
}
/**
* 同步企业微信部门和成员信息
*/
public function authDepartment()
{
/** @var WorkConfig $config */
$config = app()->make(WorkConfig::class);
$corpId = $config->get('corpId');
if (!$corpId) {
throw new ValidateException('请先配置企业微信ID');
}
$res = Work::getDepartment();
if (isset($res['errcode']) && 0 !== $res['errcode']) {
throw new ValidateException($res['errmsg'] ?? '请检查企业微信自建应用配置');
}
$department = $res['department'] ?? [];
$data = [];
$ids = [];
foreach ($department as $item) {
$item['srot'] = $item['order'] ?? '';
$item['name_en'] = $item['name_en'] ?? '';
$item['department_leader'] = json_encode($item['department_leader'] ?? []);
$item['department_id'] = $item['id'] ?? '';
unset($item['order'], $item['id']);
if ($this->dao->count(['department_id' => $item['department_id'], 'corp_id' => $corpId])) {
$this->dao->update(['department_id' => $item['department_id'], 'corp_id' => $corpId], [
'name' => $item['name'] ?? '',
'srot' => $item['srot'],
'department_leader' => $item['department_leader'],
'parentid' => $item['parentid']
]);
} else {
$item['create_time'] = time();
$item['corp_id'] = $corpId;
$data[] = $item;
}
$ids[] = $item['department_id'];
}
if ($data) {
$this->dao->saveAll($data);
}
if ($ids) {
foreach ($ids as $id) {
WorkMemberJob::dispatchDo('run', [$id]);
}
}
}
/**
* 获取部门+成员tree型数据
* @param string $corpId
* @param array $mobile
* @return array
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function getMailChildren(string $corpId)
{
$list = $this->dao->getDataList(['corp_id' => $corpId], ['department_id', 'parentid', 'name', 'name_en'], 0, 0, 'srot', ['member' => function ($query) use ($corpId) {
$query->where('corp_id', $corpId)
->field(['userid', 'id', 'mobile', 'avatar', 'thumb_avatar', 'name'])
->with('departmentRelation');
}]);
$userList = [];
foreach ($list as $item) {
if ($item['member'] && is_array($item['member'])) {
$userList = array_merge($userList, $item['member']);
}
}
foreach ($list as &$item) {
$item['member'] = [];
$user = [];
foreach ($userList as $value) {
$frameIds = $value['departmentRelation'] ? array_column($value['departmentRelation'], 'department') : [];
unset($value['departmentRelation']);
if (in_array($item['department_id'], $frameIds)) {
$user[] = $value;
}
}
$item['member'] = $user;
$item['member_count'] = count($user);
}
return get_tree_children($list, 'children', 'department_id', 'parentid');
}
/**
* 创建部门
* @param array $payload
* @return \crmeb\basic\BaseModel|mixed|\think\Model
*/
public function createDepartment(array $payload)
{
$corpId = $payload['ToUserName'];
$where = ['corp_id' => $corpId, 'department_id' => $payload['Id']];
$departmentInfo = Work::getDepartmentInfo($payload['Id']);
if ($this->dao->count($where)) {
return $this->updateDepartment($corpId, (int)$payload['Id'], $departmentInfo['department']['name']);
} else {
return $this->dao->save([
'corp_id' => $corpId,
'department_id' => $payload['Id'] ?? '',
'name' => $departmentInfo['department']['name'] ?? '',
'parentid' => $departmentInfo['department']['parentid'] ?? '',
'sort' => $payload['order'] ?? '',
'create_time' => time()
]);
}
}
/**
* 更新部门
* @param string $corpId
* @param int $department_id
* @param string $name
* @return mixed
*/
public function updateDepartment(string $corpId, int $departmentId, string $name)
{
if (!$name) {
$departmentInfo = Work::getDepartmentInfo($departmentId);
$name = $departmentInfo['department']['name'] ?? '';
}
return $this->dao->update(['corp_id' => $corpId, 'department_id' => $departmentId], ['name' => $name]);
}
/**
* 删除部门
* @param string $corpId
* @param int $departmentId
* @return mixed
*/
public function deleteDepartment(string $corpId, int $departmentId)
{
return $this->dao->delete(['corp_id' => $corpId, 'department_id' => $departmentId]);
}
}