src/main/java/com/ruoyi/framework/security/LoginUser.java
@@ -161,6 +161,11 @@ return user.getUserName(); } public String getNickName() { return user.getNickName(); } /** * è´¦æ·æ¯å¦æªè¿æ,è¿ææ æ³éªè¯ */ src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -16,6 +16,7 @@ import com.ruoyi.quality.pojo.QualityInspect; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -43,18 +44,21 @@ @PostMapping("/add") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-æ°å¢å ¥åº", businessType = BusinessType.INSERT) @Transactional public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) { return AjaxResult.success(procurementRecordService.add(procurementDto)); } @PostMapping("/update") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-ä¿®æ¹å ¥åº", businessType = BusinessType.UPDATE) @Transactional public AjaxResult updatePro(@RequestBody ProcurementUpdateDto procurementDto) { return AjaxResult.success(procurementRecordService.updatePro(procurementDto)); } @PostMapping("/del") @Log(title = "éè´å ¥åº-å ¥åºç®¡ç-å é¤å ¥åº", businessType = BusinessType.DELETE) @Transactional public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) { return AjaxResult.success(procurementRecordService.deletePro(procurementDto)); } src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ 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.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; /** * @author :yys * @date : 2025/7/8 13:30 */ @RestController @Api(tags = "éè´åºåº") @RequestMapping("/stockmanagement") public class ProcurementRecordOutController extends BaseController { @Autowired private ProcurementRecordOutService procurementRecordOutService; @PostMapping("/stockout") @Log(title = "éè´å ¥åº-åºåºç®¡ç-åºåº", businessType = BusinessType.INSERT) public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) { return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd)); } @GetMapping("/listPage") @Log(title = "éè´å ¥åº-åºåºç®¡ç-åºåºæ¥è¯¢", businessType = BusinessType.OTHER) public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) { IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto); return AjaxResult.success(result); } @PostMapping("/del") @Log(title = "éè´å ¥åº-åºåºç®¡ç-å é¤åºåº", businessType = BusinessType.DELETE) public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) { return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto)); } /** * å¯¼åº * @param response */ @PostMapping("/export") public void export(HttpServletResponse response) { procurementRecordOutService.export(response); } } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -27,6 +27,8 @@ */ private String purchaseContractNumber; private String salesLedgerProductId; /** * åºå ¥åºæ°é */ @@ -34,6 +36,13 @@ private BigDecimal inboundNum; /** * å¾ åºåºæ°é */ @Excel(name = "å¾ åºåºæ°é") private BigDecimal inboundNum0; /** * åºå ¥åºæ¶é´ */ @Excel(name = "å ¥åºæ¶é´") src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.procurementrecord.dto; import lombok.Data; /** * @author :yys * @date : 2025/7/8 13:34 */ @Data public class ProcurementRecordOutAdd { private String quantity; private String time; private Integer id; private Integer userId; private Integer salesLedgerProductId; } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ 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/8 14:13 */ @Data public class ProcurementRecordOutPageDto { private Integer id; /** * åºå ¥åºæ°é */ @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/mapper/ProcurementRecordOutMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.procurementrecord.mapper; 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.ProcurementRecordOutPageDto; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author :yys * @date : 2025/7/8 13:26 */ public interface ProcurementRecordOutMapper extends BaseMapper<ProcurementRecordOut> { IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto); List<ProcurementRecordOutPageDto> list(); } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecord.java
@@ -34,21 +34,26 @@ private String inboundBatches; /** * åºå ¥åºæ°é * å ¥åºæ°é */ private BigDecimal inboundNum; /** * åºå ¥åºæ¶é´ * å ¥åºæ¶é´ */ private LocalDateTime createDate; /** * åºå ¥åºç¨æ· * å ¥åºç¨æ· */ private String createBy; /** * å ¥åºç¨æ·id */ private Long userId; /** * ç§æ·ID */ private Long tenantId; src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ 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/8 13:24 */ @TableName("procurement_record_out") @Data @Builder public class ProcurementRecordOut { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 产åä¿¡æ¯è¡¨id */ private Integer salesLedgerProductId; /** * å ¥åºid */ private Integer procurementRecordStorageId; /** * åºåºæ¹æ¬¡ */ private String inboundBatches; /** * åºåºåºæ°é */ private BigDecimal inboundNum; /** * åºåºåºæ¶é´ */ private LocalDateTime createDate; /** * åºåºåºç¨æ· */ private String createBy; /** * åºåºåºç¨æ·id */ private Integer userId; /** * ç§æ·ID */ private Long tenantId; } src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.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.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import javax.servlet.http.HttpServletResponse; /** * @author :yys * @date : 2025/7/8 13:28 */ public interface ProcurementRecordOutService extends IService<ProcurementRecordOut> { int stockout(ProcurementRecordOutAdd procurementRecordOutAdd); IPage<ProcurementRecordOutPageDto> listPage(Page page, ProcurementRecordOutPageDto procurementDto); int deletePro(ProcurementUpdateDto procurementDto); void export(HttpServletResponse response); } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,92 @@ 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.common.utils.poi.ExcelUtil; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecord; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/7/8 13:29 */ @Service @RequiredArgsConstructor @Slf4j public class ProcurementRecordOutServiceImpl extends ServiceImpl<ProcurementRecordOutMapper, ProcurementRecordOut> implements ProcurementRecordOutService { public final ProcurementRecordOutMapper procurementRecordOutMapper; public final SysUserMapper sysUserMapper; @Override public int stockout(ProcurementRecordOutAdd procurementRecordOutAdd) { SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(procurementRecordOutAdd.getUserId().toString())); if(sysUser == null){ throw new RuntimeException("åºåºäººä¸åå¨"); } // æ¥è¯¢éè´åºåºæ°é LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId()); Long aLong = procurementRecordOutMapper.selectCount(procurementRecordLambdaQueryWrapper); ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder() .procurementRecordStorageId(procurementRecordOutAdd.getId()) .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId()) .inboundBatches(aLong.equals(0L) ? "第1æ¹æ¬¡" : "第"+ (aLong + 1) + "æ¹æ¬¡") .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity())) .createDate(LocalDateTime.now()) .userId(procurementRecordOutAdd.getUserId()) .createBy(sysUser.getNickName()) .tenantId(sysUser.getTenantId()); this.save(procurementRecordOut.build()); return 0; } @Override public IPage<ProcurementRecordOutPageDto> listPage(Page page, ProcurementRecordOutPageDto procurementDto) { return procurementRecordOutMapper.listPage(page, procurementDto); } public List<ProcurementRecordOut> getProcurementRecordOutByIds(List<Integer> id) { return procurementRecordOutMapper.selectBatchIds(id); } @Override public int deletePro(ProcurementUpdateDto procurementDto) { List<ProcurementRecordOut> procurementRecordOutByIds = getProcurementRecordOutByIds(procurementDto.getIds()); if(CollectionUtils.isEmpty(procurementRecordOutByIds)){ throw new RuntimeException("æªæ¥è¯¢å°éä¸ç人"); } procurementRecordOutMapper.deleteBatchIds(procurementRecordOutByIds.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList())); return 0; } @Override public void export(HttpServletResponse response) { List<ProcurementRecordOutPageDto> list =procurementRecordOutMapper.list(); ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class); util.exportExcel(response, list, "åºåºå°è´¦"); } } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -9,7 +9,9 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.procurementrecord.dto.*; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecord; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -35,6 +37,8 @@ public class ProcurementRecordServiceImpl extends ServiceImpl<ProcurementRecordMapper, ProcurementRecord> implements ProcurementRecordService { private final ProcurementRecordMapper procurementRecordMapper; private final ProcurementRecordOutMapper procurementRecordOutMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; @@ -103,6 +107,13 @@ public int deletePro(ProcurementUpdateDto procurementDto) { List<ProcurementRecord> procurementRecordById = getProcurementRecordByIds(procurementDto.getIds()); procurementRecordMapper.deleteBatchIds(procurementRecordById.stream().map(ProcurementRecord::getId).collect(Collectors.toList())); // å 餿æå¯¹åºçåºåºè®°å½ LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds()); List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper); if(!CollectionUtils.isEmpty(procurementRecordOuts)){ procurementRecordOutMapper.deleteBatchIds(procurementRecordOuts.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList())); } return 0; } @@ -128,6 +139,7 @@ .inboundBatches(aLong.equals(0L) ? "第1æ¹æ¬¡" : "第"+ (aLong + 1) + "æ¹æ¬¡") .inboundNum(detail.getInboundQuantity()) .createDate(LocalDateTime.now()) .userId(loginUser.getUserId()) .tenantId(loginUser.getTenantId()) .createBy(procurementDto.getNickName()); this.save(procurementRecordBuilder.build()); @@ -146,7 +158,41 @@ @Override public IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto) { return procurementRecordMapper.listPage(page,procurementDto); IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPage(page, procurementDto); List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords(); // 计ç®å¾ å ¥åºæ°é // æ¥è¯¢éè´è®°å½å·²å ¥åºæ°é List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList()); if(CollectionUtils.isEmpty( collect)){ return procurementPageDtoIPage; } LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); if(CollectionUtils.isEmpty( procurementRecords)){ return procurementPageDtoIPage; } for (ProcurementPageDto dto : procurementPageDtos) { // æ ¹æ®éè´å°è´¦IDçé对åºçåºåºè®°å½ List<ProcurementRecordOut> collect1 = procurementRecords.stream() .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId())) .collect(Collectors.toList()); // å¦ææ²¡æç¸å ³çåºåºè®°å½ï¼è·³è¿è¯¥æ¡æ°æ® if(CollectionUtils.isEmpty(collect1)){ dto.setInboundNum0(dto.getInboundNum()); continue; } // 计ç®å·²åºåºæ°éæ»åï¼å¹¶è®¾ç½®å¾ åºåºæ°é BigDecimal totalInboundNum = collect1.stream() .map(ProcurementRecordOut::getInboundNum) .reduce(BigDecimal.ZERO, BigDecimal::add); // å¾ åºåºæ°é = æ»æ°é - å·²åºåºæ°é dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum)); } return procurementPageDtoIPage; } } src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -32,16 +32,16 @@ t3.purchase_contract_number, t2.product_category, t1.id, t1.sales_ledger_product_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.inbound_num as inboundNum0, t1.create_date, t1.create_by from procurement_record_storage t1 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ <?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.ProcurementRecordOutMapper"> <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto"> select t3.supplier_name, t2.product_category, t1.id, t2.specification_model, t2.unit, t2.tax_rate, t2.tax_inclusive_unit_price, t2.tax_inclusive_total_price, t2.tax_exclusive_total_price, t1.inbound_num, t1.create_date, t1.create_by from procurement_record_out 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> <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto"> select t3.supplier_name, t2.product_category, t1.id, t2.specification_model, t2.unit, t2.tax_rate, t2.tax_inclusive_unit_price, t2.tax_inclusive_total_price, t2.tax_exclusive_total_price, t1.inbound_num, t1.create_date, t1.create_by from procurement_record_out 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 </select> </mapper>