Files
erp-next/ruoyi-system/src/main/resources/mapper/bid/BizClientQuoteMapper.xml
王文昊 c97fdf4c6f feat: 页面功能完善
3.1 供货商管理页面

  - 移除了右侧面板的"供货清单"Tab
  - 报价历史板块新增搜索功能(物料名称/报价单号/状态/日期范围)
  - 后端 Mapper 改造支持动态 SQL 过滤

  3.2 报价请求与供应商报价关联

  - 新增"供应商报价汇总"弹窗,展示 RFQ 下所有供应商的报价对比
  - 报价单号改为可点击链接,跳转到供应商报价列表并按单号搜索

  3.3 智慧比价详情页

  - 修复了比价详情页路由(在 router/index.js 中补充)
  - 移除了评分维度展示(价格/交期/质量/服务评分条、综合分标签)
  - 精简为纯粹的供应商价格对比视图

  3.4 其他修复

  - 首页快捷操作路径修正(/bid/xxx → /xxx)
  - 停用 bid 目录后受影响的 router.push 路径全部修复
  - biz_tenant 表缺失修复(创建建表 SQL 并执行)
  - 比价详情页路由注册补充
  - goCompare 跳转路径修正
2026-06-06 15:20:46 +08:00

166 lines
7.5 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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.system.mapper.bid.BizClientQuoteMapper">
<!-- ========== 甲方报价主表操作 ========== -->
<sql id="quoteColumns">
quote_id AS quoteId, tenant_id AS tenantId, quote_no AS quoteNo,
client_name AS clientName, rfq_id AS rfqId, rfq_no AS rfqNo, rfq_title AS rfqTitle,
status, validity_date AS validityDate, total_amount AS totalAmount,
currency, remark, create_by AS createBy, create_time AS createTime
</sql>
<select id="selectClientQuoteList" resultType="com.ruoyi.system.domain.bid.BizClientQuote">
SELECT <include refid="quoteColumns"/>
FROM biz_client_quote
<where>
<if test="q.clientName != null and q.clientName != ''">AND client_name LIKE CONCAT('%',#{q.clientName},'%')</if>
<if test="q.status != null and q.status != ''">AND status = #{q.status}</if>
<if test="q.quoteNo != null and q.quoteNo != ''">AND quote_no LIKE CONCAT('%',#{q.quoteNo},'%')</if>
<if test="q.params.beginTime != null and q.params.beginTime != ''">
AND create_time &gt;= #{q.params.beginTime}
</if>
<if test="q.params.endTime != null and q.params.endTime != ''">
AND create_time &lt;= #{q.params.endTime}
</if>
</where>
ORDER BY create_time DESC
</select>
<select id="selectClientQuoteById" resultType="com.ruoyi.system.domain.bid.BizClientQuote">
SELECT <include refid="quoteColumns"/>
FROM biz_client_quote WHERE quote_id = #{quoteId}
</select>
<!-- ========== 甲方报价明细操作 ========== -->
<sql id="itemColumns">
item_id AS itemId, quote_id AS quoteId, material_id AS materialId,
material_name AS materialName, spec, model_no AS modelNo, unit, quantity,
cost_price AS costPrice, unit_price AS unitPrice, total_price AS totalPrice,
delivery_days AS deliveryDays, remark
</sql>
<select id="selectItemsByQuoteId" resultType="com.ruoyi.system.domain.bid.BizClientQuoteItem">
SELECT <include refid="itemColumns"/>
FROM biz_client_quote_item WHERE quote_id = #{quoteId} ORDER BY item_id
</select>
<select id="selectNextQuoteNo" resultType="String">
SELECT CONCAT('CQ-', DATE_FORMAT(NOW(),'%Y%m'), '-', LPAD(IFNULL(MAX(CAST(SUBSTRING_INDEX(quote_no,'-',-1) AS UNSIGNED)),0)+1,3,'0'))
FROM biz_client_quote WHERE quote_no LIKE CONCAT('CQ-', DATE_FORMAT(NOW(),'%Y%m'), '%')
</select>
<insert id="insertClientQuote" useGeneratedKeys="true" keyProperty="quoteId">
INSERT INTO biz_client_quote (tenant_id,quote_no,client_name,rfq_id,rfq_no,rfq_title,
status,validity_date,total_amount,currency,remark,create_by,create_time)
VALUES (1,#{quoteNo},#{clientName},#{rfqId},#{rfqNo},#{rfqTitle},
#{status},#{validityDate},#{totalAmount},#{currency},#{remark},#{createBy},NOW())
</insert>
<insert id="insertClientQuoteItem" useGeneratedKeys="true" keyProperty="itemId">
INSERT INTO biz_client_quote_item (quote_id,material_id,material_name,spec,model_no,unit,quantity,
cost_price,unit_price,total_price,delivery_days,remark)
VALUES (#{quoteId},#{materialId},#{materialName},#{spec},#{modelNo},#{unit},#{quantity},
#{costPrice},#{unitPrice},#{totalPrice},#{deliveryDays},#{remark})
</insert>
<update id="updateClientQuote">
UPDATE biz_client_quote SET client_name=#{clientName},status=#{status},
validity_date=#{validityDate},total_amount=#{totalAmount},
currency=#{currency},remark=#{remark},update_time=NOW()
WHERE quote_id=#{quoteId}
</update>
<delete id="deleteClientQuoteById">DELETE FROM biz_client_quote WHERE quote_id=#{quoteId}</delete>
<delete id="deleteItemsByQuoteId">DELETE FROM biz_client_quote_item WHERE quote_id=#{quoteId}</delete>
<!-- ========== 甲方报价历史 - 统计查询 ========== -->
<select id="selectClientQuoteStatistics" resultType="java.util.Map">
SELECT
COUNT(*) AS total_count,
COUNT(DISTINCT client_name) AS client_count,
COALESCE(SUM(total_amount), 0) AS total_amount_sum,
MAX(total_amount) AS max_amount,
AVG(total_amount) AS avg_amount
FROM biz_client_quote
<where>
<if test="q.clientName != null and q.clientName != ''">AND client_name LIKE CONCAT('%',#{q.clientName},'%')</if>
<if test="q.status != null and q.status != ''">AND status = #{q.status}</if>
<if test="q.params.beginTime != null and q.params.beginTime != ''">
AND create_time &gt;= #{q.params.beginTime}
</if>
<if test="q.params.endTime != null and q.params.endTime != ''">
AND create_time &lt;= #{q.params.endTime}
</if>
</where>
</select>
<!-- ========== 获取去重的客户名称列表(用于自动补全) ========== -->
<select id="selectDistinctClientNames" resultType="java.lang.String">
SELECT DISTINCT client_name FROM biz_client_quote
WHERE client_name IS NOT NULL AND client_name != ''
<if test="keyword != null and keyword != ''">AND client_name LIKE CONCAT('%',#{keyword},'%')</if>
ORDER BY client_name
LIMIT 20
</select>
<!-- ========== 按物料ID查询甲方报价历史使用material_id精确关联 ========== -->
<select id="selectClientQuotesByMaterialId" resultType="java.util.Map">
SELECT cqi.item_id AS itemId, cqi.spec, cqi.model_no AS modelNo, cqi.unit, cqi.quantity,
cqi.cost_price AS costPrice, cqi.unit_price AS unitPrice, cqi.total_price AS totalPrice,
cqi.delivery_days AS deliveryDays, cqi.material_id AS materialId,
cqi.material_name AS materialName,
cq.quote_id AS quoteId, cq.quote_no AS quoteNo, cq.client_name AS clientName,
cq.status AS quoteStatus, cq.create_time AS createTime
FROM biz_client_quote_item cqi
JOIN biz_client_quote cq ON cqi.quote_id = cq.quote_id
WHERE cqi.material_id = #{materialId}
ORDER BY cq.create_time DESC
</select>
<!-- ========== 按客户+物料ID查询历史报价甲方编辑时参考 ========== -->
<!-- materialId为可选为空时返回该客户所有历史物料 -->
<select id="selectClientQuoteHistory" resultType="java.util.Map">
SELECT cqi.item_id AS itemId, cqi.spec, cqi.unit, cqi.quantity,
cqi.cost_price AS costPrice, cqi.unit_price AS unitPrice, cqi.total_price AS totalPrice,
cqi.delivery_days AS deliveryDays, cqi.material_id AS materialId,
cqi.material_name AS materialName,
cq.quote_id AS quoteId, cq.quote_no AS quoteNo, cq.create_time AS createTime
FROM biz_client_quote_item cqi
JOIN biz_client_quote cq ON cqi.quote_id = cq.quote_id
WHERE cq.client_name LIKE CONCAT('%', #{clientName}, '%')
<if test="materialId != null">AND cqi.material_id = #{materialId}</if>
ORDER BY cq.create_time DESC
LIMIT 20
</select>
<!-- ========== 快速创建 - 复制历史报价单的明细按报价单ID ========== -->
<select id="selectItemsByQuoteIdForCopy" resultType="com.ruoyi.system.domain.bid.BizClientQuoteItem">
SELECT <include refid="itemColumns"/>
FROM biz_client_quote_item WHERE quote_id = #{quoteId}
ORDER BY item_id
</select>
<!-- ========== 甲方报价历史 - 按日期统计趋势 ========== -->
<select id="selectMonthlyTrend" resultType="java.util.Map">
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS month,
COUNT(*) AS quote_count,
COALESCE(SUM(total_amount), 0) AS amount_sum
FROM biz_client_quote
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 12 MONTH)
GROUP BY DATE_FORMAT(create_time, '%Y-%m')
ORDER BY month
</select>
</mapper>