WfTextbookClaimServiceImpl.java 19 KB

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