Browse Source

2025-11-19

新增【报价明细查询窗口】页面
master
fengyuan_yang 2 months ago
parent
commit
a187fe464b
  1. 20
      src/main/java/com/spring/modules/quote/controller/QuoteDetailController.java
  2. 5
      src/main/java/com/spring/modules/quote/mapper/QuoteDetailMapper.java
  3. 7
      src/main/java/com/spring/modules/quote/service/QuoteDetailService.java
  4. 30
      src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java
  5. 121
      src/main/java/com/spring/modules/quote/vo/QuoteDetailReportVo.java
  6. 156
      src/main/resources/mapper/quote/QuoteDetailMapper.xml

20
src/main/java/com/spring/modules/quote/controller/QuoteDetailController.java

@ -1,12 +1,15 @@
package com.spring.modules.quote.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.spring.common.utils.PageUtils;
import com.spring.common.utils.R;
import com.spring.modules.quote.entity.QuoteDetail;
import com.spring.modules.quote.service.QuoteDetailService;
import com.spring.modules.quote.vo.QuoteDetailReportVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@ -73,4 +76,21 @@ public class QuoteDetailController {
quoteDetailService.updateShowFlag(quoteDetail.getId(), quoteDetail.getShowFlag());
return R.ok("操作成功");
}
/**
* 报价明细查询报表
*/
@PostMapping("/report")
public R queryQuoteDetailReport(@RequestBody QuoteDetailReportVo vo){
PageUtils page = quoteDetailService.queryQuoteDetailReport(vo);
return R.ok().put("page", page);
}
/**
* 导出报价明细查询报表
*/
@PostMapping("/report/export")
public void exportQuoteDetailReport(@RequestBody QuoteDetailReportVo vo, HttpServletResponse response){
quoteDetailService.exportQuoteDetailReport(vo, response);
}
}

5
src/main/java/com/spring/modules/quote/mapper/QuoteDetailMapper.java

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.spring.modules.part.entity.PartInformationEntity;
import com.spring.modules.quote.entity.QuoteDetail;
import com.spring.modules.quote.vo.QuoteDetailReportVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -21,4 +22,8 @@ public interface QuoteDetailMapper extends BaseMapper<QuoteDetail> {
List<QuoteDetail> queryQuoteDetailByInquiry(QuoteDetail quoteDetail);
int updateShowFlag(@Param("id") Long id, @Param("showFlag") String showFlag);
IPage<QuoteDetailReportVo> queryQuoteDetailReport(Page<QuoteDetailReportVo> page, @Param("query") QuoteDetailReportVo vo);
List<QuoteDetailReportVo> queryQuoteDetailReportList(@Param("query") QuoteDetailReportVo vo);
}

7
src/main/java/com/spring/modules/quote/service/QuoteDetailService.java

@ -2,10 +2,13 @@ package com.spring.modules.quote.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.spring.common.utils.PageUtils;
import com.spring.modules.quote.entity.Quote;
import com.spring.modules.quote.entity.QuoteDetail;
import com.spring.modules.quote.entity.QuoteGroupDetail;
import com.spring.modules.quote.vo.QuoteDetailReportVo;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@ -34,4 +37,8 @@ public interface QuoteDetailService extends IService<QuoteDetail> {
List<QuoteDetail> queryQuoteDetailByInquiry(QuoteDetail quoteDetail);
void updateShowFlag(Long id, String showFlag);
PageUtils queryQuoteDetailReport(QuoteDetailReportVo vo);
void exportQuoteDetailReport(QuoteDetailReportVo vo, HttpServletResponse response);
}

30
src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java

@ -1,10 +1,12 @@
package com.spring.modules.quote.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.spring.common.exception.XJException;
import com.spring.common.utils.PageUtils;
import com.spring.modules.oss.entity.SysOssEntity;
import com.spring.modules.oss.service.SysOssService;
import com.spring.modules.part.entity.PartInformationEntity;
@ -12,12 +14,14 @@ import com.spring.modules.quote.entity.*;
import com.spring.modules.quote.mapper.QuoteDetailMapper;
import com.spring.modules.quote.mapper.QuoteGroupDetailMapper;
import com.spring.modules.quote.service.*;
import com.spring.modules.quote.vo.QuoteDetailReportVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@ -737,4 +741,30 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
public void updateShowFlag(Long id, String showFlag) {
baseMapper.updateShowFlag(id, showFlag);
}
@Override
public PageUtils queryQuoteDetailReport(QuoteDetailReportVo vo) {
IPage<QuoteDetailReportVo> page = baseMapper.queryQuoteDetailReport(
new Page<>(vo.getPage(), vo.getLimit()), vo
);
return new PageUtils(page);
}
@Override
public void exportQuoteDetailReport(QuoteDetailReportVo vo, HttpServletResponse response) {
List<QuoteDetailReportVo> list = baseMapper.queryQuoteDetailReportList(vo);
try {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = java.net.URLEncoder.encode("报价明细查询", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), QuoteDetailReportVo.class)
.sheet("报价明细")
.doWrite(list);
} catch (Exception e) {
throw new RuntimeException("导出失败", e);
}
}
}

121
src/main/java/com/spring/modules/quote/vo/QuoteDetailReportVo.java

@ -0,0 +1,121 @@
package com.spring.modules.quote.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class QuoteDetailReportVo {
@ExcelProperty("Site")
private String site;
@ExcelProperty("BU")
private String buNo;
@ExcelProperty("报价单号")
private String quoteVersionNo;
@ExcelProperty("客户编码")
private String customerNo;
@ExcelProperty("客户名称")
private String customerDesc;
@ExcelProperty("项目号")
private String projectNo;
@ExcelProperty("项目名称")
private String projectDesc;
@ExcelProperty("状态")
private String status;
@ExcelProperty("PLM物料编码")
private String plmPartNo;
@ExcelProperty("IFS物料编码")
private String ifsPartNo;
@ExcelProperty("物料名称")
private String partDesc;
@ExcelProperty("MOQ")
private BigDecimal qty;
@ExcelProperty("材料成本")
private BigDecimal adjustPartCost;
@ExcelProperty("人工成本")
private BigDecimal adjustLabourCost;
@ExcelProperty("机器成本")
private BigDecimal adjustMachineCost;
@ExcelProperty("工具成本")
private BigDecimal adjustToolCost;
@ExcelProperty("测试成本")
private BigDecimal adjustTestCost;
@ExcelProperty("包装成本")
private BigDecimal packCost;
@ExcelProperty("运输成本")
private BigDecimal shippingCost;
@ExcelProperty("其他成本")
private BigDecimal adjustElseCost;
@ExcelProperty("总成本")
private BigDecimal totalCost;
@ExcelProperty("最终交易价")
private BigDecimal finalTransactionPrice;
@ExcelProperty("VA%")
private BigDecimal quoteProfitRate;
@ExcelProperty("Contribution%")
private BigDecimal quoteProfitAmount;
@ExcelProperty("Margin%")
private BigDecimal quoteTaxRate;
@ExcelProperty("Price ¥(ex VAT)")
private BigDecimal quoteTaxTotalPrice;
@ExcelProperty("未税单价")
private BigDecimal unitPrice;
@ExcelProperty("税率")
private BigDecimal taxRate;
@ExcelProperty("含税单价(CNY)")
private BigDecimal taxUnitPrice;
// 查询条件参数不显示在Excel中
@ExcelIgnore
private String quoter;
@ExcelIgnore
private String insideInquiryNo;
@ExcelIgnore
private String startDate;
@ExcelIgnore
private String endDate;
@ExcelIgnore
private String partNo;
// 分页参数
@ExcelIgnore
private Integer page;
@ExcelIgnore
private Integer limit;
}

156
src/main/resources/mapper/quote/QuoteDetailMapper.xml

@ -337,4 +337,160 @@
SET show_flag = #{showFlag}
WHERE id = #{id}
</update>
<!-- 报价明细查询报表 -->
<select id="queryQuoteDetailReport" resultType="com.spring.modules.quote.vo.QuoteDetailReportVo">
SELECT
q.site,
q.bu_no as buNo,
q.quote_version_no as quoteVersionNo,
q.customer_no as customerNo,
c.customer_desc as customerDesc,
q.project_no as projectNo,
p.project_name as projectDesc,
q.status,
pp.plm_part_no as plmPartNo,
pp.ifs_part_no as ifsPartNo,
pp.part_desc as partDesc,
qd.qty,
qd.adjust_part_cost as adjustPartCost,
qd.adjust_labour_cost as adjustLabourCost,
qd.adjust_machine_cost as adjustMachineCost,
qd.adjust_tool_cost as adjustToolCost,
qd.adjust_test_cost as adjustTestCost,
qd.pack_cost as packCost,
qd.shipping_cost as shippingCost,
qd.adjust_else_cost as adjustElseCost,
qd.total_cost as totalCost,
qd.final_transaction_price as finalTransactionPrice,
qd.quote_profit_rate as quoteProfitRate,
qd.quote_profit_amount as quoteProfitAmount,
qd.quote_tax_rate as quoteTaxRate,
qd.quote_tax_total_price as quoteTaxTotalPrice,
qd.unit_price as unitPrice,
qd.tax_rate as taxRate,
qd.tax_unit_price as taxUnitPrice
FROM plm_quote q
INNER JOIN plm_quote_detail qd ON q.id = qd.quote_id
LEFT JOIN plm_customer_information c ON q.customer_no = c.customer_no
LEFT JOIN plm_project_info p ON q.project_no = p.project_id AND q.site = p.site
LEFT JOIN part pp ON pp.part_no = qd.part_no AND pp.site = qd.site
<where>
<if test="query.site != null and query.site != ''">
AND q.site = #{query.site}
</if>
<if test="query.quoteVersionNo != null and query.quoteVersionNo != ''">
AND q.quote_version_no LIKE #{query.quoteVersionNo}
</if>
<if test="query.customerNo != null and query.customerNo != ''">
AND q.customer_no LIKE #{query.customerNo}
</if>
<if test="query.customerDesc != null and query.customerDesc != ''">
AND c.customer_desc LIKE #{query.customerDesc}
</if>
<if test="query.projectNo != null and query.projectNo != ''">
AND q.project_no LIKE #{query.projectNo}
</if>
<if test="query.projectDesc != null and query.projectDesc != ''">
AND p.project_name LIKE #{query.projectDesc}
</if>
<if test="query.quoter != null and query.quoter != ''">
AND dbo.plm_get_user_display(q.site, q.quoter) LIKE #{query.quoter}
</if>
<if test="query.status != null and query.status != ''">
AND q.status = #{query.status}
</if>
<if test="query.startDate != null and query.startDate != ''">
AND q.quote_date &gt;= #{query.startDate}
</if>
<if test="query.endDate != null and query.endDate != ''">
AND q.quote_date &lt;= #{query.endDate}
</if>
<if test="query.insideInquiryNo != null and query.insideInquiryNo != ''">
AND q.inside_inquiry_no LIKE #{query.insideInquiryNo}
</if>
<if test="query.partNo != null and query.partNo != ''">
AND (pp.part_no LIKE #{query.partNo} OR pp.plm_part_no LIKE #{query.partNo} OR pp.ifs_part_no LIKE #{query.partNo})
</if>
</where>
ORDER BY q.quote_version_no DESC, qd.item_no ASC
</select>
<!-- 报价明细查询报表导出 -->
<select id="queryQuoteDetailReportList" resultType="com.spring.modules.quote.vo.QuoteDetailReportVo">
SELECT
q.site,
q.bu_no as buNo,
q.quote_version_no as quoteVersionNo,
q.customer_no as customerNo,
c.customer_desc as customerDesc,
q.project_no as projectNo,
p.project_name as projectDesc,
q.status,
pp.plm_part_no as plmPartNo,
pp.ifs_part_no as ifsPartNo,
pp.part_desc as partDesc,
qd.qty,
qd.adjust_part_cost as adjustPartCost,
qd.adjust_labour_cost as adjustLabourCost,
qd.adjust_machine_cost as adjustMachineCost,
qd.adjust_tool_cost as adjustToolCost,
qd.adjust_test_cost as adjustTestCost,
qd.pack_cost as packCost,
qd.shipping_cost as shippingCost,
qd.adjust_else_cost as adjustElseCost,
qd.total_cost as totalCost,
qd.final_transaction_price as finalTransactionPrice,
qd.quote_profit_rate as quoteProfitRate,
qd.quote_profit_amount as quoteProfitAmount,
qd.quote_tax_rate as quoteTaxRate,
qd.quote_tax_total_price as quoteTaxTotalPrice,
qd.unit_price as unitPrice,
qd.tax_rate as taxRate,
qd.tax_unit_price as taxUnitPrice
FROM plm_quote q
INNER JOIN plm_quote_detail qd ON q.id = qd.quote_id
LEFT JOIN plm_customer_information c ON q.customer_no = c.customer_no
LEFT JOIN plm_project_info p ON q.project_no = p.project_id AND q.site = p.site
LEFT JOIN part pp ON pp.part_no = qd.part_no AND pp.site = qd.site
<where>
<if test="query.site != null and query.site != ''">
AND q.site = #{query.site}
</if>
<if test="query.quoteVersionNo != null and query.quoteVersionNo != ''">
AND q.quote_version_no LIKE #{query.quoteVersionNo}
</if>
<if test="query.customerNo != null and query.customerNo != ''">
AND q.customer_no LIKE #{query.customerNo}
</if>
<if test="query.customerDesc != null and query.customerDesc != ''">
AND c.customer_desc LIKE #{query.customerDesc}
</if>
<if test="query.projectNo != null and query.projectNo != ''">
AND q.project_no LIKE #{query.projectNo}
</if>
<if test="query.projectDesc != null and query.projectDesc != ''">
AND p.project_name LIKE #{query.projectDesc}
</if>
<if test="query.quoter != null and query.quoter != ''">
AND dbo.plm_get_user_display(q.site, q.quoter) LIKE #{query.quoter}
</if>
<if test="query.status != null and query.status != ''">
AND q.status = #{query.status}
</if>
<if test="query.startDate != null and query.startDate != ''">
AND q.quote_date &gt;= #{query.startDate}
</if>
<if test="query.endDate != null and query.endDate != ''">
AND q.quote_date &lt;= #{query.endDate}
</if>
<if test="query.insideInquiryNo != null and query.insideInquiryNo != ''">
AND q.inside_inquiry_no LIKE #{query.insideInquiryNo}
</if>
<if test="query.partNo != null and query.partNo != ''">
AND (pp.part_no LIKE #{query.partNo} OR pp.plm_part_no LIKE #{query.partNo} OR pp.ifs_part_no LIKE #{query.partNo})
</if>
</where>
ORDER BY q.quote_version_no DESC, qd.item_no ASC
</select>
</mapper>
Loading…
Cancel
Save