liyong
8 天以前 ca29295ad071862ffef46bbcced489a4b960233f
销售退货模块接口开发
已添加8个文件
已修改13个文件
574 ■■■■■ 文件已修改
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ReturnManagementDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ReturnSaleProductDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnSaleProductMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnSaleProduct.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ReturnSaleProductService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnSaleProductServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDto.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ShippingInfoService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ShippingInfoMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
@@ -1,14 +1,20 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.ReturnManagementDto;
import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.ruoyi.procurementrecord.service.ReturnManagementService;
import com.ruoyi.procurementrecord.service.ReturnSaleProductService;
import com.ruoyi.procurementrecord.service.impl.ReturnSaleProductServiceImpl;
import com.ruoyi.sales.dto.SalesLedgerDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,48 +28,69 @@
 * @date : 2025/9/17 10:34
 */
@RestController
@Api(tags = "到货管理")
@Api(tags = "销售退货")
@RequestMapping("/returnManagement")
public class ReturnManagementController extends BaseController {
    @Autowired
    private ReturnManagementService returnManagementService;
    @Autowired
    private ReturnManagementMapper returnManagementMapper;
    private ReturnSaleProductService returnSaleProductService;
    @GetMapping("/listPage")
    @ApiOperation("到货管理-查询")
    public AjaxResult listPage(Page page, ReturnManagement returnManagement) {
        IPage<ReturnManagement> result = returnManagementService.listPage(page, returnManagement);
    @ApiOperation("销售退货-查询")
    public AjaxResult listPage(Page page, ReturnManagementDto returnManagement) {
        IPage<ReturnManagementDto> result = returnManagementService.listPage(page, returnManagement);
        return AjaxResult.success(result);
    }
    @PostMapping("/add")
    @ApiOperation("到货管理-添加")
    @ApiOperation("销售退货-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody ReturnManagement returnManagement) {
        String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT");
        returnManagement.setReturnNo(rt);
        boolean result = returnManagementService.save(returnManagement);
        return result ? success() : error();
    public AjaxResult add(@RequestBody ReturnManagementDto returnManagementDto) {
        return returnManagementService.addReturnManagementDto(returnManagementDto) ? success() : error();
    }
    @PostMapping("/update")
    @ApiOperation("到货管理-修改")
    @ApiOperation("销售退货-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody ReturnManagement returnManagement) {
        boolean result = returnManagementService.updateById(returnManagement);
        return result ? success() : error();
    public AjaxResult update(@RequestBody ReturnManagementDto returnManagementDto) {
        return returnManagementService.updateReturnManagementDto(returnManagementDto) ? success() : error();
    }
    @ApiOperation("销售退货-处理退货单")
    @GetMapping("/handle")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult handle(Long returnManagementId) {
        return returnManagementService.handle(returnManagementId) ? success() : error();
    }
    @DeleteMapping("/del")
    @ApiOperation("到货管理-删除")
    @ApiOperation("销售退货-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult del(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return error("请选择至少一条数据");
        returnSaleProductService.remove(new QueryWrapper<ReturnSaleProduct>()
                .lambda()
                .in(ReturnSaleProduct::getReturnManagementId, ids));
        boolean result = returnManagementService.removeByIds(ids);
        return result ? success() : error();
    }
    @GetMapping("/getById")
    @ApiOperation("销售退货-根据id查询")
    public AjaxResult getById(Long returnManagementId) {
        ReturnManagementDto returnManagementDto = returnManagementService.getReturnManagementDtoById(returnManagementId);
        return success(returnManagementDto);
    }
    @GetMapping("/getByShippingId")
    @ApiOperation("销售退货-根据出库单查询销售订单以及产品信息")
    public AjaxResult getByShippingId(Long shippingId) {
        SalesLedgerDto salesLedgerDto = returnManagementService.getReturnManagementDtoByShippingIdId(shippingId);
        return success(salesLedgerDto);
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.procurementrecord.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * é€€è´§äº§å“è¡¨ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 03:57:42
 */
@RestController
@RequestMapping("/returnSaleProduct")
public class ReturnSaleProductController {
}
src/main/java/com/ruoyi/procurementrecord/dto/ReturnManagementDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.procurementrecord.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/17 10:28
 */
@Data
public class ReturnManagementDto extends ReturnManagement {
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "销售单号")
    private String salesContractNo;
    @ApiModelProperty(value = "业务员")
    private String salesman;
    @ApiModelProperty("关联出库单号")
    private String shippingNo;
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    @ApiModelProperty(value = "销售产品对象数组")
    private List<ReturnSaleProductDto> returnSaleProducts;
}
src/main/java/com/ruoyi/procurementrecord/dto/ReturnSaleProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.procurementrecord.dto;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ReturnSaleProductDto extends ReturnSaleProduct {
    private String productName;
    private String model;
    private String unit;
    //未退货数量
    private BigDecimal unReturn;
}
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
@@ -3,6 +3,7 @@
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.ReturnManagementDto;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import org.apache.ibatis.annotations.Param;
@@ -18,5 +19,7 @@
     * @param page
     * @return
     */
    IPage<ReturnManagement> listPage(Page page,@Param("req") ReturnManagement returnManagement);
    IPage<ReturnManagementDto> listPage(Page page, @Param("req") ReturnManagementDto returnManagement);
    ReturnManagementDto getReturnManagementDtoById(Long id);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnSaleProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.procurementrecord.mapper;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * é€€è´§äº§å“è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 03:57:42
 */
@Mapper
public interface ReturnSaleProductMapper extends BaseMapper<ReturnSaleProduct> {
    List<ReturnSaleProductDto> listReturnSaleProductDto(@Param("returnManagementId") Long returnManagementId);
}
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
@@ -29,44 +29,39 @@
    @ApiModelProperty(value = "退货单号")
    private String returnNo;
    @ApiModelProperty(value = "关联单号")
    private String relatedNo;
    @ApiModelProperty("客户id")
    private Long customerId;
    @ApiModelProperty(value = "退货类型")
    private String returnType;
    @ApiModelProperty("关联出库单号Id")
    private Long shippingId;
    @ApiModelProperty(value = "供应商名称")
    private String supplierName;
    @ApiModelProperty("项目id")
    private Long projectId;
    @ApiModelProperty(value = "退货原因")
    private String returnReason;
    @ApiModelProperty("项目阶段")
    private String projectStage;
    @ApiModelProperty(value = "退货状态")
    private String status;
    @ApiModelProperty("制单人")
    private String maker;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("制单时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime makeTime;
    @ApiModelProperty("结算人")
    private String settler;
    @ApiModelProperty("状态")
    private Integer status;
    @ApiModelProperty("创建时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty("更新时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnSaleProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * é€€è´§äº§å“è¡¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 03:57:42
 */
@Getter
@Setter
@TableName("return_sale_product")
@ApiModel(value = "ReturnSaleProduct对象", description = "退货产品表")
public class ReturnSaleProduct implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("退货单id")
    private Long returnManagementId;
    @ApiModelProperty("退货产品id")
    private Long returnSaleLedgerProductId;
    @ApiModelProperty("退货产品数量")
    private BigDecimal num;
    @ApiModelProperty("退货状态 0 æœªé€€å›ž 1已退货")
    private Integer status;
}
src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java
@@ -3,7 +3,9 @@
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.ReturnManagementDto;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.sales.dto.SalesLedgerDto;
/**
 * @author :yys
@@ -18,5 +20,15 @@
     * @param returnManagement
     * @return
     */
    IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement);
    IPage<ReturnManagementDto> listPage(Page page, ReturnManagementDto returnManagement);
    boolean addReturnManagementDto(ReturnManagementDto returnManagementDto);
    boolean updateReturnManagementDto(ReturnManagementDto returnManagementDto);
    SalesLedgerDto getReturnManagementDtoByShippingIdId(Long shippingId);
    boolean handle(Long returnManagementId);
    ReturnManagementDto getReturnManagementDtoById(Long returnManagementId);
}
src/main/java/com/ruoyi/procurementrecord/service/ReturnSaleProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.procurementrecord.service;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * é€€è´§äº§å“è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 03:57:42
 */
public interface ReturnSaleProductService extends IService<ReturnSaleProduct> {
    List<ReturnSaleProductDto> listReturnSaleProductDto(Long returnManagementId);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -1,14 +1,38 @@
package com.ruoyi.procurementrecord.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.OrderUtils;
import com.ruoyi.procurementrecord.dto.ReturnManagementDto;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.ruoyi.procurementrecord.service.ReturnManagementService;
import com.ruoyi.procurementrecord.service.ReturnSaleProductService;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ShippingInfoService;
import com.ruoyi.sales.service.impl.ShippingInfoServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author :yys
@@ -21,9 +45,74 @@
    @Autowired
    private ReturnManagementMapper returnManagementMapper;
    @Autowired
    private ReturnSaleProductService returnSaleProductService;
    @Autowired
    private ShippingInfoService shippingInfoService;
    @Autowired
    private SalesLedgerMapper salesLedgerMapper;
    @Override
    public IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement) {
        IPage<ReturnManagement> returnManagementIPage =  returnManagementMapper.listPage(page, returnManagement);
    public IPage<ReturnManagementDto> listPage(Page page, ReturnManagementDto returnManagement) {
        IPage<ReturnManagementDto> returnManagementIPage = returnManagementMapper.listPage(page, returnManagement);
        for (ReturnManagementDto returnManagementDto : returnManagementIPage.getRecords()) {
            List<ReturnSaleProductDto> returnSaleProducts = returnSaleProductService.listReturnSaleProductDto(returnManagementDto.getId());
            returnManagementDto.setReturnSaleProducts(returnSaleProducts);
        }
        return returnManagementIPage;
    }
    @Override
    public boolean addReturnManagementDto(ReturnManagementDto returnManagementDto) {
        String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT");
        returnManagementDto.setReturnNo(rt);
        save(returnManagementDto);
        for (ReturnSaleProduct returnSaleProduct : returnManagementDto.getReturnSaleProducts()) {
            returnSaleProduct.setReturnManagementId(returnManagementDto.getId());
            returnSaleProduct.setStatus(0);
            returnSaleProductService.save(returnSaleProduct);
        }
        return true;
    }
    @Override
    public boolean updateReturnManagementDto(ReturnManagementDto returnManagementDto) {
        List<ReturnSaleProduct> returnSaleProducts = new ArrayList<>();
        if (!CollectionUtils.isEmpty(returnManagementDto.getReturnSaleProducts())) {
            returnManagementDto.getReturnSaleProducts().stream().forEach(returnSaleProductDto -> {
                ReturnSaleProduct returnSaleProduct = new ReturnSaleProduct();
                BeanUtils.copyProperties(returnSaleProductDto, returnSaleProduct);
                returnSaleProducts.add(returnSaleProduct);
            });
        }
        returnSaleProductService.updateBatchById(returnSaleProducts);
        return updateById(returnManagementDto);
    }
    @Override
    public SalesLedgerDto getReturnManagementDtoByShippingIdId(Long shippingId) {
        ShippingInfo byId = shippingInfoService.getById(shippingId);
        SalesLedger salesLedger = salesLedgerMapper.selectById(byId.getSalesLedgerId());
        SalesLedgerDto salesLedgerDto = new SalesLedgerDto();
        BeanUtils.copyProperties(salesLedger, salesLedgerDto);
        List<SalesLedgerProductDto> salesLedgerProductDtos = shippingInfoService.getReturnManagementDtoById(shippingId);
        salesLedgerDto.setProductDtoData(salesLedgerProductDtos);
         return salesLedgerDto;
    }
    @Override
    public boolean handle(Long returnManagementId) {
        ReturnManagement byId = this.getById(returnManagementId);
        byId.setStatus(1);
        return false;
    }
    @Override
    public ReturnManagementDto getReturnManagementDtoById(Long returnManagementId) {
        ReturnManagementDto returnManagementDtoById = returnManagementMapper.getReturnManagementDtoById(returnManagementId);
        returnManagementDtoById.setReturnSaleProducts(returnSaleProductService.listReturnSaleProductDto(returnManagementId));
        return returnManagementDtoById;
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnSaleProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.procurementrecord.service.impl;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper;
import com.ruoyi.procurementrecord.service.ReturnSaleProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
 * <p>
 * é€€è´§äº§å“è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 03:57:42
 */
@Service
public class ReturnSaleProductServiceImpl extends ServiceImpl<ReturnSaleProductMapper, ReturnSaleProduct> implements ReturnSaleProductService {
    @Autowired
    private ReturnSaleProductMapper returnSaleProductMapper;
    @Override
    public List<ReturnSaleProductDto> listReturnSaleProductDto(Long returnManagementId) {
        return returnSaleProductMapper.listReturnSaleProductDto(returnManagementId);
    }
}
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -135,4 +135,10 @@
        util.exportExcel(response, list, "发货信息");
    }
    @GetMapping("/getByCustomerName")
    @ApiOperation("通过客户名称查询")
    public AjaxResult getByCustomerName(String customerName) {
        return AjaxResult.success(shippingInfoService.getShippingInfoByCustomerName(customerName));
    }
}
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -43,6 +43,7 @@
    private Boolean hasChildren = false;
    private List<SalesLedgerProduct> productData;
    private List<SalesLedgerProductDto> productDtoData;
    private List<String> tempFileIds;
    private List<CommonFile> SalesLedgerFiles;
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDto.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -57,4 +58,11 @@
    private Integer approvalStatus;
    @ApiModelProperty(value = "未退货数")
    private BigDecimal unQuantity;
    @ApiModelProperty(value = "退货总数")
    private BigDecimal totalReturnNum;
}
src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
@@ -3,7 +3,10 @@
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.ReturnSaleProductDto;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
import com.ruoyi.sales.dto.ShippingInfoDto;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
import org.apache.ibatis.annotations.Param;
@@ -17,4 +20,9 @@
    IPage<ShippingInfoDto> listPage(Page page, @Param("req") ShippingInfo req);
    List<ShippingInfo> listAll();
    List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId);
    List<ShippingInfo> getShippingInfoByCustomerName(String customerName);
}
src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -3,6 +3,8 @@
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.ReturnSaleProductDto;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
import com.ruoyi.sales.dto.ShippingInfoDto;
import com.ruoyi.sales.pojo.ShippingInfo;
@@ -19,4 +21,8 @@
    boolean deductStock(ShippingInfoDto req) throws IOException;
    boolean delete(List<Long> ids);
    List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId);
    List<ShippingInfo> getShippingInfoByCustomerName(String customerName);
}
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -9,7 +9,9 @@
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
import com.ruoyi.sales.dto.ShippingInfoDto;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
@@ -107,4 +109,15 @@
        return this.removeBatchByIds(ids);
    }
    @Override
    public List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId) {
        return shippingInfoMapper.getReturnManagementDtoById(shippingId);
    }
    @Override
    public List<ShippingInfo> getShippingInfoByCustomerName(String customerName) {
        return shippingInfoMapper.getShippingInfoByCustomerName(customerName);
    }
}
src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -2,15 +2,55 @@
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.procurementrecord.mapper.ReturnManagementMapper">
    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ReturnManagement">
        select * from return_management
    <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ReturnManagementDto">
        select rm.*,
               c.customer_name,
               si.shipping_no,
               sl.project_name,
               sl.sales_contract_no,
               sl.salesman
        from return_management rm
                 left join shipping_info si on rm.shipping_id = si.id
                 left join customer c on rm.customer_id = c.id
                 left join sales_ledger sl on si.sales_ledger_id = sl.id
        <where>
            <if test="req.returnNo != null and req.returnNo != ''">
                and return_no like concat('%',#{req.returnNo},'%')
                and rm.return_no like concat('%',#{req.returnNo},'%')
            </if>
            <if test="req.returnType != null and req.returnType != ''">
                and return_type = #{req.returnType}
            <if test="req.customerName != null and req.customerName != ''">
                and c.customer_name like concat('%',#{req.customerName},'%')
            </if>
            <if test="req.projectName != null and req.projectName != ''">
                and sl.project_name like concat('%',#{req.projectName},'%')
            </if>
            <if test="req.salesman != null and req.salesman != ''">
                and sl.salesman like concat('%',#{req.salesman},'%')
            </if>
            <if test="req.shippingNo != null and req.shippingNo != ''">
                and rm.shipping_no like concat('%',#{req.shippingNo},'%')
            </if>
            <if test="req.projectStage != null and req.projectStage != ''">
                and rm.project_stage like concat('%',#{req.projectStage},'%')
            </if>
            <if test="req.maker != null and req.maker != ''">
                and rm.maker like concat('%',#{req.maker},'%')
            </if>
            <if test="req.salesContractNo != null and req.salesContractNo != ''">
                and sl.sales_contract_no like concat('%',#{req.salesContractNo},'%')
            </if>
        </where>
    </select>
    <select id="getReturnManagementDtoById" resultType="com.ruoyi.procurementrecord.dto.ReturnManagementDto">
     select rm.*,
               c.customer_name,
               si.shipping_no,
               sl.project_name,
               sl.sales_contract_no,
               sl.salesman
        from return_management rm
                 left join shipping_info si on rm.shipping_id = si.id
                 left join customer c on rm.customer_id = c.id
                 left join sales_ledger sl on si.sales_ledger_id = sl.id
        where rm.id = #{id}
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
<?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.ReturnSaleProductMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.procurementrecord.pojo.ReturnSaleProduct">
        <id column="id" property="id" />
        <result column="return_management_id" property="returnManagementId" />
        <result column="return_sale_ledger_product_id" property="returnSaleLedgerProductId" />
        <result column="num" property="num" />
        <result column="status" property="status" />
    </resultMap>
    <select id="listReturnSaleProductDto" resultType="com.ruoyi.procurementrecord.dto.ReturnSaleProductDto">
        select rsp.*,
               slp.product_category as product_name,
               slp.specification_model as model
        from return_sale_product rsp
                 left join sales_ledger_product slp on rsp.return_sale_ledger_product_id = slp.id
        where rsp.return_management_id = #{returnManagementId}
    </select>
</mapper>
src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -58,4 +58,29 @@
        FROM shipping_info s
                 LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
    </select>
    <select id="getReturnManagementDtoById" resultType="com.ruoyi.sales.dto.SalesLedgerProductDto">
        SELECT
        slp.*,
        slp.quantity - COALESCE(rs.total_return_num, 0) AS un_quantity,
        COALESCE(rs.total_return_num, 0) AS total_return_num
        FROM shipping_info si
        LEFT JOIN sales_ledger_product slp ON si.sales_ledger_product_id = slp.id
        LEFT JOIN (
        SELECT
        return_sale_ledger_product_id,
        SUM(num) AS total_return_num
        FROM return_sale_product
        <where>
            <if test="productId != null">
                AND return_sale_ledger_product_id = #{productId}
            </if>
        </where>
        GROUP BY return_sale_ledger_product_id
        ) rs ON rs.return_sale_ledger_product_id = slp.id
    </select>
    <select id="getShippingInfoByCustomerName" resultType="com.ruoyi.sales.pojo.ShippingInfo">
        select * from shipping_info si
        left join sales_ledger sl on si.sales_ledger_id = sl.id
        where sl.customer_name = #{customerName}
    </select>
</mapper>