From 001057edb00240f7361c3c68207d4ed0167f4ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 26 Oct 2017 17:26:09 +0800 Subject: [PATCH 1/4] * + my score log --- config/zentaopms.php | 1 + module/common/lang/en.php | 9 +-- module/common/lang/menuOrder.php | 1 + module/common/lang/zh-cn.php | 15 +++-- module/common/lang/zh-tw.php | 9 +-- module/common/model.php | 2 +- module/custom/lang/en.php | 35 +++++----- module/custom/lang/zh-cn.php | 35 +++++----- module/custom/lang/zh-tw.php | 31 ++++----- module/custom/model.php | 3 +- module/custom/view/score.html.php | 2 +- module/score/config.php | 52 +++++++++++++++ module/score/control.php | 43 +++++++++++-- module/score/lang/zh-cn.php | 26 +++++--- module/score/model.php | 103 +++++++++++++++++++++++++++++- module/score/view/browse.html.php | 54 +++++++++------- module/user/control.php | 2 +- 17 files changed, 316 insertions(+), 107 deletions(-) diff --git a/config/zentaopms.php b/config/zentaopms.php index e5dc9271ee..5b0b70f331 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -106,6 +106,7 @@ define('TABLE_ENTRY', '`' . $config->db->prefix . 'entry`'); define('TABLE_WEBHOOK', '`' . $config->db->prefix . 'webhook`'); define('TABLE_WEBHOOKDATAS', '`' . $config->db->prefix . 'webhookdatas`'); define('TABLE_LOG', '`' . $config->db->prefix . 'log`'); +define('TABLE_SCORE', '`' . $config->db->prefix . 'score`'); if(!defined('TABLE_LANG')) define('TABLE_LANG', '`' . $config->db->prefix . 'lang`'); $config->objectTables['product'] = TABLE_PRODUCT; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 4be2bdbdcc..f838adff7e 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -175,10 +175,14 @@ $lang->my->menu->dynamic = 'Dynamic|my|dynamic|'; $lang->my->menu->profile = array('link' => 'Profile|my|profile', 'alias' => 'editprofile'); $lang->my->menu->changePassword = 'Password|my|changepassword'; $lang->my->menu->manageContacts = 'Contact|my|managecontacts'; +$lang->my->menu->score = array('link' => 'Score|score|browse', 'subModule' => 'score'); $lang->todo = new stdclass(); $lang->todo->menu = $lang->my->menu; +$lang->score = new stdclass(); +$lang->score->menu = $lang->my->menu; + /* 产品视图设置。*/ $lang->product = new stdclass(); $lang->product->menu = new stdclass(); @@ -342,7 +346,6 @@ $lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' = $lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); $lang->admin->menu->entry = array('link' => 'API|entry|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); -$lang->admin->menu->score = array('link' => 'Score|score|browse', 'subModule' => 'score'); $lang->admin->menu->sso = 'RangerTeam|admin|sso'; $lang->convert = new stdclass(); @@ -355,7 +358,6 @@ $lang->editor = new stdclass(); $lang->mail = new stdclass(); $lang->cron = new stdclass(); $lang->dev = new stdclass(); -$lang->score = new stdclass(); $lang->entry = new stdclass(); $lang->webhook = new stdclass(); $lang->search = new stdclass(); @@ -370,7 +372,6 @@ $lang->custom->menu = $lang->admin->menu; $lang->editor->menu = $lang->admin->menu; $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; -$lang->score->menu = $lang->admin->menu; $lang->webhook->menu = $lang->admin->menu; /* 菜单分组。*/ @@ -394,6 +395,7 @@ $lang->menugroup->testreport = 'qa'; $lang->menugroup->people = 'company'; $lang->menugroup->dept = 'company'; $lang->menugroup->todo = 'my'; +$lang->menugroup->score = 'my'; $lang->menugroup->action = 'admin'; $lang->menugroup->backup = 'admin'; $lang->menugroup->cron = 'admin'; @@ -402,7 +404,6 @@ $lang->menugroup->custom = 'admin'; $lang->menugroup->editor = 'admin'; $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; -$lang->menugroup->score = 'admin'; $lang->menugroup->entry = 'admin'; $lang->menugroup->webhook = 'admin'; diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php index 3ebb7c9c39..03dd92422e 100644 --- a/module/common/lang/menuOrder.php +++ b/module/common/lang/menuOrder.php @@ -25,6 +25,7 @@ $lang->my->menuOrder[40] = 'myProject'; $lang->my->menuOrder[45] = 'dynamic'; $lang->my->menuOrder[50] = 'profile'; $lang->my->menuOrder[55] = 'changePassword'; +$lang->my->menuOrder[60] = 'score'; $lang->todo->menuOrder = $lang->my->menuOrder; /* product menu order. */ diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 6cd145fdb4..0b8b7aa470 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -167,18 +167,22 @@ $lang->my->menu->account = array('link' => 'projectCommon}|my|project|"; $lang->my->menu->dynamic = '动态|my|dynamic|'; $lang->my->menu->profile = array('link' => '档案|my|profile', 'alias' => 'editprofile'); $lang->my->menu->changePassword = '密码|my|changepassword'; $lang->my->menu->manageContacts = '联系人|my|managecontacts'; +$lang->my->menu->score = array('link' => '积分|score|browse', 'subModule' => 'score'); -$lang->todo = new stdclass(); +$lang->todo = new stdclass(); $lang->todo->menu = $lang->my->menu; +$lang->score = new stdclass(); +$lang->score->menu = $lang->my->menu; + /* 产品视图设置。*/ $lang->product = new stdclass(); $lang->product->menu = new stdclass(); @@ -342,7 +346,6 @@ $lang->admin->menu->cron = array('link' => '计划任务|cron|index', 'subM $lang->admin->menu->trashes = array('link' => '回收站|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => '二次开发|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); $lang->admin->menu->entry = array('link' => '接口|entry|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); -$lang->admin->menu->score = array('link' => '积分|score|browse', 'subModule' => 'score'); $lang->admin->menu->sso = '然之集成|admin|sso'; $lang->convert = new stdclass(); @@ -358,7 +361,6 @@ $lang->dev = new stdclass(); $lang->entry = new stdclass(); $lang->webhook = new stdclass(); $lang->search = new stdclass(); -$lang->score = new stdclass(); $lang->convert->menu = $lang->admin->menu; $lang->upgrade->menu = $lang->admin->menu; @@ -370,7 +372,6 @@ $lang->custom->menu = $lang->admin->menu; $lang->editor->menu = $lang->admin->menu; $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; -$lang->score->menu = $lang->admin->menu; $lang->entry->menu = $lang->admin->menu; $lang->webhook->menu = $lang->admin->menu; @@ -395,6 +396,7 @@ $lang->menugroup->testreport = 'qa'; $lang->menugroup->people = 'company'; $lang->menugroup->dept = 'company'; $lang->menugroup->todo = 'my'; +$lang->menugroup->score = 'my'; $lang->menugroup->action = 'admin'; $lang->menugroup->backup = 'admin'; $lang->menugroup->cron = 'admin'; @@ -403,7 +405,6 @@ $lang->menugroup->custom = 'admin'; $lang->menugroup->editor = 'admin'; $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; -$lang->menugroup->score = 'admin'; $lang->menugroup->entry = 'admin'; $lang->menugroup->webhook = 'admin'; diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php index d05ad0e980..4a68c6a53b 100644 --- a/module/common/lang/zh-tw.php +++ b/module/common/lang/zh-tw.php @@ -175,10 +175,14 @@ $lang->my->menu->dynamic = '動態|my|dynamic|'; $lang->my->menu->profile = array('link' => '檔案|my|profile', 'alias' => 'editprofile'); $lang->my->menu->changePassword = '密碼|my|changepassword'; $lang->my->menu->manageContacts = '聯繫人|my|managecontacts'; +$lang->my->menu->score = array('link' => '積分|score|browse', 'subModule' => 'score'); $lang->todo = new stdclass(); $lang->todo->menu = $lang->my->menu; +$lang->score = new stdclass(); +$lang->scoret->menu = $lang->my->menu; + /* 產品視圖設置。*/ $lang->product = new stdclass(); $lang->product->menu = new stdclass(); @@ -341,7 +345,6 @@ $lang->admin->menu->safe = array('link' => '安全|admin|safe', 'alias' => $lang->admin->menu->cron = array('link' => '計劃任務|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => '資源回收筒|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => '二次開發|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->score = array('link' => '積分|score|browse', 'subModule' => 'score'); $lang->admin->menu->sso = '然之整合|admin|sso'; $lang->convert = new stdclass(); @@ -355,7 +358,6 @@ $lang->mail = new stdclass(); $lang->cron = new stdclass(); $lang->dev = new stdclass(); $lang->search = new stdclass(); -$lang->score = new stdclass(); $lang->convert->menu = $lang->admin->menu; $lang->upgrade->menu = $lang->admin->menu; @@ -367,7 +369,6 @@ $lang->custom->menu = $lang->admin->menu; $lang->editor->menu = $lang->admin->menu; $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; -$lang->scoret->menu = $lang->admin->menu; /* 菜單分組。*/ $lang->menugroup = new stdclass(); @@ -390,6 +391,7 @@ $lang->menugroup->testreport = 'qa'; $lang->menugroup->people = 'company'; $lang->menugroup->dept = 'company'; $lang->menugroup->todo = 'my'; +$lang->menugroup->score = 'my'; $lang->menugroup->action = 'admin'; $lang->menugroup->backup = 'admin'; $lang->menugroup->cron = 'admin'; @@ -398,7 +400,6 @@ $lang->menugroup->custom = 'admin'; $lang->menugroup->editor = 'admin'; $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; -$lang->menugroup->score = 'admin'; /* 錯誤提示信息。*/ $lang->error = new stdclass(); diff --git a/module/common/model.php b/module/common/model.php index 941b993d29..92dd1eb233 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -164,6 +164,7 @@ class commonModel extends model if($module == 'tutorial') return true; if($module == 'block') return true; if($module == 'product' and $method == 'showerrornone') return true; + if($module == 'score' and $method == 'browse') return true; } return false; } @@ -1131,7 +1132,6 @@ class commonModel extends model /* Check is the super admin or not. */ if(!empty($app->user->admin)) return true; - /* If not super admin, check the rights. */ $rights = $app->user->rights['rights']; $acls = $app->user->rights['acls']; diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 11c4861bb0..403292a831 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -1,21 +1,22 @@ custom->common = 'Custom'; -$lang->custom->index = 'Home'; -$lang->custom->set = 'Customize'; -$lang->custom->restore = 'Reset to Default'; -$lang->custom->key = 'Key'; -$lang->custom->value = 'Value'; -$lang->custom->flow = 'Process'; -$lang->custom->working = 'Working'; -$lang->custom->select = 'Select Process'; -$lang->custom->branch = 'Multi Branch'; -$lang->custom->owner = 'Owner'; -$lang->custom->module = 'Module'; -$lang->custom->section = 'Section'; -$lang->custom->lang = 'Language'; -$lang->custom->setPublic = 'Set Public'; -$lang->custom->required = 'Required'; -$lang->custom->score = 'Score'; +$lang->custom->common = 'Custom'; +$lang->custom->index = 'Home'; +$lang->custom->set = 'Customize'; +$lang->custom->restore = 'Reset to Default'; +$lang->custom->key = 'Key'; +$lang->custom->value = 'Value'; +$lang->custom->flow = 'Process'; +$lang->custom->working = 'Working'; +$lang->custom->select = 'Select Process'; +$lang->custom->branch = 'Multi Branch'; +$lang->custom->owner = 'Owner'; +$lang->custom->module = 'Module'; +$lang->custom->section = 'Section'; +$lang->custom->lang = 'Language'; +$lang->custom->setPublic = 'Set Public'; +$lang->custom->required = 'Required'; +$lang->custom->score = 'Score'; +$lang->custom->scoreReset = 'Reset Score'; $lang->custom->object['story'] = 'Story'; $lang->custom->object['task'] = 'Task'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index 724a8eab32..4c9205a2c6 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -1,21 +1,22 @@ custom->common = '自定义'; -$lang->custom->index = '首页'; -$lang->custom->set = '自定义配置'; -$lang->custom->restore = '恢复默认'; -$lang->custom->key = '键'; -$lang->custom->value = '值'; -$lang->custom->flow = '流程'; -$lang->custom->working = '工作方式'; -$lang->custom->select = '请选择流程:'; -$lang->custom->branch = '多分支'; -$lang->custom->owner = '所有者'; -$lang->custom->module = '模块'; -$lang->custom->section = '附加部分'; -$lang->custom->lang = '所属语言'; -$lang->custom->setPublic = '设为公共'; -$lang->custom->required = '必填项'; -$lang->custom->score = '积分'; +$lang->custom->common = '自定义'; +$lang->custom->index = '首页'; +$lang->custom->set = '自定义配置'; +$lang->custom->restore = '恢复默认'; +$lang->custom->key = '键'; +$lang->custom->value = '值'; +$lang->custom->flow = '流程'; +$lang->custom->working = '工作方式'; +$lang->custom->select = '请选择流程:'; +$lang->custom->branch = '多分支'; +$lang->custom->owner = '所有者'; +$lang->custom->module = '模块'; +$lang->custom->section = '附加部分'; +$lang->custom->lang = '所属语言'; +$lang->custom->setPublic = '设为公共'; +$lang->custom->required = '必填项'; +$lang->custom->score = '积分'; +$lang->custom->scoreReset = '重置积分'; $lang->custom->object['story'] = '需求'; $lang->custom->object['task'] = '任务'; diff --git a/module/custom/lang/zh-tw.php b/module/custom/lang/zh-tw.php index 72ee63581c..2558d4505a 100644 --- a/module/custom/lang/zh-tw.php +++ b/module/custom/lang/zh-tw.php @@ -1,19 +1,20 @@ custom->common = '自定義'; -$lang->custom->index = '首頁'; -$lang->custom->set = '自定義配置'; -$lang->custom->restore = '恢復預設'; -$lang->custom->key = '鍵'; -$lang->custom->value = '值'; -$lang->custom->flow = '流程'; -$lang->custom->working = '工作方式'; -$lang->custom->select = '請選擇流程:'; -$lang->custom->branch = '多分支'; -$lang->custom->owner = '所有者'; -$lang->custom->module = '模組'; -$lang->custom->section = '附加部分'; -$lang->custom->lang = '所屬語言'; -$lang->custom->score = '積分'; +$lang->custom->common = '自定義'; +$lang->custom->index = '首頁'; +$lang->custom->set = '自定義配置'; +$lang->custom->restore = '恢復預設'; +$lang->custom->key = '鍵'; +$lang->custom->value = '值'; +$lang->custom->flow = '流程'; +$lang->custom->working = '工作方式'; +$lang->custom->select = '請選擇流程:'; +$lang->custom->branch = '多分支'; +$lang->custom->owner = '所有者'; +$lang->custom->module = '模組'; +$lang->custom->section = '附加部分'; +$lang->custom->lang = '所屬語言'; +$lang->custom->score = '積分'; +$lang->custom->scoreReset = '重置積分'; $lang->custom->object['story'] = '需求'; $lang->custom->object['task'] = '任務'; diff --git a/module/custom/model.php b/module/custom/model.php index 9da99345ac..e5bdc35521 100644 --- a/module/custom/model.php +++ b/module/custom/model.php @@ -282,12 +282,11 @@ class customModel extends model $allMenu = $module == 'main' ? $lang->menu : (isset($lang->$module->menu) ? $lang->$module->menu : $lang->my->menu); if($module == 'product' and isset($allMenu->branch)) $allMenu->branch = str_replace('@branch@', $lang->custom->branch, $allMenu->branch); if($module != 'main' and isset($lang->menugroup->$module)) $module = $lang->menugroup->$module; - if($module == 'admin' and empty($config->global->score)) unset($allMenu->score); $flowModule = $config->global->flow . '_' . $module; $customMenu = isset($config->customMenu->$flowModule) ? $config->customMenu->$flowModule : array(); if(commonModel::isTutorialMode() && $module === 'main')$customMenu = 'my,product,project,qa,company'; if(!empty($customMenu) && is_string($customMenu) && substr($customMenu, 0, 1) === '[') $customMenu = json_decode($customMenu); - + if($module == 'my' && empty($config->global->score)) unset($allMenu->score); $menu = self::setMenuByConfig($allMenu, $customMenu, $module); return $menu; } diff --git a/module/custom/view/score.html.php b/module/custom/view/score.html.php index 3449b9a501..9b3127bd93 100644 --- a/module/custom/view/score.html.php +++ b/module/custom/view/score.html.php @@ -19,7 +19,7 @@ - + " . $lang->custom->scoreReset, '', "class='btn'");?> diff --git a/module/score/config.php b/module/score/config.php index b3d9bbc7f3..ad0ee7bf97 100644 --- a/module/score/config.php +++ b/module/score/config.php @@ -1 +1,53 @@ score = new stdClass(); + +$config->score->model['user']['login'] = array('num'=>3, 'time'=>24, 'score'=>1, 'other'=>''); + + + + + + + + +$config->score->model['tutorial']['keepAll'] = array(1, 0, 100, ''); +$config->score->model['my']['changePassword'] = array(1, 0, 10, array(1 => 2, 2 => 5)); +$config->score->model['my']['editProfile'] = array(1, 0, 10, ''); + +$config->score->model['block']['admin'] = array(1, 0, 20, ''); + +$config->score->model['ajax']['selectTheme'] = array(1, 0, 10, ''); +$config->score->model['ajax']['selectLang'] = array(1, 0, 10, ''); +$config->score->model['ajax']['showSearchMenu'] = array(1, 0, 10, ''); +$config->score->model['ajax']['dragSelected'] = array(1, 0, 20, ''); +$config->score->model['ajax']['lastNext'] = array(1, 0, 20, ''); +$config->score->model['ajax']['switchToDataTable'] = array(1, 0, 1, ''); +$config->score->model['ajax']['submitPage'] = array(1, 0, 1, ''); + +$config->score->model['bug']['saveTplModal'] = array(1, 0, 20, ''); + +$config->score->model['custom']['ajaxMenu'] = array(1, 0, 1, ''); + +$config->score->model['search']['saveQuery'] = array(1, 0, 1, ''); +$config->score->model['search']['saveQueryAdvanced'] = array(1, 0, 1, ''); + + +$config->score->model['my']['todo'] = array(5, 24, 1, ''); + +$config->score->model['story']['create'] = array(0, 0, 1, '');//需求 +$config->score->model['task']['create'] = array(0, 0, 1, '');//任务 +$config->score->model['bug']['create'] = array(0, 0, 1, '');//bug 有效之后,额外增加严重程度积分:s1 + 3, s2 + 2, s3 + 1 +$config->score->model['doc']['create'] = array(0, 0, 5, '');//文档 +$config->score->model['testcase']['create'] = array(0, 0, 1, '');//用例 + +//每完成一个任务,增加初始积分1 + 工时积分round(工时 /10 * 预计 / 消耗) + 优先级积分(p1 2, p2, 1) 如果任务取消了,没有积分。 +$config->score->model['task']['finish'] = array(0, 0, 1, array('time'=>'#time#/10 * #estimate# / #consumed#','pri'=>array(0=>0,1=>2,2=>1,3=>0)));//关闭一个任务,关闭者增加一个积分。 +$config->score->model['task']['close'] = array(0, 0, 1, '');//关闭一个任务,关闭者增加一个积分。 +$config->score->model['bug']['resolve'] = array(0, 0, 1, '');//解决一个bug,额外增加解决bug积分:s1 + 3, s2 + 2, s3 + 1 +$config->score->model['testcase']['runCase'] = array(0, 0, 1, '');//每执行一次用例,加1分 +$config->score->model['bug']['createFormCase'] = array(0, 0, 1, '');//从用例创建bug,用例的创建者加1分 +$config->score->model['project']['build'] = array(0, 0, 10, '');//创建一个build,创建者增加10个积分 +$config->score->model['project']['create'] = array(0, 0, 10, '');//创建一个项目,创建者增加10个积分 +$config->score->model['productplan']['create'] = array(0, 0, 10, '');//创建一个计划,创建者增加10个积分 +$config->score->model['release']['create'] = array(0, 0, 10, '');//创建一个发布,创建者增加10个积分 +$config->score->model['story']['close'] = array(0, 0, 1, array('createID'=>2));//每个需求被完成关闭,需求的创建者额外增加2分,关闭者增加1分 diff --git a/module/score/control.php b/module/score/control.php index 4cb167c4ec..67bb245892 100644 --- a/module/score/control.php +++ b/module/score/control.php @@ -1,7 +1,6 @@ * @package score @@ -11,20 +10,56 @@ class score extends control { /** - * score list + * score constructor. + * + * @param string $module + * @param string $method * * @access public * @return mixed */ - public function browse($recTotal = 0, $recPerPage = 100) + public function __construct($module = '', $method = '') + { + parent::__construct($module, $method); + $this->loadModel('my')->setMenu(); + } + + /** + * Get score list + * + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * + * @access public + * @return mixed + */ + public function browse($recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage); + $pager = new pager($recTotal, $recPerPage, $pageID); $scores = $this->score->getScores($pager); + $this->loadModel('score')->score('user','login'); + $this->view->title = $this->lang->score->common; + $this->view->user = $this->loadModel('user')->getById($this->app->user->account); $this->view->pager = $pager; $this->view->scores = $scores; $this->display(); } + + /** + * Ajax action score + * + * @param string $method + * + * @access public + * @return void + */ + public function ajax($method = '') + { + //处理由ajax提交过来的任务,主要是一次性任务 在请求模型的时候model=ajax, + $this->loadModel('score')->score('ajax','login'); + } } \ No newline at end of file diff --git a/module/score/lang/zh-cn.php b/module/score/lang/zh-cn.php index f090ab8c1b..6fb608bd3c 100644 --- a/module/score/lang/zh-cn.php +++ b/module/score/lang/zh-cn.php @@ -1,17 +1,27 @@ score->common = '积分'; -$lang->score->record = '积分记录'; -$lang->score->reset = '重置积分'; +$lang->score->common = '积分'; +$lang->score->record = '积分记录'; +$lang->score->current = '当前积分'; +$lang->score->level = '等级积分'; $lang->score->id = '编号'; $lang->score->userID = '用户ID'; $lang->score->account = '用户'; $lang->score->model = '模块'; -$lang->score->method = '方式'; -$lang->score->type = '类型'; +$lang->score->method = '动作'; +$lang->score->before = '之前'; $lang->score->score = '分值'; +$lang->score->after = '之后'; $lang->score->time = '时间'; +$lang->score->desc = '描述'; -$lang->score->methods['login'] = '登录'; -$lang->score->methods['admin'] = ''; -$lang->score->methods['tutorial'] = '新手教程'; + +$lang->score->models['task'] = '任务'; +$lang->score->models['tutorial'] = '新手教程'; +$lang->score->models['system'] = '系统'; +$lang->score->models['user'] = '用户'; + +$lang->score->methods['task']['create'] = '创建任务'; +$lang->score->methods['tutorial']['finish'] = '任务完成'; +$lang->score->methods['system']['bug'] = '长得丑'; +$lang->score->methods['user']['login'] = '登录'; \ No newline at end of file diff --git a/module/score/model.php b/module/score/model.php index c418afc981..20a40538a0 100644 --- a/module/score/model.php +++ b/module/score/model.php @@ -1,7 +1,6 @@ * @package score @@ -10,9 +9,109 @@ */ class scoreModel extends model { + /** + * get user score logs + * + * @param $pager + * + * @access public + * @return array|bool + */ public function getScores($pager) + { + $scores = $this->dao->select('*')->from(TABLE_SCORE)->where('account')->eq($this->app->user->account)->orderBy('time_desc,id_desc')->page($pager)->fetchAll(); + return empty($scores) ? array() : $scores; + } + + /** + * add score logs + * + * @param string $model + * @param string $method + * @param string $param + * + * @access public + * @return bool + */ + public function score($model = '', $method = '', $param = '') + { + if(empty($this->config->score->model[$model][$method])) return true; + switch($model) + { + case 'user': + $desc = $this->lang->score->methods[$model][$method].'IP:'.helper::getRemoteIp(); + $this->saveScore($this->app->user->account, $this->config->score->model[$model][$method], $model, $method, $desc); + break; + case 'ajax': + break; + case 'tutorial': + break; + case 'my': + break; + case 'all': + break; + } + } + + /** + * save user score + * + * @param string $account + * @param array $rule + * @param string $model + * @param string $method + * @param string $desc + * + * @access private + * @return bool + */ + private function saveScore($account = '', $rule = array(), $model = '', $method = '', $desc = '') + { + if(!empty($rule['num']) || !empty($rule['time'])) + { + if(empty($rule['time'])) + { + $count = $this->dao->slect('id')->from(TABLE_SCORE)->where('account')->eq($account)->andWhere('model')->eq($model)->andWhere('method')->eq($method)->count('id'); + if($count >= $rule['num']) return true; + } + else + { + $count = $this->dao->select('id')->from(TABLE_SCORE)->where('account')->eq($account)->andWhere('time')->between(date('Y-m-d 0:0:0'), date('Y-m-d 23:59:59'))->andWhere('model')->eq($model)->andWhere('method')->eq($method)->count('id'); + if($count >= $rule['num']) return true; + } + } + + $this->dao->begin(); + try + { + $user = $this->loadModel('user')->getById($account); + + $data = new stdClass(); + $data->account = $account; + $data->model = $model; + $data->method = $method; + $data->desc = $desc; + $data->before = $user->score; + $data->score = $rule['score']; + $data->after = $user->score + $rule['score']; + $data->time = helper::now(); + $this->dao->insert(TABLE_SCORE)->data($data)->exec(); + $this->dao->query("UPDATE " . TABLE_USER . " SET `score`=`score` + " . $rule['score'] . ",`score_level`=`score_level` + " . $rule['score'] . " WHERE `account`='" . $account . "'"); + $this->dao->commit(); + } + catch(ErrorException $e) + { + $this->dao->rollBack(); + } + } + + /** + * reset all user score and level score + * @access public + * @return void + */ + public function resetScore() { } - } \ No newline at end of file diff --git a/module/score/view/browse.html.php b/module/score/view/browse.html.php index 82f353c61c..4ac0b3ca99 100644 --- a/module/score/view/browse.html.php +++ b/module/score/view/browse.html.php @@ -1,7 +1,6 @@ @@ -10,38 +9,45 @@ * @link http://www.zentao.net */ ?> - -
-
icons['score']);?> score->record;?>
+ +
+
icons['score']); ?>score->record; ?>
- " . $lang->score->reset, '', "class='btn'");?> + score; ?> + score_level; ?>
-
- + +
- - - - - - - + + + + + + + - - - - - + + + + + + + + + + + - + -
score->id;?>score->account;?>score->model;?>score->method;?>score->type;?>score->score;?>score->time;?>score->time; ?>score->model; ?>score->method; ?>score->before; ?>score->score; ?>score->after; ?>score->desc; ?>
time; ?>score->models[$score->model]; ?>score->methods[$score->model][$score->method]; ?>before; ?>score; ?>after; ?>desc; ?>
- show();?> - + show(); ?> +
- \ No newline at end of file + + \ No newline at end of file diff --git a/module/user/control.php b/module/user/control.php index fdf549d6d8..c92d5353d6 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -691,7 +691,7 @@ class user extends control $this->session->set('user', $user); $this->app->user = $this->session->user; $this->loadModel('action')->create('user', $user->id, 'login'); - + $this->loadModel('score')->score('user','login'); /* Keep login. */ if($this->post->keepLogin) $this->user->keepLogin($user); From 0f2eb04f6aa0fbe36e5f746e52ff52cc311d3b0a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 27 Oct 2017 14:21:12 +0800 Subject: [PATCH 2/4] =?UTF-8?q?Fix=20bug#1258=20=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=8F=90=E9=86=92=E6=9C=89=E9=94=99=E8=AF=AF=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/report/control.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/report/control.php b/module/report/control.php index 3b39da197c..83ac588831 100644 --- a/module/report/control.php +++ b/module/report/control.php @@ -210,6 +210,8 @@ class report extends control /* Get email content and title.*/ $this->view->mail = $mail; + $this->view->mailTitle = $mailTitle; + $oldViewType = $this->viewType; if($oldViewType == 'json') $this->viewType = 'html'; $mailContent = $this->parse('report', 'dailyreminder'); From a0e8b24f25c2d2b53f39d3285def2c2b293029c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 27 Oct 2017 23:46:50 +0800 Subject: [PATCH 3/4] * + score model --- module/block/control.php | 2 + module/block/model.php | 1 + module/bug/model.php | 11 ++-- module/build/model.php | 1 + module/productplan/model.php | 1 + module/project/model.php | 4 +- module/release/model.php | 1 + module/score/config.php | 41 ++++++++------- module/score/lang/zh-cn.php | 76 ++++++++++++++++++--------- module/score/model.php | 86 +++++++++++++++++++++++++++++-- module/score/view/browse.html.php | 2 +- module/search/model.php | 6 ++- module/story/model.php | 4 +- module/task/model.php | 12 ++--- module/testcase/model.php | 2 + module/testtask/model.php | 2 + www/js/my.full.js | 15 ++++++ 17 files changed, 203 insertions(+), 64 deletions(-) diff --git a/module/block/control.php b/module/block/control.php index 2b6c9a5d1d..dbddafe7cb 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -131,6 +131,7 @@ class block extends control $this->dao->delete()->from(TABLE_BLOCK)->where('`id`')->eq($id)->andWhere('account')->eq($this->app->user->account)->andWhere('module')->eq($module)->exec(); } if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); + $this->loadModel('score')->score('block', 'set'); $this->send(array('result' => 'success')); } @@ -157,6 +158,7 @@ class block extends control } if(dao::isError()) $this->send(array('result' => 'fail')); + $this->loadModel('score')->score('block', 'set'); $this->send(array('result' => 'success')); } diff --git a/module/block/model.php b/module/block/model.php index 42ea4fbb4e..4105500cfb 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -50,6 +50,7 @@ class blockModel extends model $data->params = helper::jsonEncode($data->params); $this->dao->replace(TABLE_BLOCK)->data($data)->exec(); + $this->loadModel('score')->score('block', 'set'); } /** diff --git a/module/bug/model.php b/module/bug/model.php index 8aa51a3250..8c47787223 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -85,6 +85,7 @@ class bugModel extends model $bugID = $this->dao->lastInsertID(); $this->file->updateObjectID($this->post->uid, $bugID, 'bug'); $this->file->saveUpload('bug', $bugID); + empty($bug->case) ? $this->loadModel('score')->score('bug', 'create', $bugID) : $this->loadModel('score')->score('bug', 'createFormCase', $bug->case); return array('status' => 'created', 'id' => $bugID); } return false; @@ -199,7 +200,7 @@ class bugModel extends model $this->dao->insert(TABLE_BUG)->data($bug)->autoCheck()->batchCheck($this->config->bug->create->requiredFields, 'notempty')->exec(); $bugID = $this->dao->lastInsertID(); - + $this->loadModel('score')->score('bug', 'create', $bugID); if(!empty($data->uploadImage[$i]) and !empty($file)) { $file['objectType'] = 'bug'; @@ -223,7 +224,7 @@ class bugModel extends model if(is_dir($realPath)) $classFile->removeDir($realPath); unset($_SESSION['bugImagesFile']); } - + $this->loadModel('score')->score('ajax', 'batchCreate'); return $actions; } @@ -654,7 +655,7 @@ class bugModel extends model } } } - + $this->loadModel('score')->score('ajax', 'batchEdit'); return $allChanges; } @@ -758,6 +759,7 @@ class bugModel extends model ->get(); $this->dao->update(TABLE_BUG)->data($bug)->where('id')->eq($bugID)->exec(); + $this->loadModel('score')->score('bug', 'confirmBug', $oldBug); if(!dao::isError()) return common::createChanges($oldBug, $bug); } @@ -846,7 +848,7 @@ class bugModel extends model ->checkIF($bug->resolution == 'fixed', 'resolvedBuild','notempty') ->where('id')->eq((int)$bugID) ->exec(); - + $this->loadModel('score')->score('bug', 'resolve', $oldBug); /* Link bug to build and release. */ $this->linkBugToBuild($bugID, $bug->resolvedBuild); } @@ -1853,6 +1855,7 @@ class bugModel extends model $condition = "`type`='bug' and account='{$this->app->user->account}'"; $this->dao->insert(TABLE_USERTPL)->data($template)->batchCheck('title, content', 'notempty')->check('title', 'unique', $condition)->exec(); + $this->loadModel('score')->score('bug', 'saveTplModal', $this->dao->lastInsertID()); } /** diff --git a/module/build/model.php b/module/build/model.php index 7215c274c8..b120518b44 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -213,6 +213,7 @@ class buildModel extends model $buildID = $this->dao->lastInsertID(); $this->file->updateObjectID($this->post->uid, $buildID, 'build'); $this->file->saveUpload('build', $buildID); + $this->loadModel('score')->score('build', 'create', $buildID); return $buildID; } } diff --git a/module/productplan/model.php b/module/productplan/model.php index 029ebbd53a..5923f7bcb6 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -151,6 +151,7 @@ class productplanModel extends model { $planID = $this->dao->lastInsertID(); $this->file->updateObjectID($this->post->uid, $planID, 'plan'); + $this->loadModel('score')->score('productplan', 'create', $planID); return $planID; } } diff --git a/module/project/model.php b/module/project/model.php index 5ceb134028..709a63e87a 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -291,7 +291,7 @@ class projectModel extends model $lib->main = '1'; $lib->acl = $project->acl == 'open' ? 'open' : 'private'; $this->dao->insert(TABLE_DOCLIB)->data($lib)->exec(); - + $this->loadModel('score')->score('project', 'create', $projectID); return $projectID; } } @@ -537,7 +537,7 @@ class projectModel extends model ->autoCheck() ->where('id')->eq((int)$projectID) ->exec(); - + $this->loadModel('score')->score('project', 'close', $oldProject); if(!dao::isError()) return common::createChanges($oldProject, $project); } diff --git a/module/release/model.php b/module/release/model.php index d7fdf1153d..4393038afa 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -145,6 +145,7 @@ class releaseModel extends model $releaseID = $this->dao->lastInsertID(); $this->file->updateObjectID($this->post->uid, $releaseID, 'release'); $this->file->saveUpload('release', $releaseID); + $this->loadModel('score')->score('release', 'create', $releaseID); if(!dao::isError()) return $releaseID; } diff --git a/module/score/config.php b/module/score/config.php index cbfd3b1739..c83cf8a182 100644 --- a/module/score/config.php +++ b/module/score/config.php @@ -15,36 +15,41 @@ $config->score->model['ajax']['lastNext'] = array('num' => 1, 'time' => $config->score->model['ajax']['switchToDataTable'] = array('num' => 1, 'time' => 0, 'score' => 1, 'other' => ''); $config->score->model['ajax']['submitPage'] = array('num' => 1, 'time' => 0, 'score' => 1, 'other' => ''); $config->score->model['ajax']['customMenu'] = array('num' => 1, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['ajax']['quickDump'] = array('num' => 1, 'time' => 0, 'score' => 10, 'other' => ''); +$config->score->model['ajax']['batchCreate'] = array('num' => 1, 'time' => 0, 'score' => 20, 'other' => ''); +$config->score->model['ajax']['batchEdit'] = array('num' => 1, 'time' => 0, 'score' => 20, 'other' => ''); -$config->score->model['doc']['create'] = array('num' => 0, 'time' => 0, 'score' => 5, 'other' => ''); +$config->score->model['doc']['create'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); $config->score->model['todo']['create'] = array('num' => 5, 'time' => 24, 'score' => 1, 'other' => ''); $config->score->model['story']['create'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); $config->score->model['story']['close'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => array('createID' => 2));//每个需求被完成关闭,需求的创建者额外增加2分,关闭者增加1分 +$config->score->model['task']['create'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['task']['close'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['task']['finish'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => array(1 => 2, 2 => 1, 3 => 0)); -$config->score->model['block']['admin'] = array(1, 0, 20, ''); +$config->score->model['bug']['create'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['bug']['confirmBug'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => array(1 => 3, 2 => 2, 3 => 1)); +$config->score->model['bug']['createFormCase'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['bug']['resolve'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => array(1 => 3, 2 => 2, 3 => 1)); +$config->score->model['bug']['saveTplModal'] = array('num' => 0, 'time' => 0, 'score' => 20, 'other' => ''); -$config->score->model['bug']['saveTplModal'] = array(1, 0, 20, ''); +$config->score->model['testTask']['runCase'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['testcase']['create'] = array('num' => 0, 'time' => 0, 'score' => 1, 'other' => ''); -$config->score->model['search']['saveQuery'] = array(1, 0, 1, ''); -$config->score->model['search']['saveQueryAdvanced'] = array(1, 0, 1, ''); +$config->score->model['build']['create'] = array('num' => 0, 'time' => 0, 'score' => 10, 'other' => ''); +$config->score->model['project']['create'] = array('num' => 0, 'time' => 0, 'score' => 10, 'other' => ''); +$config->score->model['project']['close'] = array('num' => 0, 'time' => 0, 'score' => 0, 'other' => array('manager' => array(20, 10), 'member' => array(5, 5))); -$config->score->model['task']['create'] = array(0, 0, 1, '');//任务 -$config->score->model['bug']['create'] = array(0, 0, 1, '');//bug 有效之后,额外增加严重程度积分:s1 + 3, s2 + 2, s3 + 1 +$config->score->model['productplan']['create'] = array('num' => 0, 'time' => 0, 'score' => 10, 'other' => ''); -$config->score->model['testcase']['create'] = array(0, 0, 1, '');//用例 +$config->score->model['release']['create'] = array('num' => 0, 'time' => 0, 'score' => 10, 'other' => ''); -//每完成一个任务,增加初始积分1 + 工时积分round(工时 /10 * 预计 / 消耗) + 优先级积分(p1 2, p2, 1) 如果任务取消了,没有积分。 -$config->score->model['task']['finish'] = array(0, 0, 1, array('time' => '#time#/10 * #estimate# / #consumed#', 'pri' => array(0 => 0, 1 => 2, 2 => 1, 3 => 0)));//关闭一个任务,关闭者增加一个积分。 -$config->score->model['task']['close'] = array(0, 0, 1, '');//关闭一个任务,关闭者增加一个积分。 -$config->score->model['bug']['resolve'] = array(0, 0, 1, '');//解决一个bug,额外增加解决bug积分:s1 + 3, s2 + 2, s3 + 1 -$config->score->model['testcase']['runCase'] = array(0, 0, 1, '');//每执行一次用例,加1分 -$config->score->model['bug']['createFormCase'] = array(0, 0, 1, '');//从用例创建bug,用例的创建者加1分 -$config->score->model['project']['build'] = array(0, 0, 10, '');//创建一个build,创建者增加10个积分 -$config->score->model['project']['create'] = array(0, 0, 10, '');//创建一个项目,创建者增加10个积分 -$config->score->model['productplan']['create'] = array(0, 0, 10, '');//创建一个计划,创建者增加10个积分 -$config->score->model['release']['create'] = array(0, 0, 10, '');//创建一个发布,创建者增加10个积分 +$config->score->model['block']['set'] = array('num' => 1, 'time' => 0, 'score' => 20, 'other' => ''); + +$config->score->model['search']['saveQuery'] = array('num' => 1, 'time' => 0, 'score' => 1, 'other' => ''); +$config->score->model['search']['saveQueryAdvanced'] = array('num' => 1, 'time' => 0, 'score' => 1, 'other' => ''); diff --git a/module/score/lang/zh-cn.php b/module/score/lang/zh-cn.php index f5bff2ea6c..c2a0efbbcd 100644 --- a/module/score/lang/zh-cn.php +++ b/module/score/lang/zh-cn.php @@ -16,29 +16,55 @@ $lang->score->time = '时间'; $lang->score->desc = '描述'; -$lang->score->models['task'] = '任务'; -$lang->score->models['tutorial'] = '新手教程'; -$lang->score->models['user'] = '用户'; -$lang->score->models['ajax'] = 'UI'; -$lang->score->models['doc'] = '文档'; -$lang->score->models['todo'] = '待办'; -$lang->score->models['story'] = '需求'; +$lang->score->models['task'] = '任务'; +$lang->score->models['tutorial'] = '新手教程'; +$lang->score->models['user'] = '用户'; +$lang->score->models['ajax'] = ''; +$lang->score->models['doc'] = '文档'; +$lang->score->models['todo'] = '待办'; +$lang->score->models['story'] = '需求'; +$lang->score->models['bug'] = 'Bug'; +$lang->score->models['testTask'] = '用例'; +$lang->score->models['build'] = 'Build'; +$lang->score->models['project'] = '项目'; +$lang->score->models['productplan'] = '计划'; +$lang->score->models['release'] = '发布'; +$lang->score->models['block'] = '区块'; +$lang->score->models['search'] = '搜索'; - -$lang->score->methods['task']['create'] = '创建任务'; -$lang->score->methods['tutorial']['keepAll'] = '任务完成'; -$lang->score->methods['user']['login'] = '登录'; -$lang->score->methods['user']['changePassword'] = '修改密码'; -$lang->score->methods['user']['editProfile'] = '修改个人资料'; -$lang->score->methods['ajax']['selectTheme'] = '切换主题'; -$lang->score->methods['ajax']['selectLang'] = '切换语言'; -$lang->score->methods['ajax']['showSearchMenu'] = '搜索高级用法'; -$lang->score->methods['ajax']['customMenu'] = '自定义菜单'; -$lang->score->methods['ajax']['dragSelected'] = '列表页面拖动选中'; -$lang->score->methods['ajax']['lastNext'] = '快捷键翻页'; -$lang->score->methods['ajax']['switchToDataTable'] = '使用高级表格'; -$lang->score->methods['ajax']['submitPage'] = '修改分页数量'; -$lang->score->methods['doc']['create'] = '创建文档'; -$lang->score->methods['todo']['create'] = '创建待办'; -$lang->score->methods['story']['create'] = '创建需求'; -$lang->score->methods['story']['close'] = '需求关闭'; +$lang->score->methods['task']['create'] = '创建任务'; +$lang->score->methods['task']['close'] = '关闭任务'; +$lang->score->methods['task']['finish'] = '完成任务'; +$lang->score->methods['tutorial']['keepAll'] = '学习完成'; +$lang->score->methods['user']['login'] = '登录'; +$lang->score->methods['user']['changePassword'] = '修改密码'; +$lang->score->methods['user']['editProfile'] = '修改个人资料'; +$lang->score->methods['ajax']['selectTheme'] = '切换主题'; +$lang->score->methods['ajax']['selectLang'] = '切换语言'; +$lang->score->methods['ajax']['showSearchMenu'] = '搜索高级用法'; +$lang->score->methods['ajax']['customMenu'] = '自定义菜单'; +$lang->score->methods['ajax']['dragSelected'] = '列表页面拖动选中'; +$lang->score->methods['ajax']['lastNext'] = '快捷键翻页'; +$lang->score->methods['ajax']['switchToDataTable'] = '使用高级表格'; +$lang->score->methods['ajax']['submitPage'] = '修改分页数量'; +$lang->score->methods['ajax']['quickDump'] = '使用快速跳转'; +$lang->score->methods['ajax']['batchCreate'] = '首次使用批量添加'; +$lang->score->methods['ajax']['batchEdit'] = '首次使用批量编辑'; +$lang->score->methods['doc']['create'] = '创建文档'; +$lang->score->methods['todo']['create'] = '创建待办'; +$lang->score->methods['story']['create'] = '创建需求'; +$lang->score->methods['story']['close'] = '需求关闭'; +$lang->score->methods['bug']['create'] = '创建Bug'; +$lang->score->methods['bug']['confirmBug'] = '确认Bug'; +$lang->score->methods['bug']['createFormCase'] = '从用例创建'; +$lang->score->methods['bug']['resolve'] = '解决Bug'; +$lang->score->methods['bug']['saveTplModal'] = '保存模板'; +$lang->score->methods['testTask']['runCase'] = '执行用例'; +$lang->score->methods['build']['create'] = '创建版本'; +$lang->score->methods['project']['create'] = '创建项目'; +$lang->score->methods['project']['close'] = '项目完成'; +$lang->score->methods['productplan']['create'] = '创建计划'; +$lang->score->methods['release']['create'] = '创建发布'; +$lang->score->methods['block']['set'] = '区块自定义设置'; +$lang->score->methods['search']['saveQuery'] = '保存搜索条件'; +$lang->score->methods['search']['saveQueryAdvanced'] = '使用高级搜索'; diff --git a/module/score/model.php b/module/score/model.php index 76ca138580..def18a562c 100644 --- a/module/score/model.php +++ b/module/score/model.php @@ -37,7 +37,8 @@ class scoreModel extends model { if(empty($this->config->score->model[$model][$method])) return true; $rule = $this->config->score->model[$model][$method]; - $desc = $this->lang->score->methods[$model][$method]; + $desc = $this->lang->score->models[$model]; + $user = $this->app->user->account; switch($model) { case 'user': @@ -49,13 +50,13 @@ class scoreModel extends model } break; case 'doc': - if($method == 'create') $desc = $this->lang->score->models[$model] . 'ID:' . $param; + if($method == 'create') $desc .= 'ID:' . $param; break; case 'todo': - if($method == 'create') $desc = $this->lang->score->methods[$model][$method] . 'ID:' . $param; + if($method == 'create') $desc .= 'ID:' . $param; break; case 'story': - $desc = $this->lang->score->methods[$model][$method] . 'ID:' . $param; + $desc .= 'ID:' . $param; if($method == 'close') { $createUser = $this->dao->findById($param)->from(TABLE_STORY)->fetch(); @@ -68,8 +69,83 @@ class scoreModel extends model } } break; + case 'task': + $desc .= 'ID:' . $param; + if($method == 'finish') + { + $desc = $this->lang->score->methods[$model][$method] . 'ID:' . $param; + //每完成一个任务,增加初始积分1 + 工时积分round(工时 /10 * 预计 / 消耗) + 优先级积分(p1 2, p2, 1) 如果任务取消了,没有积分。 + $task = $this->loadModel('task')->getById($param); + if(!empty($rule['other'][$task->pri])) $rule['score'] = $rule['score'] + $rule['other'][$task->pri]; + if(!empty($task->estimate)) $rule['score'] = $rule['score'] + round(($task->consumed / 10 * $task->estimate / $task->consumed), 1); + } + break; + case 'bug': + $desc .= 'ID:' . $param; + if($method == 'createFormCase') + { + $desc = $this->lang->score->models['testcase'] . 'ID:' . $param; + $caseUser = $this->dao->findById($param)->from(TABLE_CASE)->fetch(); + if(!empty($caseUser)) + { + $user = $caseUser->openedBy; + } + } + if($method == 'saveTplModal') $desc = $this->lang->score->methods[$model][$method] . 'ID:' . $param; + if($method == 'confirmBug') + { + $user = $param->openedBy; + if(!empty($rule['other'][$param->severity])) $rule['score'] = $rule['score'] + $rule['other'][$param->severity]; + } + if($method == 'resolve' && !empty($rule['other'][$param->severity])) $rule['score'] = $rule['score'] + $rule['other'][$param->severity]; + break; + case 'testTask': + if($method == 'runCase') $desc = $this->lang->score->methods[$model][$method] . 'ID:' . $param; + break; + case 'build': + if($method == 'create') $desc .= 'ID:' . $param; + break; + case 'project': + if($method == 'create') $desc .= 'ID:' . $param; + if($method == 'close') + { + $desc = $this->lang->score->methods[$model][$method] . ',' . $desc . 'ID:' . $param->id; + if(!empty($param->PM)) + { + $rule['score'] = $param->end > date('Y-m-d') ? $rule['other']['manager'][0] + $rule['other']['manager'][1] : $rule['other']['manager'][0]; + $this->saveScore($param->PM, $rule, $model, $method, $desc); + } + $teams = $this->dao->select('account')->from(TABLE_TEAM)->where('project')->eq($param->id)->fetchGroup('account'); + if(!empty($teams)) + { + $users = array_keys($teams); + $rule['score'] = $param->end > date('Y-m-d') ? $rule['other']['member'][0] + $rule['other']['member'][1] : $rule['other']['member'][0]; + foreach($users as $user) + { + if($user != $param->PM) $this->saveScore($user, $rule, $model, $method, $desc); + } + } + } + return true; + break; + case 'productplan': + if($method == 'create') $desc .= 'ID:' . $param; + break; + case 'release': + if($method == 'create') $desc .= 'ID:' . $param; + break; + case 'testcase': + if($method == 'create') $desc .= 'ID:' . $param; + break; + case 'search': + if($method == 'saveQuery') $desc .= 'ID:' . $param; + if($method == 'saveQueryAdvanced') $desc = $this->lang->score->methods[$model][$method]; + break; + case 'ajax': + $desc = $this->lang->score->methods[$model][$method]; + break; } - $this->saveScore($this->app->user->account, $rule, $model, $method, $desc); + $this->saveScore($user, $rule, $model, $method, $desc); } /** diff --git a/module/score/view/browse.html.php b/module/score/view/browse.html.php index 4ac0b3ca99..6843840b89 100644 --- a/module/score/view/browse.html.php +++ b/module/score/view/browse.html.php @@ -14,7 +14,7 @@
icons['score']); ?>score->record; ?>
score; ?> - score_level; ?> +
diff --git a/module/search/model.php b/module/search/model.php index 6cdf592ed0..9d514c14fb 100644 --- a/module/search/model.php +++ b/module/search/model.php @@ -47,7 +47,7 @@ class searchModel extends model $groupItems = $this->config->search->groupItems; $groupAndOr = strtoupper($this->post->groupAndOr); if($groupAndOr != 'AND' and $groupAndOr != 'OR') $groupAndOr = 'AND'; - + $scoreNum = 0; for($i = 1; $i <= $groupItems * 2; $i ++) { /* The and or between two groups. */ @@ -66,6 +66,8 @@ class searchModel extends model if($this->post->$valueName == 'null') $this->post->$valueName = ''; // Null is special, stands to empty. if($this->post->$valueName == 'ZERO') $this->post->$valueName = 0; // ZERO is special, stands to 0. + $scoreNum += 1; + /* Set and or. */ $andOr = strtoupper($this->post->$andOrName); if($andOr != 'AND' and $andOr != 'OR') $andOr = 'AND'; @@ -127,6 +129,7 @@ class searchModel extends model $formSessionName = $this->post->module . 'Form'; $this->session->set($querySessionName, $where); $this->session->set($formSessionName, $_POST); + if($scoreNum > 2) $this->loadModel('score')->score('search', 'saveQueryAdvanced'); } /** @@ -303,6 +306,7 @@ class searchModel extends model $featureBarConfig->value = json_encode($newConfig); $this->dao->replace(TABLE_CONFIG)->data($featureBarConfig)->exec(); } + $this->loadModel('score')->score('search', 'saveQuery', $queryID); return $queryID; } return false; diff --git a/module/story/model.php b/module/story/model.php index 8bc89b4a2f..042c367a7f 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -359,7 +359,7 @@ class storyModel extends model if(is_dir($realPath)) $classFile->removeDir($realPath); unset($_SESSION['storyImagesFile']); } - + $this->loadModel('score')->score('ajax', 'batchCreate'); return $mails; } @@ -609,7 +609,7 @@ class storyModel extends model } } } - + $this->loadModel('score')->score('ajax', 'batchEdit'); return $allChanges; } diff --git a/module/task/model.php b/module/task/model.php index ecc769208e..c46556f34d 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -40,8 +40,6 @@ class taskModel extends model ->remove('after,files,labels,assignedTo,uid,storyEstimate,storyDesc,storyPri,team,teamEstimate,teamMember,multiple,teams') ->get(); - - foreach($this->post->assignedTo as $assignedTo) { /* When type is affair and has assigned then ignore none. */ @@ -126,7 +124,7 @@ class taskModel extends model $team->task = $taskID; $this->dao->insert(TABLE_TEAM)->data($team)->autoCheck()->exec(); } - + $this->loadModel('score')->score('task', 'create', $taskID); $tasksID[$assignedTo] = array('status' => 'created', 'id' => $taskID); } return $tasksID; @@ -226,13 +224,14 @@ class taskModel extends model $taskID = $this->dao->lastInsertID(); if($story) $this->story->setStage($tasks->story[$i]); $actionID = $this->action->create('task', $taskID, 'Opened', ''); - + $this->loadModel('score')->score('task', 'create', $taskID); $mails[$i] = new stdclass(); $mails[$i]->taskID = $taskID; $mails[$i]->actionID = $actionID; } $this->countTime($tasks->parent[0]); + $this->loadModel('score')->score('ajax', 'batchCreate'); return $mails; } @@ -601,7 +600,7 @@ class taskModel extends model die(js::error('task#' . $taskID . dao::getError(true))); } } - + $this->loadModel('score')->score('ajax', 'batchEdit'); return $allChanges; } @@ -886,6 +885,7 @@ class taskModel extends model $this->countTime($oldTask->parent); if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); + $this->loadModel('score')->score('task', 'finish', $taskID); if(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -940,7 +940,7 @@ class taskModel extends model $data = new stdClass(); $data->status = 'closed'; $this->dao->update(TABLE_TASK)->data($data)->autoCheck()->where('parent')->eq($taskID)->exec(); - + $this->loadModel('score')->score('task', 'close', $taskID); if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); if(!dao::isError()) return common::createChanges($oldTask, $task); } diff --git a/module/testcase/model.php b/module/testcase/model.php index 1d01119a47..2be5dd2293 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -107,6 +107,7 @@ class testcaseModel extends model $caseID = $this->dao->lastInsertID(); $this->loadModel('file')->saveUpload('testcase', $caseID); $parentStepID = 0; + $this->loadModel('score')->score('testcase', 'create', $caseID); foreach($this->post->steps as $stepID => $stepDesc) { if(empty($stepDesc)) continue; @@ -223,6 +224,7 @@ class testcaseModel extends model unset($cases->keywords[$i]); } } + $this->loadModel('score')->score('ajax', 'batchCreate'); } /** diff --git a/module/testtask/model.php b/module/testtask/model.php index ad83c3fc21..5627458f02 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -911,6 +911,8 @@ class testtaskModel extends model } } + $this->loadModel('score')->score('testTask', 'runCase', $postData->case); + return $caseResult; } diff --git a/www/js/my.full.js b/www/js/my.full.js index d654fa9788..a37638381c 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -193,6 +193,11 @@ function showSearchMenu(objectType, objectID, module, method, extra) { $menu.find('#search').focus(); } + if(!$.cookie('ajax_quickDump')) + { + $.cookie('ajax_quickDump', 'on', {expires: config.cookieLife, path: config.webRoot}); + $.get(createLink('score', 'ajax', "method=quickDump")); + } } /** @@ -1740,11 +1745,21 @@ function initHotKey() { /* left, go to pre object. */ var preLink = $('#pre').attr('href'); + if(!$.cookie('ajax_lastNext')) + { + $.cookie('ajax_lastNext', 'on', {expires: config.cookieLife, path: config.webRoot}); + $.get(createLink('score', 'ajax', "method=lastNext")); + } if(preLink) location.href = preLink; }).bind('keydown', 'right', function() { /* right, go to next object. */ var nextLink = $('#next').attr('href'); + if(!$.cookie('ajax_lastNext')) + { + $.cookie('ajax_lastNext', 'on', {expires: config.cookieLife, path: config.webRoot}); + $.get(createLink('score', 'ajax', "method=lastNext")); + } if(nextLink) location.href = nextLink; }); } From 1b82933c0db4c77654f7edb2f242bcb2f1c4a6ad Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 30 Oct 2017 11:32:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Finish=20task#3237=20=E6=89=80=E6=9C=89?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=20/=E6=89=80=E6=9C=89=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,cost:2=20left:0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/filter.php | 2 ++ module/product/config.php | 3 ++ module/product/control.php | 49 +++++++++++++++++++++++++++ module/product/lang/en.php | 8 +++++ module/product/lang/zh-cn.php | 9 +++++ module/product/view/all.html.php | 16 +++++---- module/product/view/export.html.php | 13 ++++++++ module/project/config.php | 3 ++ module/project/control.php | 52 +++++++++++++++++++++++++++++ module/project/lang/en.php | 1 + module/project/lang/zh-cn.php | 1 + module/project/view/all.html.php | 1 + module/project/view/export.html.php | 13 ++++++++ 13 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 module/product/view/export.html.php create mode 100644 module/project/view/export.html.php diff --git a/config/filter.php b/config/filter.php index 99e4c601cd..ee9d0880b3 100644 --- a/config/filter.php +++ b/config/filter.php @@ -111,6 +111,7 @@ $filter->product->browse->cookie['storyModule'] = 'int'; $filter->product->default->cookie['lastProduct'] = 'int'; $filter->product->default->cookie['preProductID'] = 'int'; $filter->product->index->cookie['preBranch'] = 'int'; +$filter->product->export->cookie['checkedItem'] = 'reg::checked'; $filter->project->default->cookie['lastProject'] = 'int'; $filter->project->default->cookie['projectMode'] = 'code'; @@ -120,6 +121,7 @@ $filter->project->task->cookie['preProjectID'] = 'int'; $filter->project->task->cookie['productBrowseParam'] = 'int'; $filter->project->task->cookie['projectTaskOrder'] = 'reg::orderBy'; $filter->project->task->cookie['windowWidth'] = 'int'; +$filter->project->export->cookie['checkedItem'] = 'reg::checked'; $filter->qa->default->cookie['lastProduct'] = 'int'; $filter->qa->default->cookie['preBranch'] = 'int'; diff --git a/module/product/config.php b/module/product/config.php index f0b1a036d8..b47f613d0c 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -7,6 +7,9 @@ $config->product->customBatchEditFields = 'PO,QD,RD,status,type,desc'; $config->product->custom = new stdclass(); $config->product->custom->batchEditFields = 'PO,QD,RD,status'; +$config->product->list = new stdclass(); +$config->product->list->exportFields = 'id,name,activeStories,changedStories,draftStories,closedStories,plans,releases,bugs,unResolvedBugs,assignToNullBugs'; + global $lang, $app; $app->loadLang('story'); $config->product->search['module'] = 'story'; diff --git a/module/product/control.php b/module/product/control.php index 9b2977fade..67894978b1 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -660,6 +660,55 @@ class product extends control $this->display(); } + /** + * Export product. + * + * @param string $status + * @param string $orderBy + * @access public + * @return void + */ + public function export($status, $orderBy) + { + if($_POST) + { + $productLang = $this->lang->product; + $productConfig = $this->config->product; + + /* Create field lists. */ + $fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $productConfig->list->exportFields); + foreach($fields as $key => $fieldName) + { + $fieldName = trim($fieldName); + $fields[$fieldName] = zget($productLang, $fieldName); + unset($fields[$key]); + } + + $productStats = $this->product->getStats($orderBy, null, $status); + foreach($productStats as $i => $product) + { + $product->activeStories = (int)$product->stories['active']; + $product->changedStories = (int)$product->stories['changed']; + $product->draftStories = (int)$product->stories['draft']; + $product->closedStories = (int)$product->stories['closed']; + $product->unResolvedBugs = (int)$product->unResolved; + $product->assignToNullBugs = (int)$product->assignToNull; + + if($this->post->exportType == 'selected') + { + $checkedItem = $this->cookie->checkedItem; + if(strpos(",$checkedItem,", ",{$product->id},") === false) unset($productStats[$i]); + } + } + + $this->post->set('fields', $fields); + $this->post->set('rows', $productStats); + $this->post->set('kind', 'product'); + $this->fetch('file', 'export2' . $this->post->fileType, $_POST); + } + $this->display(); + } + /** * Doc for compatible. * diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 563b50f988..6d2a7c0556 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -26,6 +26,7 @@ $lang->product->other = 'Other:'; $lang->product->closed = 'Closed'; $lang->product->updateOrder = 'Ranking'; $lang->product->all = "All {$lang->productCommon}"; +$lang->product->export = "Export"; $lang->product->basicInfo = 'Basic Info'; $lang->product->otherInfo = 'Other Info'; @@ -42,6 +43,13 @@ $lang->product->doc = 'Documents'; $lang->product->project = $lang->projectCommon . 'List'; $lang->product->build = 'Build List'; +$lang->product->activeStories = 'Activated Story'; +$lang->product->changedStories = 'Changed Story'; +$lang->product->draftStories = 'Draft Story'; +$lang->product->closedStories = 'Closed Story'; +$lang->product->unResolvedBugs = 'Unresolved Bug'; +$lang->product->assignToNullBugs = 'No Assigned Bug'; + $lang->product->confirmDelete = " Do you want to delete {$lang->productCommon}?"; $lang->product->errorNoProduct = "{$lang->productCommon} is not created yet!"; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index d0be9f125e..a9e87d8f87 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -26,6 +26,7 @@ $lang->product->other = '其他:'; $lang->product->closed = '已关闭'; $lang->product->updateOrder = "排序"; $lang->product->all = "所有{$lang->productCommon}"; +$lang->product->export = "导出"; $lang->product->basicInfo = '基本信息'; $lang->product->otherInfo = '其他信息'; @@ -42,11 +43,19 @@ $lang->product->doc = '文档列表'; $lang->product->project = $lang->projectCommon . '列表'; $lang->product->build = '版本列表'; +$lang->product->activeStories = '激活需求'; +$lang->product->changedStories = '已变更需求'; +$lang->product->draftStories = '草稿需求'; +$lang->product->closedStories = '已关闭需求'; +$lang->product->unResolvedBugs = '未解决Bug'; +$lang->product->assignToNullBugs = '未指派Bug'; + $lang->product->confirmDelete = " 您确定删除该{$lang->productCommon}吗?"; $lang->product->errorNoProduct = "还没有创建{$lang->productCommon}!"; $lang->product->accessDenied = "您无权访问该{$lang->productCommon}"; +$lang->product->id = "编号"; $lang->product->name = "{$lang->productCommon}名称"; $lang->product->code = "{$lang->productCommon}代号"; $lang->product->order = '排序'; diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index f1cf762c1b..250e5133d0 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -13,6 +13,10 @@
+ createLink('product', 'export', "status=$status&orderBy=$orderBy"); + if(common::hasPriv('product', 'export'))echo html::a($link, " " . $lang->export, '', "class='export btn'"); + ?> createLink('product', 'create'), " " . $lang->product->create,'', "class='btn'") ?>
- - - - + + + + - - + + diff --git a/module/product/view/export.html.php b/module/product/view/export.html.php new file mode 100644 index 0000000000..c599799e2b --- /dev/null +++ b/module/product/view/export.html.php @@ -0,0 +1,13 @@ + + * @package product + * @version $Id$ + * @link http://www.zentao.net + */ +?> + diff --git a/module/project/config.php b/module/project/config.php index 471dc898f3..1af2a0f2c9 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -5,6 +5,9 @@ $config->project->orderBy = 'isDone,status,order_desc'; $config->project->maxBurnDay = '31'; $config->project->weekend = '2'; +$config->project->list = new stdclass(); +$config->project->list->exportFields = 'id,name,code,PM,end,status,totalEstimate,totalConsumed,totalLeft,progess'; + global $lang, $app; $app->loadLang('task'); $config->project->create = new stdclass(); diff --git a/module/project/control.php b/module/project/control.php index eee780130c..e651b7e440 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -2032,6 +2032,58 @@ class project extends control $this->display(); } + /** + * Export project. + * + * @param string $status + * @param int $productID + * @param string $orderBy + * @access public + * @return void + */ + public function export($status, $productID, $orderBy) + { + if($_POST) + { + $projectLang = $this->lang->project; + $projectConfig = $this->config->project; + + /* Create field lists. */ + $fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $projectConfig->list->exportFields); + foreach($fields as $key => $fieldName) + { + $fieldName = trim($fieldName); + $fields[$fieldName] = zget($projectLang, $fieldName); + unset($fields[$key]); + } + + $projectStats = $this->project->getProjectStats($status == 'byproduct' ? 'all' : $status, $productID, 0, 30, $orderBy, null); + $users = $this->loadModel('user')->getPairs('noletter'); + foreach($projectStats as $i => $project) + { + $project->PM = zget($users, $project->PM); + $project->status = isset($project->delay) ? $projectLang->delayed : $projectLang->statusList[$project->status]; + $project->totalEstimate = $project->hours->totalEstimate; + $project->totalConsumed = $project->hours->totalConsumed; + $project->totalLeft = $project->hours->totalLeft; + $project->progress = $project->hours->progress . '%'; + + if($this->post->exportType == 'selected') + { + $checkedItem = $this->cookie->checkedItem; + if(strpos(",$checkedItem,", ",{$project->id},") === false) unset($projectStats[$i]); + } + } + + $this->post->set('fields', $fields); + $this->post->set('rows', $projectStats); + $this->post->set('kind', 'project'); + $this->fetch('file', 'export2' . $this->post->fileType, $_POST); + } + + $this->display(); + } + /** * Doc for compatible. * diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 415eb80747..fdeae95528 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -58,6 +58,7 @@ $lang->project->activate = 'Activate'; $lang->project->putoff = 'Deplay'; $lang->project->suspend = 'Suspend'; $lang->project->close = 'Close'; +$lang->project->export = 'Export'; $lang->project->typeList['sprint'] = 'Sprint'; $lang->project->typeList['waterfall'] = 'Waterfall'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index f35ba6f90a..6dbfd2d991 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -58,6 +58,7 @@ $lang->project->activate = '激活'; $lang->project->putoff = '延期'; $lang->project->suspend = '挂起'; $lang->project->close = '关闭'; +$lang->project->export = '导出'; $lang->project->typeList['sprint'] = "短期$lang->projectCommon"; $lang->project->typeList['waterfall'] = "长期$lang->projectCommon"; diff --git a/module/project/view/all.html.php b/module/project/view/all.html.php index c751a80672..45d11f03b9 100644 --- a/module/project/view/all.html.php +++ b/module/project/view/all.html.php @@ -14,6 +14,7 @@
+ " . $lang->export, '', "class='btn export'")?> " . $lang->project->create, '', "class='btn'")?>
idAB);?> product->name);?>story->statusList['active'] . $lang->story->common;?>story->statusList['changed'] . $lang->story->common;?>story->statusList['draft'] . $lang->story->common;?>story->statusList['closed'] . $lang->story->common;?>product->activeStories;?>product->changedStories;?>product->draftStories;?>product->closedStories;?> product->plans;?> product->releases;?> product->bugs;?>bug->unResolved;?>bug->assignToNull;?>product->unResolvedBugs;?>product->assignToNullBugs;?> product->updateOrder);?>