From 2656ae9bce8544d81da66c07aaede5386d6fbebb Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期五, 25 七月 2025 15:41:01 +0800 Subject: [PATCH] 1.序列化问题 2.设备领用逻辑优化 --- main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java | 193 ++++++++++++++++++++++++++++++++++++----------- 1 files changed, 147 insertions(+), 46 deletions(-) diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java index 145cf5b..da90280 100644 --- a/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java +++ b/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.entity.CoalInfo; @@ -17,12 +18,16 @@ import com.ruoyi.business.mapper.OfficialInventoryMapper; import com.ruoyi.business.mapper.SalesRecordMapper; import com.ruoyi.business.service.SalesRecordService; +import com.ruoyi.business.vo.SalesRecordExportVo; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.mapper.SysUserMapper; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,13 +39,9 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAdjusters; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.*; /** * <p> @@ -51,6 +52,7 @@ * @since 2025-06-11 */ @Service +@Slf4j @RequiredArgsConstructor public class SalesRecordServiceImpl extends ServiceImpl<SalesRecordMapper, SalesRecord> implements SalesRecordService { @@ -69,28 +71,25 @@ // 1. 鍒涘缓鏌ヨ鏉′欢锛屾寜鍒涘缓鏃堕棿鍊掑簭鎺掑簭 LambdaQueryWrapper<SalesRecord> queryWrapper = new LambdaQueryWrapper<>(); - if (StringUtils.isNotBlank(salesRecordDto.getSearchAll())) { - String searchValue = salesRecordDto.getSearchAll(); - // 1. 鍏堝皾璇曚綔涓烘棩鏈熸煡璇� - try { - LocalDate saleDate = LocalDate.parse(searchValue); - queryWrapper.eq(SalesRecord::getSaleDate, saleDate); - } catch (DateTimeParseException e) { - // 2. 濡傛灉涓嶆槸鏃ユ湡锛屽垯浣滀负鐓ょ鍚嶇О鏌ヨ - LambdaQueryWrapper<CoalInfo> coalQueryWrapper = new LambdaQueryWrapper<>(); - coalQueryWrapper.like(CoalInfo::getCoal, searchValue); - List<CoalInfo> coalInfos = coalInfoMapper.selectList(coalQueryWrapper); - if (!coalInfos.isEmpty()) { - // 鎻愬彇鎵�鏈夊尮閰嶇殑鐓ょID - List<Long> coalIds = coalInfos.stream() - .map(CoalInfo::getId) - .collect(Collectors.toList()); - // 浣跨敤in鏌ヨ鍖归厤浠绘剰涓�涓叅绉岻D - queryWrapper.in(SalesRecord::getCoalId, coalIds); - } else { - // 3. 濡傛灉鎵句笉鍒扮叅绉嶏紝鍙互杩斿洖绌虹粨鏋� - queryWrapper.eq(SalesRecord::getCoalId, "-1"); // 浣跨敤涓嶅彲鑳藉瓨鍦ㄧ殑ID - } + // 鎸夋棩鏈熸煡璇� + if (salesRecordDto.getSaleDate() != null) { + queryWrapper.eq(SalesRecord::getSaleDate, salesRecordDto.getSaleDate()); + } + + // 鎸夌叅绉嶅悕绉版煡璇� + if (StringUtils.isNotBlank(salesRecordDto.getCoal())) { + LambdaQueryWrapper<CoalInfo> coalQueryWrapper = new LambdaQueryWrapper<>(); + coalQueryWrapper.like(CoalInfo::getCoal, salesRecordDto.getCoal()); + List<CoalInfo> coalInfos = coalInfoMapper.selectList(coalQueryWrapper); + + if (!coalInfos.isEmpty()) { + List<Long> coalIds = coalInfos.stream() + .map(CoalInfo::getId) + .collect(Collectors.toList()); + queryWrapper.in(SalesRecord::getCoalId, coalIds); + } else { + // 濡傛灉娌℃湁鍖归厤鐨勭叅绉嶏紝鐩存帴杩斿洖绌虹粨鏋� + queryWrapper.eq(SalesRecord::getCoalId, -1L); // 浣跨敤涓嶅彲鑳藉瓨鍦ㄧ殑ID } } @@ -149,20 +148,20 @@ // 鍙傛暟鏍¢獙 validateSalesRecordDto(salesRecordDto); - // 鏇存柊姝e紡搴撳緟琛ュ簱鏁伴噺 + // 鑾峰彇鐓ょ搴撳瓨淇℃伅 OfficialInventory officialInventory = officialInventoryMapper.selectById(salesRecordDto.getCoalId()); if (officialInventory == null) { throw new BaseException("姝e紡搴撶叅绉嶄俊鎭笉瀛樺湪"); } - if (salesRecordDto.getSaleQuantity().compareTo(officialInventory.getInventoryQuantity()) > 0) { - throw new BaseException("閿�鍞暟閲忎笉鑳藉ぇ浜庡簱瀛樻暟閲�"); - } - officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(salesRecordDto.getSaleQuantity())); - officialInventory.setPendingReplenishment(salesRecordDto.getSaleQuantity()); - officialInventoryMapper.updateById(officialInventory); + + // 澶勭悊閿�鍞暟閲忓彉鏇撮�昏緫 + SalesRecord existingRecord = salesRecordDto.getId() == null ? null : salesRecordMapper.selectById(salesRecordDto.getId()); + handleQuantityChanges(salesRecordDto, officialInventory, existingRecord); // 鏋勫缓閿�鍞褰曞疄浣� SalesRecord salesRecord = buildSalesRecord(salesRecordDto, officialInventory.getCoalId()); + // 璁剧疆閿�鍞褰曚腑鐨勫簱瀛樻暟閲� + salesRecord.setInventoryQuantity(officialInventory.getInventoryQuantity()); // 澶勭悊鏂板/鏇存柊閫昏緫 if (salesRecordDto.getId() == null) { @@ -172,18 +171,52 @@ } } - private void validateSalesRecordDto(SalesRecordDto dto) { - if (dto == null) { - throw new BaseException("閿�鍞褰曟暟鎹笉鑳戒负绌�"); + private void handleQuantityChanges(SalesRecordDto dto, OfficialInventory officialInventory, SalesRecord existingRecord) { + if (existingRecord == null) { + // 鏂板璁板綍 + if (dto.getSaleQuantity().compareTo(officialInventory.getInventoryQuantity()) > 0) { + throw new BaseException("閿�鍞暟閲忎笉鑳藉ぇ浜庡簱瀛樻暟閲�"); + } + // 鏇存柊搴撳瓨鏁伴噺 + officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(dto.getSaleQuantity())); + // 璁剧疆寰呰ˉ搴撴暟閲� + if (dto.isAdd()) { + officialInventory.setPendingReplenishment( + officialInventory.getPendingReplenishment() == null ? + dto.getSaleQuantity() : + officialInventory.getPendingReplenishment().add(dto.getSaleQuantity()) + ); + } + } else { + // 鏇存柊璁板綍 + // 姣旇緝閿�鍞暟閲忔槸鍚︽湁鍙樺寲 + int quantityComparison = dto.getSaleQuantity().compareTo(existingRecord.getSaleQuantity()); + if (quantityComparison != 0) { + // 璁$畻鏁伴噺宸�� + BigDecimal quantityDiff = dto.getSaleQuantity().subtract(existingRecord.getSaleQuantity()); + + // 妫�鏌ユ柊鏁伴噺鏄惁浼氬鑷村簱瀛樹笉瓒� + if (quantityComparison > 0 && quantityDiff.compareTo(officialInventory.getInventoryQuantity()) > 0) { + throw new BaseException("閿�鍞暟閲忓鍔犲悗涓嶈兘澶т簬搴撳瓨鏁伴噺"); + } + + // 鏇存柊搴撳瓨鏁伴噺 + officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(quantityDiff)); + + // 鏇存柊寰呰ˉ搴撴暟閲忥紙濡傛灉鏄渶瑕佽ˉ搴撶殑璁板綍锛� + if (dto.isAdd()) { + BigDecimal pendingDiff = officialInventory.getPendingReplenishment() == null ? + quantityDiff : + officialInventory.getPendingReplenishment().add(quantityDiff); + officialInventory.setPendingReplenishment(pendingDiff); + } + } } - if (dto.getRegistrantId() == null) { - throw new BaseException("鐧昏浜篒D涓嶈兘涓虹┖"); - } - if (dto.getCustomerId() == null) { - throw new BaseException("瀹㈡埛ID涓嶈兘涓虹┖"); - } - if (dto.getCoalId() == null) { - throw new BaseException("璇烽�夋嫨涓�鏉$叅绉嶄俊鎭�"); + + // 鏇存柊搴撳瓨璁板綍 + int updateResult = officialInventoryMapper.updateById(officialInventory); + if (updateResult <= 0) { + throw new BaseException("搴撳瓨鏇存柊澶辫触"); } } @@ -196,7 +229,7 @@ if (registrant == null) { throw new BaseException("鐧昏浜轰俊鎭笉瀛樺湪"); } - record.setRegistrant(registrant.getUserName()); + record.setRegistrant(registrant.getNickName()); // 璁剧疆瀹㈡埛淇℃伅 Customer customer = customerMapper.selectById(dto.getCustomerId()); @@ -227,6 +260,21 @@ return record; } + private void validateSalesRecordDto(SalesRecordDto dto) { + if (dto == null) { + throw new BaseException("閿�鍞褰曟暟鎹笉鑳戒负绌�"); + } + if (dto.getRegistrantId() == null) { + throw new BaseException("鐧昏浜篒D涓嶈兘涓虹┖"); + } + if (dto.getCustomerId() == null) { + throw new BaseException("瀹㈡埛ID涓嶈兘涓虹┖"); + } + if (dto.getCoalId() == null) { + throw new BaseException("璇烽�夋嫨涓�鏉$叅绉嶄俊鎭�"); + } + } + private int insertSalesRecord(SalesRecord record) { int result = salesRecordMapper.insert(record); if (result <= 0) { @@ -258,6 +306,59 @@ } @Override + public void salesRecordExport(HttpServletResponse response, SalesRecordDto salesRecordDto) { + List<Long> ids = salesRecordDto.getExportIds(); + List<SalesRecord> list; + if (ids != null && !ids.isEmpty()) { + list = salesRecordMapper.selectByIds(ids); + } else { + list = salesRecordMapper.selectList(null); + } + List<SalesRecordExportVo> exportData = convertToExportVo(list); + ExcelUtil<SalesRecordExportVo> util = new ExcelUtil<>(SalesRecordExportVo.class); + util.exportExcel(response, exportData, "閿�鍞嚭搴撴暟鎹�"); + } + + private List<SalesRecordExportVo> convertToExportVo(List<SalesRecord> list) { + // 1. 鎻愬墠鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑coalId锛岄伩鍏峃+1鏌ヨ闂 + Set<Long> coalIds = list.stream() + .filter(Objects::nonNull) + .map(SalesRecord::getCoalId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 2. 鎵归噺鏌ヨcoalInfo鏁版嵁 + Map<Long, CoalInfo> coalInfoMap = CollectionUtils.isEmpty(coalIds) + ? Collections.emptyMap() + : coalInfoMapper.selectByIds(coalIds).stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap(CoalInfo::getId, Function.identity())); + + // 3. 杞崲鏁版嵁 + return list.stream() + .filter(Objects::nonNull) + .map(record -> { + try { + SalesRecordExportVo vo = new SalesRecordExportVo(); + + // 鎷疯礉鍩虹灞炴�� + BeanUtils.copyProperties(record, vo); + + // 璁剧疆鍏宠仈鐨刢oal淇℃伅 + Optional.ofNullable(record.getCoalId()) + .map(coalInfoMap::get) + .ifPresent(coalInfo -> vo.setCoal(coalInfo.getCoal())); + return vo; + } catch (Exception e) { + log.error("杞崲閿�鍞褰昖O寮傚父锛岃褰旾D: {}", record.getId(), e); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + @Override public Map<String, Object> getYearlyMonthlySales(YearlyQueryDto query) { // 1. 澶勭悊榛樿鏌ヨ锛堜笉浼犲弬鏁版椂锛� if (query == null || query.getTimeRange() == null || query.getTimeRange().length == 0) { -- Gitblit v1.9.3