TextbookServiceImpl.java 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. package com.xjrsoft.module.textbook.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.alibaba.excel.EasyExcel;
  7. import com.alibaba.excel.ExcelWriter;
  8. import com.alibaba.excel.read.listener.PageReadListener;
  9. import com.alibaba.excel.support.ExcelTypeEnum;
  10. import com.alibaba.excel.write.metadata.WriteSheet;
  11. import com.alibaba.excel.write.metadata.WriteTable;
  12. import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  13. import com.alibaba.excel.write.metadata.style.WriteFont;
  14. import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
  15. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  16. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  17. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  18. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  19. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  20. import com.github.yulichang.base.MPJBaseServiceImpl;
  21. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  22. import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
  23. import com.xjrsoft.common.enums.TextbookTypeEnum;
  24. import com.xjrsoft.common.enums.UseSemesterTypeEnum;
  25. import com.xjrsoft.common.enums.WarehouseModeEnum;
  26. import com.xjrsoft.common.exception.MyException;
  27. import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
  28. import com.xjrsoft.common.utils.excel.ExcelMergeUtil;
  29. import com.xjrsoft.module.base.entity.BaseClass;
  30. import com.xjrsoft.module.base.entity.BaseCourseSubject;
  31. import com.xjrsoft.module.base.entity.BaseSemester;
  32. import com.xjrsoft.module.base.mapper.BaseCourseSubjectMapper;
  33. import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
  34. import com.xjrsoft.module.base.service.IBaseClassService;
  35. import com.xjrsoft.module.teacher.entity.XjrUser;
  36. import com.xjrsoft.module.textbook.dto.*;
  37. import com.xjrsoft.module.textbook.entity.*;
  38. import com.xjrsoft.module.textbook.mapper.*;
  39. import com.xjrsoft.module.textbook.service.ITextbookCoreAttributeService;
  40. import com.xjrsoft.module.textbook.service.ITextbookService;
  41. import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordService;
  42. import com.xjrsoft.module.textbook.service.IWfExerciseBookService;
  43. import com.xjrsoft.module.textbook.vo.*;
  44. import lombok.AllArgsConstructor;
  45. import org.apache.poi.ss.usermodel.BorderStyle;
  46. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  47. import org.apache.poi.ss.usermodel.VerticalAlignment;
  48. import org.springframework.beans.BeanUtils;
  49. import org.springframework.stereotype.Service;
  50. import org.springframework.transaction.annotation.Transactional;
  51. import java.io.ByteArrayOutputStream;
  52. import java.io.InputStream;
  53. import java.math.BigDecimal;
  54. import java.util.*;
  55. import java.util.stream.Collectors;
  56. /**
  57. * @title: 教材管理
  58. * @Author szs
  59. * @Date: 2023-12-25
  60. * @Version 1.0
  61. */
  62. @Service
  63. @AllArgsConstructor
  64. public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Textbook> implements ITextbookService {
  65. private final TextbookMapper textbookTextbookMapper;
  66. private final TextbookClassRelationMapper textbookTextbookClassRelationMapper;
  67. private final TextbookSubscriptionRecordMapper textbookTextbookSubscriptionRecordMapper;
  68. private final IWfExerciseBookService wfExerciseBookService;
  69. private final IBaseClassService baseClassService;
  70. private final ITextbookWarehouseRecordService textbookClassWarehouseService;
  71. private final TextbookIssueRecordMapper textbookIssueRecordMapper;
  72. private final TextbookStudentClaimMapper textbookStudentClaimMapper;
  73. private final SubjectGroupMapper subjectGroupMapper;
  74. private final BaseSemesterMapper baseSemesterMapper;
  75. private final BaseCourseSubjectMapper baseCourseSubjectMapper;
  76. private final ITextbookCoreAttributeService textbookCoreAttributeService;
  77. private final TextbookCoreAttributeMapper textbookCoreAttributeMapper;
  78. @Override
  79. @Transactional(rollbackFor = Exception.class)
  80. public Boolean add(Textbook textbook) {
  81. textbook.setCreateDate(new Date());
  82. TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
  83. BeanUtils.copyProperties(textbook, textbookCoreAttribute);
  84. textbookCoreAttributeMapper.insert(textbookCoreAttribute);
  85. textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
  86. textbook.setSubtotal(textbook.getPrice().multiply(BigDecimal.valueOf(textbook.getDiscount()/10)));
  87. textbookTextbookMapper.insert(textbook);
  88. for (TextbookClassRelation textbookClassRelation : textbook.getTextbookClassRelationList()) {
  89. textbookClassRelation.setTextbookId(textbook.getId());
  90. textbookClassRelation.setCreateDate(new Date());
  91. textbookTextbookClassRelationMapper.insert(textbookClassRelation);
  92. }
  93. if (textbook.getTextbookSubscriptionRecordList() != null) {
  94. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  95. textbookSubscriptionRecord.setTextbookId(textbook.getId());
  96. textbookSubscriptionRecord.setCreateDate(new Date());
  97. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  98. }
  99. }
  100. return true;
  101. }
  102. @Override
  103. @Transactional(rollbackFor = Exception.class)
  104. public Boolean update(Textbook textbook) {
  105. textbookTextbookMapper.updateById(textbook);
  106. //********************************* TextbookClassRelation 增删改 开始 *******************************************/
  107. {
  108. // 查出所有子级的id
  109. List<TextbookClassRelation> textbookClassRelationList = textbookTextbookClassRelationMapper.selectList(Wrappers.lambdaQuery(TextbookClassRelation.class).eq(TextbookClassRelation::getTextbookId, textbook.getId()).select(TextbookClassRelation::getId));
  110. List<Long> textbookClassRelationIds = textbookClassRelationList.stream().map(TextbookClassRelation::getId).collect(Collectors.toList());
  111. //原有子表单 没有被删除的主键
  112. List<Long> textbookClassRelationOldIds = textbook.getTextbookClassRelationList().stream().map(TextbookClassRelation::getId).filter(Objects::nonNull).collect(Collectors.toList());
  113. //找到需要删除的id
  114. List<Long> textbookClassRelationRemoveIds = textbookClassRelationIds.stream().filter(item -> !textbookClassRelationOldIds.contains(item)).collect(Collectors.toList());
  115. for (TextbookClassRelation textbookClassRelation : textbook.getTextbookClassRelationList()) {
  116. //如果不等于空则修改
  117. if (textbookClassRelation.getId() != null) {
  118. textbookTextbookClassRelationMapper.updateById(textbookClassRelation);
  119. }
  120. //如果等于空 则新增
  121. else {
  122. //已经不存在的id 删除
  123. textbookClassRelation.setTextbookId(textbook.getId());
  124. textbookTextbookClassRelationMapper.insert(textbookClassRelation);
  125. }
  126. }
  127. //已经不存在的id 删除
  128. if (textbookClassRelationRemoveIds.size() > 0) {
  129. textbookTextbookClassRelationMapper.deleteBatchIds(textbookClassRelationRemoveIds);
  130. }
  131. }
  132. //********************************* TextbookClassRelation 增删改 结束 *******************************************/
  133. //********************************* TextbookSubscriptionRecord 增删改 开始 *******************************************/
  134. {
  135. // 查出所有子级的id
  136. List<TextbookSubscriptionRecord> textbookSubscriptionRecordList = textbookTextbookSubscriptionRecordMapper.selectList(Wrappers.lambdaQuery(TextbookSubscriptionRecord.class).eq(TextbookSubscriptionRecord::getWfTextbookSubscriptionId, textbook.getId()).select(TextbookSubscriptionRecord::getId));
  137. List<Long> textbookSubscriptionRecordIds = textbookSubscriptionRecordList.stream().map(TextbookSubscriptionRecord::getId).collect(Collectors.toList());
  138. //原有子表单 没有被删除的主键
  139. if (!textbookSubscriptionRecordIds.isEmpty()) {
  140. List<Long> textbookSubscriptionRecordOldIds = textbook.getTextbookSubscriptionRecordList().stream().map(TextbookSubscriptionRecord::getId).filter(Objects::nonNull).collect(Collectors.toList());
  141. //找到需要删除的id
  142. List<Long> textbookSubscriptionRecordRemoveIds = textbookSubscriptionRecordIds.stream().filter(item -> !textbookSubscriptionRecordOldIds.contains(item)).collect(Collectors.toList());
  143. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  144. //如果不等于空则修改
  145. if (textbookSubscriptionRecord.getId() != null) {
  146. textbookTextbookSubscriptionRecordMapper.updateById(textbookSubscriptionRecord);
  147. }
  148. //如果等于空 则新增
  149. else {
  150. //已经不存在的id 删除
  151. textbookSubscriptionRecord.setWfTextbookSubscriptionId(textbook.getId());
  152. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  153. }
  154. }
  155. //已经不存在的id 删除
  156. if (textbookSubscriptionRecordRemoveIds.size() > 0) {
  157. textbookTextbookSubscriptionRecordMapper.deleteBatchIds(textbookSubscriptionRecordRemoveIds);
  158. }
  159. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  160. //如果不等于空则修改
  161. if (textbookSubscriptionRecord.getId() != null) {
  162. textbookTextbookSubscriptionRecordMapper.updateById(textbookSubscriptionRecord);
  163. }
  164. //如果等于空 则新增
  165. else {
  166. //已经不存在的id 删除
  167. textbookSubscriptionRecord.setWfTextbookSubscriptionId(textbook.getId());
  168. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  169. }
  170. }
  171. //已经不存在的id 删除
  172. if (textbookSubscriptionRecordRemoveIds.size() > 0) {
  173. textbookTextbookSubscriptionRecordMapper.deleteBatchIds(textbookSubscriptionRecordRemoveIds);
  174. }
  175. }
  176. //********************************* TextbookSubscriptionRecord 增删改 结束 *******************************************/
  177. return true;
  178. }
  179. }
  180. @Override
  181. @Transactional(rollbackFor = Exception.class)
  182. public Boolean delete(List<Long> ids) {
  183. textbookTextbookMapper.deleteBatchIds(ids);
  184. textbookTextbookClassRelationMapper.delete(Wrappers.lambdaQuery(TextbookClassRelation.class).in(TextbookClassRelation::getTextbookId, ids));
  185. textbookTextbookSubscriptionRecordMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionRecord.class).in(TextbookSubscriptionRecord::getWfTextbookSubscriptionId, ids));
  186. return true;
  187. }
  188. @Override
  189. public Page<TextbookPageVo> getPage(Page<TextbookPageDto> page, TextbookPageDto dto) {
  190. return textbookTextbookMapper.getPage(page, dto);
  191. }
  192. /* @Override
  193. @Transactional
  194. public Boolean dataHandleAddTextbookNode(Long dataId) {
  195. WfTextbookSubscription wfTextbookSubscription = iWfTextbookSubscriptionService.selectById(dataId);
  196. if (ObjectUtil.isNotNull(wfTextbookSubscription) && ObjectUtil.isNotNull(wfTextbookSubscription.getWfTextbookSubscriptionItemList()) && wfTextbookSubscription.getWfTextbookSubscriptionItemList().size() > 0) {
  197. //遍历征订项
  198. for (WfTextbookSubscriptionItem wfTextbookSubscriptionItem : wfTextbookSubscription.getWfTextbookSubscriptionItemList()) {
  199. Long semesterId = wfTextbookSubscription.getBaseSemesterId();
  200. String issn = wfTextbookSubscriptionItem.getIssn();
  201. LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
  202. queryWrapper
  203. .eq(Textbook::getIssn, issn)
  204. .eq(Textbook::getBaseSemesterId, semesterId);
  205. List<Textbook> textbookList = this.list(queryWrapper);
  206. //征订的教材没有在教材管理
  207. if (ObjectUtil.isNull(textbookList) || textbookList.size() == 0) {
  208. Textbook textbook = new Textbook() {{
  209. setIssn((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIssn()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIssn())) ? "/" : wfTextbookSubscriptionItem.getIssn());
  210. setIsbn((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIsbn()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIsbn())) ? "/" : wfTextbookSubscriptionItem.getIsbn());
  211. setBookName((ObjectUtil.isNull(wfTextbookSubscriptionItem.getBookName()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getBookName())) ? "/" : wfTextbookSubscriptionItem.getBookName());
  212. setPublishingHouse((ObjectUtil.isNull(wfTextbookSubscriptionItem.getPublishingHouse()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getPublishingHouse())) ? "/" : wfTextbookSubscriptionItem.getPublishingHouse());
  213. setEditorInChief((ObjectUtil.isNull(wfTextbookSubscriptionItem.getEditorInChief()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getEditorInChief())) ? "/" : wfTextbookSubscriptionItem.getEditorInChief());
  214. setSubjectGroupId((ObjectUtil.isNull(wfTextbookSubscription.getSubjectGroupId())) ? 0 : wfTextbookSubscription.getSubjectGroupId());
  215. setBaseSemesterId(wfTextbookSubscription.getBaseSemesterId());
  216. setCourseSubjectId((ObjectUtil.isNull(wfTextbookSubscriptionItem.getCourseSubjectId())) ? 0 : wfTextbookSubscriptionItem.getCourseSubjectId());
  217. setVersion((ObjectUtil.isNull(wfTextbookSubscriptionItem.getVersion()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getVersion())) ? "/" : wfTextbookSubscriptionItem.getVersion());
  218. setIsTextbookPlan((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIsTextbookPlan()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIsTextbookPlan())) ? "/" : wfTextbookSubscriptionItem.getIsTextbookPlan());
  219. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getSubscriptionType()) && wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.STextbook.getCode())) {
  220. setTextbookType(TextbookTypeEnum.TTextbook.getCode());
  221. }
  222. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getSubscriptionType()) && wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.SMaterials.getCode())) {
  223. setTextbookType(TextbookTypeEnum.TMaterials.getCode());
  224. }
  225. setSpecificationsModels("/");
  226. setAppraisalPrice((ObjectUtil.isNull(wfTextbookSubscriptionItem.getAppraisalPrice())) ? new BigDecimal(0) : wfTextbookSubscriptionItem.getAppraisalPrice());
  227. setPrice(new BigDecimal(0));
  228. setDiscount(10D);
  229. setSubtotal(new BigDecimal(0));
  230. setStock(0);
  231. }};
  232. //班级不为空
  233. List<Long> classIdList = new ArrayList<>();
  234. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
  235. //将班级ids转换为List
  236. String classIds = wfTextbookSubscriptionItem.getClassIds();
  237. String[] classIdStrs = classIds.split(",");
  238. for (String classIdStr : classIdStrs) {
  239. classIdList.add(Long.parseLong(classIdStr));
  240. }
  241. //查询年级,如果添加的班级只存在一个年级,添加年级字段值
  242. LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
  243. queryWrapper1
  244. .select(BaseClass::getGradeId)
  245. .in(BaseClass::getId, classIdList)
  246. .groupBy(BaseClass::getGradeId);
  247. List<BaseClass> baseClassList = baseClassService.list(queryWrapper1);
  248. if (ObjectUtil.isNotNull(baseClassList) && baseClassList.size() == 1) {
  249. textbook.setGradeId(baseClassList.get(0).getGradeId());
  250. }
  251. }
  252. //插入教材数据
  253. textbook.setCreateDate(new Date());
  254. textbookTextbookMapper.insert(textbook);
  255. //插入班级和教材关系
  256. for (Long classId : classIdList) {
  257. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  258. setCreateDate(new Date());
  259. setTextbookId(textbook.getId());
  260. setClassId(classId);
  261. }});
  262. }
  263. //添加教材征订记录
  264. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  265. setCreateDate(new Date());
  266. setTextbookId(textbook.getId());
  267. setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  268. setWfTextbookSubscriptionItemId(wfTextbookSubscriptionItem.getId());//该字段存入征订项的id,征订项中有所属征订记录
  269. }});
  270. } else {
  271. //征订的教材在教材管理,进行班级的和记录的管理
  272. Textbook textbook = textbookList.get(0);
  273. //班级不为空
  274. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
  275. //将班级ids转换为List
  276. String classIds = wfTextbookSubscriptionItem.getClassIds();
  277. String[] classIdStrs = classIds.split(",");
  278. for (String classIdStr : classIdStrs) {
  279. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  280. setCreateDate(new Date());
  281. setTextbookId(textbook.getId());
  282. setClassId(Long.parseLong(classIdStr));
  283. }});
  284. }
  285. }
  286. //添加教材征订记录
  287. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  288. setCreateDate(new Date());
  289. setTextbookId(textbook.getId());
  290. setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  291. setWfTextbookSubscriptionItemId(wfTextbookSubscriptionItem.getId());//该字段存入正定项的id,征订项中有所属征订记录
  292. }});
  293. }
  294. }
  295. }
  296. return true;
  297. }*/
  298. /**
  299. * 添加作业本规则
  300. *
  301. * @param dataId
  302. * @return
  303. */
  304. @Override
  305. @Transactional
  306. public Boolean dataHandleAddExerciseBookNode(Long dataId) {
  307. WfExerciseBook wfExerciseBook = wfExerciseBookService.selectById(dataId);
  308. if (ObjectUtil.isNotNull(wfExerciseBook) && ObjectUtil.isNotNull(wfExerciseBook.getWfExerciseBookItemList()) && wfExerciseBook.getWfExerciseBookItemList().size() > 0) {
  309. for (WfExerciseBookItem wfExerciseBookItem : wfExerciseBook.getWfExerciseBookItemList()) {
  310. Long semesterId = wfExerciseBook.getBaseSemesterId();
  311. String bookName = wfExerciseBookItem.getSubscriptionType();//作业本的选择类型对应教材管理的书名
  312. LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
  313. queryWrapper
  314. .eq(Textbook::getBookName, bookName)
  315. .eq(Textbook::getBaseSemesterId, semesterId);
  316. List<Textbook> textbookList = this.list(queryWrapper);
  317. //征订的作业本没有在教材管理
  318. if (ObjectUtil.isNull(textbookList) || textbookList.size() == 0) {
  319. Textbook textbook = new Textbook() {{
  320. setIssn("/");
  321. setIsbn("/");
  322. if (ObjectUtil.isNotNull(wfExerciseBookItem.getSubscriptionType()) && wfExerciseBookItem.getSubscriptionType().equals(ExerciseBookeTypeEnum.ExerciseBook1.getCode())) {
  323. setBookName(ExerciseBookeTypeEnum.ExerciseBook1.getValue());
  324. }
  325. if (ObjectUtil.isNotNull(wfExerciseBookItem.getSubscriptionType()) && wfExerciseBookItem.getSubscriptionType().equals(ExerciseBookeTypeEnum.ExerciseBook2.getCode())) {
  326. setBookName(ExerciseBookeTypeEnum.ExerciseBook2.getValue());
  327. }
  328. setPublishingHouse("/");
  329. setEditorInChief("/");
  330. setBaseSemesterId(wfExerciseBook.getBaseSemesterId());
  331. setVersion("/");
  332. setIsTextbookPlan("/");
  333. setTextbookType(TextbookTypeEnum.TExerciseBook.getCode());
  334. setSpecificationsModels((ObjectUtil.isNull(wfExerciseBookItem.getSpecificationsModels()) || StringUtils.isBlank(wfExerciseBookItem.getSpecificationsModels())) ? "/" : wfExerciseBookItem.getSpecificationsModels());
  335. //年级id
  336. if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0) {
  337. LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
  338. queryWrapper1
  339. .eq(BaseClass::getId, wfExerciseBook.getClassId());
  340. BaseClass baseClass = baseClassService.getOne(queryWrapper1);
  341. if (ObjectUtil.isNotNull(baseClass)) {
  342. setGradeId(baseClass.getGradeId());
  343. }
  344. }
  345. setAppraisalPrice((ObjectUtil.isNull(wfExerciseBookItem.getAppraisalPrice())) ? new BigDecimal(0) : wfExerciseBookItem.getAppraisalPrice());
  346. setPrice(new BigDecimal(0));
  347. setDiscount(10D);
  348. setSubtotal(new BigDecimal(0));
  349. setStock(0);
  350. }};
  351. //插入教材数据
  352. textbook.setCreateDate(new Date());
  353. textbookTextbookMapper.insert(textbook);
  354. //插入班级和教材关系
  355. if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0) {
  356. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  357. setCreateDate(new Date());
  358. setTextbookId(textbook.getId());
  359. setClassId(wfExerciseBook.getClassId());
  360. }});
  361. }
  362. //添加教材征订记录
  363. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  364. setCreateDate(new Date());
  365. setTextbookId(textbook.getId());
  366. setWfTextbookSubscriptionId(wfExerciseBook.getId());
  367. }});
  368. } else {
  369. //征订的教材在教材管理,进行班级的和记录的管理
  370. Textbook textbook = textbookList.get(0);
  371. //班级不为空
  372. if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0) {
  373. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  374. setCreateDate(new Date());
  375. setTextbookId(textbook.getId());
  376. setClassId(wfExerciseBook.getClassId());
  377. }});
  378. }
  379. //添加教材征订记录
  380. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  381. setCreateDate(new Date());
  382. setTextbookId(textbook.getId());
  383. setWfTextbookSubscriptionId(wfExerciseBook.getId());
  384. }});
  385. }
  386. }
  387. }
  388. return true;
  389. }
  390. @Override
  391. public List<TextbookSubscriptionRecordVo> subscriptionList(Long id) {
  392. Textbook textbook = this.getById(id);
  393. List<TextbookSubscriptionRecordVo> recordVos = new ArrayList<>();
  394. //是作业本
  395. if (textbook.getTextbookType().equals(TextbookTypeEnum.TExerciseBook.getCode())) {
  396. recordVos = textbookTextbookMapper.exerciseBookSubscriptionList(id);
  397. for (TextbookSubscriptionRecordVo recordVo : recordVos) {
  398. recordVo.setIssn("/");
  399. recordVo.setPublishingHouse("/");
  400. recordVo.setEditorInChief("/");
  401. recordVo.setIsTextbookPlanCn("/");
  402. recordVo.setCourseName("/");
  403. recordVo.setGradeName("/");
  404. recordVo.setTeacherSubscriptionNumber(0);
  405. recordVo.setTeacherReferenceNumber(0);
  406. }
  407. }
  408. //是教材或者教辅
  409. if (textbook.getTextbookType().equals(TextbookTypeEnum.TTextbook.getCode()) || textbook.getTextbookType().equals(TextbookTypeEnum.TMaterials.getCode())) {
  410. recordVos = textbookTextbookMapper.subscriptionList(id);
  411. for (TextbookSubscriptionRecordVo recordVo : recordVos) {
  412. if (ObjectUtil.isNull(recordVo) || StrUtil.isEmpty(recordVo.getClassIds())) {
  413. // recordVos.remove(recordVo);
  414. // if (recordVos.isEmpty()) {
  415. // break;
  416. // }
  417. continue;
  418. }
  419. String[] split = recordVo.getClassIds().split(",");
  420. List<String> ids = new ArrayList<>();
  421. for (String classId : split) {
  422. ids.add(classId.trim());
  423. }
  424. List<TextbookSubscriptionClassVo> classInfo = textbookTextbookMapper.getClassInfo(ids);
  425. String useClass = "";
  426. for (int i = 0; i < classInfo.size(); i++) {
  427. if (i >= 1) {
  428. useClass += ",";
  429. }
  430. TextbookSubscriptionClassVo classVo = classInfo.get(i);
  431. useClass += classVo.getName();
  432. }
  433. recordVo.setUseClass(useClass);
  434. }
  435. }
  436. return recordVos;
  437. }
  438. @Override
  439. public TextbookVo getInfoByissn(String issn) {
  440. TextbookVo infoByissn = textbookTextbookMapper.getInfoByissn(issn);
  441. if (infoByissn == null) {
  442. return null;
  443. }
  444. List<TextbookClassRelation> classRelationList = textbookTextbookClassRelationMapper.selectList(
  445. new QueryWrapper<TextbookClassRelation>().lambda().eq(TextbookClassRelation::getTextbookId, infoByissn.getId())
  446. );
  447. infoByissn.setTextbookClassRelationList(BeanUtil.copyToList(classRelationList, TextbookClassRelationVo.class));
  448. return infoByissn;
  449. }
  450. @Override
  451. public List<TextbookWarehouseRecordListVo> warehouseList(Long id) {
  452. List<TextbookWarehouseRecordListVo> result = textbookTextbookMapper.warehouseList(id);
  453. if (!result.isEmpty()) {
  454. return result;
  455. }
  456. return new ArrayList<>();
  457. }
  458. @Override
  459. public List<TextbookClassRelation> getClassRelation(Long id) {
  460. List<TextbookClassRelation> classRelation = textbookTextbookMapper.getClassRelation(id);
  461. if (!classRelation.isEmpty()) {
  462. return classRelation;
  463. }
  464. return new ArrayList<>();
  465. }
  466. @Override
  467. public List<TextbookIssueRecordListVo> issueList(Long id) {
  468. List<TextbookIssueRecordListVo> result = textbookTextbookMapper.issueList(id);
  469. if (!result.isEmpty()) {
  470. return result;
  471. }
  472. return new ArrayList<>();
  473. }
  474. @Override
  475. public List<WfTextbookClaimListVo> claimList(Long id) {
  476. List<WfTextbookClaimListVo> result = new ArrayList<>();
  477. //教材领取分为两种
  478. //教师领取
  479. MPJLambdaWrapper<TextbookIssueRecord> queryIssueRecord = new MPJLambdaWrapper<>();
  480. queryIssueRecord
  481. .eq(TextbookIssueRecord::getTextbookId, id)
  482. .eq(TextbookIssueRecord::getIssueMode, "im_teacher");
  483. List<TextbookIssueRecord> textbookIssueRecordList = textbookIssueRecordMapper.selectJoinList(TextbookIssueRecord.class, queryIssueRecord);
  484. for (TextbookIssueRecord t : textbookIssueRecordList) {
  485. MPJLambdaWrapper<TextbookIssueRecord> queryTeaClaimVo = new MPJLambdaWrapper<>();
  486. queryTeaClaimVo
  487. .selectAs(BaseSemester::getName, WfTextbookClaimListVo::getSemesterName)
  488. .selectAs(XjrUser::getName, WfTextbookClaimListVo::getName)
  489. .selectAs(XjrUser::getUserName, WfTextbookClaimListVo::getUserName)
  490. .selectAs(TextbookIssueRecord::getCreateDate, WfTextbookClaimListVo::getClaimDate)
  491. .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getReceiveUserId)
  492. .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId)
  493. .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
  494. .eq(TextbookIssueRecord::getId, t.getId());
  495. WfTextbookClaimListVo wfTextbookClaimListVo = textbookIssueRecordMapper.selectJoinOne(WfTextbookClaimListVo.class, queryTeaClaimVo);
  496. for (int j = 0; j < t.getIssueNumber(); j++) {
  497. wfTextbookClaimListVo.setClaimIdentity("教师");
  498. wfTextbookClaimListVo.setClassName("/");
  499. result.add(wfTextbookClaimListVo);
  500. }
  501. }
  502. //学生领取
  503. MPJLambdaWrapper<TextbookStudentClaim> queryStuClaimVo = new MPJLambdaWrapper<>();
  504. queryStuClaimVo
  505. .select("'学生' as claimIdentity")
  506. .selectAs(BaseClass::getName, WfTextbookClaimListVo::getClassName)
  507. .selectAs(BaseSemester::getName, WfTextbookClaimListVo::getSemesterName)
  508. .selectAs(XjrUser::getName, WfTextbookClaimListVo::getName)
  509. .selectAs(XjrUser::getUserName, WfTextbookClaimListVo::getUserName)
  510. .selectAs(TextbookStudentClaim::getCreateDate, WfTextbookClaimListVo::getClaimDate)
  511. .leftJoin(XjrUser.class, XjrUser::getId, TextbookStudentClaim::getStudentUserId)
  512. .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookStudentClaim::getBaseSemesterId)
  513. .leftJoin(BaseClass.class, BaseClass::getId, TextbookStudentClaim::getClassId)
  514. .eq(TextbookStudentClaim::getTextbookId, id)
  515. .eq(TextbookStudentClaim::getIsClaim, 1);
  516. List<WfTextbookClaimListVo> wfTextbookClaimListVoList = textbookStudentClaimMapper.selectJoinList(WfTextbookClaimListVo.class, queryStuClaimVo);
  517. result.addAll(wfTextbookClaimListVoList);
  518. return result;
  519. }
  520. @Override
  521. public List<TextbookStandingExportQueryVo> listTextbookStandingExportQuery(TextbookStandingExportQuerytDto dto) {
  522. return textbookTextbookMapper.listTextbookStandingExportQuery(dto);
  523. }
  524. @Override
  525. public ByteArrayOutputStream listTextbookSubscriptionExportQuery(TextbookSubscriptionExportQueryDto dto) {
  526. List<TextbookSubscriptionExportQueryVo> result = textbookTextbookMapper.listTextbookSubscriptionExportQuery(dto);
  527. //将班级转换为中文
  528. for (TextbookSubscriptionExportQueryVo to : result) {
  529. if (to != null && to.getClassIds() != null && !("").equals(to.getClassIds())) {
  530. List<Long> classIdList = new ArrayList<>();
  531. String[] classIdStrs = to.getClassIds().split(",");
  532. for (String classIdStr : classIdStrs) {
  533. classIdList.add(Long.parseLong(classIdStr.trim()));
  534. }
  535. LambdaQueryWrapper<BaseClass> baseClassLambdaQueryWrapper = new LambdaQueryWrapper<>();
  536. baseClassLambdaQueryWrapper
  537. .in(BaseClass::getId, classIdList);
  538. List<BaseClass> baseClassList = baseClassService.list(baseClassLambdaQueryWrapper);
  539. if (baseClassList.size() > 0) {
  540. StringBuilder sb = new StringBuilder();
  541. for (int i = 0; i < baseClassList.size(); i++) {
  542. sb.append(baseClassList.get(i).getName());
  543. if (i != baseClassList.size() - 1) {
  544. sb.append(",");
  545. }
  546. }
  547. to.setUseClass(sb.toString());
  548. }
  549. }
  550. }
  551. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  552. // 设置动态头
  553. String baseSemesterCn = "";
  554. if(dto.getBaseSemesterId() != null){
  555. LambdaQueryWrapper<BaseSemester> baseSemesterLambdaQueryWrapper = new LambdaQueryWrapper<>();
  556. baseSemesterLambdaQueryWrapper
  557. .eq(BaseSemester::getId, dto.getBaseSemesterId());
  558. BaseSemester baseSemester = baseSemesterMapper.selectOne(baseSemesterLambdaQueryWrapper);
  559. if(baseSemester != null){
  560. baseSemesterCn = baseSemester.getName();
  561. }
  562. }
  563. String headTitle = "重庆市铜梁职业教育中心" + baseSemesterCn + "教材征订表";
  564. List<List<String>> headList = new ArrayList<>();
  565. // List<String> head0 = new ArrayList<>();
  566. // head0.add("个人信息");
  567. // head0.add("用户名");
  568. // List<String> head1 = new ArrayList<>();
  569. // head1.add("个人信息");
  570. // head1.add("年龄");
  571. // List<String> head2 = new ArrayList<>();
  572. // head2.add("个人信息");
  573. // head2.add("地址");
  574. headList.add(new ArrayList<String>(){{
  575. add(headTitle);
  576. add("国际标准刊号");
  577. }});
  578. headList.add(new ArrayList<String>(){{
  579. add(headTitle);
  580. add("书名");
  581. }});
  582. headList.add(new ArrayList<String>(){{
  583. add(headTitle);
  584. add("出版社");
  585. }});
  586. headList.add(new ArrayList<String>(){{
  587. add(headTitle);
  588. add("主编");
  589. }});
  590. headList.add(new ArrayList<String>(){{
  591. add(headTitle);
  592. add("估价(元)");
  593. }});
  594. headList.add(new ArrayList<String>(){{
  595. add(headTitle);
  596. add("是否为规划教材");
  597. }});
  598. headList.add(new ArrayList<String>(){{
  599. add(headTitle);
  600. add("对应课程");
  601. }});
  602. headList.add(new ArrayList<String>(){{
  603. add(headTitle);
  604. add("使用年级");
  605. }});
  606. headList.add(new ArrayList<String>(){{
  607. add(headTitle);
  608. add("使用班级");
  609. }});
  610. headList.add(new ArrayList<String>(){{
  611. add(headTitle);
  612. add("学生用书征订数量");
  613. }});
  614. headList.add(new ArrayList<String>(){{
  615. add(headTitle);
  616. add("教师教材用书征订数量");
  617. }});
  618. headList.add(new ArrayList<String>(){{
  619. add(headTitle);
  620. add("教师教参用书征订数量");
  621. }});
  622. headList.add(new ArrayList<String>(){{
  623. add(headTitle);
  624. add("学科组名称");
  625. }});
  626. headList.add(new ArrayList<String>(){{
  627. add(headTitle);
  628. add("有无配套教学资源");
  629. }});
  630. headList.add(new ArrayList<String>(){{
  631. add(headTitle);
  632. add("备注");
  633. }});
  634. EasyExcel.write(bot, TextbookSubscriptionExportQueryVo.class).automaticMergeHead(true).excelType(ExcelTypeEnum.XLSX).head(headList).sheet().doWrite(result);
  635. return bot;
  636. }
  637. @Override
  638. public ByteArrayOutputStream listTextbookClaimExportQuery(TextbookClaimExportQueryDto dto) {
  639. List<TextbookClaimExportQueryVo> customerList = textbookTextbookMapper.listTextbookClaimExportQuery(dto);
  640. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  641. //内容样式
  642. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  643. //设计内容居中
  644. contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
  645. contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
  646. contentWriteCellStyle.setWrapped(true); //设置自动换行;
  647. // 设置字体
  648. WriteFont contentWriteFont = new WriteFont();
  649. contentWriteFont.setFontHeightInPoints((short) 12);//设置字体大小
  650. contentWriteFont.setFontName("宋体"); //设置字体名字
  651. contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;
  652. //设置样式;
  653. contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
  654. contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
  655. contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框;
  656. contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
  657. contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
  658. contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
  659. contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
  660. contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;
  661. //设置头部样式
  662. WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  663. // 背景颜色
  664. // headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE1.getIndex());
  665. // headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
  666. // 字体
  667. WriteFont headWriteFont = new WriteFont();
  668. headWriteFont.setFontName("宋体");//设置字体名字
  669. headWriteFont.setFontHeightInPoints((short) 14);//设置字体大小
  670. headWriteFont.setBold(true);//字体加粗
  671. headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
  672. // 样式
  673. headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
  674. headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
  675. headWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框;
  676. headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
  677. headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
  678. headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
  679. headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
  680. headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;
  681. headWriteCellStyle.setWrapped(true); //设置自动换行;
  682. //设置头部标题居中
  683. headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
  684. headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置垂直对齐的样式为居中对齐;
  685. headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
  686. // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
  687. HorizontalCellStyleStrategy horizontalCellStyleStrategy =
  688. new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
  689. try (ExcelWriter excelWriter = EasyExcel.write(bot, TextbookClaimExportQueryVo.class).registerWriteHandler(horizontalCellStyleStrategy).build()) {
  690. //已经写入的行
  691. int rowIndex = 0;
  692. //已经写入的表
  693. int tableIndex = 0;
  694. // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
  695. WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
  696. //sheet的表头
  697. List<List<String>> sheetHeadList = new ArrayList<List<String>>();
  698. sheetHeadList.add(new ArrayList<String>() {{
  699. add("铜梁执教中心班级教材教辅发放情况表");
  700. }});
  701. //sheet的表头合并策略
  702. ExcelFillCellMergePrevColUtil sheetHeadColumn = new ExcelFillCellMergePrevColUtil();
  703. sheetHeadColumn.add(rowIndex, 0, 9);
  704. //这是一个sheet表头的table
  705. WriteTable writeSheetHeadTable = EasyExcel.writerTable(tableIndex).needHead(Boolean.TRUE).head(sheetHeadList).registerWriteHandler(sheetHeadColumn).build();
  706. excelWriter.write(new ArrayList<>(), writeSheet, writeSheetHeadTable);
  707. //对返回的集合进行处理
  708. //现针对学期进行分组
  709. Map<Long, List<TextbookClaimExportQueryVo>> groupedBySemester = customerList.stream()
  710. .collect(Collectors.groupingBy(TextbookClaimExportQueryVo::getBaseSemesterId));
  711. Iterator<Map.Entry<Long, List<TextbookClaimExportQueryVo>>> groupedBySemesterIterator = groupedBySemester.entrySet().iterator();
  712. while (groupedBySemesterIterator.hasNext()) {
  713. Map.Entry<Long, List<TextbookClaimExportQueryVo>> groupedBySemesterEntry = groupedBySemesterIterator.next();
  714. Long key = groupedBySemesterEntry.getKey();
  715. List<TextbookClaimExportQueryVo> value = groupedBySemesterEntry.getValue();
  716. Map<Long, List<TextbookClaimExportQueryVo>> groupedBySemesterByClass = value.stream()
  717. .collect(Collectors.groupingBy(TextbookClaimExportQueryVo::getClassId));
  718. Iterator<Map.Entry<Long, List<TextbookClaimExportQueryVo>>> groupedBySemesterByClassIdIterator = groupedBySemesterByClass.entrySet().iterator();
  719. while (groupedBySemesterByClassIdIterator.hasNext()) {
  720. Map.Entry<Long, List<TextbookClaimExportQueryVo>> groupedBySemesterByClassIdEntry = groupedBySemesterByClassIdIterator.next();
  721. Long k = groupedBySemesterByClassIdEntry.getKey();
  722. List<TextbookClaimExportQueryVo> v = groupedBySemesterByClassIdEntry.getValue();
  723. //这是一个table的表头
  724. List<List<String>> tableHeadList = new ArrayList<List<String>>();
  725. tableHeadList.add(new ArrayList<String>() {{
  726. add("日期:" + v.get(0).getBaseSemesterIdCn() + " 班级:" + v.get(0).getClassIdCn() + " 班主任:" + v.get(0).getHeadTeacherName() + " 教室:" + v.get(0).getClassRoomName() + " ");
  727. }});
  728. //table的表头合并策略
  729. ExcelFillCellMergePrevColUtil tableHeadColumn = new ExcelFillCellMergePrevColUtil();
  730. tableHeadColumn.add(++rowIndex, 0, 9);
  731. //这是一个table表头的table
  732. WriteTable writeTableHeadTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.TRUE).head(tableHeadList).registerWriteHandler(tableHeadColumn).build();
  733. excelWriter.write(new ArrayList<>(), writeSheet, writeTableHeadTable);
  734. Map<String, List<TextbookClaimExportQueryVo>> groupedByTextbookType = v.stream()
  735. .collect(Collectors.groupingBy(TextbookClaimExportQueryVo::getTextbookTypeCn));
  736. Iterator<Map.Entry<String, List<TextbookClaimExportQueryVo>>> groupedByTextbookTypeIterator = groupedByTextbookType.entrySet().iterator();
  737. int index = 1;
  738. BigDecimal total = new BigDecimal("0");
  739. while (groupedByTextbookTypeIterator.hasNext()) {
  740. Map.Entry<String, List<TextbookClaimExportQueryVo>> groupedByTextbookTypeEntry = groupedByTextbookTypeIterator.next();
  741. String kk = groupedByTextbookTypeEntry.getKey();
  742. List<TextbookClaimExportQueryVo> vv = groupedByTextbookTypeEntry.getValue();
  743. if (index == 1) {
  744. //添加小计
  745. ExcelFillCellMergePrevColUtil subtotalColumn = new ExcelFillCellMergePrevColUtil();
  746. subtotalColumn.add(rowIndex + vv.size() + 2, 1, 4);
  747. BigDecimal subtotal = new BigDecimal("0");
  748. for (TextbookClaimExportQueryVo tv : vv) {
  749. subtotal = subtotal.add(tv.getSubtotal() == null ? new BigDecimal("0") : tv.getSubtotal());
  750. }
  751. BigDecimal finalSubtotal = subtotal;
  752. vv.add(new TextbookClaimExportQueryVo() {{
  753. setTextbookTypeCn(vv.get(0).getTextbookTypeCn());
  754. setBookName("小计");
  755. setSubtotal(finalSubtotal);
  756. }});
  757. total = total.add(finalSubtotal);
  758. // 调用合并单元格工具类,此工具类是根据工程名称相同则合并后面数据
  759. int mergeRowIndex = rowIndex + 1;
  760. int[] mergeColumeIndex = {0};
  761. ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex);
  762. // 第一次必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
  763. WriteTable writeContentTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.TRUE).registerWriteHandler(subtotalColumn).registerWriteHandler(excelFillCellMergeStrategy).build();
  764. // 第一次写入会创建头
  765. excelWriter.write(vv, writeSheet, writeContentTable);
  766. rowIndex += (1 + vv.size());
  767. } else {
  768. //添加小计
  769. ExcelFillCellMergePrevColUtil subtotalColumn = new ExcelFillCellMergePrevColUtil();
  770. subtotalColumn.add(rowIndex + vv.size() + 1, 1, 4);
  771. BigDecimal subtotal = new BigDecimal("0");
  772. for (TextbookClaimExportQueryVo tv : vv) {
  773. subtotal = subtotal.add(tv.getSubtotal());
  774. }
  775. BigDecimal finalSubtotal = subtotal;
  776. vv.add(new TextbookClaimExportQueryVo() {{
  777. setTextbookTypeCn(vv.get(0).getTextbookTypeCn());
  778. setBookName("小计");
  779. setSubtotal(finalSubtotal);
  780. }});
  781. total = total.add(finalSubtotal);
  782. // 调用合并单元格工具类,此工具类是根据工程名称相同则合并后面数据
  783. int mergeRowIndex = rowIndex;
  784. int[] mergeColumeIndex = {0};
  785. ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex);
  786. // 不需要头
  787. WriteTable writeContentTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.FALSE).registerWriteHandler(subtotalColumn).registerWriteHandler(excelFillCellMergeStrategy).build();
  788. excelWriter.write(vv, writeSheet, writeContentTable);
  789. rowIndex += (vv.size());
  790. }
  791. index++;
  792. }
  793. //添加合计
  794. BigDecimal finalTotal = total;
  795. List<TextbookClaimExportQueryVo> totalList = new ArrayList<>();
  796. totalList.add(new TextbookClaimExportQueryVo() {{
  797. setTextbookTypeCn("合计");
  798. setSubtotal(finalTotal);
  799. }});
  800. //-合并策略
  801. ExcelFillCellMergePrevColUtil totaColumn = new ExcelFillCellMergePrevColUtil();
  802. totaColumn.add(++rowIndex, 0, 5);
  803. //这是一个合计的table
  804. WriteTable writeTotalTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.FALSE).registerWriteHandler(totaColumn).build();
  805. excelWriter.write(totalList, writeSheet, writeTotalTable);
  806. }
  807. }
  808. }
  809. return bot;
  810. }
  811. @Override
  812. @Transactional
  813. public Boolean excelImport(InputStream inputStream) {
  814. EasyExcel.read(inputStream, TextbookImportDto.class, new PageReadListener<TextbookImportDto>(dataList -> {
  815. if (dataList.isEmpty()) {
  816. throw new MyException("导入数据为空");
  817. }
  818. saveData(dataList);
  819. })).sheet().headRowNumber(3).doRead();
  820. return true;
  821. }
  822. private void saveData(List<TextbookImportDto> dataList) {
  823. //查询所有需要的数据
  824. //学科组
  825. List<SubjectGroup> subjectGroupList = subjectGroupMapper.selectList(new LambdaQueryWrapper<>());
  826. Map<String, Long> subjectGroupNameAndIdMap = subjectGroupList.stream().collect(Collectors.toMap(SubjectGroup::getGroupName, SubjectGroup::getId, (k1, k2) -> k1));
  827. //使用课程
  828. List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectMapper.selectList(new LambdaQueryWrapper<>());
  829. Map<String, Long> baseCourseSubjectNameAndIdMap = baseCourseSubjectList.stream().collect(Collectors.toMap(BaseCourseSubject::getName, BaseCourseSubject::getId, (k1, k2) -> k1));
  830. //批量插入或更新数据
  831. for (TextbookImportDto textbookImportDto : dataList) {
  832. TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
  833. BeanUtils.copyProperties(textbookImportDto, textbookCoreAttribute);
  834. Textbook textbook = new Textbook();
  835. BeanUtils.copyProperties(textbookImportDto, textbook);
  836. // 处理学科组映射
  837. String groupName = textbookImportDto.getGroupName();
  838. Long subjectGroupId = Optional.ofNullable(groupName)
  839. .map(subjectGroupNameAndIdMap::get)
  840. .orElse(null);
  841. textbook.setSubjectGroupId(subjectGroupId);
  842. // 处理课程映射
  843. String courseName = textbookImportDto.getCourseName();
  844. Long courseSubjectId = Optional.ofNullable(courseName)
  845. .map(baseCourseSubjectNameAndIdMap::get)
  846. .orElse(null);
  847. textbook.setCourseSubjectId(courseSubjectId);
  848. // 处理是否教材计划字段
  849. String isTextbookPlanCn = textbookImportDto.getIsTextbookPlanCn();
  850. String isTextbookPlan = Optional.ofNullable(isTextbookPlanCn)
  851. .filter("是"::equals)
  852. .map(s -> "yes")
  853. .orElse("no");
  854. textbook.setIsTextbookPlan(isTextbookPlan);
  855. // 处理教材类型映射
  856. String textbookTypeCn = textbookImportDto.getTextbookTypeCn();
  857. String textbookTypeCode = Optional.ofNullable(textbookTypeCn)
  858. .map(TextbookTypeEnum::getCode)
  859. .orElse(null);
  860. textbook.setTextbookType(textbookTypeCode);
  861. //处理使用类型
  862. textbook.setUseType(UseSemesterTypeEnum.getCode(textbookImportDto.getUseTypeCn()));
  863. //处理小计
  864. textbook.setSubtotal(textbook.getPrice().multiply(BigDecimal.valueOf(textbook.getDiscount()/10)));
  865. // 判断导入的教材是否已经存在,根据教材的 ISBN 码和使用的学期判断
  866. LambdaQueryWrapper<Textbook> textbookLambdaQueryWrapper = new LambdaQueryWrapper<>();
  867. textbookLambdaQueryWrapper
  868. .eq(Textbook::getIssn, textbook.getIssn())
  869. ;
  870. Textbook oldTextbook = this.getOne(textbookLambdaQueryWrapper);
  871. Date now = new Date();
  872. Long loginId = StpUtil.getLoginIdAsLong();
  873. // 已经存在,更新数据
  874. if (oldTextbook != null) {
  875. // 更新教材数据
  876. textbookCoreAttribute.setId(oldTextbook.getTextbookCoreAttributeId());
  877. textbookCoreAttribute.setModifyDate(now);
  878. textbookCoreAttribute.setModifyUserId(loginId);
  879. textbookCoreAttributeService.updateById(textbookCoreAttribute);
  880. textbook.setId(oldTextbook.getId());
  881. textbook.setModifyDate(now);
  882. textbook.setModifyUserId(loginId);
  883. textbookTextbookMapper.updateById(textbook);
  884. } else {
  885. textbookCoreAttribute.setCreateDate(now);
  886. textbookCoreAttribute.setCreateUserId(loginId);
  887. textbookCoreAttributeService.save(textbookCoreAttribute);
  888. // 插入教材数据
  889. textbook.setCreateDate(now);
  890. textbook.setCreateUserId(loginId);
  891. textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
  892. textbookTextbookMapper.insert(textbook);
  893. }
  894. }
  895. }
  896. @Override
  897. @Transactional
  898. public Boolean deliverWarehouse(AddTextbookWarehouseRecordDto dto) {
  899. //根据id获取教材管理记录
  900. Textbook textbook = this.getById(dto.getTextbookId());
  901. if (ObjectUtil.isNull(textbook)) {
  902. throw new MyException("入库失败,该教材不存在");
  903. }
  904. // BigDecimal price = ObjectUtil.isNull(dto.getPrice()) ? new BigDecimal(0) : dto.getPrice();
  905. // double discount = ObjectUtil.isNull(dto.getDiscount()) ? 10 : dto.getDiscount();
  906. // BigDecimal subtotal = price.multiply(new BigDecimal(discount / 10));
  907. //更新总的库存数量
  908. this.updateById(new Textbook() {
  909. {
  910. setId(textbook.getId());
  911. Integer oldStock = ObjectUtil.isNull(textbook.getStock()) ? 0 : textbook.getStock();
  912. setStock(oldStock + (ObjectUtil.isNull(dto.getWarehouseNumber()) ? 0 : dto.getWarehouseNumber()));
  913. // setPrice(price);
  914. // setDiscount(discount);
  915. // setSubtotal(subtotal);
  916. setModifyDate(new Date());
  917. }
  918. });
  919. //添加入库记录
  920. TextbookWarehouseRecord textbookWarehouseRecord = BeanUtil.toBean(dto, TextbookWarehouseRecord.class);
  921. textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmManual.getCode());
  922. textbookWarehouseRecord.setDiscount(textbook.getDiscount());
  923. textbookWarehouseRecord.setSubtotal(textbook.getSubtotal());
  924. textbookWarehouseRecord.setCreateDate(new Date());
  925. QueryWrapper<TextbookWarehouseRecord> queryWrapperSortcode = new QueryWrapper<>();
  926. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  927. TextbookWarehouseRecord t = textbookClassWarehouseService.getOne(queryWrapperSortcode);
  928. textbookWarehouseRecord.setSortCode(t.getSortCode() + 1);
  929. textbookClassWarehouseService.save(textbookWarehouseRecord);
  930. return true;
  931. }
  932. }