basic-server/src/main/java/com/ruoyi/basic/entity/CoalInfo.java
@@ -1,11 +1,14 @@ package com.ruoyi.basic.entity; import com.baomidou.mybatisplus.annotation.*; 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.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import com.ruoyi.common.core.domain.MyBaseEntity; import lombok.Data; import java.util.Date; import java.time.LocalDate; /** * ç ¤ç§ä¿¡æ¯è¡¨ å®ä½ç±» @@ -39,5 +42,5 @@ */ @TableField(value = "maintenance_date") @JsonFormat(pattern = "yyyy-MM-dd") private Date maintenanceDate; private LocalDate maintenanceDate; } basic-server/src/main/java/com/ruoyi/basic/entity/CoalValue.java
@@ -17,8 +17,7 @@ */ @Data @TableName("coal_value") public class CoalValue extends MyBaseEntity { public class CoalValue extends MyBaseEntity { private static final long serialVersionUID = 1L; @@ -30,7 +29,7 @@ private Long id; /** * å ³èéè´å ¥åºä¸»é®ID * å ³èéè´/æ£å¼å ¥åºä¸»é®ID */ @TableField(value = "plan_id") private Long planId; @@ -50,4 +49,10 @@ @TableField(value = "field_name") private String fieldName; /** * 1 éè´/ 2 æ£å¼ å ¥åº */ @TableField(value = "type") private String type; } basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java
@@ -9,13 +9,13 @@ import com.ruoyi.basic.entity.CoalInfo; import com.ruoyi.basic.mapper.CoalInfoMapper; import com.ruoyi.basic.service.CoalInfoService; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.time.LocalDate; import java.util.Objects; /** @@ -47,7 +47,7 @@ CoalInfo coalInfo = new CoalInfo(); BeanUtils.copyProperties(coalInfoDto, coalInfo); coalInfo.setMaintainerId(SecurityUtils.getUserId()); coalInfo.setMaintenanceDate(DateUtils.getNowDate()); coalInfo.setMaintenanceDate(LocalDate.now()); if (Objects.isNull(coalInfoDto.getId())) { return coalInfoMapper.insert(coalInfo); } else { main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java
@@ -4,11 +4,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.business.dto.OfficialInventoryDto; import com.ruoyi.business.service.OfficialInventoryService; import com.ruoyi.business.vo.OfficialInventoryVo; 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; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> @@ -31,8 +32,32 @@ */ @GetMapping("/list") public R<IPage<OfficialInventoryDto>> list(Page page, OfficialInventoryDto officialInventoryDto) { IPage<OfficialInventoryDto> list = officialInventoryService.selectOfficialInventoryList(page,officialInventoryDto); IPage<OfficialInventoryDto> list = officialInventoryService.selectOfficialInventoryList(page, officialInventoryDto); return R.ok(list); } /** * æ£å¼åºç ¤ç§é¨åä¿¡æ¯list */ @GetMapping("/OfficialList") public R<List<OfficialInventoryVo>> officialList(OfficialInventoryVo officialInventoryVo) { return R.ok(officialInventoryService.selectOfficialList(officialInventoryVo)); } /** * æ£å¼åºä¿®æ¹ */ @PostMapping("/editOfficial") public R editOfficial(@RequestBody OfficialInventoryDto officialInventoryDto) { return R.ok(officialInventoryService.editOfficial(officialInventoryDto)); } /** * åå¹¶ */ @PostMapping("/merge") public R merge(@RequestBody OfficialInventoryDto officialInventoryDto) { return R.ok(officialInventoryService.mergeAll(officialInventoryDto)); } } main-business/src/main/java/com/ruoyi/business/controller/SalesRecordController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ 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.SalesRecordDto; import com.ruoyi.business.entity.SalesRecord; import com.ruoyi.business.service.SalesRecordService; import com.ruoyi.common.core.domain.R; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; /** * <p> * éå®è®°å½è¡¨ å端æ§å¶å¨ * </p> * * @author ruoyi * @since 2025-06-11 */ @RestController @AllArgsConstructor @RequestMapping("/salesRecord") public class SalesRecordController { private SalesRecordService salesRecordService; /** * éå®è®°å½è¡¨æ¥è¯¢ */ @GetMapping("/list") public R<IPage<SalesRecord>> list(Page page, SalesRecordDto salesRecordDto) { IPage<SalesRecord> list = salesRecordService.selectSalesRecordList(page,salesRecordDto); return R.ok(list); } /** * éå®è®°å½è¡¨æ°å¢ä¿®æ¹ */ @PostMapping("/addOrEditSalesRecord") public R addOrEditSalesRecord(@RequestBody SalesRecordDto salesRecordDto) { return R.ok(salesRecordService.addOrEditSalesRecord(salesRecordDto)); } /** * éå®è®°å½è¡¨å é¤ */ @DeleteMapping("/delSalesRecord") public R remove(@RequestBody Long[] ids) { return R.ok(salesRecordService.delByIds(ids)); } } main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
@@ -10,4 +10,7 @@ public class OfficialInventoryDto extends OfficialInventory { private List<Map<String, String>> fields; private List<Long> ids; } main-business/src/main/java/com/ruoyi/business/dto/SalesRecordDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package com.ruoyi.business.dto; import com.ruoyi.business.entity.SalesRecord; import lombok.Data; @Data public class SalesRecordDto extends SalesRecord { } main-business/src/main/java/com/ruoyi/business/entity/File.java
@@ -2,58 +2,58 @@ import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import com.ruoyi.common.core.domain.MyBaseEntity; import com.ruoyi.common.core.domain.MyBaseEntity; /** * ä¸ä¼ æä»¶çåºæ¬ä¿¡æ¯ å®ä½ç±» * * @author ruoyi * @date 2025-06-10 */ * ä¸ä¼ æä»¶çåºæ¬ä¿¡æ¯ å®ä½ç±» * * @author ruoyi * @date 2025-06-10 */ @Data @TableName("file") public class File extends MyBaseEntity { private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å ³èçæ¡£æ¡IDï¼å¤é®å¼ç¨ archive.id */ @TableField(value = "archive_id") private Long archiveId; /** * åå§æä»¶åï¼ç¨æ·ä¸ä¼ æ¶çåç§°ï¼ */ @TableField(value = "original_name") private String originalName; /** * é¢è§å°å */ @TableField(value = "preview_url") private String previewUrl; /** * ç³»ç»åå¨çå¯ä¸æä»¶å */ @TableField(value = "file_name") private String fileName; /** * æä»¶å¨æå¡å¨ä¸çåå¨è·¯å¾æè®¿é®URL */ @TableField(value = "file_path") private String filePath; /** * æä»¶MIMEç±»åï¼ä¾å¦ image/pngãapplication/pdf */ @TableField(value = "file_type") private String fileType; /** * æä»¶å¤§å°ï¼åä½ä¸ºåè */ @TableField(value = "file_size") private String fileSize; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å ³èçæ¡£æ¡IDï¼å¤é®å¼ç¨ archive.id */ @TableField(value = "archive_id") private Long archiveId; /** * åå§æä»¶åï¼ç¨æ·ä¸ä¼ æ¶çåç§°ï¼ */ @TableField(value = "original_name") private String originalName; /** * é¢è§å°å */ @TableField(value = "preview_url") private String previewUrl; /** * ç³»ç»åå¨çå¯ä¸æä»¶å */ @TableField(value = "file_name") private String fileName; /** * æä»¶å¨æå¡å¨ä¸çåå¨è·¯å¾æè®¿é®URL */ @TableField(value = "file_path") private String filePath; /** * æä»¶MIMEç±»åï¼ä¾å¦ image/pngãapplication/pdf */ @TableField(value = "file_type") private String fileType; /** * æä»¶å¤§å°ï¼åä½ä¸ºåè */ @TableField(value = "file_size") private String fileSize; } main-business/src/main/java/com/ruoyi/business/entity/OfficialInventory.java
@@ -8,7 +8,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.time.LocalDate; /** * æ£å¼åºå表 å®ä½ç±» @@ -63,10 +63,15 @@ @TableField(value = "total_price_including_tax") private BigDecimal totalPriceIncludingTax; /** * ææ¬åä»· * ä¸å«ç¨åä»· */ @TableField(value = "cost_per_unit") private BigDecimal costPerUnit; @TableField(value = "price_excluding_tax") private BigDecimal priceExcludingTax; /** * ä¸å«ç¨æ»ä»· */ @TableField(value = "total_price_excluding_tax") private BigDecimal totalPriceExcludingTax; /** * å¾ è¡¥åº */ @@ -81,5 +86,11 @@ * ç»è®°æ¥æ */ @TableField(value = "registration_date") private Date registrationDate; private LocalDate registrationDate; /** * åå¹¶id */ @TableField(value = "merge_id") private String mergeId; } main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java
@@ -8,7 +8,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.time.LocalDate; /** * å¾ å ¥åºè¡¨ å®ä½ç±» @@ -56,18 +56,23 @@ @TableField(value = "total_price_including_tax") private BigDecimal totalPriceIncludingTax; /** * ææ¬åä»· * ä¸å«ç¨åä»· */ @TableField(value = "cost_per_unit") private BigDecimal costPerUnit; @TableField(value = "price_excluding_tax") private BigDecimal priceExcludingTax; /** * ä¸å«ç¨æ»ä»· */ @TableField(value = "total_price_excluding_tax") private BigDecimal totalPriceExcludingTax; /** * ç»è®°äºº */ @TableField(value = "registrant_id") private String registrantId; /** * ç»è®°æ¶é´ * ç»è®°æ¥æ */ @TableField(value = "registration_time") private Date registrationTime; @TableField(value = "registration_date") private LocalDate registrationDate; } main-business/src/main/java/com/ruoyi/business/entity/Production.java
@@ -8,7 +8,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.time.LocalDate; /** * ç产æç»è¡¨ å®ä½ç±» @@ -81,5 +81,5 @@ * çäº§æ¥æ */ @TableField(value = "production_date") private Date productionDate; private LocalDate productionDate; } main-business/src/main/java/com/ruoyi/business/entity/PurchaseRegistration.java
@@ -8,7 +8,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.time.LocalDate; /** * éè´ç»è®°è¡¨ å®ä½ç±» @@ -91,5 +91,5 @@ * ç»è®°æ¥æ */ @TableField(value = "registration_date") private Date registrationDate; private LocalDate registrationDate; } main-business/src/main/java/com/ruoyi/business/entity/SalesRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,120 @@ 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-11 */ @Data @TableName("sales_record") public class SalesRecord extends MyBaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * é宿¥æ */ @TableField(value = "sale_date") private LocalDate saleDate; /** * 客æ·id */ @TableField(value = "customer_id") private Long customerId; /** * å®¢æ· */ @TableField(value = "customer") private String customer; /** * ç ¤ç§id */ @TableField(value = "coal_id") private String coalId; /** * ç ¤ç§ */ @TableField(value = "coal") private String coal; /** * åä»·ï¼å«ç¨ï¼ */ @TableField(value = "price_including_tax") private BigDecimal priceIncludingTax; /** * åºåæ°é */ @TableField(value = "inventory_quantity") private Long inventoryQuantity; /** * åä½ */ @TableField(value = "unit") private String unit; /** * é宿°é */ @TableField(value = "sale_quantity") private BigDecimal saleQuantity; /** * éå®åä»· (å«ç¨) */ @TableField(value = "sale_price") private BigDecimal salePrice; /** * é宿»ä»· (å«ç¨) */ @TableField(value = "total_amount") private BigDecimal totalAmount; /** * è´éç ¤ç¨ç13% */ @TableField(value = "tax_coal") private String taxCoal; /** * è¿è¾ç¨ç9% */ @TableField(value = "tax_trans") private String taxTrans; /** * æ¯å©æ¶¦ */ @TableField(value = "gross_profit") private BigDecimal grossProfit; /** * å婿¶¦ */ @TableField(value = "net_profit") private BigDecimal netProfit; /** * ç»è®°äººid */ @TableField(value = "registrant_id") private Long registrantId; /** * ç»è®°äºº */ @TableField(value = "registrant") private String registrant; /** * ç»è®°æ¥æ */ @TableField(value = "registration_date") private LocalDate registrationDate; } main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.business.entity.SalesRecord; import org.apache.ibatis.annotations.Mapper; /** * <p> * éå®è®°å½è¡¨ Mapper æ¥å£ * </p> * * @author ruoyi * @since 2025-06-11 */ @Mapper public interface SalesRecordMapper extends BaseMapper<SalesRecord> { } main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java
@@ -5,6 +5,9 @@ import com.ruoyi.business.dto.OfficialInventoryDto; import com.ruoyi.business.entity.OfficialInventory; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.business.vo.OfficialInventoryVo; import java.util.List; /** * <p> @@ -17,4 +20,10 @@ public interface OfficialInventoryService extends IService<OfficialInventory> { IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto); int mergeAll(OfficialInventoryDto officialInventoryDto); int editOfficial(OfficialInventoryDto officialInventoryDto); List<OfficialInventoryVo> selectOfficialList(OfficialInventoryVo officialInventoryVo); } main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.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.SalesRecordDto; import com.ruoyi.business.entity.SalesRecord; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * éå®è®°å½è¡¨ æå¡ç±» * </p> * * @author ruoyi * @since 2025-06-11 */ public interface SalesRecordService extends IService<SalesRecord> { IPage<SalesRecord> selectSalesRecordList(Page page, SalesRecordDto salesRecordDto); int addOrEditSalesRecord(SalesRecordDto salesRecordDto); int delByIds(Long[] ids); } main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
@@ -1,7 +1,9 @@ package com.ruoyi.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.entity.CoalField; @@ -11,16 +13,16 @@ import com.ruoyi.business.dto.OfficialInventoryDto; import com.ruoyi.business.entity.OfficialInventory; import com.ruoyi.business.mapper.OfficialInventoryMapper; import com.ruoyi.business.mapper.PendingInventoryMapper; import com.ruoyi.business.service.OfficialInventoryService; import com.ruoyi.business.vo.OfficialInventoryVo; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; /** @@ -41,7 +43,6 @@ private final CoalFieldMapper coalFieldMapper; private final PendingInventoryMapper pendingInventoryMapper; @Override public IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) { @@ -66,14 +67,19 @@ // é忝æ¡è®°å½ï¼è¿è¡è½¬æ¢å¹¶å¡«å fields for (OfficialInventory entity : entityPage.getRecords()) { OfficialInventoryDto dto = new OfficialInventoryDto(); BeanUtils.copyProperties(entity, dto); Long pendingId = entity.getPendingId(); // æ¥è¯¢è¯¥ pendingId 对åºç CoalValue æ°æ® List<CoalValue> coalValues = coalValueMapper.selectList( new LambdaQueryWrapper<CoalValue>().eq(CoalValue::getPlanId, pendingId) ); BeanUtils.copyProperties(entity, dto); List<CoalValue> coalValues; if (entity.getMergeId() == null) { coalValues = coalValueMapper.selectList(new LambdaQueryWrapper<CoalValue>() .eq(CoalValue::getPlanId, entity.getPendingId()) .and(wrapper -> wrapper.ne(CoalValue::getType, "2").or().isNull(CoalValue::getType)) ); } else { coalValues = coalValueMapper.selectList(new LambdaQueryWrapper<CoalValue>() .eq(CoalValue::getPlanId, entity.getId()) .eq(CoalValue::getType, "2") ); } // æå»º Map<fieldName, value> Map<String, String> fieldValueMap = coalValues.stream() @@ -99,4 +105,110 @@ dtoPage.setRecords(dtoList); // 设置转æ¢åç DtoList return dtoPage; } @Override public int editOfficial(OfficialInventoryDto officialInventoryDto) { OfficialInventory officialInventory = new OfficialInventory(); BeanUtils.copyProperties(officialInventoryDto, officialInventory); return officialInventoryMapper.updateById(officialInventory); } @Override public List<OfficialInventoryVo> selectOfficialList(OfficialInventoryVo officialInventoryVo) { List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null); return officialInventories.stream() .map(OI -> { OfficialInventoryVo vo = new OfficialInventoryVo(); BeanUtils.copyProperties(OI, vo); return vo; }) .collect(Collectors.toList()); } @Transactional @Override public int mergeAll(OfficialInventoryDto officialInventoryDto) { List<Long> ids = officialInventoryDto.getIds(); // æ ¡éªåæ° if (CollectionUtils.isEmpty(ids) || ids.size() < 2) { throw new BaseException("请éä¸è³å°ä¸¤æ¡æ°æ®"); } if (CollectionUtils.isEmpty(officialInventoryDto.getFields())) { throw new BaseException("åæ®µå¼ä¸è½ä¸ºç©º"); } // 1. æ¹éæ è®°å 餿§æ°æ® LambdaUpdateWrapper<OfficialInventory> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.in(OfficialInventory::getId, ids) .set(OfficialInventory::getDeleted, 1); int rowsAffected = officialInventoryMapper.update(null, updateWrapper); if (rowsAffected == 0) { throw new BaseException("æªæ¾å°å¹é çæ°æ®ï¼è¯·ç¡®è®¤éæ©æ¯å¦æ£ç¡®"); } // 2. æå ¥æ°åºåè®°å½ OfficialInventory officialInventory = new OfficialInventory(); BeanUtils.copyProperties(officialInventoryDto, officialInventory); officialInventory.setMergeId(ids.toString()); officialInventory.setRegistrantId(SecurityUtils.getLoginUser().getUser().getUserName()); if (officialInventoryMapper.insert(officialInventory) <= 0) { throw new BaseException("åºåè®°å½å建失败"); } // 3. æ¹éå¤çåæ®µå¼ batchProcessCoalValues(officialInventory.getId(), officialInventoryDto.getFields()); return rowsAffected; } private void batchProcessCoalValues(Long planId, List<Map<String, String>> fields) { // 1. æåææå¯ä¸å段æ è¯ Set<String> allFields = fields.stream() .flatMap(map -> map.keySet().stream()) .collect(Collectors.toSet()); // 2. æ¥è¯¢å段æ å°å ³ç³» 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 )); // 3. æé å¹¶æå ¥æ¯æ¡è®°å½ CoalValue coalValueTemplate = new CoalValue(); coalValueTemplate.setPlanId(planId); coalValueTemplate.setType("2"); for (Map<String, String> fieldMapEntry : fields) { 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("åæ®µåä¸åå¨: " + key); } CoalValue coalValue = new CoalValue(); BeanUtils.copyProperties(coalValueTemplate, coalValue); // å¤ç¨æ¨¡æ¿å±æ§ coalValue.setId(null); coalValue.setCoalValue(value); coalValue.setType("2"); coalValue.setPlanId(planId); coalValue.setFields(key); coalValue.setFieldName(fieldName); // åæ¡æå ¥ int result = coalValueMapper.insert(coalValue); if (result <= 0) { throw new BaseException("åæ®µå¼ä¿å失败ï¼å段ï¼" + key); } } } } } main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java
@@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Objects; /** @@ -55,6 +55,7 @@ BeanUtils.copyProperties(purchaseRegistrationDto, purchaseRegistration); if (Objects.isNull(purchaseRegistrationDto.getId())) { // æ°å¢éè´ç»è®° purchaseRegistration.setRegistrationDate(LocalDate.now()); int insertCount = purchaseRegistrationMapper.insert(purchaseRegistration); if (insertCount > 0) { // éè´ç»è®°æåï¼åæ¥åå»ºå¾ å ¥åºè®°å½ @@ -80,7 +81,6 @@ // è®¾ç½®å¾ å ¥åºè®°å½ç¹æç屿§ï¼å¦ææï¼ pendingInventory.setInventoryQuantity(purchaseRegistration.getPurchaseQuantity()); pendingInventory.setCostPerUnit(new BigDecimal(22)); return pendingInventory; } main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,144 @@ package com.ruoyi.business.service.impl; 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.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.entity.Customer; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.business.dto.SalesRecordDto; import com.ruoyi.business.entity.SalesRecord; import com.ruoyi.business.mapper.SalesRecordMapper; import com.ruoyi.business.service.SalesRecordService; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.base.BaseException; 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 java.time.LocalDate; /** * <p> * éå®è®°å½è¡¨ æå¡å®ç°ç±» * </p> * * @author ruoyi * @since 2025-06-11 */ @Service @RequiredArgsConstructor public class SalesRecordServiceImpl extends ServiceImpl<SalesRecordMapper, SalesRecord> implements SalesRecordService { private final SalesRecordMapper salesRecordMapper; private final SysUserMapper userMapper; private final CustomerMapper customerMapper; @Override public IPage<SalesRecord> selectSalesRecordList(Page page, SalesRecordDto salesRecordDto) { LambdaQueryWrapper<SalesRecord> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(SalesRecord::getCreateTime); return salesRecordMapper.selectPage(page, queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public int addOrEditSalesRecord(SalesRecordDto salesRecordDto) { // åæ°æ ¡éª validateSalesRecordDto(salesRecordDto); // æå»ºéå®è®°å½å®ä½ SalesRecord salesRecord = buildSalesRecord(salesRecordDto); // å¤çæ°å¢/æ´æ°é»è¾ if (salesRecordDto.getId() == null) { return insertSalesRecord(salesRecord); } else { return updateSalesRecord(salesRecord); } } private void validateSalesRecordDto(SalesRecordDto dto) { if (dto == null) { throw new BaseException("éå®è®°å½æ°æ®ä¸è½ä¸ºç©º"); } if (dto.getRegistrantId() == null) { throw new BaseException("ç»è®°äººIDä¸è½ä¸ºç©º"); } if (dto.getCustomerId() == null) { throw new BaseException("客æ·IDä¸è½ä¸ºç©º"); } } private SalesRecord buildSalesRecord(SalesRecordDto dto) { SalesRecord record = new SalesRecord(); BeanUtils.copyProperties(dto, record); // 设置ç»è®°äººä¿¡æ¯ SysUser registrant = userMapper.selectUserById(dto.getRegistrantId()); if (registrant == null) { throw new BaseException("ç»è®°äººä¿¡æ¯ä¸åå¨"); } record.setRegistrant(registrant.getUserName()); // 设置客æ·ä¿¡æ¯ Customer customer = customerMapper.selectById(dto.getCustomerId()); if (customer == null) { throw new BaseException("客æ·ä¿¡æ¯ä¸åå¨"); } record.setCustomer(customer.getCustomerName()); // è®¾ç½®æ¥æä¿¡æ¯ LocalDate now = LocalDate.now(); if (record.getId() == null) { // æ°å¢æ¶è®¾ç½®æ¥æ record.setSaleDate(now); record.setRegistrationDate(now); } else { // æ´æ°æ¶ä¸è¦çåææ¥æ SalesRecord existing = salesRecordMapper.selectById(record.getId()); if (existing == null) { throw new BaseException("éå®è®°å½ä¸åå¨"); } record.setSaleDate(existing.getSaleDate()); record.setRegistrationDate(existing.getRegistrationDate()); } return record; } private int insertSalesRecord(SalesRecord record) { int result = salesRecordMapper.insert(record); if (result <= 0) { throw new BaseException("éå®è®°å½å建失败"); } return result; } private int updateSalesRecord(SalesRecord record) { int result = salesRecordMapper.updateById(record); if (result <= 0) { throw new BaseException("éå®è®°å½æ´æ°å¤±è´¥"); } return result; } @Override public int delByIds(Long[] ids) { // æ£æ¥åæ° if (ids == null || ids.length == 0) { return 0; } // æé æ´æ°æ¡ä»¶ UpdateWrapper<SalesRecord> updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", ids) .set("deleted", 1); // 设置 deleted 为 1 表示已å é¤ // æ§è¡æ¹éé»è¾å é¤ return salesRecordMapper.update(null, updateWrapper); } } main-business/src/main/java/com/ruoyi/business/vo/OfficialInventoryVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.business.vo; import lombok.Data; import java.math.BigDecimal; @Data public class OfficialInventoryVo { private Long id; // 主é®ID private String coal; // ç ¤ç§ private String unit; // åä½ private BigDecimal inventoryQuantity; // åºåæ°é private BigDecimal priceIncludingTax; // åä»·ï¼å«ç¨ï¼ } main-business/src/main/resources/db/migration/postgresql/V20250611160300__create_table_sales_record.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ -- å建éå®è®°å½è¡¨ CREATE TABLE sales_record ( id BIGSERIAL PRIMARY KEY, -- 主é®ID sale_date DATE NOT NULL, -- é宿¥æ customer_id BIGINT, -- 客æ·id customer VARCHAR(255) NOT NULL, -- å®¢æ· coal_id VARCHAR(255) NOT NULL, -- ç ¤ç§ id coal VARCHAR(255) NOT NULL, -- ç ¤ç§ price_including_tax DECIMAL(10, 2) NOT NULL, -- åä»·ï¼å«ç¨ï¼ inventory_quantity DECIMAL(10, 0) NOT NULL, -- åºåæ°é unit VARCHAR(100) NOT NULL, -- åä½ sale_quantity DECIMAL(10, 2) NOT NULL, -- é宿°é sale_price DECIMAL(10, 2) NOT NULL, -- éå®åä»· (å«ç¨) total_amount DECIMAL(10, 2) NOT NULL, -- é宿»ä»· (å«ç¨) tax_coal VARCHAR(36), -- è´éç ¤ç¨ç13% tax_trans VARCHAR(36), -- è¿è¾ç¨ç9% gross_profit DECIMAL(10, 2), -- æ¯å©æ¶¦ net_profit DECIMAL(10, 2), -- å婿¶¦ registrant_id BIGINT, -- ç»è®°äººid registrant VARCHAR(255) NOT NULL, -- ç»è®°äºº registration_date DATE NOT NULL, -- ç»è®°æ¥æ create_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- ä¸ä¼ æ¶é´ï¼é»è®¤å½åæ¶é´ update_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- æåæ´æ°æ¶é´ï¼é»è®¤å½åæ¶é´ create_by VARCHAR(255), -- ä¸ä¼ äººç¨æ·å update_by VARCHAR(255), -- æåä¿®æ¹äººç¨æ·å deleted INT NOT NULL DEFAULT 0 -- 软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤ ); -- 表注é COMMENT ON TABLE sales_record IS 'éå®è®°å½è¡¨'; -- æ·»å åæ®µæ³¨é COMMENT ON COLUMN sales_record.id IS '主é®ID'; COMMENT ON COLUMN sales_record.sale_date IS 'é宿¥æ'; COMMENT ON COLUMN sales_record.customer IS '客æ·'; COMMENT ON COLUMN sales_record.customer_id IS '客æ·id'; COMMENT ON COLUMN sales_record.coal IS 'ç ¤ç§'; COMMENT ON COLUMN sales_record.coal_id IS 'ç ¤ç§id'; COMMENT ON COLUMN sales_record.unit IS 'åä½'; COMMENT ON COLUMN sales_record.price_including_tax IS 'åä»·ï¼å«ç¨ï¼'; COMMENT ON COLUMN sales_record.inventory_quantity IS 'åºåæ°é'; COMMENT ON COLUMN sales_record.sale_quantity IS 'é宿°é'; COMMENT ON COLUMN sales_record.sale_price IS 'éå®åä»· (å«ç¨)'; COMMENT ON COLUMN sales_record.total_amount IS 'é宿»ä»· (å«ç¨)'; COMMENT ON COLUMN sales_record.tax_coal IS 'è´éç ¤ç¨ç13%'; COMMENT ON COLUMN sales_record.tax_trans IS 'è¿è¾ç¨ç9%'; COMMENT ON COLUMN sales_record.gross_profit IS 'æ¯å©æ¶¦'; COMMENT ON COLUMN sales_record.net_profit IS 'å婿¶¦'; COMMENT ON COLUMN sales_record.registrant IS 'ç»è®°äºº'; COMMENT ON COLUMN sales_record.registrant_id IS 'ç»è®°äººid'; COMMENT ON COLUMN sales_record.registration_date IS 'ç»è®°æ¥æ'; COMMENT ON COLUMN sales_record.deleted IS '软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤'; COMMENT ON COLUMN sales_record.create_by IS 'å建该记å½çç¨æ·'; COMMENT ON COLUMN sales_record.create_time IS 'è®°å½å建æ¶é´'; COMMENT ON COLUMN sales_record.update_by IS 'æåä¿®æ¹è¯¥è®°å½çç¨æ·'; COMMENT ON COLUMN sales_record.update_time IS 'è®°å½æåæ´æ°æ¶é´'; main-business/src/main/resources/mapper/OfficialInventoryMapper.xml
@@ -11,12 +11,11 @@ <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> <result column="supplier_name" property="supplierName" /> <result column="coal_type" property="coalType" /> <result column="coal" property="coal" /> <result column="unit" property="unit" /> <result column="inventory_quantity" property="inventoryQuantity" /> <result column="price_including_tax" property="priceIncludingTax" /> <result column="total_price_including_tax" property="totalPriceIncludingTax" /> <result column="cost_per_unit" property="costPerUnit" /> <result column="pending_replenishment" property="pendingReplenishment" /> <result column="registrant_id" property="registrantId" /> <result column="registration_date" property="registrationDate" /> @@ -29,7 +28,7 @@ create_time, update_by, update_time, id, supplier_name, coal_type, unit, inventory_quantity, price_including_tax, total_price_including_tax, cost_per_unit, pending_replenishment, registrant_id, registration_date id, supplier_name, coal_type, unit, inventory_quantity, price_including_tax, total_price_including_tax, pending_replenishment, registrant_id, registration_date </sql> </mapper> main-business/src/main/resources/mapper/PendingInventoryMapper.xml
@@ -16,9 +16,8 @@ <result column="inventory_quantity" property="inventoryQuantity" /> <result column="price_including_tax" property="priceIncludingTax" /> <result column="total_price_including_tax" property="totalPriceIncludingTax" /> <result column="cost_per_unit" property="costPerUnit" /> <result column="registrant_id" property="registrantId" /> <result column="registration_time" property="registrationTime" /> <result column="registration_date" property="registrationDate" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> @@ -28,7 +27,7 @@ create_time, update_by, update_time, id, supplier_name, coal_type, unit, inventory_quantity, price_including_tax, total_price_including_tax, cost_per_unit, registrant, registration_time id, supplier_name, coal_type, unit, inventory_quantity, price_including_tax, total_price_including_tax, registrant, registration_time </sql> </mapper> main-business/src/main/resources/mapper/SalesRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ <?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.SalesRecordMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.SalesRecord"> <id column="id" property="id" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="create_by" property="createBy" /> <result column="update_by" property="updateBy" /> <result column="deleted" property="deleted" /> <result column="sale_date" property="saleDate" /> <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" /> <result column="sale_quantity" property="saleQuantity" /> <result column="sale_price" property="salePrice" /> <result column="total_amount" property="totalAmount" /> <result column="tax_coal" property="taxCoal" /> <result column="tax_trans" property="taxTrans" /> <result column="gross_profit" property="grossProfit" /> <result column="net_profit" property="netProfit" /> <result column="registrant_id" property="registrantId" /> <result column="registrant" property="registrant" /> <result column="registration_date" property="registrationDate" /> </resultMap> <!-- éç¨æ¥è¯¢ç»æå --> <sql id="Base_Column_List"> create_time, update_time, create_by, update_by, 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> </mapper> ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java
@@ -99,7 +99,6 @@ provinceMapper.insert(provinces); cityMapper.insert(cities); districtMapper.insert(districts); log.info("å°åºä¿¡æ¯åå§åç»æ"); } }