TextbookSubscriptionServiceImpl.java 57 KB

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