From 638586bea2a7cf70578ef1ffe35b0b825be744f9 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 16:44:09 +0800 Subject: [PATCH 1/3] * Fix bug#27445. --- module/product/model.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/module/product/model.php b/module/product/model.php index 95766d7eea..6d7da2880a 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -111,8 +111,7 @@ class productModel extends model } $this->session->set('currentProductType', $currentProduct->type); - $executionID = ($isQaModule and $this->app->tab == 'execution') ? $extra : 0; - $output = ''; + $output = ''; if(!empty($products)) { $dropMenuLink = helper::createLink($isQaModule ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra"); @@ -127,8 +126,8 @@ class productModel extends model $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]); $this->lang->product->menu->settings['subMenu']->branch = str_replace('@branch@', $this->lang->product->branch, $this->lang->product->menu->settings['subMenu']->branch); - $branches = $this->loadModel('branch')->getPairs($productID, 'all', $executionID); - $branchName = isset($branches[$branch]) ? $branches[$branch] : $branches[0]; + $branches = $this->loadModel('branch')->getPairs($productID, 'all'); + $branchName = $branches[$branch]; if(!$isMobile) { $dropMenuLink = helper::createLink('branch', 'ajaxGetDropMenu', "objectID=$productID&branch=$branch&module=$currentModule&method=$currentMethod&extra=$extra"); From 9868aee96b956eef4ea025097bcb3a81c0983218 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Fri, 9 Sep 2022 17:00:44 +0800 Subject: [PATCH 2/3] * add feedback data --- test/data/feedback.yaml | 219 +++++++++++++++++++++++++++++++ test/data/feedbackmodule.yaml | 79 +++++++++++ test/data/feedbackmoduleson.yaml | 79 +++++++++++ test/data/zentao/config.php | 57 ++++---- 4 files changed, 407 insertions(+), 27 deletions(-) create mode 100644 test/data/feedback.yaml create mode 100644 test/data/feedbackmodule.yaml create mode 100644 test/data/feedbackmoduleson.yaml diff --git a/test/data/feedback.yaml b/test/data/feedback.yaml new file mode 100644 index 0000000000..4fe0306a42 --- /dev/null +++ b/test/data/feedback.yaml @@ -0,0 +1,219 @@ +title: table zt_feedback +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 1-1000 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: product + note: "所属产品" + range: 1-100{4} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: module + note: "所属模块" + range: 4521-4820{1} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: title + note: "标题" + range: 1-10000 + prefix: "反馈标题" + postfix: "" + loop: 0 + format: "" + - field: type + note: "反馈类型" + range: story,task,bug,todo,advice,issue,risk,opportunity + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: solution + note: "处理方案" + range: tobug,tostory,touserstory,totask,totodo + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: desc + note: "描述" + range: 1-10000 + prefix: "这是反馈描述" + postfix: "" + loop: 0 + format: "" + - field: status + note: "状态" + range: noreview,clarify,wait,commenting,replied,asked,closed + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: subStatus + note: "子状态" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: public + note: "公开" + range: 0,1 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: notify + note: "通知" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: notifyEmail + note: "通知邮箱" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: likes + note: "点赞人" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: result + note: "转化结果" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: faq + note: "FAQ" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: openedBy + note: "反馈创建人" + range: admin + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: openedDate + range: "(-1M)-(+1w):-1D" + type: timestamp + format: "YYYY-MM-DD hh:mm:ss" + - field: reviewedBy + note: "由谁评审" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: reviewedDate + note: "评审时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: processedBy + note: "由谁处理" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: processedDate + note: "处理时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedBy + note: "由谁关闭" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedDate + note: "关闭时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedReason + note: "关闭原因" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: editedBy + note: "最后处理人" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: editedDate + note: "最后修改时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: assignedTo + note: "指派给" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: assignedDate + note: "指派时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: feedbackBy + note: "反馈者" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: mailto + note: "抄送给" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/feedbackmodule.yaml b/test/data/feedbackmodule.yaml new file mode 100644 index 0000000000..aa138815db --- /dev/null +++ b/test/data/feedbackmodule.yaml @@ -0,0 +1,79 @@ +title: table zt_module +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 4521-4620 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: root + note: "根目录" + range: 1-100 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: branch + note: "分支" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: name + note: "模块名称" + range: 1-10000 + prefix: "feedback模块" + postfix: "" + loop: 0 + format: "" + - field: parent + note: "父ID" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: path + note: "ID路径" + fields: + - field: path1 + range: 4521-4620 + prefix: "," + postfix: "," + - field: path2 + range: [] + postfix: "" + format: "" + - field: grade + note: "等级" + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: order + note: "排序" + range: 10-100:10 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: type + note: "对象类型" + range: feedback + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/feedbackmoduleson.yaml b/test/data/feedbackmoduleson.yaml new file mode 100644 index 0000000000..681b458972 --- /dev/null +++ b/test/data/feedbackmoduleson.yaml @@ -0,0 +1,79 @@ +title: table zt_module +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 4621-4820 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: root + note: "根目录" + range: 1-100{2} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: branch + note: "分支" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: name + note: "模块名称" + range: 1-10000 + prefix: "feedback子模块" + postfix: "" + loop: 0 + format: "" + - field: parent + note: "父ID" + range: 4521-4620{2} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: path + note: "ID路径" + fields: + - field: path1 + range: 4521-4620{2} + prefix: "," + postfix: "," + - field: path2 + range: 4621-4820 + postfix: "," + format: "" + - field: grade + note: "等级" + range: 2 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: order + note: "排序" + range: 10-100:10 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: type + note: "对象类型" + range: feedback + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/zentao/config.php b/test/data/zentao/config.php index d67e57308f..41fc3856e9 100644 --- a/test/data/zentao/config.php +++ b/test/data/zentao/config.php @@ -21,33 +21,36 @@ $builder->project = array('rows' => 90, 'extends' => array('project', 'proj $builder->sprint = array('rows' => 600, 'extends' => array('project', 'execution')); $builder->projectalone = array('rows' => 20, 'extends' => array('project', 'projectalone')); -$builder->story = array('rows' => 400, 'extends' => array('story')); -$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory')); -$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview')); -$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule')); -$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson')); -$builder->storyplan = array('rows' => 400, 'extends' => array('planstory')); -$builder->storystage = array('rows' => 450, 'extends' => array('storystage')); -$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec')); -$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate')); -$builder->relation = array('rows' => 12, 'extends' => array('relation')); -$builder->task = array('rows' => 600, 'extends' => array('task','task')); -$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask')); -$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec')); -$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule')); -$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson')); -$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate')); -$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson')); -$builder->case = array('rows' => 400, 'extends' => array('case')); -$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase')); -$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase')); -$builder->casestep = array('rows' => 400, 'extends' => array('casestep')); -$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule')); -$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson')); -$builder->bug = array('rows' => 300, 'extends' => array('bug')); -$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug')); -$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule')); -$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson')); +$builder->story = array('rows' => 400, 'extends' => array('story')); +$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory')); +$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview')); +$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule')); +$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson')); +$builder->storyplan = array('rows' => 400, 'extends' => array('planstory')); +$builder->storystage = array('rows' => 450, 'extends' => array('storystage')); +$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec')); +$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate')); +$builder->relation = array('rows' => 12, 'extends' => array('relation')); +$builder->task = array('rows' => 600, 'extends' => array('task','task')); +$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask')); +$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec')); +$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule')); +$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson')); +$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate')); +$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson')); +$builder->case = array('rows' => 400, 'extends' => array('case')); +$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase')); +$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase')); +$builder->casestep = array('rows' => 400, 'extends' => array('casestep')); +$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule')); +$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson')); +$builder->bug = array('rows' => 300, 'extends' => array('bug')); +$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug')); +$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule')); +$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson')); +$builder->feedback = array('rows' => 100, 'extends' => array('feedback')); +$builder->feedbackmodule = array('rows' => 100, 'extends' => array('module','feedbackmodule')); +$builder->feedbackmoduleson = array('rows' => 200, 'extends' => array('module','feedbackmoduleson')); $builder->testtask = array('rows' => 100, 'extends' => array('testtask')); $builder->testresult = array('rows' => 70, 'extends' => array('testresult')); From 164eaacf30e51eaaf71a18a1f5058bea79e50c22 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 13 Sep 2022 05:34:48 +0000 Subject: [PATCH 3/3] * Fix bug #27272. --- module/common/model.php | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/module/common/model.php b/module/common/model.php index 5bcbd38c37..7532ce25be 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2000,11 +2000,10 @@ EOD; $oldStatus = zget($old, 'status', ''); $newStatus = zget($new, 'status', ''); $newSubStatus = zget($new, 'subStatus', ''); + if(empty($moduleName)) $moduleName = $app->getModuleName(); if($oldID and $oldStatus and $newStatus and !$newSubStatus and $oldStatus != $newStatus) { - if(empty($moduleName)) $moduleName = $app->getModuleName(); - $field = $app->dbh->query('SELECT options FROM ' . TABLE_WORKFLOWFIELD . " WHERE `module` = '$moduleName' AND `field` = 'subStatus'")->fetch(); if(!empty($field->options)) $field->options = json_decode($field->options, true); @@ -2018,6 +2017,11 @@ EOD; $new->subStatus = $default; } } + + $dateFields = array(); + $sql = "SELECT `field` FROM " . TABLE_WORKFLOWFIELD . " WHERE `module` = '{$moduleName}' and `control` in ('date', 'datetime')"; + $stmt = $app->dbh->query($sql); + while($row = $stmt->fetch()) $dateFields[$row->field] = $row->field; } $changes = array(); @@ -2030,24 +2034,29 @@ EOD; if(strtolower($key) == 'editedby') continue; if(strtolower($key) == 'editeddate') continue; if(strtolower($key) == 'uid') continue; - if(strtolower($key) == 'finisheddate' and $value == '') continue; - if(strtolower($key) == 'canceleddate' and $value == '') continue; - if(strtolower($key) == 'hangupeddate' and $value == '') continue; - if(strtolower($key) == 'lastcheckeddate' and $value == '') continue; - if(strtolower($key) == 'activateddate' and $value == '') continue; - if(strtolower($key) == 'closeddate' and $value == '') continue; + if(strtolower($key) == 'finisheddate' and $value == '') continue; + if(strtolower($key) == 'canceleddate' and $value == '') continue; + if(strtolower($key) == 'hangupeddate' and $value == '') continue; + if(strtolower($key) == 'lastcheckeddate' and $value == '') continue; + if(strtolower($key) == 'activateddate' and $value == '') continue; + if(strtolower($key) == 'closeddate' and $value == '') continue; if(strtolower($key) == 'actualcloseddate' and $value == '') continue; - if(isset($old->$key) and $value != stripslashes($old->$key)) + if(isset($old->$key)) { - $diff = ''; - if(substr_count($value, "\n") > 1 or - substr_count($old->$key, "\n") > 1 or - strpos('name,title,desc,spec,steps,content,digest,verify,report,definition,analysis,summary,prevention,resolution,outline,schedule,minutes', strtolower($key)) !== false) + if($config->edition != 'open' && isset($dateFields[$key])) $old->$key = formatTime($old->$key); + + if($value != stripslashes($old->$key)) { - $diff = commonModel::diff($old->$key, $value); + $diff = ''; + if(substr_count($value, "\n") > 1 or + substr_count($old->$key, "\n") > 1 or + strpos('name,title,desc,spec,steps,content,digest,verify,report,definition,analysis,summary,prevention,resolution,outline,schedule,minutes', strtolower($key)) !== false) + { + $diff = commonModel::diff($old->$key, $value); + } + $changes[] = array('field' => $key, 'old' => $old->$key, 'new' => $value, 'diff' => $diff); } - $changes[] = array('field' => $key, 'old' => $old->$key, 'new' => $value, 'diff' => $diff); } } return $changes;