/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.modules.actions.project;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cayenne.exp.ExpressionFactory;
import com.aimluck.eip.cayenne.om.portlet.EipTProject;
import com.aimluck.eip.cayenne.om.portlet.EipTProjectMember;
import com.aimluck.eip.cayenne.om.portlet.EipTProjectTask;
import com.aimluck.eip.cayenne.om.portlet.EipTProjectTaskMember;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.modules.actions.project.util.ProjectTestUtil;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.project.util.ProjectUtils;
import com.aimluck.eip.util.ALEipUtils;
public class CreateProjectData {
final static int MASTER_USER_ID = 23;
final static Map<Integer, List<Integer>> map =
new HashMap<Integer, List<Integer>>();
final static int PROJECT_NUM = 5;
final static int PARENT_NUM = 100;
/**
* ユーザー数1000 プロジェクト数5 タスク数 1000(親100, 子300, 孫600) メンバーは等分配
*
* @param args
*/
public static void main(String[] args) {
ProjectTestInitializer.initialize();
memberInitialize();
int projectNum = Database.query(EipTProject.class).getCount();
if (projectNum < PROJECT_NUM) {
for (int i = projectNum + 1; i <= PROJECT_NUM; i++) {
createProject(i);
}
}
List<EipTProject> projects =
Database.query(EipTProject.class).limit(PROJECT_NUM).fetchList();
for (int i = 0; i < projects.size(); i++) {
EipTProject project = projects.get(i);
createTask(i + 1, project);
}
System.out.println("CreateProjectData Success");
}
private static void memberInitialize() {
List<ALEipUser> users = ALEipUtils.getUsers("LoginUser");
if (users.isEmpty()) {
return;
}
List<Integer> ilist = new ArrayList<Integer>();
for (ALEipUser user : users) {
ilist.add(user.getUserId().getValueWithInt());
}
List<List<Integer>> result =
ProjectTestUtil
.devide(ilist, (int) Math.ceil(ilist.size() / PROJECT_NUM));
int i = 1;
for (List<Integer> _ilist : result) {
if (i >= 6) {
List<Integer> _list = map.get(i % PROJECT_NUM);
_list.addAll(_ilist);
} else {
if (!_ilist.contains(Integer.valueOf(MASTER_USER_ID))) {
_ilist.add(MASTER_USER_ID);
}
map.put(i++, _ilist);
}
}
}
private static void createProject(int num) {
String projectName = "プロジェクト" + String.valueOf(num);
String desc = "プロジェクトの説明" + String.valueOf(num);
String progressFlg = "f";
int formProgressRate = 0;
// ログインユーザーの取得
TurbineUser tuser = Database.get(TurbineUser.class, MASTER_USER_ID);
// 新規オブジェクトモデル
EipTProject project = Database.create(EipTProject.class);
// プロジェクト名
project.setProjectName(projectName);
// 説明
project.setExplanation(desc);
// 管理者ID
project.setAdminUserId(MASTER_USER_ID);
// 進捗率自動計算フラグ
project.setProgressFlg(progressFlg);
// 作成者
project.setTurbineUser(tuser);
// 更新者
project.setUpdateUserId(tuser.getUserId());
// 作成日
project.setCreateDate(Calendar.getInstance().getTime());
// 更新日
project.setUpdateDate(Calendar.getInstance().getTime());
// 進捗率
int progressRate = formProgressRate;
if (ProjectUtils.FLG_ON.equals(progressFlg)) {
// 自動計算する場合、プロジェクト作成したてなので進捗0%
progressRate = 0;
}
project.setProgressRate(progressRate);
// プロジェクトを登録
Database.commit();
// -----------------------
// メンバーの登録
// -----------------------
for (Integer id : map.get(num)) {
EipTProjectMember projectMember =
Database.create(EipTProjectMember.class);
projectMember.setEipTProject(project);
projectMember.setUserId(id);
}
// メンバーを登録
Database.commit();
}
public static void createTask(int num, EipTProject project) {
for (int i = 0; i < PARENT_NUM; i++) {
int parentId = createParent(num, project);
// int child1 = createChild(projectId, parentId);
// int child2 = createChild(projectId, parentId);
// int child3 = createChild(projectId, parentId);
//
// createGrandchild(projectId, child1);
// createGrandchild(projectId, child1);
//
// createGrandchild(projectId, child2);
// createGrandchild(projectId, child2);
//
// createGrandchild(projectId, child3);
// createGrandchild(projectId, child3);
}
}
public static int createParent(int num, EipTProject project) {
Integer parentTaskId = null;
// ログインユーザーの取得
TurbineUser tuser = Database.get(TurbineUser.class, MASTER_USER_ID);
// 新規オブジェクトモデル
EipTProjectTask task = Database.create(EipTProjectTask.class);
// 登録・更新共通の項目の設定
setInsertUpdate(task, project);
// 作成者
task.setTurbineUser(tuser);
// 作成日
task.setCreateDate(Calendar.getInstance().getTime());
// if (parentTaskId != null) {
// // 親タスクID
// task.setParentTaskId(Integer.valueOf(parentTaskId));
// }
// ソートNoを取得
int orderNo = 1;
SelectQuery<EipTProjectTask> query = Database.query(EipTProjectTask.class);
query.andQualifier(ExpressionFactory.matchExp(
EipTProjectTask.PARENT_TASK_ID_PROPERTY,
parentTaskId));
query.orderDesending(EipTProjectTask.ORDER_NO_PROPERTY);
EipTProjectTask parentTask = query.fetchSingle();
if (parentTask != null) {
orderNo = parentTask.getOrderNo() + 1;
}
task.setOrderNo(orderNo);
List<Integer> member = new ArrayList<Integer>(map.get(num));
Collections.shuffle(member);
// 担当者情報
for (int i = 0; i < Math.ceil(member.size() / PARENT_NUM); i++) {
EipTProjectTaskMember data = new EipTProjectTaskMember();
data.setEipTProjectTask(task);
data.setUserId(member.get(i));
data.setWorkload(new BigDecimal(1.00));
}
// 添付ファイルを登録する。
// pfile.insertAttachmentFiles(fileuploadList, folderName, uid, task,
// msgList);
// タスクを登録
Database.commit();
// プロジェクト情報を更新
if (updateProject(project.getProjectId())) {
Database.commit();
}
return task.getTaskId();
}
public static int createChild(int projectId, int parentId) {
return 0;
}
public static void createGrandchild(int projectId, int childId) {
}
private static boolean setInsertUpdate(EipTProjectTask task,
EipTProject project) {
List<Integer> trackers = Arrays.asList(1, 2, 3);
Collections.shuffle(trackers);
String taskName = "タスク" + new Date().getTime();
String desc = "タスク説明" + new Date().getTime();
List<Integer> status = Arrays.asList(1, 2, 3, 4, 5, 6);
Collections.shuffle(status);
List<Integer> priority = Arrays.asList(1, 2, 3);
Collections.shuffle(priority);
// プロジェクトID
task.setEipTProject(project);
// 分類
task.setTracker(String.valueOf(trackers.get(0)));
// タスク名
task.setTaskName(taskName);
// 説明
task.setExplanation(desc);
// ステータス
task.setStatus(String.valueOf(status.get(0)));
// 優先度
task.setPriority(String.valueOf(priority.get(0)));
if (true) {
// 子タスクがない場合のみ更新する
// 開始予定日
task.setStartPlanDate(new Date());
// 完了予定日
task.setEndPlanDate(new Date());
// 開始実績日
task.setStartDate(ProjectUtils.getEmptyDate());
// 完了実績日
task.setEndDate(ProjectUtils.getEmptyDate());
// 計画工数
task.setPlanWorkload(new BigDecimal(4.0));
// 進捗率
task.setProgressRate(0);
}
// 更新者
task.setUpdateUserId(MASTER_USER_ID);
// 更新日
task.setUpdateDate(Calendar.getInstance().getTime());
return true;
}
private static boolean updateProject(Integer projectId) {
// オブジェクトモデルを取得
EipTProject project = ProjectUtils.getEipTProject(projectId);
if (project == null) {
return false;
}
if (ProjectUtils.FLG_OFF.equals(project.getProgressFlg())) {
// 自動計算しない場合
return false;
}
project.setProgressRate(ProjectUtils.getProjectProgressRate(projectId));
project.setUpdateUserId(MASTER_USER_ID);
project.setUpdateDate(Calendar.getInstance().getTime());
return true;
}
}