From c3b68d093187314d34c3011a31aee7465b95af45 Mon Sep 17 00:00:00 2001 From: Chuancey <352548563@qq.com> Date: Mon, 10 May 2021 09:07:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E3=80=81=E5=AE=8C=E6=88=90=E4=BA=86=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 102 ++--- META-INF/MANIFEST.MF | 7 +- build.properties | 3 +- lib/commons-io-1.3.2.jar | Bin 0 -> 87776 bytes .../hit/education/action/ExportAction.java | 63 ++- .../hit/education/action/ImportAction.java | 379 +++++++++++++++++- .../edu/hit/education/dao/PropertyMapper.java | 6 + src/cn/edu/hit/education/pojo/Course.java | 30 ++ .../education/service/CourseServiceImpl.java | 8 + .../hit/education/service/ICourseService.java | 31 +- .../education/service/IPropertyService.java | 31 +- .../service/PropertyServiceImpl.java | 49 ++- src/cn/edu/hit/education/utils/ExcelUtil.java | 312 ++++++++++++++ 13 files changed, 903 insertions(+), 118 deletions(-) create mode 100644 lib/commons-io-1.3.2.jar create mode 100644 src/cn/edu/hit/education/utils/ExcelUtil.java diff --git a/.classpath b/.classpath index 39cd5e7..0e71af2 100644 --- a/.classpath +++ b/.classpath @@ -3,56 +3,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index b3bec1a..cf66446 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -15,7 +15,8 @@ Require-Bundle: org.eclipse.ui, com.ibm.icu Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy -Bundle-ClassPath: lib/commons-codec-1.13.jar, +Bundle-ClassPath: ., + lib/commons-codec-1.13.jar, lib/commons-collections4-4.4.jar, lib/commons-lang3-3.9.jar, lib/commons-logging-1.2.jar, @@ -61,8 +62,8 @@ Bundle-ClassPath: lib/commons-codec-1.13.jar, lib/sqlite-jdbc-3.23.1.jar, lib/swtgraphics2d.jar, lib/xmlbeans-3.1.0.jar, - ., lib/mysql-connector-java-5.1.49.jar, lib/shiro-all-1.3.2.jar, lib/slf4j-api-1.6.1.jar, - lib/slf4j-log4j12-1.6.1.jar + lib/slf4j-log4j12-1.6.1.jar, + lib/commons-io-1.3.2.jar diff --git a/build.properties b/build.properties index 5b17300..a835bf0 100644 --- a/build.properties +++ b/build.properties @@ -52,5 +52,6 @@ bin.includes = plugin.xml,\ lib/mysql-connector-java-5.1.49.jar,\ lib/shiro-all-1.3.2.jar,\ lib/slf4j-api-1.6.1.jar,\ - lib/slf4j-log4j12-1.6.1.jar + lib/slf4j-log4j12-1.6.1.jar,\ + lib/commons-io-1.3.2.jar source.. = src/ diff --git a/lib/commons-io-1.3.2.jar b/lib/commons-io-1.3.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..865c9e41cee5e3f65a734965aa1c2699b069b08e GIT binary patch literal 87776 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

A6&xXLJ)&33psjUNK4JvEVm%t&{TCAh!T;B+qd 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 literal 0 HcmV?d00001 diff --git a/src/cn/edu/hit/education/action/ExportAction.java b/src/cn/edu/hit/education/action/ExportAction.java index d8507a2..e4d3470 100644 --- a/src/cn/edu/hit/education/action/ExportAction.java +++ b/src/cn/edu/hit/education/action/ExportAction.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFDataValidation; @@ -13,9 +14,12 @@ import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; @@ -23,14 +27,21 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import cn.edu.hit.education.pojo.Course; import cn.edu.hit.education.pojo.Property; import cn.edu.hit.education.pojo.Specialty; +import cn.edu.hit.education.pojo.User; import cn.edu.hit.education.service.ICourseService; import cn.edu.hit.education.service.IPropertyService; +import cn.edu.hit.education.service.ISpecialtyService; +import cn.edu.hit.education.service.IUserSpeciatyService; +import cn.edu.hit.education.service.SpecialtyServiceImpl; +import cn.edu.hit.education.service.UserSpeciatyServiceImpl; import educationschedule.Activator; import educationschedule.Application; public class ExportAction extends Action { ICourseService courseService = (ICourseService)Application.applicationContext.getBean("courseServiceImpl"); IPropertyService propertyService = (IPropertyService)Application.applicationContext.getBean("propertyServiceImpl"); + IUserSpeciatyService userSpeciatyService = Application.applicationContext.getBean(UserSpeciatyServiceImpl.class); + ISpecialtyService specialtyService = Application.applicationContext.getBean(SpecialtyServiceImpl.class); public ExportAction(){ this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/toolbar/export_16px.png")); @@ -42,7 +53,17 @@ public class ExportAction extends Action { public void run() { // TODO Auto-generated method stub Specialty specialty = new Specialty(); - specialty.setName("导出课程"); + List specialties = new ArrayList<>(); + + //根据普通用户的用户Id查询到关联的专业Id + Subject subject = SecurityUtils.getSubject(); + User user = (User) subject.getPrincipal(); + List ids = userSpeciatyService.querySpeciatyIdsByUser(user.getId()); + specialties = specialtyService.queryRelativeSpecialty(ids); + + specialty.setName(specialties.get(0).getName()); + + Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); FileDialog fileDialog = new FileDialog(parentShell,SWT.SAVE); @@ -75,13 +96,21 @@ public class ExportAction extends Action { strClassroom.add("讲座"); List courses = courseService.queryAllCourse(); + Map courserPropertyMap = getMap(courses, properties);//课程与课程属性的映射关系 + try { - test(filename,specialty, + test(courserPropertyMap,filename,specialty, String.join(",", strProperties),String.join(",", strImportant), String.join(",", strUnit), String.join(",",strSelected), String.join(",",strMethod), String.join(",",strClassroom), courses); + + MessageBox messageBox=new MessageBox(parentShell,SWT.OK|SWT.ICON_INFORMATION); + messageBox.setText("提示!"); + messageBox.setMessage("导出成功!"); + messageBox.open(); + } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -91,7 +120,7 @@ public class ExportAction extends Action { super.run(); } - public void test(String filename,Specialty specialty, + public void test(Map courserPropertyMap,String filename,Specialty specialty, String strProperties,String strImportant, String strUnit,String strSelected, String strMethod,String strClassRoom, @@ -165,16 +194,23 @@ public class ExportAction extends Action { sheet.addValidationData(dataValidationClassroom); } /////////////////////////////////////////////////// + for (int i = 0;i < courses.size();i++) { Course theCourse = courses.get(i); HSSFRow newRow = sheet.createRow(i + 1); newRow.createCell(0).setCellValue(specialty.getName()); + newRow.createCell(1).setCellValue(courserPropertyMap.get(theCourse.getName())); newRow.createCell(2).setCellValue(theCourse.getName()); newRow.createCell(3).setCellValue(String.valueOf(theCourse.getCredits())); + newRow.createCell(4).setCellValue(String.valueOf((theCourse.getImportant() == 1?"是":"否"))); newRow.createCell(5).setCellValue(theCourse.getNumber()); newRow.createCell(6).setCellValue(String.valueOf(theCourse.getPeriod())); newRow.createCell(7).setCellValue(String.valueOf(theCourse.getTheoretical())); newRow.createCell(8).setCellValue(String.valueOf(theCourse.getExperiment())); + newRow.createCell(9).setCellValue(String.valueOf(theCourse.getUnit())); + newRow.createCell(10).setCellValue(String.valueOf(theCourse.getSelected())); + newRow.createCell(11).setCellValue(String.valueOf(theCourse.getMethod())); + newRow.createCell(12).setCellValue(String.valueOf(theCourse.getClassroom())); newRow.createCell(13).setCellValue("1"); newRow.createCell(14).setCellValue("16"); newRow.createCell(15).setCellValue(""); @@ -184,6 +220,27 @@ public class ExportAction extends Action { hssfWorkbook.write(out); out.close(); } + + /** + * 获取课程和课程属性的映射关系 + *

Title: getMap

+ *

Description:

+ * @param courses + * @param properties + * @return + */ + public Map getMap(List courses,List properties){ + HashMap coursePropertyMap = new HashMap<>(); + for(Course course : courses){ + for(Property property :properties){ + if(property.getId() == course.getPropertyId()){ + coursePropertyMap.put(course.getName(), property.getName()); + } + } + } + return coursePropertyMap; + + } public HSSFDataValidation createBox(String col, Map boxMap, int firstRow, int lastRow, int firstCol, int lastCol) { diff --git a/src/cn/edu/hit/education/action/ImportAction.java b/src/cn/edu/hit/education/action/ImportAction.java index cc5e1a6..82e090e 100644 --- a/src/cn/edu/hit/education/action/ImportAction.java +++ b/src/cn/edu/hit/education/action/ImportAction.java @@ -1,39 +1,396 @@ package cn.edu.hit.education.action; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; +import cn.edu.hit.education.pojo.Course; +import cn.edu.hit.education.pojo.CourseTo; +import cn.edu.hit.education.pojo.Property; +import cn.edu.hit.education.pojo.Specialty; +import cn.edu.hit.education.pojo.User; import cn.edu.hit.education.service.ICourseService; +import cn.edu.hit.education.service.IPropertyService; +import cn.edu.hit.education.service.ISpecialtyService; +import cn.edu.hit.education.service.IUserSpeciatyService; +import cn.edu.hit.education.service.PropertyServiceImpl; +import cn.edu.hit.education.service.SpecialtyServiceImpl; +import cn.edu.hit.education.service.UserSpeciatyServiceImpl; +import cn.edu.hit.education.utils.ExcelUtil; import educationschedule.Activator; import educationschedule.Application; +/** + * 导入课程,如果重复且更新,则覆盖原有课程,如果重复无更新,不做任何操作!没有则新增一条数据。 + *

+ * Title: ImportAction + *

+ *

+ * Description: + *

+ * + * @author 罗成 + * @date 2021年5月9日 + */ public class ImportAction extends Action { - ICourseService courseService = (ICourseService)Application.applicationContext.getBean("courseServiceImpl"); - - public ImportAction(){ - this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/toolbar/import_16px.png")); + ICourseService courseService = (ICourseService) Application.applicationContext + .getBean("courseServiceImpl"); + IUserSpeciatyService userSpeciatyService = Application.applicationContext + .getBean(UserSpeciatyServiceImpl.class); + ISpecialtyService specialtyService = Application.applicationContext + .getBean(SpecialtyServiceImpl.class); + IPropertyService propertyService = Application.applicationContext + .getBean(PropertyServiceImpl.class); + + private List speciatyids = null; + + public ImportAction() { + this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/toolbar/import_16px.png")); this.setToolTipText("导入课程"); this.setText("导出课程"); } - + @Override public void run() { // TODO Auto-generated method stub - Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - FileDialog fileDialog = new FileDialog(parentShell,SWT.OPEN); - fileDialog.setFilterExtensions(new String[]{"*.xls"}); - String filename ; + Shell parentShell = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getShell(); + FileDialog fileDialog = new FileDialog(parentShell, SWT.OPEN); + fileDialog.setFilterExtensions(new String[] { "*.xls" }); + String filename; filename = fileDialog.open(); - if(filename != null){ - System.out.println(filename); + if (filename != null) { + try { + read(filename); + MessageBox messageBox=new MessageBox(parentShell,SWT.OK|SWT.ICON_INFORMATION); + messageBox.setText("提示"); + messageBox.setMessage("导入成功!"); + messageBox.open(); + } catch (IOException e) { + MessageBox messageBox=new MessageBox(parentShell,SWT.OK|SWT.ICON_INFORMATION); + messageBox.setText("导入失败!!"); + messageBox.setMessage("原因:导入异常!" ); + messageBox.open(); + } catch(NumberFormatException e ){ + MessageBox messageBox=new MessageBox(parentShell,SWT.OK|SWT.ICON_INFORMATION); + messageBox.setText("部分课程信息未能导入!"); + messageBox.setMessage("原因:课程信息不允许留空!请修改表格后重新导入!" ); + messageBox.open(); + }catch(RuntimeException e){ + MessageBox messageBox=new MessageBox(parentShell,SWT.OK|SWT.ICON_INFORMATION); + messageBox.setText("导入失败!!"); + messageBox.setMessage("原因:" + e.getMessage()); + messageBox.open(); + } } super.run(); } + + /** + * xls表格导入 + *

Title: read

+ *

Description:

+ * @param filename + * @throws IOException + */ + public void read(String filename) throws IOException { + Subject subject = SecurityUtils.getSubject(); + // 根据普通用户的用户Id查询到关联的专业Id (只能操作修改本专业下课程,避免覆盖其他专业同名课程) + User user = (User) subject.getPrincipal(); + speciatyids = userSpeciatyService.querySpeciatyIdsByUser(user.getId()); + List courseFromDb = courseService + .queryAllCourseBySpecityId(speciatyids); + + ExcelUtil excel = new ExcelUtil(); + List> listmap = excel.readExcel(filename); + if (listmap != null) { + for (Map map : listmap) { + boolean hasEquals = false; + for (Course course : courseFromDb) { + String nameFromEx = (String) map.get("课程名称"); + String nameFromDb = course.getName(); + //课程名称相同,再判断其他值是否全部相同 + if (nameFromEx.equals(nameFromDb)) { + + //从Excel获取的数据封装为Course对象, + Course courseFroEx = courseMapToObj(map); + //重写的equals方法,避免多次覆盖数据库数据,造成多次IO导致系统慢 + if(course.equals(courseFroEx)){ + System.out.println("数据一致,不用修改!"); + hasEquals = true; + break; + } + + updateCourse(course.getId(), map); + System.out.println("修改了数据库!"); + hasEquals = true; + break; + } + } + String nameFromEx = (String) map.get("课程名称"); + if("".equals(nameFromEx)){ + return; + } + if(hasEquals == false){ + insertCourse(map); + } + + } + } + + } + + /** + * 增加一门课程 + *

Title: insertCourse

+ *

Description:

+ * @param coursemMap + */ + private void insertCourse(Map coursemMap) { + Course course = new Course(); + Specialty specialty = specialtyService.queryByPrimaryKey(speciatyids + .get(0));// 一个教研主任只负责一个专业的增删改,默认取用户拥有权限的第一个专业id + + // 如果添加课程的专业与用户权限不符,导入失败抛出异常 + String nameFromEx = (String) coursemMap.get("专业名称"); + String nameFromDb = specialty.getName(); + if (!nameFromEx.equals(nameFromDb)) { + throw new RuntimeException("只能为" + specialty.getName() + "添加课程!"); + } else { + + // 设置专业Id + course.setSpecialtyId(speciatyids.get(0)); + + // 设置课程性质Id + Property property = propertyService.queryPropertyByName(String + .valueOf(coursemMap.get("课程性质"))); + if (property != null) { + + course.setPropertyId(property.getId()); + } + + // 设置课程名称 + course.setName(String.valueOf(coursemMap.get("课程名称"))); + + // 设置课程学分 + course.setCredits(Double.valueOf((String) coursemMap.get("课程学分"))); + + // 设置是否核心 + course.setImportant(coursemMap.get("是否核心").equals("是") ? 1 : 0); + + // 设置课程编号 + course.setNumber((String) coursemMap.get("课程编号")); + + // 设置课程学时 + course.setPeriod(Double.valueOf((String) coursemMap.get("课程学时"))); + + // 设置理论学时 + course.setTheoretical(Double.valueOf((String) coursemMap + .get("理论学时"))); + // 设置实验学时 + + course.setExperiment(Double.valueOf((String) coursemMap.get("实验学时"))); + + // 学时单位 + course.setUnit((String) coursemMap.get("实验学时")); + + // 设置课程选修 + + course.setSelected((String) coursemMap.get("课程选修")); + + // 设置授课类型 + + course.setMethod((String) coursemMap.get("授课类型")); + // 设置授课方式 + course.setClassroom((String) coursemMap.get("授课方式")); + // 设置开始时间 + + course.setStart(Integer.valueOf((String) coursemMap.get("开始时间"))); + + // 设置结束时间 + course.setEnd(Integer.valueOf((String) coursemMap.get("结束时间"))); + // 设置课程备注 + course.setNote((String) coursemMap.get("课程备注")); + + int insert = courseService.insert(course); + + System.out.println("插入成功!"); + + } + + } + + /** + * 接受来自Excel的每一个map,封装成CourseTo对象 + *

Title: courseMapToObj

+ *

Description:

+ * @param coursemMap + * @return + */ + public Course courseMapToObj(Map coursemMap){ + Course course = new Course(); + Specialty specialty = specialtyService.queryByPrimaryKey(speciatyids + .get(0));// 一个教研主任只负责一个专业的增删改,默认取用户拥有权限的第一个专业id + + // 如果添加课程的专业与用户权限不符,导入失败抛出异常 + String nameFromEx = (String) coursemMap.get("专业名称"); + String nameFromDb = specialty.getName(); + if (!nameFromEx.equals(nameFromDb)) { + throw new RuntimeException("只能为" + specialty.getName() + "添加课程!"); + } else { + // 设置专业Id + course.setSpecialtyId(speciatyids.get(0)); + + // 设置课程性质Id + Property property = propertyService.queryPropertyByName(String + .valueOf(coursemMap.get("课程性质"))); + if (property != null) { + + course.setPropertyId(property.getId()); + } + // 设置课程名称 + course.setName(String.valueOf(coursemMap.get("课程名称"))); + + // 设置课程学分 + course.setCredits(Double.valueOf((String) coursemMap.get("课程学分"))); + + // 设置是否核心 + course.setImportant(coursemMap.get("是否核心").equals("是") ? 1 : 0); + + // 设置课程编号 + course.setNumber((String) coursemMap.get("课程编号")); + + // 设置课程学时 + course.setPeriod(Double.valueOf((String) coursemMap.get("课程学时"))); + + // 设置理论学时 + course.setTheoretical(Double.valueOf((String) coursemMap + .get("理论学时"))); + // 设置实验学时 + + course.setExperiment(Double.valueOf((String) coursemMap.get("实验学时"))); + + // 学时单位 + course.setUnit((String) coursemMap.get("实验学时")); + + // 设置课程选修 + + course.setSelected((String) coursemMap.get("课程选修")); + + // 设置授课类型 + + course.setMethod((String) coursemMap.get("授课类型")); + // 设置授课方式 + course.setClassroom((String) coursemMap.get("授课方式")); + // 设置开始时间 + + course.setStart(Integer.valueOf((String) coursemMap.get("开始时间"))); + + // 设置结束时间 + course.setEnd(Integer.valueOf((String) coursemMap.get("结束时间"))); + // 设置课程备注 + course.setNote((String) coursemMap.get("课程备注")); + + } + + + return course; + + } + /** + * 更新或覆盖一门课程! + *

Title: updateCourse

+ *

Description:

+ * @param id + * @param coursemMap + */ + private void updateCourse(Integer id, Map coursemMap) { + // TODO Auto-generated method stub + Course course = new Course(); + Specialty specialty = specialtyService.queryByPrimaryKey(speciatyids + .get(0));// 一个教研主任只负责一个专业的增删改,默认取用户拥有权限的第一个专业id + + // 如果添加课程的专业与用户权限不符,导入失败抛出异常 + String nameFromEx = (String) coursemMap.get("专业名称"); + String nameFromDb = specialty.getName(); + if (!nameFromEx.equals(nameFromDb)) { + throw new RuntimeException("只能为" + specialty.getName() + "添加课程!"); + } else { + // 设置专业Id + course.setSpecialtyId(speciatyids.get(0)); + + // 设置课程性质Id + Property property = propertyService.queryPropertyByName(String + .valueOf(coursemMap.get("课程性质"))); + if (property != null) { + + course.setPropertyId(property.getId()); + } + + // 设置课程名称 + course.setName(String.valueOf(coursemMap.get("课程名称"))); + + // 设置课程学分 + course.setCredits(Double.valueOf((String) coursemMap.get("课程学分"))); + + // 设置是否核心 + course.setImportant(coursemMap.get("是否核心").equals("是") ? 1 : 0); + + // 设置课程编号 + course.setNumber((String) coursemMap.get("课程编号")); + + // 设置课程学时 + course.setPeriod(Double.valueOf((String) coursemMap.get("课程学时"))); + + // 设置理论学时 + course.setTheoretical(Double.valueOf((String) coursemMap + .get("理论学时"))); + // 设置实验学时 + + course.setExperiment(Double.valueOf((String) coursemMap.get("实验学时"))); + + // 学时单位 + course.setUnit((String) coursemMap.get("实验学时")); + + // 设置课程选修 + + course.setSelected((String) coursemMap.get("课程选修")); + + // 设置授课类型 + + course.setMethod((String) coursemMap.get("授课类型")); + // 设置授课方式 + course.setClassroom((String) coursemMap.get("授课方式")); + // 设置开始时间 + + course.setStart(Integer.valueOf((String) coursemMap.get("开始时间"))); + + // 设置结束时间 + course.setEnd(Integer.valueOf((String) coursemMap.get("结束时间"))); + // 设置课程备注 + course.setNote((String) coursemMap.get("课程备注")); + + // 设置couseId + course.setId(id); + + int update = courseService.update(course); + System.out.println("修改成功!"); + + } + + } } diff --git a/src/cn/edu/hit/education/dao/PropertyMapper.java b/src/cn/edu/hit/education/dao/PropertyMapper.java index 6845e06..adcf550 100644 --- a/src/cn/edu/hit/education/dao/PropertyMapper.java +++ b/src/cn/edu/hit/education/dao/PropertyMapper.java @@ -2,8 +2,11 @@ package cn.edu.hit.education.dao; import cn.edu.hit.education.pojo.Property; import cn.edu.hit.education.pojo.PropertyExample; + import java.util.List; + import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; public interface PropertyMapper { /** @@ -93,4 +96,7 @@ public interface PropertyMapper { * @mbggenerated Tue Apr 27 10:55:58 CST 2021 */ int updateByPrimaryKey(Property record); + + @Select("select * from property where name=#{name}") + Property queryPropertyByName(String name); } \ No newline at end of file diff --git a/src/cn/edu/hit/education/pojo/Course.java b/src/cn/edu/hit/education/pojo/Course.java index 9089329..d9e038d 100644 --- a/src/cn/edu/hit/education/pojo/Course.java +++ b/src/cn/edu/hit/education/pojo/Course.java @@ -554,4 +554,34 @@ public class Course implements Serializable { public void setNote(String note) { this.note = note == null ? null : note.trim(); } + + @Override + public boolean equals(Object courseFroEx) { + if(courseFroEx instanceof Course){ + Course course = (Course)courseFroEx; + if(course.getSpecialtyId() == this.getSpecialtyId() && + course.getPropertyId() == this.getPropertyId()&& + course.getName().equals(this.getName())&& + course.getCredits().equals(this.getCredits())&& + course.getImportant() == this.getImportant()&& + course.getNumber().equals(this.getNumber())&& + course.getPeriod().equals(this.getPeriod()) && + course.getTheoretical().equals(this.getTheoretical()) && + course.getUnit().equals(this.getUnit()) && + course.getSelected().equals(this.getSelected()) && + course.getMethod().equals(this.getMethod()) && + course.getClassroom().equals(this.getClassroom()) && + course.getStart() == this.getStart() && + course.getEnd() == this.getEnd() && + course.getNote().equals(this.getNote())){ + + return true; + } + } + + + return false; + + } + } \ No newline at end of file diff --git a/src/cn/edu/hit/education/service/CourseServiceImpl.java b/src/cn/edu/hit/education/service/CourseServiceImpl.java index 7dbba77..770fe4e 100644 --- a/src/cn/edu/hit/education/service/CourseServiceImpl.java +++ b/src/cn/edu/hit/education/service/CourseServiceImpl.java @@ -181,4 +181,12 @@ public class CourseServiceImpl implements ICourseService { return courseMapper.selectByPrimaryKey(id); } + @Override + public List queryAllCourseBySpecityId(List ids) { + CourseExample example = new CourseExample(); + CourseExample.Criteria criteria = example.createCriteria(); + criteria.andSpecialtyIdIn(ids); + return courseMapper.selectByExample(example); + } + } diff --git a/src/cn/edu/hit/education/service/ICourseService.java b/src/cn/edu/hit/education/service/ICourseService.java index ffbfafb..07e936b 100644 --- a/src/cn/edu/hit/education/service/ICourseService.java +++ b/src/cn/edu/hit/education/service/ICourseService.java @@ -1,18 +1,18 @@ /** -*

title ICouserService.java

-*

package cn.edu.hit.education.service

-*

description TODO

-*

copyright ҵѧ(C) 2019

-*

company ҵѧAS&MT

-*

author ѩ jinxuesong@163.com

-*

date 2021421 3:00:15

-*

version v1.0

+*

title �� ICouserService.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����3:00:15

+*

version �� v1.0

* * Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- -* 2021421 ѩ 1.0 1.0 -* Why & What is modified: <޸ԭ> +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> */ package cn.edu.hit.education.service; @@ -22,10 +22,10 @@ import java.util.Set; import cn.edu.hit.education.pojo.Course; /** - *

classname ICouserService

- *

description TODO

- *

author ѩ jinxuesong@163.com

- *

date 2021421 3:00:15

+ *

classname �� ICouserService

+ *

description ��TODO

+ *

author �� ��ѩ�� jinxuesong@163.com

+ *

date �� 2021��4��21�� ����3:00:15

*/ public interface ICourseService { @@ -44,4 +44,7 @@ public interface ICourseService { List queryCoursesBySpecialtyPropertyId(int specialtyId, int propertyId); List queryCoursesByIds(Set ids); + + List queryAllCourseBySpecityId(List ids); + } diff --git a/src/cn/edu/hit/education/service/IPropertyService.java b/src/cn/edu/hit/education/service/IPropertyService.java index 9fc0696..11706d0 100644 --- a/src/cn/edu/hit/education/service/IPropertyService.java +++ b/src/cn/edu/hit/education/service/IPropertyService.java @@ -1,18 +1,18 @@ /** -*

title IPropertyService.java

-*

package cn.edu.hit.education.service

-*

description TODO

-*

copyright ҵѧ(C) 2019

-*

company ҵѧAS&MT

-*

author ѩ jinxuesong@163.com

-*

date 2021421 4:22:14

-*

version v1.0

+*

title �� IPropertyService.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����4:22:14

+*

version �� v1.0

* * Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- -* 2021421 ѩ 1.0 1.0 -* Why & What is modified: <޸ԭ> +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> */ package cn.edu.hit.education.service; @@ -21,10 +21,10 @@ import java.util.List; import cn.edu.hit.education.pojo.Property; /** - *

classname IPropertyService

- *

description TODO

- *

author ѩ jinxuesong@163.com

- *

date 2021421 4:22:14

+ *

classname �� IPropertyService

+ *

description ��TODO

+ *

author �� ��ѩ�� jinxuesong@163.com

+ *

date �� 2021��4��21�� ����4:22:14

*/ public interface IPropertyService { @@ -41,4 +41,7 @@ public interface IPropertyService { List queryPropertiesByProcessId(int processId); void clearPropertyNum(); + + Property queryPropertyByName(String name); + } diff --git a/src/cn/edu/hit/education/service/PropertyServiceImpl.java b/src/cn/edu/hit/education/service/PropertyServiceImpl.java index 1b5ae0d..f1bf243 100644 --- a/src/cn/edu/hit/education/service/PropertyServiceImpl.java +++ b/src/cn/edu/hit/education/service/PropertyServiceImpl.java @@ -1,18 +1,18 @@ /** -*

title PropertyServiceImpl.java

-*

package cn.edu.hit.education.service

-*

description TODO

-*

copyright ҵѧ(C) 2019

-*

company ҵѧAS&MT

-*

author ѩ jinxuesong@163.com

-*

date 2021421 4:39:13

-*

version v1.0

+*

title �� PropertyServiceImpl.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����4:39:13

+*

version �� v1.0

* * Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- -* 2021421 ѩ 1.0 1.0 -* Why & What is modified: <޸ԭ> +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> */ package cn.edu.hit.education.service; @@ -24,12 +24,13 @@ import org.springframework.stereotype.Service; import cn.edu.hit.education.dao.PropertyMapper; import cn.edu.hit.education.pojo.Property; import cn.edu.hit.education.pojo.PropertyExample; +import cn.edu.hit.education.pojo.PropertyExample.Criteria; /** - *

classname PropertyServiceImpl

- *

description TODO

- *

author ѩ jinxuesong@163.com

- *

date 2021421 4:39:13

+ *

classname �� PropertyServiceImpl

+ *

description ��TODO

+ *

author �� ��ѩ�� jinxuesong@163.com

+ *

date �� 2021��4��21�� ����4:39:13

*/ @Service public class PropertyServiceImpl implements IPropertyService { @@ -39,25 +40,25 @@ public class PropertyServiceImpl implements IPropertyService { @Override public int insert(Property property) { - // TODO Զɵķ + // TODO �Զ����ɵķ������ return propertyMapper.insert(property); } @Override public int deleteByPrimaryKey(int id) { - // TODO Զɵķ + // TODO �Զ����ɵķ������ return propertyMapper.deleteByPrimaryKey(id); } @Override public int update(Property property) { - // TODO Զɵķ + // TODO �Զ����ɵķ������ return propertyMapper.updateByPrimaryKey(property); } @Override public List queryAllProperty() { - // TODO Զɵķ + // TODO �Զ����ɵķ������ PropertyExample example = new PropertyExample(); PropertyExample.Criteria criteria = example.createCriteria(); criteria.andIdGreaterThan(0); @@ -67,7 +68,7 @@ public class PropertyServiceImpl implements IPropertyService { @Override public List queryPropertiesByProcessId(int processId) { - // TODO Զɵķ + // TODO �Զ����ɵķ������ PropertyExample example = new PropertyExample(); PropertyExample.Criteria criteria = example.createCriteria(); criteria.andProcessIdEqualTo(processId); @@ -77,7 +78,7 @@ public class PropertyServiceImpl implements IPropertyService { @Override public void clearPropertyNum() { - // TODO Զɵķ + // TODO �Զ����ɵķ������ List properties = queryAllProperty(); if(properties != null && properties.size() > 0){ for (Property property : properties) { @@ -90,8 +91,14 @@ public class PropertyServiceImpl implements IPropertyService { @Override public Property queryPropertyById(int id) { - // TODO Զɵķ + // TODO �Զ����ɵķ������ return propertyMapper.selectByPrimaryKey(id); } + @Override + public Property queryPropertyByName(String name) { + + return propertyMapper.queryPropertyByName(name); + } + } diff --git a/src/cn/edu/hit/education/utils/ExcelUtil.java b/src/cn/edu/hit/education/utils/ExcelUtil.java new file mode 100644 index 0000000..c0a50cf --- /dev/null +++ b/src/cn/edu/hit/education/utils/ExcelUtil.java @@ -0,0 +1,312 @@ +package cn.edu.hit.education.utils; + + + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.xssf.usermodel.*; + +import java.io.*; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @program: Demo + * @Date: 2019/2/19 10:50 + * @Author: LiJc + * @Description: + */ +public class ExcelUtil { + + public boolean writeExcel(List> list, String path) throws Exception { + String postfix = path.substring(path.lastIndexOf(".") + 1, path.length()); + if (postfix.equals("xls")) { + writeXls(list, path); + } else if (postfix.equals("xlsx")) { + writeXlsx(list, path); + }else { + System.out.println("文件后缀名不正确!"); + return false; + } + return true; + } + + /** + * read the Excel file + * + * @param path + * the path of the Excel file + * @return + * @throws IOException + */ + public List> readExcel(String path) throws IOException { + String postfix = path.substring(path.lastIndexOf(".") + 1, path.length()); + if (postfix.equals("xls")) { + return readXls(path); + } else if (postfix.equals("xlsx")) { + return readXlsx(path); + } + return null; + } + + /** + * Read the Excel 2010 + * + * @param path + * the path of the excel file + * @return + * @throws IOException + */ + public List> readXlsx(String path) throws IOException { + + InputStream is = new FileInputStream(path); + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is); + List> list = new ArrayList>(); + // Read the Sheet + for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) { + XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet); + if (xssfSheet == null) { + continue; + } + // Read the Row + for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) { + XSSFRow xssfRow = xssfSheet.getRow(rowNum); + if (xssfRow != null) { + Map map = new HashMap<>(); + for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) { + if(xssfSheet.getRow(0).getCell(cellNum)==null||xssfRow.getCell(cellNum)==null) + continue; + map.put(xssfSheet.getRow(0).getCell(cellNum) + "", getValue(xssfRow.getCell(cellNum))); + } + list.add(map); + } + } + } + xssfWorkbook.close(); + is.close(); + return list; + } + + /** + * Read the Excel 2003-2007 + * + * @param path + * the path of the Excel + * @return + * @throws IOException + */ + public List> readXls(String path) throws IOException { + InputStream is = new FileInputStream(path); + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is); + List> list = new ArrayList>(); + // Read the Sheet + for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) { + HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet); + if (hssfSheet == null) { + continue; + } + // Read the Row + for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) { + HSSFRow hssfRow = hssfSheet.getRow(rowNum); + if (hssfRow != null) { + Map map = new HashMap<>(); + for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) { + if(hssfSheet.getRow(0).getCell(cellNum)==null) + continue; + map.put(hssfSheet.getRow(0).getCell(cellNum) + "", getValue(hssfRow.getCell(cellNum))); + } + list.add(map); + } + } + } + hssfWorkbook.close(); + is.close(); + return list; + } + + + @SuppressWarnings({ "static-access", "deprecation" }) + private String getValue(XSSFCell xssfRow) { + if (xssfRow == null) { + return ""; + } else if (xssfRow.getCellType() == CellType.BOOLEAN) { + return String.valueOf(xssfRow.getBooleanCellValue()).trim(); + } else if (xssfRow.getCellType() == CellType.NUMERIC) { + HSSFDataFormatter dataFormatter = new HSSFDataFormatter(); + return String.valueOf(dataFormatter.formatCellValue(xssfRow)).trim(); + // return String.valueOf(xssfRow.getNumericCellValue()).trim(); + } else { + return String.valueOf(xssfRow.getStringCellValue()).trim(); + } + } + + @SuppressWarnings({ "static-access", "deprecation" }) + private String getValue(HSSFCell hssfCell) { + if (hssfCell == null) { + return ""; + } else if (hssfCell.getCellType() == CellType.BOOLEAN) { + return String.valueOf(hssfCell.getBooleanCellValue()).trim(); + } else if (hssfCell.getCellType() == CellType.NUMERIC) { + HSSFDataFormatter dataFormatter = new HSSFDataFormatter(); + return String.valueOf(dataFormatter.formatCellValue(hssfCell)).trim(); + // return String.valueOf(hssfCell.getNumericCellValue()).trim(); + } else { + return String.valueOf(hssfCell.getStringCellValue()).trim(); + } + } + + public void writeXls(List> list, String path) throws Exception { + if (list == null) { + return; + } + int countColumnNum = list.size(); + HSSFWorkbook book = new HSSFWorkbook(); + // 设置样式start + HSSFCellStyle cellStyle = setStyleXls(book); + // 设置样式end + HSSFSheet sheet = book.createSheet("sheet"); + // option at first row. + HSSFRow firstRow = sheet.createRow(0); + + // Set-->数组 + String[] options = new String[list.get(0).keySet().size()]; + list.get(0).keySet().toArray(options); + + for (int j = 0; j < options.length; j++) { + HSSFCell cell = firstRow.createCell(j); + cell.setCellStyle(cellStyle); + cell.setCellValue(new HSSFRichTextString(options[j])); + } + + for (int i = 0; i < countColumnNum; i++) { + HSSFRow row = sheet.createRow(i + 1); + Map map = list.get(i); + for (int column = 0; column < options.length; column++) { + HSSFCell cell = row.createCell(column); + cell.setCellStyle(cellStyle); + cell.setCellValue((map.get(options[column])==null?"":map.get(options[column])) + ""); + } + } + File file = new File(path); + FileUtils.forceMkdir(file.getParentFile()); + OutputStream os = new FileOutputStream(file); + book.write(os); + os.close(); + } + + public void writeXlsx(List> list, String path) throws Exception { + if (list == null) { + return; + } + // XSSFWorkbook + int countColumnNum = list.size(); + XSSFWorkbook book = new XSSFWorkbook(); + XSSFCellStyle cellStyle = setStyleXlsx(book); + XSSFSheet sheet = book.createSheet("studentSheet"); + + // option at first row. + XSSFRow firstRow = sheet.createRow(0); + // Set-->数组 + String[] options = new String[list.get(0).keySet().size()]; + list.get(0).keySet().toArray(options); + for (int j = 0; j < options.length; j++) { + XSSFCell cell = firstRow.createCell(j); + cell.setCellStyle(cellStyle); + cell.setCellValue(new XSSFRichTextString(options[j])); + } + for (int i = 0; i < countColumnNum; i++) { + XSSFRow row = sheet.createRow(i + 1); + Map map = list.get(i); + for (int column = 0; column < options.length; column++) { + XSSFCell cell = row.createCell(column); + cell.setCellStyle(cellStyle); + cell.setCellValue((map.get(options[column])==null?"":map.get(options[column])) + ""); + } + } + File file = new File(path); + FileUtils.forceMkdir(file.getParentFile()); + OutputStream os = new FileOutputStream(file); + book.write(os); + os.close(); + } + + /** + * 设置样式 + * @param book + * @return + */ + public HSSFCellStyle setStyleXls(HSSFWorkbook book){ + HSSFCellStyle cellStyle = book.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER);// 居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直 + cellStyle.setBorderBottom(BorderStyle.THIN);//下边框 + cellStyle.setBorderLeft(BorderStyle.THIN);//左边框 + cellStyle.setBorderTop(BorderStyle.THIN);//上边框 + cellStyle.setBorderRight(BorderStyle.THIN);//右边框 + return cellStyle; + } + + /** + * 设置样式 + * @param book + * @return + */ + public XSSFCellStyle setStyleXlsx(XSSFWorkbook book){ + XSSFCellStyle cellStyle = book.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER);// 居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直 + cellStyle.setBorderBottom(BorderStyle.THIN);//下边框 + cellStyle.setBorderLeft(BorderStyle.THIN);//左边框 + cellStyle.setBorderTop(BorderStyle.THIN);//上边框 + cellStyle.setBorderRight(BorderStyle.THIN);//右边框 + return cellStyle; + } + + /** + * 返回文件绝对路径 + * + * @param subPath + * @param fileName + * @return + */ + public String getSavePath(String subPath, String fileName) { + + // 处理子路径 + if (!StringUtils.isBlank(subPath)) { + subPath += "/"; + } else { + subPath = ""; + } + + // 处理日期路径 + Date date = new Date(); + SimpleDateFormat yyyyFt = new SimpleDateFormat("yyyy"); + SimpleDateFormat MMFt = new SimpleDateFormat("MM"); + SimpleDateFormat ddFt = new SimpleDateFormat("dd"); + SimpleDateFormat HHFt = new SimpleDateFormat("HH"); + String datePath = MessageFormat.format("{0}/{1}/{2}/{3}/", yyyyFt.format(date), MMFt.format(date), ddFt.format(date), + HHFt.format(date)); + + return "/" + subPath + datePath + getNewFileName(fileName); + } + + /** + * 构建新文件名称 + * + * @param fileName + * @return + */ + public String getNewFileName(String fileName) { + String[] names = fileName.split("[\\.]"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmSS"); + String dateString = sdf.format(new Date()); + return names[0] + "-" + dateString + "." + names[1]; + } +} + -- Gitee