BaseClassCourseServiceImpl.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. package com.xjrsoft.module.base.service.impl;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.support.ExcelTypeEnum;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.github.yulichang.base.MPJBaseServiceImpl;
  8. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  9. import com.xjrsoft.common.enums.ArchivesStatusEnum;
  10. import com.xjrsoft.common.enums.DeleteMark;
  11. import com.xjrsoft.common.enums.UseSemesterTypeEnum;
  12. import com.xjrsoft.common.exception.MyException;
  13. import com.xjrsoft.common.utils.VoToColumnUtil;
  14. import com.xjrsoft.module.base.dto.BaseClassCoursePageDto;
  15. import com.xjrsoft.module.base.dto.ClassCourseReuseDto;
  16. import com.xjrsoft.module.base.entity.*;
  17. import com.xjrsoft.module.base.mapper.BaseClassCourseMapper;
  18. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  19. import com.xjrsoft.module.base.service.IBaseClassCourseService;
  20. import com.xjrsoft.module.base.vo.BaseClassCourseExportListVo;
  21. import com.xjrsoft.module.base.vo.BaseClassCoursePageVo;
  22. import com.xjrsoft.module.generator.entity.ImportConfig;
  23. import com.xjrsoft.module.organization.entity.Department;
  24. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  25. import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
  26. import com.xjrsoft.module.base.dto.ClassCourseTextbookExportQueryDto;
  27. import com.xjrsoft.module.base.vo.ClassCourseTextbookExportQueryVo;
  28. import com.xjrsoft.module.system.entity.DictionaryDetail;
  29. import com.xjrsoft.module.textbook.entity.Textbook;
  30. import com.xjrsoft.module.textbook.entity.TextbookStudentClaim;
  31. import com.xjrsoft.module.textbook.mapper.TextbookStudentClaimMapper;
  32. import lombok.AllArgsConstructor;
  33. import org.apache.commons.lang3.ObjectUtils;
  34. import org.apache.commons.lang3.StringUtils;
  35. import org.apache.poi.ss.usermodel.*;
  36. import org.apache.poi.ss.util.CellRangeAddress;
  37. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  38. import org.springframework.stereotype.Service;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import java.io.ByteArrayOutputStream;
  41. import java.io.IOException;
  42. import java.math.BigDecimal;
  43. import java.util.*;
  44. import java.util.stream.Collectors;
  45. import static com.xjrsoft.module.veb.util.ImportExcelUtil.allFields;
  46. import static com.xjrsoft.module.veb.util.ImportExcelUtil.createHead;
  47. /**
  48. * @title: 班级课程
  49. * @Author brealinxx
  50. * @Date: 2024-06-04
  51. * @Version 1.0
  52. */
  53. @Service
  54. @AllArgsConstructor
  55. public class BaseClassCourseServiceImpl extends MPJBaseServiceImpl<BaseClassCourseMapper, BaseClassCourse> implements IBaseClassCourseService {
  56. private final BaseClassCourseMapper baseClassCourseMapper;
  57. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  58. private final TextbookStudentClaimMapper textbookStudentClaimMapper;
  59. private final BaseClassMapper baseClassMapper;
  60. @Override
  61. public Page<BaseClassCoursePageVo> getPage(Page<BaseClassCoursePageVo> page, BaseClassCoursePageDto dto) {
  62. return baseClassCourseMapper.getPage(page, dto);
  63. }
  64. @Override
  65. public List<CourseBookInfo> getAllCourseBook(Long[] classIds, Long subjectGroupId, Long semester){
  66. return baseClassCourseMapper.getAllCourseBook(classIds, subjectGroupId, semester);
  67. }
  68. @Override
  69. public List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId, Long semester){
  70. return baseClassCourseMapper.getSelectedCourseBook(subjectGroupId, semester);
  71. }
  72. @Override
  73. @Transactional
  74. public Boolean updateAddCourseBook(ClassCourseTextbook dto){
  75. if (dto.getClassIds() == null || dto.getClassIds().length == 0 || dto.getBaseSemesterId() == null || dto.getBaseSemesterId() == 0) {
  76. return false;
  77. }
  78. boolean isSuccess = false;
  79. // 根据班级id查出班级已经存在的课程和教程
  80. List<Long> classIdList = Arrays.asList(dto.getClassIds());
  81. LambdaQueryWrapper<BaseClassCourse> baseClassCourseLambdaQueryWrapper = new LambdaQueryWrapper<>();
  82. baseClassCourseLambdaQueryWrapper
  83. .in(BaseClassCourse::getClassId, classIdList)
  84. .eq(BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
  85. .eq(BaseClassCourse::getDeleteMark, DeleteMark.NODELETE.getCode())
  86. ;
  87. List<BaseClassCourse> oldList = this.list(baseClassCourseLambdaQueryWrapper);
  88. // 使用Stream API和Lambda表达式生成所需的字符串列表
  89. Map<Long, List<String>> tourseId_textbookIdMap = oldList.stream()
  90. .collect(Collectors.groupingBy(
  91. BaseClassCourse::getClassId,
  92. Collectors.mapping(
  93. course -> course.getCourseId() + "_" + course.getTextbookId(),
  94. Collectors.toList()
  95. )
  96. ));
  97. // //删除班级的这学期的所有课程教材
  98. // LambdaQueryWrapper<BaseClassCourse> baseClassCourseLambdaQueryWrapper = new LambdaQueryWrapper<>();
  99. // baseClassCourseLambdaQueryWrapper
  100. // .in(BaseClassCourse::getClassId, classIdList)
  101. // .eq(BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
  102. // ;
  103. // isSuccess = this.remove(baseClassCourseLambdaQueryWrapper);
  104. // // 获取所有班级的所有学生
  105. // LambdaQueryWrapper<BaseStudentSchoolRoll> baseStudentSchoolRollLambdaQueryWrapper = new LambdaQueryWrapper<>();
  106. // baseStudentSchoolRollLambdaQueryWrapper
  107. // .in(BaseStudentSchoolRoll::getClassId, classIdList)
  108. // .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
  109. // ;
  110. // List<BaseStudentSchoolRoll> baseStudentSchoolRolls = baseStudentSchoolRollMapper.selectList(baseStudentSchoolRollLambdaQueryWrapper);
  111. //
  112. // Map<Long, List<Long>> userIdsMap = baseStudentSchoolRolls.stream()
  113. // .filter(student -> student.getClassId() != null && student.getUserId() != null)
  114. // .collect(Collectors.groupingBy(
  115. // BaseStudentSchoolRoll::getClassId, // 根据classId分组
  116. // Collectors.mapping(BaseStudentSchoolRoll::getUserId, // 提取userId
  117. // Collectors.toList()) // 收集到List<Long>
  118. // )
  119. // );
  120. List<BaseClassCourse> baseClassCourseList = new ArrayList<>();
  121. // List<TextbookStudentClaim> textbookStudentClaimList = new ArrayList<>();
  122. for (Long classId : dto.getClassIds()) {
  123. // 判断当前的班级是否已经有了该课程和教材
  124. List<String> tourseId_textbookIdList = tourseId_textbookIdMap.get(classId);
  125. for (String id : dto.getIds()) {
  126. if(tourseId_textbookIdList.contains(id)){
  127. continue;
  128. }
  129. String[] idArr = id.split("_");
  130. if (idArr[0].equals("") || idArr[1].equals("")) {
  131. continue;
  132. }
  133. Long courseId = Long.parseLong(idArr[0]);
  134. Long textbookId = Long.parseLong(idArr[1]);
  135. baseClassCourseList.add(new BaseClassCourse() {{
  136. setBaseSemesterId(dto.getBaseSemesterId());
  137. setClassId(classId);
  138. setCourseId(courseId);
  139. setTextbookId(textbookId);
  140. }});
  141. // // 添加学生领取教材数据
  142. // List<Long> userIds = userIdsMap.get(classId);
  143. // for (Long userId : userIds) {
  144. // textbookStudentClaimList.add(new TextbookStudentClaim() {{
  145. // setStudentUserId(userId);
  146. // setBaseSemesterId(dto.getBaseSemesterId());
  147. // setClassId(classId);
  148. // setTextbookId(textbookId);
  149. // }});
  150. // }
  151. }
  152. }
  153. // for (TextbookStudentClaim textbookStudentClaim : textbookStudentClaimList) {
  154. // textbookStudentClaimMapper.insert(textbookStudentClaim);
  155. // }
  156. return this.saveBatch(baseClassCourseList);
  157. }
  158. @Override
  159. public Boolean updateRemoveCourseBook(ClassCourseTextbook dto){
  160. // baseClassCourseMapper.updateRemoveClassCourseTextbooks(classId, courseId, textbookId);
  161. for (Long classId : dto.getClassIds()) {
  162. for (String id : dto.getIds()) {
  163. String[] idArr = id.split("_");
  164. if (idArr[0].equals("") || idArr[1].equals("")) {
  165. continue;
  166. }
  167. Long courseId = Long.parseLong(idArr[0]);
  168. Long textbookId = Long.parseLong(idArr[1]);
  169. LambdaUpdateWrapper<BaseClassCourse> baseClassCourseLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  170. baseClassCourseLambdaUpdateWrapper
  171. .eq(BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
  172. .eq(BaseClassCourse::getClassId, classId)
  173. .eq(BaseClassCourse::getCourseId, classId)
  174. .eq(BaseClassCourse::getTextbookId, textbookId)
  175. ;
  176. this.remove(baseClassCourseLambdaUpdateWrapper);
  177. }
  178. }
  179. return true;
  180. }
  181. @Override
  182. public void markExistingRecordsAsDeleted(Long newClassId, Long sourceClassId){
  183. baseClassCourseMapper.markExistingRecordsAsDeleted(newClassId, sourceClassId);
  184. }
  185. @Override
  186. @Transactional
  187. public Boolean duplicateCourseBook(ClassCourseReuseDto dto){
  188. LambdaQueryWrapper<BaseClassCourse> baseClassCourseLambdaQueryWrapper = new LambdaQueryWrapper<>();
  189. baseClassCourseLambdaQueryWrapper
  190. .eq(dto.getOldClassId() != null && dto.getOldClassId() > 0, BaseClassCourse::getClassId, dto.getOldClassId())
  191. .eq(dto.getOldBaseSemesterId() != null && dto.getOldBaseSemesterId() > 0, BaseClassCourse::getBaseSemesterId, dto.getOldBaseSemesterId())
  192. ;
  193. List<BaseClassCourse> baseClassCourseList = this.list(baseClassCourseLambdaQueryWrapper);
  194. if(baseClassCourseList == null || baseClassCourseList.isEmpty()){
  195. throw new MyException("该学期的该班级没有可以复用的课程!");
  196. }
  197. boolean isSuccess = false;
  198. //删除班级的所有课程教材
  199. LambdaQueryWrapper<BaseClassCourse> removeLambdaQueryWrapper = new LambdaQueryWrapper<>();
  200. removeLambdaQueryWrapper
  201. .in(BaseClassCourse::getClassId, dto.getNewClassIds())
  202. .eq(BaseClassCourse::getBaseSemesterId, dto.getNewBaseSemesterId())
  203. ;
  204. isSuccess = this.remove(removeLambdaQueryWrapper);
  205. List<BaseClassCourse> newBaseClassCourseList = new ArrayList<>();
  206. for (Long newClassId : dto.getNewClassIds()){
  207. for (BaseClassCourse baseClassCourse : baseClassCourseList){
  208. Long courseId = baseClassCourse.getCourseId();
  209. Long textbookId = baseClassCourse.getTextbookId();
  210. newBaseClassCourseList.add(new BaseClassCourse(){{
  211. setBaseSemesterId(dto.getNewBaseSemesterId());
  212. setClassId(newClassId);
  213. setCourseId(courseId);
  214. setTextbookId(textbookId);
  215. }});
  216. }
  217. }
  218. isSuccess = this.saveBatch(newBaseClassCourseList);
  219. return isSuccess;
  220. //baseClassCourseMapper.insertClassCourseTextbookCombinations(newClassId, sourceClassId, semester);
  221. }
  222. @Override
  223. public Map<String, Map<String, Object>> getSemesterTree() {
  224. List<Map<String, Object>> semesterData = baseClassCourseMapper.getAllSemesterNames();
  225. Map<String, Map<String, Object>> tree = new TreeMap<>();
  226. for (Map<String, Object> data : semesterData) {
  227. String name = (String) data.get("name");
  228. String[] parts = name.split("年");
  229. String year = parts[0]; // 年份
  230. String semesterType = parts[1].substring(0, parts[1].length() - 1); // 学期类型(春期/秋期)
  231. Long id = Long.parseLong(data.get("id").toString());
  232. if (!tree.containsKey(year + "年")) {
  233. tree.put(year + "年", new HashMap<>());
  234. }
  235. Map<String, Object> yearMap = tree.get(year + "年");
  236. if (semesterType.equals("春")) {
  237. yearMap.put("springName", name);
  238. yearMap.put("springId", id);
  239. } else if (semesterType.equals("秋")) {
  240. yearMap.put("autumnName", name);
  241. yearMap.put("autumnId", id);
  242. }
  243. }
  244. return tree;
  245. }
  246. @Override
  247. public Long GetClassIdByName(String name){
  248. return baseClassCourseMapper.getClassIdByName(name);
  249. }
  250. @Override
  251. public Long GetCourseIdByName(String name){
  252. return baseClassCourseMapper.getCourseIdByName(name);
  253. }
  254. @Override
  255. public Long GetTextbookIdByName(String name){
  256. return baseClassCourseMapper.getBookIdByName(name);
  257. }
  258. @Override
  259. public Long GetBaseSemesterIdByName(String name) {
  260. return baseClassCourseMapper.getBaseSemesterIdByName(name);
  261. }
  262. @Override
  263. public boolean checkExits(Long classId,Long courseId,Long textbookId){
  264. return baseClassCourseMapper.checkExits(classId, courseId, textbookId);
  265. }
  266. @Override
  267. public boolean checkExitsWithoutTextbook(Long classId, Long courseId) {
  268. return this.baseMapper.checkExitsWithoutTextbook(classId, courseId);
  269. }
  270. @Override
  271. public ByteArrayOutputStream classCourseTextbookExportQuery(ClassCourseTextbookExportQueryDto dto) throws IOException {
  272. MPJLambdaWrapper<BaseClass> baseClassCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
  273. baseClassCourseMPJLambdaWrapper
  274. .disableSubLogicDel()
  275. .selectAs(BaseSemester::getName, ClassCourseTextbookExportQueryVo::getSemester)
  276. .selectAs(Department::getName, ClassCourseTextbookExportQueryVo::getDeptName)
  277. .selectAs(BaseClass::getId, ClassCourseTextbookExportQueryVo::getClassId)
  278. .selectAs(BaseClass::getName, ClassCourseTextbookExportQueryVo::getClassName)
  279. .selectAs(BaseCourseSubject::getName, ClassCourseTextbookExportQueryVo::getCourseName)
  280. .selectAs(Textbook::getBookName, ClassCourseTextbookExportQueryVo::getTextbookName)
  281. .selectAs(Textbook::getUseType, ClassCourseTextbookExportQueryVo::getUseType)
  282. .selectAs(Textbook::getPrice, ClassCourseTextbookExportQueryVo::getPrice)
  283. .selectAs(Textbook::getDiscountPrice, ClassCourseTextbookExportQueryVo::getDiscountPrice)
  284. .leftJoin(BaseClassCourse.class, BaseClassCourse::getClassId, BaseClass::getId)
  285. .leftJoin(BaseSemester.class, BaseSemester::getId, BaseClassCourse::getBaseSemesterId)
  286. .leftJoin(BaseClass.class, BaseClass::getId, BaseClassCourse::getClassId)
  287. .leftJoin(Department.class, Department::getId, BaseClass::getOrgId)
  288. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, BaseClassCourse::getCourseId)
  289. .leftJoin(Textbook.class, Textbook::getId, BaseClassCourse::getTextbookId)
  290. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  291. wrapper -> wrapper
  292. .selectAs(DictionaryDetail::getName, ClassCourseTextbookExportQueryVo::getTextbookType)
  293. )
  294. .in(ObjectUtils.isNotEmpty(dto.getClassIds()) && !dto.getClassIds().isEmpty(), BaseClassCourse::getClassId, dto.getClassIds())
  295. .like(StringUtils.isNotBlank(dto.getClassName()), BaseClass::getName, dto.getClassName())
  296. .eq(ObjectUtils.isNotEmpty(dto.getDeptId()), Department::getId, dto.getDeptId())
  297. .having(ObjectUtils.isNotEmpty(dto.getCourseSet()) && dto.getCourseSet() == 1, "HAVING LENGTH(course_name) > 0")
  298. .having(ObjectUtils.isNotEmpty(dto.getCourseSet()) && dto.getCourseSet() == 2, "HAVING COALESCE(LENGTH(course_name), 0) = 0")
  299. .and(ObjectUtils.isNotEmpty(dto.getSemester()),
  300. wrapper -> wrapper
  301. .eq(BaseClassCourse::getBaseSemesterId, dto.getSemester())
  302. .or()
  303. .isNull(BaseClassCourse::getBaseSemesterId)
  304. )
  305. .and(wrapper -> wrapper
  306. .eq(BaseClassCourse::getDeleteMark, DeleteMark.NODELETE.getCode())
  307. .or()
  308. .isNull(BaseClassCourse::getDeleteMark)
  309. )
  310. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  311. .orderByDesc(BaseCourseSubject::getName)
  312. .orderByDesc(Textbook::getBookName)
  313. ;
  314. List<ClassCourseTextbookExportQueryVo> dataList = baseClassMapper.selectJoinList(ClassCourseTextbookExportQueryVo.class, baseClassCourseMPJLambdaWrapper);
  315. // 根据班级分组
  316. Map<Long, List<ClassCourseTextbookExportQueryVo>> dataMapByClassId = dataList.stream()
  317. .collect(Collectors.groupingBy(
  318. ClassCourseTextbookExportQueryVo::getClassId,
  319. LinkedHashMap::new, // 指定使用LinkedHashMap来保持顺序
  320. Collectors.toList()
  321. ));
  322. List<Long> classIds = dataList.stream()
  323. .filter(c -> ObjectUtils.isNotEmpty(c.getClassId()))
  324. .map(ClassCourseTextbookExportQueryVo::getClassId)
  325. .collect(Collectors.toList());
  326. if(classIds.isEmpty()){
  327. throw new MyException("导出数据中班级有误,请刷新重试");
  328. }
  329. // 获取班级人数
  330. MPJLambdaWrapper<BaseStudentSchoolRoll> baseStudentSchoolRollMPJLambdaWrapper = new MPJLambdaWrapper<>();
  331. baseStudentSchoolRollMPJLambdaWrapper
  332. .selectAs(BaseStudentSchoolRoll::getClassId, BaseStudentSchoolRoll::getClassId)
  333. .selectCount(BaseStudentSchoolRoll::getId, BaseStudentSchoolRoll::getDeleteMark)
  334. .in(BaseStudentSchoolRoll::getClassId, classIds)
  335. .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
  336. .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
  337. .groupBy(BaseStudentSchoolRoll::getClassId)
  338. ;
  339. List<BaseStudentSchoolRoll> baseStudentSchoolRolls = baseStudentSchoolRollMapper.selectJoinList(BaseStudentSchoolRoll.class, baseStudentSchoolRollMPJLambdaWrapper);
  340. Map<Long, Integer> stuNumMap = baseStudentSchoolRolls.stream()
  341. .collect(Collectors.toMap(BaseStudentSchoolRoll::getClassId, BaseStudentSchoolRoll::getDeleteMark, (k1,k2) -> k1));
  342. // 处理数据
  343. for (ClassCourseTextbookExportQueryVo c : dataList){
  344. // 处理使用学期
  345. if(ObjectUtils.isNotEmpty(c.getUseType())){
  346. String useType = UseSemesterTypeEnum.getValue(c.getUseType());
  347. c.setUseTypeCn(useType);
  348. }else {
  349. c.setUseTypeCn("未知");
  350. }
  351. // 处理班级人数
  352. Integer stuNum = stuNumMap.get(c.getClassId());
  353. if(ObjectUtils.isNotEmpty(stuNum)){
  354. c.setStudentNum(stuNum);
  355. // 处理总价
  356. if(ObjectUtils.isNotEmpty(c.getDiscountPrice())){
  357. BigDecimal totalPrices = c.getDiscountPrice().multiply(BigDecimal.valueOf(stuNum));
  358. c.setTotalPrices(totalPrices);
  359. }else {
  360. c.setTotalPrices(BigDecimal.ZERO);
  361. }
  362. }else {
  363. c.setStudentNum(0);
  364. }
  365. }
  366. // 开始写入
  367. Workbook workbook = new XSSFWorkbook();
  368. // 创建一个工作表(sheet)
  369. String sheetName = "sheet1";
  370. Sheet sheet = workbook.createSheet(sheetName);
  371. List<ImportConfig> importConfigs = allFields(new ClassCourseTextbookExportQueryVo());
  372. // 表头
  373. createHead(workbook, sheet, importConfigs, 0);
  374. // 内容
  375. int dataRowNumber = 1;
  376. Font font = workbook.createFont();
  377. font.setFontName("宋体");
  378. font.setFontHeightInPoints((short)12);
  379. CellStyle cellStyle = workbook.createCellStyle();
  380. cellStyle.setFont(font); // 将字体应用到样式
  381. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  382. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  383. for (Map.Entry<Long, List<ClassCourseTextbookExportQueryVo>> entry : dataMapByClassId.entrySet()){
  384. Long key = entry.getKey();
  385. List<ClassCourseTextbookExportQueryVo> value = entry.getValue();
  386. List<List<String>> inList = new ArrayList<>();
  387. // 小计合计
  388. BigDecimal totalDiscountPrice = BigDecimal.ZERO;
  389. for (ClassCourseTextbookExportQueryVo c : value){
  390. totalDiscountPrice = totalDiscountPrice.add(ObjectUtils.isNotEmpty(c.getDiscountPrice()) ? c.getDiscountPrice() : BigDecimal.ZERO);
  391. }
  392. for (ClassCourseTextbookExportQueryVo c : value){
  393. c.setTotalDiscountPrice(totalDiscountPrice);
  394. }
  395. // 总价合计
  396. BigDecimal totalPriceTotal = BigDecimal.ZERO;
  397. for (ClassCourseTextbookExportQueryVo c : value){
  398. totalPriceTotal = totalPriceTotal.add(ObjectUtils.isNotEmpty(c.getTotalPrices()) ? c.getTotalPrices() : BigDecimal.ZERO);
  399. }
  400. for (ClassCourseTextbookExportQueryVo c : value){
  401. c.setTotalPriceTotal(totalPriceTotal);
  402. }
  403. // 开始写入
  404. for (ClassCourseTextbookExportQueryVo c : value){
  405. List<String> date = new ArrayList<>();
  406. date.add(c.getSemester());
  407. date.add(c.getDeptName());
  408. date.add(c.getClassName());
  409. date.add(c.getCourseName());
  410. date.add(c.getTextbookName());
  411. date.add(c.getUseTypeCn());
  412. date.add(c.getTextbookType());
  413. date.add(ObjectUtils.isNotEmpty(c.getPrice()) ? c.getPrice().toString() : "0");
  414. date.add(ObjectUtils.isNotEmpty(c.getDiscountPrice()) ? c.getDiscountPrice().toString() : "0");
  415. date.add(ObjectUtils.isNotEmpty(c.getTotalDiscountPrice()) ? c.getTotalDiscountPrice().toString() : "0");
  416. date.add(c.getStudentNum() + "");
  417. date.add(ObjectUtils.isNotEmpty(c.getTotalPrices()) ? c.getTotalPrices().toString() : "0");
  418. date.add(ObjectUtils.isNotEmpty(c.getTotalPriceTotal()) ? c.getTotalPriceTotal().toString() : "0");
  419. inList.add(date);
  420. }
  421. for (List<String> rowData : inList) {
  422. Row dataRow = sheet.createRow(dataRowNumber);
  423. for (int i = 0; i < rowData.size(); i++) {
  424. sheet.autoSizeColumn(i);
  425. Cell cell = dataRow.createCell(i);
  426. cell.setCellValue(rowData.get(i));
  427. cell.setCellStyle(cellStyle);
  428. }
  429. dataRowNumber++;
  430. }
  431. if(inList.size() > 1){
  432. sheet.addMergedRegion(new CellRangeAddress(dataRowNumber - inList.size(), dataRowNumber - 1, 9, 9));
  433. sheet.addMergedRegion(new CellRangeAddress(dataRowNumber - inList.size(), dataRowNumber - 1, 10, 10));
  434. sheet.addMergedRegion(new CellRangeAddress(dataRowNumber - inList.size(), dataRowNumber - 1, 12, 12));
  435. }
  436. }
  437. //写入文件
  438. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  439. workbook.write(bot);
  440. return bot;
  441. }
  442. }