TextbookSubscriptionServiceImpl.java 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. package com.xjrsoft.module.textbook.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.IdUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.db.Entity;
  7. import com.alibaba.excel.EasyExcel;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  10. import com.baomidou.mybatisplus.core.metadata.IPage;
  11. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  12. import com.github.yulichang.base.MPJBaseServiceImpl;
  13. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  14. import com.google.gson.JsonArray;
  15. import com.google.gson.JsonElement;
  16. import com.google.gson.JsonObject;
  17. import com.google.gson.JsonParser;
  18. import com.xjrsoft.common.enums.DeleteMark;
  19. import com.xjrsoft.common.enums.WarehouseModeEnum;
  20. import com.xjrsoft.common.exception.MyException;
  21. import com.xjrsoft.common.page.ConventPage;
  22. import com.xjrsoft.common.utils.LocalDateTimeUtil;
  23. import com.xjrsoft.common.utils.VoToColumnUtil;
  24. import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
  25. import com.xjrsoft.module.base.entity.BaseClass;
  26. import com.xjrsoft.module.base.entity.BaseCourseSubject;
  27. import com.xjrsoft.module.base.entity.BaseGrade;
  28. import com.xjrsoft.module.base.entity.BaseSemester;
  29. import com.xjrsoft.module.generator.constant.ComponentTypeConstant;
  30. import com.xjrsoft.module.generator.entity.ColumnConfig;
  31. import com.xjrsoft.module.generator.entity.ImportConfig;
  32. import com.xjrsoft.module.system.entity.DictionaryDetail;
  33. import com.xjrsoft.module.teacher.entity.XjrUser;
  34. import com.xjrsoft.module.textbook.dto.*;
  35. import com.xjrsoft.module.textbook.entity.*;
  36. import com.xjrsoft.module.textbook.mapper.*;
  37. import com.xjrsoft.module.textbook.service.ITextbookSubscriptionService;
  38. import com.xjrsoft.module.textbook.vo.*;
  39. import com.xjrsoft.module.veb.util.ImportExcelUtil;
  40. import com.xjrsoft.module.veb.vo.InternshipPlanImportVo;
  41. import lombok.AllArgsConstructor;
  42. import oracle.sql.INTERVALDS;
  43. import org.apache.commons.lang3.ObjectUtils;
  44. import org.apache.commons.lang3.StringUtils;
  45. import org.apache.poi.ss.usermodel.*;
  46. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  47. import org.springframework.beans.BeanUtils;
  48. import org.springframework.stereotype.Service;
  49. import org.springframework.transaction.annotation.Transactional;
  50. import java.io.ByteArrayOutputStream;
  51. import java.io.IOException;
  52. import java.io.InputStream;
  53. import java.math.BigDecimal;
  54. import java.sql.Time;
  55. import java.sql.Timestamp;
  56. import java.time.LocalDateTime;
  57. import java.time.LocalTime;
  58. import java.time.ZoneId;
  59. import java.time.format.DateTimeFormatter;
  60. import java.util.*;
  61. import java.util.concurrent.atomic.AtomicReference;
  62. import java.util.regex.Matcher;
  63. import java.util.regex.Pattern;
  64. import java.util.stream.Collectors;
  65. /**
  66. * @title: 教材教辅征订记录表
  67. * @Author dzx
  68. * @Date: 2024-12-16
  69. * @Version 1.0
  70. */
  71. @Service
  72. @AllArgsConstructor
  73. public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<TextbookSubscriptionMapper, TextbookSubscription> implements ITextbookSubscriptionService {
  74. private final TextbookSubscriptionMapper textbookSubscriptionTextbookSubscriptionMapper;
  75. private final TextbookSubscriptionItemMapper textbookSubscriptionTextbookSubscriptionItemMapper;
  76. private final TextbookSubscriptionClassMapper textbookSubscriptionClassMapper;
  77. private final TextbookSubscriptionItemClassMapper textbookSubscriptionItemClassMapper;
  78. private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
  79. private final TextbookSubscriptionItemHistoryMapper textbookSubscriptionItemHistoryMapper;
  80. private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper;
  81. @Override
  82. public IPage<TextbookSubscriptionPageVo> pageRubAndHand(TextbookSubscriptionPageDto dto) {
  83. MPJLambdaWrapper<TextbookSubscription> queryWrapper = new MPJLambdaWrapper<>();
  84. queryWrapper
  85. .select(TextbookSubscription::getId)
  86. .selectAs(BaseSemester::getName, TextbookSubscriptionPageVo::getBaseSemesterIdCn)
  87. .select(TextbookSubscription.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionPageVo.class).contains(x.getProperty()))
  88. .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookSubscription::getBaseSemesterId)
  89. .eq(dto.getBaseSemesterId() != null && dto.getBaseSemesterId() > 0, TextbookSubscription::getBaseSemesterId, dto.getBaseSemesterId())
  90. .eq(dto.getSubscriptionMethod() != null && dto.getSubscriptionMethod() > 0, TextbookSubscription::getSubscriptionMethod, dto.getSubscriptionMethod())
  91. .eq(StringUtils.isNotBlank(dto.getId()), TextbookSubscription::getId, dto.getId())
  92. .orderByDesc(TextbookSubscription::getCreateDate)
  93. ;
  94. return this.selectJoinListPage(ConventPage.getPage(dto), TextbookSubscriptionPageVo.class, queryWrapper);
  95. }
  96. @Override
  97. public IPage<InstockroomRecordsPageVo> instockroomRecordsPage(InstockroomRecordsPageDto dto) {
  98. MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
  99. textbookWarehouseRecordMPJLambdaWrapper
  100. .disableSubLogicDel()
  101. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(InstockroomRecordsPageVo.class).contains(x.getProperty()))
  102. .selectAs(TextbookWarehouseRecord::getDiscount, InstockroomRecordsPageVo::getActualDiscount)
  103. .selectAs(TextbookWarehouseRecord::getSubtotal, InstockroomRecordsPageVo::getActualPrice)
  104. .selectAs(TextbookWarehouseRecordDetail::getWarehouseNumber, InstockroomRecordsPageVo::getWarehouseNumber)
  105. .selectAs(TextbookWarehouseRecordDetail::getCreateDate, InstockroomRecordsPageVo::getCreateDate)
  106. .innerJoin(TextbookWarehouseRecordDetail.class, TextbookWarehouseRecordDetail::getTextbookWarehouseRecordId, TextbookWarehouseRecord::getId)
  107. .leftJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId)
  108. .leftJoin(TextbookSubscriptionItem.class, TextbookSubscriptionItem::getId, TextbookWarehouseRecord::getDataItemId,
  109. wrapper -> wrapper
  110. .selectAs(TextbookSubscriptionItem::getStudentNum, InstockroomRecordsPageVo::getStudentNum)
  111. .selectAs(TextbookSubscriptionItem::getTeacherNum, InstockroomRecordsPageVo::getTeacherNum)
  112. .select("t3.student_num + t3.teacher_num as tatol_num")
  113. )
  114. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  115. wrapper -> wrapper
  116. .selectAs(BaseCourseSubject::getName, InstockroomRecordsPageVo::getCourseSubjectIdCn)
  117. )
  118. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  119. wrapper -> wrapper
  120. .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getTextbookTypeCn)
  121. )
  122. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecordDetail::getWarehouseMode,
  123. wrapper -> wrapper
  124. .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getWarehouseModeCn)
  125. )
  126. .leftJoin(XjrUser.class, XjrUser::getId, TextbookWarehouseRecordDetail::getCreateUserId,
  127. wrapper -> wrapper
  128. .selectAs(XjrUser::getName, InstockroomRecordsPageVo::getCreateUserIdCn)
  129. )
  130. .eq(TextbookWarehouseRecord::getDataId, dto.getId())
  131. .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  132. .eq(TextbookWarehouseRecordDetail::getDeleteMark, DeleteMark.NODELETE.getCode())
  133. .eq(Textbook::getDeleteMark, DeleteMark.NODELETE.getCode())
  134. .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  135. ;
  136. return textbookWarehouseRecordMapper.selectJoinPage(ConventPage.getPage(dto), InstockroomRecordsPageVo.class, textbookWarehouseRecordMPJLambdaWrapper);
  137. }
  138. @Override
  139. public List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto) {
  140. MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
  141. queryWrapper
  142. .disableSubLogicDel()
  143. .selectAs(Textbook::getPrice, TextbookInstockroomListVo::getPrice)
  144. .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount)
  145. .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice)
  146. .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookInstockroomListVo::getStudentSubscriptionNumber)
  147. .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookInstockroomListVo::getTeacherSubscriptionNumber)
  148. .selectAs(TextbookSubscriptionItem::getId, TextbookInstockroomListVo::getTextbookSubscriptionItemId)
  149. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
  150. .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
  151. // .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice)
  152. // .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount)
  153. .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
  154. .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getDataItemId, TextbookSubscriptionItem::getId)
  155. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  156. wrapper -> wrapper
  157. .selectAs(BaseCourseSubject::getName, TextbookInstockroomListVo::getCourseName)
  158. .like(StringUtils.isNotEmpty(dto.getCourseName()), BaseCourseSubject::getName, dto.getCourseName())
  159. )
  160. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  161. wrapper -> wrapper
  162. .selectAs(DictionaryDetail::getName, TextbookInstockroomListVo::getTextbookTypeCn)
  163. )
  164. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId())
  165. .like(StringUtils.isNotEmpty(dto.getBookName()), Textbook::getBookName, dto.getBookName())
  166. .like(StringUtils.isNotEmpty(dto.getIssn()), Textbook::getIssn, dto.getIssn())
  167. .orderByAsc(TextbookSubscriptionItem::getInStockNum)
  168. ;
  169. return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookInstockroomListVo.class, queryWrapper);
  170. }
  171. @Override
  172. public List<TextbookInstockroomOnceListVo> everyInstockroomList(TextbookInstockroomOnceListDto dto) {
  173. MPJLambdaWrapper<TextbookWarehouseRecord> queryWrapper = new MPJLambdaWrapper<>();
  174. queryWrapper
  175. .select(TextbookSubscriptionItem::getId)
  176. .selectAs(TextbookWarehouseRecord::getWarehouseNumber, TextbookInstockroomOnceListVo::getOnceInStockNum)
  177. .selectAs(TextbookWarehouseRecord::getCreateDate, TextbookInstockroomOnceListVo::getCreateDate)
  178. .selectAs(TextbookWarehouseRecord::getCreateUserId, TextbookInstockroomOnceListVo::getCreateUserId)
  179. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomOnceListVo.class).contains(x.getProperty()))
  180. .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
  181. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  182. wrapper -> wrapper
  183. .selectAs(BaseCourseSubject::getName, TextbookInstockroomOnceListVo::getCourseName)
  184. )
  185. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  186. wrapper -> wrapper
  187. .selectAs(DictionaryDetail::getName, TextbookInstockroomOnceListVo::getTextbookTypeCn)
  188. )
  189. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId())
  190. .orderByAsc(TextbookSubscriptionItem::getInStockNum)
  191. ;
  192. return textbookWarehouseRecordMapper.selectJoinList(TextbookInstockroomOnceListVo.class, queryWrapper);
  193. }
  194. @Override
  195. public TextbookSubscriptionVo infoRubAndHand(Long id) {
  196. TextbookSubscription textbookSubscription = this.getById(id);
  197. TextbookSubscriptionVo textbookSubscriptionVo = BeanUtil.toBean(textbookSubscription, TextbookSubscriptionVo.class);
  198. MPJLambdaWrapper<TextbookSubscriptionItem> textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
  199. textbookSubscriptionItemMPJLambdaWrapper
  200. .select(TextbookSubscriptionItem::getId)
  201. .select(TextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemVo.class).contains(x.getProperty()))
  202. .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId,
  203. wrapper -> wrapper
  204. .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemVo.class).contains(x.getProperty()))
  205. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  206. wp -> wp
  207. .selectAs(BaseCourseSubject::getName, TextbookSubscriptionItemVo::getCourseSubjectIdCn)
  208. )
  209. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  210. wp -> wp
  211. .selectAs(DictionaryDetail::getName, TextbookSubscriptionItemVo::getTextbookTypeCn)
  212. )
  213. )
  214. .selectAs(TextbookSubscriptionItem::getPrice, TextbookSubscriptionItemVo::getPricing)
  215. .selectAs(Textbook::getPrice, TextbookSubscriptionItemVo::getPrice)
  216. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, id)
  217. ;
  218. List<TextbookSubscriptionItemVo> list = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionItemVo.class, textbookSubscriptionItemMPJLambdaWrapper);
  219. textbookSubscriptionVo.setTextbookSubscriptionItemList(list);
  220. return textbookSubscriptionVo;
  221. }
  222. @Override
  223. public TextbookSubscriptionDetailVo detail(Long id) {
  224. TextbookSubscription textbookSubscription = this.getById(id);
  225. if (ObjectUtils.isEmpty(textbookSubscription)) {
  226. throw new MyException("证订记录被修改,请刷新重试");
  227. }
  228. // 获取所有的证订项目
  229. LambdaQueryWrapper<TextbookSubscriptionItem> subscriptionItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
  230. subscriptionItemLambdaQueryWrapper
  231. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, id)
  232. .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  233. ;
  234. List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(subscriptionItemLambdaQueryWrapper);
  235. int stuNum = 0;
  236. int teaNum = 0;
  237. BigDecimal totalPrice = BigDecimal.valueOf(0);
  238. BigDecimal currentPrice;
  239. BigDecimal currentTotalPrice;
  240. for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscriptionItemList) {
  241. stuNum += textbookSubscriptionItem.getStudentNum();
  242. teaNum += textbookSubscriptionItem.getTeacherNum();
  243. currentPrice = textbookSubscriptionItem.getPrice();
  244. currentTotalPrice = currentPrice.multiply(BigDecimal.valueOf(textbookSubscriptionItem.getTeacherNum() + textbookSubscriptionItem.getStudentNum()));
  245. totalPrice = totalPrice.add(currentTotalPrice);
  246. }
  247. TextbookSubscriptionDetailVo textbookSubscriptionDetailVo = new TextbookSubscriptionDetailVo();
  248. textbookSubscriptionDetailVo.setId(String.valueOf(id));
  249. textbookSubscriptionDetailVo.setStudentTatolNum(stuNum);
  250. textbookSubscriptionDetailVo.setTeacherTatolNum(teaNum);
  251. textbookSubscriptionDetailVo.setSum(stuNum + teaNum);
  252. textbookSubscriptionDetailVo.setSumPrice(totalPrice);
  253. return textbookSubscriptionDetailVo;
  254. }
  255. @Override
  256. public IPage<TextbookSubscriptionItemPageVo> itemPage(TextbookSubscriptionItemPageDto dto) {
  257. MPJLambdaWrapper<TextbookSubscriptionItem> textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
  258. textbookSubscriptionItemMPJLambdaWrapper
  259. .select(TextbookSubscriptionItem::getId)
  260. .select(TextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemPageVo.class).contains(x.getProperty()))
  261. .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId,
  262. wrapper -> wrapper
  263. .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemPageVo.class).contains(x.getProperty()))
  264. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  265. wp -> wp
  266. .selectAs(BaseCourseSubject::getName, TextbookSubscriptionItemPageVo::getCourseSubjectIdCn)
  267. .like(StringUtils.isNotBlank(dto.getCourseSubjectIdCn()), BaseCourseSubject::getName, dto.getCourseSubjectIdCn())
  268. )
  269. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  270. wp -> wp
  271. .selectAs(DictionaryDetail::getName, TextbookSubscriptionItemPageVo::getTextbookTypeCn)
  272. )
  273. .like(StringUtils.isNotBlank(dto.getBookName()), Textbook::getBookName, dto.getBookName())
  274. .eq(StringUtils.isNotBlank(dto.getTextbookType()), Textbook::getTextbookType, dto.getTextbookType())
  275. )
  276. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId())
  277. ;
  278. IPage<TextbookSubscriptionItemPageVo> page = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinPage(ConventPage.getPage(dto), TextbookSubscriptionItemPageVo.class, textbookSubscriptionItemMPJLambdaWrapper);
  279. return page;
  280. }
  281. @Override
  282. public IPage<BaseclassPageVo> baseclassPage(BaseclassPageDto dto) {
  283. // 查询征订记录总的征订班级
  284. MPJLambdaWrapper<TextbookSubscriptionItem> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
  285. baseClassMPJLambdaWrapper
  286. .disableSubLogicDel()
  287. .distinct()
  288. .selectAs(BaseGrade::getName, BaseclassPageVo::getGradeIdCn)
  289. .selectAs(XjrUser::getName, BaseclassPageVo::getTeacherIdCn)
  290. .select(" (select" +
  291. " count(a.id)" +
  292. " from base_student_school_roll a" +
  293. " where a.class_id = t1.base_class_id" +
  294. " and a.archives_status = 'FB2901'" +
  295. " and a.delete_mark = 0" +
  296. " ) as total_student")
  297. .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseclassPageVo.class).contains(x.getProperty()))
  298. .innerJoin(TextbookSubscriptionItemClass.class, TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, TextbookSubscriptionItem::getId)
  299. .leftJoin(BaseClass.class, BaseClass::getId, TextbookSubscriptionItemClass::getBaseClassId)
  300. .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId)
  301. .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
  302. .eq(ObjectUtils.isNotEmpty(dto.getId()), TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getId())
  303. .eq(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId()), TextbookSubscriptionItem::getId, dto.getTextbookSubscriptionItemId())
  304. .eq(TextbookSubscriptionClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  305. ;
  306. return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinPage(ConventPage.getPage(dto), BaseclassPageVo.class, baseClassMPJLambdaWrapper);
  307. }
  308. @Override
  309. public List<SubscriptionItemListDistributeVo> itemListConfirmDistribute(SubscriptionItemListDistributeDto dto) {
  310. MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
  311. textbookWarehouseRecordMPJLambdaWrapper
  312. .disableSubLogicDel()
  313. .select(TextbookWarehouseRecord::getId)
  314. .selectAs(TextbookWarehouseRecord::getSubtotal, SubscriptionItemListDistributeVo::getActulPrice)
  315. .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(SubscriptionItemListDistributeVo.class).contains(x.getProperty()))
  316. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecord::getWarehouseMode,
  317. wrapper -> wrapper
  318. .selectAs(DictionaryDetail::getName, SubscriptionItemListDistributeVo::getWarehouseModeCn)
  319. )
  320. .eq(TextbookWarehouseRecord::getTextbookId, dto.getTextbookId())
  321. .gt(TextbookWarehouseRecord::getRemainNumber, 0)
  322. .orderByAsc(TextbookWarehouseRecord::getCreateDate)
  323. ;
  324. return textbookWarehouseRecordMapper.selectJoinList(SubscriptionItemListDistributeVo.class, textbookWarehouseRecordMPJLambdaWrapper);
  325. }
  326. @Override
  327. @Transactional(rollbackFor = Exception.class)
  328. public Boolean add(TextbookSubscription textbookSubscription) {
  329. // 处理征订表
  330. int sum = 0;
  331. for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) {
  332. textbookSubscriptionItem.setStudentNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getStudentNum()) ? 0 : textbookSubscriptionItem.getStudentNum());
  333. textbookSubscriptionItem.setTeacherNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getTeacherNum()) ? 0 : textbookSubscriptionItem.getTeacherNum());
  334. sum += textbookSubscriptionItem.getStudentNum() + textbookSubscriptionItem.getTeacherNum();
  335. }
  336. textbookSubscription.setSum(sum);
  337. textbookSubscription.setCreateDate(new Date());
  338. // 处理征订单号
  339. StringBuilder sb = new StringBuilder();
  340. sb.append("ZD");
  341. LocalDateTime now = LocalDateTime.now();
  342. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  343. String nowStr = now.format(dateTimeFormatter);
  344. sb.append(nowStr);
  345. // 根据当前征订编号前缀去数据库找是否已经存在了
  346. LambdaQueryWrapper<TextbookSubscription> textbookSubscriptionLambdaQueryWrapper = new LambdaQueryWrapper<>();
  347. textbookSubscriptionLambdaQueryWrapper
  348. .like(TextbookSubscription::getOrderNumber, sb.toString() + "%")
  349. .eq(TextbookSubscription::getDeleteMark, DeleteMark.NODELETE.getCode())
  350. .orderByDesc(TextbookSubscription::getOrderNumber)
  351. .last("limit 1")
  352. ;
  353. TextbookSubscription maxOrderNumber = textbookSubscriptionTextbookSubscriptionMapper.selectOne(textbookSubscriptionLambdaQueryWrapper);
  354. int oldOrderInteger = 1;
  355. if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){
  356. String oldOrderNumber = maxOrderNumber.getOrderNumber();
  357. String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
  358. oldOrderInteger = Integer.parseInt(oldOrder);
  359. oldOrderInteger += 1;
  360. }
  361. String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
  362. textbookSubscription.setOrderNumber(sb + newOrder);
  363. textbookSubscriptionTextbookSubscriptionMapper.insert(textbookSubscription);
  364. // // 处理征订和班级关联表
  365. // if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
  366. // && textbookSubscription.getSubscriptionMethod() == 1
  367. // && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
  368. // ) {
  369. // String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
  370. // TextbookSubscriptionClass textbookSubscriptionClass;
  371. // for (String str : classIdArr) {
  372. // textbookSubscriptionClass = new TextbookSubscriptionClass();
  373. // textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
  374. // textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
  375. // textbookSubscriptionClass.setCreateDate(new Date());
  376. // textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
  377. // }
  378. // }
  379. // 处理征订项
  380. TextbookSubscriptionItemClass textbookSubscriptionItemClass;
  381. for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) {
  382. String[] classIdArr = new String[0];
  383. if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
  384. && textbookSubscription.getSubscriptionMethod() == 1
  385. && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getClassIds())
  386. ) {
  387. classIdArr = textbookSubscriptionItem.getClassIds().split(",");
  388. }
  389. textbookSubscriptionItem.setUseClassNum(classIdArr.length);
  390. textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId());
  391. textbookSubscriptionItem.setCreateDate(new Date());
  392. textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem);
  393. // 处理征订项和班级关联表
  394. for (String str : classIdArr) {
  395. textbookSubscriptionItemClass = new TextbookSubscriptionItemClass();
  396. textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId());
  397. textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str));
  398. textbookSubscriptionItemClass.setCreateDate(new Date());
  399. textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass);
  400. }
  401. }
  402. return true;
  403. }
  404. @Override
  405. @Transactional(rollbackFor = Exception.class)
  406. public Boolean instockroom(List<TextbookInstockroomDto> dtos) {
  407. if (dtos.isEmpty()) {
  408. return false;
  409. }
  410. TextbookSubscription textbookSubscription = this.getById(dtos.get(0).getTextbookSubscriptionId());
  411. if (ObjectUtils.isEmpty(textbookSubscription)) {
  412. throw new MyException("请选择需要入库的征订记录");
  413. }
  414. List<Long> textbookSubscriptionItemIds = new ArrayList<>();
  415. for (TextbookInstockroomDto dto : dtos) {
  416. if(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())){
  417. textbookSubscriptionItemIds.add(dto.getTextbookSubscriptionItemId());
  418. }
  419. }
  420. if (textbookSubscriptionItemIds.isEmpty()) {
  421. throw new MyException("请选择需要入库的教材");
  422. }
  423. //获取需要修改的list
  424. LambdaQueryWrapper<TextbookSubscriptionItem> queryWrapper = new LambdaQueryWrapper<>();
  425. queryWrapper
  426. .select(TextbookSubscriptionItem::getId)
  427. .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItem.class).contains(x.getProperty()))
  428. .in(TextbookSubscriptionItem::getId, textbookSubscriptionItemIds)
  429. .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  430. ;
  431. List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(queryWrapper);
  432. if (textbookSubscriptionItemList.isEmpty()) {
  433. throw new MyException("证订项已经变更,请刷新重试");
  434. }
  435. Map<Long, TextbookSubscriptionItem> itemByIdMap = new HashMap<>();
  436. for (TextbookSubscriptionItem el : textbookSubscriptionItemList) {
  437. if(ObjectUtils.isNotEmpty(el.getId()) && !itemByIdMap.containsKey(el.getId())){
  438. itemByIdMap.put(el.getId(), el);
  439. }
  440. }
  441. // 获取当前征订已经产生的入库记录
  442. LambdaQueryWrapper<TextbookWarehouseRecord> textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
  443. textbookWarehouseRecordLambdaQueryWrapper
  444. .eq(TextbookWarehouseRecord::getDataId, textbookSubscription.getId())
  445. .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  446. ;
  447. List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper);
  448. Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordByItemIdMap = new HashMap<>();
  449. for (TextbookWarehouseRecord twr : textbookWarehouseRecords) {
  450. if(ObjectUtils.isNotEmpty(twr.getDataItemId()) && !textbookWarehouseRecordByItemIdMap.containsKey(twr.getDataItemId())){
  451. textbookWarehouseRecordByItemIdMap.put(twr.getDataItemId(), twr);
  452. }
  453. }
  454. // 处理入库单号
  455. StringBuilder sb = new StringBuilder();
  456. sb.append("RK");
  457. LocalDateTime now = LocalDateTime.now();
  458. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  459. String nowStr = now.format(dateTimeFormatter);
  460. sb.append(nowStr);
  461. // 根据当前征订编号前缀去数据库找是否已经存在了
  462. LambdaQueryWrapper<TextbookWarehouseRecord> maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>();
  463. maxOrderNumberLambdaQueryWrapper
  464. .like(TextbookWarehouseRecord::getOrderNumber, sb.toString() + "%")
  465. .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  466. .orderByDesc(TextbookWarehouseRecord::getOrderNumber)
  467. .last("limit 1")
  468. ;
  469. TextbookWarehouseRecord maxOrderNumber = textbookWarehouseRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper);
  470. int oldOrderInteger = 0;
  471. if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){
  472. String oldOrderNumber = maxOrderNumber.getOrderNumber();
  473. String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
  474. oldOrderInteger = Integer.parseInt(oldOrder);
  475. }
  476. // 处理入库细节
  477. TextbookSubscriptionItem old = null;
  478. TextbookSubscriptionItem updateItem;
  479. TextbookWarehouseRecord textbookWarehouseRecord;
  480. TextbookWarehouseRecord oldTextbookWarehouseRecord = null;
  481. TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
  482. for (TextbookInstockroomDto dto : dtos) {
  483. if (ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())) {
  484. old = itemByIdMap.get(dto.getTextbookSubscriptionItemId());
  485. oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(dto.getTextbookSubscriptionItemId());
  486. }
  487. if (ObjectUtils.isEmpty(old)) {
  488. continue;
  489. }
  490. updateItem = new TextbookSubscriptionItem();
  491. updateItem.setId(old.getId());
  492. updateItem.setDiscount(ObjectUtils.isNotEmpty(dto.getDiscount()) ? dto.getDiscount() : 10);
  493. updateItem.setPrice(dto.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
  494. updateItem.setInStockNum(old.getInStockNum() + dto.getInNum());
  495. updateItem.setModifyDate(new Date());
  496. updateItem.setModifyUserId(StpUtil.getLoginIdAsLong());
  497. textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem);
  498. // 判断当前征订中的当前教材是否已经有了入库记录
  499. // 当前征订项第一次入库
  500. long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId();
  501. if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) {
  502. //新增入库记录
  503. textbookWarehouseRecord = new TextbookWarehouseRecord();
  504. textbookWarehouseRecord.setId(textbookWarehouseRecordId);
  505. textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId());
  506. textbookWarehouseRecord.setTextbookId(old.getTextbookId());
  507. textbookWarehouseRecord.setDataId(dto.getTextbookSubscriptionId());
  508. textbookWarehouseRecord.setDataItemId(dto.getTextbookSubscriptionItemId());
  509. textbookWarehouseRecord.setWarehouseNumber(ObjectUtils.isNotEmpty(dto.getInNum()) ? dto.getInNum() : 0);
  510. textbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(dto.getPrice()) ? dto.getPrice() : BigDecimal.ZERO);
  511. textbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(dto.getDiscount()) ? dto.getDiscount() : 10D);
  512. textbookWarehouseRecord.setSubtotal(dto.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
  513. textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
  514. oldOrderInteger += 1;
  515. String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
  516. textbookWarehouseRecord.setOrderNumber(sb + newOrder);
  517. textbookWarehouseRecord.setReturnBookstoreNumber(0);
  518. textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber());
  519. textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
  520. textbookWarehouseRecord.setIssuedNumber(0);
  521. textbookWarehouseRecord.setRecedeNumber(0);
  522. textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber());
  523. textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
  524. textbookWarehouseRecord.setCreateDate(new Date());
  525. textbookWarehouseRecord.setCreateUserId(StpUtil.getLoginIdAsLong());
  526. textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
  527. }else {
  528. textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId();
  529. textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class);
  530. textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + dto.getInNum());
  531. textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
  532. textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + dto.getInNum());
  533. textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
  534. textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + dto.getInNum());
  535. textbookWarehouseRecord.setModifyDate(new Date());
  536. textbookWarehouseRecord.setModifyUserId(StpUtil.getLoginIdAsLong());
  537. textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord);
  538. }
  539. // 新增教材入库记录详细入库记录
  540. textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
  541. textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
  542. textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
  543. textbookWarehouseRecordDetail.setWarehouseNumber(dto.getInNum());
  544. textbookWarehouseRecordDetail.setCreateDate(new Date());
  545. textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
  546. }
  547. return true;
  548. }
  549. @Override
  550. @Transactional(rollbackFor = Exception.class)
  551. public String instockroomExcelImport(InputStream inputStream) {
  552. List<TextbookSubscriptionExportQueryListVo> excelDataList = EasyExcel.read(inputStream).headRowNumber(3).head(TextbookSubscriptionExportQueryListVo.class).sheet().doReadSync();
  553. List<Long> idList = excelDataList.stream()
  554. .map(t -> Long.parseLong(t.getTextbookSubscriptionItemId()))
  555. .collect(Collectors.toList());
  556. //获取需要修改的list
  557. LambdaQueryWrapper<TextbookSubscriptionItem> queryWrapper = new LambdaQueryWrapper<>();
  558. queryWrapper
  559. .in(TextbookSubscriptionItem::getId, idList)
  560. .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  561. ;
  562. List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(queryWrapper);
  563. if (ObjectUtils.isEmpty(textbookSubscriptionItemList)) {
  564. throw new MyException("征订数据被修改,请刷新重试");
  565. }
  566. Map<Long, TextbookSubscriptionItem> byIdMap = textbookSubscriptionItemList.stream()
  567. .collect(Collectors.toMap(TextbookSubscriptionItem::getId, t -> t, (t1, t2) -> t1));
  568. TextbookSubscription textbookSubscription = this.getById(textbookSubscriptionItemList.get(0).getTextbookSubscriptionId());
  569. if (ObjectUtils.isEmpty(textbookSubscription)) {
  570. throw new MyException("需要入库对应的征订记录失效");
  571. }
  572. // 获取当前征订已经产生的入库记录
  573. LambdaQueryWrapper<TextbookWarehouseRecord> textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
  574. textbookWarehouseRecordLambdaQueryWrapper
  575. .in(TextbookWarehouseRecord::getDataItemId, idList)
  576. .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  577. ;
  578. List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper);
  579. Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordByItemIdMap = textbookWarehouseRecords.stream()
  580. .collect(Collectors.toMap(TextbookWarehouseRecord::getDataItemId, t -> t, (t1, t2) -> t2));
  581. // 处理入库单号
  582. StringBuilder sb = new StringBuilder();
  583. sb.append("RK");
  584. LocalDateTime now = LocalDateTime.now();
  585. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  586. String nowStr = now.format(dateTimeFormatter);
  587. sb.append(nowStr);
  588. // 根据当前征订编号前缀去数据库找是否已经存在了
  589. LambdaQueryWrapper<TextbookWarehouseRecord> maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>();
  590. maxOrderNumberLambdaQueryWrapper
  591. .like(TextbookWarehouseRecord::getOrderNumber, sb.toString() + "%")
  592. .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  593. .orderByDesc(TextbookWarehouseRecord::getOrderNumber)
  594. .last("limit 1")
  595. ;
  596. TextbookWarehouseRecord maxOrderNumber = textbookWarehouseRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper);
  597. int oldOrderInteger = 0;
  598. if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){
  599. String oldOrderNumber = maxOrderNumber.getOrderNumber();
  600. String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
  601. oldOrderInteger = Integer.parseInt(oldOrder);
  602. }
  603. int successNum = 0;
  604. int instockroomNum = 0;
  605. // 处理入库细节
  606. TextbookSubscriptionItem oldItem;
  607. TextbookSubscriptionItem updateItem;
  608. TextbookWarehouseRecord oldTextbookWarehouseRecord;
  609. TextbookWarehouseRecord textbookWarehouseRecord;
  610. TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
  611. Date nowDate = new Date();
  612. Long loginId = StpUtil.getLoginIdAsLong();
  613. for (int i = 0; i < excelDataList.size(); i++){
  614. TextbookSubscriptionExportQueryListVo vo = excelDataList.get(i);
  615. if(ObjectUtils.isEmpty(vo)){
  616. throw new MyException("第" + (i + 4) + "行数据写入失败,请刷新重试");
  617. }
  618. if(ObjectUtils.isEmpty(vo.getInNum()) || vo.getInNum() <= 0){
  619. continue;
  620. }
  621. if(StringUtils.isEmpty(vo.getTextbookSubscriptionItemId())){
  622. throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板");
  623. }
  624. oldItem = byIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId()));
  625. if(ObjectUtils.isEmpty(oldItem)){
  626. throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板");
  627. }
  628. oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId()));
  629. updateItem = new TextbookSubscriptionItem();
  630. updateItem.setId(oldItem.getId());
  631. if(ObjectUtils.isEmpty(oldItem.getInStockNum()) || oldItem.getInStockNum() <= 0){
  632. updateItem.setDiscount(ObjectUtils.isNotEmpty(vo.getDiscount()) ? vo.getDiscount() : 10);
  633. updateItem.setPrice(vo.getPrice().multiply(BigDecimal.valueOf(vo.getDiscount() / 10)));
  634. }
  635. updateItem.setInStockNum(oldItem.getInStockNum() + vo.getInNum());
  636. updateItem.setModifyDate(nowDate);
  637. updateItem.setModifyUserId(loginId);
  638. textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem);
  639. // 判断当前征订中的当前教材是否已经有了入库记录
  640. // 当前征订项第一次入库
  641. long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId();
  642. if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) {
  643. //新增入库记录
  644. textbookWarehouseRecord = new TextbookWarehouseRecord();
  645. textbookWarehouseRecord.setId(textbookWarehouseRecordId);
  646. textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId());
  647. textbookWarehouseRecord.setTextbookId(oldItem.getTextbookId());
  648. textbookWarehouseRecord.setDataId(oldItem.getTextbookSubscriptionId());
  649. textbookWarehouseRecord.setDataItemId(oldItem.getId());
  650. textbookWarehouseRecord.setWarehouseNumber(ObjectUtils.isNotEmpty(vo.getInNum()) ? vo.getInNum() : 0);
  651. textbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(oldItem.getPrice()) ? oldItem.getPrice() : BigDecimal.ZERO);
  652. textbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(updateItem.getDiscount()) ? updateItem.getDiscount() : oldItem.getDiscount());
  653. textbookWarehouseRecord.setSubtotal(textbookWarehouseRecord.getPrice().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getDiscount() / 10)));
  654. textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
  655. oldOrderInteger += 1;
  656. String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
  657. textbookWarehouseRecord.setOrderNumber(sb + newOrder);
  658. textbookWarehouseRecord.setReturnBookstoreNumber(0);
  659. textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber());
  660. textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
  661. textbookWarehouseRecord.setIssuedNumber(0);
  662. textbookWarehouseRecord.setRecedeNumber(0);
  663. textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber());
  664. textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
  665. textbookWarehouseRecord.setCreateDate(nowDate);
  666. textbookWarehouseRecord.setCreateUserId(loginId);
  667. textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
  668. }else {
  669. textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId();
  670. textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class);
  671. textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + vo.getInNum());
  672. textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
  673. textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + vo.getInNum());
  674. textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
  675. textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + vo.getInNum());
  676. textbookWarehouseRecord.setModifyDate(nowDate);
  677. textbookWarehouseRecord.setModifyUserId(loginId);
  678. textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord);
  679. }
  680. // 新增教材入库记录详细入库记录
  681. textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
  682. textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
  683. textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
  684. textbookWarehouseRecordDetail.setWarehouseNumber(vo.getInNum());
  685. textbookWarehouseRecordDetail.setCreateDate(nowDate);
  686. textbookWarehouseRecordDetail.setCreateUserId(loginId);
  687. textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
  688. successNum += 1;
  689. instockroomNum += vo.getInNum();
  690. }
  691. return "成功入库" + successNum + "样,成功入库" + instockroomNum + "本";
  692. }
  693. @Override
  694. @Transactional(rollbackFor = Exception.class)
  695. public Boolean update(TextbookSubscription textbookSubscription) {
  696. int sum = 0;
  697. //********************************* TextbookSubscriptionItem 增删改 开始 *******************************************/
  698. {
  699. // 查出所有子级的id
  700. List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(
  701. Wrappers.lambdaQuery(TextbookSubscriptionItem.class)
  702. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, textbookSubscription.getId())
  703. .select(TextbookSubscriptionItem::getId));
  704. List<Long> textbookSubscriptionItemIds = textbookSubscriptionItemList.stream()
  705. .map(TextbookSubscriptionItem::getId)
  706. .collect(Collectors.toList());
  707. // 原有子表单 没有被删除的主键
  708. List<Long> textbookSubscriptionItemOldIds = textbookSubscription.getTextbookSubscriptionItemList().stream()
  709. .map(TextbookSubscriptionItem::getId)
  710. .filter(Objects::nonNull)
  711. .collect(Collectors.toList());
  712. // 找到需要删除的id
  713. List<Long> textbookSubscriptionItemRemoveIds = textbookSubscriptionItemIds.stream()
  714. .filter(item -> !textbookSubscriptionItemOldIds.contains(item))
  715. .collect(Collectors.toList());
  716. TextbookSubscriptionItemClass textbookSubscriptionItemClass;
  717. for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) {
  718. // 如果不等于空则修改
  719. if (textbookSubscriptionItem.getId() != null) {
  720. textbookSubscriptionTextbookSubscriptionItemMapper.updateById(textbookSubscriptionItem);
  721. } else {
  722. // 如果等于空 则新增
  723. // 新增的时候应该处理班级关联
  724. String[] classIdArr = new String[0];
  725. if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
  726. && textbookSubscription.getSubscriptionMethod() == 1
  727. && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getClassIds())
  728. ) {
  729. classIdArr = textbookSubscriptionItem.getClassIds().split(",");
  730. }
  731. textbookSubscriptionItem.setUseClassNum(classIdArr.length);
  732. textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId());
  733. textbookSubscriptionItem.setCreateDate(new Date());
  734. textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem);
  735. // 处理征订项和班级关联表
  736. for (String str : classIdArr) {
  737. textbookSubscriptionItemClass = new TextbookSubscriptionItemClass();
  738. textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId());
  739. textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str));
  740. textbookSubscriptionItemClass.setCreateDate(new Date());
  741. textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass);
  742. }
  743. }
  744. textbookSubscriptionItem.setStudentNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getStudentNum()) ? 0 : textbookSubscriptionItem.getStudentNum());
  745. textbookSubscriptionItem.setTeacherNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getTeacherNum()) ? 0 : textbookSubscriptionItem.getTeacherNum());
  746. sum += textbookSubscriptionItem.getStudentNum() + textbookSubscriptionItem.getTeacherNum();
  747. }
  748. // 已经不存在的id 删除
  749. if (ObjectUtils.isNotEmpty(textbookSubscriptionItemRemoveIds.isEmpty())) {
  750. LambdaUpdateWrapper<TextbookSubscriptionItemClass> textbookSubscriptionItemClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  751. textbookSubscriptionItemClassLambdaUpdateWrapper
  752. .in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemRemoveIds)
  753. .eq(TextbookSubscriptionItemClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  754. ;
  755. textbookSubscriptionItemClassMapper.delete(textbookSubscriptionItemClassLambdaUpdateWrapper);
  756. textbookSubscriptionTextbookSubscriptionItemMapper.deleteBatchIds(textbookSubscriptionItemRemoveIds);
  757. }
  758. }
  759. //********************************* TextbookSubscriptionItem 增删改 结束 *******************************************/
  760. //********************************* TextbookSubscriptionClass 增删改 开始 *******************************************/
  761. // LambdaUpdateWrapper<TextbookSubscriptionClass> textbookSubscriptionClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  762. // textbookSubscriptionClassLambdaUpdateWrapper
  763. // .eq(TextbookSubscriptionClass::getTextbookSubscriptionId, textbookSubscription.getId())
  764. // ;
  765. // textbookSubscriptionClassMapper.delete(textbookSubscriptionClassLambdaUpdateWrapper);
  766. //
  767. // if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
  768. // && textbookSubscription.getSubscriptionMethod() == 1
  769. // && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
  770. // ) {
  771. // String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
  772. // for (String str : classIdArr) {
  773. // TextbookSubscriptionClass textbookSubscriptionClass = new TextbookSubscriptionClass();
  774. // textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
  775. // textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
  776. // textbookSubscriptionClass.setCreateDate(new Date());
  777. // textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
  778. // }
  779. // }
  780. //********************************* TextbookSubscriptionClass 增删改 结束 *******************************************/
  781. textbookSubscription.setSum(sum);
  782. textbookSubscriptionTextbookSubscriptionMapper.updateById(textbookSubscription);
  783. return true;
  784. }
  785. @Override
  786. @Transactional(rollbackFor = Exception.class)
  787. public Boolean alteration(UpdateTextbookSubscriptionItemDto dto) {
  788. TextbookSubscriptionItem old = textbookSubscriptionTextbookSubscriptionItemMapper.selectById(dto.getId());
  789. if(old == null){
  790. throw new MyException("征订项已经被修改,刷新重试");
  791. }
  792. TextbookSubscription textbookSubscription = this.getById(old.getTextbookSubscriptionId());
  793. if(ObjectUtils.isEmpty(textbookSubscription)){
  794. throw new MyException("征订已经被修改,刷新重试");
  795. }
  796. // 判断变更状态
  797. int alterationType = 0;
  798. if(!old.getStudentNum().equals(dto.getStudentNum())
  799. || !old.getTeacherNum().equals(dto.getTeacherNum())
  800. ){
  801. alterationType = 1;
  802. }
  803. if(!old.getTextbookId().equals(dto.getTextbookId())){
  804. alterationType = 2;
  805. }
  806. // 变更征订总数量
  807. TextbookSubscription updateTotalNum = new TextbookSubscription();
  808. if(ObjectUtils.isNotEmpty(textbookSubscription)){
  809. updateTotalNum.setId(textbookSubscription.getId());
  810. updateTotalNum.setSum((ObjectUtils.isNotEmpty(textbookSubscription.getSum()) ? textbookSubscription.getSum() : 0)
  811. + ((ObjectUtils.isNotEmpty(dto.getStudentNum()) ? dto.getStudentNum() : 0)
  812. - (ObjectUtils.isNotEmpty(old.getStudentNum()) ? old.getStudentNum() : 0))
  813. + ((ObjectUtils.isNotEmpty(dto.getTeacherNum()) ? dto.getTeacherNum() : 0)
  814. - (ObjectUtils.isNotEmpty(old.getTeacherNum()) ? old.getTeacherNum() : 0))
  815. );
  816. updateTotalNum.setModifyDate(new Date());
  817. this.updateById(updateTotalNum);
  818. }
  819. // 将历史记录保存到历史变更记录表
  820. // 当前征订项的变更历史最后一次记录
  821. LambdaQueryWrapper<TextbookSubscriptionItemHistory> textbookSubscriptionItemHistoryLambdaQueryWrapper = new LambdaQueryWrapper<>();
  822. textbookSubscriptionItemHistoryLambdaQueryWrapper
  823. .eq(TextbookSubscriptionItemHistory::getTextbookSubscriptionItemId, old.getId())
  824. .orderByDesc(TextbookSubscriptionItemHistory::getHistoryVersion)
  825. .last("limit 1")
  826. ;
  827. TextbookSubscriptionItemHistory lastOne = textbookSubscriptionItemHistoryMapper.selectOne(textbookSubscriptionItemHistoryLambdaQueryWrapper);
  828. // 将变更前的数据记录在历史表中
  829. TextbookSubscriptionItemHistory textbookSubscriptionItemHistory = new TextbookSubscriptionItemHistory();
  830. // 变更前
  831. textbookSubscriptionItemHistory.setOldTextbookId(old.getTextbookId());
  832. textbookSubscriptionItemHistory.setOldStudentNum(old.getStudentNum());
  833. textbookSubscriptionItemHistory.setOldTeacherNum(old.getTeacherNum());
  834. textbookSubscriptionItemHistory.setOldDiscount(old.getDiscount());
  835. textbookSubscriptionItemHistory.setOldPrice(old.getPrice());
  836. textbookSubscriptionItemHistory.setOldInStockNum(old.getInStockNum());
  837. textbookSubscriptionItemHistory.setOldOutStockNum(old.getOutStockNum());
  838. // 变更后
  839. textbookSubscriptionItemHistory.setNewTextbookId(dto.getTextbookId());
  840. textbookSubscriptionItemHistory.setNewStudentNum(dto.getStudentNum());
  841. textbookSubscriptionItemHistory.setNewTeacherNum(dto.getTeacherNum());
  842. textbookSubscriptionItemHistory.setNewDiscount(dto.getDiscount());
  843. textbookSubscriptionItemHistory.setNewPrice(dto.getPrice());
  844. textbookSubscriptionItemHistory.setNewInStockNum(dto.getInStockNum());
  845. textbookSubscriptionItemHistory.setNewOutStockNum(dto.getOutStockNum());
  846. textbookSubscriptionItemHistory.setTextbookSubscriptionId(old.getTextbookSubscriptionId());
  847. textbookSubscriptionItemHistory.setTextbookSubscriptionItemId(old.getId());
  848. textbookSubscriptionItemHistory.setCreateDate(new Date());
  849. textbookSubscriptionItemHistory.setCreateUserId(StpUtil.getLoginIdAsLong());
  850. if(ObjectUtils.isNotEmpty(lastOne)){
  851. textbookSubscriptionItemHistory.setHistoryVersion(lastOne.getHistoryVersion() + 1);
  852. } else {
  853. textbookSubscriptionItemHistory.setHistoryVersion(1);
  854. }
  855. textbookSubscriptionItemHistory.setAlterationType(alterationType);
  856. textbookSubscriptionItemHistoryMapper.insert(textbookSubscriptionItemHistory);
  857. //变更当前记录
  858. TextbookSubscriptionItem updateItem = new TextbookSubscriptionItem();
  859. BeanUtils.copyProperties(dto, updateItem);
  860. updateItem.setAlterationType(alterationType);
  861. textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem);
  862. return true;
  863. }
  864. @Override
  865. @Transactional(rollbackFor = Exception.class)
  866. public Boolean changeStatus(UpdateWfTextbookSubscriptionDto dto) {
  867. TextbookSubscription textbookSubscription = this.getById(dto.getId());
  868. if (textbookSubscription == null) {
  869. return false;
  870. }
  871. TextbookSubscription newT = new TextbookSubscription();
  872. newT.setId(textbookSubscription.getId());
  873. newT.setStatus(dto.getStatus());
  874. return this.updateById(newT);
  875. }
  876. @Override
  877. @Transactional(rollbackFor = Exception.class)
  878. public Boolean delete(List<Long> ids) {
  879. LambdaQueryWrapper<TextbookSubscriptionItem> textbookSubscriptionItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
  880. textbookSubscriptionItemLambdaQueryWrapper
  881. .in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids)
  882. ;
  883. List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(textbookSubscriptionItemLambdaQueryWrapper);
  884. List<Long> textbookSubscriptionItemIds = textbookSubscriptionItemList.stream()
  885. .map(TextbookSubscriptionItem::getId)
  886. .collect(Collectors.toList());
  887. if(ObjectUtils.isNotEmpty(textbookSubscriptionItemIds)){
  888. textbookSubscriptionItemClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItemClass.class).in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemIds));
  889. }
  890. if(ObjectUtils.isNotEmpty(ids)) {
  891. textbookSubscriptionTextbookSubscriptionItemMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItem.class).in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids));
  892. textbookSubscriptionClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionClass.class).in(TextbookSubscriptionClass::getTextbookSubscriptionId, ids));
  893. textbookSubscriptionTextbookSubscriptionMapper.deleteBatchIds(ids);
  894. }
  895. return true;
  896. }
  897. @Override
  898. public ByteArrayOutputStream textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) throws IOException {
  899. MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
  900. queryWrapper
  901. .disableSubLogicDel()
  902. .selectAs(TextbookSubscriptionItem::getId, TextbookSubscriptionExportQueryListVo::getTextbookSubscriptionItemId)
  903. .selectAs(Textbook::getPrice, TextbookSubscriptionExportQueryListVo::getPrice)
  904. .selectAs(TextbookSubscriptionItem::getDiscount, TextbookSubscriptionExportQueryListVo::getDiscount)
  905. .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookSubscriptionExportQueryListVo::getStudentSubscriptionNumber)
  906. .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookSubscriptionExportQueryListVo::getTeacherSubscriptionNumber)
  907. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
  908. .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
  909. .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
  910. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
  911. wrapper -> wrapper
  912. .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
  913. )
  914. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  915. wrapper -> wrapper
  916. .selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn)
  917. )
  918. .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId())
  919. .orderByAsc(TextbookSubscriptionItem::getInStockNum)
  920. ;
  921. List<TextbookSubscriptionExportQueryListVo> vos = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, queryWrapper);
  922. List<List<String>> dataList = new ArrayList<>();
  923. for (TextbookSubscriptionExportQueryListVo vo : vos) {
  924. List<String> data = new ArrayList<>();
  925. data.add(vo.getTextbookSubscriptionItemId());
  926. data.add(vo.getCourseName());
  927. data.add(vo.getBookName());
  928. data.add(vo.getIssn());
  929. data.add(vo.getEditorInChief());
  930. data.add(vo.getPublishingHouse());
  931. data.add(vo.getTextbookTypeCn());
  932. data.add(vo.getVersion());
  933. data.add(vo.getUseType() + "");
  934. data.add(vo.getStudentSubscriptionNumber() + "");
  935. data.add(vo.getTeacherSubscriptionNumber() + "");
  936. data.add(vo.getInStockNum() + "");
  937. data.add(vo.getPrice() + "");
  938. data.add(vo.getDiscount() + "");
  939. dataList.add(data);
  940. }
  941. // 开始写入
  942. Workbook workbook = new XSSFWorkbook();
  943. // 创建一个工作表(sheet)
  944. String sheetName = "sheet1";
  945. Sheet sheet = workbook.createSheet(sheetName);
  946. List<ImportConfig> importConfigs = ImportExcelUtil.allFields(new TextbookSubscriptionExportQueryListVo());
  947. // 写大标题
  948. ImportExcelUtil.createBigHead(workbook, sheet, "教材入库导入模板", 0, importConfigs.size() - 1);
  949. // 提示必填
  950. String cautionHead = "说明:教材的基础信息不能修改,请输入实际折扣和入库数量,然后直接导入当前excel";
  951. ImportExcelUtil.createCautionHead(workbook, sheet, 1, cautionHead, importConfigs.size() - 1, 12, IndexedColors.RED.getIndex());
  952. // 表头
  953. ImportExcelUtil.createHead(workbook, sheet, importConfigs, 2);
  954. //生成数据
  955. int dataRowNumber = 3;
  956. // 字体内容格式
  957. Font font = workbook.createFont();
  958. font.setBold(false);// 设置为粗体
  959. font.setFontName("宋体");
  960. font.setFontHeightInPoints((short)12);
  961. CellStyle cellStyle = workbook.createCellStyle();
  962. cellStyle.setFont(font); // 将字体应用到样式
  963. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  964. cellStyle.setAlignment(HorizontalAlignment.LEFT);
  965. for (List<String> rowData : dataList) {
  966. Row dataRow = sheet.createRow(dataRowNumber);
  967. for (int i = 0; i < rowData.size(); i ++){
  968. String content = rowData.get(i);
  969. Cell cell = dataRow.createCell(i);
  970. cell.setCellValue(content);
  971. cell.setCellStyle(cellStyle);
  972. }
  973. dataRowNumber ++;
  974. }
  975. for (int i = 0; i < importConfigs.size(); i++){
  976. sheet.autoSizeColumn(i);
  977. }
  978. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  979. workbook.write(bot);
  980. return bot;
  981. }
  982. }