main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java
@@ -7,9 +7,13 @@ import com.ruoyi.business.entity.EquipmentManagement; import com.ruoyi.business.entity.Production; import com.ruoyi.business.service.EquipmentManagementService; import com.ruoyi.business.vo.EquipmentManagementVo; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.bean.BeanUtils; import org.springframework.web.bind.annotation.*; import lombok.AllArgsConstructor; import java.util.List; /** * <p> @@ -52,5 +56,12 @@ return R.ok(equipmentManagementService.delByIds(ids)); } /** * 设å¤list */ @GetMapping("/equipmentList") public R<List<EquipmentManagementVo>> selectEquipmentList() { List<EquipmentManagementVo> equipmentManagementVo = equipmentManagementService.selectEquipmentList(); return R.ok(equipmentManagementVo); } } main-business/src/main/java/com/ruoyi/business/controller/EquipmentUsageRecordController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.ruoyi.business.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.dto.EquipmentManagementDto; import com.ruoyi.business.dto.EquipmentUsageRecordDto; import com.ruoyi.business.entity.EquipmentManagement; import com.ruoyi.business.entity.EquipmentUsageRecord; import com.ruoyi.business.service.EquipmentUsageRecordService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.*; import lombok.AllArgsConstructor; /** * <p> * 设å¤ä½¿ç¨è®°å½è¡¨ å端æ§å¶å¨ * </p> * * @author ld * @since 2025-07-07 */ @RestController @AllArgsConstructor @RequestMapping("/equipmentUsageRecord") public class EquipmentUsageRecordController { private EquipmentUsageRecordService equipmentUsageRecordService; /** * 设å¤ä½¿ç¨è®°å½è¡¨æ¥è¯¢ */ @GetMapping("/list") public R<IPage<EquipmentUsageRecordDto>> list(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto) { IPage<EquipmentUsageRecordDto> list = equipmentUsageRecordService.selectUsageRecordList(page, equipmentUsageRecordDto); return R.ok(list); } /** * 设å¤ä½¿ç¨è®°å½è¡¨æ°å¢ä¿®æ¹ */ @PostMapping("/addOrEditUsageRecord") public R addOrEditUsageRecord(@RequestBody EquipmentUsageRecordDto equipmentUsageRecordDto) { return R.ok(equipmentUsageRecordService.addOrEditUsageRecord(equipmentUsageRecordDto)); } } main-business/src/main/java/com/ruoyi/business/controller/HomePageController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ package com.ruoyi.business.controller; import com.ruoyi.business.dto.HomePageDto; import com.ruoyi.business.dto.YearlyQueryDto; import com.ruoyi.business.service.OfficialInventoryService; import com.ruoyi.business.service.SalesRecordService; import com.ruoyi.common.core.domain.R; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.List; import java.util.Map; @RestController @AllArgsConstructor @RequestMapping("/homePage") public class HomePageController { private SalesRecordService salesRecordService; private OfficialInventoryService officialInventoryService; @GetMapping("/allInfo") private R<HomePageDto> homePageDto() { HomePageDto homePageDto = new HomePageDto(); Map<String, Object> map = salesRecordService.selectAllInfo(); //è¥æ¶éé¢ homePageDto.setRevenueAmount((BigDecimal) map.get("revenueAmount")); homePageDto.setChangeRate(map.get("changeRate").toString()); homePageDto.setTrend(map.get("trend").toString()); //ä¾åºé homePageDto.setSaleQuantity((BigDecimal) map.get("saleQuantity")); homePageDto.setSaleQuantityRate(map.get("saleQuantityRate").toString()); homePageDto.setTrendQuantity(map.get("trendQuantity").toString()); //è¥æ¶åå¸ homePageDto.setRevenueDistribution((Map<String, BigDecimal>) map.get("revenueDistribution")); //åºåç»è®¡ Map<String, BigDecimal> maps = officialInventoryService.selectOfficialAllInfo(); homePageDto.setInventory(maps); //æåº¦ç»è®¡ //é宿°æ® homePageDto.setSalesResults((List<Map<String, Object>>) map.get("salesResults")); return R.ok(homePageDto); } @PostMapping("/yearlySales") public R<Map<String, Object>> getYearlyMonthlySales(@RequestBody YearlyQueryDto query) { Map<String, Object> data = salesRecordService.getYearlyMonthlySales(query); return R.ok(data); } } main-business/src/main/java/com/ruoyi/business/dto/EquipmentUsageRecordDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.ruoyi.business.dto; import com.ruoyi.business.entity.EquipmentUsageRecord; import lombok.Data; @Data public class EquipmentUsageRecordDto extends EquipmentUsageRecord { private String equipmentNo; //设å¤ç¼å· private String equipmentName; //设å¤åç§° } main-business/src/main/java/com/ruoyi/business/dto/HomePageDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.business.dto; import lombok.Data; import java.math.BigDecimal; import java.util.List; import java.util.Map; @Data public class HomePageDto { //è¥æ¶éé¢ private BigDecimal revenueAmount; //è¥æ¶éé¢è¾æ¨æ¥ private String changeRate; //è¥æ¶è¶å¿ private String trend; //é宿°éï¼ä¾åºé private BigDecimal saleQuantity; //ä¾åºéè¾æ¨æ¥ private String saleQuantityRate; //ä¾åºè¶å¿ private String trendQuantity; //è¥æ¶åå¸ private Map<String, BigDecimal> revenueDistribution; //åºåç»è®¡ private Map<String, BigDecimal> inventory; //é宿°æ® private List<Map<String, Object>> salesResults; } main-business/src/main/java/com/ruoyi/business/dto/YearlyQueryDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.business.dto; import jakarta.validation.constraints.*; import lombok.Data; import static com.ruoyi.common.utils.DateUtils.parseDate; @Data public class YearlyQueryDto { @Size(min = 2, max = 2, message = "æ¶é´èå´å¿ é¡»å å«å¼å§åç»ææ¥æ") private String[] timeRange; @AssertTrue(message = "æ¥ææ ¼å¼å¿ 须为YYYY-MM") public boolean isTimeRangeValid() { try { if (timeRange == null || timeRange.length != 2) return false; parseDate(timeRange[0]); parseDate(timeRange[1]); return true; } catch (Exception e) { return false; } } } main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java
@@ -28,8 +28,8 @@ /** * 设å¤ç¼å· */ @TableField(value = "equipment_id") private String equipmentId; @TableField(value = "equipment_no") private String equipmentNo; /** * 设å¤åç§° */ main-business/src/main/java/com/ruoyi/business/entity/EquipmentUsageRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.ruoyi.business.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import com.ruoyi.common.core.domain.MyBaseEntity; import java.time.LocalDate; /** * 设å¤ä½¿ç¨è®°å½è¡¨ å®ä½ç±» * * @author ld * @date 2025-07-07 */ @Data @TableName("equipment_usage_record") public class EquipmentUsageRecord extends MyBaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 设å¤ID */ @TableField(value = "equipment_id") private Long equipmentId; /** * ä½¿ç¨æ°é */ @TableField(value = "usage_quantity") private Integer usageQuantity; /** * 使ç¨äººID */ @TableField(value = "user_id") private Long userId; /** * é¨é¨ID */ @TableField(value = "department_id") private Long departmentId; /** * 设å¤ç¶æï¼æ£å¸¸/æ é/ç»´ä¿®ä¸ï¼ */ @TableField(value = "equipment_status") private String equipmentStatus; /** * 使ç¨å¼å§æ¶é´ */ @TableField(value = "usage_start_time") private LocalDate usageStartTime; /** * 使ç¨ç»ææ¶é´ */ @TableField(value = "usage_end_time") private LocalDate usageEndTime; /** * 夿³¨ä¿¡æ¯ */ @TableField(value = "remarks") private String remarks; } main-business/src/main/java/com/ruoyi/business/mapper/EquipmentUsageRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.entity.EquipmentUsageRecord; import org.apache.ibatis.annotations.Mapper; /** * <p> * 设å¤ä½¿ç¨è®°å½è¡¨ Mapper æ¥å£ * </p> * * @author ld * @since 2025-07-07 */ @Mapper public interface EquipmentUsageRecordMapper extends BaseMapper<EquipmentUsageRecord> { } main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java
@@ -1,8 +1,13 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.dto.SalesRecordDto; import com.ruoyi.business.entity.SalesRecord; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; import java.util.List; /** * <p> @@ -15,4 +20,5 @@ @Mapper public interface SalesRecordMapper extends BaseMapper<SalesRecord> { List<SalesRecord> findByDateRange(@Param("startDate")LocalDate startDate, @Param("endDate") LocalDate endDate); } main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java
@@ -5,6 +5,9 @@ import com.ruoyi.business.dto.EquipmentManagementDto; import com.ruoyi.business.entity.EquipmentManagement; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.business.vo.EquipmentManagementVo; import java.util.List; /** * <p> @@ -21,4 +24,6 @@ int addOrEditEquipment(EquipmentManagementDto equipmentManagementDto); int delByIds(Long[] ids); List<EquipmentManagementVo> selectEquipmentList(); } main-business/src/main/java/com/ruoyi/business/service/EquipmentUsageRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.business.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.dto.EquipmentUsageRecordDto; import com.ruoyi.business.entity.EquipmentManagement; import com.ruoyi.business.entity.EquipmentUsageRecord; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 设å¤ä½¿ç¨è®°å½è¡¨ æå¡ç±» * </p> * * @author ld * @since 2025-07-07 */ public interface EquipmentUsageRecordService extends IService<EquipmentUsageRecord> { IPage<EquipmentUsageRecordDto> selectUsageRecordList(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto); int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto); } main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java
@@ -7,7 +7,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.business.vo.OfficialInventoryVo; import java.math.BigDecimal; import java.util.List; import java.util.Map; /** * <p> @@ -28,4 +30,6 @@ List<OfficialInventoryVo> selectOfficialList(OfficialInventoryVo officialInventoryVo); List<OfficialInventory> selectOfficialAll(); Map<String, BigDecimal> selectOfficialAllInfo(); } main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java
@@ -4,7 +4,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.business.dto.SalesRecordDto; import com.ruoyi.business.dto.YearlyQueryDto; import com.ruoyi.business.entity.SalesRecord; import jakarta.validation.Valid; import java.util.Map; /** * <p> @@ -21,4 +25,8 @@ int addOrEditSalesRecord(SalesRecordDto salesRecordDto); int delByIds(Long[] ids); Map<String, Object> selectAllInfo(); Map<String, Object> getYearlyMonthlySales(@Valid YearlyQueryDto query); } main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java
@@ -10,11 +10,13 @@ import com.ruoyi.business.mapper.EquipmentManagementMapper; import com.ruoyi.business.service.EquipmentManagementService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.business.vo.EquipmentManagementVo; import com.ruoyi.common.utils.bean.BeanUtils; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import java.util.Arrays; import java.util.List; import java.util.Objects; /** @@ -35,7 +37,6 @@ Page<EquipmentManagement> entityPage = equipmentManagementMapper.selectPage(page, null); IPage<EquipmentManagementDto> dtoPage = new Page<>(); BeanUtils.copyProperties(entityPage, dtoPage); return dtoPage; } @@ -51,6 +52,20 @@ } @Override public List<EquipmentManagementVo> selectEquipmentList() { List<EquipmentManagement> equipmentManagements = equipmentManagementMapper.selectList(null); return equipmentManagements.stream() .map(equipment -> { EquipmentManagementVo vo = new EquipmentManagementVo(); vo.setId(equipment.getId()); // 设å¤id vo.setEquipmentName(equipment.getEquipmentName()); // 设å¤åç§° vo.setQuantity(equipment.getQuantity()); // æ°é return vo; }) .toList(); } @Override public int delByIds(Long[] ids) { return equipmentManagementMapper.deleteByIds(Arrays.asList(ids)); } main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ package com.ruoyi.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.entity.Supply; import com.ruoyi.business.dto.EquipmentManagementDto; import com.ruoyi.business.dto.EquipmentUsageRecordDto; import com.ruoyi.business.entity.EquipmentManagement; import com.ruoyi.business.entity.EquipmentUsageRecord; import com.ruoyi.business.mapper.EquipmentManagementMapper; import com.ruoyi.business.mapper.EquipmentUsageRecordMapper; import com.ruoyi.business.service.EquipmentUsageRecordService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.bean.BeanUtils; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; /** * <p> * 设å¤ä½¿ç¨è®°å½è¡¨ æå¡å®ç°ç±» * </p> * * @author ld * @since 2025-07-07 */ @Service @RequiredArgsConstructor public class EquipmentUsageRecordServiceImpl extends ServiceImpl<EquipmentUsageRecordMapper, EquipmentUsageRecord> implements EquipmentUsageRecordService { private final EquipmentUsageRecordMapper equipmentUsageRecordMapper; private final EquipmentManagementMapper equipmentManagementMapper; @Override public IPage<EquipmentUsageRecordDto> selectUsageRecordList(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto) { Page<EquipmentUsageRecord> entityPage = equipmentUsageRecordMapper.selectPage(page, null); IPage<EquipmentUsageRecordDto> dtoPage = new Page<>(); BeanUtils.copyProperties(entityPage, dtoPage); List<Long> eqIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getEquipmentId).toList(); //æ¹éæ¥è¯¢ Map<Long, EquipmentManagement> equipmentManagementMap; if (!eqIds.isEmpty()) { List<EquipmentManagement> infos = equipmentManagementMapper.selectList(new LambdaQueryWrapper<EquipmentManagement>().in(EquipmentManagement::getId, eqIds)); equipmentManagementMap = infos.stream().collect(Collectors.toMap(EquipmentManagement::getId, Function.identity())); } else { equipmentManagementMap = new HashMap<>(); } //å¹é æ°æ® List<EquipmentUsageRecordDto> dtoRecords = entityPage.getRecords().stream().map(entity -> { EquipmentUsageRecordDto dto = new EquipmentUsageRecordDto(); BeanUtils.copyProperties(entity, dto); EquipmentManagement equipment = equipmentManagementMap.get(entity.getEquipmentId()); if (equipment != null) { dto.setEquipmentNo(equipment.getEquipmentNo()); dto.setEquipmentName(equipment.getEquipmentName()); } return dto; }).toList(); dtoPage.setRecords(dtoRecords); return dtoPage; } @Override public int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto) { EquipmentUsageRecord equipmentUsageRecord = new EquipmentUsageRecord(); BeanUtils.copyProperties(equipmentUsageRecordDto, equipmentUsageRecord); if (Objects.isNull(equipmentUsageRecordDto.getId())) { return equipmentUsageRecordMapper.insert(equipmentUsageRecord); } else { return equipmentUsageRecordMapper.updateById(equipmentUsageRecord); } } } main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
@@ -26,7 +26,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -330,4 +332,26 @@ } } @Override public Map<String, BigDecimal> selectOfficialAllInfo() { // 1. æ¥è¯¢ official_inventory è¡¨æ°æ® List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null); // ç¨äºå卿ç»ç»æï¼key ä¸ºç ¤ç§åç§°ï¼value 为åºåæ°éæ¼æ¥âå¨â Map<String, BigDecimal> resultMap = new LinkedHashMap<>(); // 2. éåæ¥è¯¢ç»æï¼å ³è coalInfo è·åç ¤ç§åç§°å¹¶ç»è£ æ°æ® for (OfficialInventory inventory : officialInventories) { Long coalId = inventory.getCoalId(); // æ ¹æ® coalId å° coalInfoMapper æ¥è¯¢ç ¤ç§åç§° CoalInfo coalInfo = coalInfoMapper.selectById(coalId); if (coalInfo != null) { String coalName = coalInfo.getCoal(); // å设 CoalInfo æ getCoalName æ¹æ³è·åç ¤ç§åç§° BigDecimal quantity = inventory.getInventoryQuantity(); resultMap.put(coalName, quantity); } } return resultMap; } } main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.extension.plugins.pagination.Page; @@ -10,6 +11,7 @@ import com.ruoyi.basic.mapper.CoalInfoMapper; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.business.dto.SalesRecordDto; import com.ruoyi.business.dto.YearlyQueryDto; import com.ruoyi.business.entity.OfficialInventory; import com.ruoyi.business.entity.SalesRecord; import com.ruoyi.business.mapper.OfficialInventoryMapper; @@ -23,12 +25,21 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.YearMonth; 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.function.Function; import java.util.stream.Collectors; import java.util.*; /** * <p> @@ -218,4 +229,279 @@ // æ§è¡æ¹éé»è¾å é¤ return salesRecordMapper.update(null, updateWrapper); } @Override public Map<String, Object> getYearlyMonthlySales(YearlyQueryDto query) { // 1. å¤çé»è®¤æ¥è¯¢ï¼ä¸ä¼ åæ°æ¶ï¼ if (query == null || query.getTimeRange() == null || query.getTimeRange().length == 0) { query = getDefaultQuery(); } // 2. è§£ææ¶é´èå´ LocalDate[] dateRange = parseAndValidateDateRange(query.getTimeRange()); LocalDate startDate = dateRange[0]; LocalDate endDate = dateRange[1]; // 3. æ¥è¯¢æ°æ® List<SalesRecord> records = salesRecordMapper.findByDateRange( startDate.withDayOfMonth(1), endDate.withDayOfMonth(1).with(TemporalAdjusters.lastDayOfMonth()) ); // 4. æå»ºååº return buildResponse(query.getTimeRange(), records, startDate, endDate); } // è·åé»è®¤æ¥è¯¢ï¼å½å年度æè¿6个æï¼ private YearlyQueryDto getDefaultQuery() { LocalDate now = LocalDate.now(); LocalDate startDate = now.minusMonths(5).withDayOfMonth(1); String[] timeRange = { startDate.format(DateTimeFormatter.ofPattern("yyyy-MM")), now.format(DateTimeFormatter.ofPattern("yyyy-MM")) }; YearlyQueryDto defaultQuery = new YearlyQueryDto(); defaultQuery.setTimeRange(timeRange); return defaultQuery; } // è§£æå¹¶éªè¯æ¥æèå´ private LocalDate[] parseAndValidateDateRange(String[] timeRange) { if (timeRange == null || timeRange.length != 2) { throw new IllegalArgumentException("æ¶é´èå´åæ°æ ¼å¼ä¸æ£ç¡®"); } LocalDate startDate = parseDate(timeRange[0]); LocalDate endDate = parseDate(timeRange[1]); if (startDate.isAfter(endDate)) { throw new IllegalArgumentException("å¼å§æ¥æä¸è½æäºç»ææ¥æ"); } return new LocalDate[]{startDate, endDate}; } // è§£ææ¥æï¼æ ¼å¼ï¼yyyy-MMï¼ private LocalDate parseDate(String dateStr) { try { return YearMonth.parse(dateStr).atDay(1); } catch (DateTimeParseException e) { throw new IllegalArgumentException("æ¥ææ ¼å¼ä¸æ£ç¡®ï¼åºä¸º yyyy-MM", e); } } // æå»ºååºæ°æ® private Map<String, Object> buildResponse(String[] timeRange, List<SalesRecord> records, LocalDate startDate, LocalDate endDate) { Map<String, Object> response = new LinkedHashMap<>(); response.put("timeRange", timeRange); response.put("data", formatMonthlyData(records, startDate, endDate)); response.put("isDefaultQuery", timeRange.equals(getDefaultQuery().getTimeRange())); return response; } // æ ¼å¼åæåº¦æ°æ® private Map<String, Integer> formatMonthlyData(List<SalesRecord> records, LocalDate startDate, LocalDate endDate) { // é¢å®ä¹æ ¼å¼åå¨ DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); // ä½¿ç¨ TreeMap èªå¨æé®æåº Map<String, Integer> monthlyData = records.stream() .collect(Collectors.groupingBy( r -> r.getSaleDate().format(monthFormatter), TreeMap::new, // å ³é®ä¿®æ¹ï¼å¤ç saleQuantity 为 null çæ åµï¼é»è®¤æ 0 è®¡ç® Collectors.summingInt(r -> { BigDecimal quantity = r.getSaleQuantity(); return quantity != null ? quantity.intValue() : 0; // ä¸ç®è¿ç®ç¬¦å¤æ }) )); // å¡«å 缺失æä»½ YearMonth start = YearMonth.from(startDate); YearMonth end = YearMonth.from(endDate); for (YearMonth month = start; !month.isAfter(end); month = month.plusMonths(1)) { String monthKey = month.format(monthFormatter); monthlyData.putIfAbsent(monthKey, 0); } return monthlyData; } @Override public Map<String, Object> selectAllInfo() { Map<String, Object> result = new LinkedHashMap<>(); //è¥æ¶éé¢ LocalDate today = LocalDate.now(); LocalDate yesterday = today.minusDays(1); BigDecimal revenueAmount; List<SalesRecord> salesRecords = salesRecordMapper.selectList(null); revenueAmount = salesRecords.stream() .map(SalesRecord::getTotalAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); //仿¥è¥æ¶ BigDecimal todayRevenue = salesRecords.stream() .filter(record -> today.equals(record.getSaleDate())) .map(SalesRecord::getTotalAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); //æ¨æ¥è¥æ¶ BigDecimal yesterdayRevenue = salesRecords.stream() .filter(record -> yesterday.equals(record.getSaleDate())) .map(SalesRecord::getTotalAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®å¢é¿ç¾åæ¯ BigDecimal increases = BigDecimal.ZERO; String trend = "+"; if (yesterdayRevenue.compareTo(BigDecimal.ZERO) != 0) { increases = todayRevenue.subtract(yesterdayRevenue) .divide(yesterdayRevenue, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal(100)); if (increases.compareTo(BigDecimal.ZERO) > 0) { trend = "+"; } else if (increases.compareTo(BigDecimal.ZERO) < 0) { trend = "â"; } } // 6. æ ¼å¼åç¾åæ¯æ¾ç¤º DecimalFormat formatNo = new DecimalFormat("0.00%"); String changeRate = formatNo.format(increases.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP)); //ä¾åºé BigDecimal saleQuantity = salesRecords.stream() .map(SalesRecord::getSaleQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); //仿¥ä¾åºé BigDecimal todaySaleQuantity = salesRecords.stream() .filter(record -> today.equals(record.getSaleDate())) .map(SalesRecord::getSaleQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); //æ¨æ¥ä¾åºé BigDecimal yesterdaySaleQuantity = salesRecords.stream() .filter(record -> yesterday.equals(record.getSaleDate())) .map(SalesRecord::getSaleQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®å¢é¿ç¾åæ¯ BigDecimal increasesQuantity = BigDecimal.ZERO; String trendQuantity = "+"; if (yesterdaySaleQuantity.compareTo(BigDecimal.ZERO) != 0) { increasesQuantity = todaySaleQuantity.subtract(yesterdaySaleQuantity) .divide(yesterdaySaleQuantity, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal(100)); if (increasesQuantity.compareTo(BigDecimal.ZERO) > 0) { trendQuantity = "+"; } else if (increasesQuantity.compareTo(BigDecimal.ZERO) < 0) { trendQuantity = "â"; } } // æ ¼å¼åæ°éç¾åæ¯æ¾ç¤º DecimalFormat formatNoQuantity = new DecimalFormat("0.00%"); String saleQuantityRate = formatNoQuantity.format(increasesQuantity.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP)); //è¥æ¶åå¸ //è·åææç ¤ç§ä¿¡æ¯(idååç§°çæ å°) Map<Long, String> coalIdToNameMap = coalInfoMapper.selectList(null).stream() .collect(Collectors.toMap( CoalInfo::getId, CoalInfo::getCoal )); // 3. æç ¤ç§IDç»è®¡æ»éé¢ Map<Long, BigDecimal> revenueByCoalId = salesRecords.stream() .collect(Collectors.groupingBy( SalesRecord::getCoalId, Collectors.reducing( BigDecimal.ZERO, SalesRecord::getTotalAmount, BigDecimal::add ) )); // ç ¤ç§éå®åå¸ï¼åç¬ä½ä¸ºä¸ä¸ªåMapï¼ Map<String, BigDecimal> revenueDistribution = new LinkedHashMap<>(); coalIdToNameMap.forEach((id, name) -> { BigDecimal amount = revenueByCoalId.getOrDefault(id, BigDecimal.ZERO) .setScale(2, RoundingMode.HALF_UP); if (amount.compareTo(BigDecimal.ZERO) > 0) { revenueDistribution.put(name, amount); } }); //é宿°æ® // æcoalIdåç»å¹¶åå¹¶æ°éåéé¢ Map<Long, Map<String, Object>> resultMap = new LinkedHashMap<>(); for (SalesRecord record : salesRecords) { Long coalId = record.getCoalId(); // å°æ°éåéé¢è½¬æ¢ä¸ºBigDecimal BigDecimal quantity = record.getInventoryQuantity(); BigDecimal amount = record.getTotalAmount(); if (resultMap.containsKey(coalId)) { Map<String, Object> existing = resultMap.get(coalId); // è·åç°æçBigDecimalå¼ BigDecimal existingQuantity = (BigDecimal) existing.get("inventoryQuantity"); BigDecimal existingAmount = (BigDecimal) existing.get("totalAmount"); // 使ç¨BigDecimalè¿è¡å æ³è¿ç® existing.put("inventoryQuantity", existingQuantity.add(quantity)); existing.put("totalAmount", existingAmount.add(amount)); } else { Map<String, Object> newRecord = new HashMap<>(); newRecord.put("coalId", coalId); newRecord.put("inventoryQuantity", quantity); newRecord.put("totalAmount", amount); resultMap.put(coalId, newRecord); } } // 3. è·åæææ¶åçcoalId List<Long> coalIds = new ArrayList<>(resultMap.keySet()); // 4. æ¹éæ¥è¯¢ç ¤ç§ä¿¡æ¯å¹¶å¡«å å°ç»æä¸ if (!coalIds.isEmpty()) { List<CoalInfo> coalInfos = coalInfoMapper.selectBatchIds(coalIds); for (CoalInfo coalInfo : coalInfos) { Map<String, Object> record = resultMap.get(coalInfo.getId()); if (record != null) { record.put("coalName", coalInfo.getCoal()); } } } // æç»ç»ææ¯ä¸ä¸ªList<Map>ï¼æ¯ä¸ªMapå å«åå¹¶åçé宿°æ®å对åºçç ¤ç§ä¿¡æ¯ List<Map<String, Object>> results = new ArrayList<>(resultMap.values()); result.put("revenueAmount", revenueAmount.setScale(2, RoundingMode.HALF_UP)); result.put("changeRate", changeRate); result.put("trend", trend); result.put("saleQuantity", saleQuantity); result.put("saleQuantityRate", saleQuantityRate); result.put("trendQuantity", trendQuantity); result.put("revenueDistribution", revenueDistribution); result.put("salesResults", results); return result; } } main-business/src/main/java/com/ruoyi/business/vo/EquipmentManagementVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.business.vo; import lombok.Data; @Data public class EquipmentManagementVo { private Long id; //设å¤id private String equipmentName; //设å¤åç§° private Integer quantity; //æ°é } main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql
@@ -3,7 +3,7 @@ CREATE TABLE equipment_management ( id BIGSERIAL PRIMARY KEY, -- ä¸»é® ID equipment_id VARCHAR(50) NOT NULL, -- 设å¤ç¼å· equipment_no VARCHAR(50) NOT NULL, -- 设å¤ç¼å· equipment_name VARCHAR(100) NOT NULL, -- 设å¤åç§° quantity INT NOT NULL DEFAULT 0, -- æ°é specification VARCHAR(50) NOT NULL, -- è§æ ¼åå· @@ -27,7 +27,7 @@ COMMENT ON COLUMN equipment_management.id IS ' ä¸»é® ID'; COMMENT ON COLUMN equipment_management.equipment_id IS ' 设å¤ç¼å· '; ON COLUMN equipment_management.equipment_no IS ' 设å¤ç¼å· '; COMMENT ON COLUMN equipment_management.equipment_name IS ' 设å¤åç§° '; COMMENT main-business/src/main/resources/db/migration/postgresql/V20250707155600__create_table_equipment_usage_record.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ -- å建设å¤ä½¿ç¨è®°å½è¡¨ equipment_usage_record CREATE TABLE equipment_usage_record ( id BIGSERIAL PRIMARY KEY, -- 主é®IDï¼èªå¨éå¢ equipment_id BIGINT NOT NULL, -- 设å¤IDï¼å ³è设å¤ä¿¡æ¯è¡¨ï¼ä¸å 许为空 usage_quantity INT NOT NULL, -- ä½¿ç¨æ°éï¼ä¸å 许为空 user_id BIGINT NOT NULL, -- 使ç¨äººIDï¼å ³èç¨æ·è¡¨ï¼ä¸å 许为空 department_id BIGINT , -- é¨é¨IDï¼å ³èé¨é¨è¡¨ï¼ä¸å 许为空 equipment_status VARCHAR(50) NOT NULL, -- 设å¤ç¶æï¼å¦ï¼æ£å¸¸ãæ éãç»´ä¿®ä¸ï¼ï¼ä¸å 许为空 usage_start_time TIMESTAMP NOT NULL, -- 使ç¨å¼å§æ¶é´ï¼ä¸å 许为空 usage_end_time TIMESTAMP, -- 使ç¨ç»ææ¶é´ï¼å¯ä¸ºç©ºï¼æªå½è¿æ¶ï¼ remarks VARCHAR(1000), -- 夿³¨ä¿¡æ¯ï¼å¯ä¸ºç©º deleted INT NOT NULL DEFAULT 0, -- 软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤ create_by VARCHAR(255), -- åå»ºäººç¨æ·å create_time TIMESTAMP WITHOUT TIME ZONE, -- å建æ¶é´ï¼é»è®¤å½åæ¶é´ update_by VARCHAR(255), -- æåæ´æ°äººç¨æ·å update_time TIMESTAMP WITHOUT TIME ZONE -- æåæ´æ°æ¶é´ ); -- ä¸ºè¡¨æ·»å æ³¨é COMMENT ON TABLE equipment_usage_record IS '设å¤ä½¿ç¨è®°å½è¡¨'; -- ä¸ºåæ®µæ·»å 注é COMMENT ON COLUMN equipment_usage_record.id IS '主é®ID'; COMMENT ON COLUMN equipment_usage_record.equipment_id IS '设å¤ID'; COMMENT ON COLUMN equipment_usage_record.usage_quantity IS 'ä½¿ç¨æ°é'; COMMENT ON COLUMN equipment_usage_record.user_id IS '使ç¨äººID'; COMMENT ON COLUMN equipment_usage_record.department_id IS 'é¨é¨ID'; COMMENT ON COLUMN equipment_usage_record.equipment_status IS '设å¤ç¶æï¼æ£å¸¸/æ é/ç»´ä¿®ä¸ï¼'; COMMENT ON COLUMN equipment_usage_record.usage_start_time IS '使ç¨å¼å§æ¶é´'; COMMENT ON COLUMN equipment_usage_record.usage_end_time IS '使ç¨ç»ææ¶é´'; COMMENT ON COLUMN equipment_usage_record.remarks IS '夿³¨ä¿¡æ¯'; COMMENT ON COLUMN equipment_usage_record.deleted IS '软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤'; COMMENT ON COLUMN equipment_usage_record.create_by IS 'å建该记å½çç¨æ·'; COMMENT ON COLUMN equipment_usage_record.create_time IS 'è®°å½å建æ¶é´'; COMMENT ON COLUMN equipment_usage_record.update_by IS 'æåä¿®æ¹è¯¥è®°å½çç¨æ·'; COMMENT ON COLUMN equipment_usage_record.update_time IS 'è®°å½æåæ´æ°æ¶é´'; main-business/src/main/resources/mapper/EquipmentUsageRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.business.mapper.EquipmentUsageRecordMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.EquipmentUsageRecord"> <id column="id" property="id" /> <result column="deleted" property="deleted" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> <result column="equipment_id" property="equipmentId" /> <result column="usage_quantity" property="usageQuantity" /> <result column="user_id" property="userId" /> <result column="department_id" property="departmentId" /> <result column="equipment_status" property="equipmentStatus" /> <result column="usage_start_time" property="usageStartTime" /> <result column="usage_end_time" property="usageEndTime" /> <result column="remarks" property="remarks" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> <sql id="Base_Column_List"> deleted, create_by, create_time, update_by, update_time, id, equipment_id, usage_quantity, user_id, department_id, equipment_status, usage_start_time, usage_end_time, remarks </sql> </mapper> main-business/src/main/resources/mapper/SalesRecordMapper.xml
@@ -14,7 +14,6 @@ <result column="customer_id" property="customerId" /> <result column="customer" property="customer" /> <result column="coal_id" property="coalId" /> <result column="coal" property="coal" /> <result column="price_including_tax" property="priceIncludingTax" /> <result column="inventory_quantity" property="inventoryQuantity" /> <result column="unit" property="unit" /> @@ -39,5 +38,18 @@ deleted, id, sale_date, customer_id, customer, coal_id, coal, price_including_tax, inventory_quantity, unit, sale_quantity, sale_price, total_amount, tax_coal, tax_trans, gross_profit, net_profit, registrant_id, registrant, registration_date </sql> <select id="findByDateRange" resultType="com.ruoyi.business.entity.SalesRecord"> SELECT sale_date, SUM(sale_quantity) AS saleQuantity FROM sales_record WHERE sale_date BETWEEN #{startDate}::date AND #{endDate}::date GROUP BY sale_date ORDER BY sale_date ASC </select> </mapper>