package com.xjrsoft.module.textbook.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.yulichang.base.MPJBaseServiceImpl; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.common.page.ConventPage; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.mapper.XjrUserMapper; import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto; import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto; import com.xjrsoft.module.textbook.entity.Textbook; import com.xjrsoft.module.textbook.entity.TextbookStudentClaim; import com.xjrsoft.module.textbook.entity.WfTextbookClaim; import com.xjrsoft.module.textbook.entity.WfTextbookClaimItem; import com.xjrsoft.module.textbook.mapper.WfTextbookClaimItemMapper; import com.xjrsoft.module.textbook.mapper.WfTextbookClaimMapper; import com.xjrsoft.module.textbook.service.ITextbookService; import com.xjrsoft.module.textbook.service.ITextbookStudentClaimService; import com.xjrsoft.module.textbook.service.IWfTextbookClaimService; import com.xjrsoft.module.textbook.vo.WfTextbookClaimItemVo; import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo; import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * @title: 教材申领 * @Author szs * @Date: 2023-12-26 * @Version 1.0 */ @Service @AllArgsConstructor public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl implements IWfTextbookClaimService { private final WfTextbookClaimMapper wfTextbookClaimWfTextbookClaimMapper; private final WfTextbookClaimItemMapper wfTextbookClaimWfTextbookClaimItemMapper; private final XjrUserMapper xjrUserMapper; private final ITextbookService textbookService; private final ITextbookStudentClaimService textbookStudentClaimService; @Override @Transactional(rollbackFor = Exception.class) public Boolean add(WfTextbookClaim wfTextbookClaim) { wfTextbookClaimWfTextbookClaimMapper.insert(wfTextbookClaim); for (WfTextbookClaimItem wfTextbookClaimItem : wfTextbookClaim.getWfTextbookClaimItemList()) { wfTextbookClaimItem.setWfTextbookClaimId(wfTextbookClaim.getId()); wfTextbookClaimWfTextbookClaimItemMapper.insert(wfTextbookClaimItem); } return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean update(WfTextbookClaim wfTextbookClaim) { wfTextbookClaimWfTextbookClaimMapper.updateById(wfTextbookClaim); //********************************* WfTextbookClaimItem 增删改 开始 *******************************************/ { // 查出所有子级的id List wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectList(Wrappers.lambdaQuery(WfTextbookClaimItem.class).eq(WfTextbookClaimItem::getWfTextbookClaimId, wfTextbookClaim.getId()).select(WfTextbookClaimItem::getId)); List wfTextbookClaimItemIds = wfTextbookClaimItemList.stream().map(WfTextbookClaimItem::getId).collect(Collectors.toList()); //原有子表单 没有被删除的主键 List wfTextbookClaimItemOldIds = wfTextbookClaim.getWfTextbookClaimItemList().stream().map(WfTextbookClaimItem::getId).filter(Objects::nonNull).collect(Collectors.toList()); //找到需要删除的id List wfTextbookClaimItemRemoveIds = wfTextbookClaimItemIds.stream().filter(item -> !wfTextbookClaimItemOldIds.contains(item)).collect(Collectors.toList()); for (WfTextbookClaimItem wfTextbookClaimItem : wfTextbookClaim.getWfTextbookClaimItemList()) { //如果不等于空则修改 if (wfTextbookClaimItem.getId() != null) { wfTextbookClaimWfTextbookClaimItemMapper.updateById(wfTextbookClaimItem); } //如果等于空 则新增 else { //已经不存在的id 删除 wfTextbookClaimItem.setWfTextbookClaimId(wfTextbookClaim.getId()); wfTextbookClaimWfTextbookClaimItemMapper.insert(wfTextbookClaimItem); } } //已经不存在的id 删除 if (wfTextbookClaimItemRemoveIds.size() > 0) { wfTextbookClaimWfTextbookClaimItemMapper.deleteBatchIds(wfTextbookClaimItemRemoveIds); } } //********************************* WfTextbookClaimItem 增删改 结束 *******************************************/ return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(List ids) { wfTextbookClaimWfTextbookClaimMapper.deleteBatchIds(ids); wfTextbookClaimWfTextbookClaimItemMapper.delete(Wrappers.lambdaQuery(WfTextbookClaimItem.class).in(WfTextbookClaimItem::getWfTextbookClaimId, ids)); return true; } @Override public IPage getPage(WfTextbookClaimPageDto dto) { IPage page = wfTextbookClaimWfTextbookClaimMapper.getPage(ConventPage.getPage(dto), dto); for (WfTextbookClaimPageVo wfTextbookClaimPageVo : page.getRecords()) { //拆分代领人 String receiveUserIdStr = wfTextbookClaimPageVo.getReceiveUserId(); if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) { String[] receiveUserIdStrs = receiveUserIdStr.split(","); List receiveUserIdList = new ArrayList<>(); for (String str : receiveUserIdStrs) { receiveUserIdList.add(Long.parseLong(str)); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper .in(XjrUser::getId, receiveUserIdStr); List xjrUserList = xjrUserMapper.selectList(queryWrapper); if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) { StringBuilder sb = new StringBuilder(); for (XjrUser xjrUser : xjrUserList) { sb.append("," + xjrUser.getName()); } wfTextbookClaimPageVo.setReceiveUserIdCN(sb.toString()); } } //加上申领项 List wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimPageVo.getId())); if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) { wfTextbookClaimPageVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList); } } return page; } @Override public WfTextbookClaimVo infoDistribute(Long id) { WfTextbookClaimVo wfTextbookClaimVo = wfTextbookClaimWfTextbookClaimMapper.infoDistribute(id); if (ObjectUtil.isNotNull(wfTextbookClaimVo)) { //拆分代领人 String receiveUserIdStr = wfTextbookClaimVo.getReceiveUserId(); if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) { String[] receiveUserIdStrs = receiveUserIdStr.split(","); List receiveUserIdList = new ArrayList<>(); for (String str : receiveUserIdStrs) { receiveUserIdList.add(Long.parseLong(str)); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper .in(XjrUser::getId, receiveUserIdList); List xjrUserList = xjrUserMapper.selectList(queryWrapper); if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) { StringBuilder sb = new StringBuilder(); for (XjrUser xjrUser : xjrUserList) { sb.append("," + xjrUser.getName()); } wfTextbookClaimVo.setReceiveUserIdCN(sb.toString()); } } //加上申领项 List wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimVo.getId())); if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) { wfTextbookClaimVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList); } } return wfTextbookClaimVo; } @Override @Transactional(rollbackFor = Exception.class) public Boolean confirmDistribute(ConfirmDistributeDto dto) { WfTextbookClaim wfTextbookClaim = this.getById(dto.getTextbookClaimId()); if (ObjectUtil.isNull(wfTextbookClaim) || ObjectUtil.isNull(dto.getTextbookClaimItemList()) || dto.getTextbookClaimItemList().size() <= 0) { throw new MyException("未找到申领数据"); } //操作每一个申领项 for (ConfirmDistributeDto.TextbookClaimItem textbookClaimItem : dto.getTextbookClaimItemList()) { WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimWfTextbookClaimItemMapper.selectById(textbookClaimItem.getTextbookClaimItemId()); if (ObjectUtil.isNull(wfTextbookClaimItem)) { throw new MyException("未找到申领数据"); } Textbook textbook = textbookService.getById(wfTextbookClaimItem.getTextbookId()); if (ObjectUtil.isNull(textbook)) { throw new MyException("未找到相关教材数据"); } //判断总发放数量是否超出该申请项的申请数量 Integer issueNumber = ObjectUtil.isNull(wfTextbookClaimItem.getIssueNumber())? 0 : wfTextbookClaimItem.getIssueNumber(); if (issueNumber + textbookClaimItem.getConfirmNumber() > wfTextbookClaimItem.getApplicantNumber()) { throw new MyException(textbook.getBookName() + "发放总数量超出申领数量"); } //判断总发放数量是否超出该申请像的申请数量 Integer stock = ObjectUtil.isNull(textbook.getStock()) ? 0 : textbook.getStock() ; if (stock < textbookClaimItem.getConfirmNumber()) { throw new MyException(textbook.getBookName() + "库存不足"); } //更新教材管理中的库存数量 textbookService.updateById(new Textbook(){{ setId(textbook.getId()); setStock(stock - textbookClaimItem.getConfirmNumber()); }}); //TODO 增加出库记录 //更新申领项中的已经发放数量 wfTextbookClaimWfTextbookClaimItemMapper.updateById(new WfTextbookClaimItem(){{ setId(wfTextbookClaimItem.getId()); setIssueNumber(issueNumber + textbookClaimItem.getConfirmNumber()); }}); //为班级每个学生生成领取(确认信息)认领记录 //查出班上的所有学生id List userIdList = xjrUserMapper.getUserIdByClassId(wfTextbookClaim.getClassId()); if(ObjectUtil.isNull(userIdList)){ throw new MyException("申领班级有误,请核实"); } List textbookStudentClaimsList = new ArrayList<>(); for (Long userId : userIdList) { TextbookStudentClaim textbookStudentClaim = new TextbookStudentClaim(); textbookStudentClaim.setStudentUserId(userId); textbookStudentClaim.setBaseSemesterId(wfTextbookClaim.getBaseSemesterId()); textbookStudentClaim.setClassId(wfTextbookClaim.getClassId()); textbookStudentClaim.setTextbookId(wfTextbookClaimItem.getTextbookId()); textbookStudentClaimsList.add(textbookStudentClaim); } textbookStudentClaimService.saveBatch(textbookStudentClaimsList); } return true; } }