excel.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. /**
  3. * 为批量导入任务构造数据。
  4. * Build tasks for the batch import.
  5. *
  6. * @param int $executionID
  7. * @access public
  8. * @return array
  9. */
  10. public function buildTasksForImport($executionID)
  11. {
  12. $now = helper::now();
  13. $data = fixer::input('post')->get();
  14. if(empty($data->team)) $data->team = array();
  15. $tasks = array();
  16. $line = 1;
  17. $extendFields = array();
  18. $requiredFields = $this->config->task->create->requiredFields;
  19. if($this->config->edition != 'open')
  20. {
  21. $extendFields = $this->task->getFlowExtendFields();
  22. $notEmptyRule = $this->loadModel('workflowrule')->getByTypeAndRule('system', 'notempty');
  23. foreach($extendFields as $extendField)
  24. {
  25. if(strpos(",$extendField->rules,", ",$notEmptyRule->id,") !== false) $requiredFields .= ',' . $extendField->field;
  26. }
  27. }
  28. $requiredFields = explode(',', $requiredFields);
  29. $execution = $this->dao->select('id,project,type,model,taskDateLimit,isTpl')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch();
  30. if($execution->type == 'project')
  31. {
  32. $projectID = $executionID;
  33. $project = $execution;
  34. }
  35. else
  36. {
  37. $projectID = $execution->project;
  38. $project = $this->dao->select('id,taskDateLimit')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch();
  39. }
  40. foreach($data->name as $key => $name)
  41. {
  42. $name = str_replace('[' . $this->lang->task->multipleAB . '] ', '', $name);
  43. $name = str_replace('[' . $this->lang->task->parentAB . '] ', '', $name);
  44. $name = str_replace('[' . $this->lang->task->childrenAB . '] ', '', $name);
  45. $name = trim($name);
  46. if(empty($name)) continue;
  47. $taskData = new stdclass();
  48. $taskData->project = $projectID;
  49. $taskData->execution = zget(zget($data, 'execution', array()), $key, $executionID);
  50. $taskData->module = (int)$data->module[$key];
  51. $taskData->name = trim($name);
  52. $taskData->desc = nl2br(strip_tags($this->post->desc[$key], $this->config->allowedTags !== null && is_array($this->config->allowedTags) ? '<' . implode('><', $this->config->allowedTags) . '>' : $this->config->allowedTags));
  53. $taskData->story = isset($data->story) ? (int)$data->story[$key] : 0;
  54. $taskData->pri = (int)$data->pri[$key];
  55. $taskData->assignedTo = $data->assignedTo[$key];
  56. $taskData->type = $data->type[$key];
  57. $taskData->estimate = (float)$data->estimate[$key];
  58. $taskData->estStarted = !empty($data->estStarted[$key]) ? $data->estStarted[$key] : null;
  59. $taskData->deadline = !empty($data->deadline[$key]) ? $data->deadline[$key] : null;
  60. $taskData->mode = $data->mode[$key];
  61. $taskData->isTpl = $execution->isTpl;
  62. if($execution->type != 'project') $taskData->execution = $executionID;
  63. if(!empty($taskData->assignedTo)) $taskData->assignedDate = $now;
  64. foreach($extendFields as $extendField)
  65. {
  66. $dataArray = $_POST[$extendField->field];
  67. $taskData->{$extendField->field} = $dataArray[$key];
  68. if(is_array($taskData->{$extendField->field})) $taskData->{$extendField->field} = join(',', $taskData->{$extendField->field});
  69. $taskData->{$extendField->field} = htmlSpecialString($taskData->{$extendField->field});
  70. }
  71. foreach($requiredFields as $requiredField)
  72. {
  73. $requiredField = trim($requiredField);
  74. if(!empty($requiredField) && empty($taskData->$requiredField)) dao::$errors["{$requiredField}[{$key}]"] = sprintf($this->lang->task->noRequire, $line, $this->lang->task->$requiredField);
  75. }
  76. if(!empty($this->config->limitTaskDate)) $this->task->checkEstStartedAndDeadline($taskData->execution, (string)$taskData->estStarted, (string)$taskData->deadline, $key);
  77. $tasks[$key] = $taskData;
  78. $line++;
  79. }
  80. $parents = $this->getParentForImport($tasks);
  81. foreach($tasks as $key => $taskData) $this->checkLegallyDate($taskData, $project->taskDateLimit == 'limit', zget($parents, $key, null), $key);
  82. return $tasks;
  83. }
  84. /**
  85. * 获取父任务的开始和截止日期。
  86. * Get the start and end dates of the parent task.
  87. *
  88. * @param array $tasks
  89. * @access protected
  90. * @return array
  91. */
  92. protected function getParentForImport($tasks)
  93. {
  94. if(!isset($_POST['level'])) return array();
  95. $levelList = array();
  96. $parents = array();
  97. $pathPairs = array();
  98. $idMap = array();
  99. if(!empty($_POST['id']))
  100. {
  101. $pathPairs = $this->dao->select('id,parent,path')->from(TABLE_TASK)->where('id')->in(($_POST['id']))->fetchPairs('id', 'path');
  102. $idMap = array_flip($this->post->id);
  103. }
  104. $allTasks = $this->dao->select('id,execution,parent,path,estStarted,deadline')->from(TABLE_TASK)->where('id')->in(array_filter(array_unique(explode(',', implode(',', $pathPairs)))))->fetchAll('id');
  105. foreach($this->post->level as $key => $level)
  106. {
  107. $level = trim($level);
  108. if($level && preg_match('/^\d+(\.\d+)*$/', $level)) $levelList[$level] = $key;
  109. $parentTask = null;
  110. if($level && strrpos($level, '.') !== false)
  111. {
  112. $parentTask = new stdClass();
  113. $parentTask->estStarted = null;
  114. $parentTask->deadline = null;
  115. while(strrpos($level, '.') !== false)
  116. {
  117. $parentLevel = substr($level, 0, strrpos($level, '.'));
  118. if(isset($levelList[$parentLevel]))
  119. {
  120. $task = $tasks[$levelList[$parentLevel]];
  121. $parentTask->execution = $task->execution;
  122. if(empty($parentTask->estStarted) && !helper::isZeroDate($task->estStarted)) $parentTask->estStarted = $task->estStarted;
  123. if(empty($parentTask->deadline) && !helper::isZeroDate($task->deadline)) $parentTask->deadline = $task->deadline;
  124. if(!empty($parentTask->estStarted) && !empty($parentTask->deadline)) break;
  125. }
  126. $level = $parentLevel;
  127. }
  128. }
  129. elseif(!empty($_POST['id'][$key]) && !$this->post->insert)
  130. {
  131. $path = $pathPairs[$this->post->id[$key]];
  132. $path = array_reverse(array_filter(explode(',', $path)));
  133. array_shift($path);
  134. if(empty($path)) continue;
  135. $parentTask = new stdClass();
  136. $parentTask->estStarted = null;
  137. $parentTask->deadline = null;
  138. $rootID = end($path);
  139. $root = $allTasks[$rootID];
  140. if(isset($idMap[$rootID])) $root = $tasks[$idMap[$rootID]];
  141. $parentTask->execution = $root->execution;
  142. foreach($path as $taskID)
  143. {
  144. $task = $allTasks[$taskID];
  145. if(isset($idMap[$taskID])) $task = $tasks[$idMap[$taskID]];
  146. if(empty($parentTask->estStarted) && !helper::isZeroDate($task->estStarted)) $parentTask->estStarted = $task->estStarted;
  147. if(empty($parentTask->deadline) && !helper::isZeroDate($task->deadline)) $parentTask->deadline = $task->deadline;
  148. if(!empty($parentTask->estStarted) && !empty($parentTask->deadline)) break;
  149. }
  150. }
  151. $parents[$key] = $parentTask;
  152. $currentTask = $tasks[$key];
  153. if(!empty($parentTask->execution) && $currentTask->execution != $parentTask->execution)
  154. {
  155. $currentTask->execution = zget($parentTask, 'execution', 0);
  156. $currentTask->module = zget($parentTask, 'module', 0);
  157. $currentTask->story = zget($parentTask, 'story', 0);
  158. }
  159. }
  160. return $parents;
  161. }