|
|
@@ -1,24 +1,23 @@
|
|
|
package com.xjrsoft.module.textbook.service.impl;
|
|
|
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
-import com.alibaba.excel.EasyExcel;
|
|
|
-import com.alibaba.excel.support.ExcelTypeEnum;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
|
|
|
import com.xjrsoft.common.enums.ClaimTypeEnum;
|
|
|
import com.xjrsoft.common.enums.DeleteMark;
|
|
|
import com.xjrsoft.common.enums.IssueModeEnum;
|
|
|
import com.xjrsoft.common.exception.MyException;
|
|
|
-import com.xjrsoft.common.model.result.RT;
|
|
|
import com.xjrsoft.common.page.ConventPage;
|
|
|
import com.xjrsoft.common.utils.VoToColumnUtil;
|
|
|
import com.xjrsoft.module.base.entity.BaseClass;
|
|
|
import com.xjrsoft.module.base.entity.BaseSemester;
|
|
|
-import com.xjrsoft.module.oa.entity.WfMeetingApply;
|
|
|
+import com.xjrsoft.module.generator.entity.ImportConfig;
|
|
|
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
|
|
|
import com.xjrsoft.module.system.entity.DictionaryDetail;
|
|
|
import com.xjrsoft.module.teacher.entity.XjrUser;
|
|
|
import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
|
|
|
@@ -27,21 +26,29 @@ import com.xjrsoft.module.textbook.entity.*;
|
|
|
import com.xjrsoft.module.textbook.mapper.*;
|
|
|
import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
|
|
|
import com.xjrsoft.module.textbook.vo.*;
|
|
|
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
|
|
|
import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
|
|
|
import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.collections.MapUtils;
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
import org.camunda.bpm.engine.history.HistoricProcessInstance;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -71,6 +78,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
|
|
|
@Override
|
|
|
public IPage<DistributePageVo> distributePage(DistributePageDto dto) {
|
|
|
+ // 申领主表记录
|
|
|
MPJLambdaWrapper<WfTextbookClaim> wfTextbookClaimMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
wfTextbookClaimMPJLambdaWrapper
|
|
|
.disableSubLogicDel()
|
|
|
@@ -97,7 +105,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
.selectAs(XjrUser::getName, DistributePageVo::getStudentUserIdCn)
|
|
|
)
|
|
|
.eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
|
|
|
- .eq(WfTextbookClaim::getWorkflowStatus, 1)
|
|
|
.eq(StringUtils.isNotEmpty(dto.getClaimType()), WfTextbookClaim::getClaimType, dto.getClaimType())
|
|
|
.and(StringUtils.isNotEmpty(dto.getName()),
|
|
|
wrapper -> wrapper
|
|
|
@@ -106,7 +113,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
.like(BaseClass::getName, dto.getName())
|
|
|
)
|
|
|
;
|
|
|
+
|
|
|
+ // 发放状态(是否有过发放(1:未发放,2:部分发放,3:全部发放,4:有发放))
|
|
|
if (ObjectUtils.isNotEmpty(dto.getDistributeStatus())) {
|
|
|
+ // 有发放,除了未发放其他所有的状态
|
|
|
if (dto.getDistributeStatus() == 4) {
|
|
|
wfTextbookClaimMPJLambdaWrapper
|
|
|
.ne(WfTextbookClaim::getStatus, 1)
|
|
|
@@ -116,8 +126,9 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
.eq(WfTextbookClaim::getStatus, dto.getDistributeStatus())
|
|
|
;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
+ // 流程状态(0:未结束,1:已结束,正常通过,2:已结束,未通过,3:作废)
|
|
|
if (ObjectUtils.isNotEmpty(dto.getWorkflowStatus())) {
|
|
|
wfTextbookClaimMPJLambdaWrapper
|
|
|
.eq(WfTextbookClaim::getWorkflowStatus, dto.getWorkflowStatus())
|
|
|
@@ -131,42 +142,98 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
)
|
|
|
;
|
|
|
}
|
|
|
+
|
|
|
IPage<DistributePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), DistributePageVo.class, wfTextbookClaimMPJLambdaWrapper);
|
|
|
|
|
|
- List<DistributePageVo> distributePageVos = page.getRecords();
|
|
|
-
|
|
|
- // 处理申领总数量和已经发放总数量
|
|
|
- if (ObjectUtils.isNotEmpty(distributePageVos)) {
|
|
|
- List<Long> textbookClaimIds = distributePageVos.stream()
|
|
|
- .map(DistributePageVo::getId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- Map<Long, WfTextbookClaimItem> applicantTatolNumberMap = new HashMap<>();
|
|
|
- WfTextbookClaimItem wfTextbookClaimItem;
|
|
|
- if (ObjectUtils.isNotEmpty(textbookClaimIds)) {
|
|
|
- MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
|
|
|
- wfTextbookClaimItemLambdaQueryWrapper
|
|
|
- .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
- .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
|
|
|
- .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
|
|
|
- .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
|
|
|
- .groupBy(WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
- ;
|
|
|
- List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, wfTextbookClaimItemLambdaQueryWrapper);
|
|
|
- if (ObjectUtils.isNotEmpty(wfTextbookClaimItemList)) {
|
|
|
- applicantTatolNumberMap = wfTextbookClaimItemList.stream()
|
|
|
- .collect(Collectors.toMap(WfTextbookClaimItem::getWfTextbookClaimId, w -> w, (w1, w2) -> w1));
|
|
|
- }
|
|
|
+ // 当申领记录为空
|
|
|
+ List<DistributePageVo> records = page.getRecords();
|
|
|
+
|
|
|
+ if(CollectionUtils.isEmpty(records)){
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> claimIds = records.stream()
|
|
|
+ .map(DistributePageVo::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 查询统计数据
|
|
|
+ MPJLambdaWrapper<WfTextbookClaimItem> statsWrapper = new MPJLambdaWrapper<>();
|
|
|
+ statsWrapper
|
|
|
+ .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
+ .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
|
|
|
+ .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
|
|
|
+ .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds)
|
|
|
+ .groupBy(WfTextbookClaimItem::getWfTextbookClaimId);
|
|
|
+
|
|
|
+ List<WfTextbookClaimItem> statsList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, statsWrapper);
|
|
|
+ Map<Long, WfTextbookClaimItem> statsMap = statsList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ WfTextbookClaimItem::getWfTextbookClaimId,
|
|
|
+ Function.identity(),
|
|
|
+ (w1, w2) -> w1)); // 可视情况记录冲突日志
|
|
|
+
|
|
|
+ // 查询子项数据
|
|
|
+ MPJLambdaWrapper<WfTextbookClaimItem> itemWrapper = new MPJLambdaWrapper<>();
|
|
|
+ itemWrapper.disableSubLogicDel()
|
|
|
+ .select(WfTextbookClaimItem::getId)
|
|
|
+ .selectAs(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItemVo::getApplicantNumber)
|
|
|
+ .selectAs(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItemVo::getIssueNumber)
|
|
|
+ .select(WfTextbookClaimItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookClaimItemVo.class).contains(x.getProperty()))
|
|
|
+ .leftJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
|
|
|
+ .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
|
|
|
+ .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds);
|
|
|
+
|
|
|
+ List<WfTextbookClaimItemVo> itemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItemVo.class, itemWrapper);
|
|
|
+ Map<Long, List<WfTextbookClaimItemVo>> itemMap = itemList.stream()
|
|
|
+ .collect(Collectors.groupingBy(WfTextbookClaimItemVo::getWfTextbookClaimId));
|
|
|
+
|
|
|
+ // 查询发放记录
|
|
|
+ MPJLambdaWrapper<TextbookIssueRecord> recordWrapper = new MPJLambdaWrapper<>();
|
|
|
+ recordWrapper.disableSubLogicDel()
|
|
|
+ .selectAs(TextbookIssueRecord::getDataId, DistributeRecordVo::getWfTextbookClaimId)
|
|
|
+ .selectAs(TextbookIssueRecord::getDataItemId, DistributeRecordVo::getWfTextbookClaimItemId)
|
|
|
+ .selectAs(TextbookIssueRecord::getCreateDate, DistributeRecordVo::getIssueDate)
|
|
|
+ .selectAs(TextbookIssueRecord::getIssueNumber, DistributeRecordVo::getIssueNumber)
|
|
|
+ .selectAs(TextbookIssueRecord::getOrderNumber, DistributeRecordVo::getOrderNumber)
|
|
|
+ .selectAs(TextbookIssueRecord::getRemark, DistributeRecordVo::getRemark)
|
|
|
+ .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
|
|
|
+ .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
|
|
|
+ .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(XjrUser::getName, DistributeRecordVo::getIssueUser))
|
|
|
+ .in(TextbookIssueRecord::getDataId, claimIds);
|
|
|
+
|
|
|
+ List<DistributeRecordVo> recordList = textbookIssueRecordMapper.selectJoinList(DistributeRecordVo.class, recordWrapper);
|
|
|
+ Map<Long, List<DistributeRecordVo>> recordMap = recordList.stream()
|
|
|
+ .collect(Collectors.groupingBy(DistributeRecordVo::getWfTextbookClaimItemId));
|
|
|
+
|
|
|
+ // 组装数据
|
|
|
+ for (DistributePageVo vo : records) {
|
|
|
+ Long claimId = vo.getId();
|
|
|
+
|
|
|
+ // 填充统计信息
|
|
|
+ if (MapUtils.isNotEmpty(statsMap) && statsMap.containsKey(claimId)) {
|
|
|
+ WfTextbookClaimItem stat = statsMap.get(claimId);
|
|
|
+ vo.setApplicantTatolNumber(stat.getApplicantNumber());
|
|
|
+ vo.setIssueTatolNumber(stat.getIssueNumber());
|
|
|
}
|
|
|
- if (ObjectUtils.isNotEmpty(applicantTatolNumberMap)) {
|
|
|
- for (DistributePageVo distributePageVo : page.getRecords()) {
|
|
|
- wfTextbookClaimItem = applicantTatolNumberMap.get(distributePageVo.getId());
|
|
|
- if (ObjectUtils.isNotEmpty(wfTextbookClaimItem)) {
|
|
|
- distributePageVo.setApplicantTatolNumber(wfTextbookClaimItem.getApplicantNumber());
|
|
|
- distributePageVo.setIssueTatolNumber(wfTextbookClaimItem.getIssueNumber());
|
|
|
+
|
|
|
+ // 填充子项及发放记录
|
|
|
+ if (MapUtils.isNotEmpty(itemMap) && CollectionUtils.isNotEmpty(itemMap.get(claimId))) {
|
|
|
+ List<WfTextbookClaimItemVo> items = itemMap.get(claimId);
|
|
|
+ for (WfTextbookClaimItemVo item : items) {
|
|
|
+ if (recordMap.containsKey(item.getId())) {
|
|
|
+ item.setDistributeRecordVos(recordMap.get(item.getId()));
|
|
|
}
|
|
|
}
|
|
|
+ vo.setWfTextbookClaimItemVoList(items);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
return page;
|
|
|
}
|
|
|
|
|
|
@@ -324,6 +391,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
return textbookIssueRecordMapper.selectJoinList(DistributeRecordVo.class, textbookIssueRecordMPJLambdaWrapper);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public Boolean confirmDistribute(ConfirmDistributeDto dto) {
|
|
|
@@ -339,6 +407,21 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
issueTotalNum += wfTextbookClaimItem.getIssueNumber();
|
|
|
}
|
|
|
|
|
|
+ // 如果是班级申领,获取班级所有学生
|
|
|
+ List<XjrUser> stuList = new ArrayList<>();
|
|
|
+ if (ClaimTypeEnum.ClaimStudent.getCode().equals(wfTextbookClaim.getClaimType())
|
|
|
+ && ObjectUtils.isNotEmpty(wfTextbookClaim.getClassId())
|
|
|
+ ) {
|
|
|
+ MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ xjrUserMPJLambdaWrapper
|
|
|
+ .select(XjrUser::getId)
|
|
|
+ .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
|
|
|
+ .eq(BaseStudentSchoolRoll::getClassId, wfTextbookClaim.getClassId())
|
|
|
+ .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
|
|
|
+ ;
|
|
|
+ stuList = xjrUserMapper.selectJoinList(XjrUser.class, xjrUserMPJLambdaWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
// 获取所有入库记录
|
|
|
List<Long> textbookWarehouseRecordIds = new ArrayList<>();
|
|
|
for (ConfirmDistributeDto.TextbookClaimItem textbookClaimItem : dto.getTextbookClaimItemList()) {
|
|
|
@@ -406,7 +489,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimItemMap.get(textbookClaimItem.getTextbookClaimItemId());
|
|
|
|
|
|
if (ObjectUtils.isEmpty(wfTextbookClaimItem)) {
|
|
|
- throw new MyException("未找到申领项详细数据");
|
|
|
+ throw new MyException("申领详细数据发生更改,请刷新页面");
|
|
|
}
|
|
|
|
|
|
//判断总发放数量是否超出该申请项的申请数量
|
|
|
@@ -426,7 +509,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
for (ConfirmDistributeDto.TextbookWarehouseRecords textbookWarehouseRecords : textbookClaimItem.getTextbookWarehouseRecords()) {
|
|
|
TextbookWarehouseRecord textbookWarehouseRecord = textbookWarehouseRecordMap.get(textbookWarehouseRecords.getTextbookWarehouseRecordId());
|
|
|
if (ObjectUtils.isEmpty(textbookWarehouseRecord)) {
|
|
|
- throw new MyException("未找到入库详细数据");
|
|
|
+ throw new MyException("未找到对应入库详细数据");
|
|
|
}
|
|
|
|
|
|
if (textbookWarehouseRecord.getRemainNumber() < textbookWarehouseRecords.getConfirmNumber()) {
|
|
|
@@ -512,12 +595,16 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
// 如果申领项是个人申领,发放的时候应该直接帮助学生确认领取
|
|
|
if (ClaimTypeEnum.ClaimStudent.getCode().equals(wfTextbookClaim.getClaimType())) {
|
|
|
oldTextbookStudentClaim = byUserIdAndTextbookId.get("" + wfTextbookClaim.getApplicantUserId() + wfTextbookClaimItem.getTextbookId());
|
|
|
- if (ObjectUtils.isNotEmpty(oldTextbookStudentClaim) && (ObjectUtils.isEmpty(oldTextbookStudentClaim.getClaimSource()) || oldTextbookStudentClaim.getClaimSource() != 1)) {
|
|
|
+ if (ObjectUtils.isNotEmpty(oldTextbookStudentClaim)
|
|
|
+ && (ObjectUtils.isEmpty(oldTextbookStudentClaim.getClaimSource())
|
|
|
+ || oldTextbookStudentClaim.getClaimSource() != 1)
|
|
|
+ ) {
|
|
|
updateTextbookStudentClaim = new TextbookStudentClaim();
|
|
|
updateTextbookStudentClaim.setId(oldTextbookStudentClaim.getId());
|
|
|
updateTextbookStudentClaim.setIsClaim(1);
|
|
|
updateTextbookStudentClaim.setModifyDate(nowDate);
|
|
|
updateTextbookStudentClaim.setModifyUserId(loginUserId);
|
|
|
+ updateTextbookStudentClaim.setTextbookWarehouseRecordId(textbookWarehouseRecord.getId());
|
|
|
updateTextbookStudentClaim.setPrice(textbookWarehouseRecord.getSubtotal());
|
|
|
updateTextbookStudentClaim.setClaimSource(2);
|
|
|
updateList.add(updateTextbookStudentClaim);
|
|
|
@@ -530,11 +617,33 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
insertTextbookStudentClaim.setIsClaim(1);
|
|
|
insertTextbookStudentClaim.setCreateDate(nowDate);
|
|
|
insertTextbookStudentClaim.setCreateUserId(loginUserId);
|
|
|
+ insertTextbookStudentClaim.setTextbookWarehouseRecordId(textbookWarehouseRecord.getId());
|
|
|
insertTextbookStudentClaim.setPrice(textbookWarehouseRecord.getSubtotal());
|
|
|
insertTextbookStudentClaim.setClaimSource(2);
|
|
|
insertList.add(insertTextbookStudentClaim);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 如果申领项是班级申领,发放的时候应该直接生成领取记录
|
|
|
+ if (ClaimTypeEnum.ClaimClass.getCode().equals(wfTextbookClaim.getClaimType())) {
|
|
|
+ for (XjrUser stu : stuList) {
|
|
|
+ oldTextbookStudentClaim = byUserIdAndTextbookId.get("" + stu.getId() + wfTextbookClaimItem.getTextbookId());
|
|
|
+ if (ObjectUtils.isEmpty(oldTextbookStudentClaim)) {
|
|
|
+ insertTextbookStudentClaim = new TextbookStudentClaim();
|
|
|
+ insertTextbookStudentClaim.setBaseSemesterId(wfTextbookClaim.getBaseSemesterId());
|
|
|
+ insertTextbookStudentClaim.setClassId(wfTextbookClaim.getClassId());
|
|
|
+ insertTextbookStudentClaim.setStudentUserId(stu.getId());
|
|
|
+ insertTextbookStudentClaim.setTextbookId(wfTextbookClaimItem.getTextbookId());
|
|
|
+ insertTextbookStudentClaim.setIsClaim(0);
|
|
|
+ insertTextbookStudentClaim.setCreateDate(nowDate);
|
|
|
+ insertTextbookStudentClaim.setCreateUserId(loginUserId);
|
|
|
+ insertTextbookStudentClaim.setTextbookWarehouseRecordId(textbookWarehouseRecord.getId());
|
|
|
+ insertTextbookStudentClaim.setPrice(textbookWarehouseRecord.getSubtotal());
|
|
|
+ insertTextbookStudentClaim.setClaimSource(2);
|
|
|
+ insertList.add(insertTextbookStudentClaim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 修改征订项发放数量
|
|
|
@@ -583,6 +692,381 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
wfTextbookClaimWfTextbookClaimMapper.updateById(updateWfTextbookClaim);
|
|
|
return true;
|
|
|
}
|
|
|
+*/
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean confirmDistribute(ConfirmDistributeDto dto) {
|
|
|
+ // 1. 参数校验和初始化
|
|
|
+ validateInput(dto);
|
|
|
+
|
|
|
+ // 2. 获取基础数据
|
|
|
+ WfTextbookClaim claim = getClaimData(dto);
|
|
|
+ List<XjrUser> students = getRelatedStudents(claim);
|
|
|
+ Map<Long, TextbookWarehouseRecord> warehouseRecords = getWarehouseRecords(dto);
|
|
|
+
|
|
|
+ // 3. 处理发放逻辑
|
|
|
+ processDistribution(claim, dto, warehouseRecords, students);
|
|
|
+
|
|
|
+ // 4. 更新申领状态
|
|
|
+ updateClaimStatus(claim);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 参数校验和初始化
|
|
|
+ private void validateInput(ConfirmDistributeDto dto) {
|
|
|
+ if (ObjectUtils.isEmpty(dto.getTextbookClaimId())) {
|
|
|
+ throw new MyException("申领ID不能为空");
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isEmpty(dto.getTextbookClaimItemList())) {
|
|
|
+ throw new MyException("申领项列表不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 获取申领数据
|
|
|
+ private WfTextbookClaim getClaimData(ConfirmDistributeDto dto) {
|
|
|
+ WfTextbookClaim claim = this.getByIdDeep(dto.getTextbookClaimId());
|
|
|
+ if (ObjectUtils.isEmpty(claim) || CollectionUtils.isEmpty(claim.getWfTextbookClaimItemList())) {
|
|
|
+ throw new MyException("未找到申领数据或申领项为空");
|
|
|
+ }
|
|
|
+ return claim;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 获取关联学生数据
|
|
|
+ private List<XjrUser> getRelatedStudents(WfTextbookClaim claim) {
|
|
|
+ if (!ClaimTypeEnum.ClaimClass.getCode().equals(claim.getClaimType()) ||
|
|
|
+ ObjectUtils.isEmpty(claim.getClassId())) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ return xjrUserMapper.selectJoinList(XjrUser.class,
|
|
|
+ new MPJLambdaWrapper<XjrUser>()
|
|
|
+ .select(XjrUser::getId)
|
|
|
+ .innerJoin(BaseStudentSchoolRoll.class,
|
|
|
+ BaseStudentSchoolRoll::getUserId, XjrUser::getId)
|
|
|
+ .eq(BaseStudentSchoolRoll::getClassId, claim.getClassId())
|
|
|
+ .eq(BaseStudentSchoolRoll::getArchivesStatus,
|
|
|
+ ArchivesStatusEnum.FB2901.getCode()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 获取关联的入库单号数据
|
|
|
+ private Map<Long, TextbookWarehouseRecord> getWarehouseRecords(ConfirmDistributeDto dto) {
|
|
|
+ List<Long> recordIds = dto.getTextbookClaimItemList().stream()
|
|
|
+ .flatMap(item -> item.getTextbookWarehouseRecords().stream()
|
|
|
+ .map(ConfirmDistributeDto.TextbookWarehouseRecords::getTextbookWarehouseRecordId))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(recordIds)) {
|
|
|
+ throw new MyException("入库单号无效");
|
|
|
+ }
|
|
|
+
|
|
|
+ return textbookWarehouseRecordMapper.selectList(
|
|
|
+ Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
|
|
|
+ .in(TextbookWarehouseRecord::getId, recordIds)
|
|
|
+ .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(TextbookWarehouseRecord::getId, Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 处理发放逻辑
|
|
|
+ private void processDistribution(WfTextbookClaim claim, ConfirmDistributeDto dto,
|
|
|
+ Map<Long, TextbookWarehouseRecord> warehouseRecords,
|
|
|
+ List<XjrUser> students) {
|
|
|
+ Date now = new Date();
|
|
|
+ Long userId = StpUtil.getLoginIdAsLong();
|
|
|
+ int issueTimes = claim.getIssueTimes() + 1;
|
|
|
+
|
|
|
+ // 获取现有领取记录
|
|
|
+ Map<String, TextbookStudentClaim> existingClaims = getExistingStudentClaims(claim);
|
|
|
+
|
|
|
+ // 处理每个申领项
|
|
|
+ for (ConfirmDistributeDto.TextbookClaimItem item : dto.getTextbookClaimItemList()) {
|
|
|
+ processClaimItem(dto, claim, item, warehouseRecords, students, existingClaims,
|
|
|
+ now, userId, issueTimes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取现有领取记录
|
|
|
+ private Map<String, TextbookStudentClaim> getExistingStudentClaims(WfTextbookClaim claim) {
|
|
|
+ return textbookStudentClaimMapper.selectList(
|
|
|
+ Wrappers.lambdaQuery(TextbookStudentClaim.class)
|
|
|
+ .eq(TextbookStudentClaim::getBaseSemesterId, claim.getBaseSemesterId())
|
|
|
+ .eq(TextbookStudentClaim::getClassId, claim.getClassId()))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ t -> t.getStudentUserId() + "_" + t.getTextbookId(),
|
|
|
+ Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void processClaimItem(ConfirmDistributeDto dto, WfTextbookClaim claim,
|
|
|
+ ConfirmDistributeDto.TextbookClaimItem item,
|
|
|
+ Map<Long, TextbookWarehouseRecord> warehouseRecords,
|
|
|
+ List<XjrUser> students,
|
|
|
+ Map<String, TextbookStudentClaim> existingClaims,
|
|
|
+ Date now, Long userId, int issueTimes) {
|
|
|
+ WfTextbookClaimItem claimItem = claim.getWfTextbookClaimItemList().stream()
|
|
|
+ .filter(i -> i.getId().equals(item.getTextbookClaimItemId()))
|
|
|
+ .findFirst()
|
|
|
+ .orElseThrow(() -> new MyException("申领详细数据发生更改"));
|
|
|
+
|
|
|
+ validateIssueQuantity(claimItem, item);
|
|
|
+
|
|
|
+ // 处理每个入库记录
|
|
|
+ for (ConfirmDistributeDto.TextbookWarehouseRecords record : item.getTextbookWarehouseRecords()) {
|
|
|
+ TextbookWarehouseRecord warehouseRecord = warehouseRecords.get(record.getTextbookWarehouseRecordId());
|
|
|
+ if (warehouseRecord == null) {
|
|
|
+ throw new MyException("未找到对应入库详细数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证发放数量是否合法
|
|
|
+ validateRemainingQuantity(warehouseRecord, record, item);
|
|
|
+
|
|
|
+ // 更新库存
|
|
|
+ updateWarehouseRecord(warehouseRecord, record, now, userId);
|
|
|
+
|
|
|
+ // 创建出库记录
|
|
|
+ TextbookIssueRecord issueRecord = createIssueRecord(claim, claimItem, warehouseRecord, dto,
|
|
|
+ record, now, userId, issueTimes);
|
|
|
+ textbookIssueRecordMapper.insert(issueRecord);
|
|
|
+
|
|
|
+ // 处理学生领取记录
|
|
|
+ processStudentClaims(claim, claimItem, warehouseRecord, students,
|
|
|
+ existingClaims, now, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新申领项
|
|
|
+ updateClaimItem(claimItem, item.getConfirmTotalNumber());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证发放数量是否合法
|
|
|
+ private void validateIssueQuantity(WfTextbookClaimItem claimItem,
|
|
|
+ ConfirmDistributeDto.TextbookClaimItem item) {
|
|
|
+ int issued = ObjectUtils.defaultIfNull(claimItem.getIssueNumber(), 0);
|
|
|
+ int applied = ObjectUtils.defaultIfNull(claimItem.getApplicantNumber(), 0);
|
|
|
+ int confirming = ObjectUtils.defaultIfNull(item.getConfirmTotalNumber(), 0);
|
|
|
+
|
|
|
+ if (issued + confirming > applied) {
|
|
|
+ throw new MyException(String.format(
|
|
|
+ "教材[%s]发放总数量(%d)超出申领数量(%d)",
|
|
|
+ item.getTextbookIdCn(),
|
|
|
+ issued + confirming,
|
|
|
+ applied
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证库存是否充足
|
|
|
+ private void validateRemainingQuantity(TextbookWarehouseRecord warehouseRecord,
|
|
|
+ ConfirmDistributeDto.TextbookWarehouseRecords record,
|
|
|
+ ConfirmDistributeDto.TextbookClaimItem item
|
|
|
+ ) {
|
|
|
+ int remaining = ObjectUtils.defaultIfNull(warehouseRecord.getRemainNumber(), 0);
|
|
|
+ int confirming = ObjectUtils.defaultIfNull(record.getConfirmNumber(), 0);
|
|
|
+
|
|
|
+ if (remaining < confirming) {
|
|
|
+ throw new MyException(String.format(
|
|
|
+ "教材[%s]发放数量(%d)大于库存剩余数量(%d)",
|
|
|
+ item.getTextbookIdCn(),
|
|
|
+ confirming,
|
|
|
+ remaining
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证库存是否充足
|
|
|
+ private void updateWarehouseRecord(TextbookWarehouseRecord record,
|
|
|
+ ConfirmDistributeDto.TextbookWarehouseRecords confirmRecord,
|
|
|
+ Date now, Long userId) {
|
|
|
+ TextbookWarehouseRecord update = new TextbookWarehouseRecord();
|
|
|
+ update.setId(record.getId());
|
|
|
+ update.setModifyUserId(userId);
|
|
|
+ update.setModifyDate(now);
|
|
|
+ update.setIssuedNumber(ObjectUtils.defaultIfNull(record.getIssuedNumber(), 0)
|
|
|
+ + confirmRecord.getConfirmNumber());
|
|
|
+ update.setRemainNumber(ObjectUtils.defaultIfNull(record.getRemainNumber(), 0)
|
|
|
+ - confirmRecord.getConfirmNumber());
|
|
|
+
|
|
|
+ textbookWarehouseRecordMapper.updateById(update);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建出库记录
|
|
|
+ private TextbookIssueRecord createIssueRecord(WfTextbookClaim claim,
|
|
|
+ WfTextbookClaimItem claimItem,
|
|
|
+ TextbookWarehouseRecord warehouseRecord,
|
|
|
+ ConfirmDistributeDto dto,
|
|
|
+ ConfirmDistributeDto.TextbookWarehouseRecords confirmRecord,
|
|
|
+ Date now, Long userId, int issueTimes) {
|
|
|
+ // 生成出库单号
|
|
|
+ String orderNumber = generateOrderNumber(claimItem.getId(), warehouseRecord.getId());
|
|
|
+
|
|
|
+ TextbookIssueRecord record = new TextbookIssueRecord();
|
|
|
+ record.setBaseSemesterId(claim.getBaseSemesterId());
|
|
|
+ record.setOrderNumber(orderNumber);
|
|
|
+ record.setIssueMode(getIssueMode(claim.getClaimType()));
|
|
|
+ record.setDataId(claim.getId());
|
|
|
+ record.setDataItemId(claimItem.getId());
|
|
|
+ record.setTextbookWarehouseRecordId(warehouseRecord.getId());
|
|
|
+ record.setTextbookId(claimItem.getTextbookId());
|
|
|
+ record.setIssueNumber(confirmRecord.getConfirmNumber());
|
|
|
+ record.setRecedeNumber(0);
|
|
|
+ record.setActualIssueNumber(confirmRecord.getConfirmNumber());
|
|
|
+ record.setActualTotalPrice(
|
|
|
+ warehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(confirmRecord.getConfirmNumber()))
|
|
|
+ );
|
|
|
+
|
|
|
+ if (ObjectUtils.isNotEmpty(dto.getReceiveUserId())) {
|
|
|
+ record.setReceiveUserId(dto.getReceiveUserId());
|
|
|
+ } else {
|
|
|
+ record.setReceiveUserId(claim.getApplicantUserId());
|
|
|
+ }
|
|
|
+ record.setIssueUserId(userId);
|
|
|
+ record.setCreateDate(now);
|
|
|
+ record.setRemark(dto.getRemark());
|
|
|
+ record.setIssueTimes(issueTimes);
|
|
|
+
|
|
|
+ return record;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构造出库单号
|
|
|
+ private String generateOrderNumber(Long claimItemId, Long warehouseRecordId) {
|
|
|
+ LambdaQueryWrapper<TextbookIssueRecord> query = Wrappers.lambdaQuery(TextbookIssueRecord.class)
|
|
|
+ .eq(TextbookIssueRecord::getDataItemId, claimItemId)
|
|
|
+ .eq(TextbookIssueRecord::getTextbookWarehouseRecordId, warehouseRecordId)
|
|
|
+ .eq(TextbookIssueRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
|
|
|
+ .orderByDesc(TextbookIssueRecord::getOrderNumber)
|
|
|
+ .last("LIMIT 1");
|
|
|
+
|
|
|
+ TextbookIssueRecord lastRecord = textbookIssueRecordMapper.selectOne(query);
|
|
|
+
|
|
|
+ if (lastRecord != null) {
|
|
|
+ // 已有记录则递增序号
|
|
|
+ String[] parts = lastRecord.getOrderNumber().split("-");
|
|
|
+ int seq = Integer.parseInt(parts[parts.length - 1]) + 1;
|
|
|
+ return parts[0] + "-" + String.format("%03d", seq);
|
|
|
+ } else {
|
|
|
+ // 新记录生成初始单号
|
|
|
+ return "CK" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
|
|
|
+ + "-001";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判定申领类型
|
|
|
+ private String getIssueMode(String claimType) {
|
|
|
+ if (ClaimTypeEnum.ClaimStudent.getCode().equals(claimType)) {
|
|
|
+ return IssueModeEnum.ImStudent.getCode();
|
|
|
+ } else if (ClaimTypeEnum.ClaimClass.getCode().equals(claimType)) {
|
|
|
+ return IssueModeEnum.ImClass.getCode();
|
|
|
+ } else if (ClaimTypeEnum.ClaimTeacher.getCode().equals(claimType)) {
|
|
|
+ return IssueModeEnum.ImTeacher.getCode();
|
|
|
+ }
|
|
|
+ throw new MyException("未知的申领类型: " + claimType);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理学生领取记录
|
|
|
+ private void processStudentClaims(WfTextbookClaim claim,
|
|
|
+ WfTextbookClaimItem claimItem,
|
|
|
+ TextbookWarehouseRecord warehouseRecord,
|
|
|
+ List<XjrUser> students,
|
|
|
+ Map<String, TextbookStudentClaim> existingClaims,
|
|
|
+ Date now, Long userId) {
|
|
|
+ List<TextbookStudentClaim> toInsert = new ArrayList<>();
|
|
|
+ List<TextbookStudentClaim> toUpdate = new ArrayList<>();
|
|
|
+
|
|
|
+ if (ClaimTypeEnum.ClaimStudent.getCode().equals(claim.getClaimType())) {
|
|
|
+ // 个人申领直接确认
|
|
|
+ handleStudentClaim(claim.getApplicantUserId(), claim, claimItem,
|
|
|
+ warehouseRecord, existingClaims, now, userId, toInsert, toUpdate);
|
|
|
+ } else if (ClaimTypeEnum.ClaimClass.getCode().equals(claim.getClaimType())) {
|
|
|
+ // 班级申领为每个学生生成记录
|
|
|
+ students.forEach(student ->
|
|
|
+ handleStudentClaim(student.getId(), claim, claimItem,
|
|
|
+ warehouseRecord, existingClaims, now, userId, toInsert, toUpdate));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量操作
|
|
|
+ if (!toInsert.isEmpty()) {
|
|
|
+ for (TextbookStudentClaim insert : toInsert){
|
|
|
+ textbookStudentClaimMapper.insert(insert);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ if (!toUpdate.isEmpty()) {
|
|
|
+ for (TextbookStudentClaim update : toUpdate){
|
|
|
+ textbookStudentClaimMapper.updateById(update);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增或修改领取记录
|
|
|
+ private void handleStudentClaim(Long studentId,
|
|
|
+ WfTextbookClaim claim,
|
|
|
+ WfTextbookClaimItem claimItem,
|
|
|
+ TextbookWarehouseRecord warehouseRecord,
|
|
|
+ Map<String, TextbookStudentClaim> existingClaims,
|
|
|
+ Date now, Long userId,
|
|
|
+ List<TextbookStudentClaim> toInsert,
|
|
|
+ List<TextbookStudentClaim> toUpdate) {
|
|
|
+ String key = studentId + "_" + claimItem.getTextbookId();
|
|
|
+ TextbookStudentClaim existing = existingClaims.get(key);
|
|
|
+
|
|
|
+ if (existing != null) {
|
|
|
+ if ((ClaimTypeEnum.ClaimStudent.getCode().equals(claim.getClaimType()))
|
|
|
+ && !Integer.valueOf(1).equals(existing.getIsClaim())
|
|
|
+ ) {
|
|
|
+ TextbookStudentClaim update = new TextbookStudentClaim();
|
|
|
+ update.setId(existing.getId());
|
|
|
+ update.setIsClaim(1);
|
|
|
+ update.setModifyDate(now);
|
|
|
+ update.setModifyUserId(userId);
|
|
|
+ update.setTextbookWarehouseRecordId(warehouseRecord.getId());
|
|
|
+ update.setPrice(warehouseRecord.getSubtotal());
|
|
|
+ update.setClaimSource(2); // 管理员发放
|
|
|
+ toUpdate.add(update);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ TextbookStudentClaim insert = new TextbookStudentClaim();
|
|
|
+ insert.setBaseSemesterId(claim.getBaseSemesterId());
|
|
|
+ insert.setClassId(claim.getClassId());
|
|
|
+ insert.setStudentUserId(studentId);
|
|
|
+ insert.setTextbookId(claimItem.getTextbookId());
|
|
|
+ insert.setIsClaim(ClaimTypeEnum.ClaimStudent.getCode().equals(claim.getClaimType()) ? 1 : 0);
|
|
|
+ insert.setCreateDate(now);
|
|
|
+ insert.setCreateUserId(userId);
|
|
|
+ insert.setTextbookWarehouseRecordId(warehouseRecord.getId());
|
|
|
+ insert.setPrice(warehouseRecord.getSubtotal());
|
|
|
+ insert.setClaimSource(2); // 管理员发放
|
|
|
+ toInsert.add(insert);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新申领项
|
|
|
+ private void updateClaimItem(WfTextbookClaimItem claimItem, int confirmNumber) {
|
|
|
+ WfTextbookClaimItem update = new WfTextbookClaimItem();
|
|
|
+ update.setId(claimItem.getId());
|
|
|
+ update.setIssueNumber(ObjectUtils.defaultIfNull(claimItem.getIssueNumber(), 0) + confirmNumber);
|
|
|
+ wfTextbookClaimWfTextbookClaimItemMapper.updateById(update);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 更新申领状态
|
|
|
+ private void updateClaimStatus(WfTextbookClaim claim) {
|
|
|
+ long incompleteItems = wfTextbookClaimWfTextbookClaimItemMapper.selectCount(
|
|
|
+ new MPJLambdaWrapper<WfTextbookClaimItem>()
|
|
|
+ .select(WfTextbookClaimItem::getId)
|
|
|
+ .innerJoin(WfTextbookClaim.class,
|
|
|
+ WfTextbookClaim::getId, WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
+ .lt(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getApplicantNumber)
|
|
|
+ .eq(WfTextbookClaimItem::getWfTextbookClaimId, claim.getId()));
|
|
|
+
|
|
|
+ WfTextbookClaim update = new WfTextbookClaim();
|
|
|
+ update.setId(claim.getId());
|
|
|
+ update.setStatus(incompleteItems > 0 ? 2 : 3);
|
|
|
+ update.setIssueTimes(claim.getIssueTimes() + 1);
|
|
|
+ update.setModifyUserId(StpUtil.getLoginIdAsLong());
|
|
|
+ update.setModifyDate(new Date());
|
|
|
+
|
|
|
+ wfTextbookClaimWfTextbookClaimMapper.updateById(update);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -692,7 +1176,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto) {
|
|
|
+ public ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto) throws IOException {
|
|
|
MPJLambdaWrapper<WfTextbookClaim> wfTextbookClaimMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
wfTextbookClaimMPJLambdaWrapper
|
|
|
.disableSubLogicDel()
|
|
|
@@ -719,39 +1203,112 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
;
|
|
|
List<ClaimRecordsExportQueryVo> dataList = this.selectJoinList(ClaimRecordsExportQueryVo.class, wfTextbookClaimMPJLambdaWrapper);
|
|
|
|
|
|
- // 处理申领总数量和已经发放总数量
|
|
|
- if (ObjectUtils.isNotEmpty(dataList)) {
|
|
|
- List<Long> textbookClaimIds = dataList.stream()
|
|
|
- .map(ClaimRecordsExportQueryVo::getId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- Map<Long, WfTextbookClaimItem> applicantTatolNumberMap = new HashMap<>();
|
|
|
- WfTextbookClaimItem wfTextbookClaimItem;
|
|
|
- if (ObjectUtils.isNotEmpty(textbookClaimIds)) {
|
|
|
- MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
|
|
|
- wfTextbookClaimItemLambdaQueryWrapper
|
|
|
- .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
- .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
|
|
|
- .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
|
|
|
- .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
|
|
|
- .groupBy(WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
- ;
|
|
|
- List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, wfTextbookClaimItemLambdaQueryWrapper);
|
|
|
- if (ObjectUtils.isNotEmpty(wfTextbookClaimItemList)) {
|
|
|
- applicantTatolNumberMap = wfTextbookClaimItemList.stream()
|
|
|
- .collect(Collectors.toMap(WfTextbookClaimItem::getWfTextbookClaimId, w -> w, (w1, w2) -> w1));
|
|
|
- }
|
|
|
- }
|
|
|
- if (ObjectUtils.isNotEmpty(applicantTatolNumberMap)) {
|
|
|
- for (ClaimRecordsExportQueryVo vo : dataList) {
|
|
|
- wfTextbookClaimItem = applicantTatolNumberMap.get(vo.getId());
|
|
|
- if (ObjectUtils.isNotEmpty(wfTextbookClaimItem)) {
|
|
|
- vo.setApplicantTatolNumber(wfTextbookClaimItem.getApplicantNumber());
|
|
|
- vo.setIssueTatolNumber(wfTextbookClaimItem.getIssueNumber());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ List<Long> claimIds = dataList.stream()
|
|
|
+ .map(ClaimRecordsExportQueryVo::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 查询统计数据
|
|
|
+ MPJLambdaWrapper<WfTextbookClaimItem> statsWrapper = new MPJLambdaWrapper<>();
|
|
|
+ statsWrapper
|
|
|
+ .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
|
|
|
+ .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
|
|
|
+ .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
|
|
|
+ .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds)
|
|
|
+ .groupBy(WfTextbookClaimItem::getWfTextbookClaimId);
|
|
|
+
|
|
|
+ List<WfTextbookClaimItem> statsList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, statsWrapper);
|
|
|
+ Map<Long, WfTextbookClaimItem> statsMap = statsList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ WfTextbookClaimItem::getWfTextbookClaimId,
|
|
|
+ Function.identity(),
|
|
|
+ (w1, w2) -> w1)); // 可视情况记录冲突日志
|
|
|
+
|
|
|
+ // 查询子项数据
|
|
|
+ MPJLambdaWrapper<WfTextbookClaimItem> itemWrapper = new MPJLambdaWrapper<>();
|
|
|
+ itemWrapper.disableSubLogicDel()
|
|
|
+ .select(WfTextbookClaimItem::getId)
|
|
|
+ .selectAs(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItemVo::getApplicantNumber)
|
|
|
+ .selectAs(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItemVo::getIssueNumber)
|
|
|
+ .select(WfTextbookClaimItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookClaimItemVo.class).contains(x.getProperty()))
|
|
|
+ .leftJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
|
|
|
+ .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
|
|
|
+ .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds);
|
|
|
+
|
|
|
+ List<WfTextbookClaimItemVo> itemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItemVo.class, itemWrapper);
|
|
|
+ Map<Long, List<WfTextbookClaimItemVo>> itemMap = itemList.stream()
|
|
|
+ .collect(Collectors.groupingBy(WfTextbookClaimItemVo::getWfTextbookClaimId));
|
|
|
+
|
|
|
+ // 查询发放记录
|
|
|
+ MPJLambdaWrapper<TextbookIssueRecord> recordWrapper = new MPJLambdaWrapper<>();
|
|
|
+ recordWrapper.disableSubLogicDel()
|
|
|
+ .selectAs(TextbookIssueRecord::getDataId, DistributeRecordVo::getWfTextbookClaimId)
|
|
|
+ .selectAs(TextbookIssueRecord::getDataItemId, DistributeRecordVo::getWfTextbookClaimItemId)
|
|
|
+ .selectAs(TextbookIssueRecord::getCreateDate, DistributeRecordVo::getIssueDate)
|
|
|
+ .selectAs(TextbookIssueRecord::getIssueNumber, DistributeRecordVo::getIssueNumber)
|
|
|
+ .selectAs(TextbookIssueRecord::getOrderNumber, DistributeRecordVo::getOrderNumber)
|
|
|
+ .selectAs(TextbookIssueRecord::getRemark, DistributeRecordVo::getRemark)
|
|
|
+ .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
|
|
|
+ .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
|
|
|
+ .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
|
|
|
+ w -> w
|
|
|
+ .selectAs(XjrUser::getName, DistributeRecordVo::getIssueUser))
|
|
|
+ .in(TextbookIssueRecord::getDataId, claimIds);
|
|
|
+
|
|
|
+ List<DistributeRecordVo> recordList = textbookIssueRecordMapper.selectJoinList(DistributeRecordVo.class, recordWrapper);
|
|
|
+ Map<Long, List<DistributeRecordVo>> recordMap = recordList.stream()
|
|
|
+ .collect(Collectors.groupingBy(DistributeRecordVo::getWfTextbookClaimItemId));
|
|
|
+
|
|
|
+ // 开始写入
|
|
|
+ Workbook workbook = new XSSFWorkbook();
|
|
|
+ // 创建一个工作表(sheet)
|
|
|
+ String sheetName = "sheet1";
|
|
|
+ Sheet sheet = workbook.createSheet(sheetName);
|
|
|
+
|
|
|
+ // 出参vo字段数量
|
|
|
+ ClaimRecordsExportQueryVo obj = new ClaimRecordsExportQueryVo();
|
|
|
+ List<ImportConfig> importConfigs = ImportExcelUtil.allFields(obj);
|
|
|
+
|
|
|
+ // 写大标题
|
|
|
+ int rowNumber = 0;
|
|
|
+ ImportExcelUtil.createBigHead(workbook, sheet, "教材申领情况", rowNumber++, importConfigs.size() - 1);
|
|
|
+
|
|
|
+ // 表头
|
|
|
+ ImportExcelUtil.createHead(workbook, sheet, importConfigs, IndexedColors.YELLOW.getIndex(), IndexedColors.RED.getIndex(), rowNumber++);
|
|
|
+
|
|
|
+ // 字体内容格式
|
|
|
+ Font font = workbook.createFont();
|
|
|
+ font.setBold(false);// 设置为粗体
|
|
|
+ font.setFontName("宋体");
|
|
|
+ font.setFontHeightInPoints((short) 12);
|
|
|
+
|
|
|
+ // 单元格样式
|
|
|
+ CellStyle cellStyle = workbook.createCellStyle();
|
|
|
+ cellStyle.setFont(font); // 将字体应用到样式
|
|
|
+ cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
+ cellStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+
|
|
|
+ // 设置边框样式为细线
|
|
|
+ cellStyle.setBorderTop(BorderStyle.THIN);
|
|
|
+ cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 设置顶部边框颜色
|
|
|
+
|
|
|
+ cellStyle.setBorderBottom(BorderStyle.THIN);
|
|
|
+ cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 设置底部边框颜色
|
|
|
+
|
|
|
+ cellStyle.setBorderLeft(BorderStyle.THIN);
|
|
|
+ cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 设置左边框颜色
|
|
|
+
|
|
|
+ cellStyle.setBorderRight(BorderStyle.THIN);
|
|
|
+ cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 设置右边框颜色
|
|
|
+
|
|
|
+ // 记录写入
|
|
|
+ List<String> claimVo;
|
|
|
+ List<String> claimItemVo;
|
|
|
+ List<String> claimItemIssueVo;
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
for (ClaimRecordsExportQueryVo vo : dataList) {
|
|
|
if (ObjectUtils.isNotEmpty(vo.getClaimType()) && ClaimTypeEnum.ClaimClass.getCode().equals(vo.getClaimType())) {
|
|
|
vo.setReceiver(vo.getClassIdCn());
|
|
|
@@ -767,11 +1324,105 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
|
|
|
} else {
|
|
|
vo.setStatusStr("未发放");
|
|
|
}
|
|
|
+
|
|
|
+ Long claimId = vo.getId();
|
|
|
+
|
|
|
+ // 填充统计信息
|
|
|
+ if (MapUtils.isNotEmpty(statsMap) && statsMap.containsKey(claimId)) {
|
|
|
+ WfTextbookClaimItem stat = statsMap.get(claimId);
|
|
|
+ vo.setApplicantTatolNumber(stat.getApplicantNumber());
|
|
|
+ vo.setIssueTatolNumber(stat.getIssueNumber());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 申领总记录
|
|
|
+ claimVo = new ArrayList<>();
|
|
|
+ claimVo.add(vo.getBaseSemesterIdCn());
|
|
|
+ claimVo.add(vo.getClaimTypeCn());
|
|
|
+ claimVo.add(vo.getReceiver());
|
|
|
+ if (StringUtils.isNotEmpty(vo.getClassIdCn())) {
|
|
|
+ claimVo.add(vo.getClassIdCn());
|
|
|
+ } else {
|
|
|
+ claimVo.add("无");
|
|
|
+ }
|
|
|
+ claimVo.add(vo.getApplicantTatolNumber() + "");
|
|
|
+ claimVo.add(vo.getStatusStr());
|
|
|
+ claimVo.add(vo.getIssueTatolNumber() + "");
|
|
|
+
|
|
|
+ // 填充子项及发放记录
|
|
|
+ int mergeClaim = 0;
|
|
|
+ if (MapUtils.isNotEmpty(itemMap) && CollectionUtils.isNotEmpty(itemMap.get(claimId))) {
|
|
|
+ List<WfTextbookClaimItemVo> items = itemMap.get(claimId);
|
|
|
+ for (WfTextbookClaimItemVo item : items) {
|
|
|
+ mergeClaim++;
|
|
|
+ claimItemVo = new ArrayList<>(claimVo);
|
|
|
+ claimItemVo.add(item.getTextbookIdCN());
|
|
|
+ claimItemVo.add(item.getIssn());
|
|
|
+ claimItemVo.add(item.getApplicantNumber() + "");
|
|
|
+ claimItemVo.add(item.getIssueNumber() + "");
|
|
|
+
|
|
|
+ int mergeClaimItem = 0;
|
|
|
+ if (recordMap.containsKey(item.getId())) {
|
|
|
+ List<DistributeRecordVo> issues = recordMap.get(item.getId());
|
|
|
+ for (DistributeRecordVo issue : issues) {
|
|
|
+ mergeClaimItem++;
|
|
|
+ claimItemIssueVo = new ArrayList<>(claimItemVo);
|
|
|
+ LocalDateTime localDateTime = issue.getIssueDate().toInstant()
|
|
|
+ .atZone(ZoneId.systemDefault())
|
|
|
+ .toLocalDateTime();
|
|
|
+ claimItemIssueVo.add(localDateTime.format(formatter));
|
|
|
+ claimItemIssueVo.add(issue.getIssueUser());
|
|
|
+ claimItemIssueVo.add(issue.getOrderNumber());
|
|
|
+ claimItemIssueVo.add(issue.getIssueNumber() + "");
|
|
|
+
|
|
|
+ Row dataRow = sheet.createRow(rowNumber++);
|
|
|
+ for (int j = 0; j < claimItemIssueVo.size(); j++) {
|
|
|
+ String content = claimItemIssueVo.get(j);
|
|
|
+ Cell cell = dataRow.createCell(j);
|
|
|
+ cell.setCellValue(content);
|
|
|
+ cell.setCellStyle(cellStyle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 合并申领项
|
|
|
+ if (mergeClaimItem > 1) {
|
|
|
+ for (int k = 7; k < 11; k++) {
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(rowNumber - mergeClaimItem, rowNumber - 1, k, k));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Row dataRow = sheet.createRow(rowNumber++);
|
|
|
+ for (int j = 0; j < claimItemVo.size(); j++) {
|
|
|
+ String content = claimItemVo.get(j);
|
|
|
+ Cell cell = dataRow.createCell(j);
|
|
|
+ cell.setCellValue(content);
|
|
|
+ cell.setCellStyle(cellStyle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合并申领
|
|
|
+ if (mergeClaim > 1) {
|
|
|
+ for (int k = 0; k < 7; k++) {
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(rowNumber - mergeClaim, rowNumber - 1, k, k));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Row dataRow = sheet.createRow(rowNumber++);
|
|
|
+ for (int j = 0; j < claimVo.size(); j++) {
|
|
|
+ String content = claimVo.get(j);
|
|
|
+ Cell cell = dataRow.createCell(j);
|
|
|
+ cell.setCellValue(content);
|
|
|
+ cell.setCellStyle(cellStyle);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- ByteArrayOutputStream bot = new ByteArrayOutputStream();
|
|
|
- EasyExcel.write(bot, ClaimRecordsExportQueryVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
|
|
|
+ // 自动列宽
|
|
|
+ for (int i = 0; i < importConfigs.size(); i++) {
|
|
|
+ sheet.autoSizeColumn(i);
|
|
|
+ }
|
|
|
|
|
|
+ ByteArrayOutputStream bot = new ByteArrayOutputStream();
|
|
|
+ workbook.write(bot);
|
|
|
return bot;
|
|
|
}
|
|
|
}
|