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.
595 lines
19 KiB
595 lines
19 KiB
<?php
|
|
|
|
namespace addons\qingdong\controller;
|
|
|
|
|
|
use addons\qingdong\model\Contacts;
|
|
use addons\qingdong\model\Contract;
|
|
use addons\qingdong\model\Customer;
|
|
use addons\qingdong\model\Flow;
|
|
use addons\qingdong\model\Leads;
|
|
use addons\qingdong\model\Receivables;
|
|
use addons\qingdong\model\Remind;
|
|
use addons\qingdong\model\Staff as StaffModel;
|
|
use addons\qingdong\model\StaffDepartment;
|
|
use addons\qingdong\library\Wechat;
|
|
use addons\qingdong\model\Achievement;
|
|
use addons\qingdong\model\Record;
|
|
use fast\Http;
|
|
use think\Exception;
|
|
use think\Log;
|
|
use think\Validate;
|
|
|
|
/**
|
|
* * 操作文档:https://doc.fastadmin.net/qingdong
|
|
* 软件介绍:https://www.fastadmin.net/store/qingdong.html
|
|
* 售后微信:qingdong_crm
|
|
* 员工登录 注册接口
|
|
*/
|
|
class Staff extends StaffApi
|
|
{
|
|
protected $noNeedLogin = ['test', 'wxLogin', 'login','logintest'];
|
|
protected $noNeedRight = ['getInfo', 'editInfo', "use_phone"];
|
|
|
|
|
|
public function _initialize()
|
|
{
|
|
parent::_initialize();
|
|
}
|
|
|
|
//是否登录
|
|
public function isLogin()
|
|
{
|
|
$this->success('已登录', ['userinfo' => $this->auth->getUserinfo()]);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 会员登录
|
|
*
|
|
* @ApiMethod (POST)
|
|
* @param string $account 账号
|
|
* @param string $password 密码
|
|
*/
|
|
public function login()
|
|
{
|
|
$account = $this->request->post('account');
|
|
$password = $this->request->post('password');
|
|
if (!$account || !$password) {
|
|
$this->error(__('Invalid parameters'));
|
|
}
|
|
$ret = $this->auth->login($account, $password);
|
|
if ($ret) {
|
|
$data = ['userinfo' => $this->auth->getUserinfo()];
|
|
$this->success(__('Logged in successful'), $data);
|
|
} else {
|
|
$this->error($this->auth->getError());
|
|
}
|
|
}
|
|
|
|
//获取个人基本信息
|
|
public function getInfo()
|
|
{
|
|
$staff = StaffModel::where(['id' => $this->auth->id])->with(['department', 'parent'])->find();
|
|
$group_ids=explode(',',$staff['group_ids']);
|
|
$staff['role_type'] = 1;//基础和团队
|
|
if (in_array(1, $group_ids)) {//超级管理员
|
|
$staff['role_type'] = 9;
|
|
}
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
|
|
//员工绑定信息
|
|
public function staffBind(){
|
|
$staff=StaffModel::get($this->auth->id);
|
|
$data=[
|
|
'is_bind_wechat'=>$staff['openid']?1:($staff['wx_openid']?1:0)
|
|
];
|
|
$this->success('请求成功',$data);
|
|
}
|
|
|
|
//绑定微信
|
|
public function wechatBind(){
|
|
$type=input('type');//applet小程序 web 网页授权
|
|
$code = input('code');
|
|
if($type == 'web'){
|
|
$wechat = new Wechat('wxOfficialAccount');
|
|
if(empty($wechat->config['app_id'])){
|
|
$this->error('微信公众号appid未设置');
|
|
}
|
|
if(empty($wechat->config['secret'])){
|
|
$this->error('微信公众号secret未设置');
|
|
}
|
|
$decryptSession = $wechat->getOfficialAccessToken($code);
|
|
|
|
if (isset($decryptSession['errcode']) && $decryptSession['errcode'] != 0) {
|
|
$this->error(__('解析失败!'));
|
|
}
|
|
$openid = $decryptSession['openid'];
|
|
$unionid = $decryptSession['unionid'] ?? '';
|
|
|
|
Log::info(json_encode($decryptSession,JSON_UNESCAPED_UNICODE));
|
|
//判断用户是否存在
|
|
$staff = StaffModel::where(['wx_openid' => $openid])->find();
|
|
if($staff){
|
|
$this->error('该微信号已绑定账号');
|
|
}
|
|
$staffModel=new StaffModel();
|
|
$result=$staffModel->save(['wx_openid'=>$openid,'unionid'=>$unionid],['id'=>$this->auth->id]);
|
|
if($result){
|
|
$this->success('绑定成功');
|
|
}
|
|
$this->error('绑定失败');
|
|
}elseif($type == 'applet'){
|
|
$wechat = new Wechat('wxMiniProgram');
|
|
if(empty($wechat->config['app_id'])){
|
|
$this->error('微信小程序appid未设置');
|
|
}
|
|
if(empty($wechat->config['secret'])){
|
|
$this->error('微信小程序secret未设置');
|
|
}
|
|
$decryptSession = $wechat->code($code);
|
|
|
|
if (isset($decryptSession['errcode']) && $decryptSession['errcode'] != 0) {
|
|
$this->error(__('解析失败!'));
|
|
}
|
|
$openid = $decryptSession['openid'];
|
|
$unionid = $decryptSession['unionid'] ?? '';
|
|
//判断用户是否存在
|
|
$staff = StaffModel::where(['openid' => $openid])->find();
|
|
if($staff){
|
|
$this->error('该微信号已绑定账号');
|
|
}
|
|
$staffModel=new StaffModel();
|
|
$result=$staffModel->save(['openid'=>$openid,'unionid'=>$unionid],['id'=>$this->auth->id]);
|
|
if($result){
|
|
$this->success('绑定成功');
|
|
}
|
|
$this->error('绑定失败');
|
|
}
|
|
}
|
|
|
|
//解绑微信
|
|
public function unboundWechat()
|
|
{
|
|
$staffId = $this->auth->id;
|
|
$model = new StaffModel();
|
|
$staff = $model->where(['id' => $staffId])->find();
|
|
if (empty($staff)) {
|
|
$this->error('员工不存在');
|
|
}
|
|
if ($model->isUpdate(true)->save(['id' => $staffId, 'wx_openid' => null,
|
|
'unionid' => null, 'openid' => null])) {
|
|
$this->success('解绑微信成功');
|
|
}
|
|
$this->error('操作失败');
|
|
}
|
|
//修改个人基本信息
|
|
public function editInfo()
|
|
{
|
|
$name = input('name');
|
|
$img = input('img');
|
|
$email = input('email');
|
|
$sex = input('sex');
|
|
$num = input('num');
|
|
$post = input('post');
|
|
$mobile = input('mobile');
|
|
$staffs = StaffModel::where(array('id' => $this->auth->id))->find();
|
|
$staffs->mobile = $mobile;
|
|
$staffs->img = $img;
|
|
$staffs->email = $email;
|
|
$staffs->sex = $sex;
|
|
$staffs->num = $num;
|
|
$staffs->post = $post;
|
|
$staffs->updatetime = time();
|
|
$result = $staffs->save();
|
|
if (!$result) {
|
|
$this->error('修改失败');
|
|
}
|
|
$this->success('修改成功');
|
|
}
|
|
|
|
|
|
//授权手机号
|
|
public function use_phone()
|
|
{
|
|
$code = $this->request->post('code','',null);
|
|
$encryptedData = $this->request->post('encryptedData','',null);
|
|
$iv = $this->request->post('iv','',null);
|
|
$config = new Wechat('wxMiniProgram');
|
|
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $config->config['app_id'] . "&secret=" . $config->config['secret'] . "&js_code=" . $code . "&grant_type=authorization_code";
|
|
$user = curl_getinfo($url);
|
|
$arr = json_decode($user, true);
|
|
if (isset($arr['errcode']) && $arr['errcode'] != 0) {
|
|
$this->error('操作失败!');
|
|
}
|
|
if (!isset($arr['openid']) || !isset($arr['session_key'])) {
|
|
$this->error('授权失败,请重新授权!');
|
|
}
|
|
$openId = $arr['openid'];
|
|
$pc = new Wxbizdatacrypt($config->config['app_id'], $arr['session_key']);
|
|
$errCode = $pc->decryptData($encryptedData, $iv, $data);
|
|
if ($errCode != 0) {
|
|
$this->error('授权失败,请重新授权!');
|
|
}
|
|
$decryptUserInfo = json_decode($data, true);
|
|
if (isset($decryptUserInfo['phoneNumber']) && !empty($decryptUserInfo['phoneNumber'])) {
|
|
$user_id = $this->auth->id;
|
|
$userInfo = StaffModel::where(array('id' => $user_id))->update(array('mobile' => $decryptUserInfo['phoneNumber']));
|
|
if ($userInfo === false) {
|
|
$this->error('绑定失败!');
|
|
}
|
|
$data = ['mobile' => $decryptUserInfo['phoneNumber']];
|
|
$this->success('绑定成功', $data);
|
|
} else {
|
|
$this->error('授权失败!');
|
|
}
|
|
}
|
|
|
|
|
|
//获取下级员工列表
|
|
public function getStaffList()
|
|
{
|
|
$ids = StaffModel::getLowerStaffId();
|
|
$staff = StaffModel::where([
|
|
'id' => ['in', $ids],
|
|
'status' => 1
|
|
])->with(['parent'])->field('id,name,nickname,img,num,mobile,post,parent_id')->select();
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
|
|
|
|
//获取员工详情
|
|
public function getStaffDetail()
|
|
{
|
|
$id = input('id');
|
|
if (empty($id)) {
|
|
$this->error('员工不存在');
|
|
}
|
|
$staff = StaffModel::with(['department', 'parent'])->where([
|
|
'id' => $id,
|
|
])->find();
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
|
|
|
|
//待审核员工列表
|
|
public function getCheckStaffList()
|
|
{
|
|
$staff = StaffModel::where([
|
|
'status' => 0,
|
|
'name' => ['neq', '']
|
|
])->field('id,name,nickname,img,num,mobile,post,status')->select();
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
|
|
//修改员工信息
|
|
public function updateStaff()
|
|
{
|
|
$name = input('name', '');
|
|
$img = input('img', '');
|
|
$email = input('email', '');
|
|
$sex = input('sex', 0);
|
|
$num = input('num', '');
|
|
$post = input('post', '');
|
|
$parent_id = input('parent_id', 0);
|
|
$id = input('id', 0, 'intval');
|
|
if (StaffModel::where(['id' => $id])->update([
|
|
'name' => $name,
|
|
'img' => $img,
|
|
'email' => $email,
|
|
'sex' => $sex,
|
|
'num' => $num,
|
|
'post' => $post,
|
|
'parent_id' => $parent_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
$this->error('修改失败');
|
|
}
|
|
$this->success('修改成功');
|
|
}
|
|
|
|
//审核员工成功
|
|
public function checkStaffSuccess()
|
|
{
|
|
$name = input('name', '');
|
|
$img = input('img', '');
|
|
$email = input('email', '');
|
|
$sex = input('sex', 0);
|
|
$role = input('role', 0);
|
|
$num = input('num', '');
|
|
$post = input('post', '');
|
|
$mobile = input('mobile', '');
|
|
$department_id = input('department_id', 0);
|
|
$parent_id = input('parent_id', 0);
|
|
$id = input('id', 0, 'intval');
|
|
if (StaffModel::where(['id' => $id, 'status' => 0])->find() == false) {
|
|
$this->error('待审核员工不存在');
|
|
}
|
|
if (empty($department_id)) {
|
|
$this->error('请选择员工部门!');
|
|
}
|
|
if (StaffModel::where(['id' => $id])->update([
|
|
'name' => $name,
|
|
'img' => $img,
|
|
'email' => $email,
|
|
'sex' => $sex,
|
|
'num' => $num,
|
|
'role' => $role,
|
|
'mobile' => $mobile,
|
|
'post' => $post,
|
|
'parent_id' => $parent_id,
|
|
'department_id' => $department_id,
|
|
'status' => 1,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
$this->error('审核失败');
|
|
}
|
|
$this->success('审核成功');
|
|
}
|
|
|
|
//审核员工拒绝
|
|
public function checkStaffError(){
|
|
$id = input('id');
|
|
if (StaffModel::where(['id' => $id, 'status' => 0])->find() == false) {
|
|
$this->error('待审核员工不存在');
|
|
}
|
|
if (StaffModel::where(['id' => $id, 'status' => 0])->update(['deletetime' => time()]) == false) {
|
|
$this->error('拒绝失败');
|
|
}
|
|
$this->success('审核成功');
|
|
}
|
|
|
|
//获取员工统计
|
|
public function getStaffStatistics()
|
|
{
|
|
$id = input('id');
|
|
if (empty($id)) {
|
|
$this->error('员工不存在');
|
|
}
|
|
$date = input('date', date('Y-m'));
|
|
//月底
|
|
$endDate = strtotime('+1 month', strtotime(date($date . '-1')));
|
|
$date = strtotime($date);
|
|
//客户 线索 联系人 合同 回款 跟进次数 处理审批
|
|
$leads = Leads::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
])->count();
|
|
$customer = Customer::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
])->count();
|
|
$contacts = Contacts::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
])->count();
|
|
$contract = Contract::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
'check_status' => 2
|
|
])->count();
|
|
$contract_money = Contract::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
'check_status' => 2
|
|
])->sum('money');
|
|
$receivables = Receivables::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
'check_status' => 2
|
|
])->count();
|
|
$receivables_money = Receivables::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
'check_status' => 2
|
|
])->sum('money');
|
|
$record = Record::where([
|
|
'create_staff_id' => $id,
|
|
'createtime' => ['between', [$date, $endDate]],
|
|
])->count();
|
|
|
|
$field = Achievement::getMonthField(date('Y-m', $date));
|
|
$contractAchievement = Achievement::where([
|
|
'year' => date('Y', $date),
|
|
'type' => 3,
|
|
'obj_id' => $id,
|
|
'status' => 1
|
|
])->value($field);
|
|
|
|
$receivablesAchievement = Achievement::where([
|
|
'year' => date('Y', $date),
|
|
'type' => 3,
|
|
'obj_id' => $id,
|
|
'status' => 2
|
|
])->value($field);
|
|
|
|
$this->success('请求成功', [
|
|
'leads' => $leads,
|
|
'customer' => $customer,
|
|
'contacts' => $contacts,
|
|
'contract' => $contract,
|
|
'contract_money' => $contract_money,
|
|
'receivables' => $receivables,
|
|
'receivables_money' => $receivables_money,
|
|
'record' => $record,
|
|
'contractAchievement' => $contractAchievement ?: 0,
|
|
'receivablesAchievement' => $receivablesAchievement ?: 0,
|
|
]);
|
|
}
|
|
|
|
//获取员工所属客户
|
|
public function getStaffCustomer()
|
|
{
|
|
$id = input('id');
|
|
$limit = input("limit/d", 10);
|
|
$row = StaffModel::get($id);
|
|
if (empty($row)) {
|
|
$this->error('员工不存在');
|
|
}
|
|
$where = [];
|
|
$where['owner_staff_id'] = $id;
|
|
$list = Customer::where($where)->with([
|
|
'ownerStaff',
|
|
'contacts'
|
|
])->field('id,name,next_time,owner_staff_id,level,follow')->order('id desc')->paginate($limit);
|
|
|
|
$this->success('请求成功', $list);
|
|
}
|
|
|
|
//获取部门列表
|
|
public function getDepartment()
|
|
{
|
|
|
|
$this->success('请求成功', StaffDepartment::getDepartmentList());
|
|
}
|
|
|
|
//获取上级列表
|
|
public function getParentList()
|
|
{
|
|
$id = input('id');
|
|
if (empty($id)) {
|
|
$this->error('参数错误');
|
|
}
|
|
$this->success('请求成功', StaffModel::getList([$id]));
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取用户上级IDs
|
|
*/
|
|
public function getStaffIds()
|
|
{
|
|
// record 跟进 contract 合同 consume 费用 receivables 回款
|
|
$type = input('type');
|
|
$remind=Remind::where(['type'=>$type])->find();
|
|
if($remind){
|
|
$staff = StaffModel::where(['id' => ['in', $remind['staff_ids']]])->field('id,name,img')->select();
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
$pid = StaffModel::where(['id' => $this->auth->id])->value('parent_id');
|
|
$pids = [$pid];
|
|
$staff = StaffModel::where(['id' => ['in', $pids]])->field('id,name,img')->select();
|
|
$this->success('请求成功', $staff);
|
|
}
|
|
|
|
/**
|
|
* 获取审批列表
|
|
*/
|
|
public function getsteplist()
|
|
{
|
|
// record 跟进 contract 合同 consume 费用 receivables 回款 formapproval_1 审批
|
|
$type = input('type');
|
|
|
|
//获取审批
|
|
$data = Flow::getsteplist($type);
|
|
if (empty($data)) {
|
|
$this->error('无可用审批流,请联系管理员');
|
|
}
|
|
$this->success('请求成功', $data);
|
|
}
|
|
/**
|
|
* 获取审批详情
|
|
*/
|
|
public function getstepdetail()
|
|
{
|
|
// record 跟进 contract 合同 consume 费用 receivables 回款
|
|
$type = input('type');
|
|
$relation_id=input('relation_id');
|
|
$data = Flow::getstepdetail($type,$relation_id);
|
|
if (empty($data)) {
|
|
$this->error('无可用审批流,请联系管理员');
|
|
}
|
|
$this->success('请求成功', $data);
|
|
}
|
|
|
|
|
|
//禁用账号
|
|
public function disable_user()
|
|
{
|
|
$id = input('id');
|
|
$status = 2;
|
|
$model = new StaffModel();
|
|
$staff = $model->where(['id' => $id])->find();
|
|
if (empty($staff)) {
|
|
$this->error('员工不存在');
|
|
}
|
|
if ($model->isUpdate(true)->save(['id' => $id, 'status' => $status])) {
|
|
$this->success('操作成功');
|
|
}
|
|
$this->error('操作失败');
|
|
}
|
|
/**
|
|
* 退出登录
|
|
* @ApiMethod (POST)
|
|
*/
|
|
public function logout()
|
|
{
|
|
if (!$this->request->isPost()) {
|
|
$this->error(__('Invalid parameters'));
|
|
}
|
|
$this->auth->logout();
|
|
$this->success(__('Logout successful'));
|
|
}
|
|
/**
|
|
* 修改密码
|
|
*/
|
|
public function changepwd()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$oldpassword = $this->request->post("oldpassword");
|
|
$newpassword = $this->request->post("newpassword");
|
|
$renewpassword = $this->request->post("renewpassword");
|
|
$rule = [
|
|
'oldpassword' => 'require|length:6,30',
|
|
'newpassword' => 'require|length:6,30',
|
|
'renewpassword' => 'require|length:6,30|confirm:newpassword',
|
|
];
|
|
|
|
$msg = [
|
|
'renewpassword.confirm' =>'两次输入的密码不一致'
|
|
];
|
|
$data = [
|
|
'oldpassword' => $oldpassword,
|
|
'newpassword' => $newpassword,
|
|
'renewpassword' => $renewpassword,
|
|
];
|
|
$field = [
|
|
'oldpassword' => '旧密码',
|
|
'newpassword' => '新密码',
|
|
'renewpassword' => '确认密码'
|
|
];
|
|
$validate = new Validate($rule, $msg, $field);
|
|
$result = $validate->check($data);
|
|
if (!$result) {
|
|
$this->error(__($validate->getError()));
|
|
return false;
|
|
}
|
|
|
|
$ret = $this->auth->changepwd($newpassword, $oldpassword);
|
|
if ($ret) {
|
|
$this->success('修改密码成功');
|
|
} else {
|
|
$this->error($this->auth->getError());
|
|
}
|
|
}
|
|
}
|
|
//直接体验
|
|
public function logintest()
|
|
{
|
|
$staff = StaffModel::where([])->order('id asc')->find();
|
|
if(!$staff){
|
|
$this->error('员工不存在');
|
|
}
|
|
$stafflogin= $this->auth->direct($staff['id']);
|
|
if ($stafflogin) {
|
|
$data = ['userinfo' => $this->auth->getUserinfo()];
|
|
$this->success(__('Logged in successful'), $data);
|
|
} else {
|
|
$this->error('登录失败');
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|