TextbookServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  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.support.ExcelTypeEnum;
  8. import com.alibaba.excel.write.metadata.WriteSheet;
  9. import com.alibaba.excel.write.metadata.WriteTable;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  12. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  13. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  14. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  15. import com.github.yulichang.base.MPJBaseServiceImpl;
  16. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  17. import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
  18. import com.xjrsoft.common.enums.SubscriptionTypeEnum;
  19. import com.xjrsoft.common.enums.TextbookTypeEnum;
  20. import com.xjrsoft.common.enums.WarehouseModeEnum;
  21. import com.xjrsoft.common.exception.MyException;
  22. import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
  23. import com.xjrsoft.module.base.entity.BaseClass;
  24. import com.xjrsoft.module.base.entity.BaseSemester;
  25. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  26. import com.xjrsoft.module.base.service.IBaseClassService;
  27. import com.xjrsoft.module.teacher.entity.XjrUser;
  28. import com.xjrsoft.module.textbook.dto.*;
  29. import com.xjrsoft.module.textbook.entity.*;
  30. import com.xjrsoft.module.textbook.mapper.*;
  31. import com.xjrsoft.module.textbook.service.ITextbookService;
  32. import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordService;
  33. import com.xjrsoft.module.textbook.service.IWfExerciseBookService;
  34. import com.xjrsoft.module.textbook.service.IWfTextbookSubscriptionService;
  35. import com.xjrsoft.module.textbook.vo.*;
  36. import lombok.AllArgsConstructor;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.transaction.annotation.Transactional;
  39. import java.io.ByteArrayOutputStream;
  40. import java.math.BigDecimal;
  41. import java.util.ArrayList;
  42. import java.util.Date;
  43. import java.util.List;
  44. import java.util.Objects;
  45. import java.util.stream.Collectors;
  46. /**
  47. * @title: 教材管理
  48. * @Author szs
  49. * @Date: 2023-12-25
  50. * @Version 1.0
  51. */
  52. @Service
  53. @AllArgsConstructor
  54. public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Textbook> implements ITextbookService {
  55. private final TextbookMapper textbookTextbookMapper;
  56. private final TextbookClassRelationMapper textbookTextbookClassRelationMapper;
  57. private final TextbookSubscriptionRecordMapper textbookTextbookSubscriptionRecordMapper;
  58. private final IWfTextbookSubscriptionService iWfTextbookSubscriptionService;
  59. private final IWfExerciseBookService wfExerciseBookService;
  60. private final IBaseClassService baseClassService;
  61. private final ITextbookWarehouseRecordService textbookClassWarehouseService;
  62. private final TextbookIssueRecordMapper textbookIssueRecordMapper;
  63. private final TextbookStudentClaimMapper textbookStudentClaimMapper;
  64. @Override
  65. @Transactional(rollbackFor = Exception.class)
  66. public Boolean add(Textbook textbook) {
  67. textbook.setCreateDate(new Date());
  68. textbookTextbookMapper.insert(textbook);
  69. for (TextbookClassRelation textbookClassRelation : textbook.getTextbookClassRelationList()) {
  70. textbookClassRelation.setTextbookId(textbook.getId());
  71. textbookClassRelation.setCreateDate(new Date());
  72. textbookTextbookClassRelationMapper.insert(textbookClassRelation);
  73. }
  74. if (textbook.getTextbookSubscriptionRecordList() != null) {
  75. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  76. textbookSubscriptionRecord.setTextbookId(textbook.getId());
  77. textbookSubscriptionRecord.setCreateDate(new Date());
  78. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  79. }
  80. }
  81. return true;
  82. }
  83. @Override
  84. @Transactional(rollbackFor = Exception.class)
  85. public Boolean update(Textbook textbook) {
  86. textbookTextbookMapper.updateById(textbook);
  87. //********************************* TextbookClassRelation 增删改 开始 *******************************************/
  88. {
  89. // 查出所有子级的id
  90. List<TextbookClassRelation> textbookClassRelationList = textbookTextbookClassRelationMapper.selectList(Wrappers.lambdaQuery(TextbookClassRelation.class).eq(TextbookClassRelation::getTextbookId, textbook.getId()).select(TextbookClassRelation::getId));
  91. List<Long> textbookClassRelationIds = textbookClassRelationList.stream().map(TextbookClassRelation::getId).collect(Collectors.toList());
  92. //原有子表单 没有被删除的主键
  93. List<Long> textbookClassRelationOldIds = textbook.getTextbookClassRelationList().stream().map(TextbookClassRelation::getId).filter(Objects::nonNull).collect(Collectors.toList());
  94. //找到需要删除的id
  95. List<Long> textbookClassRelationRemoveIds = textbookClassRelationIds.stream().filter(item -> !textbookClassRelationOldIds.contains(item)).collect(Collectors.toList());
  96. for (TextbookClassRelation textbookClassRelation : textbook.getTextbookClassRelationList()) {
  97. //如果不等于空则修改
  98. if (textbookClassRelation.getId() != null) {
  99. textbookTextbookClassRelationMapper.updateById(textbookClassRelation);
  100. }
  101. //如果等于空 则新增
  102. else {
  103. //已经不存在的id 删除
  104. textbookClassRelation.setTextbookId(textbook.getId());
  105. textbookTextbookClassRelationMapper.insert(textbookClassRelation);
  106. }
  107. }
  108. //已经不存在的id 删除
  109. if (textbookClassRelationRemoveIds.size() > 0) {
  110. textbookTextbookClassRelationMapper.deleteBatchIds(textbookClassRelationRemoveIds);
  111. }
  112. }
  113. //********************************* TextbookClassRelation 增删改 结束 *******************************************/
  114. //********************************* TextbookSubscriptionRecord 增删改 开始 *******************************************/
  115. {
  116. // 查出所有子级的id
  117. List<TextbookSubscriptionRecord> textbookSubscriptionRecordList = textbookTextbookSubscriptionRecordMapper.selectList(Wrappers.lambdaQuery(TextbookSubscriptionRecord.class).eq(TextbookSubscriptionRecord::getWfTextbookSubscriptionId, textbook.getId()).select(TextbookSubscriptionRecord::getId));
  118. List<Long> textbookSubscriptionRecordIds = textbookSubscriptionRecordList.stream().map(TextbookSubscriptionRecord::getId).collect(Collectors.toList());
  119. //原有子表单 没有被删除的主键
  120. if (!textbookSubscriptionRecordIds.isEmpty()) {
  121. List<Long> textbookSubscriptionRecordOldIds = textbook.getTextbookSubscriptionRecordList().stream().map(TextbookSubscriptionRecord::getId).filter(Objects::nonNull).collect(Collectors.toList());
  122. //找到需要删除的id
  123. List<Long> textbookSubscriptionRecordRemoveIds = textbookSubscriptionRecordIds.stream().filter(item -> !textbookSubscriptionRecordOldIds.contains(item)).collect(Collectors.toList());
  124. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  125. //如果不等于空则修改
  126. if (textbookSubscriptionRecord.getId() != null) {
  127. textbookTextbookSubscriptionRecordMapper.updateById(textbookSubscriptionRecord);
  128. }
  129. //如果等于空 则新增
  130. else {
  131. //已经不存在的id 删除
  132. textbookSubscriptionRecord.setWfTextbookSubscriptionId(textbook.getId());
  133. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  134. }
  135. }
  136. //已经不存在的id 删除
  137. if (textbookSubscriptionRecordRemoveIds.size() > 0) {
  138. textbookTextbookSubscriptionRecordMapper.deleteBatchIds(textbookSubscriptionRecordRemoveIds);
  139. }
  140. for (TextbookSubscriptionRecord textbookSubscriptionRecord : textbook.getTextbookSubscriptionRecordList()) {
  141. //如果不等于空则修改
  142. if (textbookSubscriptionRecord.getId() != null) {
  143. textbookTextbookSubscriptionRecordMapper.updateById(textbookSubscriptionRecord);
  144. }
  145. //如果等于空 则新增
  146. else {
  147. //已经不存在的id 删除
  148. textbookSubscriptionRecord.setWfTextbookSubscriptionId(textbook.getId());
  149. textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
  150. }
  151. }
  152. //已经不存在的id 删除
  153. if (textbookSubscriptionRecordRemoveIds.size() > 0) {
  154. textbookTextbookSubscriptionRecordMapper.deleteBatchIds(textbookSubscriptionRecordRemoveIds);
  155. }
  156. }
  157. //********************************* TextbookSubscriptionRecord 增删改 结束 *******************************************/
  158. return true;
  159. }
  160. }
  161. @Override
  162. @Transactional(rollbackFor = Exception.class)
  163. public Boolean delete(List<Long> ids) {
  164. textbookTextbookMapper.deleteBatchIds(ids);
  165. textbookTextbookClassRelationMapper.delete(Wrappers.lambdaQuery(TextbookClassRelation.class).in(TextbookClassRelation::getTextbookId, ids));
  166. textbookTextbookSubscriptionRecordMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionRecord.class).in(TextbookSubscriptionRecord::getWfTextbookSubscriptionId, ids));
  167. return true;
  168. }
  169. @Override
  170. public Page<TextbookPageVo> getPage(Page<TextbookPageDto> page, TextbookPageDto dto) {
  171. Page<TextbookPageVo> result = textbookTextbookMapper.getPage(page, dto);
  172. return result;
  173. }
  174. @Override
  175. @Transactional
  176. public Boolean dataHandleAddTextbookNode(Long dataId) {
  177. WfTextbookSubscription wfTextbookSubscription = iWfTextbookSubscriptionService.selectById(dataId);
  178. if (ObjectUtil.isNotNull(wfTextbookSubscription) && ObjectUtil.isNotNull(wfTextbookSubscription.getWfTextbookSubscriptionItemList()) && wfTextbookSubscription.getWfTextbookSubscriptionItemList().size() > 0) {
  179. //遍历征订项
  180. for (WfTextbookSubscriptionItem wfTextbookSubscriptionItem : wfTextbookSubscription.getWfTextbookSubscriptionItemList()) {
  181. Long semesterId = wfTextbookSubscription.getBaseSemesterId();
  182. String issn = wfTextbookSubscriptionItem.getIssn();
  183. LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
  184. queryWrapper
  185. .eq(Textbook::getIssn, issn)
  186. .eq(Textbook::getBaseSemesterId, semesterId);
  187. List<Textbook> textbookList = this.list(queryWrapper);
  188. //征订的教材没有在教材管理
  189. if (ObjectUtil.isNull(textbookList) || textbookList.size() == 0) {
  190. Textbook textbook = new Textbook() {{
  191. setIssn((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIssn()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIssn())) ? "/" : wfTextbookSubscriptionItem.getIssn());
  192. setIsbn((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIsbn()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIsbn())) ? "/" : wfTextbookSubscriptionItem.getIsbn());
  193. setBookName((ObjectUtil.isNull(wfTextbookSubscriptionItem.getBookName()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getBookName())) ? "/" : wfTextbookSubscriptionItem.getBookName());
  194. setPublishingHouse((ObjectUtil.isNull(wfTextbookSubscriptionItem.getPublishingHouse()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getPublishingHouse())) ? "/" : wfTextbookSubscriptionItem.getPublishingHouse());
  195. setEditorInChief((ObjectUtil.isNull(wfTextbookSubscriptionItem.getEditorInChief()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getEditorInChief())) ? "/" : wfTextbookSubscriptionItem.getEditorInChief());
  196. setSubjectGroupId((ObjectUtil.isNull(wfTextbookSubscription.getSubjectGroupId())) ? 0 : wfTextbookSubscription.getSubjectGroupId());
  197. setBaseSemesterId(wfTextbookSubscription.getBaseSemesterId());
  198. setCourseSubjectId((ObjectUtil.isNull(wfTextbookSubscriptionItem.getCourseSubjectId())) ? 0 : wfTextbookSubscriptionItem.getCourseSubjectId());
  199. setVersion((ObjectUtil.isNull(wfTextbookSubscriptionItem.getVersion()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getVersion())) ? "/" : wfTextbookSubscriptionItem.getVersion());
  200. setIsTextbookPlan((ObjectUtil.isNull(wfTextbookSubscriptionItem.getIsTextbookPlan()) || StringUtils.isBlank(wfTextbookSubscriptionItem.getIsTextbookPlan())) ? "/" : wfTextbookSubscriptionItem.getIsTextbookPlan());
  201. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getSubscriptionType()) && wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.STextbook.getCode())) {
  202. setTextbookType(TextbookTypeEnum.TTextbook.getCode());
  203. }
  204. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getSubscriptionType()) && wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.SMaterials.getCode())) {
  205. setTextbookType(TextbookTypeEnum.TMaterials.getCode());
  206. }
  207. setSpecificationsModels("/");
  208. setAppraisalPrice((ObjectUtil.isNull(wfTextbookSubscriptionItem.getAppraisalPrice())) ? new BigDecimal(0) : wfTextbookSubscriptionItem.getAppraisalPrice());
  209. setPrice(new BigDecimal(0));
  210. setDiscount(10D);
  211. setSubtotal(new BigDecimal(0));
  212. setStock(0);
  213. }};
  214. //班级不为空
  215. List<Long> classIdList = new ArrayList<>();
  216. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
  217. //将班级ids转换为List
  218. String classIds = wfTextbookSubscriptionItem.getClassIds();
  219. String[] classIdStrs = classIds.split(",");
  220. for (String classIdStr : classIdStrs) {
  221. classIdList.add(Long.parseLong(classIdStr));
  222. }
  223. //查询年级,如果添加的班级只存在一个年级,添加年级字段值
  224. LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
  225. queryWrapper1
  226. .select(BaseClass::getGradeId)
  227. .in(BaseClass::getId, classIdList)
  228. .groupBy(BaseClass::getGradeId);
  229. List<BaseClass> baseClassList = baseClassService.list(queryWrapper1);
  230. if (ObjectUtil.isNotNull(baseClassList) && baseClassList.size() == 1) {
  231. textbook.setGradeId(baseClassList.get(0).getGradeId());
  232. }
  233. }
  234. //插入教材数据
  235. textbook.setCreateDate(new Date());
  236. textbookTextbookMapper.insert(textbook);
  237. //插入班级和教材关系
  238. for (Long classId : classIdList) {
  239. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  240. setCreateDate(new Date());
  241. setTextbookId(textbook.getId());
  242. setClassId(classId);
  243. }});
  244. }
  245. //添加教材征订记录
  246. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  247. setCreateDate(new Date());
  248. setTextbookId(textbook.getId());
  249. setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  250. setWfTextbookSubscriptionItemId(wfTextbookSubscriptionItem.getId());//该字段存入征订项的id,征订项中有所属征订记录
  251. }});
  252. } else {
  253. //征订的教材在教材管理,进行班级的和记录的管理
  254. Textbook textbook = textbookList.get(0);
  255. //班级不为空
  256. if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
  257. //将班级ids转换为List
  258. String classIds = wfTextbookSubscriptionItem.getClassIds();
  259. String[] classIdStrs = classIds.split(",");
  260. for (String classIdStr : classIdStrs) {
  261. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  262. setCreateDate(new Date());
  263. setTextbookId(textbook.getId());
  264. setClassId(Long.parseLong(classIdStr));
  265. }});
  266. }
  267. }
  268. //添加教材征订记录
  269. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  270. setCreateDate(new Date());
  271. setTextbookId(textbook.getId());
  272. setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  273. setWfTextbookSubscriptionItemId(wfTextbookSubscriptionItem.getId());//该字段存入正定项的id,征订项中有所属征订记录
  274. }});
  275. }
  276. }
  277. }
  278. return true;
  279. }
  280. /**
  281. * 添加作业本规则
  282. *
  283. * @param dataId
  284. * @return
  285. */
  286. @Override
  287. @Transactional
  288. public Boolean dataHandleAddExerciseBookNode(Long dataId) {
  289. WfExerciseBook wfExerciseBook = wfExerciseBookService.selectById(dataId);
  290. if (ObjectUtil.isNotNull(wfExerciseBook) && ObjectUtil.isNotNull(wfExerciseBook.getWfExerciseBookItemList()) && wfExerciseBook.getWfExerciseBookItemList().size() > 0) {
  291. for (WfExerciseBookItem wfExerciseBookItem : wfExerciseBook.getWfExerciseBookItemList()) {
  292. Long semesterId = wfExerciseBook.getBaseSemesterId();
  293. String bookName = wfExerciseBookItem.getSubscriptionType();//作业本的选择类型对应教材管理的书名
  294. LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
  295. queryWrapper
  296. .eq(Textbook::getBookName, bookName)
  297. .eq(Textbook::getBaseSemesterId, semesterId);
  298. List<Textbook> textbookList = this.list(queryWrapper);
  299. //征订的作业本没有在教材管理
  300. if (ObjectUtil.isNull(textbookList) || textbookList.size() == 0) {
  301. Textbook textbook = new Textbook() {{
  302. setIssn("/");
  303. setIsbn("/");
  304. if(ObjectUtil.isNotNull(wfExerciseBookItem.getSubscriptionType()) && wfExerciseBookItem.getSubscriptionType().equals(ExerciseBookeTypeEnum.ExerciseBook1.getCode())){
  305. setBookName(ExerciseBookeTypeEnum.ExerciseBook1.getValue());
  306. }
  307. if(ObjectUtil.isNotNull(wfExerciseBookItem.getSubscriptionType()) && wfExerciseBookItem.getSubscriptionType().equals(ExerciseBookeTypeEnum.ExerciseBook2.getCode())){
  308. setBookName(ExerciseBookeTypeEnum.ExerciseBook2.getValue());
  309. }
  310. setPublishingHouse("/");
  311. setEditorInChief("/");
  312. setBaseSemesterId(wfExerciseBook.getBaseSemesterId());
  313. setVersion("/");
  314. setIsTextbookPlan("/");
  315. setTextbookType(TextbookTypeEnum.TExerciseBook.getCode());
  316. setSpecificationsModels((ObjectUtil.isNull(wfExerciseBookItem.getSpecificationsModels()) || StringUtils.isBlank(wfExerciseBookItem.getSpecificationsModels())) ? "/" : wfExerciseBookItem.getSpecificationsModels());
  317. //年级id
  318. if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0){
  319. LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
  320. queryWrapper1
  321. .eq(BaseClass::getId, wfExerciseBook.getClassId());
  322. BaseClass baseClass = baseClassService.getOne(queryWrapper1);
  323. if(ObjectUtil.isNotNull(baseClass)){
  324. setGradeId(baseClass.getGradeId());
  325. }
  326. }
  327. setAppraisalPrice((ObjectUtil.isNull(wfExerciseBookItem.getAppraisalPrice())) ? new BigDecimal(0) : wfExerciseBookItem.getAppraisalPrice());
  328. setPrice(new BigDecimal(0));
  329. setDiscount(10D);
  330. setSubtotal(new BigDecimal(0));
  331. setStock(0);
  332. }};
  333. //插入教材数据
  334. textbook.setCreateDate(new Date());
  335. textbookTextbookMapper.insert(textbook);
  336. //插入班级和教材关系
  337. if(ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0){
  338. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  339. setCreateDate(new Date());
  340. setTextbookId(textbook.getId());
  341. setClassId(wfExerciseBook.getClassId());
  342. }});
  343. }
  344. //添加教材征订记录
  345. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  346. setCreateDate(new Date());
  347. setTextbookId(textbook.getId());
  348. setWfTextbookSubscriptionId(wfExerciseBook.getId());
  349. }});
  350. } else {
  351. //征订的教材在教材管理,进行班级的和记录的管理
  352. Textbook textbook = textbookList.get(0);
  353. //班级不为空
  354. if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && wfExerciseBook.getClassId() > 0) {
  355. textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
  356. setCreateDate(new Date());
  357. setTextbookId(textbook.getId());
  358. setClassId(wfExerciseBook.getClassId());
  359. }});
  360. }
  361. //添加教材征订记录
  362. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  363. setCreateDate(new Date());
  364. setTextbookId(textbook.getId());
  365. setWfTextbookSubscriptionId(wfExerciseBook.getId());
  366. }});
  367. }
  368. }
  369. }
  370. return true;
  371. }
  372. @Override
  373. public List<TextbookSubscriptionRecordVo> subscriptionList(Long id) {
  374. Textbook textbook = this.getById(id);
  375. List<TextbookSubscriptionRecordVo> recordVos = new ArrayList<>();
  376. //是作业本
  377. if(textbook.getTextbookType().equals(TextbookTypeEnum.TExerciseBook.getCode())){
  378. recordVos = textbookTextbookMapper.exerciseBookSubscriptionList(id);
  379. for (TextbookSubscriptionRecordVo recordVo : recordVos) {
  380. recordVo.setIssn("/");
  381. recordVo.setPublishingHouse("/");
  382. recordVo.setEditorInChief("/");
  383. recordVo.setIsTextbookPlanCn("/");
  384. recordVo.setCourseName("/");
  385. recordVo.setGradeName("/");
  386. recordVo.setTeacherSubscriptionNumber(0);
  387. recordVo.setTeacherReferenceNumber(0);
  388. }
  389. }
  390. //是教材或者教辅
  391. if (textbook.getTextbookType().equals(TextbookTypeEnum.TTextbook.getCode()) || textbook.getTextbookType().equals(TextbookTypeEnum.TMaterials.getCode())){
  392. recordVos = textbookTextbookMapper.subscriptionList(id);
  393. for (TextbookSubscriptionRecordVo recordVo : recordVos) {
  394. if (ObjectUtil.isNull(recordVo) || StrUtil.isEmpty(recordVo.getClassIds())) {
  395. recordVos.remove(recordVo);
  396. if(recordVos.isEmpty()){
  397. break;
  398. }
  399. continue;
  400. }
  401. String[] split = recordVo.getClassIds().split(",");
  402. List<String> ids = new ArrayList<>();
  403. for (String classId : split) {
  404. ids.add(classId.trim());
  405. }
  406. List<TextbookSubscriptionClassVo> classInfo = textbookTextbookMapper.getClassInfo(ids);
  407. String useClass = "";
  408. for (int i = 0; i < classInfo.size(); i++) {
  409. if (i >= 1) {
  410. useClass += ",";
  411. }
  412. TextbookSubscriptionClassVo classVo = classInfo.get(i);
  413. useClass += classVo.getName();
  414. }
  415. recordVo.setUseClass(useClass);
  416. }
  417. }
  418. return recordVos;
  419. }
  420. @Override
  421. public TextbookVo getInfoByissn(String issn) {
  422. TextbookVo infoByissn = textbookTextbookMapper.getInfoByissn(issn);
  423. if(infoByissn == null){
  424. return null;
  425. }
  426. List<TextbookClassRelation> classRelationList = textbookTextbookClassRelationMapper.selectList(
  427. new QueryWrapper<TextbookClassRelation>().lambda().eq(TextbookClassRelation::getTextbookId, infoByissn.getId())
  428. );
  429. infoByissn.setTextbookClassRelationList(BeanUtil.copyToList(classRelationList, TextbookClassRelationVo.class));
  430. return infoByissn;
  431. }
  432. @Override
  433. public List<TextbookWarehouseRecordListVo> warehouseList(Long id) {
  434. List<TextbookWarehouseRecordListVo> result = textbookTextbookMapper.warehouseList(id);
  435. if (!result.isEmpty()) {
  436. return result;
  437. }
  438. return new ArrayList<>();
  439. }
  440. @Override
  441. public List<TextbookClassRelation> getClassRelation(Long id) {
  442. List<TextbookClassRelation> classRelation = textbookTextbookMapper.getClassRelation(id);
  443. if (!classRelation.isEmpty()) {
  444. return classRelation;
  445. }
  446. return new ArrayList<>();
  447. }
  448. @Override
  449. public List<TextbookIssueRecordListVo> issueList(Long id) {
  450. List<TextbookIssueRecordListVo> result = textbookTextbookMapper.issueList(id);
  451. if (!result.isEmpty()) {
  452. return result;
  453. }
  454. return new ArrayList<>();
  455. }
  456. @Override
  457. public List<WfTextbookClaimListVo> claimList(Long id) {
  458. List<WfTextbookClaimListVo> result = new ArrayList<>();
  459. //教材领取分为两种
  460. //教师领取
  461. MPJLambdaWrapper<TextbookIssueRecord> queryIssueRecord = new MPJLambdaWrapper<>();
  462. queryIssueRecord
  463. .eq(TextbookIssueRecord::getTextbookId, id)
  464. .eq(TextbookIssueRecord::getIssueMode, "im_teacher");
  465. List<TextbookIssueRecord> textbookIssueRecordList = textbookIssueRecordMapper.selectJoinList(TextbookIssueRecord.class, queryIssueRecord);
  466. for(TextbookIssueRecord t : textbookIssueRecordList){
  467. MPJLambdaWrapper<TextbookIssueRecord> queryTeaClaimVo = new MPJLambdaWrapper<>();
  468. queryTeaClaimVo
  469. .selectAs(BaseSemester::getName, WfTextbookClaimListVo::getSemesterName)
  470. .selectAs(XjrUser::getName, WfTextbookClaimListVo::getName)
  471. .selectAs(XjrUser::getUserName, WfTextbookClaimListVo::getUserName)
  472. .selectAs(TextbookIssueRecord::getCreateDate, WfTextbookClaimListVo::getClaimDate)
  473. .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getReceiveUserId)
  474. .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId)
  475. .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
  476. .eq(TextbookIssueRecord::getId, t.getId());
  477. WfTextbookClaimListVo wfTextbookClaimListVo = textbookIssueRecordMapper.selectJoinOne(WfTextbookClaimListVo.class, queryTeaClaimVo);
  478. for (int j = 0; j < t.getIssueNumber(); j++){
  479. wfTextbookClaimListVo.setClaimIdentity("教师");
  480. wfTextbookClaimListVo.setClassName("/");
  481. result.add(wfTextbookClaimListVo);
  482. }
  483. }
  484. //学生领取
  485. MPJLambdaWrapper<TextbookStudentClaim> queryStuClaimVo = new MPJLambdaWrapper<>();
  486. queryStuClaimVo
  487. .select("'学生' as claimIdentity")
  488. .selectAs(BaseClass::getName, WfTextbookClaimListVo::getClassName)
  489. .selectAs(BaseSemester::getName, WfTextbookClaimListVo::getSemesterName)
  490. .selectAs(XjrUser::getName, WfTextbookClaimListVo::getName)
  491. .selectAs(XjrUser::getUserName, WfTextbookClaimListVo::getUserName)
  492. .selectAs(TextbookStudentClaim::getCreateDate, WfTextbookClaimListVo::getClaimDate)
  493. .leftJoin(XjrUser.class, XjrUser::getId, TextbookStudentClaim::getStudentUserId)
  494. .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookStudentClaim::getBaseSemesterId)
  495. .leftJoin(BaseClass.class, BaseClass::getId, TextbookStudentClaim::getClassId)
  496. .eq(TextbookStudentClaim::getTextbookId, id)
  497. .eq(TextbookStudentClaim::getIsClaim, 1);
  498. List<WfTextbookClaimListVo> wfTextbookClaimListVoList = textbookStudentClaimMapper.selectJoinList(WfTextbookClaimListVo.class, queryStuClaimVo);
  499. result.addAll(wfTextbookClaimListVoList);
  500. return result;
  501. }
  502. @Override
  503. public List<TextbookStandingExportQueryVo> listTextbookStandingExportQuery(TextbookStandingExportQuerytDto dto) {
  504. return textbookTextbookMapper.listTextbookStandingExportQuery(dto);
  505. }
  506. @Override
  507. public List<TextbookSubscriptionExportQueryVo> listTextbookSubscriptionExportQuery(TextbookSubscriptionExportQueryDto dto) {
  508. List<TextbookSubscriptionExportQueryVo> result = textbookTextbookMapper.listTextbookSubscriptionExportQuery(dto);
  509. //将班级转换为中文
  510. for(TextbookSubscriptionExportQueryVo to: result){
  511. if(to.getClassIds() != null && !to.getClassIds().equals("")){
  512. List<Long> classIdList = new ArrayList<>();
  513. String[] classIdStrs = to.getClassIds().split(",");
  514. for (String classIdStr : classIdStrs){
  515. classIdList.add(Long.parseLong(classIdStr.trim()));
  516. }
  517. LambdaQueryWrapper<BaseClass> baseClassLambdaQueryWrapper = new LambdaQueryWrapper<>();
  518. baseClassLambdaQueryWrapper
  519. .in(BaseClass::getId, classIdList);
  520. List<BaseClass> baseClassList = baseClassService.list(baseClassLambdaQueryWrapper);
  521. if(baseClassList.size() > 0){
  522. StringBuilder sb = new StringBuilder();
  523. for (int i = 0; i < baseClassList.size(); i++){
  524. sb.append(baseClassList.get(i).getName());
  525. if(i != baseClassList.size()-1) {
  526. sb.append(",");
  527. }
  528. }
  529. to.setUseClass(sb.toString());
  530. }
  531. }
  532. }
  533. return result;
  534. }
  535. @Override
  536. public ByteArrayOutputStream listTextbookClaimExportQuery(TextbookClaimExportQueryDto dto) {
  537. List<TextbookClaimExportQueryVo> customerList = textbookTextbookMapper.listTextbookClaimExportQuery(dto);
  538. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  539. try (ExcelWriter excelWriter = EasyExcel.write(bot, TextbookClaimExportQueryVo.class).build()) {
  540. //已经写入的行
  541. int rowIndex = 0;
  542. //已经写入的表
  543. int tableIndex = 0;
  544. // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
  545. WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
  546. //sheet的表头
  547. List<List<String>> sheetHeadList = new ArrayList<List<String>>();
  548. sheetHeadList.add(new ArrayList<String>(){{
  549. add("铜梁执教中心班级教材教辅发放情况表");
  550. }});
  551. //sheet的表头合并策略
  552. ExcelFillCellMergePrevColUtil sheetHeadColumn = new ExcelFillCellMergePrevColUtil();
  553. sheetHeadColumn.add(rowIndex, 0, 9);
  554. //这是一个sheet表头的table
  555. WriteTable writeSheetHeadTable = EasyExcel.writerTable(tableIndex).needHead(Boolean.TRUE).head(sheetHeadList).registerWriteHandler(sheetHeadColumn).build();
  556. excelWriter.write(new ArrayList<>(), writeSheet, writeSheetHeadTable);
  557. for (int i = 0; i < 3; i++){
  558. //这是一个table的表头
  559. List<List<String>> tableHeadList = new ArrayList<List<String>>();
  560. tableHeadList.add(new ArrayList<String>(){{
  561. add("日期:2023春期 班级:23数控1班 班主任:路童话 教室:4502");
  562. }});
  563. //table的表头合并策略
  564. ExcelFillCellMergePrevColUtil tableHeadColumn = new ExcelFillCellMergePrevColUtil();
  565. tableHeadColumn.add(++rowIndex, 0, 9);
  566. //这是一个table表头的table
  567. WriteTable writeTableHeadTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.TRUE).head(tableHeadList).registerWriteHandler(tableHeadColumn).build();
  568. excelWriter.write(new ArrayList<>(), writeSheet, writeTableHeadTable);
  569. // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
  570. WriteTable writeContentTable = EasyExcel.writerTable(++tableIndex).needHead(Boolean.TRUE).build();
  571. // 第一次写入会创建头
  572. excelWriter.write(customerList, writeSheet, writeContentTable);
  573. rowIndex += (1 + customerList.size());
  574. }
  575. }
  576. // EasyExcel.write(bot, TextbookClaimExportQueryVo.class).automaticMergeHead(true).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
  577. return bot;
  578. }
  579. @Override
  580. @Transactional
  581. public Boolean deliverWarehouse(AddTextbookWarehouseRecordDto dto) {
  582. //根据id获取教材管理记录
  583. Textbook textbook = this.getById(dto.getTextbookId());
  584. if (ObjectUtil.isNull(textbook)) {
  585. throw new MyException("入库失败,该教材不存在");
  586. }
  587. BigDecimal price = ObjectUtil.isNull(dto.getPrice()) ? new BigDecimal(0) : dto.getPrice();
  588. Double discount = ObjectUtil.isNull(dto.getDiscount()) ? 10 : dto.getDiscount();
  589. BigDecimal subtotal = price.multiply(new BigDecimal(discount / 10));
  590. //更新总的库存数量
  591. this.updateById(new Textbook(){
  592. {
  593. setId(textbook.getId());
  594. Integer oldStock = ObjectUtil.isNull(textbook.getStock()) ? 0 : textbook.getStock();
  595. setStock(oldStock + (ObjectUtil.isNull(dto.getWarehouseNumber()) ? 0 : dto.getWarehouseNumber()));
  596. setPrice(price);
  597. setDiscount(discount);
  598. setSubtotal(subtotal);
  599. setModifyDate(new Date());
  600. }
  601. });
  602. //添加入库记录
  603. TextbookWarehouseRecord textbookWarehouseRecord = BeanUtil.toBean(dto, TextbookWarehouseRecord.class);
  604. textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmManual.getCode());
  605. textbookWarehouseRecord.setDiscount(discount);
  606. textbookWarehouseRecord.setSubtotal(subtotal);
  607. textbookWarehouseRecord.setCreateDate(new Date());
  608. QueryWrapper<TextbookWarehouseRecord> queryWrapperSortcode = new QueryWrapper<>();
  609. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  610. TextbookWarehouseRecord t = textbookClassWarehouseService.getOne(queryWrapperSortcode);
  611. textbookWarehouseRecord.setSortCode(t.getSortCode() + 1);
  612. textbookClassWarehouseService.save(textbookWarehouseRecord);
  613. return true;
  614. }
  615. }