From 97662ba32e9f5d71ea9ea0f31955872d5cb8c135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=AD=E6=99=93=E8=80=BF?= Date: Sat, 27 Feb 2021 18:08:11 +0800 Subject: [PATCH] v11.0.1 --- application/admin/common.php | 22 + application/admin/controller/Field.php | 37 +- application/admin/controller/Index.php | 1 + application/admin/controller/Install.php | 70 +- application/admin/controller/Users.php | 28 +- application/admin/logic/FieldGrantLogic.php | 17 +- application/admin/logic/MessageLogic.php | 86 +- application/admin/logic/WorkLogic.php | 7 + application/admin/model/Common.php | 3 +- application/admin/model/ExamineStep.php | 3 +- application/admin/model/Excel.php | 793 +++++++++--------- application/admin/model/Field.php | 47 +- application/admin/model/Record.php | 2 +- application/admin/model/Scene.php | 18 +- application/admin/model/User.php | 11 +- application/admin/model/UserField.php | 14 +- application/admin/view/install/index.html | 2 +- application/admin/view/install/step1.html | 14 +- application/admin/view/install/step2.html | 113 ++- application/admin/view/install/step3.html | 12 +- application/admin/view/install/step5.html | 64 ++ application/admin/view/public/footer.html | 2 +- application/bi/controller/Examine.php | 3 +- application/common.php | 37 +- application/crm/controller/Business.php | 25 +- application/crm/controller/Contract.php | 51 +- application/crm/controller/Customer.php | 19 +- application/crm/controller/Invoice.php | 7 +- application/crm/controller/Leads.php | 6 +- application/crm/controller/Product.php | 3 + application/crm/controller/Receivables.php | 355 ++++---- application/crm/controller/Visit.php | 6 +- application/crm/logic/ActivityLogic.php | 7 +- application/crm/logic/CommonLogic.php | 215 +++-- application/crm/logic/IndexLogic.php | 17 +- application/crm/logic/VisitLogic.php | 41 +- application/crm/model/Business.php | 857 ++++++++++---------- application/crm/model/Contacts.php | 36 +- application/crm/model/Contract.php | 42 +- application/crm/model/Customer.php | 134 +-- application/crm/model/Invoice.php | 1 + application/crm/model/Leads.php | 26 +- application/crm/model/Product.php | 155 ++-- application/crm/model/Receivables.php | 21 +- application/oa/controller/Event.php | 4 +- application/oa/controller/Examine.php | 9 +- application/oa/controller/Task.php | 116 +-- application/oa/logic/ExamineLogic.php | 352 +++++++- application/oa/logic/LogLogic.php | 77 +- application/oa/logic/TaskLogic.php | 80 +- application/oa/logic/UserLogic.php | 60 +- application/oa/model/Event.php | 238 +++--- application/oa/model/Examine.php | 138 ++-- application/oa/model/Log.php | 48 +- application/work/controller/Task.php | 4 +- application/work/controller/Tasklable.php | 3 + application/work/controller/Work.php | 22 +- application/work/logic/WorkLogic.php | 168 +++- application/work/model/Task.php | 84 +- application/work/model/Work.php | 7 +- config/config.php | 5 +- config/route_admin.php | 1 + config/route_crm.php | 2 + config/version.php | 4 +- public/sql/5kcrm.sql | 20 +- public/sql/install.sql | 4 +- public/sql/update_sql_20210207.sql | 7 - public/sql/update_sql_20210227.sql | 2 + public/static/icon/success_gray.png | Bin 0 -> 2202 bytes public/static/img/bg.png | Bin 0 -> 470834 bytes public/static/js/step2.js | 69 +- public/static/style/base.css | 64 +- public/static/style/index.css | 1 + public/static/style/loading.css | 52 ++ public/static/style/step1.css | 13 +- public/static/style/step2.css | 37 +- update_sql_20210227.sql | 2 + 77 files changed, 3142 insertions(+), 1981 deletions(-) create mode 100644 application/admin/view/install/step5.html create mode 100644 public/sql/update_sql_20210227.sql create mode 100644 public/static/icon/success_gray.png create mode 100644 public/static/img/bg.png create mode 100644 public/static/style/loading.css create mode 100644 update_sql_20210227.sql diff --git a/application/admin/common.php b/application/admin/common.php index 5ca3274..ef3fe9e 100644 --- a/application/admin/common.php +++ b/application/admin/common.php @@ -170,3 +170,25 @@ function sendRequest($url, $params = array() , $headers = array()) { curl_close($ch); return $return; } + +/** + * 验证序列号 + * @param + * @return + */ +function checkWkCode($wkcode) { + $pub = config('public_key'); + $openssl_pub = openssl_pkey_get_public($pub); + // 验签 + $resArr = openssl_public_decrypt(Hex2String($wkcode), $decrypted, $pub); + if(!$resArr) return false; + return $decrypted; +} + +function Hex2String($hex){ + $string = ''; + for ($i=0; $i < strlen($hex); $i+=2){ + $string .= chr(hexdec($hex[$i].$hex[$i+1])); + } + return $string; +} diff --git a/application/admin/controller/Field.php b/application/admin/controller/Field.php index 404d8f0..f56cdd1 100644 --- a/application/admin/controller/Field.php +++ b/application/admin/controller/Field.php @@ -84,7 +84,7 @@ class Field extends ApiCommon * 自定义字段数据 */ public function read() - { + { $fieldModel = model('Field'); $param = $this->param; $data = $fieldModel->getDataList($param); @@ -116,14 +116,22 @@ class Field extends ApiCommon $types_id = $param['types_id'] ? : 0; // $data['types'] = $param['types']; - $data = $param['data']; - $saveParam = []; # 新增数据 - $updateParam = []; # 编辑数据 - $delParam = []; # 删除数据 - $fieldIds = []; # 删除数据(兼容前端11.*.*版本) + $data = $param['data']; + $saveParam = []; # 新增数据 + $updateParam = []; # 编辑数据 + $delParam = []; # 删除数据 + $fieldIds = []; # 删除数据(兼容前端11.*.*版本) + $errorMessage = []; # 错误数据 $i = 0; foreach ($data AS $k => $v) { $i++; + + # 必填的字段不可以隐藏 + if (!empty($v['is_null']) && !empty($v['is_hidden'])) { + $errorMessage = '必填的字段不可以隐藏!'; + break; + } + if ($v['field_id']) { if (isset($v['is_deleted']) && $v['is_deleted'] == '1') { # 删除 @@ -143,8 +151,8 @@ class Field extends ApiCommon } } - # 错误数据 - $errorMessage = []; + # 必填的字段不可以隐藏 + if ($errorMessage) return resultArray(['error' => $errorMessage]); # 兼容前端11.*.*版本的删除条件处理,通过比较差异,来确定谁被前端给删除了 todo 这段代码需要写在新增上面,不然会把新增的给删除掉 $oldFieldIds = Db::name('admin_field')->where('types', $types)->column('field_id'); @@ -170,7 +178,7 @@ class Field extends ApiCommon # 删除 if (!empty($delParam)) { if (!$data = $fieldModel->delDataById($delParam)) { - $errorMessage[] = $fieldModel->getError(); + if (!empty($fieldModel->getError())) $errorMessage[] = $fieldModel->getError(); } } @@ -312,12 +320,17 @@ class Field extends ApiCommon case 'crm_visit' : $visit = new \app\crm\model\Visit(); $dataInfo = $visit->getDataById(intval($param['action_id'])); + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_visit', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } //判断权限 $auth_user_ids = $userModel->getUserByPer('crm', 'visit', $param['action']); //读写权限 $roPre = $userModel->rwPre($user_id, $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'read'); $rwPre = $userModel->rwPre($user_id, $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); - if (!in_array($dataInfo['owner_user_id'],$auth_user_ids) && !$roPre && !$rwPre) { + if (!in_array($user_id, stringToArray($dataInfo['owner_user_id'])) && !in_array($user_id,$auth_user_ids) && !$roPre && !$rwPre) { header('Content-Type:application/json; charset=utf-8'); exit(json_encode(['code'=>102,'error'=>'无权操作'])); } @@ -614,6 +627,10 @@ class Field extends ApiCommon $userFieldModel = model('UserField'); $width = $param['width'] > 10 ? $param['width'] : ''; $unField = array('pool_day','owner_user_name','is_lock','create_user_name'); + switch ($param['field']) { + case 'status_id_info' : $param['field'] = 'status_id'; + break; + } if (!in_array($param['field'],$unField)) { $res = $userFieldModel->setColumnWidth($param['types'], $param['field'], $width, $userInfo['id']); if (!$res) { diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php index 91f867e..777976e 100644 --- a/application/admin/controller/Index.php +++ b/application/admin/controller/Index.php @@ -52,6 +52,7 @@ class Index extends ApiCommon if ($value['field'] == 'address') $field_arr[$key]['form_type'] = 'map_address'; if ($value['field'] == 'deal_status') $field_arr[$key]['form_type'] = 'deal_status'; if ($value['field'] == 'check_status') $field_arr[$key]['form_type'] = 'check_status'; + if ($param['types'] == 'crm_visit' && $value['field'] == 'owner_user_id') $field_arr[$key]['name'] = '回访人'; } return resultArray(['data' => $field_arr]); diff --git a/application/admin/controller/Install.php b/application/admin/controller/Install.php index ae57915..b37d95f 100644 --- a/application/admin/controller/Install.php +++ b/application/admin/controller/Install.php @@ -27,15 +27,15 @@ class Install extends Controller $param = Request::instance()->param(); $this->param = $param; - $request = request(); - $m = strtolower($request->module()); - $c = strtolower($request->controller()); - $a = strtolower($request->action()); - - if (!in_array($a, array('upgrade','upgradeprocess','checkversion')) && file_exists(CONF_PATH . "install.lock")) { - echo " "; - die(); - } +// $request = request(); +// $m = strtolower($request->module()); +// $c = strtolower($request->controller()); +// $a = strtolower($request->action()); +// +// if (!in_array($a, array('upgrade','upgradeprocess','checkversion')) && file_exists(CONF_PATH . "install.lock")) { +// echo " "; +// die(); +// } } private $upgrade_site = "http://message.72crm.com/"; @@ -73,7 +73,7 @@ class Install extends Controller public function version() { $res = include(CONF_PATH.'version.php'); - return $res ? : array('VERSION' => '9.0.0','RELEASE' => '20190330'); + return $res ? : array('VERSION' => '11.0.0','RELEASE' => '20210219'); } public function step2(){ @@ -114,6 +114,7 @@ class Install extends Controller $username = $param['root']; $password = $param['pwd']; + $wkcode = $param['wkcode']; if (empty($db_config['hostname'])) { return resultArray(['error' => '请填写数据库主机!']); } @@ -141,6 +142,17 @@ class Install extends Controller if (empty($username)) { return resultArray(['error' => '请填写管理员用户名!']); } + if (empty($wkcode)) { + return resultArray(['error' => '请填写序列号!']); + } + $resCheckData = checkWkCode($wkcode); + if (!$resCheckData) { + return resultArray(['error' => '序列号错误!']); + } + $resData = object_to_array(json_decode($resCheckData)); + if ($resData['date'] != date('Y-m-d')) { + return resultArray(['error' => '序列号已失效,请前往悟空官网个人中心获取最新数据!']); + } if (empty($password)) { return resultArray(['error' => '请填写管理员密码!']); } @@ -161,6 +173,7 @@ class Install extends Controller } $db_config['database'] = $database; self::mkDatabase($db_config); + self::mkLicense($wkcode); $C_Patch = substr($_SERVER['SCRIPT_FILENAME'],0,-10); $sql = file_get_contents( $C_Patch.'/public/sql/5kcrm.sql'); $sqlList = parse_sql($sql, 0, ['5kcrm_' => $db_config['prefix']]); @@ -185,9 +198,14 @@ class Install extends Controller //插入信息 Db::connect($db_config)->query("insert into ".$db_config['prefix']."admin_user (username, password, salt, img, thumb_img, realname, create_time, num, email, mobile, sex, status, structure_id, post, parent_id, type, authkey, authkey_time ) values ( '".$username."', '".$password."', '".$salt."', '', '', '管理员', ".time().", '', '', '".$username."', '', 1, 1, 'CEO', 0, 1, '', 0 )"); Db::connect($db_config)->query("insert into ".$db_config['prefix']."hrm_user_det (user_id, join_time, type, status, userstatus, create_time, update_time, mobile, sex, age, job_num, idtype, idnum, birth_time, nation, internship, done_time, parroll_id, email, political, location, leave_time ) values ( 1, ".time().", 1, 1, 2, ".time().", ".time().", '".$username."', '', 0, '', 0, '', '', 0, 0, 0, 0, '', '', '', 0 )"); - touch(CONF_PATH . "install.lock"); + touch(CONF_PATH . "install.lock"); return resultArray(['data'=>'安装成功']); } + + public function step5() + { + return $this->fetch(); + } //ajax 进度条 public function progress() @@ -314,7 +332,7 @@ INFO; { $items = [ 'os' => ['操作系统', PHP_OS, '类Unix', 'ok'], - 'php' => ['PHP版本', PHP_VERSION, '7.2 ( >= 5.6 )', 'ok','性能更佳'], + 'php' => ['PHP版本', PHP_VERSION, '7.3 ( >= 5.6 )', 'ok','性能更佳'], 'gd' => ['gd', '开启', '开启', 'ok'], 'openssl' => ['openssl', '开启', '开启', 'ok'], 'pdo' => ['pdo', '开启', '开启', 'ok'], @@ -379,4 +397,32 @@ INFO; } return $items; } + + /** + * 验证序列号 + * @param + * @return + */ + public function checkCodeOld($username) { + $encryption = md5($username); + $substr = substr($username, strlen($username)-6); + $subArr = str_split($substr, 1); + $code = ''; + for ($i = 0; $i <= 5; $i++) { + $code .= $encryption[$subArr[$i]]; + } + return $code; + } + + //写入license文件 + private function mkLicense($wkcode) + { + file_put_contents( CONF_PATH.'license.dat', $wkcode); + // 判断写入是否成功 + // $config = include CONF_PATH.'license.dat'; + // if (empty($config)) { + // return resultArray(['error' => 'license配置写入失败!']); + // } + return true; + } } \ No newline at end of file diff --git a/application/admin/controller/Users.php b/application/admin/controller/Users.php index 9a31ac9..b87b62d 100644 --- a/application/admin/controller/Users.php +++ b/application/admin/controller/Users.php @@ -91,7 +91,8 @@ class Users extends ApiCommon $data = $userModel->getDataById($param['id']); if (!$data) { return resultArray(['error' => $userModel->getError()]); - } + } + $data['serverUserInfo'] = $this->queryLoginUser(); return resultArray(['data' => $data]); } @@ -500,6 +501,7 @@ class Users extends ApiCommon $data['username'] = $param['username']; $data['password'] = user_md5($param['password'], $userData['salt'], $param['username']); $data['userInfo'] = $userData; + $data['mobile'] = $param['username']; $resSync = model('Sync')->syncData($data); if ($resSync) { unset($data['userInfo']); @@ -658,9 +660,6 @@ class Users extends ApiCommon /** * 设置关注 * - * @return \think\response\Json - * @throws \think\Exception - * @throws \think\exception\PDOException */ public function userStar() { @@ -700,10 +699,6 @@ class Users extends ApiCommon /** * 获取下属(全部层级) * - * @return \think\response\Json - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\ModelNotFoundException - * @throws \think\exception\DbException */ public function subordinate() { @@ -720,4 +715,21 @@ class Users extends ApiCommon return resultArray(['data' => $data]); } + + /** + * 获取当前登录人信息 + * + */ + public function queryLoginUser() + { + $resData = []; + $wkcode = file_get_contents(CONF_PATH.'license.dat'); + if ($wkcode) { + $resCheckData = checkWkCode($wkcode); + if ($resCheckData) { + $resData = object_to_array(json_decode($resCheckData)); + } + } + return $resData; + } } diff --git a/application/admin/logic/FieldGrantLogic.php b/application/admin/logic/FieldGrantLogic.php index 518e4fe..aaaa1b1 100644 --- a/application/admin/logic/FieldGrantLogic.php +++ b/application/admin/logic/FieldGrantLogic.php @@ -535,7 +535,7 @@ class FieldGrantLogic { $content = []; - $visitList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_visit')->select(); + $visitList = Db::name('admin_field')->field(['name', 'field'])->where(['type' => 'crm_visit', 'operating' => 0])->select(); # 处理自定义字段 foreach ($visitList AS $key => $value) { @@ -551,14 +551,19 @@ class FieldGrantLogic } # 处理固定字段 -// $content[] = ['name' => '回访时间', 'field' => 'visit_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; - $content[] = ['name' => '负责人', 'field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; - $content[] = ['name' => '客户', 'field' => 'customer_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; - $content[] = ['name' => '联系人', 'field' => 'contract_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '回访编号', 'field' => 'number', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '回访形式', 'field' => 'shape', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '客户满意度', 'field' => 'satisfaction', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '回访时间', 'field' => 'visit_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '客户名称', 'field' => 'customer_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; + $content[] = ['name' => '联系人', 'field' => 'contacts_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; + $content[] = ['name' => '合同编号', 'field' => 'contract_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; + $content[] = ['name' => '客户反馈', 'field' => 'feedback', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; + $content[] = ['name' => '回访人', 'field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0]; $content[] = ['name' => '创建时间', 'field' => 'create_time', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; $content[] = ['name' => '编辑时间', 'field' => 'update_time', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; $content[] = ['name' => '创建人', 'field' => 'create_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; - $content[] = ['name' => '合同', 'field' => 'contacts_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0]; + Db::name('admin_field_grant')->insert([ 'role_id' => $roleId, diff --git a/application/admin/logic/MessageLogic.php b/application/admin/logic/MessageLogic.php index ca39298..5ab707c 100644 --- a/application/admin/logic/MessageLogic.php +++ b/application/admin/logic/MessageLogic.php @@ -10,7 +10,7 @@ class MessageLogic { $where = ''; switch ($label) { - + case '1': //任务 $where = array('in', [1, 2, 3]);// break; @@ -21,7 +21,7 @@ class MessageLogic $where = array('in', [6, 7, 8]); break; case '4': //公告 - $where = array('eq', 9); + $where = 9; break; case '5' : //日程 $where = 10; @@ -36,14 +36,14 @@ class MessageLogic } return $where; } - + public function getDataList($param) { $userId = $param['user_id']; unset($param['user_id']); //types 1表示已读 0表示未读 if (isset($param['is_read'])) { - $where['m.read_time'] = ['=', 0]; + $where['m.read_time'] = 0; } $where['m.to_user_id'] = $userId; $where['m.is_delete'] = ['eq', 1]; @@ -74,11 +74,11 @@ class MessageLogic ->page($param['page'], $param['limit']) ->order($order) ->select(); + $dataCount = db('admin_message') + ->alias('m') + ->join('__ADMIN_USER__ user', 'user.id=m.from_user_id', 'LEFT') + ->where($where)->count(); } - $dataCount = db('admin_message') - ->alias('m') - ->join('__ADMIN_USER__ user', 'user.id=m.from_user_id', 'LEFT') - ->where($where)->count(); //1表示已读 0表示未读 foreach ($list as $k => $v) { if ($v['read_time'] == 0) { @@ -90,48 +90,38 @@ class MessageLogic if ($v['type'] == 4) { $content = db('admin_comment') ->where( - [ 'status' => 1, - 'comment_id' => $v['action_id'], + ['status' => 1, + 'type_id' => $v['action_id'], 'type' => ['like', '%' . $v['controller_name' . '%']], 'user_id' => $v['from_user_id'] ]) - ->find(); - if (!empty($content)) { - $list[$k]['content'] = $content['content']; - } - } elseif (in_array($v['type'], ['12', '15'])) { + ->select(); + $list[$k]['content'] = $content[$k]['content']; + } elseif (in_array($v['type'], ['7','12', '15',25])) { $content = db('admin_examine_record')->where(['types_id' => $v['action_id'], 'types' => ['like', '%' . $v['controller_name' . '%']], 'check_user_id' => $v['from_user_id']])->field('content')->find(); if ($content['content']) { $list[$k]['content'] = $content['content']; } } - if ($v['type'] == 10) { - $item = db('oa_event_notice')->where('id', $v['action_id'])->find(); - - if ($item) { - $noticetype = $item['noticetype']; - if($item['noticetype'] == 1){ - $advance_time =$v['advance_time'] - ($item['number'] * 60); - }elseif ($item['noticetype'] == 2){ - $advance_time =$v['advance_time'] - ($item['number'] * 60 * 60); - }else{ - $advance_time = $v['advance_time'] - ($item['number'] * 60 * 60 * 24); - } - - $time = time(); - if ($time == $advance_time ||$time>$advance_time) { - $type['value']=$item['number']; - $type['type']=$item['noticetype']; - $list[$k]['content']= $type; - $list[$k]['action_id'] = $item['event_id']; - } - } -// p(222); + if ($v['type'] == 10 && $v['advance_time'] < time()) { + $item = db('oa_event_notice')->where('id', $v['action_id'])->find(); + if ($item) { + $type['value'] = $item['number']; + $type['type'] = $item['noticetype']; + $list[$k]['content'] = $type; + $list[$k]['action_id'] = $item['event_id']; + } + } elseif($v['type'] == 10 && $v['advance_time'] > time()) { + unset($list[$k]); } + $time=time(); if (in_array($v['type'], ['17', '18', '19', '20', '27'])) { $error_file_path = db('admin_import_record')->where('id', $v['action_id'])->find(); - if($error_file_path['error_data_file_path']==''){ - $list[$k]['title'] = ''; + $week = strtotime("+7 day", $error_file_path['create_time']); + if ($time > (int)$week && $error_file_path['error_data_file_path'] != '') { + $list[$k]['valid'] = 0; + } else { + $list[$k]['valid'] = 1; } $list[$k]['error_file_path'] = $error_file_path['error_data_file_path']; } @@ -151,7 +141,7 @@ class MessageLogic } return $data; } - + /** * 修改状态变为已读 * @param $param @@ -173,7 +163,7 @@ class MessageLogic $data['list'] = $list; return $data; } - + /** * 删除 * @@ -190,7 +180,7 @@ class MessageLogic } return db('admin_message')->where(['message_id' => $param['message_id']])->update(['is_delete' => 2]); } - + /** * 批量更新 * @param $param @@ -200,7 +190,7 @@ class MessageLogic */ public function readAllMessage($param) { - + $where = [ 'to_user_id' => $param['user_id'], 'read_time' => 0 @@ -220,7 +210,7 @@ class MessageLogic $data['list'] = $list; return $data; } - + /** * 批量删除已读 * @param $param @@ -244,7 +234,7 @@ class MessageLogic $data['list'] = $list; return $data; } - + public function unreadCount($param) { $userId = $param['user_id']; @@ -253,7 +243,7 @@ class MessageLogic $label = ''; $where['to_user_id'] = ['eq', $userId]; $where['is_delete'] = ['eq', 1]; - + $where['type'] = $this->label(''); $allCount = db('admin_message')->where($where)->count(); $where['type'] = $this->label(1); @@ -265,10 +255,10 @@ class MessageLogic $where['type'] = 9; $announceCount = db('admin_message')->where($where)->count(); $where['type'] = $this->label(5); - $eventCount = db('admin_message')->where($where)->where('advance_time', '>=', time())->count(); + $eventCount = db('admin_message')->where($where)->where(['advance_time'=>['<', time()],'advance_time'=>['<>',0]])->count(); $where['type'] = $this->label(6); $crmCount = db('admin_message')->where($where)->count(); - + $data = []; $data['allCount'] = $allCount ?: 0; $data['taskCount'] = $taskCount ?: 0; diff --git a/application/admin/logic/WorkLogic.php b/application/admin/logic/WorkLogic.php index f050dcf..010c104 100644 --- a/application/admin/logic/WorkLogic.php +++ b/application/admin/logic/WorkLogic.php @@ -109,6 +109,13 @@ class WorkLogic if (!Db::name('admin_group')->where('id', $id)->delete()) return ['status' => false, 'error' => '操作失败!']; + # 将项目权限变更为只读权限 + $readOnlyId = db('admin_group')->where(['title' => '只读', 'types' => 7, 'system' => 1])->value('id'); + if (!empty($readOnlyId)) { + db('work')->where('group_id', $id)->update(['group_id' => $readOnlyId]); # 处理公开项目的权限 + db('work_user')->where('group_id', $id)->update(['group_id' => $readOnlyId]); # 处理私有项目的权限 + } + return ['status' => true]; } } \ No newline at end of file diff --git a/application/admin/model/Common.php b/application/admin/model/Common.php index 89afe76..ac0e38e 100644 --- a/application/admin/model/Common.php +++ b/application/admin/model/Common.php @@ -295,6 +295,7 @@ class Common extends Model */ public function exportHandle($list, $field_list, $type = '') { + foreach ($list as &$val) { foreach ($field_list as $field) { switch ($field['form_type']) { @@ -310,7 +311,7 @@ class Common extends Model $val[$field['field']] = implode(',', array_column($temp, 'name')); break; case 'datetime': - $val[$field['field']] = strtotime($val[$field['field']]) ? $val[$field['field']] : date('Y-m-d H:i:s', $val[$field['field']]); + $val[$field['field']] = strtotime($val[$field['field']]) ? $val[$field['field']] : ''; break; case 'customer': case 'business': diff --git a/application/admin/model/ExamineStep.php b/application/admin/model/ExamineStep.php index d1c29b8..084f425 100644 --- a/application/admin/model/ExamineStep.php +++ b/application/admin/model/ExamineStep.php @@ -324,7 +324,7 @@ class ExamineStep extends Common $is_recheck = 1; } } - if (in_array($check_user_id, stringToArray($dataInfo['check_user_id'])) && !in_array($dataInfo['check_status'],['2','3'])) { + if (in_array($check_user_id, stringToArray($dataInfo['check_user_id'])) && !in_array($dataInfo['check_status'],['2','3','4'])) { $is_check = 1; } @@ -339,6 +339,7 @@ class ExamineStep extends Common $createUserInfo['check_type'] = 3; $newlist[0]['type'] = '3'; //创建 + $newlist[0]['status'] = '5'; //创建,前端要求给创建人加一个status字段,定义为5 } $newlist[0]['user_id_info'] = array($createUserInfo); $newlist[0]['time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; diff --git a/application/admin/model/Excel.php b/application/admin/model/Excel.php index 5c87a92..64139d8 100644 --- a/application/admin/model/Excel.php +++ b/application/admin/model/Excel.php @@ -13,7 +13,6 @@ use app\work\model\Task; use com\PseudoQueue as Queue; use think\Cache; use PhpOffice\PhpSpreadsheet\Spreadsheet; -use think\cache\driver\Redis; class Excel extends Common { @@ -30,22 +29,22 @@ class Excel extends Common 'admin_user', 'task' ]; - + /** * 字段类型为 map_address 的地址类型字段,导入导出时占四个字段,四个单元格 */ private $map_address = ['省', '市', '区/县', '详细地址']; - + /** * 导入锁缓存名称 */ const IMPORT_QUEUE = DB_NAME . 'IMPORT_QUEUE'; - + /** * 导出锁缓存名称 */ const EXPORT_QUEUE = DB_NAME . 'EXPORT_QUEUE'; - + /** *获取excel相关列 **/ @@ -63,7 +62,7 @@ class Excel extends Common } return $_indexCache[$pColumnIndex]; } - + /** * 自定义字段模块导入模板下载 * @param $field_list 自定义字段数据 @@ -73,7 +72,7 @@ class Excel extends Common public function excelImportDownload($field_list, $types, $save_path = '') { $fieldModel = new \app\admin\model\Field(); - + //实例化主文件 $objPHPExcel = new Spreadsheet(); $objProps = $objPHPExcel->getProperties(); // 设置excel文档的属性 @@ -87,7 +86,7 @@ class Excel extends Common $objPHPExcel->setActiveSheetIndex(0); //设置当前的sheet $objActSheet = $objPHPExcel->getActiveSheet(); $objActSheet->setTitle('悟空软件导入模板' . date('Y-m-d', time())); //设置sheet的标题 - + //存储Excel数据源到其他工作薄 $objPHPExcel->createSheet(); $subObject = $objPHPExcel->getSheet(1); @@ -95,7 +94,7 @@ class Excel extends Common //保护数据源 $subObject->getProtection()->setSheet(true); $subObject->protectCells('A1:C1000', time()); - + //填充边框 $styleArray = [ 'borders' => [ @@ -130,7 +129,7 @@ class Excel extends Common $setting = $field['setting'] ?: []; } $select_value = implode(',', $setting); - + //解决下拉框数据来源字串长度过大:将每个来源字串分解到一个空闲的单元格中 $str_len = strlen($select_value); $selectList = array(); @@ -190,21 +189,21 @@ class Excel extends Common } $max_row = $this->stringFromColumnIndex($k - 1); $mark_row = $this->stringFromColumnIndex($k); - + $objActSheet->mergeCells('A1:' . $max_row . '1'); $objActSheet->getStyle('A1:' . $mark_row . '1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); //水平居中 $objActSheet->getStyle('A1:' . $mark_row . '1')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); //垂直居中 $objActSheet->getRowDimension(1)->setRowHeight(28); //设置行高 $objActSheet->getStyle('A1')->getFont()->getColor()->setARGB('FFFF0000'); $objActSheet->getStyle('A1')->getAlignment()->setWrapText(true); - + $objActSheet->getStyle('A1')->getFont()->getColor()->setARGB('FFFF0000'); $objActSheet->getStyle('A1')->getAlignment()->setWrapText(true); //设置单元格格式范围的字体、字体大小、加粗 $objActSheet->getStyle('A1:' . $max_row . '1')->getFont()->setName("微软雅黑")->setSize(13)->getColor()->setARGB('#00000000'); //给单元格填充背景色 $objActSheet->getStyle('A1:' . $max_row . '1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('#ff9900'); - + switch ($types) { case 'crm_leads' : $types_name = '线索信息'; @@ -258,7 +257,7 @@ class Excel extends Common $objWriter->save('php://output'); } } - + /** * 自定义字段模块导出csv * @param $file_name 导出文件名称 @@ -272,12 +271,12 @@ class Excel extends Common ini_set('memory_limit', '1024M'); ini_set('max_execution_time', '300'); // set_time_limit(0); - + //调试时,先把下面这个两个header注释即可 header("Access-Control-Expose-Headers: Content-Disposition"); header("Content-type:application/vnd.ms-excel;charset=UTF-8"); header("Content-Disposition:attachment;filename=" . $file_name . ".csv"); - + header('Expires: 0'); header('Cache-control: private'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); @@ -285,14 +284,14 @@ class Excel extends Common header('Content-Encoding: UTF-8'); // 加上bom头,防止用office打开时乱码 echo "\xEF\xBB\xBF"; // UTF-8 BOM - + // 打开PHP文件句柄,php://output 表示直接输出到浏览器 $fp = fopen('php://output', 'a'); - + // 将中文标题转换编码,否则乱码 foreach ($field_list as $i => $v) { $title_cell[$i] = $v['name']; - + } // 将标题名称通过fputcsv写到文件句柄 fputcsv($fp, $title_cell); @@ -307,7 +306,7 @@ class Excel extends Common foreach ($_sub as $kk => $item) { $rows = []; foreach ($field_list as $key => $rule) { - + $rows[] = ($key = $item[$key]); } fputcsv($fp, $rows); @@ -323,7 +322,7 @@ class Excel extends Common fclose($fp); exit(); } - + /** * 分批导出csv * @@ -342,7 +341,7 @@ class Excel extends Common { $queue = new Queue(self::EXPORT_QUEUE, 3); $export_queue_index = input('export_queue_index'); - + if (!$export_queue_index) { if (!$export_queue_index = $queue->makeTaskId()) { return resultArray(['error' => $queue->error]); @@ -352,7 +351,7 @@ class Excel extends Common return resultArray(['error' => $queue->error]); } } - + // 已取消 if ($page == -1) { $queue->dequeue(); @@ -363,7 +362,7 @@ class Excel extends Common ] ]); } - + // 排队中 if (!$queue->canExec()) { return resultArray([ @@ -374,13 +373,13 @@ class Excel extends Common ] ]); } - + // 没有临时文件名,代表第一次导出,生成临时文件名称,并写入表头数据 if ($temp_file === null) { - + // 生成临时文件路径 $file_path = tempFileName('csv'); - + $fp = fopen($file_path, 'a'); $title_cell = []; foreach ($field_list as $v) { @@ -395,34 +394,38 @@ class Excel extends Common fputcsv($fp, $title_cell); $temp_file = \substr($file_path, strlen(TEMP_DIR)); } else { - + $file_path = TEMP_DIR . $temp_file; if (!file_exists($file_path)) { return resultArray(['error' => '参数错误,临时文件不存在']); } $fp = fopen($file_path, 'a'); } - + // 自定义字段模型 $fieldModel = new \app\admin\model\Field(); - + // 单次响应条数 (必须是单次查询条数的整数倍) - $response_size = $config['response_size'] ?: 1000; - + $response_size = $config['response_size'] ?: 10000; + // 单次查询条数 $page_size = $config['page_size'] ?: 200; - + // 最多查询次数 $max_query_count = $response_size / $page_size; - + // 总数 $total = 0; - + for ($i = 1; $i <= $max_query_count; $i++) { // 两个参数,第一个参数是 page (传入 model\customer::getDataList 方法的参数), $data = $callback($i + ($page - 1) * ($response_size / $page_size), $page_size); $total = $data['dataCount']; foreach ($data['list'] as $val) { + $val['create_time']=strtotime($val['create_time']); + $val['update_time']=strtotime($val['update_time']); + $val['last_time']=strtotime($val['last_time']); + $val['next_time']=strtotime($val['next_time']); $rows = []; foreach ($field_list as $rule) { if ($rule['form_type'] == 'customer_address') { @@ -438,7 +441,7 @@ class Excel extends Common } } fclose($fp); - + // 已查询数据条数 小于 数据总数 $done = $page * $response_size; if ($done < $total) { @@ -455,13 +458,13 @@ class Excel extends Common ] ]); } - + $res = $queue->dequeue(); - + // 所有数据已导入 csv 文件,返回文件流完成后删除 return download($file_path, $file_name . '.csv', true); } - + /** * 分批导入文件 * @@ -474,7 +477,7 @@ class Excel extends Common */ public function batchImportData($file, $param, $controller = null) { - + // 导入模块 $types = $param['types']; if (!in_array($types, $this->types_arr)) { @@ -483,11 +486,11 @@ class Excel extends Common return false; } $user_id = $param['owner_user_id']; - + // 采用伪队列 允许三人同时导入数据 $queue = new Queue(self::IMPORT_QUEUE, 5); $import_queue_index = input('import_queue_index'); - + // 队列任务ID if (!$import_queue_index) { if (!$import_queue_index = $queue->makeTaskId()) { @@ -502,7 +505,7 @@ class Excel extends Common return false; } } - + // 取消导入 if ($param['page'] == -1) { @unlink(UPLOAD_PATH . $param['temp_file']); @@ -515,9 +518,9 @@ class Excel extends Common } else { @unlink(TEMP_DIR . $param['error_file']); } - + $temp = $queue->cache('last_import_cache'); - + (new ImportRecord())->createData([ 'type' => $types, 'total' => $temp['total'], @@ -527,11 +530,11 @@ class Excel extends Common 'user_id' => $user_id, 'error_data_file_path' => $temp['error'] ? 'temp/' . $error_data_file_name : '' ]); - + $queue->dequeue(); return true; } - + if (!empty($file) || $param['temp_file']) { // 导入初始化 上传文件 if (!empty($file)) { @@ -543,12 +546,12 @@ class Excel extends Common } else { $save_name = $param['temp_file']; } - + // 文件类型 $ext = pathinfo($save_name, PATHINFO_EXTENSION); // 文件路径 $save_path = UPLOAD_PATH . $save_name; - + // 队列-判断是否需要排队 if (!$queue->canExec()) { $this->error = [ @@ -559,13 +562,13 @@ class Excel extends Common ]; return true; } - + // 加载类库 vendor("phpexcel.PHPExcel"); vendor("phpexcel.PHPExcel.Writer.Excel5"); vendor("phpexcel.PHPExcel.Writer.Excel2007"); vendor("phpexcel.PHPExcel.IOFactory"); - + // 错误数据临时文件路径 错误数据开始行数 if ($param['error_file']) { $error_path = TEMP_DIR . $param['error_file']; @@ -576,17 +579,17 @@ class Excel extends Common $error_path = tempFileName($ext); // 将导入模板保存至临时路径 $controller->excelDownload($error_path); - + $error_row = 3; $cover = 0; } // 错误数据临时文件名称 相对于临时目录 $error_data_file_name = \substr($error_path, strlen(TEMP_DIR)); - + // 加载错误数据文件 $err_PHPExcel = \PHPExcel_IOFactory::load($error_path); $error_sheet = $err_PHPExcel->setActiveSheetIndex(0); - + /** * 添加错误数据到临时文件 * @@ -595,7 +598,7 @@ class Excel extends Common * @return void */ $error_data_func = function ($data, $error) use ($error_sheet, &$error_row) { - + foreach ($data as $key => $val) { // 第一列为错误原因 所以+1 $error_col = \PHPExcel_Cell::stringFromColumnIndex($key + 1); @@ -604,11 +607,11 @@ class Excel extends Common $error_sheet->setCellValue('A' . $error_row, $error); $error_sheet->getStyle('A' . $error_row)->getFont()->getColor()->setARGB('FF000000'); $error_sheet->getStyle('A' . $error_row)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFFF0000'); - + $error_row++; }; - - + + // 字段列表条件 $fieldParam = []; // 导入模块 @@ -689,22 +692,17 @@ class Excel extends Common } } } - if ($temp !== count($field_list)) { - $this->error = '请使用最新导入模板'; - @unlink($save_path); - $queue->dequeue(); - return false; - } - + + // 每次导入条数 $page_size = 100; - + // 当前页码 $page = ((int)$param['page']) ?: 1; - + // 数据总数 $total = $max_row - 2; - + // 总页数 $max_page = ceil($total / $page_size); if ($page > $max_page) { @@ -713,7 +711,6 @@ class Excel extends Common // $queue->dequeue(); // return false; } - // 开始行 +3 跳过表头 $start_row = ($page - 1) * $page_size + 3; // 结束行 @@ -721,12 +718,12 @@ class Excel extends Common if ($end_row > $max_row) { $end_row = $max_row; } - + // 读取数据 $dataList = $sheet->rangeToArray("A{$start_row}:{$max_col}{$end_row}"); // 数据重复时的处理方式 0跳过 1覆盖 $config = $param['config'] ? : 0; - + // 默认数据 $default_data = [ 'create_user_id' => $param['create_user_id'], @@ -734,211 +731,260 @@ class Excel extends Common 'create_time' => time(), 'update_time' => time(), ]; - - // 开始导入数据 - foreach ($dataList as $val) { - $data = []; - $unique_where = []; - $empty_count = 0; - $not_null_field = []; - $fk = 0; - foreach ($field_list as $field) { - if ($field['form_type'] == 'map_address') { - $data['address'] = $address = [ - trim((string)$val[$fk]), - trim((string)$val[$fk + 1]), - trim((string)$val[$fk + 2]), - ]; - $data['detail_address'] = trim($val[$fk + 3]); - $fk += 4; - continue; - } else { - $temp_value = trim($val[$fk]); + if ($temp !== count($field_list)) { +// $this->error = '请使用最新导入模板'; + @unlink($save_path); + $queue->dequeue(); + foreach ($dataList as $val) { + $error_data_func($val,'请使用最新导入模板'); + } + // 错误数据文件保存 + $objWriter = \PHPExcel_IOFactory::createWriter($err_PHPExcel, 'Excel5'); + $objWriter->save($error_path); + $error = [ + // 文件总计条数 + 'total' => $total, + // 已完成条数 + 'done' => 0, + // 覆盖 + 'cover' => 0, + // 错误数据写入行号 + 'error' => $total, + 'error_file_path' =>'temp/' . $error_data_file_name + ]; + $queue->cache('last_import_cache', [ + 'total' => $total, + 'done' => 0, + 'cover' => 0, + 'error' => $total + ]); + (new ImportRecord())->createData([ + 'type' => $types, + 'total' => $total, + 'done' => 0, + 'cover' => 0, + 'error' => $total, + 'user_id' => $user_id, + 'error_data_file_path' =>'temp/' . $error_data_file_name + ]); + Cache::rm('item'); + Cache::rm('excel_item'); + Cache::set('item', 1); + Cache::set('excel_item', serialize($error)); + return true; + }else{ + // 开始导入数据 + foreach ($dataList as $val) { + $data = []; + $unique_where = []; + $empty_count = 0; + $not_null_field = []; + $fk = 0; + foreach ($field_list as $field) { + if ($field['form_type'] == 'map_address') { + $data['address'] = $address = [ + trim((string)$val[$fk]), + trim((string)$val[$fk + 1]), + trim((string)$val[$fk + 2]), + ]; + $data['detail_address'] = trim($val[$fk + 3]); + $fk += 4; + continue; + } else { + $temp_value = trim($val[$fk]); + } + + + if ($field['field'] == 'category_id' && $types == 'crm_product') { + $data['category_id'] = $productCategoryArr[$temp_value] ? : 0; + $data['category_str'] = $dataModel->getPidStr($productCategoryArr[$temp_value], '', 1); + } + + // 特殊字段特殊处理 + $temp_value = $this->handleData($temp_value, $field); + $data[$field['field']] = $temp_value; + // 查重字段 + if ($field['is_unique'] && $temp_value) { + $unique_where[$field['field']] = $temp_value; + } + if ($temp_value == '') { + if ($field['is_null']) { + $not_null_field[] = $field['name']; + } + $empty_count++; + } + $fk++; } - - - if ($field['field'] == 'category_id' && $types == 'crm_product') { - $data['category_id'] = $productCategoryArr[$temp_value] ? : 0; - $data['category_str'] = $dataModel->getPidStr($productCategoryArr[$temp_value], '', 1); + if (!empty($not_null_field)) { + $error_data_func($val, implode(', ', $not_null_field) . '不能为空'); + continue; } - - // 特殊字段特殊处理 - $temp_value = $this->handleData($temp_value, $field); - $data[$field['field']] = $temp_value; - // 查重字段 - if ($field['is_unique'] && $temp_value) { - $unique_where[$field['field']] = $temp_value; + if ($empty_count == count($field_list)) { + $error_data_func($val, '空行'); + continue; } - if ($temp_value == '') { - if ($field['is_null']) { - $not_null_field[] = $field['name']; + $old_data_id_list = []; + if ($unique_where) { + if($types == 'crm_product'){ + $old_data_id_list = $model->whereOr($unique_where)->where('delete_user_id',0)->column($db_id); + }else{ + $old_data_id_list = $dataModel->whereOr($unique_where)->column($db_id); } - $empty_count++; - } - $fk++; - } - if (!empty($not_null_field)) { - $error_data_func($val, implode(', ', $not_null_field) . '不能为空'); - continue; - } - if ($empty_count == count($field_list)) { - $error_data_func($val, '空行'); - continue; - } - $old_data_id_list = []; - if ($unique_where) { - if($types == 'crm_product'){ - $old_data_id_list = $model->whereOr($unique_where)->column($db_id); - }else{ - $old_data_id_list = $dataModel->whereOr($unique_where)->column($db_id); } - } - // 数据重复时 - if ($old_data_id_list) { - // 是否覆盖 - if ($config) { - $data = array_merge($data, $default_data); - $data['user_id'] = $param['create_user_id']; - $data['update_time'] = time(); - $data['update_time'] = time(); - if(isset($data['next_time'])){ - $data['next_time']=date('Y-m-d H:i:s', $data['next_time']); - } - $dataModel->startTrans(); - try { - $up_success_count = 0; - foreach ($old_data_id_list as $id) { - if($types=='crm_customer'){ - $owner = db('crm_customer')->where(['name' => $data['name']])->find(); - if ($owner['owner_user_id'] == 0) { - $temp_error = $owner['name'] . '的公海数据,无覆盖权限'; - $error_data_func($owner, $temp_error); + // 数据重复时 + if ($old_data_id_list) { + // 是否覆盖 + if ($config) { + $data = array_merge($data, $default_data); + $data['user_id'] = $param['create_user_id']; + $data['update_time'] = time(); + $data['update_time'] = time(); + if(isset($data['next_time'])){ + $data['next_time']=$data['next_time']?date('Y-m-d H:i:s', $data['next_time']):''; + } + $dataModel->startTrans(); + try { + $up_success_count = 0; + foreach ($old_data_id_list as $id) { + if($types=='crm_customer'){ + $owner = db('crm_customer')->where(['name' => $data['name']])->find(); + if (!empty($owner) && $owner['owner_user_id'] == 0) { + $temp_error = $owner['name'] .' '. '公海数据,无覆盖权限'; + $error_data_func($val, $temp_error); + break; + } + } + if (!$dataModel->updateDataById($data, $id)) { + $temp_error = $dataModel->getError(); + if ($temp_error == '无权操作') { + $temp_error = '当前导入人员对该数据无写入权限'; + } + $error_data_func($val, $temp_error); + $dataModel->rollback(); break; } + $up_success_count++; } - if($types=='crm_product'){ - $data['delete_user_id']=0; - $data['delete_time'] = null; + // 全部更新完成 + if ($up_success_count === count($old_data_id_list)) { + $cover++; + $dataModel->commit(); } - if (!$dataModel->updateDataById($data, $id)) { - $temp_error = $dataModel->getError(); - if ($temp_error == '无权操作') { - $temp_error = '当前导入人员对该数据无写入权限'; + } catch (\Exception $e) { + $dataModel->rollback(); + } + } else { + // 重复字段标记 + $unique_field = []; + foreach ($old_data_id_list as $id) { + $old_data = $dataModel->getDataById($id); + foreach ($unique_where as $k => $v) { + if (trim($old_data[$k]) == $v) { + $unique_field[] = $field_key_name_list[$k]; } - $error_data_func($val, $temp_error); - $dataModel->rollback(); - break; } - $up_success_count++; - } - // 全部更新完成 - if ($up_success_count === count($old_data_id_list)) { - $cover++; - $dataModel->commit(); } - } catch (\Exception $e) { - $dataModel->rollback(); + $unique_field = array_unique($unique_field); + $error_data_func($val, implode(', ', $unique_field) . ' 根据查重规则,该条数据重复'); } } else { - // 重复字段标记 - $unique_field = []; - foreach ($old_data_id_list as $id) { - $old_data = $dataModel->getDataById($id); - foreach ($unique_where as $k => $v) { - if (trim($old_data[$k]) == $v) { - $unique_field[] = $field_key_name_list[$k]; - } - } + $data = array_merge($data, $default_data); + if(isset($data['next_time'])){ + $data['next_time']=$data['next_time']?date('Y-m-d H:i:s', $data['next_time']):''; + } + if (!$resData = $dataModel->createData($data)) { + $error_data_func($val, $dataModel->getError()); } - $unique_field = array_unique($unique_field); - $error_data_func($val, implode(', ', $unique_field) . ' 根据查重规则,该条数据重复'); - } - } else { - $data = array_merge($data, $default_data); - if(isset($data['next_time'])){ - $data['next_time']=date('Y-m-d H:i:s', $data['next_time']); - } - if (!$resData = $dataModel->createData($data)) { - $error_data_func($val, $dataModel->getError()); } } - } - - // 完成数(已导入数) - $done = ($page - 1) * $page_size + count($dataList); - if ($page == $max_page) { - $done = $total; - } - - // 错误数 - $error = $error_row - 3; - - // 错误数据文件保存 - $objWriter = \PHPExcel_IOFactory::createWriter($err_PHPExcel, 'Excel5'); - $objWriter->save($error_path); - - $this->error = [ - // 数据导入文件临时路径 - 'temp_file' => $save_name, - // 错误数据文件路径 - 'error_file' => $error_data_file_name, - // 文件总计条数 - 'total' => $total, - // 已完成条数 - 'done' => $done, - // 覆盖 - 'cover' => $cover, - // 错误数据写入行号 - 'error' => $error, - // 下次页码 - 'page' => $page + 1, - // 导入任务ID - 'import_queue_index' => $import_queue_index - ]; - - $queue->cache('last_import_cache', [ - 'total' => $total, - 'done' => $done, - 'cover' => $cover, - 'error' => $error - ]); - // 执行完成 - if ($done >= $total) { - - // 出队 - $queue->dequeue(); - // 错误数据文件路径 - $this->error['error_file_path'] = 'temp/' . $error_data_file_name; - // 删除导入文件 - @unlink($save_path); - - // 没有错误数据时,删除错误文件 - if ($error == 0) { - @unlink($error_path); + + // 完成数(已导入数) + $done = ($page - 1) * $page_size + count($dataList); + if ($page == $max_page) { + $done = $total; } - - (new ImportRecord())->createData([ - 'type' => $types, + + // 错误数 + $error = $error_row - 3; + + // 错误数据文件保存 + $objWriter = \PHPExcel_IOFactory::createWriter($err_PHPExcel, 'Excel5'); + $objWriter->save($error_path); + + $this->error = [ + // 数据导入文件临时路径 + 'temp_file' => $save_name, + // 错误数据文件路径 + 'error_file' => $error_data_file_name, + // 文件总计条数 'total' => $total, + // 已完成条数 'done' => $done, + // 覆盖 'cover' => $cover, + // 错误数据写入行号 'error' => $error, - 'user_id' => $user_id, - 'error_data_file_path' => $error ? 'temp/' . $error_data_file_name : '' + // 下次页码 + 'page' => $page + 1, + // 导入任务ID + 'import_queue_index' => $import_queue_index + ]; + + $queue->cache('last_import_cache', [ + 'total' => $total, + 'done' => $done, + 'cover' => $cover, + 'error' => $error ]); - Cache::set('item', 1); - Cache::set('excel_item', serialize($this->error)); - } else { - Cache::set('item', 0); + // 执行完成 + if ($done >= $total) { + // 出队 + $queue->dequeue(); + // 错误数据文件路径 + $this->error['error_file_path'] = 'temp/' . $error_data_file_name; + // 删除导入文件 + @unlink($save_path); + + // 没有错误数据时,删除错误文件 + if ($error == 0) { + @unlink($error_path); + } + + (new ImportRecord())->createData([ + 'type' => $types, + 'total' => $total, + 'done' => $done, + 'cover' => $cover, + 'error' => $error, + 'user_id' => $user_id, + 'error_data_file_path' => $error ? 'temp/' . $error_data_file_name : '' + ]); + Cache::set('item', 1); + Cache::set('excel_item', serialize($this->error)); + }else{ + $excelData['cover']=$cover; + $excelData['page']=$page+1; + $excelData['types']=$types; + $excelData['temp_file']=$save_name; + $excelData['error_file']=$error_data_file_name; + $excelData['create_user_id']=$param['create_user_id']; + $excelData['import_queue_index']=$import_queue_index; + $excelData['config']=$config; + $excelData['owner_user_id']=$user_id; + $excelData['base']='batchImportData'; + Cache::set('item', 0); + Cache::set('excel', $excelData); + } + return true; } - + } else { $this->error = '请选择导入文件'; $queue->dequeue(); return false; } } - + /** * 导入数据时 读取xls表格数据 * @@ -960,10 +1006,10 @@ class Excel extends Common } $data[] = $temp; } - + return $data; } - + /** * 上传文件导入数据文件 * @@ -986,7 +1032,7 @@ class Excel extends Common } return $saveName; } - + /** * 自定义字段模块数据导入(默认2000行) * @param $types 分类 @@ -1014,7 +1060,7 @@ class Excel extends Common return false; } } - + if ($param['page'] == -1) { $queue->dequeue(); $this->error = [ @@ -1034,7 +1080,7 @@ class Excel extends Common $queue->dequeue(); return false; } - + // 导入初始化 上传文件 if (!empty($file)) { $get_filesize_byte = get_upload_max_filesize_byte(); @@ -1053,10 +1099,10 @@ class Excel extends Common } else { $save_name = $param['temp_file']; } - + $ext = pathinfo($save_name, PATHINFO_EXTENSION); //文件后缀 $save_path = UPLOAD_PATH . $save_name; - + if (!$queue->canExec()) { $this->error = [ 'temp_file' => $save_name, @@ -1066,7 +1112,7 @@ class Excel extends Common ]; return true; } - + if ($param['error_file']) { $error_path = TEMP_DIR . $param['error_file']; $error_row = $param['error'] + 3; @@ -1076,18 +1122,18 @@ class Excel extends Common $controller->excelDownload($error_path); $error_row = 3; } - + vendor("phpexcel.PHPExcel"); vendor("phpexcel.PHPExcel.Writer.Excel5"); vendor("phpexcel.PHPExcel.Writer.Excel2007"); vendor("phpexcel.PHPExcel.IOFactory"); - + $err_PHPExcel = \PHPExcel_IOFactory::load($error_path); $sheet = $err_PHPExcel->setActiveSheetIndex(0); - + // 添加错误数据到临时文件 $error_data_func = function ($data, $error) use ($sheet, &$error_row) { - + foreach ($data as $key => $val) { // 第一列为错误原因 所以+1 $error_col = \PHPExcel_Cell::stringFromColumnIndex($key + 1); @@ -1096,18 +1142,18 @@ class Excel extends Common $sheet->setCellValue('A' . $error_row, $error); $sheet->getStyle('A' . $error_row)->getFont()->getColor()->setARGB('FF000000'); $sheet->getStyle('A' . $error_row)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFFF0000'); - + $error_row++; }; - + // 错误数据临时文件名称 $error_data_file_name = \substr($error_path, strlen(TEMP_DIR)); - + //实例化主文件 set_time_limit(1800); ini_set("memory_limit", "256M"); $objPHPExcel = new Spreadsheet(); - + if ($ext == 'xlsx') { $objRender = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); // $objRender->setReadDataOnly(true); @@ -1127,12 +1173,12 @@ class Excel extends Common } $currentSheet = $ExcelObj->getSheet(0); $data = $currentSheet->rangeToArray('A3:C12'); - + //查看有几个sheet $sheetContent = $ExcelObj->getSheet(0)->toArray(); //获取总行数 $sheetCount = $ExcelObj->getSheet(0)->getHighestRow(); - + // if ($sheetCount > 2002) { // $this->error = '单文件一次最多导入2000条数据'; // return false; @@ -1166,7 +1212,7 @@ class Excel extends Common break; } $contactsModel = new \app\crm\model\Contacts(); - + //自定义字段 $fieldModel = new \app\admin\model\Field(); $fieldParam['types'] = $types; @@ -1205,19 +1251,19 @@ class Excel extends Common } // 表头行数 $keys = 2; - + // 导入错误数据 $errorMessage = []; - + // 每次导入条数 $forCount = 5; - + // 当前页码 $page = $param['page'] ?: 1; - + // 数据总数 $total = $sheetCount - $keys; - + // 总页数 $max_page = ceil($total / $forCount); if ($page > $max_page) { @@ -1225,7 +1271,7 @@ class Excel extends Common $queue->dequeue(); return false; } - + $_sub = array_slice($sheetContent, ($page - 1) * $forCount, $forCount); foreach ($_sub as $kk => $val) { $data = ''; @@ -1360,16 +1406,16 @@ class Excel extends Common } } } - + // 完成数 $done = ($page - 1) * $forCount + count($_sub); // 错误数 $error = $error_row - 3; - + // 错误数据暂存 $objWriter = \PHPExcel_IOFactory::createWriter($err_PHPExcel, 'Excel5'); $objWriter->save($error_path); - + $this->error = [ 'temp_file' => $save_name, 'error_file' => $error_data_file_name, @@ -1385,25 +1431,34 @@ class Excel extends Common 'page' => $page + 1, 'import_queue_index' => $import_queue_index ]; -// $redis = new \Redis(); -// $redis->del('item'); $redis->del('excel_item'); // 执行完成 if ($done >= $total) { $queue->dequeue(); $this->error['error_file_path'] = 'temp/' . $error_data_file_name; - + Cache::set('item', 1); Cache::set('excel_item', serialize($this->error)); } else { + $excelData['page']=$page+1; + $excelData['types']=$types; + $excelData['temp_file']=$save_name; + $excelData['error_file']=$error_data_file_name; + $excelData['create_user_id']=$param['create_user_id']; + $excelData['import_queue_index']=$import_queue_index; + $excelData['config']=$config; + $excelData['owner_user_id']=$user_id; + $excelData['base']='importExcel'; Cache::set('item', 0); + Cache::set('excel', $excelData); } + return true; } else { $this->error = '请选择导入文件'; $queue->dequeue(); return false; } } - + /** * excel数据处理 * @param $k 需处理数据开始下标 @@ -1420,7 +1475,7 @@ class Excel extends Common $k++; } $data[$fieldArr[$fieldName]['field']] = implode(chr(10), $address); - + // 地址信息转地理坐标(仅处理系统初始的地址字段) if ($fieldArr[$fieldName]['field'] == 'address') { $address_arr = $address; @@ -1467,7 +1522,7 @@ class Excel extends Common $res['k'] = $k; return $res; } - + /** * 导入数据处理 * @@ -1505,9 +1560,9 @@ class Excel extends Common default: return $value; } - + } - + //二维数组转一维数组 public function changeArr($arr) { @@ -1521,7 +1576,7 @@ class Excel extends Common } return $newArr; } - + /** * excel参数配置(备份) * @param @@ -1538,7 +1593,7 @@ class Excel extends Common $objPHPExcel = new \PHPExcel(); $objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel); $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel); - + $objProps = $objPHPExcel->getProperties(); // 设置excel文档的属性 $objProps->setCreator("snowerp"); //创建人 $objProps->setLastModifiedBy("snowerp"); //最后修改人 @@ -1550,12 +1605,12 @@ class Excel extends Common $objPHPExcel->setActiveSheetIndex(0); //设置当前的sheet $objActSheet = $objPHPExcel->getActiveSheet(); $objActSheet->setTitle('snowerp'); //设置sheet的标题 - + $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20); //设置单元格宽度 $objPHPExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(40); //设置单元格高度 $objPHPExcel->getActiveSheet()->mergeCells('A18:E22'); //合并单元格 $objPHPExcel->getActiveSheet()->unmergeCells('A28:B28'); //拆分单元格 - + //设置保护cell,保护工作表 $objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); $objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel'); @@ -1579,7 +1634,7 @@ class Excel extends Common $objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getTop()->getColor()->setARGB('FF993300'); $objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getBottom()->getColor()->setARGB('FF993300'); $objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getRight()->getColor()->setARGB('FF993300'); - + //插入图像 $objDrawing = new PHPExcel_Worksheet_Drawing(); /*设置图片路径 切记:只能是本地图片*/ @@ -1595,11 +1650,11 @@ class Excel extends Common $objDrawing->getShadow()->setVisible(true); $objDrawing->getShadow()->setDirection(50); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - + //设置单元格背景色 $objPHPExcel->getActiveSheet(0)->getStyle('A1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID); $objPHPExcel->getActiveSheet(0)->getStyle('A1')->getFill()->getStartColor()->setARGB('FFCAE8EA'); - + //输入浏览器,导出Excel $savename = '导出Excel示例'; $ua = $_SERVER["HTTP_USER_AGENT"]; @@ -1607,7 +1662,7 @@ class Excel extends Common if (preg_match("/MSIE/", $ua)) { $savename = urlencode($savename); //处理IE导出名称乱码 } - + // excel头参数 header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="' . $savename . '.xls"'); //日期为文件名后缀 @@ -1615,7 +1670,7 @@ class Excel extends Common $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式 $objWriter->save('php://output'); } - + /** * 非自定义字段模块导出csv * @param $file_name 导出文件名称 @@ -1627,12 +1682,12 @@ class Excel extends Common { ini_set('memory_limit', '128M'); set_time_limit(0); - + //调试时,先把下面这个两个header注释即可 header("Access-Control-Expose-Headers: Content-Disposition"); header("Content-type:application/vnd.ms-excel;charset=UTF-8"); header("Content-Disposition:attachment;filename=" . $file_name . ".csv"); - + header('Expires: 0'); header('Cache-control: private'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); @@ -1640,18 +1695,18 @@ class Excel extends Common header('Content-Encoding: UTF-8'); // 加上bom头,防止用office打开时乱码 echo "\xEF\xBB\xBF"; // UTF-8 BOM - + // 打开PHP文件句柄,php://output 表示直接输出到浏览器 $fp = fopen('php://output', 'a'); - + // 将中文标题转换编码,否则乱码 foreach ($field_list as $i => $v) { $title_cell[$i] = $v['name']; } // 将标题名称通过fputcsv写到文件句柄 fputcsv($fp, $title_cell); - $export_data = $callback(0); - foreach ($export_data as $item) { +// $export_data = $callback(0); + foreach ($callback as $item) { $rows = []; foreach ($field_list as $rule) { $rows[] = $item[$rule['field']]; @@ -1664,8 +1719,8 @@ class Excel extends Common fclose($fp); exit(); } - - + + /** * 分批导入文件 项目任务导入 * @@ -1689,7 +1744,7 @@ class Excel extends Common // 采用伪队列 允许三人同时导入数据 $queue = new Queue(self::IMPORT_QUEUE, 3); $import_queue_index = input('import_queue_index'); - + // 队列任务ID if (!$import_queue_index) { if (!$import_queue_index = $queue->makeTaskId()) { @@ -1704,7 +1759,7 @@ class Excel extends Common return false; } } - + // 取消导入 if ($param['page'] == -1) { @unlink(UPLOAD_PATH . $param['temp_file']); @@ -1717,9 +1772,9 @@ class Excel extends Common } else { @unlink(TEMP_DIR . $param['error_file']); } - + $temp = $queue->cache('last_import_cache'); - + (new ImportRecord())->createData([ 'type' => $types, 'total' => $temp['total'], @@ -1729,11 +1784,11 @@ class Excel extends Common 'user_id' => $user_id, 'error_data_file_path' => $temp['error'] ? 'temp/' . $error_data_file_name : '' ]); - + $queue->dequeue(); return true; } - + if (!empty($file) || $param['temp_file']) { // 导入初始化 上传文件 if (!empty($file)) { @@ -1745,12 +1800,12 @@ class Excel extends Common } else { $save_name = $param['temp_file']; } - + // 文件类型 $ext = pathinfo($save_name, PATHINFO_EXTENSION); // 文件路径 $save_path = UPLOAD_PATH . $save_name; - + // 队列-判断是否需要排队 if (!$queue->canExec()) { $this->error = [ @@ -1761,13 +1816,13 @@ class Excel extends Common ]; return true; } - + // 加载类库 vendor("phpexcel.PHPExcel"); vendor("phpexcel.PHPExcel.Writer.Excel5"); vendor("phpexcel.PHPExcel.Writer.Excel2007"); vendor("phpexcel.PHPExcel.IOFactory"); - + // 错误数据临时文件路径 错误数据开始行数 if ($param['error_file']) { $error_path = TEMP_DIR . $param['error_file']; @@ -1778,17 +1833,17 @@ class Excel extends Common $error_path = tempFileName($ext); // 将导入模板保存至临时路径 $controller->excelDownload($error_path); - + $error_row = 3; $cover = 0; } // 错误数据临时文件名称 相对于临时目录 $error_data_file_name = \substr($error_path, strlen(TEMP_DIR)); - + // 加载错误数据文件 $err_PHPExcel = \PHPExcel_IOFactory::load($error_path); $error_sheet = $err_PHPExcel->setActiveSheetIndex(0); - + /** * 添加错误数据到临时文件 * @@ -1797,7 +1852,7 @@ class Excel extends Common * @return void */ $error_data_func = function ($data, $error) use ($error_sheet, &$error_row) { - + foreach ($data as $key => $val) { // 第一列为错误原因 所以+1 $error_col = \PHPExcel_Cell::stringFromColumnIndex($key + 1); @@ -1806,10 +1861,10 @@ class Excel extends Common $error_sheet->setCellValue('A' . $error_row, $error); $error_sheet->getStyle('A' . $error_row)->getFont()->getColor()->setARGB('FF000000'); $error_sheet->getStyle('A' . $error_row)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFFF0000'); - + $error_row++; }; - + $field_list = [ '0' => ['name' => '任务名称', 'field' => 'name'], '1' => ['name' => '任务描述', 'field' => 'description'], @@ -1820,7 +1875,7 @@ class Excel extends Common '6' => ['name' => '所属任务列表', 'field' => 'class_id'], ]; $field_key_name_list = array_column($field_list, 'name'); - + // 加载导入数据文件 $objRender = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xls'); $objRender->setReadDataOnly(true); @@ -1833,7 +1888,7 @@ class Excel extends Common $max_col_num = count($field_list) - 1; $max_col_num += 3 * array_count_values(array_column($field_list, 'form_type'))['map_address']; $max_col = \PHPExcel_Cell::stringFromColumnIndex($max_col_num); - + // 检测导入文件是否使用最新模板 $header = $sheet->rangeToArray("A2:{$max_col}2")[0]; $temp = 0; @@ -1861,16 +1916,16 @@ class Excel extends Common $queue->dequeue(); return false; } - + // 每次导入条数 $page_size = 100; - + // 当前页码 $page = ((int)$param['page']) ?: 1; - + // 数据总数 $total = $max_row - 2; - + // 总页数 $max_page = ceil($total / $page_size); if ($page > $max_page) { @@ -1879,7 +1934,7 @@ class Excel extends Common // $queue->dequeue(); // return false; } - + // 开始行 +3 跳过表头 $start_row = ($page - 1) * $page_size + 3; // 结束行 @@ -1887,7 +1942,7 @@ class Excel extends Common if ($end_row > $max_row) { $end_row = $max_row; } - + // 读取数据 $dataList = $sheet->rangeToArray("A{$start_row}:{$max_col}{$end_row}"); // 默认数据 @@ -1922,7 +1977,7 @@ class Excel extends Common // 特殊字段特殊处理 $temp_value = $this->handleData($temp_value, $field); $data[$field['field']] = $temp_value; - + $fk++; } // 数据重复时 @@ -1936,14 +1991,14 @@ class Excel extends Common if ($page == $max_page) { $done = $total; } - + // 错误数 $error = $error_row - 3; - + // 错误数据文件保存 $objWriter = \PHPExcel_IOFactory::createWriter($err_PHPExcel, 'Excel5'); $objWriter->save($error_path); - + $this->error = [ // 数据导入文件临时路径 'temp_file' => $save_name, @@ -1962,15 +2017,13 @@ class Excel extends Common // 导入任务ID 'import_queue_index' => $import_queue_index ]; - + $queue->cache('last_import_cache', [ 'total' => $total, 'done' => $done, 'cover' => $cover, 'error' => $error ]); -// $redis = new \Redis(); -// $redis->del('item'); $redis->del('excel_item'); // 执行完成 if ($done >= $total) { // 出队 @@ -1979,12 +2032,12 @@ class Excel extends Common $this->error['error_file_path'] = 'temp/' . $error_data_file_name; // 删除导入文件 @unlink($save_path); - + // 没有错误数据时,删除错误文件 if ($error == 0) { @unlink($error_path); } - + (new ImportRecord())->createData([ 'type' => $types, 'total' => $total, @@ -1997,15 +2050,26 @@ class Excel extends Common Cache::set('item', 1); Cache::set('excel_item', serialize($this->error)); } else { + $excelData['cover']=$cover; + $excelData['page']=$page+1; + $excelData['types']=$types; + $excelData['temp_file']=$save_name; + $excelData['error_file']=$error_data_file_name; + $excelData['create_user_id']=$param['create_user_id']; + $excelData['import_queue_index']=$import_queue_index; + $excelData['owner_user_id']=$user_id; + $excelData['base']='batchTaskImportData'; Cache::set('item', 0); + Cache::set('excel', $excelData); } + return true; } else { $this->error = '请选择导入文件'; $queue->dequeue(); return false; } } - + /** * task模块导出csv * @param $title 导出文件头 @@ -2045,7 +2109,7 @@ class Excel extends Common $objPHPExcel->getActiveSheet()->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objActSheet->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getFont()->getColor()->setARGB('FF000000'); $objActSheet->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('##00BFFF'); - + //处理表头 foreach ($field_list as $k => $v) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$k] . $topNumber, $v['name']);//设置表头数据 @@ -2082,9 +2146,9 @@ class Excel extends Common header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式 $objWriter->save('php://output'); - + } - + /** * 商业智能模块导出csv * @param $file_name 导出文件名称 @@ -2123,17 +2187,17 @@ class Excel extends Common $objPHPExcel->getActiveSheet()->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objActSheet->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getFont()->getColor()->setARGB('FF000000'); $objActSheet->getStyle('A1:' . $cellKey[count($field_list) - 1] . '1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('##00BFFF'); - + //处理表头 foreach ($field_list as $k => $v) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$k] . $topNumber, $v['name']);//设置表头数据 $objPHPExcel->getActiveSheet()->freezePane($cellKey[$k] . ($topNumber + 1));//冻结窗口 $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k] . $topNumber)->getFont()->setBold(true);//设置是否加粗 $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k] . $topNumber)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中 - + $objPHPExcel->getActiveSheet()->getStyle('A2:' . $cellKey[count($field_list) - 1] . '2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A2:' . $cellKey[count($field_list) - 1] . '2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); - + if ($v[3] > 0)//大于0表示需要设置宽度 { $objPHPExcel->getActiveSheet()->getColumnDimension($cellKey[$k])->setWidth($v[3]);//设置列宽度 @@ -2163,7 +2227,7 @@ class Excel extends Common $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式 $objWriter->save('php://output'); } - + /** * bi 员工业绩导出 * @param $file_name @@ -2175,7 +2239,7 @@ class Excel extends Common */ public function template_download($file_name, $field_list, $title, $callback) { - + // 加载类库 vendor("phpexcel.PHPExcel"); vendor("phpexcel.PHPExcel.Writer.Excel5"); @@ -2195,7 +2259,7 @@ class Excel extends Common $objActSheet = $objPHPExcel->getActiveSheet(0); $objPHPExcel->getActiveSheet()->mergeCells('A1:M1');//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错) $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $title); - + $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(18);//所有单元格(行)默认高度 $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(18);//所有单元格(列)默认宽度 $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true); @@ -2204,21 +2268,21 @@ class Excel extends Common $objPHPExcel->getActiveSheet()->getStyle('A1:M1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objActSheet->getStyle('A1:M1')->getFont()->getColor()->setARGB('FF000000'); $objActSheet->getStyle('A1:M1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('##00BFFF'); - + //处理表头 - + $objPHPExcel->getActiveSheet()->freezePane('A2');//冻结窗口 $objPHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setBold(true);//设置是否加粗 $objPHPExcel->getActiveSheet()->getStyle('A2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中 - + $objPHPExcel->getActiveSheet()->getStyle('A2:M2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A2:M2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A2:M2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//文字居中 - + $objActSheet->getStyle('A2:M2')->getFont()->getColor()->setARGB('FF000000'); $objActSheet->getStyle('A2:M2')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('##00BFFF'); - - + + $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A2', '日期'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A3', '当月回款金额(元)'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A4', '环比增长(%)'); @@ -2235,7 +2299,7 @@ class Excel extends Common $objPHPExcel->setActiveSheetIndex(0)->setCellValue('K2', '202010'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('L2', '202011'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('M2', '202012'); - + $baseRow = 3; //数据从N-1行开始往下输出 这里是避免头信息被覆盖 $callCount = count($callback) + 2; $style_array = array( @@ -2244,15 +2308,15 @@ class Excel extends Common 'style' => \PHPExcel_Style_Border::BORDER_THIN ) )); - + $objActSheet->getStyle('A1:M5')->applyFromArray($style_array); - + foreach ($callback as $key => $value) { $k = $key + 1; $objPHPExcel->getActiveSheet()->setCellValue($cellKey[$k] . '3', $value['thisMonth']); $objPHPExcel->getActiveSheet()->setCellValue($cellKey[$k] . '4', $value['chain_ratio']); $objPHPExcel->getActiveSheet()->setCellValue($cellKey[$k] . '5', $value['year_on_year']); - + } // excel头参数 header('Content-Type: application/vnd.ms-excel'); @@ -2261,7 +2325,7 @@ class Excel extends Common $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式 $objWriter->save('php://output'); } - + /** * 运行中 * @param $param @@ -2269,16 +2333,19 @@ class Excel extends Common */ public function importNum() { - $param = Cache::pull('item'); + $param = Cache::get('item'); + $excelData=Cache::get('excel'); + $base=$excelData['base']; if ($param == 0) { + $this->$base('',$excelData); $data = 0; } elseif ($param == 1) { $data = ''; } - + return $data; } - + /** * 结果 * @param $param @@ -2286,11 +2353,11 @@ class Excel extends Common */ public function importInfo() { - $param = Cache::pull('excel_item'); ; + $param = Cache::get('excel_item'); $param = unserialize($param); return $param; } - + /** * 导入记录 * @param $param @@ -2301,16 +2368,20 @@ class Excel extends Common $list = db('admin_import_record')->alias('i') ->join('admin_user user', 'i.user_id=user.id') ->where(['i.type'=>$param['type'],'i.user_id'=>$param['user_id']])->page($param['page'], $param['limit']) - ->field('i.*,user.realname as user_name')->select(); + ->field('i.*,user.realname as user_name')->order('create_time desc')->select(); $dataCount = db('admin_import_record')->where('type', $param['type'])->count(); $week = strtotime(date("Y-m-d H:i:s", strtotime("+7 day"))); $time = time(); foreach ($list as $k => $v) { - if ($time > (int)($week + $v['create_time'])) { + $week = strtotime("+7 day",$v['create_time']); + if ($time > (int)$week) { $list[$k]['valid'] = 0; } else { $list[$k]['valid'] = 1; } + if($v['error_data_file_path']==''){ + $list[$k]['valid'] = -1; + } $list[$k]['create_time'] = date('Y-m-d', $v['create_time']); } $data = []; @@ -2328,5 +2399,5 @@ class Excel extends Common } return $data; } - + } diff --git a/application/admin/model/Field.php b/application/admin/model/Field.php index f917d63..57310bd 100644 --- a/application/admin/model/Field.php +++ b/application/admin/model/Field.php @@ -182,10 +182,6 @@ class Field extends Model if ($param['types'] == 'crm_customer') { $map['field'] = array('not in', ['deal_status']); } - if ($param['types'] == 'crm_visit') { - $map['types'] = array('in', ['', $types]); - $map['field'] = ['not in', ['create_user_id', 'update_time', 'create_time']]; - } $list = Db::name('AdminField')->where($map)->order('order_id')->select(); foreach ($list as $k => $v) { $list[$k]['setting'] = $v['setting'] ? explode(chr(10), $v['setting']) : []; @@ -655,7 +651,7 @@ class Field extends Model } } else { - $field_list = $this->where($map)->field('field,types,name,form_type,default_value,is_unique,is_null,input_tips,setting')->order($order)->select(); + $field_list = $this->where($map)->where( 'is_hidden',0)->field('field,types,name,form_type,default_value,is_unique,is_null,input_tips,setting,is_hidden')->order($order)->select(); //客户 if (in_array($param['types'], ['crm_customer'])) { @@ -754,7 +750,16 @@ class Field extends Model ]; } elseif ($v['form_type'] == 'user') { $value = $userModel->getListByStr($dataInfo[$v['field']]) ?: []; - } elseif ($v['form_type'] == 'structure') { + if (empty($value)) $default_value = $userModel->getListByStr($param['user_id']) ? : []; + } elseif ($v['form_type'] == 'single_user') { + # 单用户 + $userInfo = $userModel->getListByStr($dataInfo[$v['field']]); + $value = !empty($userInfo[0]) ? $userInfo[0] : []; + if (empty($value)) { + $userInfo = $userModel->getListByStr($param['user_id']); + $default_value = !empty($userInfo[0]) ? $userInfo[0] : []; + } + }elseif ($v['form_type'] == 'structure') { $value = $structureModel->getListByStr($dataInfo[$v['field']]) ?: []; } elseif ($v['form_type'] == 'file') { $fileIds = []; @@ -882,7 +887,8 @@ class Field extends Model $userModel = new \app\admin\model\User(); $user_id = $param['user_id']; $map['types'] = ['in', ['', $types]]; - $map['form_type'] = ['not in', ['file', 'form', 'checkbox', 'structure', 'business_status']]; + $map['form_type'] = ['not in', ['file', 'form', 'business_status']]; + $map['is_hidden'] = 0; $field_list = db('admin_field') ->where($map) ->whereOr(['types' => '']) @@ -1026,12 +1032,16 @@ class Field extends Model $userLevel = isSuperAdministrators($user_id); $fieldList = $this->getFieldList($types, $types_id); - $where = []; if ($userFieldData) { $fieldArr = []; $i = 0; foreach ($userFieldData as $k => $v) { + if (empty($fieldList[$k])) { + unset($userFieldData[$k]); + continue; + } + if (empty($v['is_hide'])) { $fieldArr[$i]['field'] = $k; $fieldArr[$i]['name'] = $fieldList[$k]['name']; @@ -1081,8 +1091,9 @@ class Field extends Model 'form_type' => ['not in', ['file', 'form']], 'field' => ['not in', $unField], 'types_id' => ['eq', $types_id], + 'is_hidden'=>0 ]) - ->field(['field', 'name', 'form_type']) + ->field(['field', 'name', 'form_type,is_hidden']) ->order('order_id asc') ->select(); @@ -1192,7 +1203,6 @@ class Field extends Model } else { $listArr = $dataList; } - $typesArray = explode('_', $types); $type = array_pop($typesArray); if (isset($this->orther_field_list[$types])) { @@ -1257,6 +1267,11 @@ class Field extends Model if ($unFormType) $data['form_type'] = array('not in', $unFormType); $field_arr = $this->fieldSearch($data); } + if ($types == 'crm_visit') { + foreach ($field_arr AS $key => $value) { + if ($value['name'] == '负责人') unset($field_arr[(int)$key]); + } + } return $field_arr; } @@ -1315,9 +1330,12 @@ class Field extends Model $where = []; $where[$field] = ['eq', $val]; - if ($id) { - //为编辑时的验重 - $where[$dataModel->getpk()] = ['neq', $id]; + if ($id) { + //为编辑时的验重 + $where[$dataModel->getpk()] = ['neq', $id]; + } + if($types=='crm_product'){ + $where['delete_user_id'] = 0; } if ($res = $dataModel->where($where)->find()) { $this->error = '该数据已存在,请修改后提交!'; @@ -1378,7 +1396,7 @@ class Field extends Model case 'userStr' : $val = explode(',', $val); $val = count($userModel->getUserNameByArr($val)) > 1 ? ArrayToString($userModel->getUserNameByArr($val)) : implode(',', $userModel->getUserNameByArr($val)); - break; + break; case 'structure' : $val = ArrayToString($structureModel->getStructureNameByArr($val)); break; @@ -1648,6 +1666,7 @@ class Field extends Model break; case 'owner_user_id' : $data[$key]['fieldName'] = 'owner_user_name'; + $data[$key]['name'] = '回访人'; break; case 'contacts_id' : $data[$key]['fieldName'] = 'contacts_name'; diff --git a/application/admin/model/Record.php b/application/admin/model/Record.php index babf03f..5be254f 100644 --- a/application/admin/model/Record.php +++ b/application/admin/model/Record.php @@ -609,7 +609,7 @@ class Record extends Common } $fileModel = new \app\admin\model\File(); $record_ids = db('crm_activity')->where(['activity_type' => $types,'activity_type_id' => ['in',$types_id]])->column('activity_id'); - db('crm_activity')->where(['activity_type' => $types,'activity_type_id' => ['in',$types_id],'type'=>1])->delete(); + db('crm_activity')->where(['activity_type' => $types,'activity_type_id' => ['in',$types_id]])->delete(); //删除关联附件 $fileModel->delRFileByModule('crm_activity',$record_ids); return true; diff --git a/application/admin/model/Scene.php b/application/admin/model/Scene.php index 7d639ca..bb5cc9b 100644 --- a/application/admin/model/Scene.php +++ b/application/admin/model/Scene.php @@ -53,10 +53,10 @@ class Scene extends Common foreach ($value AS $k => $v) { $sceneData[$k] = [ 'condition' => trim($v['condition']), - 'value' => $v['value'], + 'value' => $v['value'], 'form_type' => $v['form_type'], - 'name' => $v['name'], - 'type' => $v['type'] + 'name' => $v['name'], + 'type' => $v['type'] ]; } } @@ -200,7 +200,13 @@ class Scene extends Common $sceneData = []; foreach ($param['data'] AS $key => $value) { foreach ($value AS $k => $v) { - $sceneData[$k] = $v; + $sceneData[$k] = [ + 'condition' => trim($v['condition']), + 'value' => $v['value'], + 'form_type' => $v['form_type'], + 'name' => $v['name'], + 'type' => $v['type'] + ]; } } if (!empty($sceneData)) $param['data'] = $sceneData; @@ -210,7 +216,9 @@ class Scene extends Common $res = $this->allowField(true)->save($param, ['scene_id' => $id]); if ($param['is_default'] == 1) { $this->defaultDataById($param,$param['id']); - } + } else { + db('admin_scene_default')->where(['user_id' => $user_id, 'types' => $param['types'], 'scene_id' => $id])->delete(); + } if ($res) { return true; } else { diff --git a/application/admin/model/User.php b/application/admin/model/User.php index bcaf2d4..16f84dd 100644 --- a/application/admin/model/User.php +++ b/application/admin/model/User.php @@ -47,7 +47,7 @@ class User extends Common 'name' => '手机号(登录名)', 'form_type' => 'mobile', 'is_null' => 1, - 'is_unique' => 1 +// 'is_unique' => 1 //guogaobo 导入此字段会进行验重查询调用修改用户方法 ], [ 'field' => 'password', @@ -256,6 +256,10 @@ class User extends Common } $param = $temp; $param['structure_id'] = 0; + if(db('admin_user')->where('username',$param['username'])->find()){ + $this->error = '手机号已存在'; + return false; + } } else { if (empty($param['group_id']) || !is_array($param['group_id'])) { $this->error = '请至少勾选一个用户组'; @@ -269,7 +273,6 @@ class User extends Common return false; } $syncModel = new \app\admin\model\Sync(); - $this->startTrans(); try { $salt = substr(md5(time()),0,4); @@ -350,6 +353,7 @@ class User extends Common */ public function updateDataById($param, $id) { + if ($param['user_id']) { //修改个人信息 $data['email'] = $param['email']; @@ -396,6 +400,7 @@ class User extends Common $this->error = '直属上级不能是自己或下属'; return false; } + p(2333); if (db('admin_user')->where(['id' => ['neq',$id],'username' => $param['username']])->find()) { $this->error = '手机号已存在'; return false; @@ -925,8 +930,6 @@ class User extends Common $authList['jxc'] = (Object)[]; $authList['knowledge'] = (Object)[]; - $authList['crm']['receivables']['excelexport'] = false; - return $authList; } diff --git a/application/admin/model/UserField.php b/application/admin/model/UserField.php index a0d7400..d98103d 100644 --- a/application/admin/model/UserField.php +++ b/application/admin/model/UserField.php @@ -147,7 +147,7 @@ class UserField extends Model $field_list[$v['field']]['name'] = $v['name']; $fieldArr[$k]['width'] = ''; } - + //已设置字段 $value = $this->where(['types' => $types,'user_id' => $user_id])->value('datas'); $value = $value ? json_decode($value, true) : []; @@ -162,6 +162,8 @@ class UserField extends Model $a = 0; $b = 0; foreach ($value as $k=>$v) { + if (empty($field_list[$k]['name'])) continue; + if (empty($v['is_hide'])) { $valueList[] = $k; $value_list[$a]['field'] = $k; @@ -193,6 +195,16 @@ class UserField extends Model $data = []; $data['value_list'] = $value_list ? : []; //展示列 $data['hide_list'] = $hide_list ? : []; //隐藏列 + + if ($types == 'crm_visit') { + foreach ($data['value_list'] AS $key => $value) { + if ($value['name'] == '负责人') $data['value_list'][$key]['name'] = '回访人'; + } + foreach ($data['hide_list'] AS $key => $value) { + if ($value['name'] == '负责人') $data['hide_list'][$key]['name'] = '回访人'; + } + } + return $data ? : []; } } \ No newline at end of file diff --git a/application/admin/view/install/index.html b/application/admin/view/install/index.html index f00c39a..3a83aec 100644 --- a/application/admin/view/install/index.html +++ b/application/admin/view/install/index.html @@ -28,7 +28,7 @@ 官方地址:www.5kcrm.com / www.72crm.com
官方电话:400-0812-558
官方邮箱:service@5kcrm.com
- 官方社区:bbs.72crm.net
+ 官方社区:bbs.72crm.com
官方社群:悟空CRM交流10群(486745026)

一、协议中提到的名词约定

diff --git a/application/admin/view/install/step1.html b/application/admin/view/install/step1.html index f09dbbb..8f8c82a 100644 --- a/application/admin/view/install/step1.html +++ b/application/admin/view/install/step1.html @@ -16,17 +16,23 @@
-
1
+
+ +
检查安装环境
-
2
+
+ +
创建数据库
-
3
+
+ +
安装成功
@@ -34,7 +40,7 @@
- 1 检查安装环境 + 检查安装环境 当前版本:{$data['version']['VERSION']} {$data['version']['RELEASE']}
diff --git a/application/admin/view/install/step2.html b/application/admin/view/install/step2.html index 3775652..b36bced 100644 --- a/application/admin/view/install/step2.html +++ b/application/admin/view/install/step2.html @@ -7,87 +7,114 @@ + - + + +
+
+

creating...

+
+
+
{include file="public/header"}
-
1
+
+ +
检查安装环境
-
2
+
+ +
创建数据库
-
3
+
+ +
安装成功
- -
+
- 2 创建数据库 + 创建数据库 当前版本:{$envir_data['version']['VERSION']} {$envir_data['version']['RELEASE']}
请填写数据库信息
-
-
数据库主机:
- - -
数据库地址一般为127.0.0.1
-
-
-
数据库名:
- -
-
-
端口:
- -
一般为 3306
-
-
-
数据库用户名:
- -
生产环境建议创建独立账号
-
-
-
数据库密码:
- -
-
+
+
数据库主机:
+ + + +
+
+
数据库名:
+ +
+
+
端口:
+ + +
+
+
数据库用户名:
+ + +
+
+
数据库密码:
+ +
+
表前缀:
- -
默认为5kcrm_
-
-
请填写管理员信息
-
-
管理员账号:
- + + +
+
+
安装序列号:
+ +
+ 您需要通过手机号来注册悟空ID,该手机号将作为您登录系统的管理员账号。您需要进入【悟空个人中心】,点击【开源版下载】获取您的序列号,如您已经注册悟空ID,您只需要点击登录个人中心即可查看您的序列号
-
+
+ +
请填写管理员信息
+

+ 请填写以下管理员信息,是指完成且系统安装成功后,您可以使用管理员信息登录系统. +

+
+
管理员账号:
+ +
+
管理员密码:
- +
+
+
+
- +
-
+
diff --git a/application/admin/view/install/step3.html b/application/admin/view/install/step3.html index 96b813d..d08e8a0 100644 --- a/application/admin/view/install/step3.html +++ b/application/admin/view/install/step3.html @@ -16,17 +16,23 @@
-
1
+
+ +
检查安装环境
-
2
+
+ +
创建数据库
-
3
+
+ +
安装成功
diff --git a/application/admin/view/install/step5.html b/application/admin/view/install/step5.html new file mode 100644 index 0000000..e119ef0 --- /dev/null +++ b/application/admin/view/install/step5.html @@ -0,0 +1,64 @@ + + + + + + 悟空CRM安装向导 + + + + + + +
+ {include file="public/header"} +
+
+
+
+
+ +
+
检查安装环境
+
+
+
+
+ +
+
创建数据库
+
+
+
+
+ +
+
安装成功
+
+
+
+
+
+
+ +
+

恭喜您,已成功安装悟空CRM

+
+

您已经成功安装开源PHP悟空CRM,您可以尽情享用悟空CRM开源版算有功能及服务.

+

使用管理员账号即可登录

+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/application/admin/view/public/footer.html b/application/admin/view/public/footer.html index ca7601b..283d477 100644 --- a/application/admin/view/public/footer.html +++ b/application/admin/view/public/footer.html @@ -1,6 +1,6 @@
悟空CRM受国家计算机软件著作权保护,未经授权不得进行商业行为,违者必究。
- ©2021 悟空软件www.5kcrm.com + ©2021 悟空软件 www.5kcrm.com
diff --git a/application/bi/controller/Examine.php b/application/bi/controller/Examine.php index 618ec6a..b956eed 100644 --- a/application/bi/controller/Examine.php +++ b/application/bi/controller/Examine.php @@ -122,10 +122,11 @@ class Examine extends ApiCommon unset($where['create_time']); unset($where['create_user_id']); unset($where['create_user_id']); - $where['check_status'] = 'all'; +// $where['check_status'] = 'all'; $where['page'] = $param['page']; $where['limit'] = $param['limit']; $where['user_id'] = $user_id; + $where['bi_types'] = 'bi'; $where['between_time'] = array($start_time,$end_time); $list = $examineModel->getDataList($where); diff --git a/application/common.php b/application/common.php index da12270..cf58b4c 100644 --- a/application/common.php +++ b/application/common.php @@ -165,10 +165,29 @@ function where_arr($array = [], $m = '', $c = '', $a = '') if (!empty($v['start'])) $v['start'] = date('Y-m-d', $v['start']); if (!empty($v['end'])) $v['end'] = date('Y-m-d', $v['end']); } - if ($v['form_type'] == 'user') { + # 创建人、负责人、回访人(非自定义字段) + if ($v['form_type'] == 'user' && in_array($k, ['create_user_id', 'owner_user_id'])) { if ($v['condition'] == 'is') $v['condition'] = 'contains'; } - if ($types == 'contract') { + # 自定义字段的user、structure类型 + if (($v['form_type'] == 'user' && !in_array($k, ['create_user_id', 'owner_user_id'])) || $v['form_type'] == 'structure') { + if ($v['condition'] == 'is') $v['condition'] = 'contains'; + if ($v['condition'] == 'isNot') { + return "(".$c.$k." not like '%".$v['value'][0]."%' OR ".$c.$k." is null)"; + } + } + # 处理多选字段的精确搜索 + if ($v['form_type'] == 'checkbox' && !empty($v['value'])) { + if ($v['condition'] == 'is' && count($v['value']) == 1) $v['value'][0] = ',' . $v['value'][0] . ','; + if ($v['condition'] == 'is' && count($v['value']) > 1) { + $checkboxLike = ''; + foreach ($v['value'] AS $kk => $vv) { + $checkboxLike .= $c.$k." like "."'%".$vv."%' AND "; + } + return "(".$checkboxLike."LENGTH(".$c.$k.") = LENGTH('".arrayToString($v['value'])."'))"; + } + } + if ($types == 'contract' && !empty($v['value'])) { switch ($k) { case 'business_id' : $k = 'name'; @@ -186,11 +205,11 @@ function where_arr($array = [], $m = '', $c = '', $a = '') break; } } - if ($types == 'receivables' && $v['name'] == '合同编号') { + if ($types == 'receivables' && $v['name'] == '合同编号' && !empty($v['value'])) { $k = 'num'; $c = 'contract.'; } - if ($types == 'receivables' && $k == 'plan_id') { + if ($types == 'receivables' && $k == 'plan_id' && !empty($v['value'])) { $planIds = []; foreach ($v['value'] AS $kk => $vv) { $planIdArray = db('crm_receivables_plan')->whereLike('num', '%' . $vv . '%')->column('plan_id'); @@ -200,17 +219,21 @@ function where_arr($array = [], $m = '', $c = '', $a = '') } $v['value'] = array_unique($planIds); } - if ($types == 'invoice' && $v['type'] == 'invoice_status') { + if ($types == 'invoice' && $v['type'] == 'invoice_status' && !empty($v['value'])) { foreach ($v['value'] AS $kk => $vv) { if ($vv == '已开票') $v['value'][$kk] = 1; if ($vv == '未开票') $v['value'][$kk] = 0; } } - if ($types == 'visit' && $v['type'] == 'contract_name') { + if ($types == 'visit' && $v['type'] == 'contract_name' && !empty($v['value'])) { $k = 'num'; $c = 'contract.'; } - if ($k == 'check_status' && is_array($v) && in_array($v['value'][0], $checkStatusList)) { + if ($types == 'visit' && $v['type'] == 'contacts_name' && !empty($v['value'])) { + $k = 'name'; + $c = 'contacts.'; + } + if ($k == 'check_status' && is_array($v) && in_array($v['value'][0], $checkStatusList) && !empty($v['value'])) { $v['value'] = $checkStatusArray[$v['value'][0]] ?: '0'; } if (is_array($v)) { diff --git a/application/crm/controller/Business.php b/application/crm/controller/Business.php index 0d3c4a6..ed3f1cb 100644 --- a/application/crm/controller/Business.php +++ b/application/crm/controller/Business.php @@ -276,11 +276,6 @@ class Business extends ApiCommon $errorMessage[] = $businessInfo['name'].'"转移失败,错误原因:无权限;'; continue; } - $resBusiness = db('crm_business')->where(['business_id' => $business_id])->update($data); - if (!$resBusiness) { - $errorMessage[] = $businessInfo['name'].'"转移失败,错误原因:数据出错;'; - continue; - } //团队成员 teamUserId( @@ -291,7 +286,25 @@ class Business extends ApiCommon $is_remove, 0 ); - + + $resBusiness = db('crm_business')->where(['business_id' => $business_id])->update($data); + if (!$resBusiness) { + $errorMessage[] = $businessInfo['name'].'"转移失败,错误原因:数据出错;'; + continue; + } else { + $businessArray = []; + $teamBusiness = db('crm_business')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('business_id', $business_id)->find(); + if (!empty($teamBusiness['ro_user_id'])) { + $businessRo = arrayToString(array_diff(stringToArray($teamBusiness['ro_user_id']), [$teamBusiness['owner_user_id']])); + $businessArray['ro_user_id'] = $businessRo; + } + if (!empty($teamBusiness['rw_user_id'])) { + $businessRo = arrayToString(array_diff(stringToArray($teamBusiness['rw_user_id']), [$teamBusiness['owner_user_id']])); + $businessArray['rw_user_id'] = $businessRo; + } + db('crm_business')->where('business_id', $business_id)->update($businessArray); + } + //修改记录 updateActionLog($userInfo['id'], 'crm_business', $business_id, '', '', '将商机转移给:'.$ownerUserName); } diff --git a/application/crm/controller/Contract.php b/application/crm/controller/Contract.php index 1f079f2..bd63218 100644 --- a/application/crm/controller/Contract.php +++ b/application/crm/controller/Contract.php @@ -214,12 +214,6 @@ class Contract extends ApiCommon if (!in_array($dataInfo['check_status'], ['3', '4', '5', '6'])) { return resultArray(['error' => '当前状态为审批中或已审批通过,不可编辑']); } - - if ($param['is_draft'] || (!empty($param['check_status']) && $param['check_status'] == 5)) { - //保存为草稿 - $param['check_status'] = 5; //草稿(未提交) - $param['check_user_id'] = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; - } else { if (($examineStatus != false && $examineStatus != 'false') || $examineStatus == 1) { //将合同审批状态至为待审核,提交后重新进行审批 //审核判断(是否有符合条件的审批流) @@ -244,7 +238,7 @@ class Contract extends ApiCommon } else { $check_user_id = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; } - if ($param['is_draft']) { + if ($param['is_draft'] || (!empty($param['check_status']) && $param['check_status'] == 5)) { //保存为草稿 $param['check_status'] = 5; $param['check_user_id'] = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; @@ -257,7 +251,7 @@ class Contract extends ApiCommon } $param['flow_user_id'] = ''; } - } + if ($contractModel->updateDataById($param, $param['id'])) { //将审批记录至为无效 @@ -314,7 +308,7 @@ class Contract extends ApiCommon $isDel = false; $errorMessage[] = '名称为'.$data['name'].'的合同删除失败,错误原因:当前合同已作废,非超级管理员,不可删除'; } - if (!in_array($data['check_status'],['0','4','5','6']) && !in_array(1,$adminTypes)) { + if (!in_array($data['check_status'], [4, 5]) && !in_array(1,$adminTypes)) { $isDel = false; $errorMessage[] = '名称为'.$data['name'].'的合同删除失败,错误原因:当前状态为审批中或已审批通过,不可删除'; } @@ -335,9 +329,9 @@ class Contract extends ApiCommon return resultArray(['error' => $contractModel->getError()]); } //删除跟进记录 - $recordModel->delDataByTypes('crm_contract',$delIds); + $recordModel->delDataByTypes(6,$delIds); //删除关联附件 - $fileModel->delRFileByModule(6,$delIds); + $fileModel->delRFileByModule('crm_contract',$delIds); //删除关联操作记录 $actionRecordModel->delDataById(['types'=>'crm_contract','action_id'=>$delIds]); // 删除回款记录 @@ -395,15 +389,10 @@ class Contract extends ApiCommon $errorMessage[] = $contractInfo['name'].'"转移失败,错误原因:无权限;'; continue; } - if (in_array($contractInfo['check_status'],['0','1'])) { - $errorMessage[] = $contractInfo['name'].'"转移失败,错误原因:待审或审批中,无法转移;'; - continue; - } - $resContract = db('crm_contract')->where(['contract_id' => $contract_id])->update($data); - if (!$resContract) { - $errorMessage[] = $contractInfo['name'].'"转移失败,错误原因:数据出错;'; - continue; - } +// if (in_array($contractInfo['check_status'],['0','1'])) { +// $errorMessage[] = $contractInfo['name'].'"转移失败,错误原因:待审或审批中,无法转移;'; +// continue; +// } //团队成员 teamUserId( @@ -411,9 +400,29 @@ class Contract extends ApiCommon $contract_id, $type, [$contractInfo['owner_user_id']], - $is_remove, + ($is_remove == 1) ? 1 : '', 0 ); + + $resContract = db('crm_contract')->where(['contract_id' => $contract_id])->update($data); + if (!$resContract) { + $errorMessage[] = $contractInfo['name'].'"转移失败,错误原因:数据出错;'; + continue; + } else { + # 处理负责人重复显示在团队成员中的bug + $contractArray = []; + $teamContract = db('crm_contract')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('contract_id', $contract_id)->find(); + if (!empty($teamContract['ro_user_id'])) { + $contractRo = arrayToString(array_diff(stringToArray($teamContract['ro_user_id']), [$teamContract['owner_user_id']])); + $contractArray['ro_user_id'] = $contractRo; + } + if (!empty($teamContract['rw_user_id'])) { + $contractRo = arrayToString(array_diff(stringToArray($teamContract['rw_user_id']), [$teamContract['owner_user_id']])); + $contractArray['rw_user_id'] = $contractRo; + } + db('crm_contract')->where('contract_id', $contract_id)->update($contractArray); + } + //修改记录 updateActionLog($userInfo['id'], 'crm_contract', $contract_id, '', '', '将合同转移给:'.$ownerUserName); } diff --git a/application/crm/controller/Customer.php b/application/crm/controller/Customer.php index 8e59d91..8506476 100644 --- a/application/crm/controller/Customer.php +++ b/application/crm/controller/Customer.php @@ -316,7 +316,20 @@ class Customer extends ApiCommon if (!$resCustomer) { $errorMessage[] = $customerInfo['name'].'转移失败,错误原因:数据出错;'; continue; - } + } else { + # 处理转移时,负责人出现在只读和读写成员列表中 + $customerArray = []; + $teamCustomer = db('crm_customer')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('customer_id', $customer_id)->find(); + if (!empty($teamCustomer['ro_user_id'])) { + $customerRo = arrayToString(array_diff(stringToArray($teamCustomer['ro_user_id']), [$teamCustomer['owner_user_id']])); + $customerArray['ro_user_id'] = $customerRo; + } + if (!empty($teamCustomer['rw_user_id'])) { + $customerRo = arrayToString(array_diff(stringToArray($teamCustomer['rw_user_id']), [$teamCustomer['owner_user_id']])); + $customerArray['rw_user_id'] = $customerRo; + } + db('crm_customer')->where('customer_id', $customer_id)->update($customerArray); + } if (in_array('crm_contacts',$types)) { $contactsIds = []; @@ -339,7 +352,7 @@ class Customer extends ApiCommon if ($resBusiness !== true) { $errorMessage = $errorMessage ? array_merge($errorMessage,$resBusiness) : $resBusiness; continue; - } + } } } @@ -677,7 +690,7 @@ class Customer extends ApiCommon $file = request()->file('file'); // $res = $excelModel->importExcel($file, $param, $this); $res = $excelModel->batchImportData($file, $param, $this); - return resultArray(['data' => '导入成功']); + return resultArray(['data' => $excelModel->getError()]); } /** diff --git a/application/crm/controller/Invoice.php b/application/crm/controller/Invoice.php index 8606196..ee77c45 100644 --- a/application/crm/controller/Invoice.php +++ b/application/crm/controller/Invoice.php @@ -315,6 +315,8 @@ class Invoice extends ApiCommon */ public function delete(InvoiceLogic $invoiceLogic) { + $actionRecordModel = new \app\admin\model\ActionRecord(); + $fileModel = new \app\admin\model\File(); $idArray = $this->param['id']; $userinfo = $this->userInfo['id']; @@ -326,7 +328,7 @@ class Invoice extends ApiCommon if (!isSuperAdministrators($userinfo['id'])) { $list = $invoiceLogic->getExamineStatus($idString, true); foreach ($list AS $key => $value) { - if (!in_array($value['check_status'], ['3', '4', '5', '6'])) { + if (!in_array($value['check_status'], [4, 5])) { $status = false; break; } @@ -338,8 +340,9 @@ class Invoice extends ApiCommon if (!$invoiceLogic->delete($idArray)) return resultArray(['error' => '删除失败!']); # 删除附件 - $fileModel = new \app\admin\model\File(); $fileModel->delRFileByModule('crm_invoice', $idArray); + //删除关联操作记录 + $actionRecordModel->delDataById(['types'=>'crm_invoice','action_id'=>$idArray]); return resultArray(['data' => '删除成功!']); } diff --git a/application/crm/controller/Leads.php b/application/crm/controller/Leads.php index 407012f..6314ed9 100644 --- a/application/crm/controller/Leads.php +++ b/application/crm/controller/Leads.php @@ -226,7 +226,8 @@ class Leads extends ApiCommon $data['deal_time'] = time(); $data['create_time'] = time(); $data['update_time'] = time(); - $data['next_time'] = $leadsInfo['next_time'] ? date('Y-m-d H:i:s', $leadsInfo['next_time']) : 0; + $data['next_time'] = $leadsInfo['next_time']; + if (empty($data['telephone'])) $data['telephone'] = 0; # 获取客户的时间 $data['obtain_time'] = time(); //权限判断 @@ -404,6 +405,9 @@ class Leads extends ApiCommon $file = request()->file('file'); // $res = $excelModel->importExcel($file, $param); $res = $excelModel->batchImportData($file, $param, $this); + if (!$res) { + return resultArray(['error' => $excelModel->getError()]); + } return resultArray(['data' => $excelModel->getError()]); } diff --git a/application/crm/controller/Product.php b/application/crm/controller/Product.php index 2bcb30c..8cd4c32 100644 --- a/application/crm/controller/Product.php +++ b/application/crm/controller/Product.php @@ -10,6 +10,7 @@ namespace app\crm\controller; use app\admin\controller\ApiCommon; use app\crm\model\Product as ProductModel; use app\admin\model\File as FileModel; +use app\admin\model\ActionRecord as ActionRecordModel; use think\Db; use think\Hook; use think\Request; @@ -294,6 +295,8 @@ class Product extends ApiCommon ProductModel::commit(); // 删除关联附件 (new FileModel)->delRFileByModule('crm_product', $delIds); + // 操作记录 + (new ActionRecordModel)->delDataById('crm_product', $delIds); // 添加删除记录 actionLog($delIds, '', '', ''); return resultArray(['data' => '删除成功']); diff --git a/application/crm/controller/Receivables.php b/application/crm/controller/Receivables.php index e40e8ad..07d5f49 100644 --- a/application/crm/controller/Receivables.php +++ b/application/crm/controller/Receivables.php @@ -19,42 +19,79 @@ use think\Db; class Receivables extends ApiCommon { use AutoNumberTrait; - + /** * 用于判断权限 * @permission 无限制 * @allow 登录用户可访问 * @other 其他根据系统设置 - **/ + **/ public function _initialize() { $action = [ - 'permission'=>[''], - 'allow'=>['check','revokecheck','system','count'] + 'permission' => [''], + 'allow' => ['check', 'revokecheck', 'system', 'count'] ]; - Hook::listen('check_auth',$action); + Hook::listen('check_auth', $action); $request = Request::instance(); - $a = strtolower($request->action()); + $a = strtolower($request->action()); if (!in_array($a, $action['permission'])) { parent::_initialize(); } - } - + } + /** * 回款列表 + * @return * @author Michael_xu - * @return */ public function index() { $receivablesModel = model('Receivables'); $param = $this->param; $userInfo = $this->userInfo; - $param['user_id'] = $userInfo['id']; - $data = $receivablesModel->getDataList($param); + $param['user_id'] = $userInfo['id']; + $data = $receivablesModel->getDataList($param); return resultArray(['data' => $data]); } - + + /** + * 导出 + * @param + * @return + * @author guogaobo + */ + public function excelExport() + { + $param = $this->param; + $userInfo = $this->userInfo; + $param['user_id'] = $userInfo['id']; + if ($param['receivables_id']) { + $param['receivables_id'] = ['condition' => 'in', 'value' => $param['receivables_id'], 'form_type' => 'text', 'name' => '']; + $param['is_excel'] = 1; + } + $excelModel = new \app\admin\model\Excel(); + // 导出的字段列表 + $fieldModel = new \app\admin\model\Field(); + $field_list = $fieldModel->getIndexFieldConfig('crm_receivables', $userInfo['id']); + // 文件名 + $file_name = '5kcrm_receivables_' . date('Ymd'); + + $model = model('Receivables'); + $temp_file = $param['temp_file']; + unset($param['temp_file']); + $page = $param['page'] ?: 1; + unset($param['page']); + unset($param['export_queue_index']); + return $excelModel->batchExportCsv($file_name, $temp_file, $field_list, $page, function ($page, $limit) use ($model, $param, $field_list) { + $param['page'] = $page; + $param['limit'] = $limit; + $data = $model->getDataList($param); + $data['list'] = $model->exportHandle($data['list'], $field_list, 'Receivables'); + return $data; + }); + } + /** * 添加回款 * @@ -69,7 +106,7 @@ class Receivables extends ApiCommon $param['owner_user_id'] = $userInfo['id']; $examineStatus = $param['examineStatus']; // 审批是否停用 unset($param['examineStatus']); - + # 自动设置回款编号 $numberInfo = []; if (empty($param['number'])) { @@ -80,39 +117,39 @@ class Receivables extends ApiCommon if ($param['is_draft'] || (!empty($param['check_status']) && $param['check_status'] == 5)) { //保存为草稿 $param['check_status'] = 5; //草稿(未提交) - $param['check_user_id'] = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; - } else { - if (($examineStatus != false && $examineStatus != 'false') || $examineStatus == 1) { - //审核判断(是否有符合条件的审批流) - $examineFlowModel = new \app\admin\model\ExamineFlow(); - if (!$examineFlowModel->checkExamine($param['owner_user_id'], 'crm_receivables')) { - return resultArray(['error' => '暂无审批人,无法创建']); - } - //添加审批相关信息 - $examineFlowData = $examineFlowModel->getFlowByTypes($param['owner_user_id'], 'crm_receivables'); - if (!$examineFlowData) { - return resultArray(['error' => '无可用审批流,请联系管理员']); - } - $param['flow_id'] = $examineFlowData['flow_id']; - //获取审批人信息 - if ($examineFlowData['config'] == 1) { - //固定审批流 - $nextStepData = $examineStepModel->nextStepUser($userInfo['id'], $examineFlowData['flow_id'], 'crm_receivables', 0, 0, 0); - $next_user_ids = arrayToString($nextStepData['next_user_ids']) ? : ''; - $check_user_id = $next_user_ids ? : []; - $param['order_id'] = 1; - } else { - $check_user_id = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; - } - if (!$check_user_id) { - return resultArray(['error' => '无可用审批人,请联系管理员']); - } - $param['check_user_id'] = is_array($check_user_id) ? ','.implode(',',$check_user_id).',' : $check_user_id; + $param['check_user_id'] = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; + } + if (($examineStatus != false && $examineStatus != 'false') || $examineStatus == 1) { + //审核判断(是否有符合条件的审批流) + $examineFlowModel = new \app\admin\model\ExamineFlow(); + if (!$examineFlowModel->checkExamine($param['owner_user_id'], 'crm_receivables')) { + return resultArray(['error' => '暂无审批人,无法创建']); + } + //添加审批相关信息 + $examineFlowData = $examineFlowModel->getFlowByTypes($param['owner_user_id'], 'crm_receivables'); + if (!$examineFlowData) { + return resultArray(['error' => '无可用审批流,请联系管理员']); + } + $param['flow_id'] = $examineFlowData['flow_id']; + //获取审批人信息 + if ($examineFlowData['config'] == 1) { + //固定审批流 + $nextStepData = $examineStepModel->nextStepUser($userInfo['id'], $examineFlowData['flow_id'], 'crm_receivables', 0, 0, 0); + $next_user_ids = arrayToString($nextStepData['next_user_ids']) ?: ''; + $check_user_id = $next_user_ids ?: []; + $param['order_id'] = 1; } else { - # 审批流停用,将状态改为审核通过 - $param['check_status'] = 2; + $check_user_id = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; } + if (!$check_user_id) { + return resultArray(['error' => '无可用审批人,请联系管理员']); + } + $param['check_user_id'] = is_array($check_user_id) ? ',' . implode(',', $check_user_id) . ',' : $check_user_id; + } else { + # 审批流停用,将状态改为审核通过 + $param['check_status'] = 2; } + $res = $receivablesModel->createData($param); if ($res) { //回款计划关联 @@ -121,18 +158,18 @@ class Receivables extends ApiCommon } # 更新crm_number_sequence表中的last_date、create_time字段 if (!empty($numberInfo['data'])) (new NumberSequence())->batchUpdate($numberInfo['data']); - + return resultArray(['data' => '添加成功']); } else { return resultArray(['error' => $receivablesModel->getError()]); } } - + /** * 回款详情 + * @param + * @return * @author Michael_xu - * @param - * @return */ public function read() { @@ -140,27 +177,27 @@ class Receivables extends ApiCommon $userModel = new \app\admin\model\User(); $param = $this->param; $data = $receivablesModel->getDataById($param['id']); - + //判断权限 $auth_user_ids = $userModel->getUserByPer('crm', 'receivables', 'read'); - if (!in_array($data['owner_user_id'],$auth_user_ids)) { + if (!in_array($data['owner_user_id'], $auth_user_ids)) { $authData['dataAuth'] = 0; return resultArray(['data' => $authData]); - } + } if (!$data) { return resultArray(['error' => $receivablesModel->getError()]); } return resultArray(['data' => $data]); } - + /** * 编辑回款 + * @param + * @return * @author Michael_xu - * @param - * @return */ public function update() - { + { $receivablesModel = model('Receivables'); $userModel = new \app\admin\model\User(); $param = $this->param; @@ -171,11 +208,11 @@ class Receivables extends ApiCommon //判断权限 $dataInfo = $receivablesModel->getDataById($param['id']); $auth_user_ids = $userModel->getUserByPer('crm', 'receivables', 'update'); - if (!in_array($dataInfo['owner_user_id'],$auth_user_ids)) { + if (!in_array($dataInfo['owner_user_id'], $auth_user_ids)) { header('Content-Type:application/json; charset=utf-8'); - exit(json_encode(['code'=>102,'error'=>'无权操作'])); + exit(json_encode(['code' => 102, 'error' => '无权操作'])); } - + # 自动设置回款编号 $numberInfo = []; if (empty($param['number'])) { @@ -183,22 +220,22 @@ class Receivables extends ApiCommon if (empty($numberInfo['number'])) return resultArray(['error' => '请填写回款编号!']); $param['number'] = $numberInfo['number']; } - + //已进行审批,不能编辑 if (!in_array($dataInfo['check_status'], ['3', '4', '5', '6'])) { return resultArray(['error' => '当前状态为审批中或已审批通过,不可编辑']); } - + if ($param['is_draft'] || (!empty($param['check_status']) && $param['check_status'] == 5)) { //保存为草稿 $param['check_status'] = 5; //草稿(未提交) - $param['check_user_id'] = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; + $param['check_user_id'] = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; } else { if (($examineStatus != false && $examineStatus != 'false') || $examineStatus == 1) { if ($param['is_draft']) { //保存为草稿 $param['check_status'] = 5; - $param['check_user_id'] = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; + $param['check_user_id'] = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; } else { //将回款审批状态至为待审核,提交后重新进行审批 //审核判断(是否有符合条件的审批流) @@ -217,47 +254,50 @@ class Receivables extends ApiCommon if ($examineFlowData['config'] == 1) { //固定审批流 $nextStepData = $examineStepModel->nextStepUser($dataInfo['owner_user_id'], $examineFlowData['flow_id'], 'crm_receivables', 0, 0, 0); - $next_user_ids = arrayToString($nextStepData['next_user_ids']) ? : ''; - $check_user_id = $next_user_ids ? : []; + $next_user_ids = arrayToString($nextStepData['next_user_ids']) ?: ''; + $check_user_id = $next_user_ids ?: []; $param['order_id'] = 1; } else { - $check_user_id = $param['check_user_id'] ? ','.$param['check_user_id'].',' : ''; + $check_user_id = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; } if (!$check_user_id) { return resultArray(['error' => '无可用审批人,请联系管理员']); } - $param['check_user_id'] = is_array($check_user_id) ? ','.implode(',',$check_user_id).',' : $check_user_id; + $param['check_user_id'] = is_array($check_user_id) ? ',' . implode(',', $check_user_id) . ',' : $check_user_id; $param['check_status'] = 0; $param['flow_user_id'] = ''; } } } - + $res = $receivablesModel->updateDataById($param, $param['id']); if ($res) { //将审批记录至为无效 $examineRecordModel = new \app\admin\model\ExamineRecord(); - $examineRecordModel->setEnd(['types' => 'crm_receivables','types_id' => $param['id']]); + $examineRecordModel->setEnd(['types' => 'crm_receivables', 'types_id' => $param['id']]); # 更新crm_number_sequence表中的last_date、create_time字段 if (!empty($numberInfo['data'])) (new NumberSequence())->batchUpdate($numberInfo['data']); - + return resultArray(['data' => '编辑成功']); } else { return resultArray(['error' => $receivablesModel->getError()]); - } + } } - + /** * 删除回款 + * @param + * @return * @author Michael_xu - * @param - * @return */ public function delete() { + $actionRecordModel = new \app\admin\model\ActionRecord(); + $fileModel = new \app\admin\model\File(); + $recordModel = new \app\admin\model\Record(); $receivablesModel = model('Receivables'); $param = $this->param; - $userInfo = $this->userInfo; + $userInfo = $this->userInfo; if (!is_array($param['id'])) { $receivables_id = [$param['id']]; } else { @@ -265,61 +305,68 @@ class Receivables extends ApiCommon } $delIds = []; $errorMessage = []; - + //数据权限判断 $userModel = new \app\admin\model\User(); $auth_user_ids = $userModel->getUserByPer('crm', 'receivables', 'delete'); $adminTypes = adminGroupTypes($userInfo['id']); - foreach ($receivables_id as $k=>$v) { + foreach ($receivables_id as $k => $v) { $isDel = true; //数据详情 $data = $receivablesModel->getDataById($v); if (!$data) { $isDel = false; - $errorMessage[] = 'id为'.$v.'的回款删除失败,错误原因:'.$receivablesModel->getError(); + $errorMessage[] = 'id为' . $v . '的回款删除失败,错误原因:' . $receivablesModel->getError(); continue; } - if (!in_array($data['owner_user_id'],$auth_user_ids)) { + if (!in_array($data['owner_user_id'], $auth_user_ids)) { $isDel = false; - $errorMessage[] = '名称为'.$data['number'].'的回款删除失败,错误原因:无权操作'; + $errorMessage[] = '名称为' . $data['number'] . '的回款删除失败,错误原因:无权操作'; continue; } - if (!in_array($data['check_status'],['0','4','5']) && !in_array(1,$adminTypes)) { + if (!in_array($data['check_status'], [4, 5]) && !in_array(1, $adminTypes)) { $isDel = false; - $errorMessage[] = '名称为'.$data['number'].'的回款删除失败,错误原因:请先撤销审核'; + $errorMessage[] = '名称为' . $data['number'] . '的回款删除失败,错误原因:请先撤销审核'; continue; } if ($isDel) { if (db('crm_receivables_plan')->where('receivables_id', $v)->value('plan_id')) { $isDel = false; - $errorMessage[] = '名称为'.$data['number'].'的回款删除失败,错误原因:回款已关联回款计划,不能删除!'; + $errorMessage[] = '名称为' . $data['number'] . '的回款删除失败,错误原因:回款已关联回款计划,不能删除!'; continue; - } + } } if ($isDel) { $delIds[] = $v; - } + } } if ($delIds) { $data = $receivablesModel->delDatas($delIds); if (!$data) { return resultArray(['error' => $receivablesModel->getError()]); - } - actionLog($delIds,'','',''); + } + //删除跟进记录 + $recordModel->delDataByTypes(7,$delIds); + # 删除附件 + $fileModel->delRFileByModule('crm_receivables', $delIds); + //删除关联操作记录 + $actionRecordModel->delDataById(['types' => 'crm_receivables', 'action_id' => $delIds]); + actionLog($delIds, '', '', ''); } + if ($errorMessage) { return resultArray(['error' => $errorMessage]); } else { return resultArray(['data' => '删除成功']); - } - } - + } + } + /** * 回款审核 - * @author Michael_xu - * @param + * @param * @return - */ + * @author Michael_xu + */ public function check() { $param = $this->param; @@ -329,19 +376,19 @@ class Receivables extends ApiCommon $examineStepModel = new \app\admin\model\ExamineStep(); $examineRecordModel = new \app\admin\model\ExamineRecord(); $examineFlowModel = new \app\admin\model\ExamineFlow(); - + $receivablesData = []; $receivablesData['update_time'] = time(); $receivablesData['check_status'] = 1; //0待审核,1审核通中,2审核通过,3审核未通过 //权限判断 if (!$examineStepModel->checkExamine($user_id, 'crm_receivables', $param['id'])) { - return resultArray(['error' => $examineStepModel->getError()]); + return resultArray(['error' => $examineStepModel->getError()]); }; //审批主体详情 $dataInfo = $receivablesModel->getDataById($param['id']); $flowInfo = $examineFlowModel->getDataById($dataInfo['flow_id']); $is_end = 0; // 1审批结束 - + $status = $param['status'] ? 1 : 0; //1通过,0驳回 $checkData = []; $checkData['check_user_id'] = $user_id; @@ -350,7 +397,7 @@ class Receivables extends ApiCommon $checkData['check_time'] = time(); $checkData['content'] = $param['content']; $checkData['flow_id'] = $dataInfo['flow_id']; - $checkData['order_id'] = $dataInfo['order_id'] ? : 1; + $checkData['order_id'] = $dataInfo['order_id'] ?: 1; $checkData['status'] = $status; if ($status == 1) { @@ -358,8 +405,8 @@ class Receivables extends ApiCommon //固定流程 //获取下一审批信息 $nextStepData = $examineStepModel->nextStepUser($dataInfo['owner_user_id'], $dataInfo['flow_id'], 'crm_receivables', $param['id'], $dataInfo['order_id'], $user_id); - $next_user_ids = $nextStepData['next_user_ids'] ? : []; - $receivablesData['order_id'] = $nextStepData['order_id'] ? : ''; + $next_user_ids = $nextStepData['next_user_ids'] ?: []; + $receivablesData['order_id'] = $nextStepData['order_id'] ?: ''; if (!$next_user_ids) { $is_end = 1; //审批结束 @@ -368,21 +415,21 @@ class Receivables extends ApiCommon } else { //修改主体相关审批信息 $receivablesData['check_user_id'] = arrayToString($next_user_ids); - } + } } else { //自选流程 $is_end = $param['is_end'] ? 1 : ''; - $check_user_id = $param['check_user_id'] ? : ''; + $check_user_id = $param['check_user_id'] ?: ''; if ($is_end !== 1 && empty($check_user_id)) { - return resultArray(['error' => '请选择下一审批人']); + return resultArray(['error' => '请选择下一审批人']); } $receivablesData['check_user_id'] = arrayToString($param['check_user_id']); - } + } if ($is_end == 1) { $checkData['check_status'] = !empty($status) ? 2 : 3; $receivablesData['check_user_id'] = ''; $receivablesData['check_status'] = 2; - } + } } else { //审批驳回 $is_end = 1; @@ -391,7 +438,7 @@ class Receivables extends ApiCommon // $examineRecordModel->setEnd(['types' => 'crm_receivables','types_id' => $param['id']]); } //已审批人ID - $receivablesData['flow_user_id'] = stringToArray($dataInfo['flow_user_id']) ? arrayToString(array_merge(stringToArray($dataInfo['flow_user_id']),[$user_id])) : arrayToString([$user_id]); + $receivablesData['flow_user_id'] = stringToArray($dataInfo['flow_user_id']) ? arrayToString(array_merge(stringToArray($dataInfo['flow_user_id']), [$user_id])) : arrayToString([$user_id]); $resReceivables = db('crm_receivables')->where(['receivables_id' => $param['id']])->update($receivablesData); if ($resReceivables) { if ($status) { @@ -416,33 +463,33 @@ class Receivables extends ApiCommon $dataInfo['owner_user_id'] ); } - + //审批记录 $resRecord = $examineRecordModel->createData($checkData); if ($is_end == 1 && !empty($status)) { //发送站内信 通过 (new Message())->send( - Message::RECEIVABLES_PASS, - [ - 'title' => $dataInfo['number'], - 'action_id' => $param['id'] - ], - $dataInfo['owner_user_id'] - ); + Message::RECEIVABLES_PASS, + [ + 'title' => $dataInfo['number'], + 'action_id' => $param['id'] + ], + $dataInfo['owner_user_id'] + ); } - return resultArray(['data' => '审批成功']); + return resultArray(['data' => '审批成功']); } else { - return resultArray(['error' => '审批失败,请重试!']); + return resultArray(['error' => '审批失败,请重试!']); } } - + /** * 回款撤销审核 - * @author Michael_xu - * @param + * @param * @return - */ + * @author Michael_xu + */ public function revokeCheck() { $param = $this->param; @@ -453,23 +500,23 @@ class Receivables extends ApiCommon $examineRecordModel = new \app\admin\model\ExamineRecord(); $customerModel = model('Customer'); $userModel = new \app\admin\model\User(); - + $receivablesData = []; $receivablesData['update_time'] = time(); $receivablesData['check_status'] = 0; //0待审核,1审核通中,2审核通过,3审核未通过 //审批主体详情 - $dataInfo = $receivablesModel->getDataById($param['id']); + $dataInfo = $receivablesModel->getDataById($param['id']); //权限判断(创建人或负责人或管理员) if ($dataInfo['check_status'] == 2) { - return resultArray(['error' => '已审批结束,不能撤销']); - } + return resultArray(['error' => '已审批结束,不能撤销']); + } if ($dataInfo['check_status'] == 4) { - return resultArray(['error' => '无需撤销']); - } - $admin_user_ids = $userModel->getAdminId(); + return resultArray(['error' => '无需撤销']); + } + $admin_user_ids = $userModel->getAdminId(); if ($dataInfo['owner_user_id'] !== $user_id && !in_array($user_id, $admin_user_ids)) { return resultArray(['error' => '没有权限']); - } + } $is_end = 0; // 1审批结束 $status = 2; //1通过,0驳回, 2撤销 @@ -492,12 +539,12 @@ class Receivables extends ApiCommon // $examineRecordModel->setEnd(['types' => 'crm_receivables','types_id' => $param['id']]); //审批记录 $resRecord = $examineRecordModel->createData($checkData); - return resultArray(['data' => '撤销成功']); + return resultArray(['data' => '撤销成功']); } else { - return resultArray(['error' => '撤销失败,请重试!']); + return resultArray(['error' => '撤销失败,请重试!']); } } - + /** * 转移 * @@ -505,50 +552,50 @@ class Receivables extends ApiCommon */ public function transfer() { - $param = $this->param; - $userInfo = $this->userInfo; + $param = $this->param; + $userInfo = $this->userInfo; $receivablesModel = model('Receivables'); - + $userModel = new \app\admin\model\User(); - $authIds = $userModel->getUserByPer(); - + $authIds = $userModel->getUserByPer(); + if (empty($param['owner_user_id'])) return resultArray(['error' => '变更负责人不能为空']); if (empty($param['receivables_id']) || !is_array($param['receivables_id'])) return resultArray(['error' => '请选择需要转移的回款']); - + $owner_user_info = $userModel->getUserById($param['owner_user_id']); - + $data = [ 'owner_user_id' => $param['owner_user_id'], - 'update_time' => time(), + 'update_time' => time(), ]; - + $errorMessage = []; foreach ($param['receivables_id'] as $receivables_id) { $receivables_info = $receivablesModel->getDataById($receivables_id); if (!$receivables_info) { - $errorMessage[] = 'id:为《'.$receivables_id.'》的回款转移失败,错误原因:数据不存在;'; + $errorMessage[] = 'id:为《' . $receivables_id . '》的回款转移失败,错误原因:数据不存在;'; continue; } - + # 转移至当前负责人的直接跳过 if ($param['owner_user_id'] == $receivables_info['owner_user_id']) continue; - + if (!in_array($receivables_info['owner_user_id'], $authIds)) { - $errorMessage[] = $receivables_info['number'].'"转移失败,错误原因:无权限;'; + $errorMessage[] = $receivables_info['number'] . '"转移失败,错误原因:无权限;'; continue; } - - if (in_array($receivables_info['check_status'],['0','1'])) { - $errorMessage[] = $receivables_info['number'].'转移失败,错误原因:待审或审批中,无法转移;'; + + if (in_array($receivables_info['check_status'], ['0', '1'])) { + $errorMessage[] = $receivables_info['number'] . '转移失败,错误原因:待审或审批中,无法转移;'; continue; } - + $res = $receivablesModel->where(['receivables_id' => $receivables_id])->update($data); if (!$res) { - $errorMessage[] = $receivables_info['number'].'"转移失败,错误原因:数据出错;'; + $errorMessage[] = $receivables_info['number'] . '"转移失败,错误原因:数据出错;'; continue; } - updateActionLog($userInfo['id'], 'crm_receivables', $receivables_id, '', '', '将回款转移给:' . $owner_user_info['realname']); + updateActionLog($userInfo['id'], 'crm_receivables', $receivables_id, '', '', '将回款转移给:' . $owner_user_info['realname']); } if (!$errorMessage) { return resultArray(['data' => '转移成功']); @@ -556,7 +603,7 @@ class Receivables extends ApiCommon return resultArray(['error' => $errorMessage]); } } - + /** * 系统信息 * @@ -568,14 +615,14 @@ class Receivables extends ApiCommon public function system() { if (empty($this->param['id'])) return resultArray(['error' => '参数错误!']); - + $receivablesModel = new \app\crm\model\Receivables(); - + $data = $receivablesModel->getSystemInfo($this->param['id']); - + return resultArray(['data' => $data]); } - + /** * table标签栏数量 * @@ -587,10 +634,10 @@ class Receivables extends ApiCommon public function count() { if (empty($this->param['receivables_id'])) return resultArray(['error' => '参数错误!']); - + # 附件 $fileCount = Db::name('crm_receivables_file')->alias('receivables')->join('__ADMIN_FILE__ file', 'file.file_id = receivables.file_id', 'LEFT')->where('receivables_id', $this->param['receivables_id'])->count(); - + return resultArray(['data' => ['fileCount' => $fileCount]]); } } diff --git a/application/crm/controller/Visit.php b/application/crm/controller/Visit.php index 8787cd0..41f9801 100644 --- a/application/crm/controller/Visit.php +++ b/application/crm/controller/Visit.php @@ -68,9 +68,8 @@ class Visit extends ApiCommon if (empty($numberInfo['number'])) return resultArray(['error' => '请填写回访编号!']); $param['number'] = $numberInfo['number']; } - $param['owner_user_id'] = $param['visit_user_id'] ? : $userInfo['id']; + $param['owner_user_id'] = $param['owner_user_id'] ? : $userInfo['id']; $param['create_user_id'] = $userInfo['id']; - $param['visit_user_id'] = $param['visit_user_id'] ? : $userInfo['id']; $param['update_time'] = time(); $res = $Visit->createData($param); if ($res) { @@ -119,8 +118,7 @@ class Visit extends ApiCommon $param = $this->param; $userInfo = $this->userInfo; $param['user_id'] = $userInfo['id']; - $param['owner_user_id'] = $param['visit_user_id'] ? : $userInfo['id']; - $param['visit_user_id'] = $param['visit_user_id'] ? : $userInfo['id']; + $param['owner_user_id'] = $param['owner_user_id'] ? : $userInfo['id']; # 设置回访编号 $numberInfo = []; if (empty($param['number'])) { diff --git a/application/crm/logic/ActivityLogic.php b/application/crm/logic/ActivityLogic.php index 7c6ab64..080b71f 100644 --- a/application/crm/logic/ActivityLogic.php +++ b/application/crm/logic/ActivityLogic.php @@ -359,8 +359,9 @@ class ActivityLogic $fileModel = new \app\admin\model\File(); foreach ($dataArray AS $key => $value) { # 用户信息 todo 有模型文件,时间问题,暂时将查询写在循环中 - $realname = Db::name('admin_user')->where('id', $dataArray[$key]['create_user_id'])->value('realname'); - $dataArray[$key]['create_user_name'] = $realname; + $realname = Db::name('admin_user')->where('id', $dataArray[$key]['create_user_id'])->find(); + $dataArray[$key]['create_user_name'] = $realname['realname']; + $dataArray[$key]['thumb_img'] = $realname['thumb_img'] ? getFullPath($realname['thumb_img']) : '';; # 附件信息 if ($value['type'] = 1) { @@ -785,7 +786,7 @@ class ActivityLogic # 审批 if ($activityType == 9) { $categoryId = Db::name('oa_examine')->where('examine_id', $activityTypeId)->value('category_id'); - $activityTypeName = Db::name('oa_examine_category')->where('category_id', $categoryId); + $activityTypeName = Db::name('oa_examine_category')->where('category_id', $categoryId)->value('title'); } # 日程 if ($activityType == 10) { diff --git a/application/crm/logic/CommonLogic.php b/application/crm/logic/CommonLogic.php index 9ba4037..61773a6 100644 --- a/application/crm/logic/CommonLogic.php +++ b/application/crm/logic/CommonLogic.php @@ -12,11 +12,12 @@ use app\admin\controller\ApiCommon; use app\admin\model\User; use app\crm\model\Customer; use think\Db; +use think\Validate; class CommonLogic { public $error = '操作失败!'; - + /** * 快捷编辑【线索、客户、联系人、商机、合同、回款、回访、产品】 * @@ -37,56 +38,113 @@ class CommonLogic * $param['name'] 字段中文名,用作提示 * $param['value] 字段值 */ - + $actionId = $param['action_id']; - $types = $param['types']; + $types = $param['types']; unset($param['action_id']); unset($param['types']); - + # 模型 $model = db($types); - + # 主键 $primaryKey = ''; - if ($types == 'crm_leads') $primaryKey = 'leads_id'; - if ($types == 'crm_customer') $primaryKey = 'customer_id'; - if ($types == 'crm_contacts') $primaryKey = 'contacts_id'; - if ($types == 'crm_business') $primaryKey = 'business_id'; - if ($types == 'crm_contract') $primaryKey = 'contract_id'; - if ($types == 'crm_receivables') $primaryKey = 'receivables_id'; - if ($types == 'crm_visit') $primaryKey = 'visit_id'; - if ($types == 'crm_product') $primaryKey = 'product_id'; - + // author guogaobo $item模块 + $info=''; + switch ($types) { + case 'crm_leads' : + $primaryKey = 'leads_id'; + $dataModel=new \app\crm\model\Leads(); + $info=$dataModel->getDataById($actionId); + break; + case 'crm_customer' : + $primaryKey = 'customer_id'; + $info=db('crm_customer')->where('customer_id',$actionId)->find(); + break; + case 'crm_contacts' : + $primaryKey = 'contacts_id'; + $dataModel=new \app\crm\model\Contacts(); + $info=$dataModel->getDataById($actionId); + break; + case 'crm_business' : + $primaryKey = 'business_id'; + $dataModel=new \app\crm\model\Business(); + $info=$dataModel->getDataById($actionId); + break; + case 'crm_contract' : + $primaryKey = 'contract_id'; + $info=db('crm_contract')->where('customer_id',$actionId)->find(); + break; + case 'crm_receivables' : + $primaryKey = 'receivables_id'; + $info=db('crm_receivables')->where('customer_id',$actionId)->find(); + break; + case 'crm_visit' : + $primaryKey = 'visit_id'; + $dataModel=new \app\crm\logic\VisitLogic(); + $info=$dataModel->getDataById($actionId); + break; + case 'crm_product' : + $primaryKey = 'product_id'; + $dataModel=new \app\crm\model\Product(); + $info=$dataModel->getDataById($actionId); + break; + } $apiCommon = new ApiCommon(); $userModel = new User(); + + if (in_array($types, ['crm_contract', 'crm_receivables'])) { + $checkStatus = $model->where($primaryKey, $actionId)->value('check_status'); + if (!in_array($checkStatus, [4, 5, 6])) { + $this->error = '只能编辑状态为撤销、草稿或作废的信息!'; + return false; + } + } + # 产品修改验证 + if($types == 'crm_product'){ + foreach ($param['list'] as $val){ + $infoData=db('crm_product')->where(['name'=>$val['name'],'delete_user_id'=>0])->find(); + if(!empty($infoData)){ + $fieldModel = new \app\admin\model\Field(); + $validateArr = $fieldModel->validateField('crm_product'); //获取自定义字段验证规则 + $validate = new Validate($validateArr['rule'], $validateArr['message']); + $result = $validate->check($val); + if (!$result) { + $this->error = $validate->getError(); + return false; + } + } + } + } + # 客户模块快捷编辑权限验证 if ($types == 'crm_customer') { - $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); + $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); $auth_user_ids = $userModel->getUserByPer('crm', 'customer', 'update'); $rwPre = $userModel->rwPre($apiCommon->userInfo['id'], $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); $wherePool = (new Customer())->getWhereByPool(); $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $param['action_id']])->where($wherePool)->find(); - if ($resPool || (!in_array($dataInfo['owner_user_id'],$auth_user_ids) && !$rwPre)) { + if ($resPool || (!in_array($dataInfo['owner_user_id'], $auth_user_ids) && !$rwPre)) { $this->error = '无权操作!'; return false; } } - + # 商机模块快捷编辑权限验证 if ($types == 'crm_business') { - $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); + $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); $auth_user_ids = $userModel->getUserByPer('crm', 'business', 'update'); $rwPre = $userModel->rwPre($apiCommon->userInfo['id'], $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); - if (!in_array($dataInfo['owner_user_id'],$auth_user_ids) && !$rwPre) { + if (!in_array($dataInfo['owner_user_id'], $auth_user_ids) && !$rwPre) { $this->error = '无权操作!'; return false; } } - + # 合同模块快捷编辑权限验证 if ($types == 'crm_contract') { - $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); + $dataInfo = $model->field(['ro_user_id', 'rw_user_id', 'owner_user_id'])->where($primaryKey, $actionId)->find(); $auth_user_ids = $userModel->getUserByPer('crm', 'contract', 'update'); $rwPre = $userModel->rwPre($apiCommon->userInfo['id'], $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); if (!in_array($dataInfo['owner_user_id'], $auth_user_ids) && !$rwPre) { @@ -95,51 +153,100 @@ class CommonLogic } } - foreach ($param AS $key => $value) { - # 查询自定义字段信息 - $fieldInfo = Db::name('admin_field')->field(['max_length', 'is_unique', 'is_null', 'name']) - ->where('types', $types)->where('field', $key)->find(); - - # 字符长度 - if (!empty($fieldInfo['max_length']) && strlen($value) > $fieldInfo['max_length']) { - $this->error = $fieldInfo['name'] . ' 字符长度不能超过 ' . $fieldInfo['max_length'] . ' 个字符!'; - return false; - } + $fieldModel = new \app\admin\model\Field(); + # 日期时间类型 + $datetimeField = $fieldModel->getFieldByFormType($types, 'datetime'); + # 附件类型 + $fileField = $fieldModel->getFieldByFormType($types, 'file'); + # 多选类型 + $checkboxField = $fieldModel->getFieldByFormType($types, 'checkbox'); + # 人员类型 + $userField = $fieldModel->getFieldByFormType($types, 'user'); + # 部门类型 + $structureField = $fieldModel->getFieldByFormType($types, 'structure'); + + foreach ($param['list'] as $key => $value) { + foreach ($value as $k => $v) { + # 查询自定义字段信息 + $fieldInfo = Db::name('admin_field')->field(['max_length', 'is_unique', 'is_null', 'name']) + ->where('types', $types)->where('field', $k)->find(); + + # 字符长度 + if (!empty($fieldInfo['max_length']) && strlen($v) > $fieldInfo['max_length']) { + $this->error = $fieldInfo['name'] . ' 字符长度不能超过 ' . $fieldInfo['max_length'] . ' 个字符!'; + return false; + } - # 必填 - if (!empty($fieldInfo['is_null']) && empty($value)) { - $this->error = $fieldInfo['name'] . ' 是必填信息,不能为空!'; - return false; - } + # 必填 + if (!empty($fieldInfo['is_null']) && empty($v)) { + $this->error = $fieldInfo['name'] . ' 是必填信息,不能为空!'; + return false; + } - # 唯一 - if (!empty($fieldInfo['is_unique']) && $model->where([$primaryKey => ['neq', $actionId]])->where($key, $value)->value($primaryKey)) { - $this->error = $fieldInfo['name'] . ' 内容重复!'; - return false; + # 唯一 + if (!empty($fieldInfo['is_unique']) && $model->where([$primaryKey => ['neq', $actionId]])->where($k, $v)->value($primaryKey)) { + $this->error = $fieldInfo['name'] . ' 内容重复!'; + return false; + } } } - + # 编辑参数 $data = []; + $item=[]; if (!empty($param['list'])) { - foreach ($param['list'] AS $key => $value) { - foreach ($value AS $k => $v) { - # 处理下次联系时间格式 - if ($k == 'next_time') { + foreach ($param['list'] as $key => $value) { + foreach ($value as $k => $v) { + if ($k == 'next_time' || in_array($k, $datetimeField)) { + # 处理下次联系时间格式、datetime类型数据 $data[$k] = !empty($v) ? strtotime($v) : ''; - } else { - $data[$k] = $v; - } - # 处理产品类别 - if ($types == 'crm_product' && $k == 'category_id') { + } elseif ($types == 'crm_product' && $k == 'category_id') { + # 处理产品类别 $categorys = explode(',', $v); - $data[$k] = $categorys[count($categorys) - 1]; + $data[$k] = $categorys[count($categorys) - 1]; + } elseif (in_array($k, $fileField)) { + # 处理附件类型数据 + $fileArray = []; + foreach ($v AS $kk => $vv) { + if (!empty($vv['file_id'])) $fileArray[] = $vv['file_id']; + } + if (!empty($fileArray)) $data[$k] = arrayToString($fileArray); + } elseif (in_array($k, $checkboxField)) { + # 处理多选类型数据 + $data[$k] = arrayToString($v); + } elseif (in_array($k, $userField)) { + # 处理人员类型数据 + $userArray = []; + foreach ($v AS $kk => $vv) { + if (!empty($vv['id'])) $userArray[] = $vv['id']; + } + $data[$k] = !empty($userArray) ? arrayToString($userArray) : ''; + } elseif (in_array($k, $structureField)) { + # 处理部门类型数据 + $structureArray = []; + foreach ($v AS $kk => $vv) { + if (!empty($vv['id'])) $structureArray[] = $vv['id']; + } + $data[$k] = !empty($structureArray) ? arrayToString($structureArray) : ''; + } elseif ($types == 'crm_visit' && $k == 'contract_id') { + # 处理回访提交过来的合同编号 + if (!empty($v[0]['contract_id'])) $data[$k] = $v[0]['contract_id']; + }else { + $data[$k] = $v; } } + $item=$value; } - $data[$primaryKey] = $actionId; + $data[$primaryKey] = $actionId; + $data['update_time'] = time(); } - - return $model->update($data); + $res = $model->update($data); + //详细信息修改新增操作记录 + if ($res) { + //修改记录 + $user_id = $apiCommon->userInfo; + updateActionLog($user_id['id'], $types, $actionId, $info, $item); + } + return $res; } } \ No newline at end of file diff --git a/application/crm/logic/IndexLogic.php b/application/crm/logic/IndexLogic.php index eae0f09..e815490 100644 --- a/application/crm/logic/IndexLogic.php +++ b/application/crm/logic/IndexLogic.php @@ -23,6 +23,10 @@ class IndexLogic extends Common '12' => 'december', ]; + /** + * @param $param + * @return array + */ public function index($param) { $adminModel = new \app\admin\model\Admin(); @@ -69,17 +73,16 @@ class IndexLogic extends Common $contract_auth_user_ids = $userModel->getUserByPer('crm', 'contract', 'index'); $receivables_auth_user_ids = $userModel->getUserByPer('crm', 'receivables', 'index'); $record_auth_user_ids = $userModel->getUserByPer('crm', 'activity', 'index'); - $resCount = queryCache( $this->getCountSql([ 'start_time' => $between_time[0], 'end_time' => $between_time[1], - 'customer_auth_user_ids' => array_intersect($userIds, $customer_auth_user_ids), - 'contacts_auth_user_ids' => array_intersect($userIds, $contacts_auth_user_ids), - 'business_auth_user_ids' => array_intersect($userIds, $business_auth_user_ids), - 'contract_auth_user_ids' => array_intersect($userIds, $contract_auth_user_ids), - 'receivables_auth_user_ids' => array_intersect($userIds, $receivables_auth_user_ids), - 'record_auth_user_ids' => array_intersect($userIds, $record_auth_user_ids), + 'customer_auth_user_ids' => array_intersect($userIds, $customer_auth_user_ids) ? :[-1], + 'contacts_auth_user_ids' => array_intersect($userIds, $contacts_auth_user_ids) ? :[-1], + 'business_auth_user_ids' => array_intersect($userIds, $business_auth_user_ids) ? :[-1], + 'contract_auth_user_ids' => array_intersect($userIds, $contract_auth_user_ids) ? :[-1], + 'receivables_auth_user_ids' => array_intersect($userIds, $receivables_auth_user_ids) ? :[-1], + 'record_auth_user_ids' => array_intersect($userIds, $record_auth_user_ids) ? :[-1], ]) ); diff --git a/application/crm/logic/VisitLogic.php b/application/crm/logic/VisitLogic.php index 6d486cf..8289023 100644 --- a/application/crm/logic/VisitLogic.php +++ b/application/crm/logic/VisitLogic.php @@ -54,12 +54,7 @@ class VisitLogic extends Common //高级筛选 $map = where_arr($map, 'crm', 'visit', 'index'); - $order = ['visit.update_time desc']; - if (isset($map['visit.visit_time'])) { - $map['visit.visit_time'][1][0] = date('Y-m-d', $map['visit.visit_time'][1][0]); - $map['visit.visit_time'][1][1] = date('Y-m-d', $map['visit.visit_time'][1][1]); - } $authMap = []; if (!$partMap) { $a = 'index'; @@ -68,20 +63,20 @@ class VisitLogic extends Common if (!is_array($map['visit.owner_user_id'][1])) { $map['visit.owner_user_id'][1] = [$map['visit.owner_user_id'][1]]; } - if ($map['visit.owner_user_id'][0] == 'neq') { + if (in_array($map['visit.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['visit.owner_user_id'][1]) ?: []; //取差集 } else { $auth_user_ids = array_intersect($map['visit.owner_user_id'][1], $auth_user_ids) ?: []; //取交集 } - unset($map['visit.owner_user_id']); $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ?: ['-1']; $authMap['visit.owner_user_id'] = array('in', $auth_user_ids); + unset($map['visit.owner_user_id']); } else { $authMapData = []; $authMapData['auth_user_ids'] = $auth_user_ids; $authMapData['user_id'] = $user_id; $authMap = function ($query) use ($authMapData) { - $query->where('visit.owner_user_id', array('in', $authMapData['auth_user_ids'])) + $query->where('visit.owner_user_id', ['in', $authMapData['auth_user_ids']]) ->whereOr('visit.ro_user_id', array('like', '%,' . $authMapData['user_id'] . ',%')) ->whereOr('visit.rw_user_id', array('like', '%,' . $authMapData['user_id'] . ',%')); }; @@ -96,6 +91,7 @@ class VisitLogic extends Common //人员类型 $userField = $fieldModel->getFieldByFormType('crm_visit', 'user'); //人员类型 $structureField = $fieldModel->getFieldByFormType('crm_visit', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_visit', 'datetime'); //日期时间类型 //排序 if ($order_type && $order_field) { @@ -118,12 +114,11 @@ class VisitLogic extends Common ->where($partMap) ->where($authMap) ->limit($request['offset'], $request['length']) - ->field(array_merge($indexField, [ - 'contract.num' => 'contract_number', - 'customer.name' => 'customer_name', - 'contacts.name' => 'contacts_name', - - ])) + ->field('visit.*, + contract.num as contract_number, + customer.name as customer_name, + contacts.name as contacts_name' + ) ->orderRaw($order) ->group('visit.visit_id') ->select(); @@ -140,10 +135,15 @@ class VisitLogic extends Common $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; foreach ($userField as $key => $val) { - $list[$k][$val . '_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val . '_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); + } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; } $list[$k]['contract_id_info']['contract_id'] = $v['contract_id']; $list[$k]['contract_id_info']['name'] = $v['contract_name']; @@ -161,7 +161,7 @@ class VisitLogic extends Common $is_update = 0; $is_delete = 0; if (in_array($v['owner_user_id'], $readAuthIds) || $roPre || $rwPre) $is_read = 1; - if (in_array($v['owner_user_id'], $updateAuthIds) || $rwPre) $is_update = 1; + if (in_array($v['owner_user_id'], $updateAuthIds) || $rwPre) $is_update = 1; if (in_array($v['owner_user_id'], $deleteAuthIds)) $is_delete = 1; $permission['is_read'] = $is_read; $permission['is_update'] = $is_update; @@ -198,6 +198,11 @@ class VisitLogic extends Common $dataInfo['contacts_id_info'] = db('crm_contacts')->where(['contacts_id' => $dataInfo['contacts_id']])->field('contacts_id,name')->find(); $dataInfo['contacts_name'] = !empty($dataInfo['contacts_id_info']['name']) ? $dataInfo['contacts_id_info']['name'] : ''; # 处理日期格式 + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_visit', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; return $dataInfo; @@ -330,7 +335,7 @@ class VisitLogic extends Common return resultArray(['error' => $this->getError()]); } //删除关联附件 - $fileModel->delRFileByModule('crm_business', $delIds); + $fileModel->delRFileByModule('crm_visit', $delIds); //删除关联操作记录 $actionRecordModel->delDataById(['types' => 'crm_visit', 'visit_id' => $delIds]); actionLog($delIds, '', '', ''); diff --git a/application/crm/model/Business.php b/application/crm/model/Business.php index 2d75552..abf7845 100644 --- a/application/crm/model/Business.php +++ b/application/crm/model/Business.php @@ -14,14 +14,14 @@ use app\crm\model\Business as CrmBusinessModel; class Business extends Common { - /** + /** * 为了数据库的整洁,同时又不影响Model和Controller的名称 * 我们约定每个模块的数据表都加上相同的前缀,比如CRM模块用crm作为数据表前缀 */ - protected $name = 'crm_business'; + protected $name = 'crm_business'; protected $createTime = 'create_time'; protected $updateTime = 'update_time'; - protected $autoWriteTimestamp = true; + protected $autoWriteTimestamp = true; /** * [getDataList 商机list] @@ -32,190 +32,196 @@ class Business extends Common * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ - public function getDataList($request) - { - $userModel = new \app\admin\model\User(); - $structureModel = new \app\admin\model\Structure(); - $fieldModel = new \app\admin\model\Field(); - $search = $request['search']; - $user_id = $request['user_id']; - $scene_id = (int)$request['scene_id']; - $contacts_id = $request['contacts_id']; - $order_field = $request['order_field']; - $order_type = $request['order_type']; - $is_excel = $request['is_excel']; //导出 + public function getDataList($request) + { + $userModel = new \app\admin\model\User(); + $structureModel = new \app\admin\model\Structure(); + $fieldModel = new \app\admin\model\Field(); + $search = $request['search']; + $user_id = $request['user_id']; + $scene_id = (int)$request['scene_id']; + $contacts_id = $request['contacts_id']; + $order_field = $request['order_field']; + $order_type = $request['order_type']; + $is_excel = $request['is_excel']; //导出 $getCount = $request['getCount']; - unset($request['scene_id']); - unset($request['search']); - unset($request['user_id']); - unset($request['contacts_id']); - unset($request['order_field']); - unset($request['order_type']); - unset($request['is_excel']); + unset($request['scene_id']); + unset($request['search']); + unset($request['user_id']); + unset($request['contacts_id']); + unset($request['order_field']); + unset($request['order_type']); + unset($request['is_excel']); unset($request['getCount']); - $request = $this->fmtRequest( $request ); - $requestMap = $request['map'] ? : []; - $sceneModel = new \app\admin\model\Scene(); + $request = $this->fmtRequest($request); + $requestMap = $request['map'] ?: []; + $sceneModel = new \app\admin\model\Scene(); # getCount是代办事项传来的参数,代办事项不需要使用场景 $sceneMap = []; if (empty($getCount)) { if ($scene_id) { //自定义场景 - $sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'business') ? : []; + $sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'business') ?: []; } else { //默认场景 - $sceneMap = $sceneModel->getDefaultData('crm_business', $user_id) ? : []; + $sceneMap = $sceneModel->getDefaultData('crm_business', $user_id) ?: []; + } + } + if ($search) { + //普通筛选 + $sceneMap['name'] = ['condition' => 'contains', 'value' => $search, 'form_type' => 'text', 'name' => '商机名称']; + } + if (isset($requestMap['type_id'])) { + $requestMap['type_id']['value'] = $requestMap['type_id']['type_id']; + if ($requestMap['type_id']['status_id']) $requestMap['status_id']['value'] = $requestMap['type_id']['status_id']; + } + if ($sceneMap['type_id']) { + $requestMap['type_id']['value'] = $sceneMap['type_id']['type_id']; + if ($sceneMap['type_id']['status_id']) $requestMap['status_id']['value'] = $sceneMap['type_id']['status_id']; + unset($sceneMap['type_id']); + } + $partMap = []; + //优先级:普通筛选>高级筛选>场景 + if ($sceneMap['ro_user_id'] && $sceneMap['rw_user_id']) { + //相关团队查询 + $map = $requestMap; + $partMap = function ($query) use ($sceneMap) { + $query->where('business.ro_user_id', array('like', '%,' . $sceneMap['ro_user_id'] . ',%')) + ->whereOr('business.rw_user_id', array('like', '%,' . $sceneMap['rw_user_id'] . ',%')); + }; + } else { + $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap; + } + //高级筛选 + $map = where_arr($map, 'crm', 'business', 'index'); + $authMap = []; + if (!$partMap) { + $a = 'index'; + if ($is_excel) $a = 'excelExport'; + $auth_user_ids = $userModel->getUserByPer('crm', 'business', $a); + if (isset($map['business.owner_user_id']) && $map['business.owner_user_id'][0] != 'like') { + if (!is_array($map['business.owner_user_id'][1])) { + $map['business.owner_user_id'][1] = [$map['business.owner_user_id'][1]]; + } + if (in_array($map['business.owner_user_id'][0], ['neq', 'notin'])) { + $auth_user_ids = array_diff($auth_user_ids, $map['business.owner_user_id'][1]) ?: []; //取差集 + } else { + $auth_user_ids = array_intersect($map['business.owner_user_id'][1], $auth_user_ids) ?: []; //取交集 + } + unset($map['business.owner_user_id']); + $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ?: ['-1']; + $authMap['business.owner_user_id'] = array('in', $auth_user_ids); + } else { + $authMapData = []; + $authMapData['auth_user_ids'] = $auth_user_ids; + $authMapData['user_id'] = $user_id; + $authMap = function ($query) use ($authMapData) { + $query->where('business.owner_user_id', array('in', $authMapData['auth_user_ids'])) + ->whereOr('business.ro_user_id', array('like', '%,' . $authMapData['user_id'] . ',%')) + ->whereOr('business.rw_user_id', array('like', '%,' . $authMapData['user_id'] . ',%')); + }; + } + } + //联系人商机 + if ($contacts_id) { + $business_id = Db::name('crm_contacts_business')->where(['contacts_id' => $contacts_id])->column('business_id'); + if ($business_id) { + $map['business.business_id'] = array('in', $business_id); + } else { + $map['business.business_id'] = array('eq', -1); } } - if ($search) { - //普通筛选 - $sceneMap['name'] = ['condition' => 'contains','value' => $search,'form_type' => 'text','name' => '商机名称']; - } - if (isset($requestMap['type_id'])) { - $requestMap['type_id']['value'] = $requestMap['type_id']['type_id']; - if ($requestMap['type_id']['status_id']) $requestMap['status_id']['value'] = $requestMap['type_id']['status_id']; - } - if ($sceneMap['type_id']) { - $requestMap['type_id']['value'] = $sceneMap['type_id']['type_id']; - if ($sceneMap['type_id']['status_id']) $requestMap['status_id']['value'] = $sceneMap['type_id']['status_id']; - unset($sceneMap['type_id']); - } - $partMap = []; - //优先级:普通筛选>高级筛选>场景 - if ($sceneMap['ro_user_id'] && $sceneMap['rw_user_id']) { - //相关团队查询 - $map = $requestMap; - $partMap = function($query) use ($sceneMap){ - $query->where('business.ro_user_id',array('like','%,'.$sceneMap['ro_user_id'].',%')) - ->whereOr('business.rw_user_id',array('like','%,'.$sceneMap['rw_user_id'].',%')); - }; - } else { - $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap; - } - //高级筛选 - $map = where_arr($map, 'crm', 'business', 'index'); - $authMap = []; - if (!$partMap) { - $a = 'index'; - if ($is_excel) $a = 'excelExport'; - $auth_user_ids = $userModel->getUserByPer('crm', 'business', $a); - if (isset($map['business.owner_user_id']) && $map['business.owner_user_id'][0] != 'like') { - if (!is_array($map['business.owner_user_id'][1])) { - $map['business.owner_user_id'][1] = [$map['business.owner_user_id'][1]]; - } - if ($map['business.owner_user_id'][0] == 'neq') { - $auth_user_ids = array_diff($auth_user_ids, $map['business.owner_user_id'][1]) ? : []; //取差集 - } else { - $auth_user_ids = array_intersect($map['business.owner_user_id'][1], $auth_user_ids) ? : []; //取交集 - } - unset($map['business.owner_user_id']); - $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ? : ['-1']; - $authMap['business.owner_user_id'] = array('in',$auth_user_ids); - } else { - $authMapData = []; - $authMapData['auth_user_ids'] = $auth_user_ids; - $authMapData['user_id'] = $user_id; - $authMap = function($query) use ($authMapData){ - $query->where('business.owner_user_id',array('in',$authMapData['auth_user_ids'])) - ->whereOr('business.ro_user_id',array('like','%,'.$authMapData['user_id'].',%')) - ->whereOr('business.rw_user_id',array('like','%,'.$authMapData['user_id'].',%')); - }; - } - } - //联系人商机 - if ($contacts_id) { - $business_id = Db::name('crm_contacts_business')->where(['contacts_id' => $contacts_id])->column('business_id'); - if ($business_id) { - $map['business.business_id'] = array('in',$business_id); - }else{ - $map['business.business_id'] = array('eq',-1); - } - } - //列表展示字段 - $indexField = $fieldModel->getIndexField('crm_business', $user_id, 1) ? : array('name'); - if (!empty($indexField)) { - foreach ($indexField AS $key => $value) { - if ($value == 'business.customer_name') unset($indexField[(int)$key]); + //列表展示字段 + $indexField = $fieldModel->getIndexField('crm_business', $user_id, 1) ?: array('name'); + if (!empty($indexField)) { + foreach ($indexField as $key => $value) { + if ($value == 'business.customer_name') unset($indexField[(int)$key]); } } - $userField = $fieldModel->getFieldByFormType('crm_business', 'user'); //人员类型 - $structureField = $fieldModel->getFieldByFormType('crm_business', 'structure'); //部门类型 - //排序 - if ($order_type && $order_field) { - $order = $fieldModel->getOrderByFormtype('crm_business','business',$order_field,$order_type); - } else { - $order = 'business.update_time desc'; - } - - $readAuthIds = $userModel->getUserByPer('crm', 'business', 'read'); + $userField = $fieldModel->getFieldByFormType('crm_business', 'user'); //人员类型 + $structureField = $fieldModel->getFieldByFormType('crm_business', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_business', 'datetime'); //日期时间类型 + //排序 + if ($order_type && $order_field) { + $order = $fieldModel->getOrderByFormtype('crm_business', 'business', $order_field, $order_type); + } else { + $order = 'business.update_time desc'; + } + + $readAuthIds = $userModel->getUserByPer('crm', 'business', 'read'); $updateAuthIds = $userModel->getUserByPer('crm', 'business', 'update'); $deleteAuthIds = $userModel->getUserByPer('crm', 'business', 'delete'); $dataCount = db('crm_business') ->alias('business') - ->join('__CRM_CUSTOMER__ customer','business.customer_id = customer.customer_id','LEFT') + ->join('__CRM_CUSTOMER__ customer', 'business.customer_id = customer.customer_id', 'LEFT') ->where($map)->where($partMap)->where($authMap)->count('business_id'); if (!empty($getCount) && $getCount == 1) { $data['dataCount'] = !empty($dataCount) ? $dataCount : 0; - # 商机总金额 - $sumMoney = Db::name('crm_business')->alias('business') - ->whereIn('is_end', [0, 1])->where($map)->where($partMap)->where($authMap)->sum('money'); - $data['extraData']['money'] = ['businessSumMoney' => !empty($sumMoney) ? sprintf("%.2f", $sumMoney) : 0.00]; + # 商机总金额 + $sumMoney = Db::name('crm_business')->alias('business') + ->whereIn('is_end', [0, 1])->where($map)->where($partMap)->where($authMap)->sum('money'); + $data['extraData']['money'] = ['businessSumMoney' => !empty($sumMoney) ? sprintf("%.2f", $sumMoney) : 0.00]; return $data; } - $list = db('crm_business') - ->alias('business') - ->join('__CRM_CUSTOMER__ customer','business.customer_id = customer.customer_id','LEFT') - ->where($map) - ->where($partMap) - ->where($authMap) - ->limit($request['offset'], $request['length']) - ->field(implode(',',$indexField).',business.is_end,customer.name as customer_name') - ->orderRaw($order) - ->select(); - $endStatus = ['1' => '赢单','2' => '输单','3' => '无效']; - foreach ($list as $k=>$v) { + $list = db('crm_business') + ->alias('business') + ->join('__CRM_CUSTOMER__ customer', 'business.customer_id = customer.customer_id', 'LEFT') + ->where($map) + ->where($partMap) + ->where($authMap) + ->limit($request['offset'], $request['length']) + ->field('business.*,customer.name as customer_name') + ->orderRaw($order) + ->select(); + $endStatus = ['1' => '赢单', '2' => '输单', '3' => '无效']; + foreach ($list as $k => $v) { $list[$k]['customer_id_info']['customer_id'] = $v['customer_id']; $list[$k]['customer_id_info']['name'] = $v['customer_name']; - $list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : []; - $list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : []; - $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; + $list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : []; + $list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : []; + $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; - foreach ($userField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; - } - foreach ($structureField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; - } - $statusInfo = []; - $status_count = 0; - if (!$v['is_end']) { - $statusInfo = db('crm_business_status')->where('status_id',$v['status_id'])->find(); - if ($statusInfo['order_id'] < 99) { - $status_count = db('crm_business_status')->where('type_id',['eq',$v['type_id']])->count(); - } - //进度 - $list[$k]['status_progress'] = [$statusInfo['order_id'], $status_count+1]; - } else { - $statusInfo['name'] = $endStatus[$v['is_end']]; - } - $list[$k]['status_id_info'] = $statusInfo['name'];//销售阶段 - $list[$k]['type_id_info'] = db('crm_business_type')->where('type_id',$v['type_id'])->value('name');//商机状态组 - - //权限 - $roPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'read'); - $rwPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'update'); - $permission = []; - $is_read = 0; - $is_update = 0; - $is_delete = 0; - if (in_array($v['owner_user_id'],$readAuthIds) || $roPre || $rwPre) $is_read = 1; - if (in_array($v['owner_user_id'],$updateAuthIds) || $rwPre) $is_update = 1; - if (in_array($v['owner_user_id'],$deleteAuthIds)) $is_delete = 1; - $permission['is_read'] = $is_read; - $permission['is_update'] = $is_update; - $permission['is_delete'] = $is_delete; - $list[$k]['permission'] = $permission; + foreach ($userField as $key => $val) { + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); + } + foreach ($structureField as $key => $val) { + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); + } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } + $statusInfo = []; + $status_count = 0; + if (!$v['is_end']) { + $statusInfo = db('crm_business_status')->where('status_id', $v['status_id'])->find(); + if ($statusInfo['order_id'] < 99) { + $status_count = db('crm_business_status')->where('type_id', ['eq', $v['type_id']])->count(); + } + //进度 + $list[$k]['status_progress'] = [$statusInfo['order_id'], $status_count + 1]; + } else { + $statusInfo['name'] = $endStatus[$v['is_end']]; + } + $list[$k]['status_id_info'] = $statusInfo['name'];//销售阶段 + $list[$k]['type_id_info'] = db('crm_business_type')->where('type_id', $v['type_id'])->value('name');//商机状态组 + + //权限 + $roPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'read'); + $rwPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'update'); + $permission = []; + $is_read = 0; + $is_update = 0; + $is_delete = 0; + if (in_array($v['owner_user_id'], $readAuthIds) || $roPre || $rwPre) $is_read = 1; + if (in_array($v['owner_user_id'], $updateAuthIds) || $rwPre) $is_update = 1; + if (in_array($v['owner_user_id'], $deleteAuthIds)) $is_delete = 1; + $permission['is_read'] = $is_read; + $permission['is_update'] = $is_update; + $permission['is_delete'] = $is_delete; + $list[$k]['permission'] = $permission; # 下次联系时间 $list[$k]['next_time'] = !empty($v['next_time']) ? date('Y-m-d H:i:s', $v['next_time']) : null; # 关注 @@ -225,159 +231,159 @@ class Business extends Common # 日期 $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null; $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null; - $list[$k]['last_time'] = !empty($v['last_time']) ? date('Y-m-d H:i:s', $v['last_time']) : null; + $list[$k]['last_time'] = !empty($v['last_time']) ? date('Y-m-d H:i:s', $v['last_time']) : null; } $data = []; - $data['list'] = $list ? : []; - $data['dataCount'] = $dataCount ? : 0; + $data['list'] = $list ?: []; + $data['dataCount'] = $dataCount ?: 0; # 商机总金额 $sumMoney = Db::name('crm_business')->alias('business') - ->join('__CRM_CUSTOMER__ customer','business.customer_id = customer.customer_id','LEFT') + ->join('__CRM_CUSTOMER__ customer', 'business.customer_id = customer.customer_id', 'LEFT') ->whereIn('is_end', [0, 1])->where($map)->where($partMap)->where($authMap)->sum('money'); $data['extraData']['money'] = ['businessSumMoney' => !empty($sumMoney) ? sprintf("%.2f", $sumMoney) : 0.00]; return $data; } - /** - * 创建商机主表信息 - * @author Michael_xu - * @param - * @return - */ - public function createData($param) - { - $fieldModel = new \app\admin\model\Field(); - $productModel = new \app\crm\model\Product(); - // 自动验证 - $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 - $validate = new Validate($validateArr['rule'], $validateArr['message']); - $result = $validate->check($param); - if (!$result) { - $this->error = $validate->getError(); - return false; - } - if (!$param['customer_id']) { - $this->error = '请选择相关客户'; - return false; - } + /** + * 创建商机主表信息 + * @param + * @return + * @author Michael_xu + */ + public function createData($param) + { + $fieldModel = new \app\admin\model\Field(); + $productModel = new \app\crm\model\Product(); + // 自动验证 + $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 + $validate = new Validate($validateArr['rule'], $validateArr['message']); + $result = $validate->check($param); + if (!$result) { + $this->error = $validate->getError(); + return false; + } + if (!$param['customer_id']) { + $this->error = '请选择相关客户'; + return false; + } # 处理下次联系时间 if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 - $arrFieldAtt = $fieldModel->getArrayField('crm_business'); - foreach ($arrFieldAtt as $k=>$v) { - $param[$v] = arrayToString($param[$v]); - } - - $param['money'] = $param['money'] ? : '0.00'; - $param['discount_rate'] = $param['discount_rate'] ? : '0.00'; - if ($this->data($param)->allowField(true)->save()) { - $business_id = $this->business_id; - if ($param['product']) { - //产品数据处理 - $resProduct = $productModel->createObject('crm_business', $param, $business_id); - if ($resProduct == false) { - $this->error = '产品添加失败'; - return false; - } - } - //添加商机日志 - $data_log['business_id'] = $business_id; - $data_log['is_end'] = 0; - $data_log['status_id'] = $param['status_id']; - $data_log['create_time'] = time(); - $data_log['owner_user_id'] = $param['owner_user_id']; - $data_log['remark'] = '新建商机'; - Db::name('CrmBusinessLog')->insert($data_log); - - $data = []; - $data['business_id'] = $business_id; + //处理部门、员工、附件、多选类型字段 + $arrFieldAtt = $fieldModel->getArrayField('crm_business'); + foreach ($arrFieldAtt as $k => $v) { + $param[$v] = arrayToString($param[$v]); + } + + $param['money'] = $param['money'] ?: '0.00'; + $param['discount_rate'] = $param['discount_rate'] ?: '0.00'; + if ($this->data($param)->allowField(true)->save()) { + $business_id = $this->business_id; + if ($param['product']) { + //产品数据处理 + $resProduct = $productModel->createObject('crm_business', $param, $business_id); + if ($resProduct == false) { + $this->error = '产品添加失败'; + return false; + } + } + //添加商机日志 + $data_log['business_id'] = $business_id; + $data_log['is_end'] = 0; + $data_log['status_id'] = $param['status_id']; + $data_log['create_time'] = time(); + $data_log['owner_user_id'] = $param['owner_user_id']; + $data_log['remark'] = '新建商机'; + Db::name('CrmBusinessLog')->insert($data_log); + + $data = []; + $data['business_id'] = $business_id; # 添加活动记录 Db::name('crm_activity')->insert([ - 'type' => 2, - 'activity_type' => 5, + 'type' => 2, + 'activity_type' => 5, 'activity_type_id' => $data['business_id'], - 'content' => $param['name'], - 'create_user_id' => $param['create_user_id'], - 'update_time' => time(), - 'create_time' => time(), - 'customer_ids' => $param['customer_id'] + 'content' => $param['name'], + 'create_user_id' => $param['create_user_id'], + 'update_time' => time(), + 'create_time' => time(), + 'customer_ids' => $param['customer_id'] ]); - return $data; - } else { - $this->error = '添加失败'; - return false; - } - } - - /** - * 编辑商机主表信息 - * @author Michael_xu - * @param - * @return - */ - public function updateDataById($param, $business_id = '') - { - $productModel = new \app\crm\model\Product(); - $dataInfo = $this->getDataById($business_id); - if (!$dataInfo) { - $this->error = '数据不存在或已删除'; - return false; - } - $param['business_id'] = $business_id; - //过滤不能修改的字段 - $unUpdateField = ['create_user_id','is_deleted','delete_time']; - foreach ($unUpdateField as $v) { - unset($param[$v]); - } - - $fieldModel = new \app\admin\model\Field(); - // 自动验证 - $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 - $validate = new Validate($validateArr['rule'], $validateArr['message']); - - $result = $validate->check($param); - if (!$result) { - $this->error = $validate->getError(); - return false; - } + return $data; + } else { + $this->error = '添加失败'; + return false; + } + } + + /** + * 编辑商机主表信息 + * @param + * @return + * @author Michael_xu + */ + public function updateDataById($param, $business_id = '') + { + $productModel = new \app\crm\model\Product(); + $dataInfo = $this->getDataById($business_id); + if (!$dataInfo) { + $this->error = '数据不存在或已删除'; + return false; + } + $param['business_id'] = $business_id; + //过滤不能修改的字段 + $unUpdateField = ['create_user_id', 'is_deleted', 'delete_time']; + foreach ($unUpdateField as $v) { + unset($param[$v]); + } + + $fieldModel = new \app\admin\model\Field(); + // 自动验证 + $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 + $validate = new Validate($validateArr['rule'], $validateArr['message']); + + $result = $validate->check($param); + if (!$result) { + $this->error = $validate->getError(); + return false; + } # 处理下次联系时间 if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 - $arrFieldAtt = $fieldModel->getArrayField('crm_business'); - foreach ($arrFieldAtt as $k=>$v) { - $param[$v] = arrayToString($param[$v]); - } - - $param['money'] = $param['money'] ? : '0.00'; - $param['discount_rate'] = $param['discount_rate'] ? : '0.00'; - //商机状态改变 - $statusInfo = db('crm_business_status')->where(['status_id' => $param['status_id']])->find(); - if ($statusInfo['type_id']) { - $param['is_end'] = 0; - } else { - $param['is_end'] = $param['status_id']; - } - if ($this->update($param, ['business_id' => $business_id], true)) { - //产品数据处理 - $resProduct = $productModel->createObject('crm_business', $param, $business_id); - //修改记录 - updateActionLog($param['user_id'], 'crm_business', $business_id, $dataInfo, $param); - $data = []; - $data['business_id'] = $business_id; - return $data; - } else { - $this->rollback(); - $this->error = '编辑失败'; - return false; - } - } + //处理部门、员工、附件、多选类型字段 + $arrFieldAtt = $fieldModel->getArrayField('crm_business'); + foreach ($arrFieldAtt as $k => $v) { + $param[$v] = arrayToString($param[$v]); + } + + $param['money'] = $param['money'] ?: '0.00'; + $param['discount_rate'] = $param['discount_rate'] ?: '0.00'; + //商机状态改变 + $statusInfo = db('crm_business_status')->where(['status_id' => $param['status_id']])->find(); + if ($statusInfo['type_id']) { + $param['is_end'] = 0; + } else { + $param['is_end'] = $param['status_id']; + } + if ($this->update($param, ['business_id' => $business_id], true)) { + //产品数据处理 + $resProduct = $productModel->createObject('crm_business', $param, $business_id); + //修改记录 + updateActionLog($param['user_id'], 'crm_business', $business_id, $dataInfo, $param); + $data = []; + $data['business_id'] = $business_id; + return $data; + } else { + $this->rollback(); + $this->error = '编辑失败'; + return false; + } + } /** * 商机数据 @@ -389,84 +395,89 @@ class Business extends Common * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ - public function getDataById($id = '', $userId = 0) - { - $dataInfo = db('crm_business')->where('business_id', $id)->find(); - if (!$dataInfo) { - $this->error = '暂无此数据'; - return false; - } - $userModel = new \app\admin\model\User(); - $dataInfo['create_user_id_info'] = isset($dataInfo['create_user_id']) ? $userModel->getUserById($dataInfo['create_user_id']) : []; - $dataInfo['owner_user_id_info'] = isset($dataInfo['owner_user_id']) ? $userModel->getUserById($dataInfo['owner_user_id']) : []; - $dataInfo['create_user_name'] = !empty($dataInfo['create_user_id_info']['realname']) ? $dataInfo['create_user_id_info']['realname'] : ''; - $dataInfo['owner_user_name'] = !empty($dataInfo['owner_user_id_info']['realname']) ? $dataInfo['owner_user_id_info']['realname'] : ''; - $dataInfo['type_id_info'] = db('crm_business_type')->where(['type_id' => $dataInfo['type_id']])->value('name'); - $dataInfo['status_id_info'] = db('crm_business_status')->where(['status_id' => $dataInfo['status_id']])->value('name'); - $dataInfo['customer_id_info'] = db('crm_customer')->where(['customer_id' => $dataInfo['customer_id']])->field('customer_id,name')->find(); + public function getDataById($id = '', $userId = 0) + { + $dataInfo = db('crm_business')->where('business_id', $id)->find(); + if (!$dataInfo) { + $this->error = '暂无此数据'; + return false; + } + $userModel = new \app\admin\model\User(); + $dataInfo['create_user_id_info'] = isset($dataInfo['create_user_id']) ? $userModel->getUserById($dataInfo['create_user_id']) : []; + $dataInfo['owner_user_id_info'] = isset($dataInfo['owner_user_id']) ? $userModel->getUserById($dataInfo['owner_user_id']) : []; + $dataInfo['create_user_name'] = !empty($dataInfo['create_user_id_info']['realname']) ? $dataInfo['create_user_id_info']['realname'] : ''; + $dataInfo['owner_user_name'] = !empty($dataInfo['owner_user_id_info']['realname']) ? $dataInfo['owner_user_id_info']['realname'] : ''; + $dataInfo['type_id_info'] = db('crm_business_type')->where(['type_id' => $dataInfo['type_id']])->value('name'); + $dataInfo['status_id_info'] = db('crm_business_status')->where(['status_id' => $dataInfo['status_id']])->value('name'); + $dataInfo['customer_id_info'] = db('crm_customer')->where(['customer_id' => $dataInfo['customer_id']])->field('customer_id,name')->find(); $dataInfo['customer_name'] = !empty($dataInfo['customer_id_info']['name']) ? $dataInfo['customer_id_info']['name'] : ''; - # 关注 + # 关注 $starId = empty($userId) ? 0 : Db::name('crm_star')->where(['user_id' => $userId, 'target_id' => $id, 'type' => 'crm_business'])->value('star_id'); $dataInfo['star'] = !empty($starId) ? 1 : 0; # 首要联系人 $primaryId = Db::name('crm_contacts')->where(['contacts_id' => $dataInfo['contacts_id']])->value('contacts_id'); $dataInfo['contacts_id'] = !empty($primaryId) && $this->getContactsAuth($primaryId) ? $primaryId : 0; # 处理日期格式 - $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_business', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } + $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; - $dataInfo['last_time'] = !empty($dataInfo['last_time']) ? date('Y-m-d H:i:s', $dataInfo['last_time']) : null; + $dataInfo['last_time'] = !empty($dataInfo['last_time']) ? date('Y-m-d H:i:s', $dataInfo['last_time']) : null; return $dataInfo; - } - - //根据IDs获取数组 - public function getDataByStr($idstr) - { - $idArr = stringToArray($idstr); - if (!$idArr) { - return []; - } - $list = Db::name('CrmBusiness')->where(['business_id' => ['in',$idArr]])->select(); - return $list; - } - - /** + } + + //根据IDs获取数组 + public function getDataByStr($idstr) + { + $idArr = stringToArray($idstr); + if (!$idArr) { + return []; + } + $list = Db::name('CrmBusiness')->where(['business_id' => ['in', $idArr]])->select(); + return $list; + } + + /** * [商机漏斗] - * @author Michael_xu * @param - * @return - */ - public function getFunnel($request) + * @return + * @author Michael_xu + */ + public function getFunnel($request) { - $merge = $request['merge'] ? : 0; - $perUserIds = $request['perUserIds'] ? : []; - $adminModel = new \app\admin\model\Admin(); + $merge = $request['merge'] ?: 0; + $perUserIds = $request['perUserIds'] ?: []; + $adminModel = new \app\admin\model\Admin(); $whereArr = $adminModel->getWhere($request, $merge, $perUserIds); //统计查询 $userIds = $whereArr['userIds']; $between_time = $whereArr['between_time']; - $where['owner_user_id'] = array('in',$userIds); - $where['create_time'] = array('between',$between_time); - //商机状态组 - $default_type_id = db('crm_business_type')->order('type_id asc')->value('type_id'); - $type_id = $request['type_id'] ? $request['type_id'] : $default_type_id; - $statusList = db('crm_business_status')->where(['type_id' => $type_id])->select(); - $map = []; - $map['create_time'] = $where['create_time']; - $map['owner_user_id'] = ['in',$userIds]; - - $sql_a = CrmBusinessModel::field([ - 'SUM(CASE WHEN status_id = 1 THEN money ELSE 0 END) AS sum_ying', - 'SUM(CASE WHEN status_id = 2 THEN money ELSE 0 END) AS sum_shu' - ]) - ->where($map) - ->fetchSql() - ->select(); - $res_a = queryCache($sql_a, 200); - $sql = CrmBusinessModel::field([ - "status_id", - 'COUNT(*)' => 'count', - 'SUM(`money`)' => 'sum' - ]) + $where['owner_user_id'] = array('in', $userIds); + $where['create_time'] = array('between', $between_time); + //商机状态组 + $default_type_id = db('crm_business_type')->order('type_id asc')->value('type_id'); + $type_id = $request['type_id'] ? $request['type_id'] : $default_type_id; + $statusList = db('crm_business_status')->where(['type_id' => $type_id])->select(); + $map = []; + $map['create_time'] = $where['create_time']; + $map['owner_user_id'] = ['in', $userIds]; + + $sql_a = CrmBusinessModel::field([ + 'SUM(CASE WHEN status_id = 1 THEN money ELSE 0 END) AS sum_ying', + 'SUM(CASE WHEN status_id = 2 THEN money ELSE 0 END) AS sum_shu' + ]) + ->where($map) + ->fetchSql() + ->select(); + $res_a = queryCache($sql_a, 200); + $sql = CrmBusinessModel::field([ + "status_id", + 'COUNT(*)' => 'count', + 'SUM(`money`)' => 'sum' + ]) ->where($where) ->whereNotIn('is_end', '1,2,3') ->group('status_id') @@ -476,76 +487,88 @@ class Business extends Common $res = array_column($res, null, 'status_id'); $sum_money = 0; - $count = 0; # 商机数总和 - $moneyCount = 0; # 金额总和 - foreach ($statusList as $k=>$v) { - $v['count'] = $res[$v['status_id']]['count'] ? : 0; - $v['money'] = $res[$v['status_id']]['sum'] ? : 0; - $v['status_name'] = $v['name']; + $count = 0; # 商机数总和 + $moneyCount = 0; # 金额总和 + foreach ($statusList as $k => $v) { + $v['count'] = $res[$v['status_id']]['count'] ?: 0; + $v['money'] = $res[$v['status_id']]['sum'] ?: 0; + $v['status_name'] = $v['name']; - $statusList[$k] = $v; + $statusList[$k] = $v; $sum_money += $v['money']; $moneyCount += $v['money']; - $count += $v['count']; - } - $data['list'] = $statusList; + $count += $v['count']; + } + $data['list'] = $statusList; $data['list'] = $statusList; - $data['sum_ying'] = $res_a[0]['sum_ying'] ? : 0; - $data['sum_shu'] = $res_a[0]['sum_shu'] ? : 0; - $data['sum_money'] = $sum_money ? : 0; - $data['total'] = ['name' => '合计', 'money_count' => $moneyCount, 'count' => $count]; + $data['sum_ying'] = $res_a[0]['sum_ying'] ?: 0; + $data['sum_shu'] = $res_a[0]['sum_shu'] ?: 0; + $data['sum_money'] = $sum_money ?: 0; + $data['total'] = ['name' => '合计', 'money_count' => $moneyCount, 'count' => $count]; - return $data ? : []; - } + return $data ?: []; + } - /** + /** * [商机转移] - * @author Michael_xu * @param ids 商机ID数组 * @param owner_user_id 变更负责人 * @param is_remove 1移出,2转为团队成员 - * @return - */ + * @return + * @author Michael_xu + */ public function transferDataById($ids, $owner_user_id, $type = 1, $is_remove) { - $settingModel = new \app\crm\model\Setting(); - $errorMessage = []; - foreach ($ids as $id) { - $businessInfo = db('crm_business')->where(['business_id' => $id])->find(); - //团队成员 - $teamData = []; + $settingModel = new \app\crm\model\Setting(); + $errorMessage = []; + foreach ($ids as $id) { + $businessInfo = db('crm_business')->where(['business_id' => $id])->find(); + //团队成员 + $teamData = []; $teamData['type'] = $type; //权限 1只读2读写 $teamData['user_id'] = [$businessInfo['owner_user_id']]; //协作人 $teamData['types'] = 'crm_business'; //类型 $teamData['types_id'] = $id; //类型ID $teamData['is_del'] = ($is_remove == 1) ? 1 : ''; - $res = $settingModel->createTeamData($teamData); - - $data = []; - $data['owner_user_id'] = $owner_user_id; - $data['update_time'] = time(); - if (!db('crm_business')->where(['business_id' => $id])->update($data)) { - $errorMessage[] = '商机:'.$businessInfo['name'].'"转移失败,错误原因:数据出错;'; - continue; - } - } - if ($errorMessage) { - return $errorMessage; - } else { - return true; - } - } + $res = $settingModel->createTeamData($teamData); + + $data = []; + $data['owner_user_id'] = $owner_user_id; + $data['update_time'] = time(); + if (!db('crm_business')->where(['business_id' => $id])->update($data)) { + $errorMessage[] = '商机:' . $businessInfo['name'] . '"转移失败,错误原因:数据出错;'; + continue; + } else { + $businessArray = []; + $teamBusiness = db('crm_business')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('business_id', $id)->find(); + if (!empty($teamBusiness['ro_user_id'])) { + $businessRo = arrayToString(array_diff(stringToArray($teamBusiness['ro_user_id']), [$teamBusiness['owner_user_id']])); + $businessArray['ro_user_id'] = $businessRo; + } + if (!empty($teamBusiness['rw_user_id'])) { + $businessRo = arrayToString(array_diff(stringToArray($teamBusiness['rw_user_id']), [$teamBusiness['owner_user_id']])); + $businessArray['rw_user_id'] = $businessRo; + } + db('crm_business')->where('business_id', $id)->update($businessArray); + } + } + if ($errorMessage) { + return $errorMessage; + } else { + return true; + } + } /** * [商机统计] - * @param - * @return - */ - public function getTrendql($map) - { - $prefix = config('database.prefix'); - $sql = "SELECT + * @param + * @return + */ + public function getTrendql($map) + { + $prefix = config('database.prefix'); + $sql = "SELECT '{$map['type']}' AS type, '{$map['start_time']}' AS start_time, '{$map['end_time']}' AS end_time, @@ -570,18 +593,18 @@ class Business extends Common WHERE create_time BETWEEN {$map['start_time']} AND {$map['end_time']} AND owner_user_id IN ({$map['owner_user_id']})"; - return $sql; - } + return $sql; + } - /** + /** * [赢单机会转化率趋势分析] - * @param - * @return - */ - public function getWinSql($map) - { - $prefix = config('database.prefix'); - $sql = "SELECT + * @param + * @return + */ + public function getWinSql($map) + { + $prefix = config('database.prefix'); + $sql = "SELECT '{$map['type']}' AS type, '{$map['start_time']}' AS start_time, '{$map['end_time']}' AS end_time, @@ -607,8 +630,8 @@ class Business extends Common WHERE create_time BETWEEN {$map['start_time']} AND {$map['end_time']} AND owner_user_id IN ({$map['owner_user_id']})"; - return $sql; - } + return $sql; + } /** * 获取系统信息 @@ -619,7 +642,7 @@ class Business extends Common * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ - public function getSystemInfo($id) + public function getSystemInfo($id) { # 商机 $business = Db::name('crm_business')->field(['create_user_id', 'create_time', 'update_time'])->where('business_id', $id)->find(); @@ -630,9 +653,9 @@ class Business extends Common return [ 'create_user_name' => $realname, - 'create_time' => date('Y-m-d H:i:s', $business['create_time']), - 'update_time' => date('Y-m-d H:i:s', $business['update_time']), - 'follow_time' => !empty($followTime) ? date('Y-m-d H:i:s', $followTime) : '' + 'create_time' => date('Y-m-d H:i:s', $business['create_time']), + 'update_time' => date('Y-m-d H:i:s', $business['update_time']), + 'follow_time' => !empty($followTime) ? date('Y-m-d H:i:s', $followTime) : '' ]; } diff --git a/application/crm/model/Contacts.php b/application/crm/model/Contacts.php index 53cb8c9..7708eb7 100644 --- a/application/crm/model/Contacts.php +++ b/application/crm/model/Contacts.php @@ -85,7 +85,7 @@ class Contacts extends Common if (!is_array($map['contacts.owner_user_id'][1])) { $map['contacts.owner_user_id'][1] = [$map['contacts.owner_user_id'][1]]; } - if ($map['contacts.owner_user_id'][0] == 'neq') { + if (in_array($map['contacts.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['contacts.owner_user_id'][1]) ? : []; //取差集 } else { $auth_user_ids = array_intersect($map['contacts.owner_user_id'][1], $auth_user_ids) ? : []; //取交集 @@ -107,7 +107,8 @@ class Contacts extends Common //列表展示字段 $indexField = $fieldModel->getIndexField('crm_contacts', $user_id, 1) ? : array('name'); $userField = $fieldModel->getFieldByFormType('crm_contacts', 'user'); //人员类型 - $structureField = $fieldModel->getFieldByFormType('crm_contacts', 'structure'); //部门类型 + $structureField = $fieldModel->getFieldByFormType('crm_contacts', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_contacts', 'datetime'); //日期时间类型 //排序 if ($order_type && $order_field) { @@ -130,7 +131,7 @@ class Contacts extends Common ->where($searchMap) ->where($authMap) ->where($customerWhere) - ->count('contacts_id'); + ->count('contacts_id'); if ($getCount == 1) { $data['dataCount'] = $dataCount ? : 0; return $data; @@ -144,7 +145,6 @@ class Contacts extends Common ->where($customerWhere) ->limit($request['offset'], $request['length']) ->field('contacts.*,customer.name as customer_name') - ->field(implode(',',$indexField).',customer.name as customer_name') ->orderRaw($order) ->select(); @@ -154,11 +154,16 @@ class Contacts extends Common $list[$k]['customer_id_info']['customer_id'] = $v['customer_id'] ? : ''; $list[$k]['customer_id_info']['name'] = $v['customer_name'] ? : ''; foreach ($userField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; - } + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); + } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } //权限 $permission = []; @@ -173,9 +178,6 @@ class Contacts extends Common $permission['is_delete'] = $is_delete; $list[$k]['permission'] = $permission; - # 下次联系时间 - $list[$k]['next_time'] = !empty($v['next_time']) ? date('Y-m-d H:i:s', $v['next_time']) : null; - # 关注 $starWhere = ['user_id' => $user_id, 'target_id' => $v['contacts_id'], 'type' => 'crm_contacts']; $star = Db::name('crm_star')->where($starWhere)->value('star_id'); @@ -227,9 +229,6 @@ class Contacts extends Common $param['primary'] = 1; } - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_contacts'); foreach ($arrFieldAtt as $k=>$v) { @@ -249,7 +248,7 @@ class Contacts extends Common 'create_user_id' => $param['create_user_id'], 'update_time' => time(), 'create_time' => time(), - 'customer_ids' => $param['customer_id'] + 'customer_ids' => $param['customer_id'] ]); # 处理商机首要联系人 @@ -319,9 +318,6 @@ class Contacts extends Common return false; } - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_contacts'); foreach ($arrFieldAtt as $k=>$v) { @@ -382,7 +378,11 @@ class Contacts extends Common # 处理决策人显示问题 $dataInfo['decision'] = !empty($dataInfo['decision']) && $dataInfo['decision'] == '是' ? '是' : ''; # 处理时间格式 - $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_contacts', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; $dataInfo['last_time'] = !empty($dataInfo['last_time']) ? date('Y-m-d H:i:s', $dataInfo['last_time']) : null; diff --git a/application/crm/model/Contract.php b/application/crm/model/Contract.php index 39fe105..888ade3 100644 --- a/application/crm/model/Contract.php +++ b/application/crm/model/Contract.php @@ -99,7 +99,7 @@ class Contract extends Common if (!is_array($map['contract.owner_user_id'][1])) { $map['contract.owner_user_id'][1] = [$map['contract.owner_user_id'][1]]; } - if ($map['contract.owner_user_id'][0] == 'neq') { + if (in_array($map['contract.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['contract.owner_user_id'][1]) ? : []; //取差集 } else { $auth_user_ids = array_intersect($map['contract.owner_user_id'][1], $auth_user_ids) ? : []; //取交集 @@ -127,6 +127,7 @@ class Contract extends Common //人员类型 $userField = $fieldModel->getFieldByFormType('crm_contract', 'user'); $structureField = $fieldModel->getFieldByFormType('crm_contract', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_contract', 'datetime'); //日期时间类型 //排序 if ($order_type && $order_field) { $order = $fieldModel->getOrderByFormtype('crm_contract','contract',$order_field,$order_type); @@ -186,11 +187,16 @@ class Contract extends Common $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; foreach ($userField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } $list[$k]['business_id_info']['business_id'] = $v['business_id']; $list[$k]['business_id_info']['name'] = $v['business_name']; $list[$k]['customer_id_info']['customer_id'] = $v['customer_id']; @@ -226,6 +232,9 @@ class Contract extends Common $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null; $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null; $list[$k]['last_time'] = !empty($v['last_time']) ? date('Y-m-d H:i:s', $v['last_time']) : null; + $list[$k]['order_date'] = ($v['order_date']!='0000-00-00') ? $v['order_date'] : null; + $list[$k]['start_time'] = ($v['start_time']!='0000-00-00') ? $v['start_time'] : null; + $list[$k]['end_time'] = ($v['end_time']!='0000-00-00') ? $v['end_time'] : null; # 签约人姓名 $orderNames = Db::name('admin_user')->whereIn('id', trim($v['order_user_id'], ','))->column('realname'); $list[$k]['order_user_name'] = implode(',', $orderNames); @@ -488,6 +497,11 @@ class Contract extends Common $orderNames = Db::name('admin_user')->whereIn('id', trim($dataInfo['order_user_id'], ','))->column('realname'); $dataInfo['order_user_name'] = implode(',', $orderNames); # 处理时间根式 + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_contract', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; @@ -510,10 +524,10 @@ class Contract extends Common foreach ($ids as $id) { $contractInfo = []; $contractInfo = db('crm_contract')->where(['contract_id' => $id])->find(); - if (in_array($contractInfo['check_status'],['0','1'])) { - $errorMessage[] = '合同:'.$contractInfo['name'].'"转移失败,错误原因:审批中,无法转移;'; - continue; - } +// if (in_array($contractInfo['check_status'],['0','1'])) { +// $errorMessage[] = '合同:'.$contractInfo['name'].'"转移失败,错误原因:审批中,无法转移;'; +// continue; +// } //团队成员 $teamData = []; $teamData['type'] = $type; //权限 1只读2读写 @@ -529,7 +543,19 @@ class Contract extends Common if (!db('crm_contract')->where(['contract_id' => $id])->update($data)) { $errorMessage[] = '合同:'.$contractInfo['name'].'"转移失败,错误原因:数据出错;'; continue; - } + } else { + $contractArray = []; + $teamContract = db('crm_contract')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('contract_id', $id)->find(); + if (!empty($teamContract['ro_user_id'])) { + $contractRo = arrayToString(array_diff(stringToArray($teamContract['ro_user_id']), [$teamContract['owner_user_id']])); + $contractArray['ro_user_id'] = $contractRo; + } + if (!empty($teamContract['rw_user_id'])) { + $contractRo = arrayToString(array_diff(stringToArray($teamContract['rw_user_id']), [$teamContract['owner_user_id']])); + $contractArray['rw_user_id'] = $contractRo; + } + db('crm_contract')->where('contract_id', $id)->update($contractArray); + } } if ($errorMessage) { return $errorMessage; diff --git a/application/crm/model/Customer.php b/application/crm/model/Customer.php index fc7d995..1796d79 100644 --- a/application/crm/model/Customer.php +++ b/application/crm/model/Customer.php @@ -127,7 +127,7 @@ class Customer extends Common if (!is_array($map['customer.owner_user_id'][1])) { $map['customer.owner_user_id'][1] = [$map['customer.owner_user_id'][1]]; } - if ($map['customer.owner_user_id'][0] == 'neq') { + if (in_array($map['customer.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['customer.owner_user_id'][1]) ? : []; //取差集 } else { $auth_user_ids = array_intersect($map['customer.owner_user_id'][1], $auth_user_ids) ? : []; //取交集 @@ -169,6 +169,7 @@ class Customer extends Common $indexField = $fieldModel->getIndexField('crm_customer', $user_id, 1) ? : array('name'); $userField = $fieldModel->getFieldByFormType('crm_customer', 'user'); //人员类型 $structureField = $fieldModel->getFieldByFormType('crm_customer', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_customer', 'datetime'); //日期时间类型 //排序 if ($order_type && $order_field) { $order = $fieldModel->getOrderByFormtype('crm_customer','customer',$order_field,$order_type); @@ -190,8 +191,7 @@ class Customer extends Common ->where($poolMap) ->where($otherMap) ->limit($request['offset'], $request['length']) - ->field(implode(',',$indexField)) - ->order($order_t) /*置顶*/ + ->field('customer.*') ->orderRaw($order) ->select(); //保护规则 @@ -228,14 +228,19 @@ class Customer extends Common $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; foreach ($userField as $key => $val) { if (in_array($val, $field_list)) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } } foreach ($structureField as $key => $val) { if (in_array($val, $field_list)) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); } } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } //商机数 $list[$k]['business_count'] = $business_count[$v['customer_id']]['count'] ?: 0; //距进入公海天数 @@ -268,9 +273,6 @@ class Customer extends Common $permission['is_delete'] = $is_delete; $list[$k]['permission'] = $permission; - # 下次联系时间 - $list[$k]['next_time'] = !empty($v['next_time']) ? date('Y-m-d H:i:s', $v['next_time']) : null; - # 关注 $starWhere = ['user_id' => $user_id, 'target_id' => $v['customer_id'], 'type' => 'crm_customer']; $star = Db::name('crm_star')->where($starWhere)->value('star_id'); @@ -327,9 +329,6 @@ class Customer extends Common return false; } unset($param['customer_id']); - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_customer'); @@ -377,71 +376,68 @@ class Customer extends Common * @author Michael_xu * @param * @return - */ - public function updateDataById($param, $customer_id = '') - { - $user_id = $param['user_id']; - $dataInfo = $this->get($customer_id); - if (!$dataInfo) { - $this->error = '数据不存在或已删除'; - return false; - } - - //数据权限判断 + */ + public function updateDataById($param, $customer_id = '') + { + $user_id = $param['user_id']; + $dataInfo = $this->get($customer_id); + if (!$dataInfo) { + $this->error = '数据不存在或已删除'; + return false; + } + $id = $param['id']?:$customer_id; + //数据权限判断 $userModel = new \app\admin\model\User(); $auth_user_ids = $userModel->getUserByPer('crm', 'customer', 'update'); //读写权限 - $rwPre = $userModel->rwPre($user_id, $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); + $rwPre = $userModel->rwPre($user_id, $dataInfo['ro_user_id'], $dataInfo['rw_user_id'], 'update'); //判断是否客户池数据 $wherePool = $this->getWhereByPool(); - $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $param['id']])->where($wherePool)->find(); + $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $id])->where($wherePool)->find(); if ($resPool || (!in_array($dataInfo['owner_user_id'],$auth_user_ids) && !$rwPre)) { $this->error = '无权操作'; return false; - } - - $param['customer_id'] = $customer_id; - //过滤不能修改的字段 - $unUpdateField = ['create_user_id','is_deleted','delete_time','user_id']; - foreach ($unUpdateField as $v) { - unset($param[$v]); - } - $param['deal_status'] = $dataInfo['deal_status']; - $fieldModel = new \app\admin\model\Field(); - // 自动验证 - $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 - $validate = new Validate($validateArr['rule'], $validateArr['message']); - $result = $validate->check($param); - if (!$result) { - $this->error = $validate->getError(); - return false; - } - //地址 - $param['address'] = $param['address'] ? implode(chr(10),$param['address']) : ''; - if ($param['deal_status'] == '已成交' && $dataInfo->data['deal_status'] == '未成交') { + } + + $param['customer_id'] = $customer_id; + //过滤不能修改的字段 + $unUpdateField = ['create_user_id','is_deleted','delete_time','user_id']; + foreach ($unUpdateField as $v) { + unset($param[$v]); + } + $param['deal_status'] = $dataInfo['deal_status']; + $fieldModel = new \app\admin\model\Field(); + // 自动验证 + $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 + $validate = new Validate($validateArr['rule'], $validateArr['message']); + $result = $validate->check($param); + if (!$result) { + $this->error = $validate->getError(); + return false; + } + //地址 + $param['address'] = $param['address'] ? implode(chr(10),$param['address']) : ''; + if ($param['deal_status'] == '已成交' && $dataInfo->data['deal_status'] == '未成交') { $param['deal_time'] = time(); } - - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - - //处理部门、员工、附件、多选类型字段 - $arrFieldAtt = $fieldModel->getArrayField('crm_customer'); - foreach ($arrFieldAtt as $k=>$v) { - $param[$v] = arrayToString($param[$v]); - } - $param['follow'] = '已跟进'; - if ($this->update($param, ['customer_id' => $customer_id], true)) { - //修改记录 - updateActionLog($user_id, 'crm_customer', $customer_id, $dataInfo->data, $param); - $data = []; - $data['customer_id'] = $customer_id; - return $data; - } else { - $this->error = '编辑失败'; - return false; - } - } + + //处理部门、员工、附件、多选类型字段 + $arrFieldAtt = $fieldModel->getArrayField('crm_customer'); + foreach ($arrFieldAtt as $k=>$v) { + $param[$v] = arrayToString($param[$v]); + } + $param['follow'] = '已跟进'; + if ($this->update($param, ['customer_id' => $customer_id], true)) { + //修改记录 + updateActionLog($user_id, 'crm_customer', $customer_id, $dataInfo->data, $param); + $data = []; + $data['customer_id'] = $customer_id; + return $data; + } else { + $this->error = '编辑失败'; + return false; + } + } /** * 客户数据 @@ -495,7 +491,11 @@ class Customer extends Common $primaryId = Db::name('crm_contacts')->where(['customer_id' => $id, 'primary' => 1])->value('contacts_id'); $dataInfo['contacts_id'] = !empty($primaryId) && $this->getContactsAuth($primaryId) ? $primaryId : 0; # 处理时间格式 - $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_customer', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; $dataInfo['last_time'] = !empty($dataInfo['last_time']) ? date('Y-m-d H:i:s', $dataInfo['last_time']) : null; diff --git a/application/crm/model/Invoice.php b/application/crm/model/Invoice.php index 4d56192..9a6196b 100644 --- a/application/crm/model/Invoice.php +++ b/application/crm/model/Invoice.php @@ -14,6 +14,7 @@ class Invoice extends Common { protected $name = 'crm_invoice'; protected $pk = 'invoice_id'; + protected $dateFormat = "Y-m-d H:i:s"; /** * 关联用户模型 diff --git a/application/crm/model/Leads.php b/application/crm/model/Leads.php index 42bf606..cdd7b30 100644 --- a/application/crm/model/Leads.php +++ b/application/crm/model/Leads.php @@ -90,7 +90,7 @@ class Leads extends Common if (!is_array($map['leads.owner_user_id'][1])) { $map['leads.owner_user_id'][1] = [$map['leads.owner_user_id'][1]]; } - if ($map['leads.owner_user_id'][0] == 'neq') { + if (in_array($map['leads.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['leads.owner_user_id'][1]) ?: []; //取差集 } else { $auth_user_ids = array_intersect($map['leads.owner_user_id'][1], $auth_user_ids) ?: []; //取交集 @@ -104,6 +104,7 @@ class Leads extends Common $indexField = $fieldModel->getIndexField('crm_leads', $user_id, 1) ?: array('name'); $userField = $fieldModel->getFieldByFormType('crm_leads', 'user'); //人员类型 $structureField = $fieldModel->getFieldByFormType('crm_leads', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_leads', 'datetime'); //日期时间类型 //排序 if ($order_type && $order_field) { @@ -139,10 +140,15 @@ class Leads extends Common $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; foreach ($userField as $key => $val) { - $list[$k][$val . '_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val . '_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); + } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; } //权限 $permission = []; @@ -156,8 +162,6 @@ class Leads extends Common $permission['is_update'] = $is_update; $permission['is_delete'] = $is_delete; $list[$k]['permission'] = $permission; - # 下次联系时间 - $list[$k]['next_time'] = !empty($v['next_time']) ? date('Y-m-d H:i:s', $v['next_time']) : null; # 关注 $starWhere = ['user_id' => $user_id, 'target_id' => $v['leads_id'], 'type' => 'crm_leads']; $star = Db::name('crm_star')->where($starWhere)->value('star_id'); @@ -210,9 +214,6 @@ class Leads extends Common $param[$v] = arrayToString($param[$v]); } - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - if ($this->data($param)->allowField(true)->isUpdate(false)->save()) { //修改记录 updateActionLog($param['create_user_id'], 'crm_leads', $this->leads_id, '', '', '创建了线索'); @@ -276,9 +277,6 @@ class Leads extends Common return false; } - # 处理下次联系时间 - if (!empty($param['next_time'])) $param['next_time'] = strtotime($param['next_time']); - //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_leads'); foreach ($arrFieldAtt as $k => $v) { @@ -323,7 +321,11 @@ class Leads extends Common $starId = empty($userId) ? 0 : Db::name('crm_star')->where(['user_id' => $userId, 'target_id' => $id, 'type' => 'crm_leads'])->value('star_id'); $dataInfo['star'] = !empty($starId) ? 1 : 0; # 处理时间格式处理 - $dataInfo['next_time'] = !empty($dataInfo['next_time']) ? date('Y-m-d H:i:s', $dataInfo['next_time']) : null; + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_leads', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; $dataInfo['last_time'] = !empty($dataInfo['last_time']) ? date('Y-m-d H:i:s', $dataInfo['last_time']) : null; diff --git a/application/crm/model/Product.php b/application/crm/model/Product.php index 26d9609..7eb8f94 100644 --- a/application/crm/model/Product.php +++ b/application/crm/model/Product.php @@ -35,7 +35,7 @@ class Product extends Common * @return array */ public function getDataList($request) - { + { $userModel = new \app\admin\model\User(); $structureModel = new \app\admin\model\Structure(); $fieldModel = new \app\admin\model\Field(); @@ -48,8 +48,8 @@ class Product extends Common $isStatus = !empty($request['is_status']) ? $request['is_status'] : 0; unset($request['scene_id']); unset($request['search']); - unset($request['user_id']); - unset($request['order_field']); + unset($request['user_id']); + unset($request['order_field']); unset($request['order_type']); unset($request['is_status']); @@ -87,7 +87,7 @@ class Product extends Common if (!is_array($map['product.owner_user_id'][1])) { $map['product.owner_user_id'][1] = [$map['product.owner_user_id'][1]]; } - if ($map['product.owner_user_id'][0] == 'neq') { + if (in_array($map['product.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['product.owner_user_id'][1]) ?: []; //取差集 } else { $auth_user_ids = array_intersect($map['product.owner_user_id'][1], $auth_user_ids) ?: []; //取交集 @@ -102,25 +102,26 @@ class Product extends Common $indexField = $fieldModel->getIndexField('crm_product', $user_id, 1) ? : ['name']; $userField = $fieldModel->getFieldByFormType('crm_product', 'user'); //人员类型 $structureField = $fieldModel->getFieldByFormType('crm_product', 'structure'); //部门类型 - + $datetimeField = $fieldModel->getFieldByFormType('crm_product', 'datetime'); //日期时间类型 + //排序 if ($order_type && $order_field) { $order = $fieldModel->getOrderByFormtype('crm_product','product',$order_field,$order_type); } else { $order = 'product.update_time desc'; - } + } $join = [ ['__CRM_PRODUCT_CATEGORY__ product_category', 'product_category.category_id = product.category_id', 'LEFT'], ]; - + $map['product.delete_user_id']=0; $list = db('crm_product')->alias('product') ->join($join) ->where($map) ->where($authMap) ->limit($request['offset'], $request['length']) ->field($indexField) - ->field(array_merge($indexField, ['product_category.name' => 'category_name'])) + ->field('product.*,product_category.name as category_name') ->orderRaw($order) ->select(); $dataCount = db('crm_product')->alias('product') @@ -132,11 +133,16 @@ class Product extends Common $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : ''; $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : ''; foreach ($userField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } //产品类型 $list[$k]['category_id_info'] = $v['category_name']; # 处理日期格式 @@ -153,23 +159,25 @@ class Product extends Common /** * 创建产品主表信息 * @author Michael_xu - * @param - * @return - */ + * @param + * @return + */ public function createData($param) { $fieldModel = new \app\admin\model\Field(); $productCategoryModel = model('ProductCategory'); - // 自动验证 - $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 - $validate = new Validate($validateArr['rule'], $validateArr['message']); - - $result = $validate->check($param); - if (!$result) { - $this->error = $validate->getError(); - return false; - } - + $dataInfo = db('crm_product')->where(['name'=>$param['name'],'delete_user_id'=>0])->find(); + if(isset($dataInfo)){ + // 自动验证 + $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 + $validate = new Validate($validateArr['rule'], $validateArr['message']); + + $result = $validate->check($param); + if (!$result) { + $this->error = $validate->getError(); + return false; + } + } //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_product'); foreach ($arrFieldAtt as $k=>$v) { @@ -200,17 +208,18 @@ class Product extends Common } else { $this->error = '添加失败'; return false; - } + } } /** * 编辑产品主表信息 * @author Michael_xu - * @param - * @return - */ + * @param + * @return + */ public function updateDataById($param, $product_id = '') { + $userModel = new \app\admin\model\User(); $dataInfo = $this->getDataById($product_id); $productCategoryModel = model('ProductCategory'); if (!$dataInfo) { @@ -222,7 +231,7 @@ class Product extends Common if (!in_array($dataInfo['owner_user_id'], $auth_user_ids)) { $this->error = '无权操作'; return false; - } + } $param['product_id'] = $product_id; //过滤不能修改的字段 @@ -232,15 +241,16 @@ class Product extends Common } $fieldModel = new \app\admin\model\Field(); - // 自动验证 - $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 - $validate = new Validate($validateArr['rule'], $validateArr['message']); - - $result = $validate->check($param); - if (!$result) { - $this->error = $validate->getError(); - return false; - } + // 自动验证 +// $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则 +// $validate = new Validate($validateArr['rule'], $validateArr['message']); +// +// $result = $validate->check($param); +// if (!$result) { +// $this->error = $validate->getError(); +// return false; +// } + //处理部门、员工、附件、多选类型字段 $arrFieldAtt = $fieldModel->getArrayField('crm_product'); @@ -250,17 +260,16 @@ class Product extends Common //产品分类 $category_id = $param['category_id']; - if (is_array($category_id)) { - $param['category_id'] = $productCategoryModel->getIdByStr($category_id); - $param['category_str'] = arrayToString($category_id); - } +// if (is_array($category_id)) { +// $param['category_id'] = $productCategoryModel->getIdByStr($category_id); +// $param['category_str'] = arrayToString($category_id); +// } if(!is_int($category_id)){ $list=db('crm_product_category')->column('category_id','name'); + $param['category_id']=1; foreach ($list as $k=>$v){ - if($k==$param['category_id']){ + if($k==$category_id){ $param['category_id']=$v; - }else{ - $param['category_id']=0; } } } @@ -274,7 +283,7 @@ class Product extends Common $this->rollback(); $this->error = '编辑失败'; return false; - } + } } /** @@ -287,8 +296,9 @@ class Product extends Common * @throws \think\exception\DbException */ public function getDataById($id = '') - { + { $map['product_id'] = $id; + $map['delete_user_id'] = 0; $dataInfo = db('crm_product')->where($map)->find(); if (!$dataInfo) { $this->error = '暂无此数据'; @@ -302,8 +312,13 @@ class Product extends Common $userModel = new \app\admin\model\User(); $dataInfo['create_user_id_info'] = $userModel->getUserById($dataInfo['create_user_id']); - $dataInfo['category_id_info'] = db('crm_product_category')->where(['category_id' => $dataInfo['category_id']])->value('name'); + $dataInfo['category_id_info'] = db('crm_product_category')->where(['category_id' => $dataInfo['category_id']])->value('name'); # 处理日期格式 + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_product', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; return $dataInfo; @@ -320,19 +335,15 @@ class Product extends Common */ private function getProductImages($fileIds) { - $result = []; + $files = Db::name('admin_file')->whereIn('file_id', $fileIds)->select(); - $files = Db::name('admin_file')->field(['file_id', 'file_path_thumb', 'file_path', 'save_name'])->whereIn('file_id', $fileIds)->select(); foreach ($files AS $key => $value) { - $result[] = [ - 'file_id' => $value['file_id'], - 'file_path_thumb' => getFullPath($value['file_path_thumb']), - 'file_path' => getFullPath($value['file_path']), - 'save_name' => $value['save_name'] - ]; + $files[$key]['file_path'] = getFullPath($value['file_path']); + $files[$key]['file_path_thumb'] = getFullPath($value['file_path_thumb']); + $files[$key]['size'] = format_bytes($value['size']); } - return $result; + return $files; } /** @@ -346,10 +357,10 @@ class Product extends Common * @param subtotal 小计(折扣后价格) * @param unit 单位 * @param total_price 折扣后整单总价 - * @param discount_rate 整单折扣 + * @param discount_rate 整单折扣 * @param objId 关联对象ID - * @return - */ + * @return + */ public function createObject($types, $param, $objId) { switch ($types) { @@ -375,7 +386,7 @@ class Product extends Common $product[$key]['discount'] = $value['discount']; //折扣 $product[$key]['unit'] = $value['unit'] ? : ''; //单位 $product[$key]['subtotal'] = $value['subtotal']; - // $total_price += $product[$key]['subtotal'] = round(($value['price'] * $value['num']) * $discount); //总价 + // $total_price += $product[$key]['subtotal'] = round(($value['price'] * $value['num']) * $discount); //总价 $product[$key][$db_id] = $objId; } @@ -388,18 +399,18 @@ class Product extends Common //产品合计 $rData['discount_rate'] = !empty($param['discount_rate']) ? $param['discount_rate'] : 0.00; //整单折扣 $discount_rate = ((100 - $rData['discount_rate']) > 0) ? (100 - $rData['discount_rate'])/100 : 0; - // $rData['total_price'] = $total_price ? $total_price*$discount_rate : '0.00'; //整单合计 - $rData['total_price'] = $param['total_price'] ? : '0.00'; //整单合计 - db($rDb)->where([$db_id => $objId])->update($rData); + // $rData['total_price'] = $total_price ? $total_price*$discount_rate : '0.00'; //整单合计 + $rData['total_price'] = $param['total_price'] ? : '0.00'; //整单合计 + db($rDb)->where([$db_id => $objId])->update($rData); // 提交事务 Db::commit(); - return true; + return true; } catch (\Exception $e) { $this->error = '产品数据创建出错'; // 回滚事务 - Db::rollback(); - return false; + Db::rollback(); + return false; } } else { //删除产品信息 @@ -425,7 +436,7 @@ class Product extends Common $perUserIds = $userModel->getUserByPer('bi', 'product', 'read'); //权限范围内userIds $whereData = $adminModel->getWhere($param, '', $perUserIds); //统计条件 $userIds = $whereData['userIds']; - $between_time = $whereData['between_time']; + $between_time = $whereData['between_time']; $where = []; //时间段 $where['contract.create_time'] = ['between', $between_time]; @@ -457,7 +468,7 @@ class Product extends Common $list[$k]['contract_id_info'] = $contract_info ? : array(); //产品 $product_info = []; - $product_info['name'] = $v['product_name']; + $product_info['name'] = $v['product_name']; $product_info['product_id'] = $v['product_id']; $list[$k]['product_id_info'] = $product_info ? : array(); //负责人 @@ -467,14 +478,14 @@ class Product extends Common $list[$k]['owner_user_name'] = $owner_user_id_info['realname']; } return $list; - } + } /** * [根据产品类别ID,查询父级ID] * @author Michael_xu - * @param - * @return - */ + * @param + * @return + */ public function getPidStr($category_id, $idArr, $first = '') { if ($first == 1) $idArr = []; diff --git a/application/crm/model/Receivables.php b/application/crm/model/Receivables.php index 394c222..3408058 100644 --- a/application/crm/model/Receivables.php +++ b/application/crm/model/Receivables.php @@ -83,7 +83,7 @@ class Receivables extends Common if (!is_array($map['receivables.owner_user_id'][1])) { $map['receivables.owner_user_id'][1] = [$map['receivables.owner_user_id'][1]]; } - if ($map['receivables.owner_user_id'][0] == 'neq') { + if (in_array($map['receivables.owner_user_id'][0], ['neq', 'notin'])) { $auth_user_ids = array_diff($auth_user_ids, $map['receivables.owner_user_id'][1]) ? : []; //取差集 } else { $auth_user_ids = array_intersect($map['receivables.owner_user_id'][1], $auth_user_ids) ? : []; //取交集 @@ -97,7 +97,8 @@ class Receivables extends Common $indexField = $fieldModel->getIndexField('crm_receivables', $user_id, 1) ? : array('number'); //人员类型 $userField = $fieldModel->getFieldByFormType('crm_receivables', 'user'); - $structureField = $fieldModel->getFieldByFormType('crm_receivables', 'structure'); //部门类型 + $structureField = $fieldModel->getFieldByFormType('crm_receivables', 'structure'); //部门类型 + $datetimeField = $fieldModel->getFieldByFormType('crm_receivables', 'datetime'); //日期时间类型 if ($request['order_type'] && $request['order_field']) { $order = $fieldModel->getOrderByFormtype('crm_receivables','receivables',$order_field,$order_type); @@ -134,7 +135,7 @@ class Receivables extends Common ->where($map) ->where($authMap) ->limit($request['offset'], $request['length']) - ->field(implode(',',$indexField).',customer.name as customer_name,contract.name as contract_name,contract.num as contract_num,contract.money as contract_money') + ->field('receivables.*,customer.name as customer_name,contract.name as contract_name,contract.num as contract_num,contract.money as contract_money') ->orderRaw($order) ->select(); @@ -150,11 +151,16 @@ class Receivables extends Common $list[$k]['contract_id_info']['money'] = $v['contract_money'] ? : '0.00'; $list[$k]['contract_money'] = $v['contract_money'] ? : '0.00'; foreach ($userField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : []; + $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : []; + $list[$k][$val] = implode($usernameField, ','); } foreach ($structureField as $key => $val) { - $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : []; + $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : []; + $list[$k][$val] = implode($structureNameField, ','); } + foreach ($datetimeField as $key => $val) { + $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null; + } $list[$k]['check_status_info'] = $this->statusArr[$v['check_status']]; //期数 $plan_num = db('crm_receivables_plan')->where(['plan_id' => $v['plan_id']])->value('num'); @@ -403,6 +409,11 @@ class Receivables extends Common $dataInfo['contract_id_info'] = $dataInfo['contract_id'] ? db('crm_contract')->where(['contract_id' => $dataInfo['contract_id']])->field('contract_id,name,money')->find() : []; $dataInfo['receivables_id'] = $id; # 处理时间格式 + $fieldModel = new \app\admin\model\Field(); + $datetimeField = $fieldModel->getFieldByFormType('crm_receivables', 'datetime'); //日期时间类型 + foreach ($datetimeField as $key => $val) { + $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null; + } $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null; $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null; return $dataInfo; diff --git a/application/oa/controller/Event.php b/application/oa/controller/Event.php index f9604d6..168db11 100644 --- a/application/oa/controller/Event.php +++ b/application/oa/controller/Event.php @@ -236,7 +236,9 @@ class Event extends ApiCommon $eventModel = model('Event'); $data = $eventModel->getDataById($this->param['event_id']); - + if(!$data['title']){ + return resultArray(['error' => '日程已删除']); + } return resultArray(['data' => $data]); } diff --git a/application/oa/controller/Examine.php b/application/oa/controller/Examine.php index c414ce5..f8cf20d 100644 --- a/application/oa/controller/Examine.php +++ b/application/oa/controller/Examine.php @@ -468,7 +468,7 @@ class Examine extends ApiCommon $is_end = 1; //审批结束 $checkData['check_status'] = !empty($status) ? 2 : 3; - $examineData['check_user_id'] = ''; +// $examineData['check_user_id'] = ''; } else { //修改主体相关审批信息 $examineData['check_user_id'] = arrayToString($next_user_ids); @@ -484,7 +484,7 @@ class Examine extends ApiCommon } if ($is_end == 1) { $checkData['check_status'] = !empty($status) ? 2 : 3; - $examineData['check_user_id'] = ''; +// $examineData['check_user_id'] = ''; $examineData['check_status'] = 2; } } else { @@ -588,8 +588,9 @@ class Examine extends ApiCommon $checkData['status'] = $status; $examineData['check_status'] = 4; - $examineData['check_user_id'] = ''; - $examineData['flow_user_id'] = ''; + # 如果将审批人置空,会导致普通员工在右上角消息中无法查看审批 + $examineData['check_user_id'] = $dataInfo['check_user_id']; + $examineData['flow_user_id'] = ''; $resExamine = db('oa_examine')->where(['examine_id' => $examine_id])->update($examineData); if ($resExamine) { //将审批记录至为无效 diff --git a/application/oa/controller/Task.php b/application/oa/controller/Task.php index c5936ea..0f86786 100644 --- a/application/oa/controller/Task.php +++ b/application/oa/controller/Task.php @@ -33,7 +33,7 @@ class Task extends ApiCommon Hook::listen('check_auth', $action); $request = Request::instance(); $a = strtolower($request->action()); - + if (!in_array($a, $action['permission'])) { parent::_initialize(); } @@ -48,7 +48,7 @@ class Task extends ApiCommon } } } - + //判断任务(需创建人和负责人才能编辑删除) public function checkSub($task_id) { @@ -62,7 +62,7 @@ class Task extends ApiCommon exit(json_encode(['code' => 102, 'error' => '没有权限'])); } } - + /** * 查看下属创建的任务 * @param //负责和参与 @@ -71,9 +71,9 @@ class Task extends ApiCommon */ public function subTaskList() { - + } - + /** * 查看所有的项目 * @param @@ -88,7 +88,7 @@ class Task extends ApiCommon $data['count'] = $count; return resultArray(['data' => $data]); } - + /** * 查看某个项目下任务列表 * @param @@ -104,7 +104,7 @@ class Task extends ApiCommon $list = $taskModel->getDataList($param, $userInfo['id']); return resultArray(['data' => $list]); } - + /** * 查看我的任务 * @param @@ -137,7 +137,6 @@ class Task extends ApiCommon } else { $where['t.status'] = [['=', 1], ['=', 5], 'OR']; } - if ($param['main_user_id']) { $where['t.main_user_id'] = $param['main_user_id']; } @@ -154,25 +153,25 @@ class Task extends ApiCommon $subArr[] = $v; $subArr[] = '|'; } - $subValue = $subList ? arrayToString($subArr) : ''; + $subValue = $subList ? arrayToString($subArr) : ''; $where['t.ishidden'] = 0; $where['t.pid'] = 0; if ($type != 0) { switch ($type) { case '1' : - $type = 't.main_user_id in ('.$subStr.')'; + $type = 't.main_user_id in (' . $subStr . ')'; break; //下属负责的 case '3' : //使用正则查询 // SELECT * FROM 5kcrm_task WHERE owner_user_id REGEXP '(,1,|,2,|,3,)'; - $type = $subValue ? 't.owner_user_id REGEXP "('.$subValue.')"' : ''; + $type = $subValue ? 't.owner_user_id REGEXP "(' . $subValue . ')"' : ''; break; //下属参与的 } } else { if (!$subValue) { $type = 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . '))'; } else { - $type .= 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . ') or t.owner_user_id REGEXP "('.$subValue.')")'; + $type .= 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . ') or t.owner_user_id REGEXP "(' . $subValue . ')")'; } } // $where['t.work_id'] = 0; @@ -195,13 +194,12 @@ class Task extends ApiCommon $query->where($type); }) ->count(); - - $completeCount = db('task') ->alias('t')->where($where) + $completeCount = db('task')->alias('t') ->where($map) ->where(function ($query) use ($type) { $query->where($type); - })->where('t.status', 5)->count(); - + }) + ->where($map)->where(['t.status' => 5, 't.ishidden' => 0, 'priority' => $priority])->count(); foreach ($taskList as $k => $v) { $temp = $v ?: []; if ($v['pid']) { @@ -217,7 +215,7 @@ class Task extends ApiCommon $taskList[$k]['lableList'] = $v['lable_id'] ? $lableModel->getDataByStr($v['lable_id']) : []; $taskList[$k]['main_user'] = $v['main_user_id'] ? $userModel->getUserById($v['main_user_id']) : array(); $taskList[$k]['relationCount'] = $taskModel->getRelationCount($v['task_id']); - + $taskList[$k]['create_time'] = date('Y-m-d', $v['create_time']) ?: ''; $taskList[$k]['update_time'] = date('Y-m-d', $v['update_time']) ?: ''; $taskList[$k]['start_time'] = $v['start_time'] == 0 ? null : date('Y-m-d', $v['start_time']);; @@ -226,7 +224,7 @@ class Task extends ApiCommon if (!empty($v['stop_time']) && (strtotime(date('Ymd')) + 86400 > $v['stop_time'])) $is_end = 1; $taskList[$k]['is_end'] = $is_end; } - + } else { $map['t.pid'] = 0; // $map['t.work_id'] = 0; @@ -236,15 +234,15 @@ class Task extends ApiCommon $type = 't.main_user_id =' . $userInfo['id'] . ''; break; //我负责的 case '3' : - $type = 't.owner_user_id like "%,'.$userInfo['id'].',%"'; + $type = 't.owner_user_id like "%,' . $userInfo['id'] . ',%"'; break; //我参与的 } } else { $adminIds = $userModel->getAdminId(); - if (in_array($userInfo['id'],$adminIds)) { - $type = 't.is_open = 1'; + if (in_array($userInfo['id'], $adminIds)) { + $type = 't.is_open = 1'; } else { - $type = 't.is_open = 1 AND (t.main_user_id =' . $userInfo['id'] .' OR t.owner_user_id like "%,'.$userInfo['id'].',%")'; + $type = 't.is_open = 1 AND (t.main_user_id =' . $userInfo['id'] . ' OR t.owner_user_id like "%,' . $userInfo['id'] . ',%")'; } } $where['t.ishidden'] = 0; @@ -259,33 +257,35 @@ class Task extends ApiCommon ->order('t.task_id desc') ->select(); $dataCount = db('task')->alias('t')->where($where)->where($type)->where($map)->count(); - $completeCount = db('task')->alias('t')->where($where)->where($type)->where($map)->where('t.status', 5)->count(); + $completeCount = db('task')->alias('t') + ->where($type) + ->where($map)->where(['t.status' => 5, 't.ishidden' => 0, 'priority' => $priority])->count(); foreach ($taskList as $key => $value) { $pname = ''; if ($value['pid']) { - $pname = Db::name('Task')->where('task_id ='.$value['pid'])->value('name'); + $pname = Db::name('Task')->where('task_id =' . $value['pid'])->value('name'); } - $taskList[$key]['pname'] = $pname ? : ''; + $taskList[$key]['pname'] = $pname ?: ''; $taskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; - $taskList[$key]['subcount'] = Db::name('Task')->where(['ishidden' => 0,'status' => 1,'pid' => $value['task_id']])->count(); //子任务 - $taskList[$key]['subdonecount'] = Db::name('Task')->where(['ishidden' => 0,'status' => 5,'pid' => $value['task_id']])->count(); //已完成子任务 - $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task','type_id' => $value['task_id']])->count(); - $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where('task_id ='.$value['task_id'])->count(); + $taskList[$key]['subcount'] = Db::name('Task')->where(['ishidden' => 0, 'status' => 1, 'pid' => $value['task_id']])->count(); //子任务 + $taskList[$key]['subdonecount'] = Db::name('Task')->where(['ishidden' => 0, 'status' => 5, 'pid' => $value['task_id']])->count(); //已完成子任务 + $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task', 'type_id' => $value['task_id']])->count(); + $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where('task_id =' . $value['task_id'])->count(); $taskList[$key]['lableList'] = $value['lable_id'] ? $lableModel->getDataByStr($value['lable_id']) : []; - - $taskList[$key]['create_time'] = date('Y-m-d', $value['create_time']) ?: ''; - $taskList[$key]['update_time'] = date('Y-m-d', $value['update_time']) ?: ''; - $taskList[$key]['start_time'] = $value['start_time']==0?null:date('Y-m-d', $value['start_time']);; - $taskList[$key]['stop_time'] = $value['stop_time']==0?null:date('Y-m-d', $value['stop_time']); + + $taskList[$key]['create_time'] = date('Y-m-d', $value['create_time']) ?: ''; + $taskList[$key]['update_time'] = date('Y-m-d', $value['update_time']) ?: ''; + $taskList[$key]['start_time'] = $value['start_time'] == 0 ? null : date('Y-m-d', $value['start_time']);; + $taskList[$key]['stop_time'] = $value['stop_time'] == 0 ? null : date('Y-m-d', $value['stop_time']); //负责人信息 $taskList[$key]['main_user'] = $value['main_user_id'] ? $userModel->getDataById($value['main_user_id']) : array(); $taskList[$key]['relationCount'] = $taskModel->getRelationCount($value['task_id']); $is_end = 0; - if (!empty($value['stop_time']) && (strtotime(date('Ymd'))+86399 > $value['stop_time'])) $is_end = 1; + if (!empty($value['stop_time']) && (strtotime(date('Ymd')) + 86399 > $value['stop_time'])) $is_end = 1; $taskList[$key]['is_end'] = $is_end; } } - + $data = []; $data['page']['list'] = $taskList ?: []; $data['page']['dataCount'] = $dataCount ?: 0; @@ -302,7 +302,7 @@ class Task extends ApiCommon } return resultArray(['data' => $data]); } - + /** * 任务列表导出 * @return \think\response\Json|void @@ -316,7 +316,7 @@ class Task extends ApiCommon $data = $TaskLogic->excelExport($param); return $data; } - + /** * 获取任务详情 * @param @@ -338,7 +338,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskmodel->getError()]); } } - + /** * 任务编辑保存 * @param @@ -365,7 +365,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 解除关联关系 * @param @@ -403,7 +403,7 @@ class Task extends ApiCommon return resultArray(['error' => '操作失败']); } } - + /** * 获取任务操作记录 * @param @@ -420,7 +420,7 @@ class Task extends ApiCommon $list = $taskModel->getTaskLogList($param) ?: []; return resultArray(['data' => $list]); } - + /** * 优先级设置 * @param @@ -432,7 +432,7 @@ class Task extends ApiCommon $param = $this->param; $userInfo = $this->userInfo; $param['create_user_id'] = $userInfo['id']; - + if (!isset($param['priority_id']) || !$param['task_id']) { return resultArray(['error' => '参数错误']); } @@ -446,7 +446,7 @@ class Task extends ApiCommon return resultArray(['error' => '操作失败']); } } - + /** * 参与人/参与部门编辑 * @param @@ -481,7 +481,7 @@ class Task extends ApiCommon } return resultArray(['error' => '修改失败']); } - + /** * 单独删除参与人 * @param @@ -504,7 +504,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 单独删除参与部门 * @param @@ -527,7 +527,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 设置任务截止时间 * @param @@ -553,7 +553,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 添加删除标签 * @param @@ -584,7 +584,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 任务标题描述更新 * @param @@ -606,7 +606,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 任务标记结束 * @param @@ -646,7 +646,7 @@ class Task extends ApiCommon } return resultArray(['data' => '操作成功']); } - + /** * 日历任务展示/月份 * @param @@ -666,7 +666,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 添加任务 * @param @@ -689,7 +689,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 删除主负责人 * @param @@ -717,7 +717,7 @@ class Task extends ApiCommon } return resultArray(['data' => '操作成功']); } - + /** * 重命名任务 * @param @@ -740,7 +740,7 @@ class Task extends ApiCommon return resultArray(['error' => $workModel->getError()]); } } - + /** * 删除任务 * @param @@ -765,7 +765,7 @@ class Task extends ApiCommon return resultArray(['error' => $workModel->getError()]); } } - + /** * 归档任务 改变状态 * @param @@ -793,7 +793,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 恢复归档任务 * @param @@ -821,7 +821,7 @@ class Task extends ApiCommon return resultArray(['error' => $taskModel->getError()]); } } - + /** * 归档任务列表 * @param diff --git a/application/oa/logic/ExamineLogic.php b/application/oa/logic/ExamineLogic.php index efee118..4c9f798 100644 --- a/application/oa/logic/ExamineLogic.php +++ b/application/oa/logic/ExamineLogic.php @@ -10,7 +10,193 @@ use think\Validate; class ExamineLogic extends Common { private $statusArr = ['0' => '待审核', '1' => '审核中', '2' => '审核通过', '3' => '已拒绝', '4' => '已撤回']; - + + public function getDataList($request) + { + $userModel = new \app\admin\model\User(); + $fileModel = new \app\admin\model\File(); + $recordModel = new \app\admin\model\Record(); + + $examine_by = $request['examine_by']; //1待我审批 2我已审批 all 全部 + $user_id = $request['user_id']; + $bi = $request['bi_types']; + $check_status = $request['check_status']; //0 待审批 2 审批通过 4 审批拒绝 all 全部 + unset($request['by']); + unset($request['bi_types']); + unset($request['user_id']); + unset($request['check_status']); + unset($request['examine_by']); + $request = $this->fmtRequest($request); + $map = $request['map'] ?: []; + if (isset($map['search']) && $map['search']) { + //普通筛选 + $map['examine.content'] = ['like', '%' . $map['search'] . '%']; + } else { + $map = where_arr($map, 'oa', 'examine', 'index'); //高级筛选 + } + unset($map['search']); + //审批类型 + $map['examine.category_id'] = $map['examine.category_id'] ?: array('gt', 0); + + $map_str = ''; + $logmap = ''; + switch ($examine_by) { + case 'all' : + //如果超管则能看到全部 + if (!isSuperAdministrators($user_id)) { + $map_str = "(( check_user_id LIKE '%," . $user_id . ",%' OR check_user_id = " . $user_id . " ) OR ( flow_user_id LIKE '%," . $user_id . ",%' OR `flow_user_id` = " . $user_id . " ) )"; + } + break; + case '1' : + $map['check_user_id'] = [['like', '%,' . $user_id . ',%']]; + break; //待审 + case '2' : + $map_str = "(( check_user_id LIKE '%," . $user_id . ",%' OR check_user_id = " . $user_id . " ) + OR ( flow_user_id LIKE '%," . $user_id . ",%' OR `flow_user_id` = " . $user_id . " ) )"; +// $map['flow_user_id'] = [['like', '%,' . $user_id . ',%'], ['eq', $user_id], 'or']; + break; //已审 + default: + $map['examine.create_user_id'] = $user_id; + break; + } + $order = 'examine.create_time desc,examine.update_time desc'; + //发起时间 + if ($map['examine.between_time'][0] && $map['examine.between_time'][1]) { + $start_time = $map['examine.between_time'][0]; + $end_time = $map['examine.between_time'][1]; + $map['examine.create_time'] = array('between', array($start_time, $end_time)); + } + unset($map['examine.between_time']); + + //审核状态 0 待审批 2 审批通过 4 审批拒绝 all 全部 + if (isset($check_status)) { + if ($check_status == 'all') { + $map['examine.check_status'] = ['egt', 0]; + if (isSuperAdministrators($user_id)) { + unset($map['examine.create_user_id']); + } + } elseif ($check_status == 4) { + $map['examine.check_status'] = ['eq', 3]; + } elseif ($check_status == 0) { + $map['examine.check_status'] = ['<=', 1]; + } else { + $map['examine.check_status'] = $check_status; + } + } else { + if ($examine_by == 'all') { + $map['examine.check_status'] = ['egt', 0]; + } elseif ($examine_by == 1) { + $map['examine.check_status'] = ['elt', 1]; + } elseif ($examine_by == 2) { + $map['examine.check_status'] = ['egt', 2]; + } + } + $join = [ + ['__ADMIN_USER__ user', 'user.id = examine.create_user_id', 'LEFT'], + ['__OA_EXAMINE_CATEGORY__ examine_category', 'examine_category.category_id = examine.category_id', 'LEFT'], + ]; + $list_view = db('oa_examine') + ->alias('examine') + ->where($map_str) + ->where($map) + ->join($join); + $res = []; + $list = $list_view + ->page($request['page'], $request['limit']) + ->field('examine.*,user.realname,user.thumb_img,examine_category.title as category_name,examine_category.category_id as examine_config,examine_category.icon as examineIcon') + ->order($order) + ->select(); + foreach ($list as $k => $v) { + $causeCount = 0; + $causeTitle = ''; + $duration = $v['duration'] ?: '0.0'; + $money = $v['money'] ?: '0.00'; + + $list[$k]['causeTitle'] = $causeTitle; + $list[$k]['causeCount'] = $causeCount ?: 0; + $item = db('oa_examine_travel')->where(['examine_id' => $v['examine_id']])->select(); + if ($item) { + foreach ($item as $key => $value) { + if($v['check_status']==4){ + $usernames = ''; + }else{ + $usernames = db('admin_user')->whereIn('id', stringToArray($v['check_user_id']))->column('realname'); + } + + //关联业务 + $relationArr = []; + $relationArr = $recordModel->getListByRelationId('examine', $v['examine_id']); + $item[$key]['relation'] = arrayToString(array_column($relationArr['businessList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['contactsList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['contractList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['customerList'], 'name')); + $res[] = [ + 'category_name' => $v['category_name'], + 'create_time' => !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null, + 'realname' => $v['realname'], + 'check_status_info' => $this->statusArr[(int)$v['check_status']], + 'examine_name' => implode($usernames, ','), + 'content' => $v['content'], + 'remark' => $v['remark'], + 'duration' => $v['duration'], + 'vehicle' => $value['vehicle'], + 'trip' => $value['trip'], + 'money' => $value['money'], + 'traffic' => $value['traffic'], + 'stay' => $value['stay'], + 'diet' => $value['diet'], + 'other' => $value['other'], + 'start_address' => $value['start_address'], + 'end_address' => $value['end_address'], + 'start_time' => !empty($value['start_time']) ? date('Y-m-d H:i:s', $value['start_time']) : null, + 'end_time' => !empty($value['end_time']) ? date('Y-m-d H:i:s', $value['end_time']) : null, + 'description' => $value['description'], + 'replyList' => str_replace(',', ' ', $item[$key]['relation']), + ]; + } + } else { + $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null; + $list[$k]['start_time'] = !empty($v['start_time']) ? date('Y-m-d H:i:s', $v['start_time']) : null; + $list[$k]['end_time'] = !empty($v['end_time']) ? date('Y-m-d H:i:s', $v['end_time']) : null; + if($v['check_status']==4){ + $usernames = ''; + }else{ + $usernames = db('admin_user')->whereIn('id', stringToArray($v['check_user_id']))->column('realname'); + } + //关联业务 + $relationArr = []; + $relationArr = $recordModel->getListByRelationId('examine', $v['examine_id']); + $list[$k]['relation'] = arrayToString(array_column($relationArr['businessList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['contactsList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['contractList'], 'name')) . ' ' . + arrayToString(array_column($relationArr['customerList'], 'name')); + $res[] = [ + 'category_name' => $v['category_name'], + 'create_time' => !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null, + 'realname' => $v['realname'], + 'check_status_info' => $this->statusArr[(int)$v['check_status']], + 'examine_name' => implode($usernames, ','), + 'content' => $v['content'], + 'remark' => $v['remark'], + 'duration' => $v['duration'], + 'vehicle' => '', + 'money' => $v['money'], + 'traffic' => '', + 'stay' => '', + 'diet' => '', + 'other' => '', + 'start_address' => '', + 'end_address' => '', + 'start_time' => !empty($v['start_time']) ? date('Y-m-d H:i:s', $v['start_time']) : null, + 'end_time' => !empty($v['end_time']) ? date('Y-m-d H:i:s', $v['end_time']) : null, + 'description' => '', + 'replyList' => str_replace(',', ' ', $item[$key]['relation']), + ]; + } + } + return $res; + } + /** * 审批导出 * @param $param @@ -19,35 +205,125 @@ class ExamineLogic extends Common public function excelExport($param) { $excelModel = new \app\admin\model\Excel(); - $field_list1 = [ - array('name' => '审批类型', 'field' => 'category_name', 'form_type' => 'text'), - array('name' => '创建时间', 'field' => 'create_time', 'form_type' => ''), - array('name' => '创建人', 'field' => 'create_user_id', 'form_type' => 'user'), - array('name' => '状态', 'field' => 'check_status_info','form_type' => ''), - array('name' => '当前审批人', 'field' => 'check_user_id','form_type' => 'userStr'), - // array('name' => '下一审批人', 'field' => 'last_user_id','form_type' => 'user'), - // array('name' => '关联业务', 'field' => 'relation','form_type' => ''), - ]; - // 导出的字段列表 - $fieldModel = new \app\admin\model\Field(); - $field_list = $fieldModel->getIndexFieldConfig('oa_examine', $param['user_id'], $param['category_id']); + $data = $this->getDataList($param); + $list = []; + switch ($param['category_id']) { + case '1' : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '备注', 'field' => 'description'], + '6' => ['name' => '关联业务', 'field' => 'replyList'], + ]; + break; + case '2' : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '审批内容', 'field' => 'content'], + '6' => ['name' => '开始时间', 'field' => 'start_time'], + '7' => ['name' => '结束时间', 'field' => 'end_time'], + '8' => ['name' => '时长', 'field' => 'duration'], + '9' => ['name' => '备注', 'field' => 'description'], + '10' => ['name' => '关联业务', 'field' => 'replyList'], + ]; + break; + case '3' : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '出差事由', 'field' => 'content'], + '6' => ['name' => '备注', 'field' => 'remark'], + '7' => ['name' => '出差总天数', 'field' => 'duration'], + '8' => ['name' => '交通工具', 'field' => 'vehicle'], + '9' => ['name' => '单程往返', 'field' => 'trip'], + '10' => ['name' => '出发城市', 'field' => 'start_address'], + '11' => ['name' => '目的城市', 'field' => 'end_address'], + '12' => ['name' => '开始时间', 'field' => 'start_time'], + '13' => ['name' => '结束时间', 'field' => 'end_time'], + '14' => ['name' => '出差备注', 'field' => 'description'], + '15' => ['name' => '时长', 'field' => 'duration'], + '16' => ['name' => '关联业务', 'field' => 'replyList'], + ]; + break; + case '4' : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname',], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '加班原因', 'field' => 'content'], + '6' => ['name' => '开始时间', 'field' => 'start_time'], + '7' => ['name' => '结束时间', 'field' => 'end_time'], + '8' => ['name' => '加班总天数', 'field' => 'duration'], + '9' => ['name' => '备注', 'field' => 'description'], + '10' => ['name' => '关联业务', 'field' => 'replyList'], + ]; + break; + case '5': + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '差旅内容', 'field' => 'content'], + '6' => ['name' => '报销总金额', 'field' => 'money'], + '7' => ['name' => '备注', 'field' => 'remark'], + '8' => ['name' => '出发城市', 'field' => 'start_address'], + '9' => ['name' => '目的城市', 'field' => 'end_address'], + '10' => ['name' => '开始时间', 'field' => 'start_time'], + '11' => ['name' => '结束时间', 'field' => 'end_time'], + '12' => ['name' => '交通费', 'field' => 'traffic'], + '13' => ['name' => '住宿费', 'field' => 'stay'], + '14' => ['name' => '餐饮费', 'field' => 'diet'], + '15' => ['name' => '其他费用', 'field' => 'other'], + '16' => ['name' => '合计', 'field' => 'money'], + '17' => ['name' => '费用明细描述', 'field' => 'description'], + '18' => ['name' => '关联业务', 'field' => 'relation'], + ]; + break; + case '6' : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '借款事由', 'field' => 'content'], + '6' => ['name' => '开始时间', 'field' => 'start_time'], + '7' => ['name' => '结束时间', 'field' => 'end_time'], + '8' => ['name' => '借款金额', 'field' => 'money'], + '9' => ['name' => '备注', 'field' => 'description'], + '10' => ['name' => '关联业务', 'field' => 'replyList'], + ]; + break; + default : + $field_list = [ + '0' => ['name' => '审批类型', 'field' => 'category_name'], + '1' => ['name' => '创建时间', 'field' => 'create_time'], + '2' => ['name' => '创建人', 'field' => 'realname'], + '3' => ['name' => '状态', 'field' => 'check_status_info'], + '4' => ['name' => '当前审批人', 'field' => 'examine_name'], + '5' => ['name' => '备注', 'field' => 'description'], + '6' => ['name' => '关联业务', 'field' => 'replyList'], + + ]; + } $file_name = 'oa_examine'; - $temp_file = $param['temp_file']; - unset($param['temp_file']); - $page = $param['page'] ?: 1; - $model = model('Examine'); - $field_list = array_merge_recursive($field_list1, $field_list); - - return $excelModel->batchExportCsv($file_name, $temp_file, $field_list, $page, function ($page, $limit) use ($model, $param, $field_list) { - $param['page'] = $page; - $param['limit'] = $limit; - $data = $model->getDataList($param); - // $newData['list'] = $model->exportHandle($data['page']['list'], $field_list, 'oa_examine'); - $newData['list'] = $data['page']['list']; - return $newData; - }); + return $excelModel->dataExportCsv($file_name, $field_list, $data); } - + /** * 审批数据 * @param $param @@ -65,9 +341,9 @@ class ExamineLogic extends Common $query->where('a.check_user_id', ['like', '%' . $user_id . '%'])->whereOr('a.flow_user_id', ['like', '%' . $user_id . '%']); }; } elseif ($param['status'] == 1) { - $where['a.check_status'] = ['in', [2,3]]; - $whereOr = function ($query) use ( $user_id) { - $query->where('a.check_user_id',['like', '%' . $user_id . '%'])->whereOr('a.flow_user_id', ['like', '%' . $user_id . '%']); + $where['a.check_status'] = ['in', [2, 3]]; + $whereOr = function ($query) use ($user_id) { + $query->where('a.check_user_id', ['like', '%' . $user_id . '%'])->whereOr('a.flow_user_id', ['like', '%' . $user_id . '%']); }; } elseif ($param['status'] == 3) { $where['a.check_status'] = ['lt', 5]; @@ -98,7 +374,7 @@ class ExamineLogic extends Common $list[$k]['customer_id_info']['customer_id'] = $v['customer_id']; $list[$k]['customer_id_info']['name'] = $v['customer_name']; $list[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']); - + } $dataCount = db('crm_contract') ->alias('a') @@ -135,7 +411,7 @@ class ExamineLogic extends Common $list[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']); $list[$k]['contract_id_info']['contract_id'] = $v['contract_id']; $list[$k]['contract_id_info']['name'] = $v['contract_name']; - + } break; case '3': @@ -153,7 +429,7 @@ class ExamineLogic extends Common ->select(); foreach ($list as $k => $v) { $list[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']); - + } $dataCount = db('crm_invoice') ->alias('a') @@ -162,13 +438,13 @@ class ExamineLogic extends Common ->where($whereOr) ->count(); break; - + } - + foreach ($list as $key => $v) { $list[$key]['create_time'] = date('Y-m-d H:i:s', $v['create_time']) ?: ''; } - + $data = []; $data['page']['list'] = $list; $data['page']['dataCount'] = $dataCount ?: 0; @@ -184,5 +460,5 @@ class ExamineLogic extends Common } return $data; } - + } \ No newline at end of file diff --git a/application/oa/logic/LogLogic.php b/application/oa/logic/LogLogic.php index 77f12a9..d2d023c 100644 --- a/application/oa/logic/LogLogic.php +++ b/application/oa/logic/LogLogic.php @@ -38,15 +38,8 @@ class LogLogic extends Common public function getDataList($request) { $userModel = new \app\admin\model\User(); - $structureModel = new \app\admin\model\Structure(); - $fileModel = new \app\admin\model\File(); $commonModel = new \app\admin\model\Comment(); - $BusinessModel = new \app\crm\model\Business(); - $ContactsModel = new \app\crm\model\Contacts(); - $ContractModel = new \app\crm\model\Contract(); - $CustomerModel = new \app\crm\model\Customer(); $recordModel = new \app\admin\model\Record(); - $user_id = $request['read_user_id']; $by = $request['by'] ?: ''; @@ -78,44 +71,39 @@ class LogLogic extends Common } $requestData = $this->requestData(); //获取权限范围内的员工 + //获取权限范围内的员工 $auth_user_ids = getSubUserId(); - if ($request['send_user_id'] && !in_array(trim(arrayToString($request['send_user_id']), ','), $auth_user_ids)) { - $map['log.create_user_id'] = $user_id; - } else { - if ($request['send_user_id'] && in_array(trim(arrayToString($request['send_user_id']), ','), $auth_user_ids)) { - $map['log.create_user_id'] = ['in', trim(arrayToString($request['send_user_id']), ',')]; - $map['log.send_user_ids'] = ['like', '%,' . $request['read_user_id'] . ',%']; - } else { - $dataWhere['user_id'] = $user_id; - $dataWhere['structure_id'] = $request['structure_id']; - $dataWhere['auth_user_ids'] = $auth_user_ids; - $logMap = ''; - switch ($by) { - case 'me' : - $map['log.create_user_id'] = $user_id; - break; - case 'other': - $logMap = function ($query) use ($dataWhere) { - $query->where('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%')) - ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%')); - }; - break; - default : - $logMap = function ($query) use ($dataWhere) { - $query->where('log.create_user_id', array('in', implode(',', $dataWhere['auth_user_ids']))) - ->whereOr('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%')) - ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%')); - }; - break; - } - } + $dataWhere['user_id'] = $user_id; + $dataWhere['structure_id'] = $request['structure_id']; + $dataWhere['auth_user_ids'] = $auth_user_ids; + $logMap = ''; + if ($request['send_user_id'] != '') { + $map['log.create_user_id'] = ['in', trim(arrayToString($request['send_user_id']), ',')]; + } + switch ($by) { + case 'me' : + $map['log.create_user_id'] = $user_id; + break; + case 'other': + $logMap = function ($query) use ($dataWhere) { + $query->where('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%')) + ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%')); + }; + break; + default : + $logMap = function ($query) use ($dataWhere) { + $query->where('log.create_user_id', array('in', implode(',', $dataWhere['auth_user_ids']))) + ->whereOr('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%')) + ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%')); + }; + break; } $list = Db::name('OaLog') ->where($map) + ->where($logMap) ->where($searchMap) ->alias('log') ->join('__ADMIN_USER__ user', 'user.id = log.create_user_id', 'LEFT') - ->page($request['page'], $request['limit']) ->field('log.*,user.realname') ->order('log.update_time desc') ->select(); @@ -651,11 +639,8 @@ class LogLogic extends Common /** * 销售简报跟进数量统计 - * @param $param - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\ModelNotFoundException - * @throws \think\exception\DbException + * + * @param $param 参数 */ public function activityCount($param) { @@ -665,17 +650,18 @@ class LogLogic extends Common if (empty($param['log_id'])) { $between_time = [$start_time['start_time'], $start_time['end_time']]; $map['create_time'] = array('between', $between_time); + $map['create_user_id'] =$user_id; } else { - $start_time = strtotime(date("Y-m-d", $item['create_time'])); $end_time = strtotime(date("Y-m-d H:i:s", $item['create_time'])); $between_time = [$start_time, $end_time]; $map['create_time'] = array('between', $between_time); + $map['create_user_id'] = $item['create_user_id']; } $map['status']=1; $typesList = ['1', '2', '3', '5', '6']; foreach ($typesList as $k => $v) { - $activityData = db('crm_activity')->where($map)->where(['create_user_id' => $item['create_user_id'], 'type' => 1, 'activity_type' => $v])->count(); + $activityData = db('crm_activity')->where($map)->where(['type' => 1, 'activity_type' => $v])->count(); if($v==1){ $arr[$k]['types'] ='crm_leads'; $arr[$k]['activity_type'] =1; @@ -693,7 +679,6 @@ class LogLogic extends Common $arr[$k]['activity_type'] =6; } $arr[$k]['dataCount'] = $activityData; - } $data = $arr; return $data; diff --git a/application/oa/logic/TaskLogic.php b/application/oa/logic/TaskLogic.php index 75fd869..d7851c1 100644 --- a/application/oa/logic/TaskLogic.php +++ b/application/oa/logic/TaskLogic.php @@ -15,8 +15,8 @@ class TaskLogic $userModel = new \app\admin\model\User(); $taskModel = new TaskModel(); $recordModel = new \app\admin\model\Record(); - $str = ','.$param['user_id'].','; - + $str = ',' . $param['user_id'] . ','; + //自定义时间 $map['t.stop_time'] = $param['dueDate'] ? strtotime($param['dueDate'] . ' +1 month -1 day') : ['>=', 0]; $search = $param['search']; @@ -34,14 +34,14 @@ class TaskLogic } else { $where['t.status'] = [['=', 1], ['=', 5], 'OR']; } - + if ($param['main_user_id']) { $where['t.main_user_id'] = $param['main_user_id']; } //项目id $priority = ($param['priority'] || $param['priority'] == '0') ? $param['priority'] : ['in', [0, 1, 2, 3]]; - $where['t.priority'] = $priority; - + $where['t.priority'] = $priority; + if ($param['work_id'] != 0) { $where['t.work_id'] = $param['work_id']; $taskList = db('task') @@ -56,9 +56,9 @@ class TaskLogic $where = []; $where['ishidden'] = 0; $where['pid'] = 0; - $where['whereStr'] = ' ( task.create_user_id =' . $param['user_id'] . ' or ( task.owner_user_id like "%,'.$param['user_id'].',%") or ( task.main_user_id = '.$param['user_id'].' ) )'; + $where['whereStr'] = ' ( task.create_user_id =' . $param['user_id'] . ' or ( task.owner_user_id like "%,' . $param['user_id'] . ',%") or ( task.main_user_id = ' . $param['user_id'] . ' ) )'; if (!empty($this->param['search'])) { - $where['taskSearch'] = ' and (task.name like "%'.$this->param['search'].'%" OR task.description like "%'.$this->param['search'].'%")'; + $where['taskSearch'] = ' and (task.name like "%' . $this->param['search'] . '%" OR task.description like "%' . $this->param['search'] . '%")'; } # 截止日期 $timeWhere = $this->getTimeParam($param['time_type']); @@ -76,12 +76,11 @@ class TaskLogic ->join('AdminUser u', 'u.id = t.main_user_id', 'LEFT') ->field('t.task_id,t.name as task_name,t.main_user_id,t.description,t.priority,t.stop_time,t.create_time,t.owner_user_id,t.start_time,t.create_user_id,u.realname as main_user_name,t.is_top') ->where($where) - ->where($whereStr) ->where($timeWhere) ->where($labelWhere) ->order('t.task_id desc') ->select(); - + } else { ///下属任务 if ($param['mold'] == 1) { @@ -96,21 +95,21 @@ class TaskLogic if ($type != 0) { switch ($type) { case '1' : - $type = 't.main_user_id in ('.$subStr.')'; + $type = 't.main_user_id in (' . $subStr . ')'; break; //下属负责的 case '3' : //使用正则查询 // SELECT * FROM 5kcrm_task WHERE owner_user_id REGEXP '(,1,|,2,|,3,)'; - $type = $subValue ? 't.owner_user_id REGEXP "('.$subValue.')"' : ''; + $type = $subValue ? 't.owner_user_id REGEXP "(' . $subValue . ')"' : ''; break; //下属参与的 } } else { if (!$subValue) { $type = 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . '))'; } else { - $type .= 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . ') or t.owner_user_id REGEXP "('.$subValue.')")'; + $type .= 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . ') or t.owner_user_id REGEXP "(' . $subValue . ')")'; } - } + } $map['t.pid'] = 0; $map['t.ishidden'] = 0; $taskList = Db::name('Task') @@ -121,12 +120,12 @@ class TaskLogic ) ->where(function ($query) use ($type) { $query->where($type); - }) + }) ->where($where) ->where($map) ->order('t.task_id desc') - ->select(); - } else { + ->select(); + } else { $map['t.pid'] = 0; // $map['t.work_id'] = 0; if ($type != 0) { @@ -135,15 +134,15 @@ class TaskLogic $type = 't.main_user_id =' . $param['user_id'] . ''; break; //我负责的 case '3' : - $type = 't.owner_user_id like "%,'.$param['user_id'].',%"'; + $type = 't.owner_user_id like "%,' . $param['user_id'] . ',%"'; break; //我参与的 } } else { $adminIds = $userModel->getAdminId(); - if (in_array($param['user_id'],$adminIds)) { - $type = 't.is_open = 1'; + if (in_array($param['user_id'], $adminIds)) { + $type = 't.is_open = 1'; } else { - $type = 't.is_open = 1 AND (t.main_user_id =' . $param['user_id'] .' OR t.owner_user_id like "%,'.$param['user_id'].',%")'; + $type = 't.is_open = 1 AND (t.main_user_id =' . $param['user_id'] . ' OR t.owner_user_id like "%,' . $param['user_id'] . ',%")'; } } $where['t.ishidden'] = 0; @@ -154,10 +153,9 @@ class TaskLogic ->where($where) ->where($type) ->where($map) - ->page($param['page'], $param['limit']) ->order('t.task_id desc') ->select(); - } + } } } foreach ($taskList as $key => $value) { @@ -185,7 +183,7 @@ class TaskLogic //创建时间 $taskList[$key]['create_time'] = $value['create_time'] ? date('Y-m-d H:i:s', $value['create_time']) : ''; //开始时间 - $taskList[$key]['start_time'] = $value['start_time'] ? date('Y-m-d H:i:s', $value['start_time']) : ''; + $taskList[$key]['start_time'] = $value['start_time'] ? date('Y-m-d H:i:s', $value['start_time']) : ''; //结束时间 $taskList[$key]['stop_time'] = $value['stop_time'] ? date('Y-m-d H:i:s', $value['stop_time']) : ''; //优先级 @@ -217,14 +215,14 @@ class TaskLogic } return $taskList; } - + /** * 任务导出 * @param $param */ public function excelExport($param) { - + $data = $this->getDataList($param); $excelModel = new \app\admin\model\Excel(); if ($param['work_id'] != 0) { @@ -280,7 +278,7 @@ class TaskLogic } return $excelModel->taskExportCsv($file_name, $field_list, $title, $data); } - + public function where($param) { $taskModel = new TaskModel(); @@ -289,11 +287,11 @@ class TaskLogic $workModel = new WorkModel(); $userModel = new \app\admin\model\User(); $work_id = $param['work_id'] ?: ''; - + if ($param['main_user_id']) { $map['t.main_user_id'] = ['in', $param['main_user_id']]; } - + //截止时间 if ($param['stop_time_type']) { if ($param['stop_time_type'] == '5') { //没有截至日期 @@ -326,7 +324,7 @@ class TaskLogic $map['t.stop_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } } - + if ($param['lable_id']) { $taskIds = []; $task_ids = []; @@ -339,7 +337,7 @@ class TaskLogic $lableWhere['ishidden'] = 0; $lableWhere['pid'] = 0; $lableWhere['is_archive'] = 0; - + $task_id = $taskModel->where($lableWhere)->column('task_id'); if ($task_id && $task_ids) { $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id))); @@ -349,12 +347,12 @@ class TaskLogic } $map['t.task_id'] = ['in', $task_ids]; } else { - + $map['t.task_id'] = $work_id; } return $map; } - + /** * 获取截止日期参数 * @param $type @@ -363,46 +361,46 @@ class TaskLogic private function getTimeParam($type) { $result = []; - + # 今天 if ($type == 1) { $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; } - + # 明天 if ($type == 2) { $tomorrow = date("Y-m-d 23:59:59", strtotime("+1 day")); $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime($tomorrow) . ')'; } - + # 本周 if ($type == 3) { $week = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y")); $result = '(task.stop_time > 0 AND task.stop_time <= ' . $week . ')'; } - + # 本月 if ($type == 4) { $month = mktime(23, 59, 59, date("m"), date("t"), date("Y")); $result = '(task.stop_time > 0 AND task.stop_time <= ' . $month . ')'; } - + # 未设置截止日期 if ($type == 5) { $result = $result = '(task.stop_time = 0)';; } - + # 已延期 if ($type == 6) { $result = '(task.status = 2 OR task.stop_time >= ' . time() . ')'; } - + # 今日更新 if ($type == 7) { $result = '(task.update_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.update_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; } - + return $result; } - + } \ No newline at end of file diff --git a/application/oa/logic/UserLogic.php b/application/oa/logic/UserLogic.php index 69e72bd..e0afcee 100644 --- a/application/oa/logic/UserLogic.php +++ b/application/oa/logic/UserLogic.php @@ -27,42 +27,49 @@ class UserLogic $initials_type = ($param['initials'] == 1) ? 1 : 2; $where['user.status'] = 1; if ($search) { - $where = function ($query) use ($search) { + $whereMap = function ($query) use ($search) { $query->where('user.realname', array('like', '%' . $search . '%')) ->whereOr('user.mobile', array('like', '%' . $search . '%')); }; } - if ($param['star_type'] == 1) { - $item = Db::name('crm_star')->where('user_id', $user_id)->column('target_id'); - $where['user.id'] = ['in', $item]; - } - if ($param['structure_id'] == '') { - $list = Db::name('admin_user') - ->alias('user') - ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') - ->where($where) - ->field('user.id,user.thumb_img,user.realname,user.post,structure.name as structure_name,user.mobile') - ->page($param['page'], $param['limit']) - ->select(); - - foreach ($list as $k => $v) { - $starWhere = ['user_id' => $user_id, 'target_id' => $v['id'], 'type' => 'admin_user']; - $star = Db::name('crm_star')->where($starWhere)->value('star_id'); - $list[$k]['thumb_img'] = $v['thumb_img'] ? getFullPath($v['thumb_img']) : ''; - $list[$k]['star'] = !empty($star) ? 1 : 0; + if($param['structure_id']){ + $where['user.id']= $param['structure_id']; + } + if (isset($param['star_type'])) { + if ($param['star_type'] == 1) { + $item = Db::name('crm_star')->where(['user_id'=>$user_id,'type'=>'admin_user'])->column('target_id'); + if(!empty($item)) { + $where['user.id'] = ['in', $item]; + $list = Db::name('admin_user') + ->alias('user') + ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') + ->where($where) + ->where($whereMap) + ->field('user.id,user.thumb_img,user.realname,user.post,structure.name as structure_name,user.mobile') + ->page($param['page'], $param['limit']) + ->select(); + foreach ($list as $k => $v) { + $starWhere = ['user_id' => $user_id, 'target_id' => $v['id'], 'type' => 'admin_user']; + $star = Db::name('crm_star')->where($starWhere)->value('star_id'); + $list[$k]['thumb_img'] = $v['thumb_img'] ? getFullPath($v['thumb_img']) : ''; + $list[$k]['star'] = !empty($star) ? 1 : 0; + } + $dataCount = Db::name('admin_user') + ->alias('user') + ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') + ->where($where) + ->count(); + $newarray = $this->groupByInitials($list, 'realname', $initials_type); + }else{ + return false; + } } - $dataCount = Db::name('admin_user') - ->alias('user') - ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') - ->where($where) - ->count(); - $newarray = $this->groupByInitials($list, 'realname', $initials_type); } else { $list = Db::name('admin_user') ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') ->where($where) - ->where('structure.id', $param['structure_id']) + ->where($whereMap) ->field('user.id,user.thumb_img,user.realname,user.post,structure.name as structure_name') ->page($param['page'], $param['limit']) ->select(); @@ -70,7 +77,6 @@ class UserLogic ->alias('user') ->join('__ADMIN_STRUCTURE__ structure', 'structure.id = user.structure_id', 'LEFT') ->where($where) - ->where('structure.id', $param['structure_id']) ->count(); foreach ($list as $k => $v) { $starWhere = ['user_id' => $user_id, 'target_id' => $v['id'], 'type' => 'admin_user']; diff --git a/application/oa/model/Event.php b/application/oa/model/Event.php index ba94c48..e28dbd3 100644 --- a/application/oa/model/Event.php +++ b/application/oa/model/Event.php @@ -30,7 +30,7 @@ class Event extends Common 'start_time' => 'timestamp', 'end_time' => 'timestamp', ]; - + /** * [getDataList 日程list] * @param [by] $by [查询时间段类型] @@ -42,7 +42,7 @@ class Event extends Common $userModel = new \app\admin\model\User(); $recordModel = new \app\admin\model\Record(); $user_id = $param['user_id']; - + //默认本账户or 自定义用户id if ($param['start_time'] && $param['end_time']) { $start_time = $param['start_time']; @@ -51,38 +51,35 @@ class Event extends Common $start_time = mktime(0, 0, 0, date('m'), 1, date('Y')); $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y')); } - + $where = '( ( start_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) ) OR ( ( end_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) ) OR ( start_time < ' . $start_time . ' AND end_time > ' . $end_time . ' AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) )'; $event_date = Db::name('OaEvent')->where($where)->select(); - - foreach ($event_date as $k => $v) { + foreach ($event_date as $k=>$v) { $event_date[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']); - $event_date[$k]['ownerList'] = $userModel->getDataByStr($v['owner_user_ids']) ?: []; - - $relationArr = []; + $event_date[$k]['ownerList'] = $userModel->getDataByStr($v['owner_user_ids']) ? : []; + + $relationArr= []; $relationArr = $recordModel->getListByRelationId('event', $v['event_id']); $event_date[$k]['businessList'] = $relationArr['businessList']; $event_date[$k]['contactsList'] = $relationArr['contactsList']; $event_date[$k]['contractList'] = $relationArr['contractList']; $event_date[$k]['customerList'] = $relationArr['customerList']; - $event_date[$k]['type'] = 'event'; + $event_date[$k]['remindtype'] = (int)$v['remindtype']; $noticeInfo = Db::name('OaEventNotice')->where(['event_id' => $v['event_id']])->find(); $is_repeat = 0; if ($noticeInfo) { $is_repeat = 1; } - $color = db('admin_oa_schedule')->where('schedule_id', $v['schedule_id'])->find(); - $event_date[$k]['color'] = $color['color']; $event_date[$k]['is_repeat'] = $is_repeat; $event_date[$k]['stop_time'] = $noticeInfo ? $noticeInfo['stop_time'] : ''; $event_date[$k]['noticetype'] = $noticeInfo ? $noticeInfo['noticetype'] : ''; if ($noticeInfo['noticetype'] == '2') { - $event_date[$k]['repeat'] = $noticeInfo['repeated'] ? explode('|||', $noticeInfo['repeated']) : []; + $event_date[$k]['repeat'] = $noticeInfo['repeated'] ? explode('|||',$noticeInfo['repeated']) : []; } else { - $event_date[$k]['repeat'] = ''; + $event_date[$k]['repeat'] = ''; } //权限 $is_update = 0; @@ -93,17 +90,15 @@ class Event extends Common } $permission['is_update'] = $is_update; $permission['is_delete'] = $is_delete; - $event_date[$k]['permission'] = $permission; - + $event_date[$k]['permission'] = $permission; $event_date[$k]['start_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null; $event_date[$k]['end_time'] = !empty($v['end_time']) ? $v['end_time'] * 1000 : null; - + $event_date[$k]['type_id'] = $v['schedule_id']; } - - return $event_date ?: []; + return $event_date ? : []; } - + /** * 系统自定义类型数据(任务) * @@ -116,7 +111,7 @@ class Event extends Common public function eventTask($param) { $user_id = $param['user_id']; - + // 默认本账户or 自定义用户id if ($param['start_time'] && $param['end_time']) { $start_time = $param['start_time']; @@ -129,7 +124,7 @@ class Event extends Common '((stop_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%")) OR ((stop_time > ' . $start_time . ' AND stop_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%")) OR ((stop_time > ' . $start_time . ' AND stop_time >' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%"))'; - + //分配的任务 负责人或参与人是当前用户 $event_date = db('task')->where(['stop_time' => ['>', 0], 'ishidden' => ['=', 0]])->where($between_time) ->field('task_id,name,start_time,stop_time')->select(); @@ -142,7 +137,7 @@ class Event extends Common } return $event_date; } - + /** * 系统自定义类型数据(客户) * @@ -157,8 +152,8 @@ class Event extends Common $userModel = new \app\admin\model\User(); $recordModel = new \app\admin\model\Record(); $user_id = $param['user_id']; - - + + //默认本账户or 自定义用户id if ($param['start_time'] && $param['end_time']) { $start_time = $param['start_time']; @@ -174,7 +169,7 @@ class Event extends Common $between_time = '((next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ')) OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id =' . $user_id . ')) OR ((next_time > ' . $start_time . ' AND next_time > ' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . '))'; - $event_date = db('crm_customer')->where(['next_time'=> ['>', 0],'owner_user_id'=>['<>',0]])->where($between_time)->where('') + $event_date = db('crm_customer')->where(['next_time' => ['>', 0], 'owner_user_id' => ['<>', 0]])->where($between_time)->where('') ->field('next_time as start_time,customer_id,name ')->group('start_time')->select(); $item = []; foreach ($event_date as $k2 => $v) { @@ -233,10 +228,10 @@ class Event extends Common $event_date[$k4]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null; $item[] = $v['start_time'] ? $v['start_time'] : ''; } - + $list_data['receivables'] = $item ? array_values(array_unique($item)) : []; //需联系的线索 next_time - + $between_time = '(( next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ')AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' )) OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' )) @@ -256,14 +251,14 @@ class Event extends Common $event_date[$k5]['stop_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null; $item[] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : ''; } - + $list_data['leads'] = $item ? array_values(array_unique($item)) : []; //需联系的商机 next_time $between_time = '((next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' )) OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' )) OR ((next_time > ' . $start_time . ' AND next_time >' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))'; - + $event_date = db('crm_business')->where($between_time)->where('next_time', '>', 0)->field('next_time as start_time,business_id,name ')->select(); unset($item); foreach ($event_date as $k6 => $v) { @@ -273,10 +268,10 @@ class Event extends Common $event_date[$k6]['start_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null; $event_date[$k6]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null; $item[] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : ''; - + } $list_data['businessNext'] = $item ? array_values(array_unique($item)) : []; - + //需要联系的客户 next_time crm_customer $return_time = date('Y-m-d', $start_time); $return_end = date('Y-m-d', $end_time); @@ -292,7 +287,7 @@ class Event extends Common ->field('deal_date as start_time,business_id,name') ->group('start_time') ->select(); - + unset($item); foreach ($event_date as $k7 => $v) { $event_date[$k7]['color'] = 7; @@ -305,7 +300,7 @@ class Event extends Common $list_data['business'] = $item ? array_values(array_unique($item)) : []; return $list_data ?: []; } - + /** * 日历上显示 * @return array @@ -316,7 +311,7 @@ class Event extends Common public function listStatus($param) { $userId = $param['user_id']; - + if ($param['start_time'] && $param['end_time']) { $start_time = $param['start_time']; $end_time = $param['end_time']; @@ -324,7 +319,7 @@ class Event extends Common $start_time = mktime(0, 0, 0, date('m'), 1, date('Y')); $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y')); } - + $list = Db::name('oa_event')->where(['end_time' => ['>', 0], 'start_time' => ['>', 0]]) ->where(function ($query) use ($userId) { $query->whereOr('create_user_id', $userId); @@ -336,7 +331,7 @@ class Event extends Common } return $list; } - + /** * 类型列表 * @return array|void @@ -367,7 +362,7 @@ class Event extends Common $data['list'] = $list; return $data; } - + /** * 修改展示类型 * @param $param @@ -395,11 +390,11 @@ class Event extends Common ->whereIn('schedule_id', arrayToString($param['schedule_id'])) ->update(['type' => 1]); } - + } else { db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->insert(['schedule_id' => $v, 'user_id' => $param['user_id'], 'type' => 1, 'create_time' => time()]); } - + } else { db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->insert(['schedule_id' => $v, 'user_id' => $param['user_id'], 'type' => 1, 'create_time' => time()]); } @@ -407,7 +402,7 @@ class Event extends Common $data = []; return $data; } - + /** * 创建日程信息 * @@ -428,27 +423,27 @@ class Event extends Common $param['create_time'] = time(); $param['update_time'] = time(); unset($param['user_id']); - + # 关联数据 $relation = []; if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']); if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']); if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']); if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']); - + # 提醒数据 $notice = $param['notice']; - + # 删除多余字段 unset($param['customer_ids']); unset($param['contacts_ids']); unset($param['business_ids']); unset($param['contract_ids']); unset($param['notice']); - + if ($this->allowField(true)->save($param)) { $eventId = $this->event_id; - + # 提醒 if (!empty($notice)) { $noticeData = []; @@ -467,18 +462,18 @@ class Event extends Common } if (!empty($noticeData)) Db::name('oa_event_notice')->insertAll($noticeData); } - + # 关联数据 if (!empty($relation)) { $relation['event_id'] = $eventId; $relation['status'] = 1; $relation['create_time'] = time(); - + Db::name('oa_event_relation')->insert($relation); } - + actionLog($eventId, $param['owner_user_ids'], '', '创建了日程'); - + $data['event_id'] = $eventId; // 站内信 $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select(); @@ -500,18 +495,18 @@ class Event extends Common ], stringToArray($param['owner_user_ids']) ); - + } - + return $data; } else { $this->error = '添加失败'; return false; } - - + + } - + /** * 即将到期合同列表 * @param $param @@ -562,13 +557,13 @@ class Event extends Common $event_date[$k]['return_date'] = $v['return_date'] ? $v['return_date'] : null; } } - + $data = []; $data['list'] = $event_date; $data['countData'] = $count; return $data; } - + /** * 续联系客户 * @param $param @@ -605,7 +600,7 @@ class Event extends Common $data['countData'] = $count; return $data; } - + /** * 续联系客户 * @param $param @@ -642,7 +637,7 @@ class Event extends Common $data['countData'] = $count; return $data; } - + /** * 计划回款 * @param $param @@ -659,7 +654,7 @@ class Event extends Common //需要联系的客户 next_time crm_customer $between_time['business.next_time'] = ['between', [$return_time, $return_end]]; $between_time['business.create_user_id|business.owner_user_id'] = ['eq', $user_id]; - + $event_date = db('crm_business') ->alias('business') ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT') @@ -682,7 +677,7 @@ class Event extends Common $data['countData'] = $count; return $data; } - + /** * 预计成交商机 * @param $param @@ -719,7 +714,7 @@ class Event extends Common $data['countData'] = $count; return $data; } - + /** * 公共时间处理 * @param $param @@ -728,8 +723,8 @@ class Event extends Common { $userModel = new \app\admin\model\User(); $recordModel = new \app\admin\model\Record(); - - + + //默认本账户or 自定义用户id if ($param['start_time'] && $param['end_time']) { $start_time = $param['start_time']; @@ -744,7 +739,7 @@ class Event extends Common $data = [$start_time, $end_time]; return $data; } - + /** * 编辑日程信息 * @@ -776,35 +771,35 @@ class Event extends Common $param['end_time'] = !empty($param['end_time']) ? strtotime($param['end_time']) : $todayTime[1]; $param['update_time'] = time(); unset($param['user_id']); - + # 关联数据 $relation = []; if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']); - if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['customer_ids']); - if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['customer_ids']); - if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['customer_ids']); - - + if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']); + if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']); + if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']); + + # 提醒数据 $notice = $param['notice']; - + # 删除多余字段 unset($param['customer_ids']); unset($param['contacts_ids']); unset($param['business_ids']); unset($param['contract_ids']); unset($param['notice']); - + if ($this->allowField(true)->save($param, ['event_id' => $event_id])) { $eventId = $this->event_id; actionLog($event_id, $param['owner_user_ids'], '', '修改了日程'); $list = db('oa_event_notice')->where('event_id', $eventId)->select(); - $item = Db::name('OaEventNotice')->where(['event_id' => $eventId])->delete(); - if (!$item) { + if ($list) { foreach ($list as $k => $v) { Db::name('admin_message')->where(['type' => 9, 'action_id' => $v['id']])->delete(); } } + $item = Db::name('OaEventNotice')->where(['event_id' => $eventId])->delete(); # 提醒 if (!empty($notice)) { $noticeData = []; @@ -813,7 +808,7 @@ class Event extends Common if ($value['type'] == 1) $startTime = $param['start_time'] - ($value['number'] * 60); if ($value['type'] == 2) $startTime = $param['start_time'] - ($value['number'] * 60 * 60); if ($value['type'] == 3) $startTime = $param['start_time'] - ($value['number'] * 60 * 60 * 24); - + $noticeData[] = [ 'event_id' => $eventId, 'noticetype' => $value['type'], @@ -822,47 +817,54 @@ class Event extends Common 'stop_time' => $param['end_time'] ]; } - if (!empty($noticeData)) Db::name('oa_event_notice')->insertAll($noticeData); - } - - if (!$item) { - $item = Db::name('OaEventNotice')->where('event_id', $eventId)->select(); - foreach ($item as $val) { - if ($value['noticetype'] == '1') { //分 - $dd = strtotime($param['start_time']) - ($val['number'] * 60); - } else if ($val['noticetype'] == '2') { //时 - $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60); - } else if ($val['noticetype'] == '3') {//天 - $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60 * 24); + if (!empty($noticeData)) { + $item = Db::name('oa_event_notice')->insertAll($noticeData); + if ($item) { + + $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select(); + foreach ($item as $val) { + if ($value['noticetype'] == '1') { //分 + $dd = strtotime($param['start_time']) - ($val['number'] * 60); + } else if ($val['noticetype'] == '2') { //时 + $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60); + } else if ($val['noticetype'] == '3') {//天 + $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60 * 24); + } + // 站内信 + (new Message())->send( + Message::EVENT_MESSAGE, + [ + 'title' => $param['title'], + 'action_id' => $val['id'], + 'advance_time' => $dd ?: 0 + ], + stringToArray($param['owner_user_ids']) + ); + + } } - // 站内信 - (new Message())->send( - Message::EVENT_MESSAGE, - [ - 'title' => $param['title'], - 'action_id' => $val['id'], - 'advance_time' => $dd ?: 0 - ], - array_diff(stringToArray($param['owner_user_ids']), stringToArray($dataInfo['owner_user_ids'])) - ); - } } - $data['event_id'] = $event_id; - Db::name('OaEventRelation')->where(['event_id' => $event_id])->update([ - 'customer_ids' => trim($relation['customer_ids'], ','), - 'contacts_ids' => trim($relation['contacts_ids'], ','), - 'business_ids' => trim($relation['business_ids'], ','), - 'contract_ids' => trim($relation['contract_ids'], ','), - ]); + + $data['event_id'] = $event_id; + if (Db::name('OaEventRelation')->where(['event_id' => $event_id])->find()) { + Db::name('OaEventRelation')->where(['event_id' => $event_id])->update($relation); + } else { + if (!empty($relation)) { + $relation['event_id'] = $eventId; + $relation['status'] = 1; + $relation['create_time'] = time(); + Db::name('OaEventRelation')->where(['event_id' => $event_id])->insert($relation); + } + } return $data; } else { $this->error = '编辑失败'; return false; } } - + /** * 日程数据 * @@ -876,25 +878,25 @@ class Event extends Common { # 日程数据 $eventData = Db::name('oa_event')->where('event_id', $eventId)->find(); - + # 颜色类型 $eventData['color'] = Db::name('admin_oa_schedule')->where('schedule_id', $eventData['schedule_id'])->value('color'); - + # 创建人信息 $eventData['create_user_name'] = Db::name('admin_user')->where('id', $eventData['create_user_id'])->value('realname'); - + # 参与人信息 $eventData['owner_user_info'] = Db::name('admin_user')->field(['id', 'realname'])->whereIn('id', trim($eventData['owner_user_ids'], ','))->select(); - + # 处理日程的日期数据 $eventData['start_time'] = !empty($eventData['start_time']) ? date('Y-m-d H:i:s', $eventData['start_time']) : ''; $eventData['end_time'] = !empty($eventData['end_time']) ? date('Y-m-d H:i:s', $eventData['end_time']) : ''; $eventData['create_time'] = !empty($eventData['create_time']) ? date('Y-m-d H:i:s', $eventData['create_time']) : ''; $eventData['update_time'] = !empty($eventData['update_time']) ? date('Y-m-d H:i:s', $eventData['update_time']) : ''; - + # 日程提醒数据 $noticeData = Db::name('oa_event_notice')->where('event_id', $eventId)->select(); - + # 整理日程提醒数据 $eventData['notice'] = []; foreach ($noticeData as $key => $value) { @@ -903,10 +905,10 @@ class Event extends Common 'value' => $value['number'] ]; } - + # 关联客户数据 $relationData = Db::name('oa_event_relation')->where('event_id', $eventId)->find(); - + # 关联的客户数据 $eventData['customer'] = []; if (!empty($relationData['customer_ids'])) { @@ -927,10 +929,10 @@ class Event extends Common if (!empty($relationData['contract_ids'])) { $eventData['contract'] = Db::name('crm_contract')->field(['contract_id', 'name'])->whereIn('contract_id', trim($relationData['contract_ids'], ','))->select(); } - + return $eventData; } - + //根据ID 删除日程 public function delDataById($param) { @@ -939,12 +941,12 @@ class Event extends Common $this->error = '数据不存在或已删除'; return false; } - + if ($dataInfo['create_user_id'] != $param['user_id']) { $this->error = '没有编辑权限'; return false; } - + $map['event_id'] = $param['event_id']; $map['create_user_id'] = $param['user_id']; $flag = $this->where($map)->delete(); diff --git a/application/oa/model/Examine.php b/application/oa/model/Examine.php index 4fea8f2..cd7d764 100644 --- a/application/oa/model/Examine.php +++ b/application/oa/model/Examine.php @@ -23,8 +23,8 @@ class Examine extends Common protected $createTime = 'create_time'; protected $updateTime = 'update_time'; protected $autoWriteTimestamp = true; - private $statusArr = ['待审核','审核中','审核通过','已拒绝','已撤回']; - + private $statusArr = ['待审核', '审核中', '审核通过', '已拒绝', '已撤回']; + /** * [getDataList 审批list] * @param [string] $map [查询条件] @@ -38,11 +38,13 @@ class Examine extends Common $userModel = new \app\admin\model\User(); $fileModel = new \app\admin\model\File(); $recordModel = new \app\admin\model\Record(); - + $examine_by = $request['examine_by']; //1待我审批 2我已审批 all 全部 $user_id = $request['user_id']; + $bi = $request['bi_types']; $check_status = $request['check_status']; //0 待审批 2 审批通过 4 审批拒绝 all 全部 unset($request['by']); + unset($request['bi_types']); unset($request['user_id']); unset($request['check_status']); unset($request['examine_by']); @@ -56,8 +58,8 @@ class Examine extends Common } unset($map['search']); //审批类型 - $map['examine.category_id'] = $map['examine.category_id'] ? : array('gt', 0); - + $map['examine.category_id'] = $map['examine.category_id'] ?: array('gt', 0); + $map_str = ''; $logmap = ''; switch ($examine_by) { @@ -71,7 +73,9 @@ class Examine extends Common $map['check_user_id'] = [['like', '%,' . $user_id . ',%']]; break; //待审 case '2' : - $map['flow_user_id'] = [['like', '%,' . $user_id . ',%'], ['eq', $user_id], 'or']; + $map_str = "(( check_user_id LIKE '%," . $user_id . ",%' OR check_user_id = " . $user_id . " ) + OR ( flow_user_id LIKE '%," . $user_id . ",%' OR `flow_user_id` = " . $user_id . " ) )"; +// $map['flow_user_id'] = [['like', '%,' . $user_id . ',%'], ['eq', $user_id], 'or']; break; //已审 default: $map['examine.create_user_id'] = $user_id; @@ -85,9 +89,9 @@ class Examine extends Common $map['examine.create_time'] = array('between', array($start_time, $end_time)); } unset($map['examine.between_time']); - + //审核状态 0 待审批 2 审批通过 4 审批拒绝 all 全部 - if ($check_status) { + if (isset($check_status)) { if ($check_status == 'all') { $map['examine.check_status'] = ['egt', 0]; if (isSuperAdministrators($user_id)) { @@ -95,13 +99,20 @@ class Examine extends Common } } elseif ($check_status == 4) { $map['examine.check_status'] = ['eq', 3]; + } elseif ($check_status == 0) { + $map['examine.check_status'] = ['<=', 1]; } else { $map['examine.check_status'] = $check_status; - } - } else { - $map['examine.check_status'] = ['egt', 0]; + } + }else{ + if ($examine_by == 'all') { + $map['examine.check_status'] = ['egt', 0]; + } elseif ($examine_by == 1) { + $map['examine.check_status'] = ['elt', 1]; + } elseif($examine_by == 2) { + $map['examine.check_status'] = ['egt', 2]; + } } - $join = [ ['__ADMIN_USER__ user', 'user.id = examine.create_user_id', 'LEFT'], ['__OA_EXAMINE_CATEGORY__ examine_category', 'examine_category.category_id = examine.category_id', 'LEFT'], @@ -111,7 +122,7 @@ class Examine extends Common ->where($map_str) ->where($map) ->join($join); - + $list = $list_view ->page($request['page'], $request['limit']) ->field('examine.*,user.realname,user.thumb_img,examine_category.title as category_name,examine_category.category_id as examine_config,examine_category.icon as examineIcon') @@ -123,7 +134,7 @@ class Examine extends Common ->join($join) ->count('examine_id'); $admin_user_ids = $userModel->getAdminId(); - + foreach ($list as $k => $v) { $list[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']); $causeCount = 0; @@ -131,10 +142,10 @@ class Examine extends Common $duration = $v['duration'] ?: '0.0'; $money = $v['money'] ?: '0.00'; if (in_array($v['category_id'], ['3', '5'])) { - $causeCount = db('oa_examine_travel')->where(['examine_id' => $v['examine_id']])->count() ? : 0; + $causeCount = db('oa_examine_travel')->where(['examine_id' => $v['examine_id']])->count() ?: 0; if ($v['category_id'] == 3) $causeTitle = $causeCount . '个行程,共' . $duration . '天'; if ($v['category_id'] == 5) $causeTitle = $causeCount . '个报销事项,共' . $money . '元'; - + //附件 $fileList = []; $imgList = []; @@ -152,11 +163,11 @@ class Examine extends Common } $list[$k]['fileList'] = $fileList ?: []; $list[$k]['imgList'] = $imgList ?: []; - + } $list[$k]['causeTitle'] = $causeTitle; - $list[$k]['causeCount'] = $causeCount ? : 0; - + $list[$k]['causeCount'] = $causeCount ?: 0; + //关联业务 $relationArr = []; $relationArr = $recordModel->getListByRelationId('examine', $v['examine_id']); @@ -164,7 +175,7 @@ class Examine extends Common $list[$k]['contactsList'] = $relationArr['contactsList']; $list[$k]['contractList'] = $relationArr['contractList']; $list[$k]['customerList'] = $relationArr['customerList']; - + //附件 $fileList = []; $imgList = []; @@ -182,7 +193,7 @@ class Examine extends Common } $list[$k]['fileList'] = $fileList ?: []; $list[$k]['imgList'] = $imgList ?: []; - + //创建人或管理员有撤销权限 $permission = []; $is_recheck = 0; @@ -195,7 +206,7 @@ class Examine extends Common $is_recheck = 1; } } - + //创建人(失败、撤销状态时可编辑) if ($v['create_user_id'] == $user_id && in_array($v['check_status'], ['3', '4'])) { $is_update = 1; @@ -210,25 +221,25 @@ class Examine extends Common if ($examineFlowData['config'] == 1) { //固定审批流 $examineStepModel = new \app\admin\model\ExamineStep(); - $nextStepData = $examineStepModel->nextStepUser($user_id, $examineFlowData['flow_id'], 'oa_examine', 0, 0, 0); - $is_check = $nextStepData['next_user_ids'] ? 1 : 0; +// $nextStepData = $examineStepModel->nextStepUser($user_id, $examineFlowData['flow_id'], 'oa_examine', 0, 0, 0); + $is_check = in_array($user_id, stringToArray($v['check_user_id'])) && in_array($v['check_status'], [0, 1]) ? 1 : 0; $is_end = 1; } else { $is_end = 0; - if ($v['check_user_id'] == (',' . $user_id . ',')) { + if ($v['check_user_id'] == (',' . $user_id . ',') && in_array($v['check_status'], [0, 1])) { $is_check = 1; - }else{ + } else { $is_check = 0; } - } - if ($v['last_user_id'] == 0) { - $user_name = $userModel->getListByStr(stringToArray($v['check_user_id'])); - $list[$k]['examine_name'] = $user_name[0]['realname']; - } else { - $user_name = $userModel->getListByStr(stringToArray($v['last_user_id'])); - $list[$k]['examine_name'] = $user_name[0]['realname']; } - + if($v['check_status']==4){ + $usernames = db('admin_user')->whereIn('id', stringToArray($user_id))->column('realname'); + }else{ + $usernames = db('admin_user')->whereIn('id', stringToArray($v['check_user_id']))->column('realname'); + } + + $list[$k]['examine_name'] = implode($usernames, ','); + $permission['is_check'] = $is_check; $permission['is_delete'] = $is_delete; $permission['is_recheck'] = $is_recheck; @@ -236,12 +247,13 @@ class Examine extends Common $list[$k]['permission'] = $permission; $list[$k]['config'] = $is_end; $list[$k]['check_status_info'] = $this->statusArr[(int)$v['check_status']]; - $list[$k]['create_time'] = date('Y-m-d H:i:s', $v['create_time']); + $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null; + $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null; } $data = []; $data['page']['list'] = $list; $data['page']['dataCount'] = $dataCount ?: 0; - + if ($request['page'] != 1 && (int)($request['page'] * $request['limit']) >= (int)$dataCount) { $data['page']['firstPage'] = false; $data['page']['lastPage'] = true; @@ -254,7 +266,7 @@ class Examine extends Common } return $data; } - + /** * 创建审批信息 * @param @@ -279,9 +291,9 @@ class Examine extends Common $this->error = $validate->getError(); return false; } - + $categoryInfo = $examineCategoryModel->getDataById($param['category_id']); - + $fileArr = $param['file_id']; //接收表单附件 unset($param['file_id']); $param['start_time'] = $param['start_time'] ? strtotime($param['start_time']) : 0; @@ -309,7 +321,7 @@ class Examine extends Common $rdata['status'] = 1; $rdata['create_time'] = time(); Db::name('OaExamineRelation')->insert($rdata); - + //处理差旅相关 $resTravel = true; if (in_array($param['category_id'], ['3', '5']) && $param['cause']) { @@ -329,11 +341,11 @@ class Examine extends Common ], $send_user_id ); - - + + $data = []; $data['examine_id'] = $this->examine_id; - + # 添加活动记录 if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) { Db::name('crm_activity')->insert([ @@ -350,7 +362,7 @@ class Examine extends Common 'contract_ids' => !empty($rdata['contract_ids']) ? trim($rdata['contract_ids'], ',') : '', ]); } - + return $data; } else { $this->error = $examineDataModel->getError(); @@ -361,7 +373,7 @@ class Examine extends Common return false; } } - + /** * 编辑审批信息 * @@ -387,14 +399,14 @@ class Examine extends Common $this->error = '数据不存在或已删除'; return false; } - + //过滤不能修改的字段 $unUpdateField = ['create_user_id', 'is_deleted', 'delete_time']; foreach ($unUpdateField as $v) { unset($param[$v]); } $categoryInfo = $examineCategoryModel->getDataById($dataInfo['category_id']); - + //验证 $fieldModel = new \app\admin\model\Field(); $validateArr = $fieldModel->validateField($this->name, $dataInfo['category_id']); //获取自定义字段验证规则 @@ -404,7 +416,7 @@ class Examine extends Common $this->error = $validate->getError(); return false; } - + $fileArr = $param['file_id']; //接收表单附件 unset($param['file_id']); $param['start_time'] = $param['start_time'] ? strtotime($param['start_time']) : 0; @@ -422,7 +434,7 @@ class Examine extends Common return false; } } - + //站内信 $send_user_id = stringToArray($param['check_user_id']); if ($send_user_id) { @@ -435,7 +447,7 @@ class Examine extends Common $send_user_id ); } - + //相关业务 $rdata = []; $rdata['customer_ids'] = $param['oaExamineRelation']['customer_ids'] ? arrayToString($param['oaExamineRelation']['customer_ids']) : []; @@ -443,7 +455,7 @@ class Examine extends Common $rdata['business_ids'] = $param['oaExamineRelation']['business_ids'] ? arrayToString($param['oaExamineRelation']['business_ids']) : []; $rdata['contract_ids'] = $param['oaExamineRelation']['contract_ids'] ? arrayToString($param['oaExamineRelation']['contract_ids']) : []; Db::name('OaExamineRelation')->where('examine_id = ' . $examine_id)->update($rdata); - + //处理差旅相关 $resTravel = true; if (in_array($dataInfo['category_id'], ['3', '5']) && $param['cause']) { @@ -465,10 +477,10 @@ class Examine extends Common $send_user_id ); } - + $data = []; $data['examine_id'] = $examine_id; - + # 删除活动记录 Db::name('crm_activity')->where(['activity_type' => 9, 'activity_type_id' => $examine_id])->delete(); # 添加活动记录 @@ -487,7 +499,7 @@ class Examine extends Common 'contract_ids' => !empty($rdata['contract_ids']) ? trim($rdata['contract_ids'], ',') : '', ]); } - + return $data; } else { $this->error = $examineDataModel->getError(); @@ -498,7 +510,7 @@ class Examine extends Common return false; } } - + /** * 审批数据 * @param $id 审批ID @@ -516,7 +528,7 @@ class Examine extends Common ->where($map) ->alias('examine') ->join('__OA_EXAMINE_CATEGORY__ examine_category', 'examine_category.category_id = examine.category_id', 'LEFT'); - + $dataInfo = $data_view ->field('examine.*,examine_category.title as category_name,examine_category.icon as examineIcon') ->find(); @@ -534,7 +546,7 @@ class Examine extends Common // foreach ($fieldList as $k=>$v) { // $dataInfo[$v] = $fieldModel->getFormValueByField($v, $dataInfo[$v]); // } - + //关联业务 $relationArr = []; $relationArr = $recordModel->getListByRelationId('examine', $id); @@ -542,7 +554,7 @@ class Examine extends Common $dataInfo['contactsList'] = $relationArr['contactsList']; $dataInfo['contractList'] = $relationArr['contractList']; $dataInfo['customerList'] = $relationArr['customerList']; - + $travelList = []; if (in_array($dataInfo['category_id'], ['3', '5'])) { //行程、费用明细 @@ -574,7 +586,7 @@ class Examine extends Common } } $dataInfo['travelList'] = $travelList; - + //附件 $fileList = []; $imgList = []; @@ -596,7 +608,7 @@ class Examine extends Common $dataInfo['examine_id'] = $id; return $dataInfo; } - + /** * 审批差旅数据保存 * @param examine_id 审批ID @@ -615,7 +627,7 @@ class Examine extends Common unset($v['files']); $newData = $v; $newData['examine_id'] = $examine_id; - + $fileArr = $v['file_id']; //接收表单附件 unset($newData['file_id']); unset($newData['fileList']); @@ -643,7 +655,7 @@ class Examine extends Common } return true; } - + /** * 审批差旅数据编辑 * @param examine_id 审批ID @@ -657,7 +669,7 @@ class Examine extends Common } $oldTravelIds = db('oa_examine_travel')->where(['examine_id' => $examine_id])->column('travel_id'); $oldTravelFileIds = db('oa_examine_travel_file')->where(['travel_id' => ['in', $oldTravelIds]])->column('r_id'); - + $successRes = true; foreach ($data as $k => $v) { $newData = []; diff --git a/application/oa/model/Log.php b/application/oa/model/Log.php index ba09500..ff15ff1 100644 --- a/application/oa/model/Log.php +++ b/application/oa/model/Log.php @@ -23,7 +23,7 @@ class Log extends Common protected $createTime = 'create_time'; protected $updateTime = 'update_time'; protected $autoWriteTimestamp = true; - + /** * [getDataList 日志list] * @param [string] $map [查询条件] @@ -39,10 +39,10 @@ class Log extends Common $fileModel = new \app\admin\model\File(); $commonModel = new \app\admin\model\Comment(); $recordModel = new \app\admin\model\Record(); - + $user_id = $request['read_user_id']; $by = $request['by'] ?: ''; - + $map = []; $search = $request['search']; if (isset($request['search']) && $request['search']) { @@ -138,7 +138,7 @@ class Log extends Common $list[$k]['contactsList'] = $relationArr['contactsList']; $list[$k]['contractList'] = $relationArr['contractList']; $list[$k]['customerList'] = $relationArr['customerList']; - + if ($v['is_relation'] == 1) { $list[$k]['bulletin']['customerNum'] = $v['save_customer']; $list[$k]['bulletin']['businessNum'] = $v['save_business']; @@ -148,7 +148,7 @@ class Log extends Common } else { $list[$k]['bulletin'] = 0; } - + $is_update = 0; $is_delete = 0; //3天内的日志可删,可修改 @@ -183,11 +183,11 @@ class Log extends Common $data['page']['firstPage'] = true; $data['page']['lastPage'] = false; } - + return $data; } - - + + // 创建日志信息 public function createData($param) { @@ -209,7 +209,7 @@ class Log extends Common foreach ($arr as $value) { unset($param[$value]); } - + if ($param['category_id'] == 1) { $param['title'] = date('Y-m-d') . '-日报'; } else if ($param['category_id'] == 2) { @@ -217,7 +217,7 @@ class Log extends Common } else if ($param['category_id'] == 3) { $param['title'] = date('Y-m-d') . '-月报'; } - + if ($this->data($param)->allowField(true)->save()) { $log_id = $this->log_id; //操作记录 @@ -231,7 +231,7 @@ class Log extends Common return false; } } - + $temp = User::where(['structure_id' => ['in', $param['send_structure_ids']]])->column('id'); (new Message())->send( Message::LOG_SEND, @@ -245,7 +245,7 @@ class Log extends Common $data = []; $data['log_id'] = $log_id; $data = $param; - + if (count($fileArr)) { $fileList = Db::name('AdminFile')->where('file_id in (' . implode(',', $fileArr) . ')')->select(); foreach ($fileList as $k => $v) { @@ -258,20 +258,20 @@ class Log extends Common //发送部门 $data['sendStructureList'] = $param['send_structure_ids'] ? $userModel->getListByStr($param['send_structure_ids']) : []; $data['log_id'] = $log_id; - + $rdata['log_id'] = $log_id; $rdata['status'] = 1; $rdata['create_time'] = time(); //关联业务 Db::name('OaLogRelation')->insert($rdata); - + //相关业务 $relationArr = $recordModel->getListByRelationId('log', $log_id); $data['businessList'] = $relationArr['businessList']; $data['contactsList'] = $relationArr['contactsList']; $data['contractList'] = $relationArr['contractList']; $data['customerList'] = $relationArr['customerList']; - + # 添加活动记录 if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) { Db::name('crm_activity')->insert([ @@ -288,14 +288,14 @@ class Log extends Common 'contract_ids' => !empty($rdata['contract_ids']) ? trim($rdata['contract_ids'], ',') : '', ]); } - + return $data; } else { $this->error = '添加失败'; return false; } } - + /** * 编辑日志信息 * @param @@ -318,7 +318,7 @@ class Log extends Common $rdata['contacts_ids'] = $param['contacts_ids'] ? arrayToString($param['contacts_ids']) : ''; $rdata['business_ids'] = $param['business_ids'] ? arrayToString($param['business_ids']) : ''; $rdata['contract_ids'] = $param['contract_ids'] ? arrayToString($param['contract_ids']) : ''; - + $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids']; foreach ($arr as $value) { unset($param[$value]); @@ -332,7 +332,7 @@ class Log extends Common unset($param['file']); $param['send_user_ids'] = $param['send_user_ids'] ? arrayToString($param['send_user_ids']) : ''; $param['send_structure_ids'] = $param['send_structure_ids'] ? arrayToString($param['send_structure_ids']) : ''; - + if ($this->allowField(true)->save($param, ['log_id' => $log_id])) { //操作日志 Db::name('AdminActionLog')->where(['action_id' => $log_id])->update(['join_user_ids' => $this->send_user_ids, 'structure_ids' => $this->send_structure_ids]); @@ -373,7 +373,7 @@ class Log extends Common return false; } } - + /** * 日志数据 * @param $id 日志ID @@ -385,7 +385,7 @@ class Log extends Common $userModel = new \app\admin\model\User(); $structureModel = new \app\admin\model\Structure(); $commonModel = new \app\admin\model\Comment(); - + $map['log.log_id'] = $id; $data_view = db('oa_log') ->where($map) @@ -396,7 +396,7 @@ class Log extends Common $this->error = '暂无此数据'; return false; } - + $relation = Db::name('OaLogRelation')->where('log_id =' . $id)->find(); $BusinessModel = new \app\crm\model\Business(); //商机 $dataInfo['businessList'] = $relation['business_ids'] ? $BusinessModel->getDataByStr($relation['business_ids']) : []; @@ -406,7 +406,7 @@ class Log extends Common $dataInfo['contractList'] = $relation['contract_ids'] ? $ContractModel->getDataByStr($relation['contract_ids']) : []; $CustomerModel = new \app\crm\model\Customer();//客户 $dataInfo['customerList'] = $relation['customer_ids'] ? $CustomerModel->getDataByStr($relation['customer_ids']) : []; - + $dataInfo['create_user_info']['realname'] = $dataInfo['realname'] ?: ''; $dataInfo['create_user_info']['id'] = $dataInfo['create_user_id'] ?: ''; $dataInfo['create_user_info']['thumb_img'] = $dataInfo['thumb_img'] ? getFullPath($dataInfo['thumb_img']) : ''; @@ -430,7 +430,7 @@ class Log extends Common $dataInfo['replyList'] = $commonModel->read($param); return $dataInfo; } - + /** * 日志删除 * diff --git a/application/work/controller/Task.php b/application/work/controller/Task.php index bb2d617..4c25364 100644 --- a/application/work/controller/Task.php +++ b/application/work/controller/Task.php @@ -333,8 +333,8 @@ class Task extends ApiCommon # 获取任务的项目信息 $workInfo = Db::name('work')->field(['work_id', 'group_id', 'is_open'])->where('work_id', $taskData['work_id'])->find(); # 是否是公开项目 - $userId = empty($workInfo['is_open']) ? $userInfo['id'] : 0; - $groupId = !empty($workInfo['is_open']) ? $workInfo['group_id '] : 0; + $userId = $userInfo['id']; + $groupId = !empty($workInfo['is_open']) ? $workInfo['group_id'] : 0; # 获取项目下的权限 $taskData['auth'] = !empty($taskData['work_id']) ? $this->getRuleList($workInfo['work_id'], $userId, $groupId) : []; diff --git a/application/work/controller/Tasklable.php b/application/work/controller/Tasklable.php index 627cc49..46c1864 100644 --- a/application/work/controller/Tasklable.php +++ b/application/work/controller/Tasklable.php @@ -84,6 +84,9 @@ class Tasklable extends ApiCommon $str = ','.$userInfo['id'].','; $param['whereStr'] = ' ( task.create_user_id ='.$userInfo['id'].' or ( task.owner_user_id like "%'.$str.'%") or ( task.main_user_id = '.$userInfo['id'].' ) )'; } + # 标签列表只查询项目下的任务 + $param['work_id'] = ['neq', 0]; + $resData = $taskModel->getTaskList($param); $taskList = $resData['list'] ? : []; diff --git a/application/work/controller/Work.php b/application/work/controller/Work.php index 5f51854..3e64fb9 100644 --- a/application/work/controller/Work.php +++ b/application/work/controller/Work.php @@ -147,7 +147,7 @@ class work extends ApiCommon $workInfo = $workModel->getDataById($this->param['work_id']); # 是否是公开项目 - $userId = empty($workInfo['is_open']) ? $this->userInfo['id'] : 0; + $userId = $this->userInfo['id']; $groupId = !empty($workInfo['is_open']) ? $workInfo['group_id'] : 0; # 项目成员 @@ -632,5 +632,25 @@ class work extends ApiCommon return resultArray(['data' => '操作成功!']); } + + /** + * 项目排序 + * + * @author alvin guogaobo + * @version 1.0 版本号 + * @since 2021/2/23 0023 15:27 + */ +// public function workStart(){ +// $param=$this->param; +// $userInfo=$this->userInfo; +// $param['work']=serialize($param); +// $param['user_id']=$userInfo['id']; +// $workStart=new WorkLogic(); +// $res=$workStart->workStart($param); +// if(!$res){ +// return resultArray(['error'=>'操作失败']); +// } +// return resultArray(['data'=>'操作成功']); +// } } \ No newline at end of file diff --git a/application/work/logic/WorkLogic.php b/application/work/logic/WorkLogic.php index b76f2d2..3f39a0d 100644 --- a/application/work/logic/WorkLogic.php +++ b/application/work/logic/WorkLogic.php @@ -14,40 +14,40 @@ use think\Db; class WorkLogic { use WorkAuthTrait; - + public function index($param) { # 排序 $orderField = 'work_id'; - $orderSort = 'asc'; + $orderSort = 'asc'; if (!empty($param['sort_type']) && $param['sort_type'] == 1) { $orderField = 'work_id'; - $orderSort = 'asc'; + $orderSort = 'asc'; } if (!empty($param['sort_type']) && $param['sort_type'] == 2) { $orderField = 'work_id'; - $orderSort = 'desc'; + $orderSort = 'desc'; } if (!empty($param['sort_type']) && $param['sort_type'] == 3) { $orderField = 'update_time'; - $orderSort = 'desc'; + $orderSort = 'desc'; } - + # 搜索 $searchWhere = ''; - $dateWhere = []; - $userWhere = []; + $dateWhere = []; + $userWhere = []; $ownerUserId = !empty($param['owner_user_id']) ? $param['owner_user_id'] : ''; - $search = !empty($param['search']) ? $param['search'] : ''; - $type = !empty($param['type']) ? $param['type'] : 0; - $startTime = !empty($param['start_time']) ? $param['start_time'] : ''; - $endTime = !empty($param['end_time']) ? $param['end_time'] : ''; + $search = !empty($param['search']) ? $param['search'] : ''; + $type = !empty($param['type']) ? $param['type'] : 0; + $startTime = !empty($param['start_time']) ? $param['start_time'] : ''; + $endTime = !empty($param['end_time']) ? $param['end_time'] : ''; unset($param['search']); unset($param['type']); unset($param['start_time']); unset($param['end_time']); unset($param['owner_user_id']); - + switch ($type) { case 1 : # 今天 @@ -69,46 +69,136 @@ class WorkLogic $dateWhere['update_time'][] = ['egt', strtotime(date('Y-01-01 00:00:00', strtotime('last year')))]; $dateWhere['update_time'][] = ['elt', strtotime(date('Y-12-31 23:59:59', strtotime('last year')))]; } - + # 时间区间 if (!empty($startTime)) $dateWhere['update_time'] = ['egt', strtotime($startTime . '00:00:00')]; - if (!empty($endTime)) $dateWhere['update_time'] = ['elt', strtotime($endTime . '23:59:59')]; - + if (!empty($endTime)) $dateWhere['update_time'] = ['elt', strtotime($endTime . '23:59:59')]; + # 搜索内容 if ($search) $searchWhere = '(name like "%' . $search . '%") OR (description like "%' . $search . '%")'; - + # 成员 if (!empty($ownerUserId)) { $userIds = Db::name('work_user')->whereIn('user_id', $ownerUserId)->column('work_id'); $userWhere['work_id'] = ['in', $userIds]; } - - $userModel = new \app\admin\model\User(); + + $userModel = new \app\admin\model\User(); $perUserIds = $userModel->getUserByPer('work', 'work', 'index'); - $authUser = array_unique(array_merge([$param['user_id']], $perUserIds)); - + $authUser = array_unique(array_merge([$param['user_id']], $perUserIds)); + $data = Db::name('work') - ->where(function($query) { - $query->where('status', 1); - $query->where('ishidden', 0); - }) - ->where(function ($query) use ($param, $authUser) { - $query->whereOr(['create_user_id' => ['in', $authUser]]); - $query->whereOr('is_open', 1); - $query->whereOr(function ($query) use ($param) { - $query->where('is_open', 0); - $query->where('owner_user_id', 'like', '%' . $param['user_id'] . '%'); - }); - }) - ->where($searchWhere) - ->where($dateWhere) - ->where($userWhere) - ->order($orderField, $orderSort)->select(); + ->where(function ($query) { + $query->where('status', 1); + $query->where('ishidden', 0); + }) + ->where(function ($query) use ($param, $authUser) { + $query->whereOr(['create_user_id' => ['in', $authUser]]); + $query->whereOr('is_open', 1); + $query->whereOr(function ($query) use ($param) { + $query->where('is_open', 0); + $query->where('owner_user_id', 'like', '%' . $param['user_id'] . '%'); + }); + }) + ->where($searchWhere) + ->where($dateWhere) + ->where($userWhere) + ->order($orderField, $orderSort)->select(); - foreach ($data AS $key => $value) { + foreach ($data as $key => $value) { $data[$key]['authList']['project'] = $this->getRuleList($value['work_id'], $param['user_id'], $value['group_id']); } - + return $data; } + + /** + * @param $param work 排序数组值 user_id用户 + * + * @author alvin guogaobo + * @version 1.0 版本号 + * @since 2021/2/23 15:42 + */ +// public function workStart($param) +// { +// $item = Db::name('workStart')->where('user_id', $param['user_id'])->find(); +// $data = []; +// $data['datas'] = $param['work']; +// $data['user_id'] = $param['user_id']; +// if (!$item) { +// return Db::name('workStart')->insertGetId($data); +// } else { +// return Db::name('workStart')->where('user_id', $param['user_id'])->update([$data]); +// } +// } + + /** + * 根据数组指定键名排序数组 + * @param $array array 被排序数组 + * @param $key_name string 数组键名 + * @param $sort string desc|asc 升序或者降序 + * @return array 返回排序后的数组 + */ +// function gw_sort($array, $param) +// { +// $whilr = array +// ( +// [0] => ['work_id' => 5, +// 'name' => 222, +// 'status' => 1, +// 'create_time' => 1613628469, +// 'create_user_id' => 7, +// 'description' => 222, +// 'color' => '#53D397', +// 'is_open' => 1, +// 'owner_user_id' => ',1,2,3,4,5,7,', +// 'ishidden' => 0, +// 'archive_time' => 0, +// 'group_id' => 12, +// 'cover_url' => 'http://192.168.1.31/72crm-php/public/uploads/20210218/12ece02733c8684ce987f207062173b5.png', +// 'update_time' => 1613629916, +// 'is_follow' => 0, +// 'is_system_cover' => 0,], +// +// [1] => [ +// +// 'work_id' => 7, +// 'name' => '啊啊', +// 'status' => 1, +// 'create_time' => 1614059388, +// 'create_user_id' => 1, +// 'description' => '', +// 'color' => '#53D397', +// 'is_open' => 0, +// 'owner_user_id' => ',1,3,', +// 'ishidden' => 0, +// 'archive_time' => 0, +// 'group_id' => 12, +// 'cover_url' => 'https://file.72crm.com/static/pc/images/pm/project-cover-1.jpg', +// 'update_time' => 1614059926, +// 'is_follow' => 0, +// 'is_system_cover' => 1, +// ] +// +// ); +// $item = Db::name('workStart')->where('user_id', $param['user_id'])->find(); +// $key_name_array = array();//保存被排序数组键名 +// foreach ($whilr as $key => $val) { +// foreach ($item as $v){ +// $key_name_array[] = array_merge(array_flip($val), $v); +// } +// } +// $key_name_array = array_flip($key_name_array);//反转键名和值得到数组排序后的位置 +// $result = array(); +// foreach($array as $k=>$v){ +// foreach ($item as $vall){ +// $this_key_name_value = $v[$vall];//当前数组键名值依次是20,10,30 +// $save_position = $key_name_array[$this_key_name_value];//获取20,10,30排序后存储位置 +// $result[$save_position] = $v;//当前项存储到数组指定位置 +// } +// } +// ksort($result); +// +// return $result; +// } } \ No newline at end of file diff --git a/application/work/model/Task.php b/application/work/model/Task.php index 070397c..398c633 100644 --- a/application/work/model/Task.php +++ b/application/work/model/Task.php @@ -50,6 +50,7 @@ class Task extends Common $workModel = model('Work'); $userModel = new \app\admin\model\User(); $work_id = $request['work_id']; + $map=[]; $ret = $workModel->checkWork($work_id, $user_id); if (!$ret) { $this->error = $workModel->getError(); @@ -68,11 +69,7 @@ class Task extends Common } else { $newList = $classList['list']; } - - if ($request['main_user_id']) { - $map['main_user_id'] = ['in', $request['main_user_id']]; - } - //截止时间 + if ($request['stop_time_type']) { if ($request['stop_time_type'] == '5') { //没有截至日期 $map['stop_time'] = '0'; @@ -104,6 +101,7 @@ class Task extends Common $map['stop_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } } + if ($request['lable_id']) { $taskIds = []; $task_ids = []; @@ -125,18 +123,20 @@ class Task extends Common } $map['task_id'] = ['in', $task_ids]; } + $data = array(); foreach ($newList as $key => $value) { $data[$key]['class_id'] = $value['class_id'] ?: -1; $data[$key]['class_name'] = $value['name']; - + $map['status'] = $map['status'] ?: ['in', ['1', '5']]; + $map['ishidden'] = 0; $map['work_id'] = $request['work_id']; $map['class_id'] = $value['class_id']; $map['pid'] = 0; $map['is_archive'] = 0; - + $map['main_user_id']=$request['main_user_id']; $taskList = []; $resTaskList = $this->getTaskList($map); $data[$key]['count'] = $resTaskList['count']; @@ -414,7 +414,7 @@ class Task extends Common unset($param[$value]); } $main_user_id = $param['main_user_id'] ?: $param['create_user_id']; - + $param['owner_user_id'] = ','.$main_user_id.','; //参与人 $param['main_user_id'] = $main_user_id; //负责人 $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : 0; $param['stop_time'] = !empty($param['stop_time']) ? strtotime($param['stop_time']) : 0; @@ -443,14 +443,14 @@ class Task extends Common //操作日志 actionLog($task_id, '', '', '新建了任务'); //抄送站内信 -// (new Message())->send( -// Message::TASK_ALLOCATION, -// [ -// 'title' => $param['name'], -// 'action_id' => $task_id -// ], -// $param['owner_user_id'] -// ); + (new Message())->send( + Message::TASK_ALLOCATION, + [ + 'title' => $param['name'], + 'action_id' => $task_id + ], + trim(',',$param['owner_user_id']) + ); } # 添加活动记录 @@ -642,14 +642,14 @@ class Task extends Common //设置负责人 $userdet = $userModel->getDataById($param['main_user_id']); $data['after'] = '设定' . $userdet['realname'] . '为主要负责人!'; -// (new Message())->send( -// Message::TASK_ALLOCATION, -// [ -// 'title' => $taskInfo['name'], -// 'action_id' => $param['task_id'] -// ], -// $param['main_user_id'] -// ); + (new Message())->send( + Message::TASK_ALLOCATION, + [ + 'title' => $taskInfo['name'], + 'action_id' => $param['task_id'] + ], + $param['main_user_id'] + ); break; } @@ -899,15 +899,17 @@ class Task extends Common */ public function getTaskList($request) { - $search = $request['search']; + + $search = $request['search']?:''; $whereStr = $request['whereStr'] ?: []; $lable_id = $request['lable_id'] ?: ''; + $main_user_id = $request['main_user_id'] ?: ''; $taskSearch = !empty($request['taskSearch']) ? $request['taskSearch'] : ''; $isArchive = !empty($request['is_archive']) ? $request['is_archive'] : 0; - unset($request['search']); - unset($request['whereStr']); - unset($request['lable_id']); - unset($request['taskSearch']); +// unset($request['search']); +// unset($request['whereStr']); +// unset($request['lable_id']); + unset($request['main_user_id']); $request = $this->fmtRequest($request); $requestMap = $request['map'] ?: []; $userModel = new \app\admin\model\User(); @@ -924,6 +926,13 @@ class Task extends Common } $dataCount = db('task')->alias('task')->where($map)->where($whereStr)->where($taskSearch)->count(); $taskList = []; + $logWhere=''; + if ($main_user_id) { + foreach ($main_user_id as $key => $value) { + $logWhere.= '( task.owner_user_id like "%,' . $value . ',%") OR '; + } + if (!empty($logWhere)) $logWhere = '(' . rtrim($logWhere, 'OR ') . ')'; + } if ($dataCount) { $taskList = db('task') ->alias('task') @@ -932,6 +941,7 @@ class Task extends Common ->field('task.task_id,task.name,task.main_user_id,task.is_top,task.work_id,task.lable_id,task.priority,task.stop_time,task.status,task.pid,task.create_time,task.owner_user_id,u.realname as main_user_name,u.thumb_img,w.name as work_name,color') ->where($map) ->where($whereStr) + ->where($logWhere) ->where($taskSearch) ->order('task.status asc,task.order_id asc') ->select(); @@ -1036,7 +1046,6 @@ class Task extends Common ->where($labelWhere) ->order($order) ->select(); - foreach ($taskList as $key => $value) { if ($value['pid'] > 0) { $p_det = $this->field('task_id,name')->where(['task_id' => $value['pid']])->find(); @@ -1084,35 +1093,38 @@ class Task extends Common # 今天 if ($type == 1) { - $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; + $result = '(task.stop_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; } # 明天 if ($type == 2) { $tomorrow = date("Y-m-d 23:59:59", strtotime("+1 day")); - $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime($tomorrow) . ')'; + $start = date("Y-m-d 00:00:00", strtotime("+1 day")); + $result = '(task.stop_time >= ' . strtotime($start) . ' AND task.stop_time <= ' . strtotime($tomorrow) . ')'; } # 本周 if ($type == 3) { $week = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y")); - $result = '(task.stop_time > 0 AND task.stop_time <= ' . $week . ')'; + $start_week=mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y')); + $result = '(task.stop_time >= ' . $start_week . ' AND task.stop_time <= ' . $week . ')'; } # 本月 if ($type == 4) { + $timestamp = mktime(0, 0, 0, date('m'), 1, date('Y')); $month = mktime(23, 59, 59, date("m"), date("t"), date("Y")); - $result = '(task.stop_time > 0 AND task.stop_time <= ' . $month . ')'; + $result = '(task.stop_time > ' . $timestamp . ' AND task.stop_time <= ' . $month . ')'; } # 未设置截止日期 if ($type == 5) { - $result = $result = '(task.stop_time = 0)';; + $result = '(task.stop_time = 0)';; } # 已延期 if ($type == 6) { - $result = '(task.status = 2 OR task.stop_time >= ' . time() . ')'; + $result = '(task.status = 2 OR task.stop_time < ' . time() . ')'.'AND task.stop_time <> 0 AND task.status = 1'; } # 今日更新 diff --git a/application/work/model/Work.php b/application/work/model/Work.php index 8888af1..b63a790 100644 --- a/application/work/model/Work.php +++ b/application/work/model/Work.php @@ -75,6 +75,7 @@ class Work extends Common $ownerData['work_id'] = $workId; $ownerData['create_user_id'] = $createUserId; $ownerData['owner_user_id'] = $ownerUserId; + $ownerData['group_id'] = !empty($param['group_id']) ? $param['group_id'] : 0; # 创建项目下的相关成员 $this->addOwner($ownerData); @@ -129,6 +130,10 @@ class Work extends Common $ownerData['is_open'] = $param['is_open']; $ownerData['group_id'] = $param['group_id']; $this->addOwner($ownerData); + } + # 公开项目更新时的权限变更 + if ($param['is_open'] == 1 && !empty($param['group_id']) && $param['group_id'] != $workInfo['group_id']) { + db('work_user')->where(['work_id' => $workInfo['work_id'], 'user_id' => ['neq', $workInfo['create_user_id']]])->update(['group_id' => $param['group_id']]); } $resUpdata = $this->where($map)->update($param); if ($resUpdata) { @@ -307,7 +312,7 @@ class Work extends Common $group_id = 1; } else { # 默认角色 - $group_id = db('admin_group')->where(['pid' => 5, 'system' => 1])->order('id asc')->value('id'); + $group_id = !empty($param['group_id']) ? $param['group_id'] : db('admin_group')->where(['pid' => 5, 'system' => 1])->order('id asc')->value('id'); } $data['group_id'] = $group_id; $saveData[] = $data; diff --git a/config/config.php b/config/config.php index 379ac73..64285ae 100644 --- a/config/config.php +++ b/config/config.php @@ -265,5 +265,8 @@ return [ // 商业智能查询缓存时间(秒) 'bi_cache_time' => 1800, // 商业智能慢查询查询时间(查询超过该时间进行数据缓存)(毫秒) - 'bi_slow_query_time' => 500 + 'bi_slow_query_time' => 500, + 'public_key' => '-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkqKFcAQtIp4rlkB5LOMnViyVY/hhA6x0R9ftwtEXsAFu4hBZrm9txdEvxSrDCUsx3Zwv/gdimeOzTtfSKffdoE/DwllNP9Zu6nsr2kGRgPrRwjtlO+j2FOM0b9UY1SQ/bWE+a9oQL2jL9xMSbtX1xG/+HcMo1bT+pa6FNQzs3egmvMt75/jaxINPSraj4kgNFawSBk7qDBEqDYiQwtPTuaNW1YZIs++/gZHsCRgGs/JrAbxNpl7+v/+Z503I3I2rs/8eUM5d16NXR8M7vtobUDCTIiQOgRahO8WMadgFlwavyVCYhy/TBXyj5RUfWaS26LrEN3vkj4TjoJu5m9LQ5QIDAQAB +-----END PUBLIC KEY-----', ]; diff --git a/config/route_admin.php b/config/route_admin.php index 8b8ec11..4c45a03 100644 --- a/config/route_admin.php +++ b/config/route_admin.php @@ -15,6 +15,7 @@ return [ 'admin/install/step2' => ['admin/install/step2', ['method' => 'GET']], 'admin/install/step3' => ['admin/install/step3', ['method' => 'GET']], 'admin/install/step4' => ['admin/install/step4', ['method' => 'POST|AJAX']], + 'admin/install/step5' => ['admin/install/step5', ['method' => 'GET']], 'admin/install/progress' => ['admin/install/progress', ['method' => 'POST']], //子部门列表 diff --git a/config/route_crm.php b/config/route_crm.php index e00aa50..d7c7e9b 100644 --- a/config/route_crm.php +++ b/config/route_crm.php @@ -233,6 +233,8 @@ return [ 'crm/receivables/system' => ['crm/receivables/system', ['method' => 'POST']], // 【回款】菜单数量 'crm/receivables/count' => ['crm/receivables/count', ['method' => 'POST']], + //【回款】导出 + 'crm/receivables/excelExport' => ['crm/receivables/excelExport', ['method' => 'POST']], // 【回款计划】列表 'crm/receivables_plan/index' => ['crm/receivables_plan/index', ['method' => 'POST']], diff --git a/config/version.php b/config/version.php index 2a23dbd..dcf4052 100644 --- a/config/version.php +++ b/config/version.php @@ -1,5 +1,5 @@ '11.0.0', -'RELEASE'=>'20210205', +'VERSION'=>'11.0.1', +'RELEASE'=>'20210227', ); \ No newline at end of file diff --git a/public/sql/5kcrm.sql b/public/sql/5kcrm.sql index 5c6b1ec..50b2c16 100644 --- a/public/sql/5kcrm.sql +++ b/public/sql/5kcrm.sql @@ -1708,10 +1708,10 @@ INSERT INTO `5kcrm_admin_scene` (`types`, `name`, `user_id`, `order_id`, `data`, INSERT INTO `5kcrm_admin_scene` (`types`, `name`, `user_id`, `order_id`, `data`, `is_hide`, `type`, `bydata`, `create_time`, `update_time`) VALUES ('crm_visit', '下属负责的回访', '0', '1', '', '0', '1', 'sub', '1546272000', '1551515457'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'number', '回访编号', 'text', '', '0', '0', '1', '', NULL, '1', '1', '1553788800', '1553788800', '0', NULL, '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'visit_time', '回访时间', 'date', '', '0', '0', '1', '', '', '2', '1', '1553788800', '1553788800', '0', '', '0'); -INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'visit_user_id', '回访人', 'user', '', '0', '0', '1', '', '', '3', '1', '1553788800', '1553788800', '0', '', '0'); +INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'owner_user_id', '回访人', 'single_user', '', '0', '0', '1', '', '', '9', '3', '1553788800', '1553788800', '0', '', '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'shape', '回访形式', 'select', '', '0', '0', '0', '', '见面拜访\r\n电话\r\n短信\r\n邮件\r\n微信', '4', '1', '1553788800', '1553788800', '0', NULL, '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ( 'crm_visit', '0', 'customer_id', '客户名称', 'customer', '', '0', '0', '1', '', '', '5', '1', '1553788800', '1553788800', '0', '', '0'); -INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ( 'crm_visit', '0', 'contacts_id', '联系人', 'contacts', '', '0', '0', '0', '', '', '6', '1', '1553788800', '1553788800', '0', '', '0'); +INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ( 'crm_visit', '0', 'contacts_id', '联系人', 'contacts', '', '0', '0', '0', '', '', '6', '3', '1553788800', '1553788800', '0', '', '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ( 'crm_visit', '0', 'contract_id', '合同编号', 'contract', '', '0', '0', '1', '', '', '7', '1', '1553788800', '1553788800', '0', '', '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ('crm_visit', '0', 'satisfaction', '客户满意度', 'select', '', '0', '0', '0', '', '很满意\r\n满意\r\n一般不满意\r\n很不满意', '8', '1', '1553788800', '1553788800', '0', NULL, '0'); INSERT INTO `5kcrm_admin_field` ( `types`, `types_id`, `field`, `name`, `form_type`, `default_value`, `max_length`, `is_unique`, `is_null`, `input_tips`, `setting`, `order_id`, `operating`, `create_time`, `update_time`, `type`, `relevant`, `is_hidden`) VALUES ( 'crm_visit', '0', 'feedback', '客户反馈', 'textarea', '', '0', '0', '0', '', '', '9', '1', '1553788800', '1553788800', '0', '', '0'); @@ -1751,7 +1751,7 @@ DROP TABLE IF EXISTS `5kcrm_crm_visit`; CREATE TABLE `5kcrm_crm_visit` ( `visit_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '回访id', `owner_user_id` int(11) NOT NULL COMMENT '负责人', - `visit_user_id` int(11) NOT NULL COMMENT '回访人', + `owner_user_id` int(11) NOT NULL COMMENT '回访人', `create_user_id` int(11) NOT NULL COMMENT '创建人id', `customer_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户名称', `contract_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '合同编号', @@ -1840,12 +1840,12 @@ ALTER TABLE `5kcrm_oa_examine` ADD COLUMN `last_user_id` varchar(200) not null d ALTER TABLE `5kcrm_oa_announcement` ADD COLUMN `is_read` tinyint(2) not null default 0 comment '1表示已读 0表示未读'; ALTER TABLE `5kcrm_oa_examine_category` ADD COLUMN `icon` varchar(255) NOT NULL COMMENT '类型图标和颜色'; -UPDATE `5kcrm_oa_examine_category` SET `category_id`='1', `title`='普通审批', `remark`='普通审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612576450', `update_time`='1612576450', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='65' ,`icon`='wk wk-leave,#00CAAB' WHERE (`category_id`='1'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='2', `title`='请假审批', `remark`='请假审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612518097', `update_time`='1612518097', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='63' ,`icon`='wk wk-l-record,#3ABCFB' WHERE (`category_id`='2'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='3', `title`='出差审批', `remark`='出差审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-trip,#3ABCFB' WHERE (`category_id`='3'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='4', `title`='加班审批', `remark`='加班审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-overtime,#FAAD14' WHERE (`category_id`='4'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='5', `title`='差旅报销', `remark`='差旅报销', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-reimbursement,#3ABCFB' WHERE (`category_id`='5'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='6', `title`='借款申请', `remark`='借款申请', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-go-out,#FF6033' WHERE (`category_id`='6'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='1', `title`='普通审批', `remark`='普通审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612576450', `update_time`='1612576450', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-leave,#00CAAB' WHERE (`category_id`='1'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='2', `title`='请假审批', `remark`='请假审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612518097', `update_time`='1612518097', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='2' ,`icon`='wk wk-l-record,#3ABCFB' WHERE (`category_id`='2'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='3', `title`='出差审批', `remark`='出差审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='3' ,`icon`='wk wk-trip,#3ABCFB' WHERE (`category_id`='3'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='4', `title`='加班审批', `remark`='加班审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='4' ,`icon`='wk wk-overtime,#FAAD14' WHERE (`category_id`='4'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='5', `title`='差旅报销', `remark`='差旅报销', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='5' ,`icon`='wk wk-reimbursement,#3ABCFB' WHERE (`category_id`='5'); +UPDATE `5kcrm_oa_examine_category` SET `category_id`='6', `title`='借款申请', `remark`='借款申请', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='6' ,`icon`='wk wk-go-out,#FF6033' WHERE (`category_id`='6'); INSERT INTO `5kcrm_admin_rule` VALUES ('154', '0', '其他设置', 'other_rule', '2', '105', '0'); INSERT INTO `5kcrm_admin_rule` VALUES ('155', '0', '日志欢迎语', 'welcome', '3', '154', '0'); @@ -1955,7 +1955,7 @@ CREATE TABLE `5kcrm_crm_receivables_file` ( `receivables_id` int(10) unsigned NOT NULL, `file_id` int(10) unsigned NOT NULL, PRIMARY KEY (`r_id`) USING BTREE -) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED; +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED; INSERT INTO `5kcrm_crm_config` (`name`, `value`, `description`) VALUES ('activity_phrase', 'a:5:{i:0;s:18:\\\"电话无人接听\\\";i:1;s:15:\\\"客户无意向\\\";i:2;s:42:\\\"客户意向度适中,后续继续跟进\\\";i:3;s:42:\\\"客户意向度较强,成交几率较大\\\";i:4;s:3:\\\"312\\\";}', '跟进记录常用语'); INSERT INTO `5kcrm_crm_config` (`name`, `value`, `description`) VALUES ('visit_config', '1', '是否开启回访提醒:1开启;0不开启'); diff --git a/public/sql/install.sql b/public/sql/install.sql index b1960ff..8bfd170 100644 --- a/public/sql/install.sql +++ b/public/sql/install.sql @@ -1,3 +1,3 @@ -insert into `5kcrm_admin_user` (`username`, `password`, `salt`, `realname`, `create_time`, `status`, `structure_id`, `parent_id`, `type`) values ( '18888888888', '302dd3f6dba54513f2a5a1bf696e2d8d', '1b2d', '管理员', '1487217060', 1, 1, 0, 1); +insert into `5kcrm_admin_user` (`username`, `password`, `salt`, `realname`, `create_time`, `status`, `structure_id`, `parent_id`, `type`) values ( '18888888888', '05a9918b455b2209673c36676422bb81', '7217', '管理员', '1613611667', 1, 1, 0, 1); -insert into `5kcrm_hrm_user_det` (`user_id`, `join_time`, `type`, `status`, `userstatus`, `create_time`, `update_time`) values ( 1, '1487217060', 1, 1, 2, '1487217060', '1487217060'); \ No newline at end of file +insert into `5kcrm_hrm_user_det` (`user_id`, `join_time`, `type`, `status`, `userstatus`, `create_time`, `update_time`) values ( 1, '1613611667', 1, 1, 2, '1613611667', '1613611667'); \ No newline at end of file diff --git a/public/sql/update_sql_20210207.sql b/public/sql/update_sql_20210207.sql index 1773a15..9991853 100644 --- a/public/sql/update_sql_20210207.sql +++ b/public/sql/update_sql_20210207.sql @@ -380,13 +380,6 @@ ALTER TABLE `5kcrm_oa_examine` ADD COLUMN `last_user_id` varchar(200) not null d ALTER TABLE `5kcrm_oa_announcement` ADD COLUMN `is_read` tinyint(2) not null default 0 comment '1表示已读 0表示未读'; ALTER TABLE `5kcrm_oa_examine_category` ADD COLUMN `icon` varchar(255) NOT NULL COMMENT '类型图标和颜色'; -UPDATE `5kcrm_oa_examine_category` SET `category_id`='1', `title`='普通审批', `remark`='普通审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612576450', `update_time`='1612576450', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='65' ,`icon`='wk wk-leave,#00CAAB' WHERE (`category_id`='1'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='2', `title`='请假审批', `remark`='请假审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1612518097', `update_time`='1612518097', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='63' ,`icon`='wk wk-l-record,#3ABCFB' WHERE (`category_id`='2'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='3', `title`='出差审批', `remark`='出差审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-trip,#3ABCFB' WHERE (`category_id`='3'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='4', `title`='加班审批', `remark`='加班审批', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-overtime,#FAAD14' WHERE (`category_id`='4'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='5', `title`='差旅报销', `remark`='差旅报销', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-reimbursement,#3ABCFB' WHERE (`category_id`='5'); -UPDATE `5kcrm_oa_examine_category` SET `category_id`='6', `title`='借款申请', `remark`='借款申请', `create_user_id`='1', `status`='1', `is_sys`='1', `user_ids`='', `structure_ids`='', `create_time`='1548911542', `update_time`='1548911542', `is_deleted`='0', `delete_time`='0', `delete_user_id`='0', `flow_id`='1' ,`icon`='wk wk-go-out,#FF6033' WHERE (`category_id`='6'); - INSERT INTO `5kcrm_admin_rule` VALUES ('154', '0', '其他设置', 'other_rule', '2', '105', '0'); INSERT INTO `5kcrm_admin_rule` VALUES ('155', '0', '日志欢迎语', 'welcome', '3', '154', '0'); INSERT INTO `5kcrm_admin_rule` VALUES ('156', '0', '设置欢迎语', 'setWelcome', '3', '154', '0'); diff --git a/public/sql/update_sql_20210227.sql b/public/sql/update_sql_20210227.sql new file mode 100644 index 0000000..92089a8 --- /dev/null +++ b/public/sql/update_sql_20210227.sql @@ -0,0 +1,2 @@ +UPDATE `5kcrm_admin_field` SET `operating`= 3, `field` = 'owner_user_id', `form_type` = 'single_user' WHERE `types` = 'crm_visit' AND `field` = 'visit_user_id'; +UPDATE `5kcrm_admin_field` SET `operating`= 3 WHERE `types` = 'crm_visit' AND `field` = 'contacts_id'; \ No newline at end of file diff --git a/public/static/icon/success_gray.png b/public/static/icon/success_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..e520a10cc53089b43a95837adb2b10985b382390 GIT binary patch literal 2202 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

s)?NX~4pFPNB(%Z8 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℞yr14EbTg6n=OtH#+yz~~` z`tKJM@G<&TG5lE{i2ks}#yQaL2Y;ocDcUiWOK4Pt$yYEBDt9KB9GFQooa8 zn}UZ{6*cC%*8JiNKpRL-l^J6nVh&XAmcX$aq)Ap zd72e^I(R@H5lC~}8FJ9*QwQi4qua5Y&V}B$k8Z(MgajZ(uZLQ3t5IUMQ^|& zN%&cn(EnGJ1VAZ}msHJkA}+`#=|-!n!;Ns%Pyox^tDi-9-N7;Cen+Vfbj85O6UAtX zc5fg>PU^qMOX|=V!A&A?1J6VbEir}`AoM65PC`-GF@?r<+1eks5c&{ncm8?Jl;Qa| z`$o=2+M`pQ&KKUEVuAug7Z|b845N@xJ!i&({o!&EoEFm_2t6n9WubwBIS zBLdIva)`lzK9cq(&)enyl$ALgaORGqqJv*@Y)jC+fxWigqq0&LR!;r#op?$`MtNYn z)WVLpDil>@kY{mHG-rBKqf=oSa0GmGD=*c6Pe{%(RuSM)>=GOw!;44nB$}lqhQa}; za2wyjtb)}fYTMZXKE&vB3M~*|E&xh8ZHcRmM-cfk)N~

!aAG<&_KC9qFENVT7zl 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 literal 0 HcmV?d00001 diff --git a/public/static/js/step2.js b/public/static/js/step2.js index d7c088c..e54c26c 100644 --- a/public/static/js/step2.js +++ b/public/static/js/step2.js @@ -45,7 +45,12 @@ var rules = { required: true, regexp: /^(?=.*[a-zA-Z])(?=.*\d).{6,20}$/, label: '管理员密码(6~20位字母加数字组合)' - } + }, + wkcode: { + required: false, + regexp: null, + label: '序列号' + }, }; var timer = null; @@ -63,32 +68,36 @@ $('.next').click(function () { // 校验form数据 true 校验通过 false 校验失败 var forms = getFormData(); var result = checkForm(); - console.log('result---', result, forms); + // console.log('result---', result, forms); if (result) { - $.ajax({ - cache: true, - type: "POST", - dataType: 'json', - url: "./step4", - data: { - form: forms - }, - async: false, - success: function (result) { - if (result.code == '200') { - alert(result.data); - window.location = '../../../index.html'; - } else if (result.code == '400') { - alert(result.error); //失败 - return false; - // window.location = 'step3.html' - } else { - window.location = 'step3.html' - alert('安装失败'); + + $('#cover').css('display', 'block');//显示遮罩层 + setTimeout(()=>{ + $.ajax({ + cache: true, + type: "POST", + dataType: 'json', + url: "./step4", + data: { + form: forms + }, + async: false, + success: function (result) { + if (result.code == '200') { + window.location = 'step5.html'; + } else if (result.code == '400') { + $('#cover').css('display', 'none'); + alert(result.error); //失败 + return false; + // window.location = 'step3.html' + } else { + window.location = 'step3.html' + alert('安装失败'); + } } - } - // getRes(); - }); + // getRes(); + }); + }) } }); @@ -168,7 +177,7 @@ function _initFormValue() { * @return {form} */ function getFormData() { - $('input').each(function (index, item) { + $('.wkform').each(function (index, item) { form[item.name] = item.value; // 重置表单状态 $(item).removeClass('input-error'); @@ -186,6 +195,7 @@ function getFormData() { * @return {boolean} */ function checkForm() { + var result = {}; for (var key in rules) { var rule = rules[key]; @@ -228,9 +238,4 @@ function renderErrorMsg(key, msg) { $(item).addClass('input-error') } }) -} - -/** - * 提交表单 - */ -function submitForm() {} \ No newline at end of file +} \ No newline at end of file diff --git a/public/static/style/base.css b/public/static/style/base.css index 4f18935..e46b4ce 100644 --- a/public/static/style/base.css +++ b/public/static/style/base.css @@ -10,6 +10,11 @@ html, body { background-color: #f2f2f2; font-family: 微软雅黑,Microsoft Yahei,LiHei Pro,Hiragino Sans,GBHelvetica Neue,Helvetica,Arial,PingFang SC,WenQuanYi Micro Hei,sans-serif; } +body { + background-image: url('../img/bg.png'); + background-size: 100% 100%; + background-repeat: no-repeat; +} li { list-style: none; @@ -72,7 +77,10 @@ li { .top { width: 790px; height: 65px; - margin: 0 auto; + margin:40px auto 20px auto; + border: 1px solid white; + border-radius: 5px ; + background-color: #fff ; } /* container */ @@ -81,6 +89,7 @@ li { min-height: 493px; background-color: white; border: 1px solid #e1e1e1; + border-radius:5px; margin: 0 auto; } @@ -93,7 +102,7 @@ li { width: 820px; text-align: center; font-size: 15px; - color: #8c8c8c; + color: #fff; line-height: 30px; margin: 0 auto; padding: 30px 0; @@ -112,6 +121,9 @@ li { text-align: center; margin: 20px 0; float: left; + display: flex; + align-items: center; + justify-content: center; } .step.line { width: 10%; @@ -122,12 +134,12 @@ li { .step .sort { width: 25px; height: 25px; - color: white; + color: #8c8c8c; line-height: 25px; text-align: center; font-size: 14px; border-radius: 50%; - background-color: #d1d1d1; + /* background-color: #d1d1d1; */ margin-right: 5px; display: inline-block; } @@ -139,13 +151,13 @@ li { } .step.active .sort { - background-color: #3e84e9; + background-color: #fff; } .step.active .desc { - color: #3e84e9; + color: black; } .step.active.line { - background-color: #3e84e9; + /* background-color: #fff; */ } @@ -156,7 +168,7 @@ li { line-height: 40px; font-size: 16px; color: #3e84e9; - border-radius: 40px; + border-radius: 5px; background-color: white; border: 1px solid #3e84e9; display: inline-block; @@ -172,16 +184,44 @@ li { width: 100%; height: 54px; line-height: 54px; - background-color: #f7f7f7; + /* background-color: #f7f7f7; */ padding: 0 26px; - border-bottom: 1px solid #e1e1e1; + /* border-bottom: 1px solid #e1e1e1; */ + font-weight: 600; } .base-top .title { - color: #8c8c8c; + /* color: #8c8c8c; */ font-size: 16px; } .base-top .version { font-size: 13px; - color: #d1d1d1; + color: #8c8c8c; float: right; } + +.base-des { + margin: 0 auto; + line-height: 35px; + width: 790px; + background-color: #fff; + padding: 0 40px; + margin-bottom: 20px; + color: #8c8c8c; +} + +.base-a{ + cursor: pointer; + user-select: none; + text-decoration: none; + color: #3e84e9; +} + +#cover{ + position:absolute;left:0px;top:0px; + background:rgba(0, 0, 0, 0.4); + width:100%; /*宽度设置为100%,这样才能使隐藏背景层覆盖原页面*/ + height:100%; + opacity:0.6; /*非IE浏览器下设置透明度为60%*/ + display:none; + z-Index:99; +} \ No newline at end of file diff --git a/public/static/style/index.css b/public/static/style/index.css index 8e40f26..23ad336 100644 --- a/public/static/style/index.css +++ b/public/static/style/index.css @@ -1,5 +1,6 @@ .container { padding: 20px; + border-radius: 10px; } .agreement-title { width: 100%; diff --git a/public/static/style/loading.css b/public/static/style/loading.css new file mode 100644 index 0000000..fc81d95 --- /dev/null +++ b/public/static/style/loading.css @@ -0,0 +1,52 @@ +#loader-container { + width: 200px; + height: 200px; + color: white; + margin: 0 auto; + position: fixed; + top: 50%; + left: 50%; + margin-right: -50%; + transform: translate(-50%, -50%); + border: 5px solid #3498db; + border-radius: 50%; + -webkit-animation: borderScale 1s infinite ease-in-out; + animation: borderScale 1s infinite ease-in-out; + z-index: 100; + opacity:1 +} + +#loadingText { + font-family: 'Raleway', sans-serif; + font-weight: bold; + font-size: 2em; + position: absolute; + top: 50%; + left: 50%; + margin-right: -50%; + transform: translate(-50%, -50%); +} + +@-webkit-keyframes borderScale { + 0% { + border: 5px solid white; + } + 50% { + border: 25px solid #3498db; + } + 100% { + border: 5px solid white; + } +} + +@keyframes borderScale { + 0% { + border: 5px solid white; + } + 50% { + border: 25px solid #3498db; + } + 100% { + border: 5px solid white; + } +} \ No newline at end of file diff --git a/public/static/style/step1.css b/public/static/style/step1.css index 158b32d..f0ca7a6 100644 --- a/public/static/style/step1.css +++ b/public/static/style/step1.css @@ -15,14 +15,18 @@ table { width: 100%; border: 1px solid #e1e1e1; - border-collapse: collapse; + /* border-collapse: collapse; */ + border-collapse: separate; + border-spacing: 0; + border-radius:5px; + overflow: hidden; } .table tr { height: 34px; text-align: center; } th, td { - border: 1px solid #e1e1e1; + border-bottom: 1px solid #f7f7f7; width: 30%; } th:first-child, td:first-child, th:last-child, td:last-child { @@ -31,8 +35,9 @@ th:first-child, td:first-child, th:last-child, td:last-child { th { font-weight: normal; - background-color: #3e84e9; - color: white; + background-color: #f7f7f7; + /* color: white; */ + font-weight: 600; } diff --git a/public/static/style/step2.css b/public/static/style/step2.css index eda923d..3ccff18 100644 --- a/public/static/style/step2.css +++ b/public/static/style/step2.css @@ -28,13 +28,15 @@ float: left; } .content .form .form-item input { - width: 276px; - height: 34px; - line-height: 34px; + width: 550px; + height: 40px; + line-height: 40px; border: 1px solid #d7d7d7; padding: 0 10px; - margin-right: 20px; + /* margin-right: 20px; */ float: left; + border-radius: 5px; + color: #8c8c8c; } .content .form .form-item input:focus { border-color: transparent !important; @@ -51,13 +53,17 @@ float: left; } .content .form .form-item .remind { - width: 292px; - line-height: 34px; + font-size: 12px; + margin-top: 10px; + margin-left: 120px; + width: 550px; + line-height: 20px; color: #777; - background-color: #ecf8ff; - padding: 0 16px; + background-color: #fff6e7; + padding: 0 12px; border-radius: 3px; float: left; + border:1px solid #d7d7d7; } .install_progress_a { @@ -69,5 +75,20 @@ text-align: center; padding: 20px 0; color: #777; +} +.content .form .form-item textarea { + height: 100px; + width: 550px; + line-height: 25px; + border: 1px solid #d7d7d7; + padding: 0 10px; + /* margin-right: 20px; */ + float: left; + border-radius: 5px; + color: #8c8c8c; } +.content .form .form-item textarea:focus { + border-color: transparent !important; + outline-color: #3e84e9; +} \ No newline at end of file diff --git a/update_sql_20210227.sql b/update_sql_20210227.sql new file mode 100644 index 0000000..92089a8 --- /dev/null +++ b/update_sql_20210227.sql @@ -0,0 +1,2 @@ +UPDATE `5kcrm_admin_field` SET `operating`= 3, `field` = 'owner_user_id', `form_type` = 'single_user' WHERE `types` = 'crm_visit' AND `field` = 'visit_user_id'; +UPDATE `5kcrm_admin_field` SET `operating`= 3 WHERE `types` = 'crm_visit' AND `field` = 'contacts_id'; \ No newline at end of file