TextbookSubscriptionServiceImpl.java 57 KB

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