main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.business.controller; import org.springframework.web.bind.annotation.RequestMapping; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.RestController; /** * <p> * å·¡æ£ä»»å¡è¡¨ å端æ§å¶å¨ * </p> * * @author ld * @since 2025-06-14 */ @RestController @AllArgsConstructor @RequestMapping("/inspectionTask") public class InspectionTaskController { } main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.dto.PendingInventoryDto; import com.ruoyi.business.entity.PendingInventory; import com.ruoyi.business.service.PendingInventoryService; import com.ruoyi.common.core.domain.R; import lombok.AllArgsConstructor; @@ -29,8 +28,8 @@ * å¾ å ¥åºè¡¨æ¥è¯¢ */ @GetMapping("/list") public R<IPage<PendingInventory>> list(Page page, PendingInventoryDto pendingInventoryDto) { IPage<PendingInventory> list = pendingInventoryService.selectPendingInventoryList(page, pendingInventoryDto); public R<IPage<PendingInventoryDto>> list(Page page, PendingInventoryDto pendingInventoryDto) { IPage<PendingInventoryDto> list = pendingInventoryService.selectPendingInventoryList(page, pendingInventoryDto); return R.ok(list); } main-business/src/main/java/com/ruoyi/business/controller/ProductionController.java
@@ -25,7 +25,7 @@ private ProductionService productionService; /** * æ¥è¯¢ * ç产æç»è¡¨æ¥è¯¢ */ @GetMapping("/list") public R<IPage<Production>> list(Page page, ProductionDto productionDto) { main-business/src/main/java/com/ruoyi/business/controller/ProductionInventoryController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.business.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.entity.ProductionInventory; import com.ruoyi.business.service.ProductionInventoryService; import com.ruoyi.common.core.domain.R; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * ç产主表 å端æ§å¶å¨ * </p> * * @author ld * @since 2025-06-13 */ @RestController @AllArgsConstructor @RequestMapping("/productionInventory") public class ProductionInventoryController { private ProductionInventoryService productionInventoryService; /** * ç产åºåæç»è¡¨æ¥è¯¢ */ @GetMapping("/list") public R<IPage<ProductionInventory>> list(Page page,ProductionInventory productionInventory) { IPage<ProductionInventory> list = productionInventoryService.selectPIList(page,productionInventory); return R.ok(list); } } main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ 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.ProductionMasterDto; import com.ruoyi.business.service.ProductionMasterService; import com.ruoyi.common.core.domain.R; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; /** * <p> * ç产主表 å端æ§å¶å¨ * </p> * * @author ld * @since 2025-06-13 */ @RestController @AllArgsConstructor @RequestMapping("/productionMaster") public class ProductionMasterController { private ProductionMasterService productionMasterService; /** * ç产主表æ¥è¯¢ */ @GetMapping("/list") public R<IPage<ProductionMasterDto>> list(Page page, ProductionMasterDto productionMasterDto) { IPage<ProductionMasterDto> list = productionMasterService.selectPMList(page,productionMasterDto); return R.ok(list); } /** * ç产主表æ°å¢ä¿®æ¹ */ @PostMapping("/addOrEditPM") public R addOrEditPM(@RequestBody ProductionMasterDto productionMasterDto) { return R.ok(productionMasterService.addOrEditPM(productionMasterDto)); } /** * å é¤ */ @DeleteMapping("/delPM") public R remove(@RequestBody Long[] ids) { return R.ok(productionMasterService.delByIds(ids)); } } main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package com.ruoyi.business.dto; import com.ruoyi.business.entity.InspectionTask; import lombok.Data; @Data public class InspectionTaskDto extends InspectionTask { } main-business/src/main/java/com/ruoyi/business/dto/PendingInventoryDto.java
@@ -13,6 +13,12 @@ @JsonProperty("pId") private Long pId; /** * æ£å¼åºid */ @JsonProperty("officialId") private Long officialId; private List<Map<String, String>> fieldValue; /** main-business/src/main/java/com/ruoyi/business/dto/ProductionMasterDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.business.dto; import com.ruoyi.business.entity.Production; import com.ruoyi.business.entity.ProductionInventory; import com.ruoyi.business.entity.ProductionMaster; import lombok.Data; import java.util.List; @Data public class ProductionMasterDto extends ProductionMaster { private List<Production> productionList; //ç产æç» private List<ProductionInventory> productionInventoryList; //使ç¨åºåæç» } main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.ruoyi.business.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import com.ruoyi.common.core.domain.MyBaseEntity; /** * å·¡æ£ä»»å¡è¡¨ å®ä½ç±» * * @author ld * @date 2025-06-14 */ @Data @TableName("inspection_task") public class InspectionTask extends MyBaseEntity { private static final long serialVersionUID = 1L; /** * å·¡æ£ä»»å¡å¯ä¸æ è¯ */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å·¡æ£ä»»å¡åç§° */ @TableField(value = "task_name") private String taskName; /** * */ @TableField(value = "inspector_id") private Long inspectorId; /** * æ§è¡å·¡æ£ç人åå§å */ @TableField(value = "inspector") private String inspector; /** * å·¡æ£å°ç¹è¯¦ç»æè¿° */ @TableField(value = "port") private String port; /** * ä»»å¡éå 说ææç¹æ®æ åµè®°å½ */ @TableField(value = "remarks") private String remarks; /** * */ @TableField(value = "registrant_id") private Long registrantId; /** * ä»»å¡ç»è®°äººå§å */ @TableField(value = "registrant") private String registrant; } main-business/src/main/java/com/ruoyi/business/entity/Production.java
@@ -28,6 +28,11 @@ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * ç产主表ID */ @TableField(value = "production_master_id") private Long productionMasterId; /** * ç ¤ç§ID */ @TableField(value = "coal_id") @@ -37,11 +42,6 @@ */ @TableField(value = "coal") private String coal; /** * çå¼ */ @TableField(value = "calorific_value") private Integer calorificValue; /** * ç产æ°é */ @@ -78,6 +78,11 @@ @TableField(value = "producer") private String producer; /** * ç产人ID */ @TableField(value = "producer_id") private String producerId; /** * çäº§æ¥æ */ @TableField(value = "production_date") main-business/src/main/java/com/ruoyi/business/entity/ProductionInventory.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package com.ruoyi.business.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import com.ruoyi.common.core.domain.MyBaseEntity; /** * ç产主表 å®ä½ç±» * * @author ruoyi * @date 2025-06-13 */ @Data @TableName("production_inventory") public class ProductionInventory extends MyBaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * ç产主表ID */ @TableField(value = "production_master_id") private Long productionMasterId; /** * ç ¤ç§ID */ @TableField(value = "coal_id") private Long coalId; /** * ç ¤ç§ */ @TableField(value = "coal") private String coal; /** * åºåæ°é */ @TableField(value = "inventory_quantity") private Integer inventoryQuantity; /** * ä½¿ç¨æ°é */ @TableField(value = "used_quantity") private Integer usedQuantity; } main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,75 @@ package com.ruoyi.business.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.MyBaseEntity; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; /** * ç产主表 å®ä½ç±» * * @author ruoyi * @date 2025-06-13 */ @Data @TableName("production_master") public class ProductionMaster extends MyBaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * ç ¤ç§ */ @TableField(value = "coal") private String coal; /** * ç产æ°é */ @TableField(value = "production_quantity") private Integer productionQuantity; /** * äººå·¥ææ¬ */ @TableField(value = "labor_cost") private BigDecimal laborCost; /** * è½èææ¬ */ @TableField(value = "energy_consumption_cost") private BigDecimal energyConsumptionCost; /** * è®¾å¤ææ§ */ @TableField(value = "equipment_depreciation") private BigDecimal equipmentDepreciation; /** * æ»ææ¬ */ @TableField(value = "total_cost") private BigDecimal totalCost; /** * */ @TableField(value = "producer_id") private String producerId; /** * ç产人 */ @TableField(value = "producer") private String producer; /** * çäº§æ¥æ */ @TableField(value = "production_date") private LocalDate productionDate; } main-business/src/main/java/com/ruoyi/business/mapper/InspectionTaskMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.entity.InspectionTask; import org.apache.ibatis.annotations.Mapper; /** * <p> * å·¡æ£ä»»å¡è¡¨ Mapper æ¥å£ * </p> * * @author ld * @since 2025-06-14 */ @Mapper public interface InspectionTaskMapper extends BaseMapper<InspectionTask> { } main-business/src/main/java/com/ruoyi/business/mapper/ProductionInventoryMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.entity.ProductionInventory; import org.apache.ibatis.annotations.Mapper; /** * <p> * ç产主表 Mapper æ¥å£ * </p> * * @author ruoyi * @since 2025-06-13 */ @Mapper public interface ProductionInventoryMapper extends BaseMapper<ProductionInventory> { } main-business/src/main/java/com/ruoyi/business/mapper/ProductionMasterMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.entity.ProductionMaster; import org.apache.ibatis.annotations.Mapper; /** * <p> * ç产主表 Mapper æ¥å£ * </p> * * @author ruoyi * @since 2025-06-13 */ @Mapper public interface ProductionMasterMapper extends BaseMapper<ProductionMaster> { } main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.business.service; import com.ruoyi.business.entity.InspectionTask; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * å·¡æ£ä»»å¡è¡¨ æå¡ç±» * </p> * * @author ld * @since 2025-06-14 */ public interface InspectionTaskService extends IService<InspectionTask> { } main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java
@@ -16,7 +16,7 @@ */ public interface PendingInventoryService extends IService<PendingInventory> { IPage<PendingInventory> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto); IPage<PendingInventoryDto> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto); int addOrEditPending(PendingInventoryDto pendingInventoryDto); main-business/src/main/java/com/ruoyi/business/service/ProductionInventoryService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.business.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.entity.ProductionInventory; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * ç产主表 æå¡ç±» * </p> * * @author ruoyi * @since 2025-06-13 */ public interface ProductionInventoryService extends IService<ProductionInventory> { IPage<ProductionInventory> selectPIList(Page page, ProductionInventory productionInventory); } main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ 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.ProductionMasterDto; import com.ruoyi.business.entity.ProductionMaster; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * ç产主表 æå¡ç±» * </p> * * @author ruoyi * @since 2025-06-13 */ public interface ProductionMasterService extends IService<ProductionMaster> { IPage<ProductionMasterDto> selectPMList(Page page, ProductionMasterDto productionMasterDto); int addOrEditPM(ProductionMasterDto productionMasterDto); int delByIds(Long[] ids); } main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.business.service.impl; import com.ruoyi.business.entity.InspectionTask; import com.ruoyi.business.mapper.InspectionTaskMapper; import com.ruoyi.business.service.InspectionTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; /** * <p> * å·¡æ£ä»»å¡è¡¨ æå¡å®ç°ç±» * </p> * * @author ld * @since 2025-06-14 */ @Service @RequiredArgsConstructor public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService { } main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java
@@ -23,10 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.*; import java.util.stream.Collectors; /** @@ -50,10 +47,56 @@ private final CoalFieldMapper coalFieldMapper; @Override public IPage<PendingInventory> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) { public IPage<PendingInventoryDto> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) { // 1. æå»ºä¸»æ¥è¯¢ LambdaQueryWrapper<PendingInventory> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(PendingInventory::getCreateTime); return pendingInventoryMapper.selectPage(page, queryWrapper); // 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. æ¹éæ¥è¯¢å ³èçæ£å¼åºåä¿¡æ¯ Map<Long, Long> pendingToOfficialMap = getOfficialInventoryMap(pendingIds); // 6. 使ç¨MyBatis-Plusçconvertæ¹æ³è½¬æ¢DTO return pendingInventoryPage.convert(record -> { PendingInventoryDto dto = new PendingInventoryDto(); BeanUtils.copyProperties(record, dto); // ä»é¢å è½½çMapä¸è·åofficialId dto.setOfficialId(pendingToOfficialMap.getOrDefault(record.getId(), null)); return dto; }); } // æ¹éè·åå¾ å¤çåºå䏿£å¼åºåçæ å°å ³ç³» 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 @@ -135,13 +178,19 @@ } else { pendingInventoryMapper.deleteById(pendingInventoryDto.getPId()); } officialInventoryMapper.delete(new LambdaQueryWrapper<OfficialInventory>().eq(OfficialInventory::getPendingId, pendingInventoryDto.getPId())); //æ£å¼åº if (pendingInventoryDto.getOfficialId() == null) { OfficialInventory officialInventory = new OfficialInventory(); BeanUtils.copyProperties(pendingInventory, officialInventory); officialInventory.setId(null); officialInventory.setPendingId(pendingInventoryDto.getPId()); officialInventory.setInventoryQuantity(quantity); officialInventoryMapper.insert(officialInventory); }else { OfficialInventory officialInventory = officialInventoryMapper.selectById(pendingInventoryDto.getOfficialId()); officialInventory.setInventoryQuantity(quantity.add(officialInventory.getInventoryQuantity())); officialInventoryMapper.updateById(officialInventory); } } return i; } main-business/src/main/java/com/ruoyi/business/service/impl/ProductionInventoryServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.business.entity.ProductionInventory; import com.ruoyi.business.mapper.ProductionInventoryMapper; import com.ruoyi.business.service.ProductionInventoryService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** * <p> * ç产主表 æå¡å®ç°ç±» * </p> * * @author ruoyi * @since 2025-06-13 */ @Service @RequiredArgsConstructor public class ProductionInventoryServiceImpl extends ServiceImpl<ProductionInventoryMapper, ProductionInventory> implements ProductionInventoryService { private final ProductionInventoryMapper productionInventoryMapper; @Override public IPage<ProductionInventory> selectPIList(Page page,ProductionInventory productionInventory) { LambdaQueryWrapper<ProductionInventory> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(ProductionInventory::getCreateTime); return productionInventoryMapper.selectPage(page, queryWrapper); } } main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,215 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.business.dto.ProductionMasterDto; import com.ruoyi.business.entity.Production; import com.ruoyi.business.entity.ProductionInventory; import com.ruoyi.business.entity.ProductionMaster; import com.ruoyi.business.mapper.OfficialInventoryMapper; import com.ruoyi.business.mapper.ProductionInventoryMapper; import com.ruoyi.business.mapper.ProductionMapper; import com.ruoyi.business.mapper.ProductionMasterMapper; import com.ruoyi.business.service.ProductionMasterService; import com.ruoyi.common.utils.bean.BeanUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> * ç产主表 æå¡å®ç°ç±» * </p> * * @author ruoyi * @since 2025-06-13 */ @Service @RequiredArgsConstructor public class ProductionMasterServiceImpl extends ServiceImpl<ProductionMasterMapper, ProductionMaster> implements ProductionMasterService { private final ProductionMasterMapper productionMasterMapper; private final ProductionInventoryMapper productionInventoryMapper; private final ProductionMapper productionMapper; private final OfficialInventoryMapper officialInventoryMapper; @Override public IPage<ProductionMasterDto> selectPMList(Page page, ProductionMasterDto productionMasterDto) { // 1. æå»ºä¸»è¡¨æ¥è¯¢æ¡ä»¶ LambdaQueryWrapper<ProductionMaster> masterQueryWrapper = new LambdaQueryWrapper<>(); // 2. æ§è¡ä¸»è¡¨å页æ¥è¯¢ IPage<ProductionMaster> entityPage = productionMasterMapper.selectPage(page, masterQueryWrapper); // 3. æå主表IDå表ç¨äºæ¹éæ¥è¯¢åè¡¨æ°æ® List<Long> masterIds = entityPage.getRecords().stream() .map(ProductionMaster::getId) .collect(Collectors.toList()); // 4. æ¹éæ¥è¯¢å ³èæ°æ®ï¼é¿å N+1é®é¢ï¼ Map<Long, List<Production>> productionMap = queryProductionByMasterIds(masterIds); Map<Long, List<ProductionInventory>> inventoryMap = queryInventoryByMasterIds(masterIds); // 5. è½¬æ¢æ°æ®å¹¶ç»è£ ç»æ List<ProductionMasterDto> dtoList = entityPage.getRecords().stream() .map(record -> { ProductionMasterDto dto = new ProductionMasterDto(); BeanUtils.copyProperties(record, dto); dto.setProductionList(productionMap.getOrDefault(record.getId(), Collections.emptyList())); dto.setProductionInventoryList(inventoryMap.getOrDefault(record.getId(), Collections.emptyList())); return dto; }) .collect(Collectors.toList()); // 6. æå»ºè¿åç»æ IPage<ProductionMasterDto> dtoPage = new Page<>(); BeanUtils.copyProperties(entityPage, dtoPage, "records"); dtoPage.setRecords(dtoList); return dtoPage; } /** * æ¹éæ¥è¯¢Productionæ°æ® */ private Map<Long, List<Production>> queryProductionByMasterIds(List<Long> masterIds) { if (masterIds.isEmpty()) { return Collections.emptyMap(); } LambdaQueryWrapper<Production> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Production::getProductionMasterId, masterIds); List<Production> productions = productionMapper.selectList(queryWrapper); return productions.stream() .collect(Collectors.groupingBy(Production::getProductionMasterId)); } /** * æ¹éæ¥è¯¢ProductionInventoryæ°æ® */ private Map<Long, List<ProductionInventory>> queryInventoryByMasterIds(List<Long> masterIds) { if (masterIds.isEmpty()) { return Collections.emptyMap(); } LambdaQueryWrapper<ProductionInventory> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ProductionInventory::getProductionMasterId, masterIds); List<ProductionInventory> inventoryList = productionInventoryMapper.selectList(queryWrapper); return inventoryList.stream() .collect(Collectors.groupingBy(ProductionInventory::getProductionMasterId)); } @Override @Transactional public int addOrEditPM(ProductionMasterDto productionMasterDto) { // 1. ç´æ¥è®¡ç®èåå¼ï¼é¿å å建å¤ä½å表 BigDecimal totalPurchasePrice = BigDecimal.ZERO; BigDecimal totalLaborCost = BigDecimal.ZERO; BigDecimal totalEnergyConsumptionCost = BigDecimal.ZERO; BigDecimal totalTotalCost = BigDecimal.ZERO; BigDecimal totalEquipmentDepreciation = BigDecimal.ZERO; int totalProductionQuantity = 0; StringBuilder coalBuilder = new StringBuilder("["); // ä¼ååç¬¦ä¸²æ¼æ¥ for (Production production : productionMasterDto.getProductionList()) { totalPurchasePrice = totalPurchasePrice.add(production.getPurchasePrice()); totalLaborCost = totalLaborCost.add(production.getLaborCost()); totalEnergyConsumptionCost = totalEnergyConsumptionCost.add(production.getEnergyConsumptionCost()); totalTotalCost = totalTotalCost.add(production.getTotalCost()); totalEquipmentDepreciation = totalEquipmentDepreciation.add(production.getEquipmentDepreciation()); totalProductionQuantity += production.getProductionQuantity(); coalBuilder.append(production.getCoal()).append(","); } // å¤çcoalåç¬¦ä¸²æ¼æ¥ String coalStr = coalBuilder.length() > 1 ? coalBuilder.deleteCharAt(coalBuilder.length()-1).append("]").toString() : "[]"; // 2. å建主表对象 ProductionMaster productionMaster = new ProductionMaster(); productionMaster.setProductionQuantity(totalProductionQuantity); productionMaster.setTotalCost(totalTotalCost); productionMaster.setEquipmentDepreciation(totalEquipmentDepreciation); productionMaster.setEnergyConsumptionCost(totalEnergyConsumptionCost); productionMaster.setLaborCost(totalLaborCost); productionMaster.setCoal(coalStr); Long masterId = productionMasterDto.getId(); productionMaster.setId(masterId); // 3. ç»ä¸å表å¤çé»è¾ if (masterId == null) { productionMasterMapper.insert(productionMaster); masterId = productionMaster.getId(); // è·åæ°çæçID } else { // å é¤å ³èåè¡¨æ°æ®ï¼ä½¿ç¨æ´é«æçinå é¤ï¼ productionMapper.delete(new LambdaQueryWrapper<Production>() .eq(Production::getProductionMasterId, masterId)); productionInventoryMapper.delete(new LambdaQueryWrapper<ProductionInventory>() .eq(ProductionInventory::getProductionMasterId, masterId)); productionMasterMapper.updateById(productionMaster); } // 4. æ¹éæå ¥åè¡¨æ°æ® batchInsertProductions(masterId, productionMasterDto.getProductionList()); batchInsertInventories(masterId, productionMasterDto.getProductionInventoryList()); return 1; } // æ¹éæå ¥çäº§æ°æ® private void batchInsertProductions(Long masterId, List<Production> productions) { List<Production> insertList = productions.stream() .peek(p -> { p.setId(null); p.setProductionMasterId(masterId); }) .collect(Collectors.toList()); if (!insertList.isEmpty()) { for (Production production : productions) { production.setId(null); production.setProductionMasterId(masterId); productionMapper.insert(production); } } } // æ¹éæå ¥åºåæ°æ® private void batchInsertInventories(Long masterId, List<ProductionInventory> inventories) { List<ProductionInventory> insertList = inventories.stream() .peek(inv -> { inv.setId(null); inv.setProductionMasterId(masterId); }) .collect(Collectors.toList()); if (!insertList.isEmpty()) { for (ProductionInventory inventory : inventories) { inventory.setId(null); inventory.setProductionMasterId(masterId); productionInventoryMapper.insert(inventory); } } } @Override public int delByIds(Long[] ids) { return 0; } } main-business/src/main/resources/db/migration/postgresql/V20250604101800__create_table_production.sql
@@ -2,15 +2,16 @@ CREATE TABLE production ( id BIGSERIAL PRIMARY KEY, -- 主é®ID production_master_id BIGINT NOT NULL DEFAULT 0, -- ç产主表ID coal_id BIGINT NOT NULL DEFAULT 0, -- ç ¤ç§ID coal VARCHAR(50) NOT NULL, -- ç ¤ç§ calorific_value INT NOT NULL, -- çå¼ production_quantity INT NOT NULL, -- ç产æ°é labor_cost DECIMAL(10, 2) NOT NULL, -- äººå·¥ææ¬ energy_consumption_cost DECIMAL(10, 2) NOT NULL, -- è½èææ¬ equipment_depreciation DECIMAL(10, 2) NOT NULL, -- è®¾å¤ææ§ purchase_price DECIMAL(10, 2) NOT NULL, -- éè´åä»· total_cost DECIMAL(10, 2) NOT NULL, -- æ»ææ¬ producer_id VARCHAR(50), -- ç产人id producer VARCHAR(50), -- ç产人 production_date DATE, -- çäº§æ¥æ @@ -28,7 +29,6 @@ COMMENT ON COLUMN production.id IS '主é®ID'; COMMENT ON COLUMN production.coal_id IS 'ç ¤ç§ID'; COMMENT ON COLUMN production.coal IS 'ç ¤ç§'; COMMENT ON COLUMN production.calorific_value IS 'çå¼'; COMMENT ON COLUMN production.production_quantity IS 'ç产æ°é'; COMMENT ON COLUMN production.labor_cost IS 'äººå·¥ææ¬'; COMMENT ON COLUMN production.energy_consumption_cost IS 'è½èææ¬'; main-business/src/main/resources/db/migration/postgresql/V20250613093400__create_table_production_master.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ -- å建ç产æç»è¡¨ CREATE TABLE production_master ( id BIGSERIAL PRIMARY KEY, -- 主é®ID coal VARCHAR(50) NOT NULL, -- ç ¤ç§ production_quantity INT NOT NULL, -- ç产æ°é labor_cost DECIMAL(10, 2) NOT NULL, -- äººå·¥ææ¬ energy_consumption_cost DECIMAL(10, 2) NOT NULL, -- è½èææ¬ equipment_depreciation DECIMAL(10, 2) NOT NULL, -- è®¾å¤ææ§ total_cost DECIMAL(10, 2) NOT NULL, -- æ»ææ¬ producer_id VARCHAR(50), -- ç产人id producer VARCHAR(50), -- ç产人 production_date DATE, -- çäº§æ¥æ 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 production_master IS 'ç产主表'; -- æ·»å åæ®µæ³¨é COMMENT ON COLUMN production_master.id IS '主é®ID'; COMMENT ON COLUMN production_master.coal IS 'ç ¤ç§'; COMMENT ON COLUMN production_master.production_quantity IS 'ç产æ°é'; COMMENT ON COLUMN production_master.labor_cost IS 'äººå·¥ææ¬'; COMMENT ON COLUMN production_master.energy_consumption_cost IS 'è½èææ¬'; COMMENT ON COLUMN production_master.equipment_depreciation IS 'è®¾å¤ææ§'; COMMENT ON COLUMN production_master.total_cost IS 'æ»ææ¬'; COMMENT ON COLUMN production_master.producer IS 'ç产人'; COMMENT ON COLUMN production_master.production_date IS 'çäº§æ¥æ'; COMMENT ON COLUMN production_master.deleted IS '软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤'; COMMENT ON COLUMN production_master.create_by IS 'å建该记å½çç¨æ·'; COMMENT ON COLUMN production_master.create_time IS 'è®°å½å建æ¶é´'; COMMENT ON COLUMN production_master.update_by IS 'æåä¿®æ¹è¯¥è®°å½çç¨æ·'; COMMENT ON COLUMN production_master.update_time IS 'è®°å½æåæ´æ°æ¶é´'; main-business/src/main/resources/db/migration/postgresql/V20250613112800__create_table_production_inventory.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ -- å建ç产æç»è¡¨ CREATE TABLE production_inventory ( id BIGSERIAL PRIMARY KEY, -- 主é®ID production_master_id BIGINT NOT NULL DEFAULT 0, -- ç产主表ID coal_id BIGINT NOT NULL DEFAULT 0, -- ç ¤ç§ID coal VARCHAR(50) NOT NULL, -- ç ¤ç§ inventory_quantity INT NOT NULL, -- åºåæ°é used_quantity INT NOT NULL, -- ä½¿ç¨æ°é 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 production_inventory IS 'ç产主表'; -- æ·»å åæ®µæ³¨é COMMENT ON COLUMN production_inventory.id IS '主é®ID'; COMMENT ON COLUMN production_inventory.production_master_id IS 'ç产主表ID'; COMMENT ON COLUMN production_inventory.coal_id IS 'ç ¤ç§ID'; COMMENT ON COLUMN production_inventory.coal IS 'ç ¤ç§'; COMMENT ON COLUMN production_inventory.inventory_quantity IS 'åºåæ°é'; COMMENT ON COLUMN production_inventory.used_quantity IS 'ä½¿ç¨æ°é'; COMMENT ON COLUMN production_inventory.deleted IS '软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤'; COMMENT ON COLUMN production_inventory.create_by IS 'å建该记å½çç¨æ·'; COMMENT ON COLUMN production_inventory.create_time IS 'è®°å½å建æ¶é´'; COMMENT ON COLUMN production_inventory.update_by IS 'æåä¿®æ¹è¯¥è®°å½çç¨æ·'; COMMENT ON COLUMN production_inventory.update_time IS 'è®°å½æåæ´æ°æ¶é´'; main-business/src/main/resources/db/migration/postgresql/V20250614134700__create_table_inspection_task.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ -- å建巡æ£ä»»å¡è¡¨ CREATE TABLE inspection_task ( id BIGSERIAL PRIMARY KEY, -- ä»»å¡ID (主é®ï¼èªå¢é¿) task_name VARCHAR(255), -- ä»»å¡åç§° inspector_id BIGINT, -- å·¡æ£äººåid inspector VARCHAR(100), -- å·¡æ£äººå port TEXT, -- å·¡æ£å°ç¹ remarks TEXT, -- 夿³¨è¯´æ registrant_id BIGINT, -- ç»è®°äººåid registrant VARCHAR(100), -- ç»è®°äººå 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 inspection_task IS 'å·¡æ£ä»»å¡è¡¨'; -- æ·»å åæ®µæ³¨é COMMENT ON COLUMN inspection_task.id IS 'å·¡æ£ä»»å¡å¯ä¸æ è¯'; COMMENT ON COLUMN inspection_task.task_name IS 'å·¡æ£ä»»å¡åç§°'; COMMENT ON COLUMN inspection_task.inspector IS 'æ§è¡å·¡æ£ç人åå§å'; COMMENT ON COLUMN inspection_task.port IS 'å·¡æ£å°ç¹è¯¦ç»æè¿°'; COMMENT ON COLUMN inspection_task.remarks IS 'ä»»å¡éå 说ææç¹æ®æ åµè®°å½'; COMMENT ON COLUMN inspection_task.registrant IS 'ä»»å¡ç»è®°äººå§å'; COMMENT ON COLUMN inspection_task.deleted IS '软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤'; COMMENT ON COLUMN inspection_task.create_by IS 'å建该记å½çç¨æ·'; COMMENT ON COLUMN inspection_task.create_time IS 'è®°å½å建æ¶é´'; COMMENT ON COLUMN inspection_task.update_by IS 'æåä¿®æ¹è¯¥è®°å½çç¨æ·'; COMMENT ON COLUMN inspection_task.update_time IS 'è®°å½æåæ´æ°æ¶é´'; main-business/src/main/resources/mapper/InspectionTaskMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ <?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.InspectionTaskMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.InspectionTask"> <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="task_name" property="taskName" /> <result column="inspector_id" property="inspectorId" /> <result column="inspector" property="inspector" /> <result column="port" property="port" /> <result column="remarks" property="remarks" /> <result column="registrant_id" property="registrantId" /> <result column="registrant" property="registrant" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> <sql id="Base_Column_List"> deleted, create_by, create_time, update_by, update_time, id, task_name, inspector_id, inspector, port, remarks, registrant_id, registrant </sql> </mapper> main-business/src/main/resources/mapper/ProductionInventoryMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ <?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.ProductionInventoryMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.ProductionInventory"> <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="production_master_id" property="productionMasterId" /> <result column="coal_id" property="coalId" /> <result column="coal" property="coal" /> <result column="inventory_quantity" property="inventoryQuantity" /> <result column="used_quantity" property="usedQuantity" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> <sql id="Base_Column_List"> deleted, create_by, create_time, update_by, update_time, id, production_master_id, coal_id, coal, inventory_quantity, used_quantity </sql> </mapper> main-business/src/main/resources/mapper/ProductionMasterMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ <?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.ProductionMasterMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.ProductionMaster"> <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="coal" property="coal" /> <result column="production_quantity" property="productionQuantity" /> <result column="labor_cost" property="laborCost" /> <result column="energy_consumption_cost" property="energyConsumptionCost" /> <result column="equipment_depreciation" property="equipmentDepreciation" /> <result column="total_cost" property="totalCost" /> <result column="producer_id" property="producerId" /> <result column="producer" property="producer" /> <result column="production_date" property="productionDate" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> <sql id="Base_Column_List"> deleted, create_by, create_time, update_by, update_time, id, coal, production_quantity, labor_cost, energy_consumption_cost, equipment_depreciation, total_cost, producer_id, producer, production_date </sql> </mapper> ruoyi-admin/src/main/java/com/ruoyi/PlusCodeGenerator.java
@@ -34,12 +34,13 @@ // 项ç®åºç¡é ç½® private static final String BASE_PACKAGE = "com.ruoyi"; private static final String MODULE_NAME = "basic"; // 模åå private static final String MODULE_NAME = "business"; // 模åå public static void main(String[] args) { String projectPath = System.getProperty("user.dir"); // è·åé¡¹ç®æ ¹è·¯å¾ String path = "basic-server"; // 模ååç§° String table = "coal_info"; // 表åï¼å¤ä¸ªè¡¨éå·éå¼ String path = "main-business"; // 模ååç§° String table = "inspection_task"; // 表å,å¤ä¸ªè¡¨éå·éå¼ String author = "ld"; // ä½è ä¿¡æ¯ // 代ç è¾åºè·¯å¾é ç½® String outputBasePath = Paths.get(projectPath, path, "src", "main", "java").toString(); @@ -48,7 +49,7 @@ // 代ç çææ ¸å¿é ç½® FastAutoGenerator.create(DB_URL, DB_USERNAME, DB_PASSWORD) .globalConfig(builder -> { builder.author("ld") // ä½è ä¿¡æ¯ builder.author(author) // ä½è ä¿¡æ¯ .outputDir(outputBasePath) // 代ç è¾åºç®å½ .dateType(DateType.ONLY_DATE) // æ¥æç±»å .commentDate("yyyy-MM-dd") // æ³¨éæ¥ææ ¼å¼ @@ -128,7 +129,7 @@ )); // åºç±»å段 customMap.put("idType", "AUTO"); // 主é®ç±»å customMap.put("superEntityClass", "com.ruoyi.common.core.domain.MyBaseEntity"); // åºç±»å ¨è·¯å¾ customMap.put("author", "ruoyi"); // ä½è ä¿¡æ¯ customMap.put("author", author); // ä½è ä¿¡æ¯ customMap.put("packageName", BASE_PACKAGE + "." + MODULE_NAME); // å å customMap.put("tableName", table); // 表å ruoyi-admin/src/main/resources/templates/controller.Java.ftl
@@ -26,7 +26,7 @@ @Controller </#if> @AllArgsConstructor @RequestMapping("<#if package.ModuleName?? && package.ModuleName != "">/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle>${controllerMappingHyphen}<#else>${table.entityPath}</#if>") @RequestMapping("/<#if controllerMappingHyphenStyle>${controllerMappingHyphen}<#else>${table.entityPath}</#if>") <#if kotlin> class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if> <#else>