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.
463 lines
16 KiB
463 lines
16 KiB
<?php
|
|
|
|
namespace addons\qingdong\controller;
|
|
|
|
use addons\qingdong\model\Contract as ContractModel;
|
|
use addons\qingdong\model\Event;
|
|
use addons\qingdong\model\ExamineRecord;
|
|
use addons\qingdong\model\Feedback;
|
|
use addons\qingdong\model\ReceivablesPlan;
|
|
use addons\qingdong\model\Customer;
|
|
use addons\qingdong\model\Contacts;
|
|
use addons\qingdong\model\Contract;
|
|
use addons\qingdong\model\Leads;
|
|
use addons\qingdong\model\Receivables;
|
|
use addons\qingdong\model\Staff;
|
|
use addons\qingdong\model\Record;
|
|
use addons\qingdong\model\Message;
|
|
use addons\qingdong\model\Business;
|
|
|
|
/**
|
|
* * 操作文档:https://doc.fastadmin.net/qingdong
|
|
* 软件介绍:https://www.fastadmin.net/store/qingdong.html
|
|
* 售后微信:qingdong_crm
|
|
* 首页接口
|
|
*/
|
|
class Index extends StaffApi
|
|
{
|
|
protected $noNeedLogin = [];
|
|
protected $noNeedRight = ['*'];
|
|
|
|
public function index()
|
|
{
|
|
$this->error("当前插件暂无前台页面");
|
|
}
|
|
|
|
//搜索
|
|
public function search()
|
|
{
|
|
$keywords = input('keywords');
|
|
$type = input('type');
|
|
if (empty($keywords)) {
|
|
$this->error('筛选字段不能为空');
|
|
}
|
|
//客户
|
|
$customer = Customer::where([
|
|
'name' => ['like', "%$keywords%"],
|
|
'owner_staff_id' => ['in', Staff::getMyStaffIds()],
|
|
])->with([
|
|
'ownerStaff',
|
|
'contacts'
|
|
])->field('id,name,next_time,owner_staff_id,level,follow')->select();
|
|
//联系人
|
|
$contacts = Contacts::where([
|
|
'name' => ['like', "%$keywords%"],
|
|
'owner_staff_id' => ['in', Staff::getMyStaffIds()],
|
|
])->with(['customer'])->field('id,name,mobile,customer_id')->select();
|
|
//线索
|
|
$leads = Leads::where([
|
|
'name' => ['like', "%$keywords%"],
|
|
'owner_staff_id' => ['in', Staff::getMyStaffIds()],
|
|
])->with(['ownerStaff'])->field('id,owner_staff_id,name,follow,level,next_time,mobile')->select();
|
|
|
|
$this->success('请求成功', [
|
|
'customer' => $customer,
|
|
'contacts' => $contacts,
|
|
'leads' => $leads
|
|
]);
|
|
}
|
|
|
|
|
|
//反馈
|
|
public function feedback()
|
|
{
|
|
$content = input('content', '', 'trim');
|
|
$file = input('file', '', 'trim');
|
|
if (empty($content)) {
|
|
$this->error('请输入反馈内容!');
|
|
}
|
|
$model = new Feedback();
|
|
$model->save([
|
|
'staff_id' => $this->auth->id,
|
|
'content' => $content,
|
|
'file_ids' => $file
|
|
]);
|
|
$this->success('反馈成功');
|
|
}
|
|
|
|
|
|
//待办事项
|
|
public function agent()
|
|
{
|
|
$where['create_staff_id'] = $this->auth->id;
|
|
$where['next_time'] = array(array('egt', date('Y-m-d 00:00:00')), array('lt', date('Y-m-d 23:59:59')));
|
|
$where['follow_type'] = ['neq', '其它'];
|
|
$where['status'] = 0;
|
|
// 待跟进客户
|
|
$where1['relation_type'] = 1;
|
|
$customerlist = Record::where($where)->where($where1)->column('id');
|
|
$customerlist1 = 0;
|
|
if ($customerlist) {
|
|
$whereExit['id'] = array('in', $customerlist);
|
|
$whereExit['next_time'] = array('gt', date('Y-m-d 23:59:59'));
|
|
$customerlist1 = Record::where($whereExit)->count();
|
|
}
|
|
$customer = count($customerlist) - $customerlist1;
|
|
|
|
//待跟进合同
|
|
$where2['relation_type'] = 3;
|
|
$contractlist = Record::where($where)->where($where2)->column('id');
|
|
$contractlist1 = 0;
|
|
if ($contractlist) {
|
|
$whereExitC['id'] = array('in', $contractlist);
|
|
$whereExitC['next_time'] = array('gt', date('Y-m-d 23:59:59'));
|
|
$contractlist1 = Record::where($whereExitC)->count();
|
|
}
|
|
$contract = count($contractlist) - $contractlist1;
|
|
//待跟进线索
|
|
$where3['relation_type'] = 4;
|
|
$leadlist = Record::where($where)->where($where3)->column('id');
|
|
$leadlist1 = 0;
|
|
if ($leadlist) {
|
|
$whereExitL['id'] = array('in', $leadlist);
|
|
$whereExitL['next_time'] = array('gt', date('Y-m-d 23:59:59'));
|
|
$leadlist1 = Record::where($whereExitL)->count();
|
|
}
|
|
$lead = count($leadlist) - $leadlist1;
|
|
//待跟进联系人
|
|
$where4['relation_type'] = 2;
|
|
$contactslist = Record::where($where)->where($where4)->column('id');
|
|
$contactslist1 = 0;
|
|
if ($contactslist1) {
|
|
$whereExitCs['id'] = array('in', $contactslist);
|
|
$whereExitCs['next_time'] = array('gt', date('Y-m-d 23:59:59'));
|
|
$contactslist1 = Record::where($whereExitCs)->count();
|
|
}
|
|
$contacts = count($contactslist) - $contactslist1;
|
|
//待跟进商机
|
|
$where5['relation_type'] = 5;
|
|
$businesslist = Record::where($where)->where($where5)->column('id');
|
|
$businesslist1 = 0;
|
|
if ($businesslist1) {
|
|
$whereExitB['id'] = array('in', $businesslist);
|
|
$whereExitB['next_time'] = array('gt', date('Y-m-d 23:59:59'));
|
|
$businesslist1 = Record::where($whereExitB)->count();
|
|
}
|
|
$business = count($businesslist) - $businesslist1;
|
|
|
|
//待审核合同
|
|
$examine = ExamineRecord::where([
|
|
'relation_type' => ExamineRecord::CONTRACT_TYPE,
|
|
'status' => 0,
|
|
'check_staff_id' => $this->auth->id
|
|
])->count();
|
|
//待审核回款
|
|
$receivables = ExamineRecord::where([
|
|
'relation_type' => ExamineRecord::RECEIVABLES_TYPE,
|
|
'status' => 0,
|
|
'check_staff_id' => $this->auth->id
|
|
])->count();
|
|
//待回款提醒
|
|
$receivablesPlan = ReceivablesPlan::where([
|
|
'remind_date' => ['elt', date('Y-m-d')],
|
|
'status' => 0,
|
|
'owner_staff_id' => $this->auth->id
|
|
])->count();
|
|
//待处理日程
|
|
$eventOne = Event::where([
|
|
'type' => 1,
|
|
'status' => ['in', [0, 1]],
|
|
'start_time' => ['lt', date('Y-m-d', strtotime('+1 day'))],
|
|
'staff_id|owner_staff_id' => $this->auth->id,
|
|
])->count();
|
|
$this->success('请求成功', [
|
|
'customer' => $customer,
|
|
'business' => $business,
|
|
'contract' => $contract,
|
|
'lead' => $lead,
|
|
'contacts' => $contacts,
|
|
'event_one' => $eventOne,
|
|
'examine' => $examine,
|
|
'receivables' => $receivables,
|
|
'receivables_plan' => $receivablesPlan
|
|
]);
|
|
}
|
|
|
|
//待处理日程
|
|
public function event_one()
|
|
{
|
|
// 待处理日程
|
|
$eventTask = Event::where([
|
|
'type' => 1,
|
|
'status' => ['in', [0, 1]],
|
|
'start_time' => ['lt', date('Y-m-d', strtotime('+1 day'))],
|
|
'staff_id|owner_staff_id' => $this->auth->id,
|
|
])->order('id desc')->select();
|
|
//标记通知已读
|
|
Message::where([
|
|
'relation_type' => Message::EVENT_TYPE,
|
|
'to_staff_id' => $this->auth->id,
|
|
'status' => 0
|
|
])->update(['read_time' => time(), 'status' => 1]);
|
|
foreach ($eventTask as &$ves) {
|
|
$ves['start_time'] = date('Y-m-d H:i', strtotime($ves['start_time']));
|
|
$ves['end_time'] = date('Y-m-d H:i', strtotime($ves['end_time']));
|
|
}
|
|
$this->success('请求成功', $eventTask);
|
|
}
|
|
|
|
//跟进任务
|
|
public function event_task()
|
|
{
|
|
// 待跟进任务
|
|
$eventTask = Event::where([
|
|
'type' => 2,
|
|
'status' => ['in', [0, 1]],
|
|
'start_time' => ['lt', date('Y-m-d', strtotime('+1 day'))],
|
|
'staff_id' => $this->auth->id
|
|
])->select();
|
|
foreach ($eventTask as &$ves) {
|
|
$ves['start_time'] = date('Y-m-d H:i', strtotime($ves['start_time']));
|
|
$ves['end_time'] = date('Y-m-d H:i', strtotime($ves['end_time']));
|
|
}
|
|
$this->success('请求成功', $eventTask);
|
|
}
|
|
|
|
|
|
//待审核合同
|
|
public function examine_contract()
|
|
{
|
|
//待审核合同
|
|
$ids = ExamineRecord::where([
|
|
'relation_type' => ExamineRecord::CONTRACT_TYPE,
|
|
'status' => 0,
|
|
'check_staff_id' => $this->auth->id
|
|
])->column('relation_id');
|
|
$contracts = ContractModel::where(['id' => ['in', $ids]])->with([
|
|
'customer',
|
|
'contacts',
|
|
'ownerStaff',
|
|
'orderStaff',
|
|
'receivables'
|
|
])->order('id desc')->select();
|
|
$contracts = collection($contracts)->toArray();
|
|
foreach ($contracts as $k => $v) {
|
|
if (empty($v['receivables'])) {
|
|
$v['receivables'] = [
|
|
'repayment_money' => 0,
|
|
'be_money' => $v['money'],
|
|
'ratio' => 0
|
|
];
|
|
} else {
|
|
$be_money = $v['money'] - $v['receivables']['repayment_money'];
|
|
$v['receivables'] = [
|
|
'repayment_money' => $v['receivables']['repayment_money'],
|
|
'be_money' => ($be_money > 0) ? $be_money : 0,
|
|
'ratio' => round($v['receivables']['repayment_money'] / $v['money'] * 100, 2)
|
|
];
|
|
}
|
|
$contracts[$k] = $v;
|
|
}
|
|
|
|
$this->success('请求成功', $contracts);
|
|
}
|
|
|
|
|
|
//待审核回款
|
|
public function examine_receivables()
|
|
{
|
|
//待审核回款
|
|
$ids = ExamineRecord::where([
|
|
'relation_type' => ExamineRecord::RECEIVABLES_TYPE,
|
|
'status' => 0,
|
|
'check_staff_id' => $this->auth->id,
|
|
])->column('relation_id');
|
|
$receivables = Receivables::where(['id' => ['in', $ids]])->with([
|
|
'contract',
|
|
'createStaff'
|
|
])->order('id desc')->select();
|
|
|
|
$this->success('请求成功', $receivables);
|
|
}
|
|
|
|
|
|
//待回款提醒
|
|
public function examine_receivables_plan()
|
|
{
|
|
//待回款提醒
|
|
$receivablesPlan = ReceivablesPlan::where([
|
|
'remind_date' => ['elt', date('Y-m-d')],
|
|
'status' => 0,
|
|
'owner_staff_id' => $this->auth->id,
|
|
])->order('id desc')->with(['contract', 'customer'])->select();
|
|
|
|
$this->success('请求成功', $receivablesPlan);
|
|
}
|
|
|
|
|
|
//数据简报
|
|
public function briefing()
|
|
{
|
|
$type = input('type', 0);//0 本人及下属 1 仅本人 2 仅下属
|
|
$times = input('times', '');
|
|
$times = explode(',', $times);
|
|
if (empty($times)) {
|
|
$this->error('参数不能为空');
|
|
}
|
|
|
|
$startDate=strtotime($times[0]);
|
|
$endDate=strtotime($times[1])+86400-1;
|
|
|
|
$where = [
|
|
'createtime' => ['between', [$startDate, $endDate]]
|
|
];
|
|
$whereC = [
|
|
'order_date' => ['between', [date('Y-m-d 00:00:00',$startDate), date('Y-m-d 23:59:59',$endDate)]]
|
|
];
|
|
$whereR = [
|
|
'return_time' => ['between', [date('Y-m-d 00:00:00',$startDate), date('Y-m-d 23:59:59',$endDate)]]
|
|
];
|
|
if ($type == 1) {
|
|
$where['owner_staff_id'] = $this->auth->id;
|
|
$whereC['owner_staff_id'] = $this->auth->id;
|
|
$whereR['owner_staff_id'] = $this->auth->id;
|
|
} elseif ($type == 2) {
|
|
$where['owner_staff_id'] = ['in', Staff::getLowerStaffId()];
|
|
$whereC['owner_staff_id'] = ['in', Staff::getLowerStaffId()];
|
|
$whereR['owner_staff_id'] = ['in', Staff::getLowerStaffId()];
|
|
} else {
|
|
$where['owner_staff_id'] = ['in', Staff::getMyStaffIds()];
|
|
$whereC['owner_staff_id'] = ['in', Staff::getMyStaffIds()];
|
|
$whereR['owner_staff_id'] = ['in', Staff::getMyStaffIds()];
|
|
}
|
|
|
|
//客户 线索 联系人 合同 回款 跟进次数 处理审批
|
|
$leads = Leads::where($where)->count();
|
|
$customer = Customer::where($where)->count();
|
|
$contacts = Contacts::where($where)->count();
|
|
$contract = Contract::where([])->where($whereC)->count();
|
|
$contract_money = Contract::where(['check_status'=>2])->where($whereC)->sum('money');
|
|
$receivables_money = Receivables::where(['check_status'=>2])->where($whereR)->sum('money');
|
|
$record = Record::where([
|
|
'create_staff_id' => $where['owner_staff_id'],
|
|
'createtime' => $where['createtime']
|
|
])->where(['follow_type' => ['neq', '其它']])->count();
|
|
$examine = ExamineRecord::where([
|
|
'check_staff_id' => $where['owner_staff_id'],
|
|
'createtime' => $where['createtime']
|
|
])->count();
|
|
//商机总数
|
|
$business = Business::where($where)->count();
|
|
//客户成交量
|
|
$customer_complate = Customer::where($where)->where(['contract_status' => 1])->count();
|
|
//客户未成交量
|
|
$customer_nocomplate = Customer::where($where)->where(['contract_status' => 0])->count();
|
|
//商机成交总数
|
|
$business_complate = Business::where($where)->where(['contract_status' => 1])->count();
|
|
//商机未成交总数
|
|
$business_nocomplate = Business::where($where)->where(['contract_status' => 0])->count();
|
|
//商机成交金额
|
|
$business_complate_money = Business::where($where)->where(['contract_status' => 1])->sum('money');
|
|
//商机未成交金额
|
|
$business_nocomplate_money = Business::where($where)->where(['contract_status' => 0])->sum('money');
|
|
$this->success('请求成功', [
|
|
'leads' => $leads,
|
|
'customer' => $customer,
|
|
'contacts' => $contacts,
|
|
'contract' => $contract,
|
|
'contract_money' => $contract_money,
|
|
'receivables' => $receivables_money,
|
|
'record' => $record,
|
|
'business' => $business,
|
|
'examine' => $examine,
|
|
'customer_complate' => $customer_complate,
|
|
'customer_nocomplate' => $customer_nocomplate,
|
|
'business_complate' => $business_complate,
|
|
'business_nocomplate' => $business_nocomplate,
|
|
'business_complate_money' => $business_complate_money,
|
|
'business_nocomplate_money' => $business_nocomplate_money,
|
|
]);
|
|
}
|
|
|
|
|
|
/**
|
|
*交易额排行
|
|
*/
|
|
public function contractRanding()
|
|
{
|
|
$date = input('date', date('Y-m'));
|
|
|
|
$type = input('type', 0);//0 本人及下属 1 仅本人 2 仅下属
|
|
|
|
|
|
//月底
|
|
$endDate = date('Y-m-d', strtotime('+1 month', strtotime(date($date . '-1'))) - 1);
|
|
$where = [
|
|
'order_date' => ['between', [$date . '-1', $endDate]],
|
|
'check_status' => 2,
|
|
];
|
|
|
|
$contracts = Contract::where($where)->group('owner_staff_id')->field('owner_staff_id,sum(money) as money')->order('money desc')->select();
|
|
$list = [];
|
|
foreach ($contracts as $v) {
|
|
$list[$v['owner_staff_id']] = $v['money'];
|
|
}
|
|
$contracts = $list;
|
|
$data = [];
|
|
$staffs = Staff::getList();
|
|
foreach ($staffs as $v) {
|
|
if (isset($contracts[$v['id']])) {
|
|
$data[$v['id']] = $contracts[$v['id']];
|
|
} else {
|
|
$data[$v['id']] = 0;
|
|
}
|
|
}
|
|
arsort($data);
|
|
$staffs = Staff::getKeyList();
|
|
$result = [];
|
|
$i = 1;
|
|
$oneMoney = 0;
|
|
if ($type == 1) {//本人
|
|
$showStaffIds = [$this->auth->id];
|
|
} elseif ($type == 2) {//下属
|
|
$showStaffIds = Staff::getLowerStaffId();
|
|
} else {//全部
|
|
$showStaffIds = Staff::getMyStaffIds();
|
|
}
|
|
|
|
foreach ($data as $id => $money) {
|
|
if ($i == 1) {
|
|
$oneMoney = $money;
|
|
}
|
|
$val = $staffs[$id];
|
|
$val['money'] = $money;
|
|
$val['ratio'] = $oneMoney ? sprintf("%.2f", $money / $oneMoney * 100) : 0;
|
|
$val['rank'] = $i;
|
|
$i++;
|
|
if (in_array($id, $showStaffIds)) {
|
|
$result[] = $val;
|
|
}
|
|
}
|
|
|
|
if (count($result) >= 10) {
|
|
$top = array_slice($result, 0, 3);
|
|
$bottom = array_slice($result, -3, 3);
|
|
$middle = array_slice($result, 3, 4);
|
|
$result = array_merge($top, $bottom, $middle);
|
|
}
|
|
|
|
|
|
$this->success('请求成功', $result);
|
|
}
|
|
|
|
|
|
//服务协议
|
|
public function serviceContent()
|
|
{
|
|
$this->success('请求成功', [
|
|
'content' => "<h1>用户服务协议</h1>",
|
|
'name' => '青动时代',
|
|
'logo' => ''
|
|
]);
|
|
}
|
|
}
|
|
|