WfTextbookClaimServiceImpl.java 18 KB

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