TextbookServiceImpl.java 54 KB

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