src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ruoyi.procurementrecord.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.purchase.dto.InvoicePurchaseReportDto; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author :yys * @date : 2025/7/7 14:32 */ @RestController @Api(tags = "éè´å ¥åº") @RequestMapping("/stockin") public class ProcurementRecordController extends BaseController { @Autowired private ProcurementRecordService procurementRecordService; @GetMapping("/productlist") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-æ°å¢å ¥åºæ¥è¯¢", businessType = BusinessType.OTHER) public AjaxResult list(ProcurementDto procurementDto) { List<ProcurementDto> result =procurementRecordService.listProcurementBySalesLedgerId(procurementDto); return AjaxResult.success(result); } @PostMapping("/add") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-æ°å¢å ¥åº", businessType = BusinessType.INSERT) public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) { return AjaxResult.success(procurementRecordService.add(procurementDto)); } @PostMapping("/update") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-ä¿®æ¹å ¥åº", businessType = BusinessType.UPDATE) public AjaxResult updatePro(@RequestBody ProcurementUpdateDto procurementDto) { return AjaxResult.success(procurementRecordService.updatePro(procurementDto)); } @GetMapping("/listPage") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-å ¥åºæ¥è¯¢", businessType = BusinessType.OTHER) public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) { IPage<ProcurementPageDto> result =procurementRecordService.listPage(page, procurementDto); return AjaxResult.success(result); } } src/main/java/com/ruoyi/procurementrecord/dto/Details.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.ruoyi.procurementrecord.dto; import java.math.BigDecimal; /** * @author :yys * @date : 2025/7/7 16:17 */ public class Details { private Integer id; private BigDecimal inboundQuantity; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public BigDecimal getInboundQuantity() { return inboundQuantity; } public void setInboundQuantity(BigDecimal inboundQuantity) { this.inboundQuantity = inboundQuantity; } } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.procurementrecord.dto; import lombok.Data; import java.util.List; /** * @author :yys * @date : 2025/7/7 16:07 */ @Data public class ProcurementAddDto { private List<Details> details; private String nickName; } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,89 @@ package com.ruoyi.procurementrecord.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author :yys * @date : 2025/7/7 14:46 */ @Data public class ProcurementDto { private String purchaseContractNumber; private Integer id; private Integer recordId; /** * å ¥åºæ°é */ private Integer quantityStock; /** * ä¾åºååç§° */ @Excel(name = "ä¾åºååç§°") private String supplierName; /** * 产å大类 */ @Excel(name = "产å大类") private String productCategory; /** * è§æ ¼åå· */ @Excel(name = "è§æ ¼åå·") private String specificationModel; /** * åä½ */ @Excel(name = "åä½") private String unit; /** * æ°é */ @Excel(name = "æ°é") private BigDecimal quantity; /** * å¾ å ¥åºæ°é */ @Excel(name = "å¾ å ¥åºæ°é") private BigDecimal quantity0; /** * ç¨ç */ @Excel(name = "ç¨ç") private BigDecimal taxRate; /** * å«ç¨åä»· */ @Excel(name = "å«ç¨åä»·") private BigDecimal taxInclusiveUnitPrice; /** * å«ç¨æ»ä»· */ @Excel(name = "å«ç¨æ»ä»·") private BigDecimal taxInclusiveTotalPrice; /** * ä¸å«ç¨æ»ä»· */ @Excel(name = "ä¸å«ç¨æ»ä»·") private BigDecimal taxExclusiveTotalPrice; } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.ruoyi.procurementrecord.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author :yys * @date : 2025/7/7 17:00 */ @Data public class ProcurementPageDto { private Integer id; /** * å ¥åºæ¹æ¬¡ */ @Excel(name = "å ¥åºæ¹æ¬¡") private String inboundBatches; /** * ååå· */ private String purchaseContractNumber; /** * åºå ¥åºæ°é */ @Excel(name = "åºå ¥åºæ°é") private BigDecimal inboundNum; /** * åºå ¥åºæ¶é´ */ @Excel(name = "åºå ¥åºæ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createDate; /** * åºå ¥åºç¨æ· */ @Excel(name = "åºå ¥åºç¨æ·") private String createBy; /** * ä¾åºååç§° */ @Excel(name = "ä¾åºååç§°") private String supplierName; /** * 产å大类 */ @Excel(name = "产å大类") private String productCategory; /** * è§æ ¼åå· */ @Excel(name = "è§æ ¼åå·") private String specificationModel; /** * åä½ */ @Excel(name = "åä½") private String unit; /** * ç¨ç */ @Excel(name = "ç¨ç") private BigDecimal taxRate; /** * å«ç¨åä»· */ @Excel(name = "å«ç¨åä»·") private BigDecimal taxInclusiveUnitPrice; /** * å«ç¨æ»ä»· */ @Excel(name = "å«ç¨æ»ä»·") private BigDecimal taxInclusiveTotalPrice; /** * ä¸å«ç¨æ»ä»· */ @Excel(name = "ä¸å«ç¨æ»ä»·") private BigDecimal taxExclusiveTotalPrice; } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.procurementrecord.dto; import lombok.Data; import java.math.BigDecimal; /** * @author :yys * @date : 2025/7/8 10:40 */ @Data public class ProcurementUpdateDto { private Integer id; private BigDecimal quantityStock; } src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.procurementrecord.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.pojo.ProcurementRecord; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author :yys * @date : 2025/7/7 14:30 */ public interface ProcurementRecordMapper extends BaseMapper<ProcurementRecord> { /** * æ ¹æ®éè´å°è´¦idæ¥è¯¢éè´å ¥åºä¿¡æ¯ * * @param procurementDto * @return */ List<ProcurementDto> listProcurementBySalesLedgerId(@Param("req") ProcurementDto procurementDto); IPage<ProcurementPageDto> listPage(Page page,@Param("req") ProcurementPageDto procurementDto); } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ package com.ruoyi.procurementrecord.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author :yys * @date : 2025/7/7 14:25 */ @TableName("procurement_record") @Data @Builder public class ProcurementRecord { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 产åä¿¡æ¯è¡¨id */ private Integer salesLedgerProductId; /** * éè´åç±»ï¼1-å ¥åº 2-åºåºï¼ */ private Integer procurementCategory; /** * å ¥åºæ¹æ¬¡ */ private String inboundBatches; /** * åºå ¥åºæ°é */ private BigDecimal inboundNum; /** * åºå ¥åºæ¶é´ */ private LocalDateTime createDate; /** * åºå ¥åºç¨æ· */ private String createBy; /** * ç§æ·ID */ private Long tenantId; } src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.procurementrecord.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; import com.ruoyi.procurementrecord.pojo.ProcurementRecord; import java.util.List; /** * @author :yys * @date : 2025/7/7 14:36 */ public interface ProcurementRecordService extends IService<ProcurementRecord> { List<ProcurementDto> listProcurementBySalesLedgerId(ProcurementDto procurementDto); int add(ProcurementAddDto procurementDto); IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto); int updatePro(ProcurementUpdateDto procurementDto); } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,123 @@ package com.ruoyi.procurementrecord.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.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.procurementrecord.dto.*; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecord; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/7/7 14:38 */ @Service @RequiredArgsConstructor @Slf4j public class ProcurementRecordServiceImpl extends ServiceImpl<ProcurementRecordMapper, ProcurementRecord> implements ProcurementRecordService { private final ProcurementRecordMapper procurementRecordMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; @Override public List<ProcurementDto> listProcurementBySalesLedgerId(ProcurementDto procurementDto) { List<ProcurementDto> procurementDtos = procurementRecordMapper.listProcurementBySalesLedgerId(procurementDto); // 计ç®å¾ å ¥åºæ°é // æ¥è¯¢éè´è®°å½å·²å ¥åºæ°é List<Integer> collect = procurementDtos.stream().map(ProcurementDto::getId).collect(Collectors.toList()); if(CollectionUtils.isEmpty( collect)){ return procurementDtos; } LambdaQueryWrapper<ProcurementRecord> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordLambdaQueryWrapper.in(ProcurementRecord::getSalesLedgerProductId, collect); List<ProcurementRecord> procurementRecords = procurementRecordMapper.selectList(procurementRecordLambdaQueryWrapper); if(CollectionUtils.isEmpty( procurementRecords)){ return procurementDtos; } for (ProcurementDto dto : procurementDtos) { // æ ¹æ®éè´å°è´¦IDçé对åºçå ¥åºè®°å½ List<ProcurementRecord> collect1 = procurementRecords.stream() .filter(procurementRecord -> procurementRecord.getSalesLedgerProductId().equals(dto.getId())) .collect(Collectors.toList()); // å¦ææ²¡æç¸å ³çå ¥åºè®°å½ï¼è·³è¿è¯¥æ¡æ°æ® if(CollectionUtils.isEmpty(collect1)){ continue; } // 计ç®å·²å ¥åºæ°éæ»åï¼å¹¶è®¾ç½®å¾ å ¥åºæ°é BigDecimal totalInboundNum = collect1.stream() .map(ProcurementRecord::getInboundNum) .reduce(BigDecimal.ZERO, BigDecimal::add); // å¾ å ¥åºæ°é = æ»æ°é - å·²å ¥åºæ°é dto.setQuantity0(dto.getQuantity().subtract(totalInboundNum)); } return procurementDtos; } @Override public int updatePro(ProcurementUpdateDto procurementDto) { ProcurementRecord procurementRecord = procurementRecordMapper.selectById(procurementDto.getId()); if(procurementRecord == null) { throw new RuntimeException("æªæ¾å°è¯¥éè´å ¥åºè®°å½"); } procurementRecord.setInboundNum(procurementDto.getQuantityStock()); return procurementRecordMapper.updateById(procurementRecord); } @Override public int add(ProcurementAddDto procurementDto) { LoginUser loginUser = SecurityUtils.getLoginUser(); // æ¹éæ°å¢ for (Details detail : procurementDto.getDetails()) { // æ¥è¯¢éè´å ¥åºæ°é LambdaQueryWrapper<ProcurementRecord> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordLambdaQueryWrapper.eq(ProcurementRecord::getSalesLedgerProductId, detail.getId()) .eq(ProcurementRecord::getProcurementCategory, 1); Long aLong = procurementRecordMapper.selectCount(procurementRecordLambdaQueryWrapper); ProcurementRecord.ProcurementRecordBuilder procurementRecordBuilder = ProcurementRecord.builder() .salesLedgerProductId(detail.getId()) .procurementCategory(1) .inboundBatches(aLong.equals(0L) ? "第1æ¹æ¬¡" : "第"+ (aLong + 1) + "æ¹æ¬¡") .inboundNum(detail.getInboundQuantity()) .createDate(LocalDateTime.now()) .tenantId(loginUser.getTenantId()) .createBy(procurementDto.getNickName()); this.save(procurementRecordBuilder.build()); // å ¥åºæååæéè´æ°é LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, detail.getId()); SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper); if(salesLedgerProduct == null){ throw new RuntimeException("æªæ¾å°è¯¥åå"); } salesLedgerProduct.setQuantity(salesLedgerProduct.getQuantity().subtract(detail.getInboundQuantity())); salesLedgerProductMapper.updateById(salesLedgerProduct); } return 1; } @Override public IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto) { return procurementRecordMapper.listPage(page,procurementDto); } } src/main/resources/application-druid.yml
@@ -7,7 +7,7 @@ # ä¸»åºæ°æ®æº master: # url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://114.132.189.42:9004/product-inventory-management-copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://114.132.189.42:9004/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 # ä»åºæ°æ®æº src/main/resources/application.yml
@@ -75,7 +75,7 @@ # æ°æ®åºç´¢å¼ database: 0 # å¯ç password: root2022! password: # password: 123456 # è¿æ¥è¶ æ¶æ¶é´ src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ <?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.procurementrecord.mapper.ProcurementRecordMapper"> <select id="listProcurementBySalesLedgerId" resultType="com.ruoyi.procurementrecord.dto.ProcurementDto"> select t1.supplier_name, t2.product_category, t2.id, t3.id as recordId, t2.specification_model, t2.unit, t2.quantity, t2.tax_rate, t2.tax_inclusive_unit_price, t2.tax_inclusive_total_price, t2.tax_exclusive_total_price, t3.inbound_num as quantityStock from purchase_ledger t1 left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id left join procurement_record t3 on t2.id = t3.sales_ledger_product_id where t1.purchase_contract_number = #{req.purchaseContractNumber} <if test="req.id != null and req.id != ''"> and t3.id = #{req.id} </if> group by t2.id </select> <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto"> select t3.supplier_name, t3.purchase_contract_number, t2.product_category, t1.id, t2.specification_model, t2.unit, t2.quantity, t2.quantity as quantity0, t2.tax_rate, t2.tax_inclusive_unit_price, t2.tax_inclusive_total_price, t2.tax_exclusive_total_price, t1.inbound_batches, t1.inbound_num, t1.create_date, t1.create_by from procurement_record t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id left join purchase_ledger t3 on t3.id = t2.sales_ledger_id <where> 1 = 1 <if test="req.supplierName != null and req.supplierName != ''"> and t3.supplier_name like concat('%',#{req.supplierName},'%') </if> </where> </select> </mapper>