|
|
@@ -0,0 +1,719 @@
|
|
|
+package cn.iselab.mooctest.site.service.application.impl;
|
|
|
+
|
|
|
+import cn.iselab.mooctest.site.common.constant.AppConstants;
|
|
|
+import cn.iselab.mooctest.site.common.constant.PrivilegeConstants;
|
|
|
+import cn.iselab.mooctest.site.common.constant.SubsiteConstants;
|
|
|
+import cn.iselab.mooctest.site.dao.*;
|
|
|
+import cn.iselab.mooctest.site.models.*;
|
|
|
+import cn.iselab.mooctest.site.service.application.ApiService;
|
|
|
+import org.json.JSONArray;
|
|
|
+import org.json.JSONObject;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.sql.Timestamp;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by Liu on 2017/3/21.
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class ApiServiceImpl implements ApiService {
|
|
|
+ @Autowired
|
|
|
+ private SubsiteDao subsiteDao;
|
|
|
+ @Autowired
|
|
|
+ private AssignedTaskDao assignedTaskDao;
|
|
|
+ @Autowired
|
|
|
+ private Task2GroupDao task2GroupDao;
|
|
|
+ @Autowired
|
|
|
+ private TaskDao taskDao;
|
|
|
+ @Autowired
|
|
|
+ private ManagerDao managerDao;
|
|
|
+ @Autowired
|
|
|
+ private GroupDao groupDao;
|
|
|
+ @Autowired
|
|
|
+ private Task2CaseDao task2CaseDao;
|
|
|
+ @Autowired
|
|
|
+ private CaseDao caseDao;
|
|
|
+ @Autowired
|
|
|
+ private WorkerDao workerDao;
|
|
|
+ @Autowired
|
|
|
+ private Group2WorkerDao group2WorkerDao;
|
|
|
+ @Autowired
|
|
|
+ private AppDao appDao;
|
|
|
+ @Autowired
|
|
|
+ private SubjectDao subjectDao;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * GET methods
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String getTasks(String host, Long workerId, Long groupId) {
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+
|
|
|
+ List<AssignedTask> assignedTasks = new ArrayList<AssignedTask>();
|
|
|
+ if (groupId == null){
|
|
|
+ assignedTasks = assignedTaskDao.findByWorkerId(workerId);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ List<Task2Group> task2Groups = task2GroupDao.findByGroupId(groupId);
|
|
|
+ for (Task2Group task2Group : task2Groups){
|
|
|
+ Task taskInGroup = taskDao.findOne(task2Group.getTaskId());
|
|
|
+ assignedTasks.add(assignedTaskDao.findByTaskIdAndWorkerId(taskInGroup.getId(), workerId));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // generate output JSON
|
|
|
+ JSONArray resultArr = new JSONArray();
|
|
|
+ for (AssignedTask assignedTask : assignedTasks){
|
|
|
+ JSONObject resultObj = new JSONObject();
|
|
|
+ Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
|
|
|
+ Subsite subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
|
|
|
+ Manager managerOfTask = managerDao.findOne(taskAssigned.getManagerId());
|
|
|
+
|
|
|
+ if (subsiteAssigned.getId() != subsite.getId()){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ resultObj.put("name", taskAssigned.getName());
|
|
|
+ resultObj.put("id", taskAssigned.getId());
|
|
|
+ resultObj.put("beginTime", taskAssigned.getBeginTime());
|
|
|
+ resultObj.put("endTime", taskAssigned.getEndTime());
|
|
|
+ resultObj.put("managerName", managerOfTask.getName());
|
|
|
+ resultObj.put("information", taskAssigned.getInformation());
|
|
|
+
|
|
|
+ JSONArray groupArr = new JSONArray();
|
|
|
+ List<Task2Group> task2Groups = task2GroupDao.findByTaskId(taskAssigned.getId());
|
|
|
+ for (Task2Group task2Group : task2Groups){
|
|
|
+ Group groupInTask = groupDao.findOne(task2Group.getGroupId());
|
|
|
+ groupArr.put(groupInTask.getName());
|
|
|
+ }
|
|
|
+ resultObj.put("groups", groupArr);
|
|
|
+ resultArr.put(resultObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ return resultArr.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getTaskWithCases(Long taskId, Long workerId) {
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+
|
|
|
+ Task task = taskDao.findOne(taskId);
|
|
|
+ Worker worker = workerDao.findOne(workerId);
|
|
|
+
|
|
|
+ if (task == null || worker == null){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ Manager managerOfTask = managerDao.findOne(task.getManagerId());
|
|
|
+ Subsite subsiteOfTask = subsiteDao.findOne(task.getSubsiteId());
|
|
|
+
|
|
|
+ result.put("name", task.getName());
|
|
|
+ result.put("beginTime", task.getBeginTime());
|
|
|
+ result.put("endTime", task.getEndTime());
|
|
|
+ result.put("managerName", managerOfTask.getName());
|
|
|
+ result.put("information", task.getInformation());
|
|
|
+ result.put("subsite", subsiteOfTask.getType());
|
|
|
+ result.put("managerId", managerOfTask.getId());
|
|
|
+ JSONArray groupArr = new JSONArray();
|
|
|
+ List<Task2Group> task2Groups = task2GroupDao.findByTaskId(taskId);
|
|
|
+ if (task2Groups != null){
|
|
|
+ for (Task2Group task2Group : task2Groups){
|
|
|
+ Group groupInTask = groupDao.findOne(task2Group.getGroupId());
|
|
|
+ groupArr.put(groupInTask.getName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result.put("groups", groupArr);
|
|
|
+
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+ if (assignedTask == null){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ JSONArray caseListArr = new JSONArray();
|
|
|
+
|
|
|
+ // Set here is used to prevent duplicates
|
|
|
+ Set<String> subsiteCaseIds = new HashSet<String>();
|
|
|
+
|
|
|
+ // put taken cases at first
|
|
|
+ JSONObject contentObj = new JSONObject(assignedTask.getContent());
|
|
|
+ JSONObject casesObj = contentObj.getJSONObject("cases");
|
|
|
+ Set<String> keySet = casesObj.keySet();
|
|
|
+ for (String key : keySet){
|
|
|
+ subsiteCaseIds.add(key);
|
|
|
+ JSONObject caseObj = new JSONObject();
|
|
|
+ caseObj.put("id", key);
|
|
|
+ caseObj.put("taken", true);
|
|
|
+ caseListArr.put(caseObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ // check if there are any cases which are not assigned(need to be picked by workers themselves)
|
|
|
+ Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
|
|
|
+ List<Task2Case> task2Cases = task2CaseDao.findByTaskId(taskAssigned.getId());
|
|
|
+ for (Task2Case task2Case : task2Cases){
|
|
|
+ Case cazeInTask = caseDao.findOne(task2Case.getId());
|
|
|
+ if ((!task2Case.isAutoSelect()) && (!subsiteCaseIds.contains(cazeInTask.getCaseId()))){
|
|
|
+
|
|
|
+ Case caze = caseDao.findOne(task2Case.getCaseId());
|
|
|
+ subsiteCaseIds.add(caze.getCaseId());
|
|
|
+
|
|
|
+ JSONObject caseObj = new JSONObject();
|
|
|
+ caseObj.put("id", caze.getCaseId());
|
|
|
+ caseObj.put("taken", false);
|
|
|
+ caseListArr.put(caseObj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result.put("caseList", caseListArr);
|
|
|
+
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getTaskTime(Long taskId) {
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+
|
|
|
+ Task task = taskDao.findOne(taskId);
|
|
|
+ if (task == null){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ result.put("id", task.getId());
|
|
|
+ result.put("beginTimeMillis", task.getBeginTime().getTime());
|
|
|
+ result.put("endTimeMillis", task.getEndTime().getTime());
|
|
|
+
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getCases(Long workerId) {
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+
|
|
|
+ List<AssignedTask> assignedTasks = assignedTaskDao.findByWorkerId(workerId);
|
|
|
+ Set<String> outputCaseIds = new HashSet<String>();
|
|
|
+ for (AssignedTask assignedTask : assignedTasks){
|
|
|
+ Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
|
|
|
+ Subsite subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
|
|
|
+ if (subsiteAssigned.getId() != SubsiteConstants.KIKBUG_SUBSITE_ID || subsiteAssigned.getId() != SubsiteConstants.KIJAM_SUBSITE_ID){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ JSONObject contentObj = new JSONObject(assignedTask.getContent());
|
|
|
+ JSONObject casesObj = contentObj.getJSONObject("cases");
|
|
|
+ Set<String> keySet = casesObj.keySet();
|
|
|
+ for (String key : keySet){
|
|
|
+ outputCaseIds.add(key);
|
|
|
+ JSONObject caseObj = new JSONObject();
|
|
|
+ caseObj.put("caseId", key);
|
|
|
+ caseObj.put("taken", true);
|
|
|
+ caseObj.put("taskId", assignedTask.getTaskId());
|
|
|
+ result.put(caseObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Task2Case> task2Cases = task2CaseDao.findByTaskId(assignedTask.getTaskId());
|
|
|
+ for (Task2Case task2Case : task2Cases){
|
|
|
+ taskAssigned = taskDao.findOne(assignedTask.getTaskId());
|
|
|
+ subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
|
|
|
+ if (subsiteAssigned.getId() != SubsiteConstants.KIKBUG_SUBSITE_ID || subsiteAssigned.getId() != SubsiteConstants.KIJAM_SUBSITE_ID){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Case cazeInTask = caseDao.findOne(task2Case.getCaseId());
|
|
|
+ if (!task2Case.isAutoSelect() && (!outputCaseIds.contains(cazeInTask.getCaseId()))){
|
|
|
+ outputCaseIds.add(cazeInTask.getCaseId());
|
|
|
+ JSONObject caseObj = new JSONObject();
|
|
|
+ caseObj.put("caseId", cazeInTask.getCaseId());
|
|
|
+ caseObj.put("taken", false);
|
|
|
+ caseObj.put("taskId", assignedTask.getTaskId());
|
|
|
+ result.put(caseObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * POST methods
|
|
|
+ *
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean verifyApp(Long appId, String url) {
|
|
|
+ App app = appDao.findOne(appId);
|
|
|
+ app.setCaseUrl(url);
|
|
|
+ if (url != null) {
|
|
|
+ app.setStatus(AppConstants.APP_VERIFIED);
|
|
|
+ }
|
|
|
+
|
|
|
+ App s = appDao.save(app);
|
|
|
+ return (s != null);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean joinGroup(Long workerId, Long groupId, String managerName) {
|
|
|
+ Group2Worker group2Worker = new Group2Worker();
|
|
|
+
|
|
|
+ Group group = groupDao.findOne(groupId);
|
|
|
+ // check privilege
|
|
|
+ if (groupId != PrivilegeConstants.SUPER_GROUP_ID){
|
|
|
+ if (privilegeExpired(managerDao.findOne(group.getManagerId())) || groupMemberExceeded(group)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (group != null) {
|
|
|
+ Worker worker = workerDao.findOne(workerId);
|
|
|
+ Manager manager = managerDao.findOne(group.getManagerId());
|
|
|
+ if (!manager.getName().equals(managerName)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (group2WorkerDao.findByWorkerIdAndGroupId(workerId, groupId) != null){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ group2Worker.setWorkerId(worker.getId());
|
|
|
+ group2Worker.setGroupId(group.getId());
|
|
|
+
|
|
|
+ group2WorkerDao.save(group2Worker);
|
|
|
+ // Assign tasks for new members
|
|
|
+ assignTaskForNewMember(workerId, groupId);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean addScore(Long workerId, Long taskId, Double score, String resultUrl, String picked, String host) {
|
|
|
+ JSONObject caseContentObj = new JSONObject(picked);
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+
|
|
|
+ JSONObject results = new JSONObject(assignedTask.getResult());
|
|
|
+ JSONObject resultObj = results.getJSONObject("results");
|
|
|
+
|
|
|
+ String subsiteCaseId = caseContentObj.getString("caseId");
|
|
|
+
|
|
|
+ double weight = caseContentObj.getDouble("weight");
|
|
|
+ JSONObject caseResultObj = new JSONObject();
|
|
|
+ JSONArray caseScoreArr = new JSONArray(), caseResultUrlArr = new JSONArray();
|
|
|
+ double maxScore = score;
|
|
|
+ if (resultObj.has(String.valueOf(subsiteCaseId))){
|
|
|
+
|
|
|
+ caseResultObj = resultObj.getJSONObject(String.valueOf(subsiteCaseId));
|
|
|
+ caseScoreArr = caseResultObj.getJSONArray("scores");
|
|
|
+ caseResultUrlArr = caseResultObj.getJSONArray("resultUrls");
|
|
|
+ maxScore = Math.max(caseResultObj.getDouble("maxScore"), score);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ caseResultObj.put("id", caseContentObj.getLong("id"));
|
|
|
+ caseResultObj.put("name", caseContentObj.getString("name"));
|
|
|
+ caseResultObj.put("weight", caseContentObj.getDouble("weight"));
|
|
|
+ }
|
|
|
+ caseScoreArr.put(score);
|
|
|
+ caseResultObj.put("scores", caseScoreArr);
|
|
|
+ caseResultUrlArr.put(resultUrl);
|
|
|
+ caseResultObj.put("resultUrls", caseResultUrlArr);
|
|
|
+ caseResultObj.put("maxScore", maxScore);
|
|
|
+
|
|
|
+ // update resultObj
|
|
|
+ resultObj.put(String.valueOf(subsiteCaseId), caseResultObj);
|
|
|
+ results.put("results", resultObj);
|
|
|
+
|
|
|
+ // update assignedTask score
|
|
|
+ assignedTask.setScore(score);
|
|
|
+ assignedTask.setResult(results.toString());
|
|
|
+ assignedTaskDao.save(assignedTask);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String uploadApp(String host, String name, String caseUrl, Boolean isPublic, Long uploaderId) {
|
|
|
+ String message = "";
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ if (subsite == null){
|
|
|
+ return "No subsite match from host";
|
|
|
+ }
|
|
|
+
|
|
|
+ Manager uploader = managerDao.findById(uploaderId);
|
|
|
+ if (uploader == null){
|
|
|
+ return "No such manager";
|
|
|
+ }
|
|
|
+
|
|
|
+ App app = new App();
|
|
|
+ app.setCaseUrl(caseUrl);
|
|
|
+ app.setVisibility(isPublic);
|
|
|
+ app.setName(name);
|
|
|
+ app.setSubsiteId(subsite.getId());
|
|
|
+ app.setManagerId(uploader.getId());
|
|
|
+ app.setStatus(0);
|
|
|
+
|
|
|
+ appDao.save(app);
|
|
|
+
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String addCase(String host, String caseId, String typeName,
|
|
|
+ String name, String url, String description, int domain, Long appId) {
|
|
|
+ String message = "";
|
|
|
+ App app = appDao.findOne(appId);
|
|
|
+
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ if (subsite == null){
|
|
|
+ return "No subsite match from host";
|
|
|
+ }
|
|
|
+ description = (description == null) ? "" : description;
|
|
|
+
|
|
|
+ Subject subject = subjectDao.findBySubsiteIdAndTypeName(subsite.getId(), typeName);
|
|
|
+ if (subject == null){
|
|
|
+ subject = new Subject();
|
|
|
+ subject.setName(typeName);
|
|
|
+ subject.setTargetUrl("");
|
|
|
+ subject.setTypeName(typeName);
|
|
|
+ subject.setSubsiteId(subsite.getId());
|
|
|
+ subjectDao.save(subject);
|
|
|
+ }
|
|
|
+
|
|
|
+ Case oldCase = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), caseId);
|
|
|
+ if (oldCase != null){
|
|
|
+ return "case already exists";
|
|
|
+ }
|
|
|
+
|
|
|
+ Case caze = new Case();
|
|
|
+ caze.setDomain(domain);
|
|
|
+ caze.setVisible((app == null) ? true : app.isVisibility());
|
|
|
+ caze.setName(name);
|
|
|
+ caze.setUrl(url);
|
|
|
+ caze.setSubjectId(subject.getId());
|
|
|
+ caze.setManagerId((app == null) ? PrivilegeConstants.SUPER_MANAGER_ID : app.getManagerId());
|
|
|
+ caze.setDescription(description);
|
|
|
+ caze.setCaseId(caseId);
|
|
|
+ caze.setDifficulty(1);
|
|
|
+
|
|
|
+ caseDao.save(caze);
|
|
|
+
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String addCase(String host, String caseId, String typeName, Long managerId, String name, String url, String description, Integer domain, boolean isPublic) {
|
|
|
+ String message = "";
|
|
|
+
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ if (subsite == null){
|
|
|
+ return "No subsite match from host";
|
|
|
+ }
|
|
|
+ Manager manager = (managerId == null) ? null : managerDao.findById(managerId);
|
|
|
+ description = (description == null) ? "" : description;
|
|
|
+
|
|
|
+ Subject subject = subjectDao.findBySubsiteIdAndTypeName(subsite.getId(), typeName);
|
|
|
+ if (subject == null){
|
|
|
+ subject = new Subject();
|
|
|
+ subject.setName(typeName);
|
|
|
+ subject.setTargetUrl("");
|
|
|
+ subject.setTypeName(typeName);
|
|
|
+ subject.setSubsiteId(subsite.getId());
|
|
|
+ subjectDao.save(subject);
|
|
|
+ }
|
|
|
+
|
|
|
+ Case oldCase = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), caseId);
|
|
|
+ if (oldCase != null){
|
|
|
+ return "case already exists";
|
|
|
+ }
|
|
|
+
|
|
|
+ Case caze = new Case();
|
|
|
+ caze.setDomain(domain);
|
|
|
+ caze.setVisible(isPublic);
|
|
|
+ caze.setName(name);
|
|
|
+ caze.setUrl(url);
|
|
|
+ caze.setSubjectId(subject.getId());
|
|
|
+ caze.setManagerId(manager.getId());
|
|
|
+ caze.setDescription(description);
|
|
|
+ caze.setCaseId(caseId);
|
|
|
+ caze.setDifficulty(1);
|
|
|
+
|
|
|
+ caseDao.save(caze);
|
|
|
+
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String takeTask(Long workerId, Long taskId, String subsiteCaseId, String host) {
|
|
|
+ // get all entities
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+
|
|
|
+ Task2Case task2Case = task2CaseDao.findByTaskIdAndCaseId(taskId, caze.getId());
|
|
|
+
|
|
|
+ // parse content
|
|
|
+ String content = assignedTask.getContent();
|
|
|
+ JSONObject assignedContent = new JSONObject();
|
|
|
+ if (content.length() > 0){
|
|
|
+ assignedContent = new JSONObject(content);
|
|
|
+ }
|
|
|
+ JSONObject assignedObjs = assignedContent.has("cases") ? assignedContent.getJSONObject("cases") : new JSONObject();
|
|
|
+ boolean picked = false;
|
|
|
+ if (assignedObjs.has(String.valueOf(caze.getCaseId()))){
|
|
|
+ picked = true;
|
|
|
+ }
|
|
|
+ JSONObject assignedCase = new JSONObject();
|
|
|
+
|
|
|
+ Subject subject = subjectDao.findOne(caze.getSubjectId());
|
|
|
+ assignedCase.put("id", caze.getId());
|
|
|
+ assignedCase.put("name", caze.getName());
|
|
|
+ assignedCase.put("weight", task2Case.getWeight());
|
|
|
+ assignedCase.put("hint", caze.getHint());
|
|
|
+ assignedCase.put("caseUrl", caze.getUrl());
|
|
|
+ assignedCase.put("caseType", subject.getTypeName());
|
|
|
+ assignedCase.put("subsiteUrl", subsite.getBaseUrl());
|
|
|
+ assignedCase.put("caseId", caze.getCaseId());
|
|
|
+ assignedObjs.put(String.valueOf(caze.getCaseId()), assignedCase);
|
|
|
+ assignedContent.put("cases", assignedObjs);
|
|
|
+ // update assignedTask if not chosen
|
|
|
+ if (!picked){
|
|
|
+ // if not picked before
|
|
|
+ assignedTask.setContent(assignedContent.toString());
|
|
|
+ assignedTaskDao.save(assignedTask);
|
|
|
+
|
|
|
+ // Update count of Task2Case
|
|
|
+ task2Case.setCount(task2Case.getCount() + 1);
|
|
|
+ task2CaseDao.save(task2Case);
|
|
|
+ }
|
|
|
+
|
|
|
+ return "{\"success\":true}";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * UTILs methods
|
|
|
+ *
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String checkCaseAssignment(Long workerId, String subsiteCaseId, Long taskId, String host) {
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
|
|
|
+ if (assignedTask == null || subsite == null || caze == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject contentObj = new JSONObject(assignedTask.getContent());
|
|
|
+ JSONObject casesObj = contentObj.getJSONObject("cases");
|
|
|
+ if (casesObj.has(String.valueOf(caze.getCaseId()))){
|
|
|
+ return casesObj.get(String.valueOf(caze.getCaseId())).toString();
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String checkCaseExists(Long workerId, String subsiteCaseId, Long taskId, String host) {
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ if (subsite == null){
|
|
|
+ return "No subsite match from host";
|
|
|
+ }
|
|
|
+
|
|
|
+ Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
|
|
|
+
|
|
|
+ if (assignedTask == null){
|
|
|
+ return "AssignedTask not found by task and worker";
|
|
|
+ }
|
|
|
+ if (caze == null){
|
|
|
+ return "Case not found";
|
|
|
+ }
|
|
|
+
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String checkCaseAvailability(Long taskId, String subsiteCaseId, String host) {
|
|
|
+ Subsite subsite = subsiteDao.findByBaseUrl(host);
|
|
|
+ Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
|
|
|
+
|
|
|
+ Task2Case task2Case = task2CaseDao.findByTaskIdAndCaseId(taskId, caze.getId());
|
|
|
+ if (task2Case == null || task2Case.isAutoSelect() == true) {
|
|
|
+ return "Not allowed to pick assigned cases";
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String booleanToJSON(boolean success) {
|
|
|
+ String result;
|
|
|
+ result = success ? "{\"success\":true}" : "{\"success\":false}";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean groupMemberExceeded(Group group){
|
|
|
+ return (group2WorkerDao.findByGroupId(group.getId()).size() >= managerDao.findOne(group.getManagerId()).getGroupSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean privilegeExpired(Manager manager){
|
|
|
+ Timestamp current = new Timestamp(System.currentTimeMillis());
|
|
|
+ if (manager.getExpireTime() == null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return manager.getExpireTime().before(current);
|
|
|
+ }
|
|
|
+ public boolean assignTaskForNewMember(String workerEmail, String workerMobile, long groupId) {
|
|
|
+ Worker worker = workerDao.findByAccount(workerEmail, workerMobile);
|
|
|
+ return assignTaskForNewMember(worker, groupId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean assignTaskForNewMember(long workerId, long groupId) {
|
|
|
+ return assignTaskForNewMember(workerDao.findOne(workerId), groupId);
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean assignTaskForNewMember(Worker worker, long groupId){
|
|
|
+ if (worker == null){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Task2Group> taskGroupList = task2GroupDao.findByGroupId(groupId);
|
|
|
+ for (Task2Group task2Group : taskGroupList){
|
|
|
+ Task task = taskDao.findOne(task2Group.getTaskId());
|
|
|
+ // Check if there are already assigned tasks
|
|
|
+ AssignedTask existingAssignedTask = assignedTaskDao.findByTaskIdAndWorkerIdIgnoringDeletion(task.getId(), worker.getId());
|
|
|
+ if (existingAssignedTask != null){
|
|
|
+ existingAssignedTask.setDeleted(false);
|
|
|
+ assignedTaskDao.save(existingAssignedTask);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ existingAssignedTask = new AssignedTask();
|
|
|
+ }
|
|
|
+ List<Task2Case> task2CaseList = task2CaseDao.findByTaskId(task.getId());
|
|
|
+ HashMap<Long, List<Long>> caseGroupMap = new HashMap<Long, List<Long>>();
|
|
|
+ HashMap<Long, Double> weightGroupMap = new HashMap<Long, Double>();
|
|
|
+ for (Task2Case task2Case : task2CaseList){
|
|
|
+ long caseGroupId = task2Case.getCaseIndex();
|
|
|
+ List<Long> caseList = (caseGroupMap.containsKey(caseGroupId)) ? caseGroupMap.get(caseGroupId) : new ArrayList<Long>();
|
|
|
+ caseList.add(task2Case.getCaseId());
|
|
|
+ caseGroupMap.put(caseGroupId, caseList);
|
|
|
+
|
|
|
+ if (!weightGroupMap.containsKey(caseGroupId)){
|
|
|
+ weightGroupMap.put(caseGroupId, task2Case.getWeight());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // prepare cases content for AssignedTask
|
|
|
+ JSONObject assignedTaskObj = new JSONObject(), assignedCasesObj = new JSONObject();
|
|
|
+ for (Long caseGroupId : caseGroupMap.keySet()){
|
|
|
+ // Add new AssignedTask
|
|
|
+ List<Long> caseList = caseGroupMap.get(caseGroupId);
|
|
|
+ long chosenCaseId = generateCase(caseList);
|
|
|
+ JSONObject assignedCaseObj = new JSONObject();
|
|
|
+ Case caze = caseDao.findOne(chosenCaseId);
|
|
|
+ Subject subject = subjectDao.findOne(caze.getSubjectId());
|
|
|
+
|
|
|
+ assignedCaseObj.put("id", caze.getId());
|
|
|
+ assignedCaseObj.put("name", caze.getName());
|
|
|
+ assignedCaseObj.put("weight", weightGroupMap.get(caseGroupId));
|
|
|
+ assignedCaseObj.put("caseUrl", caze.getUrl());
|
|
|
+ assignedCaseObj.put("caseType", subject.getTypeName());
|
|
|
+ assignedCaseObj.put("hint", caze.getHint());
|
|
|
+ assignedCaseObj.put("subsiteUrl", subsiteDao.findOne(subject.getSubsiteId()).getBaseUrl());
|
|
|
+ assignedCaseObj.put("caseId", caze.getCaseId());
|
|
|
+ assignedCasesObj.put(String.valueOf(caze.getCaseId()), assignedCaseObj);
|
|
|
+
|
|
|
+ // update Task2Case count
|
|
|
+ Task2Case task2Case = task2CaseDao.findByTaskIdAndCaseId(task.getId(), caze.getId());
|
|
|
+ task2Case.setCount(task2Case.getCount() + 1);
|
|
|
+ task2CaseDao.save(task2Case);
|
|
|
+ }
|
|
|
+ assignedTaskObj.put("cases", assignedCasesObj);
|
|
|
+
|
|
|
+ // prepare results for AssignedTask
|
|
|
+ JSONObject resultObj = new JSONObject();
|
|
|
+ resultObj.put("results", new JSONObject());
|
|
|
+
|
|
|
+ // assign values for AssignedTask
|
|
|
+ existingAssignedTask.setName(task.getName());
|
|
|
+ existingAssignedTask.setContent(assignedTaskObj.toString());
|
|
|
+ existingAssignedTask.setResult(resultObj.toString());
|
|
|
+ existingAssignedTask.setManagerId(task.getManagerId());
|
|
|
+ existingAssignedTask.setTaskId(task.getId());
|
|
|
+ existingAssignedTask.setScore(0.0);
|
|
|
+ existingAssignedTask.setWorkerId(worker.getId());
|
|
|
+ existingAssignedTask.setDeleted(false);
|
|
|
+
|
|
|
+ // Create AssignedTask entity
|
|
|
+ assignedTaskDao.save(existingAssignedTask);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static long generateCase(List<Long> caseIdsList) {
|
|
|
+ int serial = new Double(Math.floor(Math.random() * caseIdsList.size()))
|
|
|
+ .intValue();
|
|
|
+ return caseIdsList.get(serial);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getGroupJSON(Long groupId) {
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+ Group group = groupDao.findOne(groupId);
|
|
|
+ if (group == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Manager manager = managerDao.findOne(group.getId());
|
|
|
+ result.put("id", group.getId());
|
|
|
+ result.put("name", group.getName());
|
|
|
+ result.put("managerName", manager.getName());
|
|
|
+
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getAllGroupsJSON(Long workerId) {
|
|
|
+ Worker worker = workerDao.findOne(workerId);
|
|
|
+ JSONArray groupArr = new JSONArray();
|
|
|
+
|
|
|
+ List<Group> groups = new ArrayList<Group>();
|
|
|
+ List<Group2Worker> group2Workers = group2WorkerDao.findByWorkerId(workerId);
|
|
|
+ for (Group2Worker group2Worker : group2Workers){
|
|
|
+ Group group = groupDao.findOne(group2Worker.getGroupId());
|
|
|
+
|
|
|
+ Manager groupManager = managerDao.findOne(group.getManagerId());
|
|
|
+ JSONObject groupObj = new JSONObject();
|
|
|
+ groupObj.put("id", group.getId());
|
|
|
+ groupObj.put("name", group.getName());
|
|
|
+ groupObj.put("managerName", groupManager.getName());
|
|
|
+ groupArr.put(groupObj);
|
|
|
+ }
|
|
|
+ return groupArr.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String checkCaseOwnership(Long workerId, Long taskId, String caseId) {
|
|
|
+ AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
|
|
|
+ JSONObject taskContent = new JSONObject(assignedTask.getContent());
|
|
|
+ JSONObject casesContent = taskContent.getJSONObject("cases");
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+
|
|
|
+ result.put("taken", casesContent.has(caseId));
|
|
|
+
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Worker workerExists(Long workerId) {
|
|
|
+ return (workerDao.findOne(workerId));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String formInfoJson(Worker worker) {
|
|
|
+ JSONObject userInfoObj = new JSONObject();
|
|
|
+ userInfoObj.put("email", worker.getEmail());
|
|
|
+ userInfoObj.put("mobile", worker.getMobile());
|
|
|
+ userInfoObj.put("name", worker.getName());
|
|
|
+ userInfoObj.put("avatar", worker.getAvatar());
|
|
|
+ userInfoObj.put("level", worker.getLevel());
|
|
|
+
|
|
|
+ return userInfoObj.toString();
|
|
|
+ }
|
|
|
+}
|