package com.xjrsoft.module.textbook.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; import com.alibaba.excel.EasyExcel; 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.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.xjrsoft.common.enums.DeleteMark; import com.xjrsoft.common.enums.WarehouseModeEnum; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.common.page.ConventPage; import com.xjrsoft.common.utils.LocalDateTimeUtil; import com.xjrsoft.common.utils.VoToColumnUtil; import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.entity.BaseCourseSubject; import com.xjrsoft.module.base.entity.BaseGrade; import com.xjrsoft.module.base.entity.BaseSemester; import com.xjrsoft.module.generator.constant.ComponentTypeConstant; import com.xjrsoft.module.generator.entity.ColumnConfig; import com.xjrsoft.module.generator.entity.ImportConfig; import com.xjrsoft.module.system.entity.DictionaryDetail; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.textbook.dto.*; import com.xjrsoft.module.textbook.entity.*; import com.xjrsoft.module.textbook.mapper.*; import com.xjrsoft.module.textbook.service.ITextbookSubscriptionService; import com.xjrsoft.module.textbook.vo.*; import com.xjrsoft.module.veb.util.ImportExcelUtil; import com.xjrsoft.module.veb.vo.InternshipPlanImportVo; import lombok.AllArgsConstructor; import oracle.sql.INTERVALDS; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.sql.Time; import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * @title: 教材教辅征订记录表 * @Author dzx * @Date: 2024-12-16 * @Version 1.0 */ @Service @AllArgsConstructor public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl implements ITextbookSubscriptionService { private final TextbookSubscriptionMapper textbookSubscriptionTextbookSubscriptionMapper; private final TextbookSubscriptionItemMapper textbookSubscriptionTextbookSubscriptionItemMapper; private final TextbookSubscriptionClassMapper textbookSubscriptionClassMapper; private final TextbookSubscriptionItemClassMapper textbookSubscriptionItemClassMapper; private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper; private final TextbookSubscriptionItemHistoryMapper textbookSubscriptionItemHistoryMapper; private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper; @Override public IPage pageRubAndHand(TextbookSubscriptionPageDto dto) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper .select(TextbookSubscription::getId) .selectAs(BaseSemester::getName, TextbookSubscriptionPageVo::getBaseSemesterIdCn) .select(TextbookSubscription.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionPageVo.class).contains(x.getProperty())) .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookSubscription::getBaseSemesterId) .eq(dto.getBaseSemesterId() != null && dto.getBaseSemesterId() > 0, TextbookSubscription::getBaseSemesterId, dto.getBaseSemesterId()) .eq(dto.getSubscriptionMethod() != null && dto.getSubscriptionMethod() > 0, TextbookSubscription::getSubscriptionMethod, dto.getSubscriptionMethod()) .eq(StringUtils.isNotBlank(dto.getId()), TextbookSubscription::getId, dto.getId()) .orderByDesc(TextbookSubscription::getCreateDate) ; return this.selectJoinListPage(ConventPage.getPage(dto), TextbookSubscriptionPageVo.class, queryWrapper); } @Override public IPage instockroomRecordsPage(InstockroomRecordsPageDto dto) { MPJLambdaWrapper textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>(); textbookWarehouseRecordMPJLambdaWrapper .disableSubLogicDel() .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(InstockroomRecordsPageVo.class).contains(x.getProperty())) .selectAs(TextbookWarehouseRecord::getDiscount, InstockroomRecordsPageVo::getActualDiscount) .selectAs(TextbookWarehouseRecord::getSubtotal, InstockroomRecordsPageVo::getActualPrice) .selectAs(TextbookWarehouseRecordDetail::getWarehouseNumber, InstockroomRecordsPageVo::getWarehouseNumber) .selectAs(TextbookWarehouseRecordDetail::getCreateDate, InstockroomRecordsPageVo::getCreateDate) .innerJoin(TextbookWarehouseRecordDetail.class, TextbookWarehouseRecordDetail::getTextbookWarehouseRecordId, TextbookWarehouseRecord::getId) .leftJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId) .leftJoin(TextbookSubscriptionItem.class, TextbookSubscriptionItem::getId, TextbookWarehouseRecord::getDataItemId, wrapper -> wrapper .selectAs(TextbookSubscriptionItem::getStudentNum, InstockroomRecordsPageVo::getStudentNum) .selectAs(TextbookSubscriptionItem::getTeacherNum, InstockroomRecordsPageVo::getTeacherNum) .select("t3.student_num + t3.teacher_num as tatol_num") ) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wrapper -> wrapper .selectAs(BaseCourseSubject::getName, InstockroomRecordsPageVo::getCourseSubjectIdCn) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wrapper -> wrapper .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getTextbookTypeCn) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecordDetail::getWarehouseMode, wrapper -> wrapper .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getWarehouseModeCn) ) .leftJoin(XjrUser.class, XjrUser::getId, TextbookWarehouseRecordDetail::getCreateUserId, wrapper -> wrapper .selectAs(XjrUser::getName, InstockroomRecordsPageVo::getCreateUserIdCn) ) .eq(TextbookWarehouseRecord::getDataId, dto.getId()) .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) .eq(TextbookWarehouseRecordDetail::getDeleteMark, DeleteMark.NODELETE.getCode()) .eq(Textbook::getDeleteMark, DeleteMark.NODELETE.getCode()) .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode()) ; return textbookWarehouseRecordMapper.selectJoinPage(ConventPage.getPage(dto), InstockroomRecordsPageVo.class, textbookWarehouseRecordMPJLambdaWrapper); } @Override public List instockroomList(TextbookInstockroomListDto dto) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper .disableSubLogicDel() .selectAs(Textbook::getPrice, TextbookInstockroomListVo::getPrice) .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount) .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice) .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookInstockroomListVo::getStudentSubscriptionNumber) .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookInstockroomListVo::getTeacherSubscriptionNumber) .selectAs(TextbookSubscriptionItem::getId, TextbookInstockroomListVo::getTextbookSubscriptionItemId) .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty())) .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty())) // .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice) // .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount) .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId) .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getDataItemId, TextbookSubscriptionItem::getId) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wrapper -> wrapper .selectAs(BaseCourseSubject::getName, TextbookInstockroomListVo::getCourseName) .like(StringUtils.isNotEmpty(dto.getCourseName()), BaseCourseSubject::getName, dto.getCourseName()) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wrapper -> wrapper .selectAs(DictionaryDetail::getName, TextbookInstockroomListVo::getTextbookTypeCn) ) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId()) .like(StringUtils.isNotEmpty(dto.getBookName()), Textbook::getBookName, dto.getBookName()) .like(StringUtils.isNotEmpty(dto.getIssn()), Textbook::getIssn, dto.getIssn()) .orderByAsc(TextbookSubscriptionItem::getInStockNum) ; return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookInstockroomListVo.class, queryWrapper); } @Override public List everyInstockroomList(TextbookInstockroomOnceListDto dto) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper .select(TextbookSubscriptionItem::getId) .selectAs(TextbookWarehouseRecord::getWarehouseNumber, TextbookInstockroomOnceListVo::getOnceInStockNum) .selectAs(TextbookWarehouseRecord::getCreateDate, TextbookInstockroomOnceListVo::getCreateDate) .selectAs(TextbookWarehouseRecord::getCreateUserId, TextbookInstockroomOnceListVo::getCreateUserId) .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomOnceListVo.class).contains(x.getProperty())) .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wrapper -> wrapper .selectAs(BaseCourseSubject::getName, TextbookInstockroomOnceListVo::getCourseName) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wrapper -> wrapper .selectAs(DictionaryDetail::getName, TextbookInstockroomOnceListVo::getTextbookTypeCn) ) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId()) .orderByAsc(TextbookSubscriptionItem::getInStockNum) ; return textbookWarehouseRecordMapper.selectJoinList(TextbookInstockroomOnceListVo.class, queryWrapper); } @Override public TextbookSubscriptionVo infoRubAndHand(Long id) { TextbookSubscription textbookSubscription = this.getById(id); TextbookSubscriptionVo textbookSubscriptionVo = BeanUtil.toBean(textbookSubscription, TextbookSubscriptionVo.class); MPJLambdaWrapper textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>(); textbookSubscriptionItemMPJLambdaWrapper .select(TextbookSubscriptionItem::getId) .select(TextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemVo.class).contains(x.getProperty())) .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId, wrapper -> wrapper .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemVo.class).contains(x.getProperty())) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wp -> wp .selectAs(BaseCourseSubject::getName, TextbookSubscriptionItemVo::getCourseSubjectIdCn) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wp -> wp .selectAs(DictionaryDetail::getName, TextbookSubscriptionItemVo::getTextbookTypeCn) ) ) .selectAs(TextbookSubscriptionItem::getPrice, TextbookSubscriptionItemVo::getPricing) .selectAs(Textbook::getPrice, TextbookSubscriptionItemVo::getPrice) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, id) ; List list = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionItemVo.class, textbookSubscriptionItemMPJLambdaWrapper); textbookSubscriptionVo.setTextbookSubscriptionItemList(list); return textbookSubscriptionVo; } @Override public TextbookSubscriptionDetailVo detail(Long id) { TextbookSubscription textbookSubscription = this.getById(id); if (ObjectUtils.isEmpty(textbookSubscription)) { throw new MyException("证订记录被修改,请刷新重试"); } // 获取所有的证订项目 LambdaQueryWrapper subscriptionItemLambdaQueryWrapper = new LambdaQueryWrapper<>(); subscriptionItemLambdaQueryWrapper .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, id) .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode()) ; List textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(subscriptionItemLambdaQueryWrapper); int stuNum = 0; int teaNum = 0; BigDecimal totalPrice = BigDecimal.valueOf(0); BigDecimal currentPrice; BigDecimal currentTotalPrice; for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscriptionItemList) { stuNum += textbookSubscriptionItem.getStudentNum(); teaNum += textbookSubscriptionItem.getTeacherNum(); currentPrice = textbookSubscriptionItem.getPrice(); currentTotalPrice = currentPrice.multiply(BigDecimal.valueOf(textbookSubscriptionItem.getTeacherNum() + textbookSubscriptionItem.getStudentNum())); totalPrice = totalPrice.add(currentTotalPrice); } TextbookSubscriptionDetailVo textbookSubscriptionDetailVo = new TextbookSubscriptionDetailVo(); textbookSubscriptionDetailVo.setId(String.valueOf(id)); textbookSubscriptionDetailVo.setStudentTatolNum(stuNum); textbookSubscriptionDetailVo.setTeacherTatolNum(teaNum); textbookSubscriptionDetailVo.setSum(stuNum + teaNum); textbookSubscriptionDetailVo.setSumPrice(totalPrice); return textbookSubscriptionDetailVo; } @Override public IPage itemPage(TextbookSubscriptionItemPageDto dto) { MPJLambdaWrapper textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>(); textbookSubscriptionItemMPJLambdaWrapper .select(TextbookSubscriptionItem::getId) .select(TextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemPageVo.class).contains(x.getProperty())) .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId, wrapper -> wrapper .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemPageVo.class).contains(x.getProperty())) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wp -> wp .selectAs(BaseCourseSubject::getName, TextbookSubscriptionItemPageVo::getCourseSubjectIdCn) .like(StringUtils.isNotBlank(dto.getCourseSubjectIdCn()), BaseCourseSubject::getName, dto.getCourseSubjectIdCn()) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wp -> wp .selectAs(DictionaryDetail::getName, TextbookSubscriptionItemPageVo::getTextbookTypeCn) ) .like(StringUtils.isNotBlank(dto.getBookName()), Textbook::getBookName, dto.getBookName()) .eq(StringUtils.isNotBlank(dto.getTextbookType()), Textbook::getTextbookType, dto.getTextbookType()) ) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId()) ; IPage page = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinPage(ConventPage.getPage(dto), TextbookSubscriptionItemPageVo.class, textbookSubscriptionItemMPJLambdaWrapper); return page; } @Override public IPage baseclassPage(BaseclassPageDto dto) { // 查询征订记录总的征订班级 MPJLambdaWrapper baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>(); baseClassMPJLambdaWrapper .disableSubLogicDel() .distinct() .selectAs(BaseGrade::getName, BaseclassPageVo::getGradeIdCn) .selectAs(XjrUser::getName, BaseclassPageVo::getTeacherIdCn) .select(" (select" + " count(a.id)" + " from base_student_school_roll a" + " where a.class_id = t1.base_class_id" + " and a.archives_status = 'FB2901'" + " and a.delete_mark = 0" + " ) as total_student") .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseclassPageVo.class).contains(x.getProperty())) .innerJoin(TextbookSubscriptionItemClass.class, TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, TextbookSubscriptionItem::getId) .leftJoin(BaseClass.class, BaseClass::getId, TextbookSubscriptionItemClass::getBaseClassId) .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId) .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId) .eq(ObjectUtils.isNotEmpty(dto.getId()), TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getId()) .eq(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId()), TextbookSubscriptionItem::getId, dto.getTextbookSubscriptionItemId()) .eq(TextbookSubscriptionClass::getDeleteMark, DeleteMark.NODELETE.getCode()) ; return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinPage(ConventPage.getPage(dto), BaseclassPageVo.class, baseClassMPJLambdaWrapper); } @Override public List itemListConfirmDistribute(SubscriptionItemListDistributeDto dto) { MPJLambdaWrapper textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>(); textbookWarehouseRecordMPJLambdaWrapper .disableSubLogicDel() .select(TextbookWarehouseRecord::getId) .selectAs(TextbookWarehouseRecord::getSubtotal, SubscriptionItemListDistributeVo::getActulPrice) .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(SubscriptionItemListDistributeVo.class).contains(x.getProperty())) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecord::getWarehouseMode, wrapper -> wrapper .selectAs(DictionaryDetail::getName, SubscriptionItemListDistributeVo::getWarehouseModeCn) ) .eq(TextbookWarehouseRecord::getTextbookId, dto.getTextbookId()) .gt(TextbookWarehouseRecord::getRemainNumber, 0) .orderByAsc(TextbookWarehouseRecord::getCreateDate) ; return textbookWarehouseRecordMapper.selectJoinList(SubscriptionItemListDistributeVo.class, textbookWarehouseRecordMPJLambdaWrapper); } @Override @Transactional(rollbackFor = Exception.class) public Boolean add(TextbookSubscription textbookSubscription) { // 处理征订表 int sum = 0; for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) { textbookSubscriptionItem.setStudentNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getStudentNum()) ? 0 : textbookSubscriptionItem.getStudentNum()); textbookSubscriptionItem.setTeacherNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getTeacherNum()) ? 0 : textbookSubscriptionItem.getTeacherNum()); sum += textbookSubscriptionItem.getStudentNum() + textbookSubscriptionItem.getTeacherNum(); } textbookSubscription.setSum(sum); textbookSubscription.setCreateDate(new Date()); // 处理征订单号 StringBuilder sb = new StringBuilder(); sb.append("ZD"); LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); String nowStr = now.format(dateTimeFormatter); sb.append(nowStr); // 根据当前征订编号前缀去数据库找是否已经存在了 LambdaQueryWrapper textbookSubscriptionLambdaQueryWrapper = new LambdaQueryWrapper<>(); textbookSubscriptionLambdaQueryWrapper .like(TextbookSubscription::getOrderNumber, sb.toString() + "%") .eq(TextbookSubscription::getDeleteMark, DeleteMark.NODELETE.getCode()) .orderByDesc(TextbookSubscription::getOrderNumber) .last("limit 1") ; TextbookSubscription maxOrderNumber = textbookSubscriptionTextbookSubscriptionMapper.selectOne(textbookSubscriptionLambdaQueryWrapper); int oldOrderInteger = 1; if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){ String oldOrderNumber = maxOrderNumber.getOrderNumber(); String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3); oldOrderInteger = Integer.parseInt(oldOrder); oldOrderInteger += 1; } String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数 textbookSubscription.setOrderNumber(sb + newOrder); textbookSubscriptionTextbookSubscriptionMapper.insert(textbookSubscription); // // 处理征订和班级关联表 // if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod()) // && textbookSubscription.getSubscriptionMethod() == 1 // && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds()) // ) { // String[] classIdArr = textbookSubscription.getBaseClassIds().split(","); // TextbookSubscriptionClass textbookSubscriptionClass; // for (String str : classIdArr) { // textbookSubscriptionClass = new TextbookSubscriptionClass(); // textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId()); // textbookSubscriptionClass.setBaseClassId(Long.parseLong(str)); // textbookSubscriptionClass.setCreateDate(new Date()); // textbookSubscriptionClassMapper.insert(textbookSubscriptionClass); // } // } // 处理征订项 TextbookSubscriptionItemClass textbookSubscriptionItemClass; for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) { String[] classIdArr = new String[0]; if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod()) && textbookSubscription.getSubscriptionMethod() == 1 && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getClassIds()) ) { classIdArr = textbookSubscriptionItem.getClassIds().split(","); } textbookSubscriptionItem.setUseClassNum(classIdArr.length); textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId()); textbookSubscriptionItem.setCreateDate(new Date()); textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem); // 处理征订项和班级关联表 for (String str : classIdArr) { textbookSubscriptionItemClass = new TextbookSubscriptionItemClass(); textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId()); textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str)); textbookSubscriptionItemClass.setCreateDate(new Date()); textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass); } } return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean instockroom(List dtos) { if (dtos.isEmpty()) { return false; } TextbookSubscription textbookSubscription = this.getById(dtos.get(0).getTextbookSubscriptionId()); if (ObjectUtils.isEmpty(textbookSubscription)) { throw new MyException("请选择需要入库的征订记录"); } List textbookSubscriptionItemIds = new ArrayList<>(); for (TextbookInstockroomDto dto : dtos) { if(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())){ textbookSubscriptionItemIds.add(dto.getTextbookSubscriptionItemId()); } } if (textbookSubscriptionItemIds.isEmpty()) { throw new MyException("请选择需要入库的教材"); } //获取需要修改的list LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper .select(TextbookSubscriptionItem::getId) .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItem.class).contains(x.getProperty())) .in(TextbookSubscriptionItem::getId, textbookSubscriptionItemIds) .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode()) ; List textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(queryWrapper); if (textbookSubscriptionItemList.isEmpty()) { throw new MyException("证订项已经变更,请刷新重试"); } Map itemByIdMap = new HashMap<>(); for (TextbookSubscriptionItem el : textbookSubscriptionItemList) { if(ObjectUtils.isNotEmpty(el.getId()) && !itemByIdMap.containsKey(el.getId())){ itemByIdMap.put(el.getId(), el); } } // 获取当前征订已经产生的入库记录 LambdaQueryWrapper textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); textbookWarehouseRecordLambdaQueryWrapper .eq(TextbookWarehouseRecord::getDataId, textbookSubscription.getId()) .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) ; List textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper); Map textbookWarehouseRecordByItemIdMap = new HashMap<>(); for (TextbookWarehouseRecord twr : textbookWarehouseRecords) { if(ObjectUtils.isNotEmpty(twr.getDataItemId()) && !textbookWarehouseRecordByItemIdMap.containsKey(twr.getDataItemId())){ textbookWarehouseRecordByItemIdMap.put(twr.getDataItemId(), twr); } } // 处理入库单号 StringBuilder sb = new StringBuilder(); sb.append("RK"); LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); String nowStr = now.format(dateTimeFormatter); sb.append(nowStr); // 根据当前征订编号前缀去数据库找是否已经存在了 LambdaQueryWrapper maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>(); maxOrderNumberLambdaQueryWrapper .like(TextbookWarehouseRecord::getOrderNumber, sb.toString() + "%") .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) .orderByDesc(TextbookWarehouseRecord::getOrderNumber) .last("limit 1") ; TextbookWarehouseRecord maxOrderNumber = textbookWarehouseRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper); int oldOrderInteger = 0; if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){ String oldOrderNumber = maxOrderNumber.getOrderNumber(); String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3); oldOrderInteger = Integer.parseInt(oldOrder); } // 处理入库细节 TextbookSubscriptionItem old = null; TextbookSubscriptionItem updateItem; TextbookWarehouseRecord textbookWarehouseRecord; TextbookWarehouseRecord oldTextbookWarehouseRecord = null; TextbookWarehouseRecordDetail textbookWarehouseRecordDetail; for (TextbookInstockroomDto dto : dtos) { if (ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())) { old = itemByIdMap.get(dto.getTextbookSubscriptionItemId()); oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(dto.getTextbookSubscriptionItemId()); } if (ObjectUtils.isEmpty(old)) { continue; } updateItem = new TextbookSubscriptionItem(); updateItem.setId(old.getId()); updateItem.setDiscount(ObjectUtils.isNotEmpty(dto.getDiscount()) ? dto.getDiscount() : 10); updateItem.setPrice(dto.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10))); updateItem.setInStockNum(old.getInStockNum() + dto.getInNum()); updateItem.setModifyDate(new Date()); updateItem.setModifyUserId(StpUtil.getLoginIdAsLong()); textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem); // 判断当前征订中的当前教材是否已经有了入库记录 // 当前征订项第一次入库 long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId(); if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) { //新增入库记录 textbookWarehouseRecord = new TextbookWarehouseRecord(); textbookWarehouseRecord.setId(textbookWarehouseRecordId); textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId()); textbookWarehouseRecord.setTextbookId(old.getTextbookId()); textbookWarehouseRecord.setDataId(dto.getTextbookSubscriptionId()); textbookWarehouseRecord.setDataItemId(dto.getTextbookSubscriptionItemId()); textbookWarehouseRecord.setWarehouseNumber(ObjectUtils.isNotEmpty(dto.getInNum()) ? dto.getInNum() : 0); textbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(dto.getPrice()) ? dto.getPrice() : BigDecimal.ZERO); textbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(dto.getDiscount()) ? dto.getDiscount() : 10D); textbookWarehouseRecord.setSubtotal(dto.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10))); textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber()))); oldOrderInteger += 1; String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数 textbookWarehouseRecord.setOrderNumber(sb + newOrder); textbookWarehouseRecord.setReturnBookstoreNumber(0); textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber()); textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber()))); textbookWarehouseRecord.setIssuedNumber(0); textbookWarehouseRecord.setRecedeNumber(0); textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber()); textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode()); textbookWarehouseRecord.setCreateDate(new Date()); textbookWarehouseRecord.setCreateUserId(StpUtil.getLoginIdAsLong()); textbookWarehouseRecordMapper.insert(textbookWarehouseRecord); }else { textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId(); textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class); textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + dto.getInNum()); textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber()))); textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + dto.getInNum()); textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber()))); textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + dto.getInNum()); textbookWarehouseRecord.setModifyDate(new Date()); textbookWarehouseRecord.setModifyUserId(StpUtil.getLoginIdAsLong()); textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord); } // 新增教材入库记录详细入库记录 textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail(); textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId); textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode()); textbookWarehouseRecordDetail.setWarehouseNumber(dto.getInNum()); textbookWarehouseRecordDetail.setCreateDate(new Date()); textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail); } return true; } @Override @Transactional(rollbackFor = Exception.class) public String instockroomExcelImport(InputStream inputStream) { List excelDataList = EasyExcel.read(inputStream).headRowNumber(3).head(TextbookSubscriptionExportQueryListVo.class).sheet().doReadSync(); List idList = excelDataList.stream() .map(t -> Long.parseLong(t.getTextbookSubscriptionItemId())) .collect(Collectors.toList()); //获取需要修改的list LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper .in(TextbookSubscriptionItem::getId, idList) .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode()) ; List textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(queryWrapper); if (ObjectUtils.isEmpty(textbookSubscriptionItemList)) { throw new MyException("征订数据被修改,请刷新重试"); } Map byIdMap = textbookSubscriptionItemList.stream() .collect(Collectors.toMap(TextbookSubscriptionItem::getId, t -> t, (t1, t2) -> t1)); TextbookSubscription textbookSubscription = this.getById(textbookSubscriptionItemList.get(0).getTextbookSubscriptionId()); if (ObjectUtils.isEmpty(textbookSubscription)) { throw new MyException("需要入库对应的征订记录失效"); } // 获取当前征订已经产生的入库记录 LambdaQueryWrapper textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); textbookWarehouseRecordLambdaQueryWrapper .in(TextbookWarehouseRecord::getDataItemId, idList) .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) ; List textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper); Map textbookWarehouseRecordByItemIdMap = textbookWarehouseRecords.stream() .collect(Collectors.toMap(TextbookWarehouseRecord::getDataItemId, t -> t, (t1, t2) -> t2)); // 处理入库单号 StringBuilder sb = new StringBuilder(); sb.append("RK"); LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); String nowStr = now.format(dateTimeFormatter); sb.append(nowStr); // 根据当前征订编号前缀去数据库找是否已经存在了 LambdaQueryWrapper maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>(); maxOrderNumberLambdaQueryWrapper .like(TextbookWarehouseRecord::getOrderNumber, sb.toString() + "%") .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) .orderByDesc(TextbookWarehouseRecord::getOrderNumber) .last("limit 1") ; TextbookWarehouseRecord maxOrderNumber = textbookWarehouseRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper); int oldOrderInteger = 0; if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){ String oldOrderNumber = maxOrderNumber.getOrderNumber(); String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3); oldOrderInteger = Integer.parseInt(oldOrder); } int successNum = 0; int instockroomNum = 0; // 处理入库细节 TextbookSubscriptionItem oldItem; TextbookSubscriptionItem updateItem; TextbookWarehouseRecord oldTextbookWarehouseRecord; TextbookWarehouseRecord textbookWarehouseRecord; TextbookWarehouseRecordDetail textbookWarehouseRecordDetail; Date nowDate = new Date(); Long loginId = StpUtil.getLoginIdAsLong(); for (int i = 0; i < excelDataList.size(); i++){ TextbookSubscriptionExportQueryListVo vo = excelDataList.get(i); if(ObjectUtils.isEmpty(vo)){ throw new MyException("第" + (i + 4) + "行数据写入失败,请刷新重试"); } if(ObjectUtils.isEmpty(vo.getInNum()) || vo.getInNum() <= 0){ continue; } if(StringUtils.isEmpty(vo.getTextbookSubscriptionItemId())){ throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板"); } oldItem = byIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId())); if(ObjectUtils.isEmpty(oldItem)){ throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板"); } oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId())); updateItem = new TextbookSubscriptionItem(); updateItem.setId(oldItem.getId()); if(ObjectUtils.isEmpty(oldItem.getInStockNum()) || oldItem.getInStockNum() <= 0){ updateItem.setDiscount(ObjectUtils.isNotEmpty(vo.getDiscount()) ? vo.getDiscount() : 10); updateItem.setPrice(vo.getPrice().multiply(BigDecimal.valueOf(vo.getDiscount() / 10))); } updateItem.setInStockNum(oldItem.getInStockNum() + vo.getInNum()); updateItem.setModifyDate(nowDate); updateItem.setModifyUserId(loginId); textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem); // 判断当前征订中的当前教材是否已经有了入库记录 // 当前征订项第一次入库 long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId(); if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) { //新增入库记录 textbookWarehouseRecord = new TextbookWarehouseRecord(); textbookWarehouseRecord.setId(textbookWarehouseRecordId); textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId()); textbookWarehouseRecord.setTextbookId(oldItem.getTextbookId()); textbookWarehouseRecord.setDataId(oldItem.getTextbookSubscriptionId()); textbookWarehouseRecord.setDataItemId(oldItem.getId()); textbookWarehouseRecord.setWarehouseNumber(ObjectUtils.isNotEmpty(vo.getInNum()) ? vo.getInNum() : 0); textbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(oldItem.getPrice()) ? oldItem.getPrice() : BigDecimal.ZERO); textbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(updateItem.getDiscount()) ? updateItem.getDiscount() : oldItem.getDiscount()); textbookWarehouseRecord.setSubtotal(textbookWarehouseRecord.getPrice().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getDiscount() / 10))); textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber()))); oldOrderInteger += 1; String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数 textbookWarehouseRecord.setOrderNumber(sb + newOrder); textbookWarehouseRecord.setReturnBookstoreNumber(0); textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber()); textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber()))); textbookWarehouseRecord.setIssuedNumber(0); textbookWarehouseRecord.setRecedeNumber(0); textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber()); textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode()); textbookWarehouseRecord.setCreateDate(nowDate); textbookWarehouseRecord.setCreateUserId(loginId); textbookWarehouseRecordMapper.insert(textbookWarehouseRecord); }else { textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId(); textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class); textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + vo.getInNum()); textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber()))); textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + vo.getInNum()); textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber()))); textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + vo.getInNum()); textbookWarehouseRecord.setModifyDate(nowDate); textbookWarehouseRecord.setModifyUserId(loginId); textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord); } // 新增教材入库记录详细入库记录 textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail(); textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId); textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode()); textbookWarehouseRecordDetail.setWarehouseNumber(vo.getInNum()); textbookWarehouseRecordDetail.setCreateDate(nowDate); textbookWarehouseRecordDetail.setCreateUserId(loginId); textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail); successNum += 1; instockroomNum += vo.getInNum(); } return "成功入库" + successNum + "样,成功入库" + instockroomNum + "本"; } @Override @Transactional(rollbackFor = Exception.class) public Boolean update(TextbookSubscription textbookSubscription) { int sum = 0; //********************************* TextbookSubscriptionItem 增删改 开始 *******************************************/ { // 查出所有子级的id List textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList( Wrappers.lambdaQuery(TextbookSubscriptionItem.class) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, textbookSubscription.getId()) .select(TextbookSubscriptionItem::getId)); List textbookSubscriptionItemIds = textbookSubscriptionItemList.stream() .map(TextbookSubscriptionItem::getId) .collect(Collectors.toList()); // 原有子表单 没有被删除的主键 List textbookSubscriptionItemOldIds = textbookSubscription.getTextbookSubscriptionItemList().stream() .map(TextbookSubscriptionItem::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); // 找到需要删除的id List textbookSubscriptionItemRemoveIds = textbookSubscriptionItemIds.stream() .filter(item -> !textbookSubscriptionItemOldIds.contains(item)) .collect(Collectors.toList()); TextbookSubscriptionItemClass textbookSubscriptionItemClass; for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) { // 如果不等于空则修改 if (textbookSubscriptionItem.getId() != null) { textbookSubscriptionTextbookSubscriptionItemMapper.updateById(textbookSubscriptionItem); } else { // 如果等于空 则新增 // 新增的时候应该处理班级关联 String[] classIdArr = new String[0]; if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod()) && textbookSubscription.getSubscriptionMethod() == 1 && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getClassIds()) ) { classIdArr = textbookSubscriptionItem.getClassIds().split(","); } textbookSubscriptionItem.setUseClassNum(classIdArr.length); textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId()); textbookSubscriptionItem.setCreateDate(new Date()); textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem); // 处理征订项和班级关联表 for (String str : classIdArr) { textbookSubscriptionItemClass = new TextbookSubscriptionItemClass(); textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId()); textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str)); textbookSubscriptionItemClass.setCreateDate(new Date()); textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass); } } textbookSubscriptionItem.setStudentNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getStudentNum()) ? 0 : textbookSubscriptionItem.getStudentNum()); textbookSubscriptionItem.setTeacherNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getTeacherNum()) ? 0 : textbookSubscriptionItem.getTeacherNum()); sum += textbookSubscriptionItem.getStudentNum() + textbookSubscriptionItem.getTeacherNum(); } // 已经不存在的id 删除 if (ObjectUtils.isNotEmpty(textbookSubscriptionItemRemoveIds.isEmpty())) { LambdaUpdateWrapper textbookSubscriptionItemClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); textbookSubscriptionItemClassLambdaUpdateWrapper .in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemRemoveIds) .eq(TextbookSubscriptionItemClass::getDeleteMark, DeleteMark.NODELETE.getCode()) ; textbookSubscriptionItemClassMapper.delete(textbookSubscriptionItemClassLambdaUpdateWrapper); textbookSubscriptionTextbookSubscriptionItemMapper.deleteBatchIds(textbookSubscriptionItemRemoveIds); } } //********************************* TextbookSubscriptionItem 增删改 结束 *******************************************/ //********************************* TextbookSubscriptionClass 增删改 开始 *******************************************/ // LambdaUpdateWrapper textbookSubscriptionClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); // textbookSubscriptionClassLambdaUpdateWrapper // .eq(TextbookSubscriptionClass::getTextbookSubscriptionId, textbookSubscription.getId()) // ; // textbookSubscriptionClassMapper.delete(textbookSubscriptionClassLambdaUpdateWrapper); // // if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod()) // && textbookSubscription.getSubscriptionMethod() == 1 // && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds()) // ) { // String[] classIdArr = textbookSubscription.getBaseClassIds().split(","); // for (String str : classIdArr) { // TextbookSubscriptionClass textbookSubscriptionClass = new TextbookSubscriptionClass(); // textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId()); // textbookSubscriptionClass.setBaseClassId(Long.parseLong(str)); // textbookSubscriptionClass.setCreateDate(new Date()); // textbookSubscriptionClassMapper.insert(textbookSubscriptionClass); // } // } //********************************* TextbookSubscriptionClass 增删改 结束 *******************************************/ textbookSubscription.setSum(sum); textbookSubscriptionTextbookSubscriptionMapper.updateById(textbookSubscription); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean alteration(UpdateTextbookSubscriptionItemDto dto) { TextbookSubscriptionItem old = textbookSubscriptionTextbookSubscriptionItemMapper.selectById(dto.getId()); if(old == null){ throw new MyException("征订项已经被修改,刷新重试"); } TextbookSubscription textbookSubscription = this.getById(old.getTextbookSubscriptionId()); if(ObjectUtils.isEmpty(textbookSubscription)){ throw new MyException("征订已经被修改,刷新重试"); } // 判断变更状态 int alterationType = 0; if(!old.getStudentNum().equals(dto.getStudentNum()) || !old.getTeacherNum().equals(dto.getTeacherNum()) ){ alterationType = 1; } if(!old.getTextbookId().equals(dto.getTextbookId())){ alterationType = 2; } // 变更征订总数量 TextbookSubscription updateTotalNum = new TextbookSubscription(); if(ObjectUtils.isNotEmpty(textbookSubscription)){ updateTotalNum.setId(textbookSubscription.getId()); updateTotalNum.setSum((ObjectUtils.isNotEmpty(textbookSubscription.getSum()) ? textbookSubscription.getSum() : 0) + ((ObjectUtils.isNotEmpty(dto.getStudentNum()) ? dto.getStudentNum() : 0) - (ObjectUtils.isNotEmpty(old.getStudentNum()) ? old.getStudentNum() : 0)) + ((ObjectUtils.isNotEmpty(dto.getTeacherNum()) ? dto.getTeacherNum() : 0) - (ObjectUtils.isNotEmpty(old.getTeacherNum()) ? old.getTeacherNum() : 0)) ); updateTotalNum.setModifyDate(new Date()); this.updateById(updateTotalNum); } // 将历史记录保存到历史变更记录表 // 当前征订项的变更历史最后一次记录 LambdaQueryWrapper textbookSubscriptionItemHistoryLambdaQueryWrapper = new LambdaQueryWrapper<>(); textbookSubscriptionItemHistoryLambdaQueryWrapper .eq(TextbookSubscriptionItemHistory::getTextbookSubscriptionItemId, old.getId()) .orderByDesc(TextbookSubscriptionItemHistory::getHistoryVersion) .last("limit 1") ; TextbookSubscriptionItemHistory lastOne = textbookSubscriptionItemHistoryMapper.selectOne(textbookSubscriptionItemHistoryLambdaQueryWrapper); // 将变更前的数据记录在历史表中 TextbookSubscriptionItemHistory textbookSubscriptionItemHistory = new TextbookSubscriptionItemHistory(); // 变更前 textbookSubscriptionItemHistory.setOldTextbookId(old.getTextbookId()); textbookSubscriptionItemHistory.setOldStudentNum(old.getStudentNum()); textbookSubscriptionItemHistory.setOldTeacherNum(old.getTeacherNum()); textbookSubscriptionItemHistory.setOldDiscount(old.getDiscount()); textbookSubscriptionItemHistory.setOldPrice(old.getPrice()); textbookSubscriptionItemHistory.setOldInStockNum(old.getInStockNum()); textbookSubscriptionItemHistory.setOldOutStockNum(old.getOutStockNum()); // 变更后 textbookSubscriptionItemHistory.setNewTextbookId(dto.getTextbookId()); textbookSubscriptionItemHistory.setNewStudentNum(dto.getStudentNum()); textbookSubscriptionItemHistory.setNewTeacherNum(dto.getTeacherNum()); textbookSubscriptionItemHistory.setNewDiscount(dto.getDiscount()); textbookSubscriptionItemHistory.setNewPrice(dto.getPrice()); textbookSubscriptionItemHistory.setNewInStockNum(dto.getInStockNum()); textbookSubscriptionItemHistory.setNewOutStockNum(dto.getOutStockNum()); textbookSubscriptionItemHistory.setTextbookSubscriptionId(old.getTextbookSubscriptionId()); textbookSubscriptionItemHistory.setTextbookSubscriptionItemId(old.getId()); textbookSubscriptionItemHistory.setCreateDate(new Date()); textbookSubscriptionItemHistory.setCreateUserId(StpUtil.getLoginIdAsLong()); if(ObjectUtils.isNotEmpty(lastOne)){ textbookSubscriptionItemHistory.setHistoryVersion(lastOne.getHistoryVersion() + 1); } else { textbookSubscriptionItemHistory.setHistoryVersion(1); } textbookSubscriptionItemHistory.setAlterationType(alterationType); textbookSubscriptionItemHistoryMapper.insert(textbookSubscriptionItemHistory); //变更当前记录 TextbookSubscriptionItem updateItem = new TextbookSubscriptionItem(); BeanUtils.copyProperties(dto, updateItem); updateItem.setAlterationType(alterationType); textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean changeStatus(UpdateWfTextbookSubscriptionDto dto) { TextbookSubscription textbookSubscription = this.getById(dto.getId()); if (textbookSubscription == null) { return false; } TextbookSubscription newT = new TextbookSubscription(); newT.setId(textbookSubscription.getId()); newT.setStatus(dto.getStatus()); return this.updateById(newT); } @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(List ids) { LambdaQueryWrapper textbookSubscriptionItemLambdaQueryWrapper = new LambdaQueryWrapper<>(); textbookSubscriptionItemLambdaQueryWrapper .in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids) ; List textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(textbookSubscriptionItemLambdaQueryWrapper); List textbookSubscriptionItemIds = textbookSubscriptionItemList.stream() .map(TextbookSubscriptionItem::getId) .collect(Collectors.toList()); if(ObjectUtils.isNotEmpty(textbookSubscriptionItemIds)){ textbookSubscriptionItemClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItemClass.class).in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemIds)); } if(ObjectUtils.isNotEmpty(ids)) { textbookSubscriptionTextbookSubscriptionItemMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItem.class).in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids)); textbookSubscriptionClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionClass.class).in(TextbookSubscriptionClass::getTextbookSubscriptionId, ids)); textbookSubscriptionTextbookSubscriptionMapper.deleteBatchIds(ids); } return true; } @Override public ByteArrayOutputStream textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) throws IOException { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper .disableSubLogicDel() .selectAs(TextbookSubscriptionItem::getId, TextbookSubscriptionExportQueryListVo::getTextbookSubscriptionItemId) .selectAs(Textbook::getPrice, TextbookSubscriptionExportQueryListVo::getPrice) .selectAs(TextbookSubscriptionItem::getDiscount, TextbookSubscriptionExportQueryListVo::getDiscount) .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookSubscriptionExportQueryListVo::getStudentSubscriptionNumber) .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookSubscriptionExportQueryListVo::getTeacherSubscriptionNumber) .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty())) .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty())) .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId) .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId, wrapper -> wrapper .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName) ) .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType, wrapper -> wrapper .selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn) ) .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId()) .orderByAsc(TextbookSubscriptionItem::getInStockNum) ; List vos = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, queryWrapper); List> dataList = new ArrayList<>(); for (TextbookSubscriptionExportQueryListVo vo : vos) { List data = new ArrayList<>(); data.add(vo.getTextbookSubscriptionItemId()); data.add(vo.getCourseName()); data.add(vo.getBookName()); data.add(vo.getIssn()); data.add(vo.getEditorInChief()); data.add(vo.getPublishingHouse()); data.add(vo.getTextbookTypeCn()); data.add(vo.getVersion()); data.add(vo.getUseType() + ""); data.add(vo.getStudentSubscriptionNumber() + ""); data.add(vo.getTeacherSubscriptionNumber() + ""); data.add(vo.getInStockNum() + ""); data.add(vo.getPrice() + ""); data.add(vo.getDiscount() + ""); dataList.add(data); } // 开始写入 Workbook workbook = new XSSFWorkbook(); // 创建一个工作表(sheet) String sheetName = "sheet1"; Sheet sheet = workbook.createSheet(sheetName); List importConfigs = ImportExcelUtil.allFields(new TextbookSubscriptionExportQueryListVo()); // 写大标题 ImportExcelUtil.createBigHead(workbook, sheet, "教材入库导入模板", 0, importConfigs.size() - 1); // 提示必填 String cautionHead = "说明:教材的基础信息不能修改,请输入实际折扣和入库数量,然后直接导入当前excel"; ImportExcelUtil.createCautionHead(workbook, sheet, 1, cautionHead, importConfigs.size() - 1, 12, IndexedColors.RED.getIndex()); // 表头 ImportExcelUtil.createHead(workbook, sheet, importConfigs, 2); //生成数据 int dataRowNumber = 3; // 字体内容格式 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.LEFT); for (List rowData : dataList) { Row dataRow = sheet.createRow(dataRowNumber); for (int i = 0; i < rowData.size(); i ++){ String content = rowData.get(i); Cell cell = dataRow.createCell(i); cell.setCellValue(content); cell.setCellStyle(cellStyle); } dataRowNumber ++; } for (int i = 0; i < importConfigs.size(); i++){ sheet.autoSizeColumn(i); } ByteArrayOutputStream bot = new ByteArrayOutputStream(); workbook.write(bot); return bot; } }