TextbookServiceImpl.java 47 KB

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