WfTextbookClaimServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package com.xjrsoft.module.textbook.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.github.yulichang.base.MPJBaseServiceImpl;
  8. import com.xjrsoft.common.enums.ClaimTypeEnum;
  9. import com.xjrsoft.common.enums.IssueModeEnum;
  10. import com.xjrsoft.common.exception.MyException;
  11. import com.xjrsoft.common.page.ConventPage;
  12. import com.xjrsoft.module.organization.mapper.RoleMapper;
  13. import com.xjrsoft.module.teacher.entity.XjrUser;
  14. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  15. import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
  16. import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
  17. import com.xjrsoft.module.textbook.entity.*;
  18. import com.xjrsoft.module.textbook.mapper.TextbookClaimUserMapper;
  19. import com.xjrsoft.module.textbook.mapper.WfTextbookClaimItemMapper;
  20. import com.xjrsoft.module.textbook.mapper.WfTextbookClaimMapper;
  21. import com.xjrsoft.module.textbook.service.ITextbookIssueRecordService;
  22. import com.xjrsoft.module.textbook.service.ITextbookService;
  23. import com.xjrsoft.module.textbook.service.ITextbookStudentClaimService;
  24. import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
  25. import com.xjrsoft.module.textbook.vo.WfTextbookClaimItemVo;
  26. import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo;
  27. import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo;
  28. import lombok.AllArgsConstructor;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import java.util.ArrayList;
  32. import java.util.List;
  33. import java.util.Objects;
  34. import java.util.stream.Collectors;
  35. /**
  36. * @title: 教材申领
  37. * @Author szs
  38. * @Date: 2023-12-26
  39. * @Version 1.0
  40. */
  41. @Service
  42. @AllArgsConstructor
  43. public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookClaimMapper, WfTextbookClaim> implements IWfTextbookClaimService {
  44. private final WfTextbookClaimMapper wfTextbookClaimWfTextbookClaimMapper;
  45. private final WfTextbookClaimItemMapper wfTextbookClaimWfTextbookClaimItemMapper;
  46. private final XjrUserMapper xjrUserMapper;
  47. private final RoleMapper roleMapper;
  48. private final ITextbookService textbookService;
  49. private final ITextbookStudentClaimService textbookStudentClaimService;
  50. private final ITextbookIssueRecordService textbookIssueRecordService;
  51. private final TextbookClaimUserMapper textbookClaimUserMapper;
  52. @Override
  53. @Transactional(rollbackFor = Exception.class)
  54. public Boolean add(WfTextbookClaim wfTextbookClaim) {
  55. wfTextbookClaimWfTextbookClaimMapper.insert(wfTextbookClaim);
  56. for (WfTextbookClaimItem wfTextbookClaimItem : wfTextbookClaim.getWfTextbookClaimItemList()) {
  57. wfTextbookClaimItem.setWfTextbookClaimId(wfTextbookClaim.getId());
  58. wfTextbookClaimWfTextbookClaimItemMapper.insert(wfTextbookClaimItem);
  59. }
  60. return true;
  61. }
  62. @Override
  63. @Transactional(rollbackFor = Exception.class)
  64. public Boolean update(WfTextbookClaim wfTextbookClaim) {
  65. wfTextbookClaimWfTextbookClaimMapper.updateById(wfTextbookClaim);
  66. //********************************* WfTextbookClaimItem 增删改 开始 *******************************************/
  67. {
  68. // 查出所有子级的id
  69. List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectList(Wrappers.lambdaQuery(WfTextbookClaimItem.class).eq(WfTextbookClaimItem::getWfTextbookClaimId, wfTextbookClaim.getId()).select(WfTextbookClaimItem::getId));
  70. List<Long> wfTextbookClaimItemIds = wfTextbookClaimItemList.stream().map(WfTextbookClaimItem::getId).collect(Collectors.toList());
  71. //原有子表单 没有被删除的主键
  72. List<Long> wfTextbookClaimItemOldIds = wfTextbookClaim.getWfTextbookClaimItemList().stream().map(WfTextbookClaimItem::getId).filter(Objects::nonNull).collect(Collectors.toList());
  73. //找到需要删除的id
  74. List<Long> wfTextbookClaimItemRemoveIds = wfTextbookClaimItemIds.stream().filter(item -> !wfTextbookClaimItemOldIds.contains(item)).collect(Collectors.toList());
  75. for (WfTextbookClaimItem wfTextbookClaimItem : wfTextbookClaim.getWfTextbookClaimItemList()) {
  76. //如果不等于空则修改
  77. if (wfTextbookClaimItem.getId() != null) {
  78. wfTextbookClaimWfTextbookClaimItemMapper.updateById(wfTextbookClaimItem);
  79. }
  80. //如果等于空 则新增
  81. else {
  82. //已经不存在的id 删除
  83. wfTextbookClaimItem.setWfTextbookClaimId(wfTextbookClaim.getId());
  84. wfTextbookClaimWfTextbookClaimItemMapper.insert(wfTextbookClaimItem);
  85. }
  86. }
  87. //已经不存在的id 删除
  88. if (wfTextbookClaimItemRemoveIds.size() > 0) {
  89. wfTextbookClaimWfTextbookClaimItemMapper.deleteBatchIds(wfTextbookClaimItemRemoveIds);
  90. }
  91. }
  92. //********************************* WfTextbookClaimItem 增删改 结束 *******************************************/
  93. return true;
  94. }
  95. @Override
  96. @Transactional(rollbackFor = Exception.class)
  97. public Boolean delete(List<Long> ids) {
  98. wfTextbookClaimWfTextbookClaimMapper.deleteBatchIds(ids);
  99. wfTextbookClaimWfTextbookClaimItemMapper.delete(Wrappers.lambdaQuery(WfTextbookClaimItem.class).in(WfTextbookClaimItem::getWfTextbookClaimId, ids));
  100. return true;
  101. }
  102. @Override
  103. public IPage<WfTextbookClaimPageVo> getPage(WfTextbookClaimPageDto dto) {
  104. dto.setUserId(StpUtil.getLoginIdAsLong());
  105. IPage<WfTextbookClaimPageVo> page = wfTextbookClaimWfTextbookClaimMapper.getPage(ConventPage.getPage(dto),dto);
  106. for (WfTextbookClaimPageVo wfTextbookClaimPageVo : page.getRecords()) {
  107. //拆分代领取人
  108. String receiveUserIdStr = wfTextbookClaimPageVo.getReceiveUserId();
  109. if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
  110. String[] receiveUserIdStrs = receiveUserIdStr.split(",");
  111. List<Long> receiveUserIdList = new ArrayList<>();
  112. for (String str : receiveUserIdStrs) {
  113. receiveUserIdList.add(Long.parseLong(str));
  114. }
  115. LambdaQueryWrapper<XjrUser> queryWrapper = new LambdaQueryWrapper<>();
  116. queryWrapper
  117. .in(XjrUser::getId, receiveUserIdList);
  118. List<XjrUser> xjrUserList = xjrUserMapper.selectList(queryWrapper);
  119. if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) {
  120. StringBuilder sb = new StringBuilder();
  121. for (XjrUser xjrUser : xjrUserList) {
  122. sb.append("," + xjrUser.getName());
  123. }
  124. wfTextbookClaimPageVo.setReceiveUserIdCN(sb.toString());
  125. }
  126. }
  127. //加上申领项
  128. List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimPageVo.getId()));
  129. if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
  130. wfTextbookClaimPageVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
  131. }
  132. }
  133. return page;
  134. }
  135. @Override
  136. public WfTextbookClaimVo infoDistribute(Long id) {
  137. WfTextbookClaimVo wfTextbookClaimVo = wfTextbookClaimWfTextbookClaimMapper.infoDistribute(id);
  138. if (ObjectUtil.isNotNull(wfTextbookClaimVo)) {
  139. //拆分代领人
  140. String receiveUserIdStr = wfTextbookClaimVo.getReceiveUserId();
  141. if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
  142. String[] receiveUserIdStrs = receiveUserIdStr.split(",");
  143. List<Long> receiveUserIdList = new ArrayList<>();
  144. for (String str : receiveUserIdStrs) {
  145. receiveUserIdList.add(Long.parseLong(str));
  146. }
  147. LambdaQueryWrapper<XjrUser> queryWrapper = new LambdaQueryWrapper<>();
  148. queryWrapper
  149. .in(XjrUser::getId, receiveUserIdList);
  150. List<XjrUser> xjrUserList = xjrUserMapper.selectList(queryWrapper);
  151. if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) {
  152. StringBuilder sb = new StringBuilder();
  153. for (XjrUser xjrUser : xjrUserList) {
  154. sb.append("," + xjrUser.getName());
  155. }
  156. wfTextbookClaimVo.setReceiveUserIdCN(sb.toString());
  157. }
  158. }
  159. //加上申领项
  160. List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimVo.getId()));
  161. if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
  162. wfTextbookClaimVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
  163. }
  164. }
  165. return wfTextbookClaimVo;
  166. }
  167. @Override
  168. @Transactional(rollbackFor = Exception.class)
  169. public Boolean confirmDistribute(ConfirmDistributeDto dto) {
  170. WfTextbookClaim wfTextbookClaim = this.getById(dto.getTextbookClaimId());
  171. if (ObjectUtil.isNull(wfTextbookClaim) || ObjectUtil.isNull(dto.getTextbookClaimItemList()) || dto.getTextbookClaimItemList().size() == 0) {
  172. throw new MyException("未找到申领数据");
  173. }
  174. //操作每一个申领项
  175. for (ConfirmDistributeDto.TextbookClaimItem textbookClaimItem : dto.getTextbookClaimItemList()) {
  176. WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimWfTextbookClaimItemMapper.selectById(textbookClaimItem.getTextbookClaimItemId());
  177. if (ObjectUtil.isNull(wfTextbookClaimItem)) {
  178. throw new MyException("未找到申领数据");
  179. }
  180. Textbook textbook = textbookService.getById(wfTextbookClaimItem.getTextbookId());
  181. if (ObjectUtil.isNull(textbook)) {
  182. throw new MyException("未找到相关教材数据");
  183. }
  184. //判断总发放数量是否超出该申请项的申请数量
  185. Integer issueNumber = ObjectUtil.isNull(wfTextbookClaimItem.getIssueNumber()) ? 0 : wfTextbookClaimItem.getIssueNumber();//已发放
  186. Integer confirmNumber = ObjectUtil.isNull(textbookClaimItem.getConfirmNumber()) ? 0 : textbookClaimItem.getConfirmNumber();//本次发放
  187. Integer applicantNumber = ObjectUtil.isNull(wfTextbookClaimItem.getApplicantNumber()) ? 0 : wfTextbookClaimItem.getApplicantNumber();//申领总数量
  188. if (issueNumber + confirmNumber > applicantNumber) {
  189. throw new MyException(textbook.getBookName() + "发放总数量超出申领数量");
  190. }
  191. //判断总发放数量是否超出该申请的申请数量
  192. Integer stock = ObjectUtil.isNull(textbook.getStock()) ? 0 : textbook.getStock();
  193. if (stock < confirmNumber) {
  194. throw new MyException(textbook.getBookName() + "库存不足");
  195. }
  196. //增加出库记录
  197. textbookIssueRecordService.save(new TextbookIssueRecord() {{
  198. setWfTextbookClaimId(wfTextbookClaim.getId());
  199. setWfTextbookClaimItemId(wfTextbookClaimItem.getId());
  200. setIssueNumber(confirmNumber);
  201. setRemainingNumber(applicantNumber - issueNumber - confirmNumber);
  202. setReceiveUserId(dto.getReceiveUserId());
  203. setIssueUserId(StpUtil.getLoginIdAsLong());
  204. if (ObjectUtil.isNotNull(wfTextbookClaim.getClaimType()) && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())) {
  205. setIssueMode(IssueModeEnum.Imtudent.getCode());
  206. }
  207. if (ObjectUtil.isNotNull(wfTextbookClaim.getClaimType()) && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimTeacher.getCode())) {
  208. setIssueMode(IssueModeEnum.ImTeacher.getCode());
  209. }
  210. setRemark(dto.getRemark());
  211. }});
  212. //更新教材管理中的库存数量
  213. textbookService.updateById(new Textbook() {{
  214. setId(textbook.getId());
  215. setStock(stock - confirmNumber);
  216. }});
  217. //更新申领项中的已经发放数量
  218. wfTextbookClaimWfTextbookClaimItemMapper.updateById(new WfTextbookClaimItem() {{
  219. setId(wfTextbookClaimItem.getId());
  220. setIssueNumber(issueNumber + confirmNumber);
  221. }});
  222. //当申领类型为学生的时候,为班级每个学生生成领取(确认信息)认领记录
  223. //查出班上的所有学生id
  224. if (ObjectUtil.isNotNull(wfTextbookClaim.getClaimType()) && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())) {
  225. List<Long> userIdList = xjrUserMapper.getUserIdByClassId(wfTextbookClaim.getClassId());
  226. if (ObjectUtil.isNull(userIdList) && userIdList.size() == 0) {
  227. throw new MyException("申领班级有误,请核实");
  228. }
  229. for (Long userId : userIdList) {
  230. textbookStudentClaimService.save(new TextbookStudentClaim() {{
  231. setStudentUserId(userId);
  232. setBaseSemesterId(wfTextbookClaim.getBaseSemesterId());
  233. setClassId(wfTextbookClaim.getClassId());
  234. setTextbookId(wfTextbookClaimItem.getTextbookId());
  235. }});
  236. }
  237. }
  238. }
  239. return true;
  240. }
  241. @Override
  242. @Transactional
  243. public Boolean dataHandleAddClaimUserNode(Long id) {
  244. WfTextbookClaim wfTextbookClaim = this.getById(id);
  245. if (ObjectUtil.isNotNull(wfTextbookClaim)
  246. && ObjectUtil.isNotNull(wfTextbookClaim.getClaimType())) {
  247. //所有需要添加的可领取人ID
  248. List<TextbookClaimUser> textbookClaimUserList = new ArrayList<>();
  249. textbookClaimUserList.add(new TextbookClaimUser() {{
  250. setWfTextbookClaimId(wfTextbookClaim.getId());
  251. setUserId(wfTextbookClaim.getApplicantUserId());
  252. setUserType(2);
  253. }});
  254. //申领类型是学生申领,学生代表可领取
  255. if (wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())) {
  256. textbookClaimUserList.add(new TextbookClaimUser() {{
  257. setWfTextbookClaimId(wfTextbookClaim.getId());
  258. setUserId(wfTextbookClaim.getStudentUserId());
  259. setUserType(1);
  260. }});
  261. }
  262. //申领类型是教师申领,领取人可领取
  263. if (wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimTeacher.getCode())
  264. && ObjectUtil.isNotNull(wfTextbookClaim.getApplicantUserId())
  265. && ObjectUtil.isNotNull(wfTextbookClaim.getClaimUserId())
  266. && wfTextbookClaim.getApplicantUserId().equals(wfTextbookClaim.getClaimUserId())) {
  267. textbookClaimUserList.add(new TextbookClaimUser() {{
  268. setWfTextbookClaimId(wfTextbookClaim.getId());
  269. setUserId(wfTextbookClaim.getClaimUserId());
  270. setUserType(2);
  271. }});
  272. }
  273. for (TextbookClaimUser textbookClaimUser : textbookClaimUserList) {
  274. textbookClaimUserMapper.insert(textbookClaimUser);
  275. }
  276. }
  277. return true;
  278. }
  279. }