From 94509204d25f7c0ad213ae2322be2bd5bfd17424 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期一, 14 七月 2025 16:30:28 +0800 Subject: [PATCH] 1.初始化配煤计算器数据 2。配煤到待入库 --- main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java | 401 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 397 insertions(+), 4 deletions(-) diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java index 820e71a..cacd7f6 100644 --- a/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java +++ b/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java @@ -1,11 +1,55 @@ package com.ruoyi.business.service.impl; -import com.ruoyi.business.entity.PendingInventory; -import com.ruoyi.business.mapper.PendingInventoryMapper; -import com.ruoyi.business.service.PendingInventoryService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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 org.springframework.stereotype.Service; +import com.mchange.v2.lang.SystemUtils; +import com.ruoyi.basic.dto.CoalFieldDto; +import com.ruoyi.basic.entity.CoalField; +import com.ruoyi.basic.entity.CoalInfo; +import com.ruoyi.basic.entity.CoalPlan; +import com.ruoyi.basic.entity.CoalValue; +import com.ruoyi.basic.mapper.CoalFieldMapper; +import com.ruoyi.basic.mapper.CoalInfoMapper; +import com.ruoyi.basic.mapper.CoalPlanMapper; +import com.ruoyi.basic.mapper.CoalValueMapper; +import com.ruoyi.basic.service.CoalFieldService; +import com.ruoyi.basic.service.CoalPlanService; +import com.ruoyi.basic.service.CoalValueService; +import com.ruoyi.business.dto.PendingInventoryDto; +import com.ruoyi.business.entity.OfficialInventory; +import com.ruoyi.business.entity.PendingInventory; +import com.ruoyi.business.entity.SalesRecord; +import com.ruoyi.business.mapper.InventorySummaryMapper; +import com.ruoyi.business.mapper.OfficialInventoryMapper; +import com.ruoyi.business.mapper.PendingInventoryMapper; +import com.ruoyi.business.mapper.SalesRecordMapper; +import com.ruoyi.business.service.InputInventoryRecordService; +import com.ruoyi.business.service.InventorySummaryService; +import com.ruoyi.business.service.PendingInventoryService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.base.BaseException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeParseException; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; /** * <p> @@ -19,4 +63,353 @@ @RequiredArgsConstructor public class PendingInventoryServiceImpl extends ServiceImpl<PendingInventoryMapper, PendingInventory> implements PendingInventoryService { + private final PendingInventoryMapper pendingInventoryMapper; + + private final OfficialInventoryMapper officialInventoryMapper; + + private final CoalValueMapper coalValueMapper; + + private final CoalFieldMapper coalFieldMapper; + + private final CoalInfoMapper coalInfoMapper; + + private final SysUserMapper sysUserMapper; + + private final InputInventoryRecordService inputInventoryRecordService; + + private final InventorySummaryService inventorySummaryService; + private final CoalPlanMapper coalPlanMapper; + private final CoalValueService coalValueService; + + @Override + public IPage<PendingInventoryDto> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) { + // 1. 鏋勫缓涓绘煡璇� + LambdaQueryWrapper<PendingInventory> queryWrapper = new LambdaQueryWrapper<>(); + if (pendingInventoryDto.getRegistrationDate() != null) { + queryWrapper.eq(PendingInventory::getRegistrationDate, pendingInventoryDto.getRegistrationDate()); + } + + // 鎸夌叅绉嶅悕绉版煡璇� + if (StringUtils.isNotBlank(pendingInventoryDto.getCoal())) { + LambdaQueryWrapper<CoalInfo> coalQueryWrapper = new LambdaQueryWrapper<>(); + coalQueryWrapper.like(CoalInfo::getCoal, pendingInventoryDto.getCoal()); + List<CoalInfo> coalInfos = coalInfoMapper.selectList(coalQueryWrapper); + + if (!coalInfos.isEmpty()) { + List<Long> coalIds = coalInfos.stream() + .map(CoalInfo::getId) + .collect(Collectors.toList()); + queryWrapper.in(PendingInventory::getCoalId, coalIds); + } else { + // 濡傛灉娌℃湁鍖归厤鐨勭叅绉嶏紝鐩存帴杩斿洖绌虹粨鏋� + queryWrapper.eq(PendingInventory::getCoalId, -1L); // 浣跨敤涓嶅彲鑳藉瓨鍦ㄧ殑ID + } + } + + queryWrapper.orderByDesc(PendingInventory::getCreateTime); + + // 2. 鎵ц涓昏〃鍒嗛〉鏌ヨ + IPage<PendingInventory> pendingInventoryPage = pendingInventoryMapper.selectPage(page, queryWrapper); + + // 3. 鏃犳暟鎹揩閫熻繑鍥� + if (CollectionUtils.isEmpty(pendingInventoryPage.getRecords())) { + return new Page<>(page.getCurrent(), page.getSize(), pendingInventoryPage.getTotal()); + } + + // 4. 鎻愬彇鎵�鏈夊緟澶勭悊搴撳瓨ID + List<Long> pendingIds = pendingInventoryPage.getRecords().stream() + .map(PendingInventory::getId) + .collect(Collectors.toList()); + + // 5. 鎵归噺鏌ヨ鍏宠仈鐨勭叅鐐俊鎭拰姝e紡搴撳瓨淇℃伅 + List<Long> coalIds = pendingInventoryPage.getRecords().stream() + .map(PendingInventory::getCoalId) + .distinct() + .collect(Collectors.toList()); + + // 鎵归噺鏌ヨCoalInfo + Map<Long, CoalInfo> coalInfoMap; + if (!coalIds.isEmpty()) { + List<CoalInfo> coalInfos = coalInfoMapper.selectList(new LambdaQueryWrapper<CoalInfo>().in(CoalInfo::getId, coalIds)); + coalInfoMap = coalInfos.stream().collect(Collectors.toMap(CoalInfo::getId, Function.identity())); + } else { + coalInfoMap = new HashMap<>(); + } + + // 5. 鎵归噺鏌ヨ鐧昏浜篿d + List<Long> registrantIds = pendingInventoryPage.getRecords().stream() + .map(PendingInventory::getRegistrantId) + .distinct() + .toList(); + // 鎵归噺鏌ヨ鐧昏浜� + Map<Long, SysUser> sysUserMap; + if (!registrantIds.isEmpty()) { + List<SysUser> sysUsers = sysUserMapper.selectList(registrantIds); + sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); + } else { + sysUserMap = new HashMap<>(); + } + + // 鎵归噺鏌ヨ姝e紡搴撳瓨淇℃伅 + Map<Long, Long> pendingToOfficialMap = getOfficialInventoryMap(pendingIds); + + // 6. 杞崲DTO骞惰缃浉鍏冲瓧娈� + return pendingInventoryPage.convert(record -> { + PendingInventoryDto dto = new PendingInventoryDto(); + BeanUtils.copyProperties(record, dto); + + // 璁剧疆Coal淇℃伅 + CoalInfo coalInfo = coalInfoMap.get(record.getCoalId()); + if (coalInfo != null) { + dto.setCoal(coalInfo.getCoal()); + } + + // 璁剧疆鐧昏浜� + SysUser sysUser = sysUserMap.get(record.getRegistrantId()); + if (sysUser != null) { + dto.setRegistrant(sysUser.getNickName()); + } + + // 浠庨鍔犺浇鐨凪ap涓幏鍙杘fficialId + dto.setOfficialId(pendingToOfficialMap.getOrDefault(record.getId(), null)); + + return dto; + }); + } + + + // 鎵归噺鑾峰彇寰呭鐞嗗簱瀛樹笌姝e紡搴撳瓨鐨勬槧灏勫叧绯� + private Map<Long, Long> getOfficialInventoryMap(List<Long> pendingIds) { + if (CollectionUtils.isEmpty(pendingIds)) { + return Collections.emptyMap(); + } + + // 鏌ヨ鍏宠仈鐨勬寮忓簱瀛樻暟鎹� + LambdaQueryWrapper<OfficialInventory> wrapper = new LambdaQueryWrapper<>(); + wrapper.select(OfficialInventory::getId, OfficialInventory::getPendingId) + .in(OfficialInventory::getPendingId, pendingIds); + + return officialInventoryMapper.selectList(wrapper) + .stream() + .collect(Collectors.toMap( + OfficialInventory::getPendingId, + OfficialInventory::getId, + (existing, replacement) -> existing // 濡傛灉鏈夐噸澶嶏紝淇濈暀绗竴涓� + )); + } + + @Override + public int addOrEditPending(PendingInventoryDto pendingInventoryDto) { + PendingInventory pendingInventory = new PendingInventory(); + BeanUtils.copyProperties(pendingInventoryDto, pendingInventory); + if (Objects.isNull(pendingInventoryDto.getId())) { + return pendingInventoryMapper.insert(pendingInventory); + } else { + return pendingInventoryMapper.updateById(pendingInventory); + } + } + + @Override + public int delByIds(Long[] ids) { + // 妫�鏌ュ弬鏁� + if (ids == null || ids.length == 0) { + return 0; + } + // 鏋勯�犳洿鏂版潯浠� + UpdateWrapper<PendingInventory> updateWrapper = new UpdateWrapper<>(); + updateWrapper.in("id", ids) + .set("deleted", 1); // 璁剧疆 deleted 涓� 1 琛ㄧず宸插垹闄� + // 鎵ц鎵归噺閫昏緫鍒犻櫎 + return pendingInventoryMapper.update(null, updateWrapper); + } + + @Transactional + @Override + public int addOrEditCoalValue(PendingInventoryDto pendingInventoryDto) { + // Step 1: 鍒犻櫎鍘熸湁 planId 鐩稿叧鏁版嵁 + coalValueMapper.delete(new LambdaQueryWrapper<CoalValue>() + .eq(CoalValue::getPlanId, pendingInventoryDto.getPId())); + // Step 2: 鏋勫缓鍩虹 CoalValue 瀵硅薄 + CoalValue coalValue = new CoalValue(); + BeanUtils.copyProperties(coalValue, pendingInventoryDto); + coalValue.setPlanId(pendingInventoryDto.getPId()); + List<Map<String, String>> fieldValue = pendingInventoryDto.getFieldValue(); + if (CollectionUtils.isEmpty(fieldValue)) { + throw new BaseException("瀛楁鍊间笉鑳戒负绌�"); + } + // Step 3: 鎻愬墠鑾峰彇鎵�鏈� field -> CoalField 鏄犲皠锛岄伩鍏嶉噸澶嶆煡搴� + Set<String> allFields = fieldValue.stream() + .flatMap(map -> map.keySet().stream()) + .collect(Collectors.toSet()); + List<CoalField> coalFields = coalFieldMapper.selectList( + new LambdaQueryWrapper<CoalField>().in(CoalField::getFields, allFields)); + Map<String, String> fieldMap = coalFields.stream() + .collect(Collectors.toMap( + CoalField::getFields, + CoalField::getFieldName)); + // Step 4: 鎵归噺鎻掑叆 + int i = 0; + for (Map<String, String> fieldMapEntry : fieldValue) { + for (Map.Entry<String, String> entry : fieldMapEntry.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + String fieldName = fieldMap.get(key); + if (fieldName == null) { + throw new BaseException("瀛楁鍚嶄笉瀛樺湪"); + } + coalValue.setId(null); // 娓呯┖ id锛岀‘淇濇瘡娆¢兘鏄柊璁板綍 + coalValue.setCoalValue(value); + coalValue.setFields(key); + coalValue.setFieldName(fieldName); + coalValue.setType(String.valueOf(1)); + i = coalValueMapper.insert(coalValue); + } + } + if (i > 0) { + BigDecimal quantity = pendingInventoryDto.getInventoryQuantity(); + PendingInventory pendingInventory = pendingInventoryMapper.selectById(pendingInventoryDto.getPId()); + if (pendingInventory == null) { + throw new BaseException("寰呭叆搴撹褰曚笉瀛樺湪"); + } + BigDecimal left = pendingInventory.getInventoryQuantity().subtract(quantity); + if (left.compareTo(BigDecimal.ZERO) > 0) { + pendingInventory.setInventoryQuantity(left); + pendingInventory.setCoalPlanId(pendingInventoryDto.getCoalPlanId()); + pendingInventoryMapper.updateById(pendingInventory); + } else { + pendingInventoryMapper.deleteById(pendingInventoryDto.getPId()); + } + //姝e紡搴� + if (pendingInventoryDto.getOfficialId() == null) { + OfficialInventory officialInventory = new OfficialInventory(); + BeanUtils.copyProperties(pendingInventory, officialInventory); + officialInventory.setId(null); + officialInventory.setCoalPlanId(pendingInventoryDto.getCoalPlanId()); + officialInventory.setPendingId(pendingInventoryDto.getPId()); + officialInventory.setInventoryQuantity(quantity); + officialInventory.setRegistrantId(1L); + officialInventory.setSupplierId(pendingInventoryDto.getSupplierId()); + officialInventoryMapper.insert(officialInventory); + } else { + OfficialInventory officialInventory = officialInventoryMapper.selectById(pendingInventoryDto.getOfficialId()); + officialInventory.setInventoryQuantity(quantity.add(officialInventory.getInventoryQuantity())); + officialInventoryMapper.updateById(officialInventory); + } + } + return i; + } + + @Override + @Transactional + public boolean addPending(PendingInventoryDto pendingInventoryDto) { + try { + CoalPlan coalPlan = coalPlanMapper.selectOne(new LambdaQueryWrapper<CoalPlan>().eq(CoalPlan::getPlan, "閰嶇叅璁$畻鍣ㄦ柟妗�")); + if (coalPlan == null) { + return false; + } + + // 娣诲姞鍒板緟鍏ュ簱 + Long userId = SecurityUtils.getUserId(); + PendingInventory pendingInventory = new PendingInventory(); + pendingInventory.setUnit("t"); + pendingInventory.setRegistrantId(userId); + pendingInventory.setRegistrationDate(LocalDate.now()); + + for (Map<String, Object> map : pendingInventoryDto.getFieldsResultList()) { + pendingInventory.setSupplierName("閰嶇叅璁$畻鍣ㄦ柟妗堝叆搴�"); + + // 澶勭悊鐓ょ偔ID + if (map.get("coalId") == null) { + CoalInfo coalInfo = new CoalInfo(); + coalInfo.setCoal((String) map.get("createCoal")); + coalInfo.setMaintainerId(userId); + coalInfo.setMaintenanceDate(LocalDate.now()); + if (coalInfoMapper.insert(coalInfo) <= 0) { + return false; + } + pendingInventory.setCoalId(coalInfo.getId()); + } else { + pendingInventory.setCoalId((Long) map.get("coalId")); + } + + // 璁剧疆浠锋牸鍜屾暟閲� + BigDecimal cost = BigDecimal.valueOf((Double) map.get("cost")); + BigDecimal tonnage = BigDecimal.valueOf((Double) map.get("totalTonnage")); + + pendingInventory.setPriceIncludingTax(cost); + pendingInventory.setInventoryQuantity(tonnage); + pendingInventory.setTotalPriceIncludingTax(cost.multiply(tonnage)); + + BigDecimal costExcludingTax = cost.divide(BigDecimal.valueOf(1.13), 2, RoundingMode.HALF_UP); + pendingInventory.setPriceExcludingTax(costExcludingTax); + pendingInventory.setTotalPriceExcludingTax(costExcludingTax.multiply(tonnage)); + pendingInventory.setCoalPlanId(coalPlan.getId()); + + // 鐓よ川瀛楁鍊� + String coalFields = coalPlan.getCoalFields(); + List<String> coalFieldList = Arrays.asList(coalFields.split(",")); + + for (String field : coalFieldList) { + CoalField coalField = coalFieldMapper.selectOne( + new LambdaQueryWrapper<CoalField>().eq(CoalField::getFields, field)); + if (coalField == null) { + continue; + } + + CoalValue coalValue = new CoalValue(); + coalValue.setPlanId(coalPlan.getId()); + coalValue.setFields(field); + coalValue.setFieldName(coalField.getFieldName()); + coalValue.setType("1"); + + switch (coalField.getFieldName()) { + case "鍙戠儹閲�": + coalValue.setCoalValue((String) map.get("cv")); + break; + case "纭垎": + coalValue.setCoalValue((String) map.get("sulfur")); + break; + case "鐏板垎": + coalValue.setCoalValue((String) map.get("ash")); + break; + case "姘村垎": + coalValue.setCoalValue((String) map.get("moisture")); + break; + } + + // 淇濆瓨鐓よ川鍊� + if (coalValueMapper.insert(coalValue) <= 0) { + return false; + } + } + } + + // 鎻掑叆寰呭叆搴撹褰� + if (pendingInventoryMapper.insert(pendingInventory) <= 0) { + return false; + } + + // 鏇存柊姝e紡搴� + for (Map<String, Object> coalResult : pendingInventoryDto.getCoalResultList()) { + Long officialId = (Long) coalResult.get("officialId"); + BigDecimal quantity = (BigDecimal) coalResult.get("quantity"); + OfficialInventory officialInventory = officialInventoryMapper.selectById(officialId); + + if (officialInventory == null || officialInventory.getInventoryQuantity().compareTo(quantity) < 0) { + throw new BaseException("搴撳瓨鏁伴噺涓嶈冻锛屾坊鍔犺嚦寰呭叆搴撳け璐�"); + } + + officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(quantity)); + if (officialInventoryMapper.updateById(officialInventory) <= 0) { + return false; + } + } + + return true; + } catch (Exception e) { + // 璁板綍鏃ュ織 + log.error("娣诲姞寰呭叆搴撳け璐�", e); + throw new BaseException("娣诲姞寰呭叆搴撳け璐�: " + e.getMessage()); + } + } } -- Gitblit v1.9.3