/branches/grupo6/impl/conf/berserk/sd.xml |
---|
4065,13 → 4065,12 |
</filterChains> |
</service> |
<!-- SEGUNDO GRÁFICO --> |
<service> |
<name>CourseReportGenerateGlobalLearningResultsChartYearImg</name> |
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass> |
<description> |
@reportCourseDocument documento course report em json |
Serviço de suporte para gerar um grafico de aproveitamento por notas e ano curricular |
Serviço de suporte para gerar um grafico |
Coloca o grafico no report documento |
e salva o documento no curso |
Devolve uma classe RepositoryFile4JsonView serializada em JSON |
4085,7 → 4084,27 |
</service> |
<!-- SEGUNDO GRÁFICO --> |
<service> |
<name>CourseReportGenerateLearningResultsSemesterImg</name> |
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass> |
<description> |
@reportCourseDocument documento course report em json |
Serviço de suporte para gerar um grafico de aproveitamento por notas e ano curricular |
Coloca o grafico no report documento |
e salva o documento no curso |
Devolve uma classe RepositoryFile4JsonView serializada em JSON |
</description> |
<isTransactional>true</isTransactional> |
<defaultMethod>generateLearningResultsSemesterImg</defaultMethod> |
<filterChains> |
<chain name="Logger"/> |
<chain name="Session"/> |
</filterChains> |
</service> |
<service> |
<name>CourseReportSave</name> |
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass> |
<description> |
/branches/grupo6/impl/src/java/pt/estgp/estgweb/utils/documentBuilder/DocumentSection.java |
---|
50,4 → 50,18 |
} |
return null; |
} |
public DocComponent findDocComponentWithCode(Class compClass, String semesterCode) |
{ |
if(getComponents() != null) |
for(DocComponent comp: getComponents()) |
{ |
if(comp.getClass().equals(compClass) && comp.getInternalCode().equals(semesterCode)) |
{ |
return comp; |
} |
} |
return null; |
} |
} |
/branches/grupo6/impl/src/java/pt/estgp/estgweb/utils/documentBuilder/DocComponent.java |
---|
3,5 → 3,12 |
/** |
* Created by jorgemachado on 11/10/17. |
*/ |
public class DocComponent extends ExtensibleDocObject { |
public class DocComponent extends ExtensibleDocObject |
{ |
public String getInternalCode() |
{ |
return ""; |
} |
} |
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java |
---|
9,11 → 9,11 |
import org.json.JSONObject; |
import pt.estgp.estgweb.domain.*; |
import pt.estgp.estgweb.domain.dao.DaoFactory; |
import pt.estgp.estgweb.domain.dao.impl.CourseYearDaoImpl; |
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum; |
import pt.estgp.estgweb.services.courses.coursereport.CourseReportUtils; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.*; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.courseunitreport.CourseUnitSection; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.LearningAnalysisSection; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.LearningGlobalAnalysisSection; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.*; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.reportucsummary.CourseUnitDtpStat; |
455,6 → 455,45 |
return chartImg.toJson(); |
} |
public String generateLearningResultsSemesterImg(String reportDocumentJson, String semesterCode, |
UserSession session) throws IOException { |
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson); |
LearningResultsSection learningResultsSection = (LearningResultsSection) reportDocument.findDocumentSection(LearningResultsSection.class); |
LearningAnalysisSection learningAnalysisSection = (LearningAnalysisSection) learningResultsSection.findSection(LearningAnalysisSection.class); |
LearningResultsChartSem chartImg = (LearningResultsChartSem) learningAnalysisSection.findDocComponentWithCode(LearningResultsChartSem.class, semesterCode); |
UnitsLearningResultsTable table = (UnitsLearningResultsTable) learningResultsSection.findDocComponent(UnitsLearningResultsTable.class); |
FileUploaded fileUploaded = chartImg.generateChart2tmp(table,reportDocument); |
RepositoryService repositoryService = new RepositoryService(); |
boolean imageInitialized = chartImg.getImage() != null |
&& |
chartImg.getImage().getIdentifier() != null; |
RepositoryFile4JsonView view; |
if(imageInitialized) |
{ |
String identifier = chartImg.getImage().getIdentifier(); |
view = repositoryService.replaceRepositoryFileFromFileUpload(identifier, fileUploaded, ResourceAccessControlEnum.publicDomain, session); |
} |
else |
{ |
view = repositoryService.storeRepositoryFileFromFileUpload(fileUploaded,ResourceAccessControlEnum.publicDomain,session); |
} |
chartImg.setImage(view); |
chartImg.setWidth(500); |
float relative = 500 / GlobalLearningResultsChartYearImg.WIDTH; |
float height = relative * GlobalLearningResultsChartYearImg.HEIGHT; |
chartImg.setHeight((int) height); |
//TODO FALTA GUARDAR O JSON NO CURSO |
return chartImg.toJson(); |
} |
public String save(String reportDocumentJson, UserSession session) throws IOException { |
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson); |
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/LearningResultsChartSem.java |
---|
1,8 → 1,41 |
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components; |
import jomm.utils.BytesUtils; |
import jomm.utils.MimeTypeGuesser; |
import org.apache.commons.fileupload.FileUpload; |
import org.jfree.chart.ChartFactory; |
import org.jfree.chart.JFreeChart; |
import org.jfree.chart.axis.CategoryAxis; |
import org.jfree.chart.axis.NumberAxis; |
import org.jfree.chart.block.BlockBorder; |
import org.jfree.chart.labels.ItemLabelAnchor; |
import org.jfree.chart.labels.ItemLabelPosition; |
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; |
import org.jfree.chart.plot.CategoryPlot; |
import org.jfree.chart.plot.PiePlot; |
import org.jfree.chart.plot.PlotOrientation; |
import org.jfree.chart.plot.RingPlot; |
import org.jfree.chart.renderer.category.StackedBarRenderer; |
import org.jfree.chart.renderer.category.StandardBarPainter; |
import org.jfree.chart.title.LegendTitle; |
import org.jfree.data.category.DefaultCategoryDataset; |
import org.jfree.data.general.DefaultPieDataset; |
import org.jfree.ui.RectangleInsets; |
import org.jfree.ui.TextAnchor; |
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument; |
import pt.estgp.estgweb.utils.Globals; |
import pt.estgp.estgweb.utils.documentBuilder.ImageComponent; |
import pt.estgp.estgweb.web.controllers.utils.FileUploaded; |
import javax.imageio.ImageIO; |
import java.awt.*; |
import java.awt.image.BufferedImage; |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.text.DecimalFormat; |
import java.text.NumberFormat; |
import java.util.List; |
/** |
* Created by jorgemachado on 31/10/17. |
*/ |
10,12 → 43,17 |
{ |
String semesterCode; |
@Override |
public String getInternalCode() { |
return getSemesterCode(); |
} |
public LearningResultsChartSem() { |
} |
public LearningResultsChartSem(String semesterCode) { |
this.semesterCode = semesterCode; |
} |
public String getSemesterCode() { |
26,5 → 64,80 |
this.semesterCode = semesterCode; |
} |
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results, CourseReportDocument courseReportDocument) throws IOException { |
List<UnitsLearningResultYear> years = results.getYears(); |
String tempName = BytesUtils.generateHexKey() + ".png"; |
DefaultCategoryDataset data = new DefaultCategoryDataset(); |
for (UnitsLearningResultYear year : years) { |
for (UnitsLearningResultSemester semester : year.getSemesters()) { |
if (semester.getSemestre().equals(getSemesterCode())) { |
for (UnitsLearningResultUc uc : semester.getUcs()) { |
data.addValue(new Double(uc.getSemElementosPercent()), "Sem elementos", uc.getName()); |
data.addValue(new Double(uc.getReprovadosPercent()), "Reprovados", uc.getName()); |
data.addValue(new Double(uc.getAprovadosPercent()), "Aprovados", uc.getName()); |
} |
break; |
} |
} |
} |
JFreeChart chart = ChartFactory.createStackedBarChart( |
null, |
null, |
null, |
data, |
PlotOrientation.HORIZONTAL, |
true, |
false, |
false); |
chart.setBackgroundPaint(Color.WHITE); |
CategoryPlot plot = (CategoryPlot) chart.getPlot(); |
plot.setBackgroundPaint(Color.WHITE); |
plot.setRangeGridlinePaint(Color.GRAY); |
plot.setRangeGridlinesVisible(true); |
//plot.setRangeGridlineStroke(new BasicStroke(1.0f)); |
RectangleInsets chartRectangle = new RectangleInsets(0,0,30F,0); |
chart.setPadding(chartRectangle); |
plot.getDomainAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25)); |
plot.getRangeAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25)); |
StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer(); |
// Remover gradiente das barras |
renderer.setBarPainter(new StandardBarPainter()); |
renderer.setSeriesPaint(0, new Color(237,127,32)); |
renderer.setSeriesPaint(1, new Color(255,198,0)); |
renderer.setSeriesPaint(2, new Color(122,173,38)); |
renderer.setMaximumBarWidth(0.2); |
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("#.##'%'"))); |
renderer.setBaseItemLabelsVisible(true); |
renderer.setBaseItemLabelFont(new Font("Helvetica",Font.PLAIN,25)); |
LegendTitle legend = chart.getLegend(); |
legend.setItemFont(new Font("Helvetica", Font.PLAIN,25)); |
legend.setFrame(BlockBorder.NONE); |
BufferedImage image = chart.createBufferedImage( 300*4, 200*4); |
String pathGraficoTiposAlunos = Globals.TMP_DIR + java.io.File.separator + tempName; |
java.io.File output = new java.io.File(pathGraficoTiposAlunos); |
ImageIO.write(image, "png", new FileOutputStream(output)); |
FileUploaded fileUploaded = new FileUploaded(); |
fileUploaded.setTmpName(tempName); |
fileUploaded.setTitle("Taxa global de aproveitamento"); |
fileUploaded.setDescription("Curso: " + courseReportDocument.getCourseName() + " (" + courseReportDocument.getCourseCode()+ ") ano " + courseReportDocument.getYear()); |
fileUploaded.setContentType(MimeTypeGuesser.getInstance().guessMimeType(output)); |
fileUploaded.setFileSize(output.length()); |
fileUploaded.setExtension("png"); |
return fileUploaded; |
} |
} |
/branches/grupo6/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesServicesController.java |
---|
106,6 → 106,19 |
return new JSONObject(json); |
} |
public JSONObject generateLearningResultsSemesterImg(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable { |
String courseReportDocument = request.getParameter("courseReportDocument"); |
IServiceManager sm = ServiceManager.getInstance(); |
String json = (String) sm.execute(RequestUtils.getRequester(request, response), |
"CourseReportGenerateLearningResultsSemesterImg", |
new Object[]{courseReportDocument,request.getParameter("semesterCode")}); |
// addMessageAsString(request,"Gráfico Gerado"); |
return new JSONObject(json); |
} |
public JSONObject save(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable { |
String courseReportDocument = request.getParameter("courseReportDocument"); |
/branches/grupo6/impl/src/web/user/courses/coursereport/templates.jsp |
---|
1,9 → 1,4 |
<%@ page |
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultYear" %> |
<%@ page |
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultSemester" %> |
<%@ page |
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultUc" %> |
<%@ page import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.*" %> |
<%@ page contentType="text/html;charset=UTF-8" language="java" %> |
<!-- |
686,6 → 681,43 |
</script> |
<script type="text/ng-template" id="generateGraph"> |
<div class="imageComponent component"> |
<div class="componentBody"> |
<div class="form-group clearfix"> |
<label class="col-md-2 control-label">Legenda</label> |
<div class="col-md-10"> |
<input type="text" class="form-control" rows="10" ng-model="comp.title"> |
</div> |
</div> |
<div class="form-group clearfix"> |
<div class="col-md-2 control-label"> |
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button> |
</div> |
<div class="col-md-10"> |
<label ng-if="comp.image.identifier"> Limites do PDF </label> |
<div ng-if="comp.image.identifier" |
style="text-align: center; width: 595px; border: 1px solid black; padding: 45px"> |
<center> |
<div style="width:'{{comp.width}}'px ;height:'{{comp.height}}'px; max-width: 500px; max-height: 750px" resizable |
on-resize="resize($evt, $ui, comp)"> |
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}"> |
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" |
ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}"> |
</div> |
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito) |
</center> |
</div> |
</div> |
</div> |
</div> |
</div> |
</script> |
<script type="text/ng-template" |
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg"> |
<globallearningresultschartimg> |
721,46 → 753,12 |
}, |
templateUrl: function (elem, attrs) { |
return "globallearningresultschartimg"; |
return "generateGraph"; |
} |
} |
}); |
</script> |
<script type="text/ng-template" id="globallearningresultschartimg"> |
<div class="imageComponent component"> |
<div class="componentBody"> |
<div class="form-group clearfix"> |
<label class="col-md-2 control-label">Legenda</label> |
<div class="col-md-10"> |
<input type="text" class="form-control" rows="10" ng-model="comp.title"> |
</div> |
</div> |
<div class="form-group clearfix"> |
<div class="col-md-2 control-label"> |
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button> |
</div> |
<div class="col-md-10"> |
<label ng-if="comp.image.identifier"> Limites do PDF </label> |
<div ng-if="comp.image.identifier" |
style="text-align: center; width: 595px; border: 1px solid black; padding: 45px"> |
<center> |
<div style="width:'{{comp.width}}'px ;height:'{{comp.height}}'px; max-width: 500px; max-height: 750px" resizable |
on-resize="resize($evt, $ui, comp)"> |
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}"> |
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" |
ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}"> |
</div> |
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito) |
</center> |
</div> |
</div> |
</div> |
</div> |
</div> |
</script> |
<script type="text/ng-template" |
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartYearImg"> |
<globallearningresultschartyearimg> |
796,45 → 794,58 |
}, |
templateUrl: function (elem, attrs) { |
return "globallearningresultschartyearimg"; |
return "generateGraph"; |
} |
} |
}); |
</script> |
<script type="text/ng-template" id="globallearningresultschartyearimg"> |
<div class="imageComponent component"> |
<div class="componentBody"> |
<div class="form-group clearfix"> |
<label class="col-md-2 control-label">Legenda</label> |
<div class="col-md-10"> |
<input type="text" class="form-control" rows="10" ng-model="comp.title"> |
</div> |
</div> |
<div class="form-group clearfix"> |
<div class="col-md-2 control-label"> |
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button> |
</div> |
<div class="col-md-10"> |
<label ng-if="comp.image.identifier"> Limites do PDF </label> |
<div ng-if="comp.image.identifier" |
style="text-align: center; width: 595px; border: 1px solid black; padding: 45px"> |
<center> |
<div style="width:'{{comp.width}}'px ;height:'{{comp.height}}'px; max-width: 500px; max-height: 750px" resizable |
on-resize="resize($evt, $ui, comp)"> |
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}"> |
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" |
ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}"> |
</div> |
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito) |
</center> |
</div> |
</div> |
</div> |
</div> |
</div> |
<!-- SEGUNDO GRAFICO--> |
<%--<script type="text/ng-template" |
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultSemesterImg">--%> |
<script type="text/ng-template" |
id="<%=LearningResultsChartSem.class.getName().replaceAll("\\.","_")%>"> |
<globallearningresultssemesterimg> |
</globallearningresultssemesterimg> |
</script> |
<script> |
angular.module("courseReportApp").directive('globallearningresultssemesterimg', function () { |
return { |
restrict: 'E', |
link: function ($scope, element, attrs) { |
$scope.generateChart = function (comp) { |
widgetCallWithActionParameters( |
"<%=request.getContextPath()%>/user/courseReport.do", |
"generateLearningResultsSemesterImg", |
{ |
"courseReportDocument": BacoJS.stringifyOrdered(angular.element($("#courseReportApp")).scope().report), |
"semesterCode": comp.semesterCode |
}, |
"#courseReportApp", |
function (chart) { |
comp.image = chart.image; |
comp.WIDTH = chart.WIDTH; |
comp.HEIGHT = chart.HEIGHT; |
comp.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + comp.image.identifier + "?" + new Date().getTime(); |
angular.element($("#courseReportApp")).scope().$apply(); |
}, |
function () { |
} |
); |
} |
}, |
templateUrl: function (elem, attrs) { |
return "generateGraph"; |
} |
} |
}); |
</script> |
<!-- TESTE --> |