diff --git a/module/task/ui/linearefforts.html.php b/module/task/ui/linearefforts.html.php
new file mode 100644
index 0000000000..a7ba4cbd13
--- /dev/null
+++ b/module/task/ui/linearefforts.html.php
@@ -0,0 +1,199 @@
+
+ * @package task
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+$this->app->loadLang('execution');
+$teamOrders = array();
+foreach($task->team as $team) $teamOrders[$team->order] = $team->account;
+
+$index = 0;
+$efforts = array_values($efforts);
+$recorders = array();
+$allOrders = array();
+$allEfforts = array();
+$myOrders = array();
+$myCountList = array();
+$myLastID = array();
+$myEfforts = array();
+$myLastOrder = 0;
+foreach($efforts as $key => $effort)
+{
+ $prevEffort = $key > 0 ? $efforts[$key - 1] : null;
+ $order = (!$prevEffort or $prevEffort->order == $effort->order) ? $index : ++$index;
+ $account = $effort->account;
+
+ $allEfforts[$order][] = $effort;
+ $recorders[$order][$account] = $account;
+
+ $allOrders[$order] = $effort->order + 1;
+ if($app->user->account == $account)
+ {
+ if($allOrders[$myLastOrder] != $effort->order + 1) $myLastOrder = $order;
+ $myCountList[$myLastOrder] = isset($myCountList[$myLastOrder]) ? ++$myCountList[$myLastOrder] : 1;
+ $myLastID[$myLastOrder] = isset($myLastID[$myLastOrder]) ? ($myLastID[$myLastOrder] < $effort->id ? $effort->id : $myLastID[$myLastOrder]) : $effort->id;
+ $myEfforts[$myLastOrder][] = $effort;
+
+ if(!isset($myOrders[$effort->order])) $myOrders[$effort->order] = 0;
+ $myOrders[$effort->order] += 1;
+ }
+}
+ksort($myOrders);
+
+$myEffortTable = array();
+foreach($myCountList as $order => $count)
+{
+ foreach($myEfforts[$order] as $effort)
+ {
+ $myEffortTable[] = h::tr
+ (
+ h::td
+ (
+ set::rowspan($count),
+ $allOrders[$order]
+ ),
+ h::td($effort->date),
+ h::td(zget($users, $effort->account)),
+ h::td($effort->work),
+ h::td($effort->consumed . ' H'),
+ h::td($effort->left . ' H'),
+ h::td
+ (
+ common::hasPriv('task', 'editEffort') ? a
+ (
+ setClass('btn ghost toolbar-item square size-sm'),
+ set::href(createLink('task', 'editEffort', "id={$effort->id}")),
+ icon('edit')
+ ) : null,
+ common::hasPriv('task', 'deleteWorkhour') ? a
+ (
+ setClass('btn ghost toolbar-item square size-sm ajax-submit'),
+ set('data-confirm', $lang->task->confirmDeleteEstimate),
+ set::href(createLink('task', 'deleteWorkhour', "id={$effort->id}")),
+ icon('trash')
+ ) : null,
+ ),
+ );
+ }
+}
+
+$allEffortTable = array();
+foreach($recorders as $order => $accounts)
+{
+ $count = count($allEfforts[$order]);
+ foreach($allEfforts[$order] as $effort)
+ {
+ $allEffortTable[] = h::tr
+ (
+ h::td
+ (
+ set::rowspan($count),
+ $allOrders[$order]
+ ),
+ h::td($effort->date),
+ h::td(zget($users, $effort->account)),
+ h::td($effort->work),
+ h::td($effort->consumed . ' H'),
+ h::td($effort->left . ' H'),
+ );
+ }
+}
+
+div
+(
+ set::id('linearefforts'),
+ tabs
+ (
+ tabPane
+ (
+ set::key('myEffort'),
+ set::active(true),
+ set::title($lang->task->myEffort),
+ h::table
+ (
+ setClass('table condensed bordered'),
+ h::tr
+ (
+ h::th
+ (
+ width('60px'),
+ $lang->task->teamOrder
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->date
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->recordedBy
+ ),
+ h::th($lang->task->work),
+ h::th
+ (
+ width('60px'),
+ $lang->task->consumedAB
+ ),
+ h::th
+ (
+ width('60px'),
+ $lang->task->leftAB
+ ),
+ h::th
+ (
+ width('80px'),
+ $lang->actions
+ ),
+ ),
+ $myEffortTable
+ )
+ ),
+ tabPane
+ (
+ set::key('allEffort'),
+ set::title($lang->task->allEffort),
+ h::table
+ (
+ setClass('table condensed bordered'),
+ h::tr
+ (
+ h::th
+ (
+ width('60px'),
+ $lang->task->teamOrder
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->date
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->recordedBy
+ ),
+ h::th($lang->task->work),
+ h::th
+ (
+ width('60px'),
+ $lang->task->consumedAB
+ ),
+ h::th
+ (
+ width('60px'),
+ $lang->task->leftAB
+ ),
+ ),
+ $allEffortTable
+ )
+ ),
+ )
+);
diff --git a/module/task/ui/recordworkhour.html.php b/module/task/ui/recordworkhour.html.php
index 627876c8b3..04d5cb99f0 100644
--- a/module/task/ui/recordworkhour.html.php
+++ b/module/task/ui/recordworkhour.html.php
@@ -50,20 +50,89 @@ to::header
)
);
-
if($efforts)
{
- div
- (
- setClass('table-title'),
- $lang->task->committed
- );
- $tableData = initTableData($efforts, $config->task->effortTable->fieldList, $this->task);
- dtable
- (
- set::cols(array_values($config->task->effortTable->fieldList)),
- set::data($tableData),
- );
+ /* 多人串行任务工时分两部分. */
+ if(!empty($task->team) and $task->mode == 'linear')
+ {
+ include './linearefforts.html.php';
+ }
+ else
+ {
+ $effortRows = array();
+ foreach($efforts as $effort)
+ {
+ $effortRows[] = h::tr
+ (
+ h::td($effort->id),
+ h::td($effort->date),
+ h::td(zget($users, $effort->account)),
+ h::td($effort->work),
+ h::td($effort->consumed . ' H'),
+ h::td($effort->left . ' H'),
+ h::td
+ (
+ common::hasPriv('task', 'editEffort') ? a
+ (
+ setClass('btn ghost toolbar-item square size-sm'),
+ set::href(createLink('task', 'editEffort', "id={$effort->id}")),
+ icon('edit')
+ ) : null,
+ common::hasPriv('task', 'deleteWorkhour') ? a
+ (
+ setClass('btn ghost toolbar-item square size-sm ajax-submit'),
+ set('data-confirm', $lang->task->confirmDeleteEstimate),
+ set::href(createLink('task', 'deleteWorkhour', "id={$effort->id}")),
+ icon('trash')
+ ) : null,
+ ),
+ );
+ }
+ div
+ (
+ setClass('table-title'),
+ $lang->task->committed
+ );
+ h::table
+ (
+ setClass('table condensed bordered'),
+ h::tr
+ (
+ h::th
+ (
+ width('32px'),
+ $lang->idAB
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->date
+ ),
+ h::th
+ (
+ width('100px'),
+ $lang->task->recordedBy
+ ),
+ h::th($lang->task->work),
+ h::th
+ (
+ width('60px'),
+ $lang->task->consumedAB
+ ),
+ h::th
+ (
+ width('60px'),
+ $lang->task->leftAB
+ ),
+ h::th
+ (
+ width('80px'),
+ $lang->actions
+ ),
+ ),
+ $effortRows
+ );
+ }
}
if(!$this->task->canOperateEffort($task))