first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
/**
======================
*模块数据获取公共文件
======================
*/
use think\facade\Db;
//客户查看编辑数据权限判断
function customer_auth($uid,$customer_id)
{
$customer = Db::name('Customer')->where(['id' => $customer_id])->find();
if($customer['belong_uid']==0){
return $customer;
}
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
$role= 0;
if($auth==1){
//可见部门数据
$dids = get_role_departments($uid);
if(in_array($customer['belong_did'],$dids)){
$role= 1;
}
}
else if($auth==0){
$auth_array=[];
if(!empty($customer['share_ids'])){
$share_ids = explode(",",$customer['share_ids']);
$auth_array = array_merge($auth_array,$share_ids);
}
array_push($auth_array,$customer['belong_uid']);
//部门负责人
$dids = get_leader_departments($uid);
if(in_array($uid,$auth_array) || in_array($customer['belong_did'],$dids)){
$role= 1;
}
}
if($role == 0){
throw new \think\exception\HttpException(405, '无权限访问');
}
else{
return $customer;
}
}
//读取联系人
function customer_contact($cid)
{
$contact = Db::name('CustomerContact')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray();
return $contact;
}
//读取销售机会
function customer_chance($cid)
{
$chance = Db::name('CustomerChance')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray();
return $chance;
}
+251
View File
@@ -0,0 +1,251 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\api\BaseController;
use app\customer\model\Customer;
use app\customer\model\CustomerTrace;
use app\customer\model\CustomerContact;
use app\customer\model\CustomerChance;
use think\facade\Db;
use think\facade\View;
class Api extends BaseController
{
//获取客户列表
public function get_customer()
{
$param = get_params();
$uid = $this->uid;
$where = array();
$whereOr = array();
if (!empty($param['keywords'])) {
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
}
$where[]=['delete_time','=',0];
$where[]=['discard_time','=',0];
if (!empty($param['uid'])) {
$where[] = ['belong_uid', '=', $param['uid']];
}
else{
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
if($auth == 0){
$whereOr[] = ['belong_uid','=',$uid];
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
$dids_a = get_leader_departments($uid);
$dids_b = get_role_departments($uid);
$dids = array_merge($dids_a, $dids_b);
if(!empty($dids)){
$whereOr[] = ['belong_did','in',$dids];
}
}
}
$model = new Customer();
$list = $model->datalist($param,$where,$whereOr);
table_assign(0, '', $list);
}
//分配客户
public function distribute()
{
if (request()->isAjax()) {
$params = get_params();
//是否是客户管理员
$auth = isAuth($this->uid,'customer_admin','conf_1');
if($auth==0){
return to_assign(1, "只有客户管理员才有权限操作");
}
$data['id'] = $params['id'];
$data['belong_uid'] = $params['uid'];
$data['belong_did'] = $params['did'];
$data['distribute_time'] = time();
if (Db::name('Customer')->update($data) !== false) {
add_log('allot', $data['id'],[],'客户');
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//锁住、解锁客户
public function customer_lock()
{
if (request()->isAjax()) {
$params = get_params();
//是否是客户管理员
$auth = isAuth($this->uid,'customer_admin','conf_1');
if($auth==0){
return to_assign(1, "只有客户管理员才有权限操作");
}
$data['id'] = $params['id'];
$data['is_lock'] = $params['is_lock'];
if (Db::name('Customer')->update($data) !== false) {
if($data['is_lock']==1){
add_log('lock', $data['id'],[],'客户');
}
else{
add_log('unlock', $data['id'],[],'客户');
}
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//彻底删除客户
public function delete()
{
if (request()->isDelete()) {
$params = get_params();
//是否是客户管理员
$auth = isAuth($this->uid,'customer_admin','conf_1');
if($auth==0){
return to_assign(1, "只有客户管理员才有权限操作");
}
$data['id'] = $params['id'];
$data['delete_time'] = -1;
if (Db::name('Customer')->update($data) !== false) {
//删除客户联系人
Db::name('CustomerContact')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
//删除客户机会
Db::name('CustomerChance')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
add_log('delete', $params['id']);
return to_assign();
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//跟进记录列表
public function get_trace()
{
$param = get_params();
$where = array();
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.cid', '=', $param['cid']];
$model = new CustomerTrace();
$list = $model->datalist($param,$where);
return table_assign(0, '', $list);
}
//销售机会列表
public function get_chance()
{
$param = get_params();
$where = array();
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.cid', '=', $param['cid']];
if (!empty($param['keywords'])) {
$where[] = ['a.title|a.content', 'like', '%' . $param['keywords'] . '%'];
}
$model = new CustomerChance();
$list = $model->datalist($param,$where);
return table_assign(0, '', $list);
}
//获取联系人数据
public function get_contact()
{
$param = get_params();
$where = array();
$where[] = ['delete_time', '=', 0];
$where[] = ['cid', '=', $param['cid']];
$model = new CustomerContact();
$list = $model->datalist($param,$where);
return table_assign(0, '', $list);
}
//设置联系人
public function set_contact()
{
if (request()->isAjax()) {
$param = get_params();
$detail= Db::name('CustomerContact')->where(['id' => $param['id']])->find();
CustomerContact::where(['cid' => $detail['cid']])->update(['is_default'=>0]);
$res = CustomerContact::where(['id' => $param['id']])->update(['is_default'=>1]);
if ($res) {
add_log('edit', $param['id'], $param,'客户联系人');
return to_assign();
} else {
return to_assign(1, '操作失败');
}
} else {
return to_assign(1, '参数错误');
}
}
//添加附件
public function add_file()
{
$param = get_params();
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$fid = Db::name('CustomerFile')->strict(false)->field(true)->insertGetId($param);
if ($fid) {
return to_assign(0, '上传成功', $fid);
}
}
//删除附件
public function delete_file()
{
if (request()->isDelete()) {
$id = get_params("id");
$data['id'] = $id;
$data['delete_time'] = time();
if (Db::name('CustomerFile')->update($data) !== false) {
$detail = Db::name('CustomerFile')->where('id', $id)->find();
$file_name = Db::name('File')->where('id', $detail['file_id'])->value('name');
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//获取客户等级
public function get_customer_grade()
{
$list = get_base_data('customer_grade');
return to_assign(0, '', $list);
}
//获取客户状态
public function get_customer_status()
{
$list = get_base_type_data('basic_customer',1);
return to_assign(0, '', $list);
}
//获取客户意向
public function get_intent_status()
{
$list = get_base_type_data('basic_customer',2);
return to_assign(0, '', $list);
}
}
+93
View File
@@ -0,0 +1,93 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\validate\BasicCustomerCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Basic extends BaseController
{
public function datalist()
{
if (request()->isAjax()) {
$param = get_params();
$where=[];
if (!empty($param['types'])) {
$where[] = ['types', '=', $param['types']];
}
$list = Db::name('BasicCustomer')->where($where)->order('create_time asc')->select();
return to_assign(0, '', $list);
} else {
return view();
}
}
//新建编辑
public function add()
{
if (request()->isAjax()) {
$param = get_params();
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(BasicCustomerCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
$res = Db::name('BasicCustomer')->strict(false)->field('title,types,id,update_time')->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
}
return to_assign();
} else {
try {
validate(BasicCustomerCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$insertId = Db::name('BasicCustomer')->strict(false)->field('title,types,id,create_time')->insertGetId($param);
if ($insertId) {
add_log('add', $insertId, $param);
}
return to_assign();
}
}
}
//设置
public function set()
{
$param = get_params();
$res = Db::name('BasicCustomer')->strict(false)->field('id,status')->update($param);
if ($res) {
if($param['status'] == 0){
add_log('disable', $param['id'], $param);
}
else if($param['status'] == 1){
add_log('recovery', $param['id'], $param);
}
return to_assign();
}
else{
return to_assign(0, '操作失败');
}
}
}
+161
View File
@@ -0,0 +1,161 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\CustomerChance as CustomerChanceModel;
use think\facade\Db;
use think\facade\View;
class Chance extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerChanceModel();
}
/**
* 数据列表
*/
public function datalist()
{
$param = get_params();
$uid=$this->uid;
if (request()->isAjax()) {
$where=[];
$whereOr=[];
$where[]=['a.delete_time','=',0];
if (!empty($param['keywords'])) {
$where[] = ['a.title|a.content|c.name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['stage'])) {
$where[] = ['a.stage','=',$param['stage']];
}
if (!empty($param['uid'])) {
$where[] = ['a.belong_uid','=',$param['uid']];
}
$map=[];
$mapOr=[];
$map[]=['delete_time','=',0];
$map[]=['discard_time','=',0];
$mapOr[] = ['belong_uid','=',$uid];
$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
$dids_a = get_leader_departments($uid);
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
if($auth == 0){
if(!empty($dids_a)){
$mapOr[] = ['belong_did','in',$dids_a];
}
$cids = Db::name('Customer')
->where($map)
->where(function ($query) use($mapOr) {
if (!empty($mapOr)){
$query->whereOr($mapOr);
}
})->column('id');
$where[] = ['a.cid', 'in',$cids];
}
$list = $this->model->datalist($param,$where);
return table_assign(0, '', $list);
}
else{
View::assign('is_auth', isAuth($uid,'customer_admin','conf_1'));
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()){
if(isset($param['discovery_time'])){
$param['discovery_time'] = strtotime($param['discovery_time']);
}
if(isset($param['expected_time'])){
$param['expected_time'] = strtotime($param['expected_time']);
}
$param['update_time'] = time();
if (!empty($param['id']) && $param['id'] > 0) {
$this->model->edit($param);
} else {
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id>0) {
$detail = $this->model->getById($id);
View::assign('detail', $detail);
return view('edit');
}
$customer_id = isset($param['cid']) ? $param['cid'] : 0;
$customer_name = Db::name('Customer')->where('id',$customer_id)->value('name');
View::assign('customer_id', $customer_id);
View::assign('customer_name', $customer_name);
if(is_mobile()){
return view('qiye@/customer/chance_add');
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
$detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name');
$detail['stage_name'] =Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title');
View::assign('detail', $detail);
if(is_mobile()){
return view('qiye@/customer/chance_view');
}
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
if (request()->isDelete()) {
$this->model->delById($id);
} else {
return to_assign(1, "错误的请求");
}
}
}
+164
View File
@@ -0,0 +1,164 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\CustomerContact as CustomerContactModel;
use app\customer\validate\ContactValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Contact extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerContactModel();
}
/**
* 数据列表
*/
public function datalist()
{
$param = get_params();
if (request()->isAjax()) {
$uid=$this->uid;
$where=[];
$whereOr=[];
$where[]=['delete_time','=',0];
if (!empty($param['keywords'])) {
$where[] = ['id|name|mobile|email', 'like', '%' . $param['keywords'] . '%'];
}
$map=[];
$mapOr=[];
$map[]=['delete_time','=',0];
$map[]=['discard_time','=',0];
$mapOr[] = ['belong_uid','=',$uid];
$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
$dids_a = get_leader_departments($uid);
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
if($auth == 0){
if(!empty($dids_a)){
$mapOr[] = ['belong_did','in',$dids_a];
}
$cids = Db::name('Customer')
->where($map)
->where(function ($query) use($mapOr) {
if (!empty($mapOr)){
$query->whereOr($mapOr);
}
})->column('id');
$whereOr[] = ['cid', 'in',$cids];
}
$whereOr[] = ['admin_id','=',$uid];
$list = $this->model->datalist($param,$where,$whereOr);
return table_assign(0, '', $list);
}
else{
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (isset($param['birthday'])) {
$param['birthday'] = strtotime($param['birthday']);
}
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(ContactValidate::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->edit($param);
} else {
try {
validate(ContactValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['admin_id'] = $this->uid;
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$cid = isset($param['cid']) ? $param['cid'] : 0;
if ($id>0) {
$detail = $this->model->getById($id);
View::assign('detail', $detail);
return view('edit');
}
if($cid>0){
View::assign('customer_name', Db::name('Customer')->where('id',$cid)->value('name'));
}
View::assign('customer_id', $cid);
View::assign('customer_id', $cid);
if(is_mobile()){
return view('qiye@/customer/contact_add');
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
if(is_mobile()){
return view('qiye@/customer/contact_view');
}
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
if (request()->isDelete()) {
$this->model->delById($id);
} else {
return to_assign(1, "错误的请求");
}
}
}
+236
View File
@@ -0,0 +1,236 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\Customer as CustomerModel;
use app\customer\validate\CustomerValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Customer extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerModel();
}
/**
* 数据列表
*/
public function datalist()
{
$param = get_params();
if (request()->isAjax()) {
$where=[];
$whereOr = [];
$uid = $this->uid;
$tab = isset($param['tab']) ? $param['tab'] : 0;
if (!empty($param['keywords'])) {
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['customer_status'])) {
$where[] = ['customer_status', '=', $param['customer_status']];
}
if (!empty($param['industry_id'])) {
$where[] = ['industry_id', '=', $param['industry_id']];
}
if (!empty($param['source_id'])) {
$where[] = ['source_id', '=', $param['source_id']];
}
if (!empty($param['grade_id'])) {
$where[] = ['grade_id', '=', $param['grade_id']];
}
if (!empty($param['intent_status'])) {
$where[] = ['intent_status', '=', $param['intent_status']];
}
if (!empty($param['follow_time'])) {
$follow_time =explode('~', $param['follow_time']);
$where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
}
if (!empty($param['next_time'])) {
$next_time =explode('~', $param['next_time']);
$where[] = ['next_time', 'between',[strtotime(urldecode($next_time[0])),strtotime(urldecode($next_time[1].' 23:59:59'))]];
}
$where[]=['delete_time','=',0];
$where[]=['discard_time','=',0];
if($tab == 0){
if (!empty($param['uid'])) {
$where[] = ['belong_uid', '=', $param['uid']];
}
else{
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
if($auth == 0){
$whereOr[] = ['belong_uid','=',$uid];
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
$dids_a = get_leader_departments($uid);
$dids_b = get_role_departments($uid);
$dids = array_merge($dids_a, $dids_b);
if(!empty($dids)){
$whereOr[] = ['belong_did','in',$dids];
}
}
else{
$where[] = ['belong_did','<>',0];
}
}
}
//我的客户
if($tab == 1){
$where[] = ['belong_uid','=',$uid];
}
//下属客户
if($tab == 2){
$where[] = ['belong_uid','<>',$uid];
$dids_a = get_leader_departments($uid);
if(!empty($dids_a)){
$where[] = ['belong_did','in',$dids_a];
}
}
//分享客户
if($tab == 3){
$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
}
$list = $this->model->datalist($param,$where,$whereOr);
return table_assign(0, '', $list);
}
else{
View::assign('is_leader', isLeader($this->uid));
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
try {
validate(CustomerValidate::class)->scene($param['scene'])->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
if (!empty($param['id']) && $param['id'] > 0) {
$param['edit_id'] = $this->uid;
$this->model->edit($param);
} else {
$param['admin_id'] = $this->uid;
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$sea = isset($param['sea']) ? $param['sea'] : 0;
View::assign('sea', $sea);
if ($id>0) {
$detail = $this->model->getById($id);
View::assign('detail', $detail);
return view('edit');
}
if($this->uid>1){
View::assign('userinfo', get_admin($this->uid));
}
if(is_mobile()){
return view('qiye@/customer/add');
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
if($detail['customer_status']>0){
$detail['customer_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['customer_status']])->value('title');
}
else{
$detail['customer_status_name']='-';
}
if($detail['intent_status']>0){
$detail['intent_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['intent_status']])->value('title');
}
else{
$detail['intent_status_name']='-';
}
$detail['industry'] = Db::name('Industry')->where(['id' => $detail['industry_id']])->value('title');
$detail['source'] = Db::name('CustomerSource')->where(['id' => $detail['source_id']])->value('title');
$detail['grade'] = Db::name('CustomerGrade')->where(['id' => $detail['grade_id']])->value('title');
//附件
$file_array = Db::name('CustomerFile')
->field('cf.id,f.filepath,f.name,f.filesize,f.fileext,f.create_time,f.admin_id')
->alias('cf')
->join('File f', 'f.id = cf.file_id', 'LEFT')
->order('cf.create_time asc')
->where(array('cf.customer_id' => $id, 'cf.delete_time' => 0))
->select()->toArray();
$detail['file_array'] = $file_array;
$role=0;
if($detail['belong_uid'] == $this->uid && $detail['is_lock'] == 0){
$role=1;
}
View::assign('detail', $detail);
View::assign('role', $role);
if(is_mobile()){
return view('qiye@/customer/view');
}
return view();
}
/**
* 删除
*/
public function del()
{
$param = get_params();
if (request()->isDelete()) {
$id = get_params("id");
$idArray = explode(',', strval($id));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'discard_time' => time()
];
}
foreach ($list as $key => $v) {
if (Db::name('Customer')->update($v) !== false) {
add_log('delete', $param['id']);
}
}
return to_assign(0, '操作成功');
} else {
return to_assign(1, "错误的请求");
}
}
}
+141
View File
@@ -0,0 +1,141 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\CustomerGrade as CustomerGradeModel;
use app\customer\validate\GradeValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Grade extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerGradeModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(GradeValidate::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->edit($param);
} else {
try {
validate(GradeValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id>0) {
$detail = $this->model->getCateById($id);
View::assign('detail', $detail);
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
if (request()->isDelete()) {
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delById($id,$type);
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 设置
*/
public function set()
{
if (request()->isAjax()) {
$param = get_params();
$res = $this->model->strict(false)->field('id,status')->update($param);
if ($res) {
if($param['status'] == 0){
add_log('disable', $param['id'], $param);
}
else if($param['status'] == 1){
add_log('recovery', $param['id'], $param);
}
return to_assign();
}
else{
return to_assign(0, '操作失败');
}
} else {
return to_assign(1, "错误的请求");
}
}
}
+224
View File
@@ -0,0 +1,224 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\Customer as CustomerModel;
use think\facade\Db;
use think\facade\View;
class Index extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerModel();
}
//抢客宝
public function rush()
{
if (request()->isAjax()) {
$param = get_params();
$param['order'] = 'rand()';
$where = array();
$where[] = ['delete_time', '=', 0];
$where[] = ['discard_time', '=', 0];
$where[] = ['belong_uid', '=', 0];
$list = $this->model->datalist($param,$where);
return table_assign(0, '', $list);
} else {
$time = strtotime(date('Y-m-d')." 00:00:00");
$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_2');
$count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count();
View::assign('max_num', $max_num);
View::assign('count', $count);
return view();
}
}
//公海客户
public function sea()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['industry_id'])) {
$where[] = ['industry_id', '=', $param['industry_id']];
}
if (!empty($param['source_id'])) {
$where[] = ['source_id', '=', $param['source_id']];
}
if (!empty($param['grade_id'])) {
$where[] = ['grade_id', '=', $param['grade_id']];
}
if (!empty($param['follow_time'])) {
$follow_time =explode('~', $param['follow_time']);
$where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
}
$where[] = ['delete_time', '=', 0];
$where[] = ['discard_time', '=', 0];
$where[] = ['belong_uid', '=', 0];
$list = $this->model->datalist($param,$where);
return table_assign(0, '', $list);
} else {
return view();
}
}
//废池客户
public function trash()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['industry_id'])) {
$where[] = ['industry_id', '=', $param['industry_id']];
}
if (!empty($param['source_id'])) {
$where[] = ['source_id', '=', $param['source_id']];
}
if (!empty($param['grade_id'])) {
$where[] = ['grade_id', '=', $param['grade_id']];
}
$where[] = ['delete_time', '>', 0];
$where[] = ['discard_time', '=', 0];
$where[] = ['belong_uid', '=', 0];
$list = $this->model->datalist($param,$where);
return table_assign(0, '', $list);
} else {
return view();
}
}
//移入公海
public function to_sea()
{
if (request()->isAjax()) {
$id = get_params("id");
$idArray = explode(',', strval($id));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'belong_uid' => 0,
'belong_did' => 0,
'belong_time' => 0
];
}
foreach ($list as $key => $v) {
if (Db::name('Customer')->update($v) !== false) {
add_log('tosea', $v['id']);
}
}
return to_assign(0, '操作成功');
} else {
return to_assign(1, "错误的请求");
}
}
//获取客户
public function to_get()
{
if (request()->isAjax()) {
$id = get_params("id");
$time = strtotime(date('Y-m-d')." 00:00:00");
$max_num_day = Db::name('DataAuth')->where('name','customer_admin')->value('conf_2');
$count_day = Db::name('Customer')->where([['belong_time','between',[$time,time()]],['belong_uid','=',$this->uid]])->count();
if($count_day>=$max_num_day){
return to_assign(1, "今日领取客户数已到达上限,请明天再来领取");
}
$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_3');
$count = Db::name('Customer')->where([['belong_uid','=',$this->uid]])->count();
if($count>=$max_num){
return to_assign(1, "领取客户数已到达上限,请把部分客户移到公海里再来领取");
}
$data['id'] = $id;
$data['belong_uid'] = $this->uid;
$data['belong_did'] = $this->did;
$data['belong_time'] = time();
if (Db::name('Customer')->update($data) !== false) {
add_log('tosea', $id);
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//客户移入废弃池
public function to_trash()
{
if (request()->isAjax()) {
$params = get_params();
$id = get_params("id");
$idArray = explode(',', strval($id));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'delete_time' => time()
];
}
foreach ($list as $key => $v) {
if (Db::name('Customer')->update($v) !== false) {
add_log('totrash', $params['id']);
}
}
return to_assign(0, '操作成功');
} else {
return to_assign(1, "错误的请求");
}
}
//还原客户
public function to_revert()
{
if (request()->isAjax()) {
$params = get_params();
$id = get_params("id");
$idArray = explode(',', strval($id));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'delete_time' => 0
];
}
foreach ($list as $key => $v) {
if (Db::name('Customer')->update($v) !== false) {
add_log('recovery', $params['id']);
}
}
return to_assign(0, '操作成功');
} else {
return to_assign(1, "错误的请求");
}
}
}
+141
View File
@@ -0,0 +1,141 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\Industry as IndustryModel;
use app\customer\validate\IndustryValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Industry extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new IndustryModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(IndustryValidate::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->edit($param);
} else {
try {
validate(IndustryValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id>0) {
$detail = $this->model->getById($id);
View::assign('detail', $detail);
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
if (request()->isDelete()) {
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delById($id,$type);
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 设置
*/
public function set()
{
if (request()->isAjax()) {
$param = get_params();
$res = $this->model->strict(false)->field('id,status')->update($param);
if ($res) {
if($param['status'] == 0){
add_log('disable', $param['id'], $param);
}
else if($param['status'] == 1){
add_log('recovery', $param['id'], $param);
}
return to_assign();
}
else{
return to_assign(0, '操作失败');
}
} else {
return to_assign(1, "错误的请求");
}
}
}
+141
View File
@@ -0,0 +1,141 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\CustomerSource as CustomerSourceModel;
use app\customer\validate\SourceValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Source extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerSourceModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(SourceValidate::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->edit($param);
} else {
try {
validate(SourceValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id>0) {
$detail = $this->model->getCateById($id);
View::assign('detail', $detail);
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
if (request()->isDelete()) {
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delById($id,$type);
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 设置
*/
public function set()
{
if (request()->isAjax()) {
$param = get_params();
$res = $this->model->strict(false)->field('id,status')->update($param);
if ($res) {
if($param['status'] == 0){
add_log('disable', $param['id'], $param);
}
else if($param['status'] == 1){
add_log('recovery', $param['id'], $param);
}
return to_assign();
}
else{
return to_assign(0, '操作失败');
}
} else {
return to_assign(1, "错误的请求");
}
}
}
+168
View File
@@ -0,0 +1,168 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\CustomerTrace as CustomerTraceModel;
use think\facade\Db;
use think\facade\View;
class Trace extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new CustomerTraceModel();
}
/**
* 数据列表
*/
public function datalist()
{
$param = get_params();
$uid=$this->uid;
if (request()->isAjax()) {
$where=[];
$where[]=['a.delete_time','=',0];
if (!empty($param['keywords'])) {
$where[] = ['a.content|c.name|cc.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['follow_time'])) {
$follow_time =explode('~', $param['follow_time']);
$where[] = ['a.follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
}
if (!empty($param['uid'])) {
$where[] = ['a.admin_id','=',$param['uid']];
}
$map=[];
$mapOr=[];
$map[]=['delete_time','=',0];
$map[]=['discard_time','=',0];
$mapOr[] = ['belong_uid','=',$uid];
$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
$dids_a = get_leader_departments($uid);
//是否是客户管理员
$auth = isAuth($uid,'customer_admin','conf_1');
if($auth == 0){
if(!empty($dids_a)){
$mapOr[] = ['belong_did','in',$dids_a];
}
$cids = Db::name('Customer')
->where($map)
->where(function ($query) use($mapOr) {
if (!empty($mapOr)){
$query->whereOr($mapOr);
}
})->column('id');
$where[] = ['a.cid', 'in',$cids];
}
$list = $this->model->datalist($param,$where);
return table_assign(0, '', $list);
}
else{
View::assign('is_auth', isAuth($uid,'customer_admin','conf_1'));
return view();
}
}
/**
* 添加/编辑
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if(isset($param['follow_time'])){
$param['follow_time'] = strtotime($param['follow_time']);
}
if(isset($param['next_time'])){
$param['next_time'] = strtotime($param['next_time']);
}
$param['update_time'] = time();
if (!empty($param['id']) && $param['id'] > 0) {
$this->model->edit($param);
} else {
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$this->model->add($param);
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id > 0) {
View::assign('detail', $this->model->getById($id));
return view('edit');
}
$customer_id = isset($param['cid']) ? $param['cid'] : 0;
$customer_name = Db::name('Customer')->where('id',$customer_id)->value('name');
View::assign('customer_id', $customer_id);
View::assign('customer_name', $customer_name);
if(is_mobile()){
return view('qiye@/customer/trace_add');
}
return view();
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
$detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name');
$detail['types_name'] = Db::name('BasicCustomer')->where('id',$detail['types'])->value('title');
$detail['stage_name'] = Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title');
if($detail['chance_id']>0){
$detail['chance'] = Db::name('CustomerChance')->where(['id' => $detail['chance_id']])->value('title');
}
else{
$detail['chance']='-';
}
View::assign('detail', $detail);
if(is_mobile()){
return view('qiye@/customer/trace_view');
}
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
if (request()->isDelete()) {
$this->model->delById($id);
} else {
return to_assign(1, "错误的请求");
}
}
}
+5
View File
@@ -0,0 +1,5 @@
<?php
// 这是系统自动生成的event定义文件
return [
];
+9
View File
@@ -0,0 +1,9 @@
<?php
// 这是系统自动生成的middleware定义文件
return [
//开启session中间件
//'think\middleware\SessionInit',
//验证勾股OA是否完成安装
\app\home\middleware\Install::class,
];
+208
View File
@@ -0,0 +1,208 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
use app\api\model\EditLog;
class Customer extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($param=[],$where=[],$whereOr=[])
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = 'id desc';
if(!empty($param['order_field']) && !empty($param['order_type'])){
$order = $param['order_field'].' '.$param['order_type'];
}
try {
$list = self::where($where)
->where(function ($query) use($whereOr) {
if (!empty($whereOr)){
$query->whereOr($whereOr);
}
})
->orderRaw($order)
->paginate(['list_rows'=> $rows])
->each(function ($item, $key){
$item->create_time = to_date($item->create_time);
$item->update_time = to_date($item->update_time);
if($item->belong_uid>0){
$item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name');
$item->belong_department = Db::name('Department')->where(['id' => $item->belong_did])->value('title');
}
else{
$item->belong_name='-';
$item->belong_department='-';
}
if($item->industry_id>0){
$item->industry = Db::name('Industry')->where(['id' => $item->industry_id])->value('title');
}
else{
$item->industry='-';
}
if($item->grade_id>0){
$item->grade = Db::name('CustomerGrade')->where(['id' => $item->grade_id])->value('title');
}
else{
$item->grade='-';
}
if($item->source_id>0){
$item->source = Db::name('CustomerSource')->where(['id' => $item->source_id])->value('title');
}
else{
$item->source='-';
}
if($item->customer_status>0){
$item->customer_status_name = Db::name('BasicCustomer')->where(['id' => $item->customer_status])->value('title');
}
else{
$item->customer_status_name='-';
}
if($item->intent_status>0){
$item->intent_status_name = Db::name('BasicCustomer')->where(['id' => $item->intent_status])->value('title');
}
else{
$item->intent_status_name='-';
}
if($item->follow_time==0){
$item->follow_time='-';
}
else{
$item->follow_time = date('Y-m-d',$item->follow_time);
}
if($item->next_time==0){
$item->next_time='-';
}
else{
$item->next_time = date('Y-m-d',$item->next_time);
}
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
if(!empty($contact)){
$item->contact_name = $contact['name'];
$item->contact_mobile = $contact['mobile'];
$item->contact_email = $contact['email'];
}
else{
$item->contact_name = '';
$item->contact_mobile = '';
$item->contact_email = '';
}
});
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$param['update_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
$contact = [
'name' => $param['c_name'],
'mobile' => $param['c_mobile'],
'sex' => $param['c_sex'],
'qq' => $param['c_qq'],
'wechat' => $param['c_wechat'],
'email' => $param['c_email'],
'cid' => $insertId,
'is_default' => 1,
'create_time' => time(),
'admin_id' => $param['admin_id']
];
Db::name('CustomerContact')->strict(false)->field(true)->insert($contact);
add_log('add', $insertId, $param);
$log=new EditLog();
$log->add('Customer',$insertId);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
$old = self::find($param['id']);
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
$log=new EditLog();
$log->edit('Customer',$param['id'],$param,$old);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
$info['belong_department'] = Db::name('Department')->where(['id' => $info['belong_did']])->value('title');
$info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name');
if(!empty($info['share_ids'])){
$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
$info['share_names'] = implode(',',$share_names);
}
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
self::where('id', $id)->update(['discard_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+130
View File
@@ -0,0 +1,130 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class CustomerChance extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($param=[],$where=[])
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'a.id desc' : $param['order'];
try {
$list = self::where($where)
->field('a.*')
->alias('a')
->join('Customer c','a.cid = c.id')
->order($order)
->paginate(['list_rows'=> $rows])
->each(function ($item, $key){
$item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name');
$item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name');
$item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title');
$item->expected_time = date('Y-m-d', $item->expected_time);
$item->discovery_time = date('Y-m-d', $item->discovery_time);
$item->is_contract = Db::name('Contract')->where(['chance_id'=>$item->id,'delete_time'=>0])->count();
});
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');
$info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name');
$assist_names = Db::name('Admin')->where([['id','in',$info['assist_ids']]])->column('name');
$info['assist_names'] = implode(',',$assist_names);
$contract = Db::name('Contract')->where(['chance_id'=>$info['id'],'delete_time'=>0])->find();
if(!empty($contract)){
$info['contract'] = $contract['name'];
$info['contract_id'] = $contract['id'];
}
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+134
View File
@@ -0,0 +1,134 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class CustomerContact extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($param,$where,$whereOr=[])
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = self::where($where)
->where(function ($query) use($whereOr) {
if (!empty($whereOr)){
$query->whereOr($whereOr);
}
})
->order($order)
->paginate(['list_rows'=> $rows])
->each(function ($item, $key){
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
$item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name');
$item->create_time = to_date($item->create_time);
});
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
if(!empty($info['birthday'])){
$info['birthday'] = date('Y-m-d',$info['birthday']);
}
else{
$info['birthday'] = '';
}
$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
$detail=self::find($id);
if($detail['is_default'] == 1){
$count = Db::name('Customer')->where(['id' => $detail['cid'],'delete_time'=>0])->count();
if($count>0){
return to_assign(1, '首要联系人,不能删除');
}
}
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+108
View File
@@ -0,0 +1,108 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class CustomerGrade extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($where, $param)
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+108
View File
@@ -0,0 +1,108 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class CustomerSource extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($where, $param)
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+149
View File
@@ -0,0 +1,149 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class CustomerTrace extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($param,$where)
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'a.id desc' : $param['order'];
try {
$list = self::where($where)
->field('a.*')
->alias('a')
->join('Customer c','a.cid = c.id')
->join('CustomerChance cc','a.chance_id = cc.id','left')
->order($order)
->paginate(['list_rows'=> $rows])
->each(function ($item, $key){
$item->follow_time = date('Y-m-d H:i',$item->follow_time);
$item->next_time = date('Y-m-d H:i',$item->next_time);
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
$item->type_name = Db::name('BasicCustomer')->where(['id' => $item->types])->value('title');
$item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title');
$item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name');
if($item->chance_id>0){
$item->chance = Db::name('CustomerChance')->where(['id' => $item->chance_id])->value('title');
}
else{
$item->chance='-';
}
});
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time');
$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time');
Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time');
$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time');
Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');
$file_array=[];
if(!empty($info['file_ids'])){
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
}
$info['file_array'] = $file_array;
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
$cid = self::where('id', $id)->value('cid');
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('follow_time');
$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('next_time');
if(!empty($follow_time)){
Db::name('Customer')->strict(false)->field(true)->update(['id'=>$cid,'follow_time'=>$follow_time,'next_time'=>$next_time]);
}
else{
Db::name('Customer')->strict(false)->field(true)->update(['id'=>$cid,'follow_time'=>0,'next_time'=>0]);
}
return to_assign();
}
}
+79
View File
@@ -0,0 +1,79 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\model;
use think\model;
use think\facade\Db;
class Industry extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($where, $param)
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
return $info;
}
}
@@ -0,0 +1,34 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
class BasicCustomerCheck extends Validate
{
protected $rule = [
'title' => 'require',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['id', 'title'],
];
}
+43
View File
@@ -0,0 +1,43 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class ChanceValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$id = isset($data['id'])?$data['id']:0;
$count = Db::name('CustomerChance')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.checkOne' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['title', 'id'],
];
}
+34
View File
@@ -0,0 +1,34 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class ContactValidate extends Validate
{
protected $rule = [
'name' => 'require',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['title', 'id'],
];
}
@@ -0,0 +1,44 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class CustomerValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$id = isset($data['id'])?$data['id']:0;
$count = Db::name('Customer')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'name' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'name.require' => '名称不能为空',
'name.checkOne' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['name'],
'edit' => ['name','id'],
'oaedit' => ['id'],
];
}
+43
View File
@@ -0,0 +1,43 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class GradeValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$id = isset($data['id'])?$data['id']:0;
$count = Db::name('CustomerGrade')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.checkOne' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['title', 'id'],
];
}
@@ -0,0 +1,43 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class IndustryValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$id = isset($data['id'])?$data['id']:0;
$count = Db::name('Industry')->where([['title','=',$data['title']],['id','<>',$id]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.checkOne' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['title', 'id'],
];
}
+43
View File
@@ -0,0 +1,43 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\customer\validate;
use think\Validate;
use think\facade\Db;
class SourceValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$id = isset($data['id'])?$data['id']:0;
$count = Db::name('CustomerSource')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.checkOne' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['title', 'id'],
];
}
+140
View File
@@ -0,0 +1,140 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<div class="layui-card">
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
<ul class="layui-tab-title" style="border-bottom:none;">
<li class="layui-this" data-index="1">客户状态</li>
<li data-index="2">客户意向</li>
<li data-index="3">跟进方式</li>
<li data-index="4">销售阶段</li>
</ul>
<div class="layui-tab-content" style="padding:0">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
</div>
</div>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm add-new" type="button">+ 新增内容</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool, element = layui.element,form = layui.form;
var data_type=1;
element.on('tab(tab)', function(data){
data_type = data.index+1;
layui.pageTable.reload({where:{types:data_type},page:{curr:1}});
return false;
});
layui.pageTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'基础数据列表'
,url: "/customer/basic/datalist"
,where:{types:data_type}
,page: false
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(test)',function (obj) {
if(obj.event === 'edit'){
addExpense(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该数据吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/basic/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该数据吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/basic/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
});
$('body').on('click','.add-new',function(){
addExpense(0,'');
});
function addExpense(id,val){
var title = '新增内容';
if(id>0){
title = '编辑内容';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/basic/add", {id: id,types:data_type,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写内容');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+89
View File
@@ -0,0 +1,89 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">新增销售机会</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="3">{$customer_name}</td>
<td class="layui-td-gray-2">客户联系人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($customer_id)" id="v"}
<option value="{$v.id}">{$v.name}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">机会标题<font>*</font></td>
<td colspan="3"><input type="text" name="title" autocomplete="off" lay-verify="required" lay-reqText="请输入机会标题" placeholder="请输入机会标题" class="layui-input"></td>
<td class="layui-td-gray">发现时间<font>*</font></td>
<td><input type="text" name="discovery_time" readonly lay-verify="required" lay-reqText="请选择发现时间" placeholder="请选择发现时间" class="layui-input tool-time"></td>
</tr>
<tr>
<td class="layui-td-gray">销售阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">预计金额<font>*</font></td>
<td><input type="text" name="expected_amount" autocomplete="off" lay-verify="required|number" lay-reqText="请输入预计金额" placeholder="请输入预计金额" class="layui-input"></td>
<td class="layui-td-gray-2">预计签单时间<font>*</font></td>
<td><input type="text" name="expected_time" readonly lay-verify="required" lay-reqText="请选择预计签单时间" placeholder="请选择预计签单时间" class="layui-input tool-time"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">需求描述<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入需求描述" lay-verify="required" lay-reqText="请输入需求描述" class="layui-textarea"></textarea></td>
</tr>
<tr>
<td class="layui-td-gray">归属人员<font>*</font></td>
<td>
<input type="text" name="belong_name" readonly placeholder="请选择归属人员" class="layui-input picker-admin">
<input type="hidden" name="belong_uid" lay-verify="required" lay-reqText="请选择归属人员">
</td>
<td class="layui-td-gray">协助人员</td>
<td colspan="3">
<input type="text" name="assist_names" placeholder="请选择协助人员" class="layui-input picker-admin" data-type="2">
<input type="hidden" name="assist_ids">
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="cid" value="{$customer_id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'chanceTable');
}
}
let clickbtn = $(this);
tool.post("/customer/chance/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+127
View File
@@ -0,0 +1,127 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
{gt name="$is_auth" value="0"}
<div class="layui-input-inline user-name" style="width:100px;">
<input type="text" name="username" placeholder="选择归属人" class="layui-input picker-admin" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
{/gt}
<div class="layui-input-inline" style="width:120px;">
<select name="stage">
<option value="">销售阶段</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="输入关键字,机会主题/沟通内容/客户名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div>
<h3>线索机会</h3>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker','tablePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool, form = layui.form;
layui.chanceTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'线索机会列表'
,url: "/customer/chance/datalist"
,cellMinWidth: 80
,page: true //开启分页
,is_excel: true
,height: 'full-114'
,limit: 20
,cols: [[
{field: 'id', title: '编号', width: 80, align: 'center'}
,{field:'belong_name',title: '归属人',align:'center',width: 80}
,{field:'title',title: '机会主题'}
,{field:'customer',title: '关联客户',width: 300}
,{field:'discovery_time',title: '发现时间',align:'center',width: 100}
,{ field: 'expected_time', title: '预计签单时间', width: 110, align: 'center'}
,{ field: 'expected_amount', title: '预计签单金额', width: 110, align: 'center'}
,{field:'stage_name',title: '当前阶段',width: 80, align: 'center'}
,{field:'is_contract',title: '是否签单', align:'center',width: 80,templet: function(d){
if(d.is_contract>0){
return '<span class="green">已签单</span>';
}
else{
return '<span class="red">未签单</span>';
}
}}
,{fixed:'right',width:130,title: '操作', align:'center',templet: function(d){
var html = '<div class="layui-btn-group">';
var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
if(d.is_contract>0){
btn1='';
btn3='';
}
if(d.admin_id == login_admin){
return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
}
else{
return '<div class="layui-btn-group">'+btn2+'</div>';
}
}}
]]
});
table.on('tool(test)', function(obj){
var data = obj.data; //获得当前行数据
var layEvent = obj.event;
if(layEvent === 'edit'){ //编辑
let url = '/customer/chance/add/id/'+data.id;
tool.side(url);
}
if(layEvent === 'view'){ //查看
let url = '/customer/chance/view/id/'+data.id;
tool.side(url);
}
if(layEvent === 'del'){ //删除
layer.confirm('确定要删除该销售机会吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.delete('/customer/chance/chance_del',{'id':data.id},callback);
layer.close(index);
});
}
return false;
})
//监听搜索提交
form.on('submit(webform)', function(data) {
layui.pageTable.reload({
where: data.field,
page: {curr: 1}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+90
View File
@@ -0,0 +1,90 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑销售机会</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="3">{$detail.customer}</td>
<td class="layui-td-gray-2">客户联系人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($detail.cid)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.contact_id"} selected{/eq}>{$v.name}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">机会标题<font>*</font></td>
<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" lay-verify="required" lay-reqText="请输入机会标题" placeholder="请输入机会标题" class="layui-input"></td>
<td class="layui-td-gray">发现时间<font>*</font></td>
<td>
<input type="text" name="discovery_time" value="{$detail.discovery_time|date='Y-m-d'}" readonly lay-verify="required" lay-reqText="请选择发现时间" placeholder="请选择发现时间" class="layui-input tool-time">
</td>
</tr>
<tr>
<td class="layui-td-gray">销售阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.stage"} selected{/eq}>{$v.title}</option>
{/volist}
</td>
<td class="layui-td-gray">预计金额<font>*</font></td>
<td> <input type="text" name="expected_amount" autocomplete="off" value="{$detail.expected_amount}" lay-verify="required|number" lay-reqText="请输入预计金额" placeholder="请输入预计金额" class="layui-input"></td>
<td class="layui-td-gray-2">预计签单时间<font>*</font></td>
<td><input type="text" name="expected_time" value="{$detail.expected_time|date='Y-m-d'}" readonly lay-verify="required" lay-reqText="请选择预计签单时间" placeholder="请选择预计签单时间" class="layui-input tool-time"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">需求描述<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入需求描述" lay-verify="required" lay-reqText="请输入需求描述" class="layui-textarea">{$detail.content}</textarea></td>
</tr>
<tr>
<td class="layui-td-gray">归属人员<font>*</font></td>
<td>
<input type="text" name="belong_name" value="{$detail.belong_name}" readonly placeholder="请选择归属人员" class="layui-input picker-admin">
<input type="hidden" name="belong_uid" value="{$detail.belong_uid}" lay-verify="required" lay-reqText="请选择归属人员">
</td>
<td class="layui-td-gray">协助人员</td>
<td colspan="3">
<input type="text" name="assist_names" value="{$detail.assist_names}" placeholder="请选择协助人员" class="layui-input picker-admin" data-type="2">
<input type="hidden" name="assist_ids" value="{$detail.assist_ids}">
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code==0){
tool.sideClose(1000,'chanceTable');
}
}
let clickbtn = $(this);
tool.post("/customer/chance/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+57
View File
@@ -0,0 +1,57 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">销售机会</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="3">{$detail.customer}</td>
<td class="layui-td-gray-2">客户联系人</td>
<td>{$detail.contact}</td>
</tr>
<tr>
<td class="layui-td-gray">机会标题</td>
<td colspan="3">{$detail.title}</td>
<td class="layui-td-gray">发现时间</td>
<td>{$detail.discovery_time|date="Y-m-d"}</td>
</tr>
<tr>
<td class="layui-td-gray">销售阶段</td>
<td>{$detail.stage_name}</td>
<td class="layui-td-gray">预计金额</td>
<td>{$detail.expected_amount}</td>
<td class="layui-td-gray-2">预计签单时间</td>
<td>{$detail.expected_time|date="Y-m-d"}</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">需求描述</td>
<td colspan="5">{$detail.content}</td>
</tr>
<tr>
<td class="layui-td-gray">归属人员</td>
<td>{$detail.belong_name}</td>
<td class="layui-td-gray">协助人员</td>
<td colspan="3">{$detail.assist_names}</td>
</tr>
{notempty name="$detail.contract"}
<tr>
<td class="layui-td-gray">签单合同</td>
<td colspan="5">{$detail.contract} <span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/contract/contract/view?id={$detail.contract_id}">详情</span></td>
</tr>
{/notempty}
</table>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->
+96
View File
@@ -0,0 +1,96 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-2">新增联系人</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$customer_name|default=''}</td>
</tr>
<tr>
<td class="layui-td-gray">姓名<font>*</font></td>
<td>
<input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
</td>
<td class="layui-td-gray">联系电话<font>*</font></td>
<td>
<input type="text" name="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
</td>
<td class="layui-td-gray">性别<font>*</font></td>
<td>
<input type="radio" name="sex" value="1" title="男">
<input type="radio" name="sex" value="2" title="女">
</td>
</tr>
<tr>
<td class="layui-td-gray">微 信 号</td>
<td>
<input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
</td>
<td class="layui-td-gray">QQ号码</td>
<td>
<input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
</td>
<td class="layui-td-gray">电子邮箱</td>
<td>
<input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">称谓</td>
<td>
<input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
</td>
<td class="layui-td-gray">部门</td>
<td>
<input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
</td>
<td class="layui-td-gray">职务</td>
<td>
<input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">生日</td>
<td><input type="text" name="birthday" readonly placeholder="请选择" class="layui-input tool-time"></td>
<td class="layui-td-gray">家庭住址</td>
<td colspan="3"><input type="text" name="address" placeholder="请输入联系人家庭住址" class="layui-input"></td>
</tr>
</table>
<div class="pt-3">
<input type="hidden" name="cid" value="{$customer_id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
if(!data.field.sex){
layer.msg('请选择性别');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'contactTable');
}
}
let clickbtn = $(this);
tool.post("/customer/contact/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+103
View File
@@ -0,0 +1,103 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="输入关键字,姓名/手机/邮箱" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="table_customer_contact" lay-filter="table_customer_contact"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div>
<h3>客户联系人</h3>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool;
layui.contactTable = table.render({
elem: "#table_customer_contact"
,toolbar: "#toolbarDemo"
,url: "/customer/contact/datalist"
,page: true
,limit: 20
,is_excel: true
,cellMinWidth: 80
,height: 'full-114'
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'name',title: '姓名',align:'center',width:80}
,{field:'mobile',title: '手机号码', align:'center',width:120}
,{field:'email',title: '电子邮箱',width:200,templet: function(d){
return d.email==''?'-':d.email;
}}
,{field:'qq',title: 'QQ号码', align:'center',width:100,templet: function(d){
return d.qq==''?'-':d.qq;
}}
,{field:'wechat',title: '微信号', align:'center',width:100,templet: function(d){
return d.wechat==''?'-':d.wechat;
}}
,{field:'customer',title: '关联客户'}
,{field:'admin_name',title: '创建人',width:90,align:'center'}
,{field:'create_time', title: '创建时间',width:150,align:'center'}
,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn0='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
html = '<div class="layui-btn-group">'+btn0+btn1+btn2+'</div>';
if(d.admin_id == login_admin){
return html;
}
else{
return btn0;
}
}}
]]
});
table.on('tool(table_customer_contact)',function (obj) {
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
var data = obj.data;
if (obj.event === 'view') {
tool.side("/customer/contact/view?id="+data.id);
return;
}
if (obj.event === 'edit') {
tool.side("/customer/contact/add?id="+data.id);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除该联系人吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/customer/contact/del", { id: data.id }, callback);
layer.close(index);
});
return;
}
});
}
</script>
{/block}
<!-- /脚本 -->
+97
View File
@@ -0,0 +1,97 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-2">编辑联系人</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">姓名<font>*</font></td>
<td>
<input type="text" name="name" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
</td>
<td class="layui-td-gray">联系电话<font>*</font></td>
<td>
<input type="text" name="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
</td>
<td class="layui-td-gray">性别<font>*</font></td>
<td>
<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">微 信 号</td>
<td>
<input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
</td>
<td class="layui-td-gray">QQ号码</td>
<td>
<input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
</td>
<td class="layui-td-gray">电子邮箱</td>
<td>
<input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">称谓</td>
<td>
<input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
</td>
<td class="layui-td-gray">部门</td>
<td>
<input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
</td>
<td class="layui-td-gray">职务</td>
<td>
<input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">生日</td>
<td><input type="text" name="birthday" value="{$detail.birthday}" readonly placeholder="请选择" class="layui-input tool-time"></td>
<td class="layui-td-gray">家庭住址</td>
<td colspan="3"><input type="text" value="{$detail.address}" name="address" placeholder="请输入联系人家庭住址" class="layui-input"></td>
</tr>
</table>
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="scene" value="edit">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
if(!data.field.sex){
layer.msg('请选择性别');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'contactTable');
}
}
let clickbtn = $(this);
tool.post("/customer/contact/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+59
View File
@@ -0,0 +1,59 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-2">联系人信息</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">姓名</td>
<td>{$detail.name} </td>
<td class="layui-td-gray">联系电话</td>
<td>{$detail.mobile}</td>
<td class="layui-td-gray">性别</td>
<td>
{eq name="$detail.sex" value="1"}男{/eq}
{eq name="$detail.sex" value="2"}女{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">微 信 号</td>
<td>{$detail.wechat}</td>
<td class="layui-td-gray">QQ号码</td>
<td>{$detail.qq}</td>
<td class="layui-td-gray">电子邮箱</td>
<td>{$detail.email}</td>
</tr>
<tr>
<td class="layui-td-gray">称谓</td>
<td>{$detail.nickname}</td>
<td class="layui-td-gray">部门</td>
<td>{$detail.department}</td>
<td class="layui-td-gray">职务</td>
<td>{$detail.position}</td>
</tr>
<tr>
<td class="layui-td-gray">生日</td>
<td>{$detail.birthday}</td>
<td class="layui-td-gray">家庭住址</td>
<td colspan="3">{$detail.address}</td>
</tr>
</table>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->
+151
View File
@@ -0,0 +1,151 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">新增客户信息</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称<font>*</font></td>
<td colspan="3"><input type="text" name="name" lay-verify="required" lay-reqText="请输入客户名称" autocomplete="off" placeholder="请输入客户名称" class="layui-input"></td>
<td class="layui-td-gray">客户来源<font>*</font></td>
<td>
<select name="source_id" lay-verify="required" lay-reqText="请选择客户来源">
<option value="">请选择客户来源</option>
{volist name=":get_base_data('customer_source')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">联系地址<font>*</font></td>
<td><input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系地址" placeholder="请输入客户联系地址" class="layui-input"></td>
<td class="layui-td-gray">所属行业<font>*</font></td>
<td>
<select name="industry_id" lay-verify="required" lay-reqText="请选择所属行业">
<option value="">请选择所属行业</option>
{volist name=":get_base_data('Industry')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">客户等级<font>*</font></td>
<td>
<select name="grade_id" lay-verify="required" lay-reqText="请选择客户等级">
<option value="">请选择客户等级</option>
{volist name=":get_base_data('customer_grade')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
</tr>
{eq name="$sea" value="0"}
<tr>
<td class="layui-td-gray">归属员工</td>
<td>
<input type="text" name="belong_name" value="{$userinfo.name|default=''}" autocomplete="off" readonly placeholder="请选择客户归属人" class="layui-input">
<input type="hidden" name="belong_uid" value="{$userinfo.id|default=0}">
<input type="hidden" name="belong_did" value="{$userinfo.did|default=0}">
</td>
<td class="layui-td-gray">归属部门</td>
<td><input type="text" name="belong_department" value="{$userinfo.department|default=''}" autocomplete="off" readonly class="layui-input"></td>
<td class="layui-td-gray">共享员工</td>
<td>
<input type="text" name="share_names" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
<input type="hidden" name="share_ids">
</td>
</tr>
{/eq}
<tr>
<td class="layui-td-gray" style="vertical-align:top">客户介绍<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入客户介绍信息" lay-verify="required" lay-reqText="请输入客户介绍信息" class="layui-textarea"></textarea></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">经营业务</td>
<td colspan="5"><textarea name="market" placeholder="请输入客户主要经营业务" class="layui-textarea"></textarea></td>
</tr>
<tr>
<td colspan="6"><strong>首要联系人</strong></td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人<font>*</font></td>
<td><input type="text" name="c_name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input"></td>
<td class="layui-td-gray">联系电话<font>*</font></td>
<td><input type="text" name="c_mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
<td class="layui-td-gray">性别<font>*</font></td>
<td>
<input type="radio" name="c_sex" value="1" title="男">
<input type="radio" name="c_sex" value="2" title="女" >
</td>
</tr>
<tr>
<td class="layui-td-gray">电子邮箱</td>
<td><input type="text" name="c_email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
<td class="layui-td-gray">微 信 号</td>
<td><input type="text" name="c_wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
<td class="layui-td-gray">QQ号码</td>
<td><input type="text" name="c_qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
</tr>
<tr><td colspan="6"><strong>备注信息</strong></td></tr>
<tr>
<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
<input type="hidden" name="scene" value="add"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker'];
function gouguInit() {
var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
//选择归属人人弹窗
$('body').on('click','[name="belong_name"]',function () {
var ids=$('[name="belong_uid"]').val(),names=$('[name="belong_name"]').val();
oaPicker.employeeInit({
ids:ids,
names:names,
type:1,
callback:function(data){
let select_id=[],select_name=[],select_did=[],select_dname=[];
for(var a=0; a<data.length;a++){
select_id.push(data[a].id);
select_name.push(data[a].name);
select_did.push(data[a].did);
select_dname.push(data[a].department);
}
$('[name="belong_uid"]').val(select_id.join(','));
$('[name="belong_name"]').val(select_name.join(','));
$('[name="belong_did"]').val(select_did.join(','));
$('[name="belong_department"]').val(select_dname.join(','));
}
});
});
//监听提交
form.on('submit(webform)', function (data) {
if(!data.field.c_sex){
layer.msg('请完善首要联系人性别');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/customer/customer/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+290
View File
@@ -0,0 +1,290 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.tab-1 .user-name,.tab-2 .user-name{display:none;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
<ul class="layui-tab-title">
<li class="layui-this">全部客户</li>
<li>我的客户</li>
<li {eq name="$is_leader" value="0"} style="display:none;"{/eq}>下属客户</li>
<li>共享客户</li>
</ul>
</div>
</div>
<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:172px;">
<input type="text" class="layui-input" data-range="~" placeholder="最近跟进日期" readonly name="follow_time" id="follow_time">
</div>
<div class="layui-input-inline" style="width:172px;">
<input type="text" class="layui-input" data-range="~" placeholder="下次跟进日期" readonly name="next_time" id="next_time">
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="industry_id">
<option value="">所属行业</option>
{volist name=":get_base_data('Industry')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="grade_id">
<option value="">客户等级</option>
{volist name=":get_base_data('customer_grade')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="source_id">
<option value="">渠道来源</option>
{volist name=":get_base_data('customer_source')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="customer_status">
<option value="">客户状态</option>
{volist name=":get_base_type_data('basic_customer',1)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="intent_status">
<option value="">客户意向</option>
{volist name=":get_base_type_data('basic_customer',2)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
{gt name="$is_leader" value="0"}
<div class="layui-input-inline user-name" style="width:100px;">
<input type="text" name="username" placeholder="下属员工" class="layui-input picker-sub" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
{/gt}
<div class="layui-input-inline" style="width:188px;">
<input type="text" name="keywords" placeholder="输入关键字,客户名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:148px">
<input type="hidden" name="tab" value="0" />
<input type="hidden" name="order_field" value=''>
<input type="hidden" name="order_type" value=''>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="table_customer" lay-filter="table_customer"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-group">
<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/customer/customer/add">+ 添加客户</button>
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="import"><i class="layui-icon">&#xe66f;</i></button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const is_leader = '{$is_leader}';
const moduleInit = ['tool','tablePlus','oaPicker','uploadPlus','laydatePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool ,form = layui.form,element = layui.element, oaPicker = layui.oaPicker,uploadPlus=layui.uploadPlus,laydatePlus=layui.laydatePlus;
var follow_time = new laydatePlus({'target':'follow_time'});
var next_time = new laydatePlus({'target':'next_time'});
//tab切换
element.on('tab(tab)', function(data){
$('[name="tab"]').val(data.index);
$("#barsearchform")[0].reset();
$("#barsearchform").attr('class','layui-form gg-form-bar border-x tab-'+data.index);
let searchObject = form.val('barsearchform');
layui.pageTable.reload({where:searchObject,page:{curr:1}});
return false;
});
layui.pageTable = table.render({
elem: "#table_customer"
,title: '客户列表'
,toolbar: "#toolbarDemo"
,url: "/customer/customer/datalist"
,page: true
,limit: 20
,cellMinWidth: 80
,height: 'full-154'
,autoSort: false
,cols:[
[ //表头
{type:'checkbox',fixed:'left'},
{field: 'id',title: 'ID号',align: 'center',sort: true,width: 80},
{
field: 'name',
title: '客户名称',
minWidth:300,
templet: function (d) {
return '<span class="layui-color-' + d.grade_id + '">『' + d.grade + '』</span>'+d.name
}
},
{
field: 'customer_status_name',
title: '客户状态',
align: 'center',
width: 100
},{
field: 'intent_status_name',
title: '客户意向',
align: 'center',
width: 100
},{
field: 'contact_name',
title: '联系人',
align: 'center',
width: 80
},{
field: 'contact_mobile',
title: '手机号码',
align: 'center',
width: 120
},{
field: 'follow_time',
title: '最近跟进时间',
align: 'center',
sort: true,
width: 120
},{
field: 'next_time',
title: '下次跟进时间',
align: 'center',
sort: true,
width: 120
},{
field: 'source',
title: '来源渠道',
align: 'center',
width: 100
}, {
field: 'industry',
title: '客户所属行业',
align: 'center',
width: 120
},{
field: 'belong_name',
title: '所属员工',
align: 'center',
width: 80
},{
field: 'belong_department',
title: '所属部门',
align: 'center',
width: 90
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
},{
field: 'right',
fixed:'right',
title: '操作',
width: 142,
align: 'center',
templet: function (d) {
var html = '<div class="layui-btn-group">';
var btn0='<span class="layui-btn layui-btn-xs layui-bg-blue" lay-event="view">查看</span>';
var btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移入公海</span>';
if(d.belong_uid == login_admin && d.is_lock==0){
return html+btn0+btn1+btn2+'</div>';
}
else{
return html+btn0+'</div>';
}
}
}
]
]
});
//表头工具栏事件
table.on('toolbar(table_customer)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
var data = checkStatus.data;
if (obj.event === 'import') {
let importUpload = new uploadPlus({
"title":'批量导入客户',
"use":'import',
"url":'/api/import/import_customer/type/my',
"import":{
"template":'/static/home/file/勾股OA客户导入模板.xlsx',
"tips":'如果导入失败,请根据提示注意检查表格数据,客户来源、所属行业、需要是系统中存在的数据,如果不存在的话可能会导入失败。'
},
callback:function(res){
layui.pageTable.reload();
}
});
return;
}
var idArray=[];
for(var i=0;i<data.length;i++){
idArray.push(data[i].id);
}
if (obj.event === 'sea') {
if(data.length==0){
layer.msg('请选择要操作的客户');
return false;
}
layer.confirm('您确定要把选中的客户移入公海?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/index/to_sea", {id: idArray.join(',')}, callback);
layer.close(index);
});
}
});
table.on('tool(table_customer)',function (obj) {
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
var data = obj.data;
if (obj.event === 'view') {
tool.side("/customer/customer/view?id="+data.id);
return;
}
if (obj.event === 'edit') {
tool.side("/customer/customer/add?id="+data.id);
return;
}
if (obj.event === 'remove') {
layer.confirm('确定把该客户移入公海吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/customer/index/to_sea", { id: data.id }, callback);
layer.close(index);
});
return;
}
});
}
</script>
{/block}
<!-- /脚本 -->
+145
View File
@@ -0,0 +1,145 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">编辑客户信息</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称<font>*</font></td>
<td colspan="3"><input type="text" name="name" lay-verify="required" value="{$detail.name}" lay-reqText="请输入客户名称" autocomplete="off" placeholder="请输入客户名称" class="layui-input"></td>
<td class="layui-td-gray">客户来源<font>*</font></td>
<td>
<select name="source_id" lay-verify="required" lay-reqText="请选择客户来源">
<option value="">请选择客户来源</option>
{volist name=":get_base_data('customer_source')" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.source_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">联系地址<font>*</font></td>
<td colspan="3"><input type="text" name="address" value="{$detail.address}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系地址" placeholder="请输入客户联系地址" class="layui-input"></td>
<td class="layui-td-gray">所属行业<font>*</font></td>
<td>
<select name="industry_id" lay-verify="required" lay-reqText="请选择所属行业">
<option value="">请选择所属行业</option>
{volist name=":get_base_data('Industry')" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.industry_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">客户等级<font>*</font></td>
<td>
<select name="grade_id" lay-verify="required" lay-reqText="请选择客户等级">
<option value="">请选择客户等级</option>
{volist name=":get_base_data('customer_grade')" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.grade_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">客户状态<font>*</font></td>
<td>
<select name="customer_status" lay-verify="required" lay-reqText="请选择客户状态">
<option value="">请选择客户当前状态</option>
{volist name=":get_base_type_data('basic_customer',1)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.customer_status"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">客户意向<font>*</font></td>
<td>
<select name="intent_status" lay-verify="required" lay-reqText="请选择客户意向">
<option value="">请选择客户意向</option>
{volist name=":get_base_type_data('basic_customer',2)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.intent_status"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
{eq name="$sea" value="0"}
<tr>
<td class="layui-td-gray">归属员工</td>
<td>
<input type="text" name="belong_name" value="{$detail.belong_name|default=''}" autocomplete="off" readonly placeholder="请选择客户归属人" class="layui-input">
<input type="hidden" name="belong_uid" value="{$detail.belong_uid|default=0}">
<input type="hidden" name="belong_did" value="{$detail.belong_did|default=0}">
</td>
<td class="layui-td-gray">归属部门</td>
<td><input type="text" name="belong_department" value="{$detail.belong_department|default=''}" autocomplete="off" readonly class="layui-input"></td>
<td class="layui-td-gray">共享员工</td>
<td colspan="3">
<input type="text" name="share_names" value="{$detail.share_names|default=''}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
<input type="hidden" name="share_ids" value="{$detail.share_ids}">
</td>
</tr>
{/eq}
<tr>
<td class="layui-td-gray" style="vertical-align:top">客户介绍<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入客户介绍信息" lay-verify="required" lay-reqText="请输入客户介绍信息" class="layui-textarea">{$detail.content|default=""}</textarea></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">经营业务</td>
<td colspan="5"><textarea name="market" placeholder="请输入客户主要经营业务" class="layui-textarea">{$detail.market|default=""}</textarea></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">备注信息</td>
<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=""}</textarea></td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="scene" value="edit"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
{block name="copyright"}{/block}
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool','oaPicker'];
function gouguInit() {
var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
//选择归属人人弹窗
$('body').on('click','[name="belong_name"]',function () {
var ids=$('[name="belong_uid"]').val(),names=$('[name="belong_name"]').val();
oaPicker.employeeInit({
ids:ids,
names:names,
type:1,
callback:function(data){
let select_id=[],select_name=[],select_did=[],select_dname=[];
for(var a=0; a<data.length;a++){
select_id.push(data[a].id);
select_name.push(data[a].name);
select_did.push(data[a].did);
select_dname.push(data[a].department);
}
$('[name="belong_uid"]').val(select_id.join(','));
$('[name="belong_name"]').val(select_name.join(','));
$('[name="belong_did"]').val(select_did.join(','));
$('[name="belong_department"]').val(select_dname.join(','));
}
});
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/customer/customer/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+202
View File
@@ -0,0 +1,202 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.layui-tab-card1{border:0}
.layui-tab-title .layui-this{background-color:#fff;}
.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="layui-form p-page">
<h3 class="pb-3">
客户详情
{eq name="$detail.is_lock" value="1"}
<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-warm layui-btn-xs" id="lock" title="去解锁" data-lock="0"><i class="iconfont icon-suozhu"></i></button></div>
{else/}
<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="lock" title="去锁定" data-lock="1"><i class="iconfont icon-jiesuo"></i></button></div>
{/eq}
</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="3">{$detail.name}</td>
<td class="layui-td-gray">录入人</td>
<td>{$detail.admin_name}</td>
</tr>
<tr>
<td class="layui-td-gray">联系地址</td>
<td colspan="3">{$detail.address}</td>
<td class="layui-td-gray">录入时间</td>
<td>{$detail.create_time|date='Y-m-d H:i:s'}</td>
</tr>
{gt name="$detail.belong_uid" value="0"}
<tr>
<td class="layui-td-gray">归属员工</td>
<td>{$detail.belong_name}</td>
<td class="layui-td-gray">归属部门</td>
<td>{$detail.belong_department}</td>
<td class="layui-td-gray">共享员工</td>
<td>{$detail.share_names|default="-"}</td>
</tr>
{/gt}
<tr>
<td class="layui-td-gray">客户等级</td>
<td>{$detail.grade}</td>
<td class="layui-td-gray">所属行业</td>
<td>{$detail.industry}</td>
<td class="layui-td-gray-2">最后更新时间</td>
<td>{$detail.update_time|date='Y-m-d H:i:s'}</td>
</tr>
<tr>
<td class="layui-td-gray">客户来源</td>
<td>{$detail.source}</td>
<td class="layui-td-gray">客户状态</td>
<td>{$detail.customer_status_name}</td>
<td class="layui-td-gray">客户意向</td>
<td>{$detail.intent_status_name}</td>
</tr>
<tr>
<td class="layui-td-gray">
<div>相关附件</div>
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
</td>
<td colspan="5">
<div class="row" id="uploadBox">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="file_{$vo.id}">{:file_card($vo)}</div>
{/volist}
</div>
</td>
</tr>
<tr>
<td colspan="6" style="background-color:#FAFAFA;"><strong>客户介绍</strong></td>
</tr>
<tr>
<td colspan="6">{$detail.content|default=""}</td>
</tr>
{notempty name="$detail.market"}
<tr>
<td colspan="6" style="background-color:#FAFAFA;"><strong>经营业务</strong></td>
</tr>
<tr>
<td colspan="6">{$detail.market}</td>
</tr>
{/notempty}
{notempty name="$detail.remark"}
<tr>
<td colspan="6" style="background-color:#FAFAFA;"><strong>备注信息</strong></td>
</tr>
<tr>
<td colspan="6">{$detail.remark}</td>
</tr>
{/notempty}
</table>
<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" lay-filter="customer" id="customerTab">
<ul class="layui-tab-title">
<li class="layui-this" data-load="true">跟进记录</li>
<li>线索机会</li>
<li>联 系 人</li>
<li>操作记录</li>
</ul>
<div class="layui-tab-content" style="padding:0;">
<div class="layui-tab-item layui-show">
{include file="/customer/view_trace" /}
</div>
<div class="layui-tab-item">
{include file="/customer/view_chance" /}
</div>
<div class="layui-tab-item">
{include file="/customer/view_contact" /}
</div>
<div class="layui-tab-item">
{include file="/customer/view_log" /}
</div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const customer_id = '{$detail.id}';
const moduleInit = ['tool','oaPicker','uploadPlus','oaEdit'];
function gouguInit() {
var form = layui.form,tool=layui.tool, upload = layui.upload,element = layui.element,uploadPlus = layui.uploadPlus;
trace();
element.on('tab(customer)', function(data){
let index = data.index;
if(index == 1){
chance();
}
if(index == 2){
contact();
}
if(index == 3){
log();
}
});
//客户加锁
$('#lock').on('click',function () {
let is_lock=$(this).data('lock');
let tips = '确定要锁住该客户信息吗?锁住后该客户的基本信息不能编辑。';
if(is_lock==0){
tips = '确定要解锁该客户信息吗?';
}
layer.confirm(tips, {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
parent.layui.pageTable.reload();
setTimeout(function(){
location.reload();
},1000);
}
}
tool.post("/customer/api/customer_lock", {id: customer_id,is_lock:is_lock}, callback);
layer.close(index);
});
})
var attachment = new uploadPlus({
"attachment":{
"type":1,//0ajax多文件模式,1ajax单文件单记录模式
"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
"ajaxSave":function(res){
$.ajax({
url: "/customer/api/add_file",
type:'post',
data:{
'customer_id':customer_id,
'file_id':res.data.id,
'file_name':res.data.name
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function(){
location.reload();
},1000)
}
}
})
},
"ajaxDelete":function(file_id){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
$('#file_' + file_id).remove();
}
}
tool.delete("/customer/api/delete_file", {id: file_id}, callback);
}
}
})
}
</script>
{/block}
<!-- /脚本 -->
@@ -0,0 +1,82 @@
<div class="p-3">
<button class="layui-btn layui-btn-sm add-chance">+ 新建线索机会</button>
</div>
<div>
<table class="layui-hide" id="chance" lay-filter="chance"></table>
</div>
<script>
function chance(){
if($('#customerTab').find('li').eq(4).data('load') =='true'){
return false;
}
$('#customerTab').find('li').eq(4).data('load','true');
let tool = layui.tool, table = layui.table;
//项目任务
layui.chanceTable = table.render({
elem: '#chance',
title: '线索机会列表',
cellMinWidth:80,
url: "/customer/api/get_chance",
where:{'cid':customer_id},
page: true, //开启分页
limit: 20,
cols: [[
{field: 'id', title: '序号', width: 80, align: 'center'}
,{field:'belong_name',title: '归属人',align:'center',width: 80}
,{field:'title',title: '机会主题'}
,{field:'stage_name',title: '当前阶段',width: 90, align: 'center'}
,{field:'discovery_time',title: '发现时间',align:'center',width: 90}
,{ field: 'expected_time', title: '预计签单时间', width: 100, align: 'center'}
,{ field: 'expected_amount', title: '预计签单金额', width: 100, align: 'center'}
,{field:'is_contract',title: '是否签单', align:'center',width: 80,templet: function(d){
if(d.is_contract>0){
return '<span class="green">已签单</span>';
}
else{
return '<span class="red">未签单</span>';
}
}}
,{fixed:'right',width:132,title: '操作', align:'center',templet: function(d){
var html = '<div class="layui-btn-group">';
var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
if(d.is_contract>0){
btn1='';
btn3='';
}
return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
}}
]]
});
$('body').on('click','.add-chance',function(){
tool.side('/customer/chance/add?cid='+customer_id);
});
table.on('tool(chance)', function(obj){
var data = obj.data; //获得当前行数据
var layEvent = obj.event;
if(layEvent === 'edit'){ //编辑
let url = '/customer/chance/add/id/'+data.id;
tool.side(url);
}
if(layEvent === 'view'){ //查看
let url = '/customer/chance/view/id/'+data.id;
tool.side(url);
}
if(layEvent === 'del'){ //删除
layer.confirm('确定要删除该线索机会吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.chanceTable.reload();
}
}
tool.delete("/customer/chance/del",{"id":data.id},callback);
layer.close(index);
});
}
return false;
})
}
</script>
@@ -0,0 +1,102 @@
<div class="p-3">
<button class="layui-btn layui-btn-sm add-contact">+ 新增联系人</button>
</div>
<div>
<table class="layui-hide" id="contact" lay-filter="contact"></table>
</div>
<script>
function contact(){
if($('#customerTab').find('li').eq(2).data('load') =='true'){
return false;
}
$('#customerTab').find('li').eq(2).data('load','true');
let tool = layui.tool, table = layui.table;
//项目任务
layui.contactTable = table.render({
elem: '#contact',
title: '联系人列表',
cellMinWidth:80,
url: "/customer/api/get_contact",
where:{'cid':customer_id},
page: true, //开启分页
limit: 20,
cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'name',width:100,title: '联系人姓名', align:'center'}
,{field:'status', title: '性别',width:80,align:'center',templet: function(d){
var html='未知';
var html1='<span class="green">男</span>';
var html2='<span class="blue">女</span>';
if(d.sex==1){
return html1;
}
if(d.sex==2){
return html2;
}
else{
return html;
}
}}
,{field:'mobile',width:110,title: '手机号码', align:'center'}
,{field:'email',title: '电子邮箱'}
,{field:'wechat',width:110,title: '微信号码', align:'center'}
,{field:'qq',width:100,title: 'QQ号码', align:'center'}
,{field:'position',width:120,title: '担任职位', align:'center'}
,{field:'is_default',width:90,title: '首要联系人', align:'center',templet: function(d){
if(d.is_default==1){
return '<span class="green layui-icon layui-icon-success"></span>';
}
else{
return '<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="set" title="设为首要联系人">设置</a>';
}
}}
,{fixed:'right',width:120,title: '操作', align:'center',templet: function(d){
var html = '<div class="layui-btn-group">';
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
return html+btn+btn1+btn2+'</div>';
}}
]]
});
$('body').on('click','.add-contact',function(){
tool.side('/customer/contact/add?cid='+customer_id);
});
table.on('tool(contact)', function(obj){
var data = obj.data; //获得当前行数据
var layEvent = obj.event;
if(layEvent === 'edit'){ //编辑
tool.side('/customer/contact/add/id/'+data.id);
}
if(layEvent === 'view'){ //编辑
tool.side('/customer/contact/view/id/'+data.id);
}
if(layEvent === 'set'){ //查看
layer.confirm('确定要设置该联系人为首要联系人吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.contactTable.reload();
}
}
tool.delete("/customer/api/set_contact",{"id":data.id},callback);
layer.close(index);
});
}
if(layEvent === 'del'){ //删除
layer.confirm('确定要删除该联系人吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.contactTable.reload();
}
}
tool.delete("/customer/contact/del",{"id":data.id},callback);
layer.close(index);
});
}
return false;
})
}
</script>
+9
View File
@@ -0,0 +1,9 @@
<div>
<div id="logList" class="log-timeline p-3"></div>
</div>
<script>
function log(){
let oaEdit = layui.oaEdit;
oaEdit.log('logList','Customer',customer_id);
}
</script>
@@ -0,0 +1,72 @@
<div class="p-3">
<span class="layui-btn layui-btn-sm add-trace">+ 新建跟进记录</span>
</div>
<div>
<table class="layui-hide" id="trace" lay-filter="trace"></table>
</div>
<script>
function trace(){
if($('#customerTab').find('li').eq(0).data('load') =='true'){
return false;
}
$('#customerTab').find('li').eq(0).data('load','true');
let tool = layui.tool, table = layui.table;
layui.traceTable = table.render({
elem: '#trace',
title: '跟进记录列表',
cellMinWidth:80,
url: "/customer/api/get_trace",
where:{'cid':customer_id},
page: true, //开启分页
limit: 20,
cols: [[
{field: 'id', title: 'ID号', width: 80, align: 'center'}
,{field:'admin_name',title: '跟进人',align:'center',width: 80}
,{field:'follow_time',title: '跟进时间',align:'center',width: 150}
, { field: 'stage_name', title: '当前阶段', width: 80, align: 'center'}
,{field:'type_name',title: '跟进方式',width: 80, align: 'center'}
,{field:'chance',title: '销售机会',minWidth:200}
,{field:'content',title: '沟通内容'}
,{field:'next_time',title: '下次跟进时间', align:'center',width: 130}
,{fixed:'right',width:120,title: '操作', align:'center',templet: function(d){
var html = '<div class="layui-btn-group">';
var btn0='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
return html+btn0+btn1+btn2+'</div>';
}}
]]
});
$('body').on('click','.add-trace',function(){
tool.side('/customer/trace/add?cid='+customer_id);
});
table.on('tool(trace)', function(obj){
var data = obj.data; //获得当前行数据
var layEvent = obj.event;
if(layEvent === 'edit'){ //编辑
let url = '/customer/trace/add/id/'+data.id;
tool.side(url);
}
if(layEvent === 'view'){ //查看
let url = '/customer/trace/view/id/'+data.id;
tool.side(url);
}
if(layEvent === 'del'){ //删除
layer.confirm('确定要删除该跟进记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.traceTable.reload();
}
}
tool.delete("/customer/trace/del",{"id":data.id},callback);
layer.close(index);
});
}
return false;
})
}
</script>
+49
View File
@@ -0,0 +1,49 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">客户等级</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户等级名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入客户等级名称" lay-reqText="请输入客户等级名称"class="layui-input" value="{$detail.title|default=''}">
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/customer/grade/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+124
View File
@@ -0,0 +1,124 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="table_customer_grade" lay-filter="table_customer_grade"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加客户等级</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool;
layui.pageTable = table.render({
elem: "#table_customer_grade"
,toolbar: '#toolbarDemo'
,url: "/customer/grade/datalist"
,page: false
,limit: 999
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '类型名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(table_customer_grade)',function (obj) {
if(obj.event === 'edit'){
add_cate(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/set", {id:obj.data.id,status: 0}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/set", {id:obj.data.id,status:1}, callback);
layer.close(index);
});
}
});
$('body').on('click','.add-new',function(){
add_cate(0,'');
});
function add_cate(id,val){
var title = '新增类型';
if(id>0){
title = '编辑类型';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写类型名称');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+121
View File
@@ -0,0 +1,121 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加客户等级</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,defaultToolbar: false
,title:'客户等级列表'
,url: "/customer/grade/index"
,page: false
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '等级名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(test)',function (obj) {
if(obj.event === 'edit'){
addExpense(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该等级吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/grade_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该等级吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/grade_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
});
$('body').on('click','.addNew',function(){
addExpense(0,'');
});
function addExpense(id,val){
var title = '新增等级';
if(id>0){
title = '编辑等级';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/grade/grade_add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写等级名称');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+16
View File
@@ -0,0 +1,16 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<h3 class="pb-3">客户等级详情</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户等级名称</td>
<td>{$detail.title|default=''}"></td>
<td class="layui-td-gray">排序</td>
<td>{$detail.sort|default=0}</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->
+127
View File
@@ -0,0 +1,127 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="layui-row gg-form-bar border-x border-t">
<div class="layui-input-inline"><button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="webform">换一批客户</button></div>
<div class="layui-input-inline red">每点击一次随机获取20个公海客户的信息,每天最多可抢<strong class="mx-1">{$max_num|default="0"}</strong>个客户,你今天已抢了<strong class="mx-1" id="count">{$count}</strong>个客户</div>
</div>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool ,form = layui.form;
layui.pageTable = table.render({
elem: '#test',
title: '抢客宝列表',
toolbar: false,
defaultToolbar: false,
url: "/customer/index/rush", //数据接口
cellMinWidth: 80,
page: false, //开启分页
limit: 20,
height: 'full-114',
cols: [
[ //表头
{
field: 'id',title: 'ID号',align: 'center',width: 80
},{
field: 'name',
title: '客户名称',
minWidth:240,
templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
},{
field: 'contact_name',
title: '联系人',
align: 'center',
width: 80
},{
field: 'contact_mobile',
title: '手机号码',
align: 'center',
width: 110
},{
field: 'contact_email',
title: '电子邮箱',
width: 200
},{
field: 'grade',
title: '客户等级',
align: 'center',
width: 100
},{
field: 'source',
title: '来源渠道',
align: 'center',
width: 100
},{
field: 'industry',
title: '所属行业',
align: 'center',
width: 120
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
},{
field: 'update_time',
title: '最后编辑时间',
align: 'center',
width: 150
},{
field: 'right',
fixed:'right',
title: '操作',
width: 80,
align: 'center',
templet: function (d) {
if(login_admin==1){
return '-';
}
else{
return '<span class="layui-btn layui-btn-xs" lay-event="get">领取客户</span>';
}
}
}
]
]
});
//监听行工具事件
table.on('tool(test)', function(obj) {
var data = obj.data;
if (obj.event === 'get') {
layer.confirm('确定要获取该客户?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
let count =$('#count').text();
$('#count').html(++count);
}
}
tool.post("/customer/index/to_get", {id: data.id}, callback);
layer.close(index);
});
}
});
//监听搜索提交
form.on('submit(webform)', function(data) {
layui.pageTable.reload();
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+263
View File
@@ -0,0 +1,263 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc;cursor: not-allowed; padding:0 12px; width:180px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
.gougu-upload-tips{color:#969696}
.layui-form-item{margin-bottom:8px;}
.layui-input-block{min-height:24px;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-x border-t" id="barsearchform" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:120px;">
<select name="source_id">
<option value="">渠道来源</option>
{volist name=":get_base_data('customer_source')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:120px;">
<select name="industry_id">
<option value="">所属行业</option>
{volist name=":get_base_data('Industry')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:120px;">
<select name="grade_id">
<option value="">客户等级</option>
{volist name=":get_base_data('customer_grade')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:172px;">
<input type="text" class="layui-input" data-range="~" placeholder="最近跟进日期" readonly name="follow_time" id="follow_time">
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-group">
<button class="layui-btn layui-btn-sm" title="添加公海客户" lay-event="add">+ 添加公海客户</button>
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="import"><i class="layui-icon">&#xe66f;</i></button>
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#xe609;</i></button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker','uploadPlus','laydatePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool ,form = layui.form, oaPicker = layui.oaPicker,uploadPlus=layui.uploadPlus,laydatePlus=layui.laydatePlus;
var follow_time = new laydatePlus({'target':'follow_time'});
layui.pageTable = table.render({
elem: '#test',
title: '公海客户列表',
defaultToolbar: false,
toolbar: '#toolbarDemo',
url: "/customer/index/sea", //数据接口
cellMinWidth: 80,
page: true, //开启分页
limit: 20,
height: 'full-114',
cols: [
[ //表头
{type:'checkbox',fixed:'left'},
{field: 'id',title: '编号',align: 'center',width: 80},{
field: 'name',
title: '客户名称',
minWidth:240,
templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
},{
field: 'contact_name',
title: '联系人',
align: 'center',
width: 80
},{
field: 'contact_mobile',
title: '手机号码',
align: 'center',
width: 110
},{
field: 'contact_email',
title: '电子邮箱',
width: 200
},{
field: 'grade',
title: '客户等级',
align: 'center',
width: 100
},{
field: 'source',
title: '来源渠道',
align: 'center',
width: 100
},{
field: 'industry',
title: '所属行业',
align: 'center',
width: 120
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
},{
field: 'update_time',
title: '最后编辑时间',
align: 'center',
width: 150
},{
field: 'right',
fixed:'right',
title: '操作',
width: 190,
align: 'center',
templet: function (d) {
var html = '<div class="layui-btn-group">';
var btn='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="distribute">分配</span>';
var btn1='<span class="layui-btn layui-btn-xs" lay-event="get">领取</span>';
var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">转入废弃池</span>';
return html+btn+btn0+btn1+btn2+'</div>';
}
}
]
]
});
//表头工具栏事件
table.on('toolbar(test)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
var data = checkStatus.data;
if (obj.event === 'add') {
tool.side("/customer/customer/add?sea=1");
return;
}
if (obj.event === 'import') {
let importUpload = new uploadPlus({
"title":'批量导入公海客户',
"use":'import',
"url":'/api/import/import_customer',
"import":{
"template":'/static/home/file/勾股OA客户导入模板.xlsx',
"tips":'如果导入失败,请根据提示注意检查表格数据,客户来源、所属行业、需要是系统中存在的数据,如果不存在的话可能会导入失败。'
},
callback:function(res){
layui.pageTable.reload();
}
});
return;
}
var idArray=[];
for(var i=0;i<data.length;i++){
idArray.push(data[i].id);
}
if (obj.event === 'del') {
if(data.length==0){
layer.msg('请选择要操作的客户');
return false;
}
layer.confirm('您确定要把选中的客户转入废弃池?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/index/to_trash", {id: idArray.join(',')}, callback);
layer.close(index);
});
}
});
//监听行工具事件
table.on('tool(test)', function(obj) {
var data = obj.data;
if(obj.event === 'view'){
tool.side('/customer/customer/view?id='+data.id);
}
if(obj.event === 'edit'){
tool.side('/customer/customer/add?sea=1&id='+data.id);
}
if (obj.event === 'distribute') {
oaPicker.employeeInit({
callback:function(selected){
//这里是选择后的回调方法,可以根据具体需求自定义写哦
let select_id=[],select_name=[],select_did=[];
for(var a=0; a<selected.length;a++){
select_id.push(selected[a].id);
select_name.push(selected[a].name);
select_did.push(selected[a].did);
}
layer.confirm('确定要把该客户分配给'+select_name.join(',')+'?', {
icon: 3,
title: '提示'
}, function(index) {
let callback1 = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/api/distribute", {id: data.id,uid:select_id.join(','),did:select_did.join(',')}, callback1);
layer.close(index);
});
}
});
}
if (obj.event === 'get') {
layer.confirm('确定要领取该客户?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/index/to_get", {id: data.id}, callback);
layer.close(index);
});
}
if (obj.event === 'del') {
layer.confirm('确定要把客户转入废弃池吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.delete("/customer/index/to_trash", {id: data.id,type:1}, callback);
layer.close(index);
});
}
return;
});
}
</script>
{/block}
<!-- /脚本 -->
+218
View File
@@ -0,0 +1,218 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-x border-t" id="barsearchform" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:120px;">
<select name="source_id">
<option value="">渠道来源</option>
{volist name=":get_base_data('customer_source')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:120px;">
<select name="industry_id">
<option value="">所属行业</option>
{volist name=":get_base_data('Industry')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:120px;">
<select name="grade_id">
<option value="">客户等级</option>
{volist name=":get_base_data('customer_grade')" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-group">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="revert"><i class="layui-icon">&#xe605;</i></button>
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#x1006;</i></button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool ,form = layui.form;
layui.pageTable = table.render({
elem: '#test',
title: '废弃客户列表',
toolbar: '#toolbarDemo',
defaultToolbar: false,
url: "/customer/index/trash", //数据接口
cellMinWidth: 80,
page: true, //开启分页
limit: 20,
height: 'full-114',
cols: [
[ //表头
{type:'checkbox',fixed:'left'},
{field: 'id',title: '编号',align: 'center',width: 80},{
field: 'name',
title: '客户名称',
minWidth:240,
templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
},{
field: 'contact_name',
title: '联系人',
align: 'center',
width: 80
},{
field: 'contact_mobile',
title: '手机号码',
align: 'center',
width: 110
},{
field: 'contact_email',
title: '电子邮箱',
width: 200
},{
field: 'grade',
title: '客户等级',
align: 'center',
width: 100
},{
field: 'source',
title: '来源渠道',
align: 'center',
width: 100
},{
field: 'industry',
title: '所属行业',
align: 'center',
width: 120
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
},{
field: 'update_time',
title: '最后编辑时间',
align: 'center',
width: 150
},{
field: 'right',
fixed:'right',
title: '操作',
width: 150,
align: 'center',
templet: function (d) {
var html = '<div class="layui-btn-group">';
var btn1='<span class="layui-btn layui-btn-xs" lay-event="back">拉回公海</span>';
var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">彻底删除</span>';
return html+btn1+btn2+'</div>';
}
}
]
]
});
//表头工具栏事件
table.on('toolbar(test)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
var data = checkStatus.data;
var idArray=[];
for(var i=0;i<data.length;i++){
idArray.push(data[i].id);
}
if (obj.event === 'revert') {
if(data.length==0){
layer.msg('请选择要操作的客户');
return false;
}
layer.confirm('您确定要把选中的客户拉回公海?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/index/to_revert", {id: idArray.join(',')}, callback);
layer.close(index);
});
}
if (obj.event === 'del') {
if(data.length==0){
layer.msg('请选择要操作的客户');
return false;
}
layer.confirm('您确定要把选中的客户彻底删除?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.delete("/customer/customer/del", {id: idArray.join(',')}, callback);
layer.close(index);
});
}
});
//监听行工具事件
table.on('tool(test)', function(obj) {
var data = obj.data;
if(obj.event === 'view'){
tool.side('/customer/index/view?id='+data.id);
}
if (obj.event === 'back') {
layer.confirm('确定要把该客户拉回公海吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/index/to_revert", {id: data.id}, callback);
layer.close(index);
});
}
if (obj.event === 'del') {
layer.confirm('确定要彻底删除该客户吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.delete("/customer/customer/del", {id: data.id}, callback);
layer.close(index);
});
}
return;
});
}
</script>
{/block}
<!-- /脚本 -->
+45
View File
@@ -0,0 +1,45 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">行业类型</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">行业类型名称<font>*</font></td>
<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入行业类型名称" lay-reqText="请输入行业类型名称"class="layui-input" value="{$detail.title|default=''}"></td>
<td class="layui-td-gray">排序</td>
<td><input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/customer/industry/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+124
View File
@@ -0,0 +1,124 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="table_industry" lay-filter="table_industry"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-group">
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加行业类型</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool;
layui.pageTable = table.render({
elem: "#table_industry"
,toolbar: '#toolbarDemo'
,url: "/customer/industry/datalist"
,page: false
,limit: 999
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '类型名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(table_industry)',function (obj) {
if(obj.event === 'edit'){
add_cate(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/industry/set", {id:obj.data.id,status: 0}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/industry/set", {id:obj.data.id,status:1}, callback);
layer.close(index);
});
}
});
$('body').on('click','.add-new',function(){
add_cate(0,'');
});
function add_cate(id,val){
var title = '新增类型';
if(id>0){
title = '编辑类型';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/industry/add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写类型名称');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+16
View File
@@ -0,0 +1,16 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<h3 class="pb-3">行业类型详情</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">行业类型名称</td>
<td>{$detail.title|default=''}"></td>
<td class="layui-td-gray">排序</td>
<td>{$detail.sort|default=0}</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->
+49
View File
@@ -0,0 +1,49 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">客户来源</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户来源名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入客户来源名称" lay-reqText="请输入客户来源名称"class="layui-input" value="{$detail.title|default=''}">
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/customer/source/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+124
View File
@@ -0,0 +1,124 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="table_customer_source" lay-filter="table_customer_source"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加客户来源</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool;
layui.pageTable = table.render({
elem: "#table_customer_source"
,toolbar: '#toolbarDemo'
,url: "/customer/source/datalist"
,page: false
,limit: 999
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '类型名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(table_customer_source)',function (obj) {
if(obj.event === 'edit'){
add_cate(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/set", {id:obj.data.id,status: 0}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/set", {id:obj.data.id,status:1}, callback);
layer.close(index);
});
}
});
$('body').on('click','.add-new',function(){
add_cate(0,'');
});
function add_cate(id,val){
var title = '新增类型';
if(id>0){
title = '编辑类型';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写类型名称');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+121
View File
@@ -0,0 +1,121 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加客户渠道</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,defaultToolbar: false
,title:'客户渠道列表'
,url: "/customer/source/index"
,page: false
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '渠道名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(test)',function (obj) {
if(obj.event === 'edit'){
addExpense(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该渠道吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/source_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该渠道吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/source_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
});
$('body').on('click','.addNew',function(){
addExpense(0,'');
});
function addExpense(id,val){
var title = '新增渠道';
if(id>0){
title = '编辑渠道';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/customer/source/source_add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写渠道名称');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->
+16
View File
@@ -0,0 +1,16 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<h3 class="pb-3">客户来源详情</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户来源名称</td>
<td>{$detail.title|default=''}"></td>
<td class="layui-td-gray">排序</td>
<td>{$detail.sort|default=0}</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->
+107
View File
@@ -0,0 +1,107 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="p-page layui-form">
<h3 class="pb-3">新增跟进记录</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$customer_name}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($customer_id)" id="v"}
<option value="{$v.id}">{$v.name}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进方式<font>*</font></td>
<td>
<select name="types" lay-verify="required" lay-reqText="请选择跟进方式">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',3)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进时间<font>*</font></td>
<td><input type="text" name="follow_time" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea"></textarea></td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">销售机会</td>
<td>
<select name="chance_id">
<option value="">请选择</option>
{volist name=":customer_chance($customer_id)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
<td><input type="text" name="next_time" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray">
<div>相关附件</div>
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="">
</div>
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="cid" value="{$customer_id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'traceTable');
}
}
tool.post("/customer/trace/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+104
View File
@@ -0,0 +1,104 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
{gt name="$is_auth" value="0"}
<div class="layui-input-inline user-name" style="width:100px;">
<input type="text" name="username" placeholder="选择跟进人" class="layui-input picker-admin" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
{/gt}
<div class="layui-input-inline" style="width:175px;">
<input type="text" class="layui-input" id="follow_time" placeholder="下次跟进日期" readonly name="follow_time">
</div>
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="关键字,沟通内容/销售机会/客户名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="table_customer_trace" lay-filter="table_customer_trace"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div>
<h3>跟进记录</h3>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker','laydatePlus','tablePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool, form = layui.form,laydatePlus=layui.laydatePlus;
var follow_time = new laydatePlus({'target':'follow_time'});
layui.traceTable = table.render({
elem: "#table_customer_trace"
, toolbar: "#toolbarDemo"
,url: "/customer/trace/datalist"
,page: true
,limit: 20
,cellMinWidth: 80
,is_excel: true
,height: 'full-114'
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'stage_name',title: '当前阶段',width:100,align:'center'}
,{field:'content',title: '沟通内容',minWidth:300}
,{field:'chance',title: '销售机会',width:200}
,{field:'type_name',title: '跟进方式',width:80,align:'center'}
,{field:'admin_name',title: '跟进人',width:80,align:'center'}
,{field:'follow_time', title: '跟进日期',width:150,align:'center'}
,{field:'next_time', title: '下次跟进日期',width:150,align:'center',style:'color:#16b777'}
,{field:'customer',title: '关联客户',width: 300}
,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
if(d.admin_id == login_admin){
return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
}
else{
return '<div class="layui-btn-group">'+btn1+'</div>';
}
}}
]]
});
table.on('tool(table_customer_trace)',function (obj) {
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
var data = obj.data;
if (obj.event === 'view') {
tool.side("/customer/trace/view?id="+data.id);
return;
}
if (obj.event === 'edit') {
tool.side("/customer/trace/add?id="+data.id);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除该线索机会吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/customer/trace/del", { id: data.id }, callback);
layer.close(index);
});
return;
}
});
}
</script>
{/block}
<!-- /脚本 -->
+113
View File
@@ -0,0 +1,113 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="p-page layui-form">
<h3 class="pb-3">编辑跟进记录</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($detail.cid)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.contact_id"} selected{/eq}>{$v.name}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进方式<font>*</font></td>
<td>
<select name="types" lay-verify="required" lay-reqText="请选择跟进方式">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',3)" id="v"}
<option value="{$v.id}" {eq name="v.id" value="$detail.types"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进时间<font>*</font></td>
<td><input type="text" name="follow_time" value="{$detail.follow_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea">{$detail.content}</textarea></td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}" {eq name="v.id" value="$detail.stage"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">销售机会</td>
<td>
<select name="chance_id">
<option value="">请选择</option>
{volist name=":customer_chance($detail.cid)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.chance_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
<td><input type="text" name="next_time" value="{$detail.next_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray">
<div>相关附件</div>
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
{notempty name="$detail.file_ids"}
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
{/volist}
{/notempty}
</div>
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="cid" value="{$detail.cid}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'traceTable');
}
}
tool.post("/customer/trace/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+57
View File
@@ -0,0 +1,57 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<h3 class="pb-3">跟进记录详细</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人</td>
<td>{$detail.contact}</td>
<td class="layui-td-gray">跟进方式</td>
<td>{$detail.types_name}</td>
<td class="layui-td-gray">跟进时间</td>
<td>{$detail.follow_time|date='Y-m-d H:i'}</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容</td>
<td colspan="5">{$detail.content}</td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段</td>
<td>{$detail.stage_name}</td>
<td class="layui-td-gray">销售机会</td>
<td>{$detail.chance}</td>
<td class="layui-td-gray-2">下次沟通时间</td>
<td>{$detail.next_time|date='Y-m-d H:i'}</td>
</tr>
{notempty name="$detail.file_ids"}
<tr>
<td class="layui-td-gray">相关附件</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
{/volist}
</div>
</td>
</tr>
{/notempty}
</table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->