WfTextbookClaimServiceImpl.java 17 KB

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