WfTextbookSubscriptionServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. package com.xjrsoft.module.textbook.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.github.yulichang.base.MPJBaseServiceImpl;
  7. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  8. import com.xjrsoft.common.enums.DeleteMark;
  9. import com.xjrsoft.common.utils.VoToColumnUtil;
  10. import com.xjrsoft.module.base.entity.BaseClass;
  11. import com.xjrsoft.module.base.entity.BaseCourseSubject;
  12. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  13. import com.xjrsoft.module.system.entity.DictionaryDetail;
  14. import com.xjrsoft.module.textbook.dto.*;
  15. import com.xjrsoft.module.textbook.entity.Textbook;
  16. import com.xjrsoft.module.textbook.entity.TextbookSubscriptionRecord;
  17. import com.xjrsoft.module.textbook.entity.WfTextbookSubscription;
  18. import com.xjrsoft.module.textbook.entity.WfTextbookSubscriptionItem;
  19. import com.xjrsoft.module.textbook.mapper.TextbookSubscriptionRecordMapper;
  20. import com.xjrsoft.module.textbook.mapper.WfTextbookSubscriptionItemMapper;
  21. import com.xjrsoft.module.textbook.mapper.WfTextbookSubscriptionMapper;
  22. import com.xjrsoft.module.textbook.service.ITextbookService;
  23. import com.xjrsoft.module.textbook.service.IWfTextbookSubscriptionService;
  24. import com.xjrsoft.module.textbook.vo.TextbookInstockroomListVo;
  25. import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
  26. import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionItemVo;
  27. import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
  28. import lombok.AllArgsConstructor;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. /**
  34. * @title: 教材教辅征订
  35. * @Author szs
  36. * @Date: 2024-06-04
  37. * @Version 1.0
  38. */
  39. @Service
  40. @AllArgsConstructor
  41. public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfTextbookSubscriptionMapper, WfTextbookSubscription> implements IWfTextbookSubscriptionService {
  42. private final WfTextbookSubscriptionMapper wfTextbookSubscriptionWfTextbookSubscriptionMapper;
  43. private final WfTextbookSubscriptionItemMapper wfTextbookSubscriptionWfTextbookSubscriptionItemMapper;
  44. private final TextbookSubscriptionRecordMapper textbookTextbookSubscriptionRecordMapper;
  45. private final ITextbookService textbookService;
  46. private final BaseClassMapper baseClassMapper;
  47. @Override
  48. @Transactional(rollbackFor = Exception.class)
  49. public Boolean add(WfTextbookSubscription wfTextbookSubscription) {
  50. wfTextbookSubscription.setApplicantUserId(StpUtil.getLoginIdAsLong());
  51. wfTextbookSubscription.setStatus(1);
  52. wfTextbookSubscription.setCreateDate(new Date());
  53. wfTextbookSubscriptionWfTextbookSubscriptionMapper.insert(wfTextbookSubscription);
  54. for (WfTextbookSubscriptionItem wfTextbookSubscriptionItem : wfTextbookSubscription.getWfTextbookSubscriptionItemList()) {
  55. wfTextbookSubscriptionItem.setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  56. wfTextbookSubscriptionItem.setCreateDate(new Date());
  57. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.insert(wfTextbookSubscriptionItem);
  58. }
  59. return true;
  60. }
  61. @Override
  62. @Transactional(rollbackFor = Exception.class)
  63. public Boolean update(WfTextbookSubscription wfTextbookSubscription) {
  64. wfTextbookSubscriptionWfTextbookSubscriptionMapper.updateById(wfTextbookSubscription);
  65. //********************************* WfTextbookSubscriptionItem 增删改 开始 *******************************************/
  66. {
  67. // 查出所有子级的id
  68. List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(Wrappers.lambdaQuery(WfTextbookSubscriptionItem.class).eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId()).select(WfTextbookSubscriptionItem::getId));
  69. List<Long> wfTextbookSubscriptionItemIds = wfTextbookSubscriptionItemList.stream().map(WfTextbookSubscriptionItem::getId).collect(Collectors.toList());
  70. //原有子表单 没有被删除的主键
  71. List<Long> wfTextbookSubscriptionItemOldIds = wfTextbookSubscription.getWfTextbookSubscriptionItemList().stream().map(WfTextbookSubscriptionItem::getId).filter(Objects::nonNull).collect(Collectors.toList());
  72. //找到需要删除的id
  73. List<Long> wfTextbookSubscriptionItemRemoveIds = wfTextbookSubscriptionItemIds.stream().filter(item -> !wfTextbookSubscriptionItemOldIds.contains(item)).collect(Collectors.toList());
  74. for (WfTextbookSubscriptionItem wfTextbookSubscriptionItem : wfTextbookSubscription.getWfTextbookSubscriptionItemList()) {
  75. //如果不等于空则修改
  76. if (wfTextbookSubscriptionItem.getId() != null) {
  77. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.updateById(wfTextbookSubscriptionItem);
  78. }
  79. //如果等于空 则新增
  80. else {
  81. //已经不存在的id 删除
  82. wfTextbookSubscriptionItem.setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  83. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.insert(wfTextbookSubscriptionItem);
  84. }
  85. }
  86. //已经不存在的id 删除
  87. if (wfTextbookSubscriptionItemRemoveIds.size() > 0) {
  88. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.deleteBatchIds(wfTextbookSubscriptionItemRemoveIds);
  89. }
  90. }
  91. //********************************* WfTextbookSubscriptionItem 增删改 结束 *******************************************/
  92. return true;
  93. }
  94. @Override
  95. @Transactional(rollbackFor = Exception.class)
  96. public Boolean delete(List<Long> ids) {
  97. wfTextbookSubscriptionWfTextbookSubscriptionMapper.deleteBatchIds(ids);
  98. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.delete(Wrappers.lambdaQuery(WfTextbookSubscriptionItem.class).in(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, ids));
  99. return true;
  100. }
  101. @Override
  102. @Transactional(rollbackFor = Exception.class)
  103. public Boolean changeStatus(UpdateWfTextbookSubscriptionDto dto) {
  104. WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getId());
  105. if (wfTextbookSubscription == null) {
  106. return false;
  107. }
  108. //点击发起征订
  109. if (wfTextbookSubscription.getStatus() == 1 && dto.getStatus() == 2) {
  110. WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
  111. //添加征订记录
  112. List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(Wrappers.<WfTextbookSubscriptionItem>query().lambda().eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId()));
  113. for (WfTextbookSubscriptionItem w : wfTextbookSubscriptionItemList) {
  114. textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
  115. setCreateDate(new Date());
  116. setTextbookId(w.getTextbookId());
  117. setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
  118. setWfTextbookSubscriptionItemId(w.getId());//该字段存入征订项的id,征订项中有所属征订记录
  119. }});
  120. }
  121. return this.updateById(newW);
  122. }
  123. //点击完成征订
  124. if (wfTextbookSubscription.getStatus() == 3 && dto.getStatus() == 4) {
  125. WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
  126. return this.updateById(newW);
  127. }
  128. return false;
  129. }
  130. @Override
  131. public WfTextbookSubscriptionVo getInfo(Long id) {
  132. WfTextbookSubscription wfTextbookSubscription = this.getById(id);
  133. if (wfTextbookSubscription == null) {
  134. return null;
  135. }
  136. WfTextbookSubscriptionVo wfTextbookSubscriptionVo = BeanUtil.toBean(wfTextbookSubscription, WfTextbookSubscriptionVo.class);
  137. MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
  138. mpjLambdaWrapper
  139. .selectAs(BaseCourseSubject::getName, WfTextbookSubscriptionItemVo::getCourseSubjectIdCn)
  140. .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookSubscriptionItemVo.class).contains(x.getProperty()))
  141. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookSubscriptionItemVo.class).contains(x.getProperty()))
  142. .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
  143. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  144. ext -> ext.selectAs(DictionaryDetail::getName, WfTextbookSubscriptionItemVo::getTextbookTypeCn))
  145. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
  146. .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId())
  147. ;
  148. List<WfTextbookSubscriptionItemVo> itemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(WfTextbookSubscriptionItemVo.class, mpjLambdaWrapper);
  149. //处理班级
  150. String classIds = "";
  151. List<String> classIdList = new ArrayList<>();
  152. StringBuilder sb = new StringBuilder();
  153. if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
  154. classIds = itemList.get(0).getClassIds();
  155. String[] classIdArr = classIds.split(",");
  156. classIdList = Arrays.asList(classIdArr);
  157. if (!classIdList.isEmpty()) {
  158. List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
  159. Map<Long, BaseClass> baseClassMap = baseClassList.stream()
  160. .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
  161. for (String classId : classIdList) {
  162. BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
  163. if (baseClass != null) {
  164. sb.append(baseClass.getName());
  165. sb.append(",");
  166. }
  167. }
  168. sb.deleteCharAt(sb.length() - 1);
  169. }
  170. }
  171. //遍历处理所有项
  172. int stuSum = 0;
  173. int teaSum = 0;
  174. for (WfTextbookSubscriptionItemVo w : itemList) {
  175. if (!classIdList.isEmpty()) {
  176. w.setClassNum(classIdList.size());
  177. }
  178. if (w.getStudentSubscriptionNumber() != null) {
  179. stuSum += w.getStudentSubscriptionNumber();
  180. }
  181. if (w.getTeacherSubscriptionNumber() != null) {
  182. teaSum += w.getTeacherSubscriptionNumber();
  183. }
  184. }
  185. wfTextbookSubscriptionVo.setClassIdsCn(sb.toString());
  186. wfTextbookSubscriptionVo.setClassIds(classIds);
  187. wfTextbookSubscriptionVo.setStudentSubscriptionNumberSum(stuSum);
  188. wfTextbookSubscriptionVo.setTeacherSubscriptionNumberSum(teaSum);
  189. wfTextbookSubscriptionVo.setSum(stuSum + teaSum);
  190. wfTextbookSubscriptionVo.setWfTextbookSubscriptionItemList(itemList);
  191. return wfTextbookSubscriptionVo;
  192. }
  193. @Override
  194. public List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) {
  195. WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getWfTextbookSubscriptionId());
  196. if (wfTextbookSubscription == null) {
  197. return null;
  198. }
  199. MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
  200. mpjLambdaWrapper
  201. .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
  202. .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
  203. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
  204. .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
  205. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  206. ext -> ext.selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn))
  207. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
  208. .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId())
  209. ;
  210. List<TextbookSubscriptionExportQueryListVo> itemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, mpjLambdaWrapper);
  211. //处理班级
  212. String classIds = "";
  213. List<String> classIdList = new ArrayList<>();
  214. StringBuilder sb = new StringBuilder();
  215. if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
  216. classIds = itemList.get(0).getClassIds();
  217. String[] classIdArr = classIds.split(",");
  218. classIdList = Arrays.asList(classIdArr);
  219. /*if(!classIdList.isEmpty()){
  220. List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
  221. Map<Long, BaseClass> baseClassMap = baseClassList.stream()
  222. .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
  223. for (String classId : classIdList){
  224. BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
  225. if(baseClass != null){
  226. sb.append(baseClass.getName());
  227. sb.append(",");
  228. }
  229. }
  230. sb.deleteCharAt(sb.length() - 1);
  231. }*/
  232. }
  233. for (TextbookSubscriptionExportQueryListVo w : itemList) {
  234. w.setClassNum(classIdList.size());
  235. }
  236. return itemList;
  237. }
  238. @Override
  239. public List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto) {
  240. MPJLambdaWrapper<WfTextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
  241. queryWrapper
  242. .select(WfTextbookSubscriptionItem::getId)
  243. .selectAs(BaseCourseSubject::getName, TextbookInstockroomListVo::getCourseSubjectIdCn)
  244. .selectAs(DictionaryDetail::getName, TextbookInstockroomListVo::getTextbookTypeCn)
  245. .select("(t.student_subscription_number + t.teacher_subscription_number) as subscriptionNumber")
  246. .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
  247. .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
  248. .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
  249. .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
  250. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType)
  251. .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, dto.getWfTextbookSubscriptionId())
  252. .orderByAsc(WfTextbookSubscriptionItem::getInstockroomNum)
  253. ;
  254. List<TextbookInstockroomListVo> list = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(TextbookInstockroomListVo.class, queryWrapper);
  255. return list;
  256. }
  257. @Override
  258. @Transactional(rollbackFor = Exception.class)
  259. public Boolean instockroom(List<TextbookInstockroomDto> dtos) {
  260. if (dtos.isEmpty()) {
  261. return false;
  262. }
  263. //获取需要修改的list
  264. LambdaQueryWrapper<WfTextbookSubscriptionItem> queryWrapper = new LambdaQueryWrapper<>();
  265. queryWrapper
  266. .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, dtos.get(0).getWfTextbookSubscriptionId())
  267. .eq(WfTextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  268. ;
  269. List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(queryWrapper);
  270. if (wfTextbookSubscriptionItemList.isEmpty()) {
  271. return false;
  272. }
  273. Map<Long, WfTextbookSubscriptionItem> itemMap = wfTextbookSubscriptionItemList
  274. .stream()
  275. .collect(Collectors.toMap(
  276. WfTextbookSubscriptionItem::getId,
  277. item -> item
  278. ));
  279. Date now = new Date();
  280. Long loginId = StpUtil.getLoginIdAsLong();
  281. for (TextbookInstockroomDto dto : dtos) {
  282. WfTextbookSubscriptionItem old = itemMap.get(dto.getId());
  283. WfTextbookSubscriptionItem updateItem = new WfTextbookSubscriptionItem();
  284. updateItem.setId(old.getId());
  285. updateItem.setInstockroomNum(old.getInstockroomNum() + dto.getInNum());
  286. updateItem.setModifyDate(now);
  287. updateItem.setModifyUserId(loginId);
  288. wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.updateById(updateItem);
  289. //新增入库记录
  290. textbookService.deliverWarehouse(new AddTextbookWarehouseRecordDto() {{
  291. setTextbookId(old.getTextbookId());
  292. setWarehouseNumber(dto.getInNum());
  293. setSource("wm_manual");
  294. }});
  295. }
  296. return true;
  297. }
  298. }