Files
erp-next/ruoyi-system/src/main/resources/mapper/bid/BizDeliveryOrderMapper.xml
王文昊 24ab178ec1 feat(bid): 新增甲方履约订单管理模块
1.  新增甲方履约菜单分类,包含待发、在途、签收三个子菜单并配置权限
2.  重构发货单号生成逻辑,支持区分供应商和甲方履约订单前缀
3.  新增甲方发货单生成功能,可从确认的甲方报价单一键创建
4.  新增京东红主题样式并支持快速切换
5.  优化物料发货记录查询,兼容两种履约订单的客户信息关联
6.  修复订单详情弹窗的空值判断和异常捕获逻辑
7.  新增配套SQL脚本用于菜单初始化和数据修复
2026-06-15 11:09:56 +08:00

152 lines
7.3 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.BizDeliveryOrderMapper">
<resultMap id="BaseRM" type="com.ruoyi.system.domain.bid.BizDeliveryOrder">
<id property="doId" column="do_id"/>
<result property="tenantId" column="tenant_id"/>
<result property="doNo" column="do_no"/>
<result property="rfqId" column="rfq_id"/>
<result property="quotationId" column="quotation_id"/>
<result property="supplierId" column="supplier_id"/>
<result property="totalAmount" column="total_amount"/>
<result property="currency" column="currency"/>
<result property="deliveryDate" column="delivery_date"/>
<result property="delayDate" column="delay_date"/>
<result property="actualCloseDate" column="actual_close_date"/>
<result property="closeDateSetBy" column="close_date_set_by"/>
<result property="deliveryStatus" column="delivery_status"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="supplierName" column="supplier_name"/>
<result property="itemCount" column="item_count"/>
<result property="type" column="type"/>
<result property="clientQuoteId" column="client_quote_id"/>
<result property="clientName" column="client_name"/>
</resultMap>
<select id="selectBizDeliveryOrderList" resultMap="BaseRM">
SELECT d.*, s.supplier_name,
COALESCE(cl.client_name, cq.client_name) AS client_name,
(SELECT COUNT(*) FROM biz_delivery_order_item WHERE do_id = d.do_id) AS item_count
FROM biz_delivery_order d
LEFT JOIN biz_supplier s ON d.supplier_id=s.supplier_id
LEFT JOIN biz_client_quote cq ON d.client_quote_id = cq.quote_id
LEFT JOIN biz_client cl ON cq.client_id = cl.client_id
<where>
<if test="tenantId != null"> AND d.tenant_id=#{tenantId}</if>
<if test="type != null and type != ''"> AND d.type=#{type}</if>
<if test="doNo != null and doNo != ''"> AND d.do_no LIKE CONCAT('%',#{doNo},'%')</if>
<if test="supplierId != null"> AND d.supplier_id=#{supplierId}</if>
<if test="deliveryStatus != null and deliveryStatus != ''"> AND d.delivery_status=#{deliveryStatus}</if>
<if test="supplierName != null and supplierName != ''"> AND s.supplier_name LIKE CONCAT('%',#{supplierName},'%')</if>
<if test="clientName != null and clientName != ''"> AND cl.client_name LIKE CONCAT('%',#{clientName},'%')</if>
</where>
ORDER BY d.create_time DESC
</select>
<select id="selectBizDeliveryOrderById" resultMap="BaseRM">
SELECT d.*, s.supplier_name
FROM biz_delivery_order d
LEFT JOIN biz_supplier s ON d.supplier_id=s.supplier_id
WHERE d.do_id=#{id}
</select>
<insert id="insertBizDeliveryOrder" useGeneratedKeys="true" keyProperty="doId">
INSERT INTO biz_delivery_order(tenant_id,do_no,type,rfq_id,quotation_id,client_quote_id,supplier_id,total_amount,currency,delivery_date,delay_date,actual_close_date,close_date_set_by,delivery_status,remark,create_by,create_time)
VALUES(#{tenantId},#{doNo},#{type},#{rfqId},#{quotationId},#{clientQuoteId},#{supplierId},#{totalAmount},#{currency},#{deliveryDate},#{delayDate},#{actualCloseDate},#{closeDateSetBy},#{deliveryStatus},#{remark},#{createBy},NOW())
</insert>
<update id="updateBizDeliveryOrder">
UPDATE biz_delivery_order
<set>
<if test="doNo != null">do_no=#{doNo},</if>
<if test="supplierId != null">supplier_id=#{supplierId},</if>
<if test="totalAmount != null">total_amount=#{totalAmount},</if>
<if test="deliveryDate != null">delivery_date=#{deliveryDate},</if>
<if test="delayDate != null">delay_date=#{delayDate},</if>
<if test="actualCloseDate != null">actual_close_date=#{actualCloseDate},</if>
<if test="closeDateSetBy != null">close_date_set_by=#{closeDateSetBy},</if>
<if test="deliveryStatus != null">delivery_status=#{deliveryStatus},</if>
<if test="remark != null">remark=#{remark},</if>
update_by=#{updateBy}, update_time=NOW()
</set>
WHERE do_id=#{doId}
</update>
<select id="selectTransitStats" resultType="java.util.Map">
SELECT
COUNT(*) AS totalTransit,
SUM(CASE WHEN DATEDIFF(delivery_date, CURDATE()) BETWEEN 0 AND 3 THEN 1 ELSE 0 END) AS expiringSoon,
SUM(CASE WHEN DATEDIFF(delivery_date, CURDATE()) &lt; 0 THEN 1 ELSE 0 END) AS overdue
FROM biz_delivery_order
WHERE delivery_status = 'transit'
</select>
<select id="selectCloseDateStats" resultType="java.util.Map">
SELECT
COUNT(*) AS pendingClose,
SUM(CASE WHEN actual_close_date = CURDATE() THEN 1 ELSE 0 END) AS todayClosed,
SUM(CASE WHEN YEARWEEK(actual_close_date, 1) = YEARWEEK(CURDATE(), 1) THEN 1 ELSE 0 END) AS weekClosed,
ROUND(AVG(DATEDIFF(actual_close_date, delivery_date)), 1) AS avgCycleDays
FROM biz_delivery_order
WHERE delivery_status = 'history'
</select>
<select id="selectHistoryStats" resultType="java.util.Map">
SELECT
COUNT(*) AS totalHistory,
SUM(CASE WHEN DATE_FORMAT(actual_close_date, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m') THEN 1 ELSE 0 END) AS monthCompleted,
COALESCE(SUM(total_amount), 0) AS totalAmount,
ROUND(AVG(DATEDIFF(actual_close_date, delivery_date)), 1) AS avgDeliveryDays
FROM biz_delivery_order
WHERE delivery_status = 'history'
</select>
<delete id="deleteBizDeliveryOrderById">DELETE FROM biz_delivery_order WHERE do_id=#{id}</delete>
<delete id="deleteBizDeliveryOrderByIds">
DELETE FROM biz_delivery_order WHERE do_id IN
<foreach collection="array" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
<!-- 状态流转更新直接设置字段不受动态SQL null判断影响 -->
<update id="updateDeliveryStatus">
UPDATE biz_delivery_order
SET delivery_status=#{deliveryStatus},
delay_date=#{delayDate},
actual_close_date=#{actualCloseDate},
close_date_set_by=#{closeDateSetBy},
update_time=NOW()
WHERE do_id=#{doId}
</update>
<!-- 物料发货记录多表JOIN追溯 -->
<select id="selectMaterialRecords" resultType="java.util.Map">
SELECT d.do_no,
d.type,
s.supplier_name,
COALESCE(cl.client_name, cq.client_name, cq2.client_name) AS client_name,
di.quantity,
di.unit_price,
di.total_price,
d.delivery_date,
d.actual_close_date,
d.delivery_status
FROM biz_delivery_order_item di
JOIN biz_delivery_order d ON di.do_id = d.do_id
LEFT JOIN biz_supplier s ON d.supplier_id = s.supplier_id
-- 供应商履约链路: delivery → rfq → client_quote
LEFT JOIN biz_rfq r ON d.rfq_id = r.rfq_id
LEFT JOIN biz_client_quote cq ON r.client_quote_id = cq.quote_id
-- 甲方履约链路: delivery → client_quote直连
LEFT JOIN biz_client_quote cq2 ON d.type = 'client' AND d.client_quote_id = cq2.quote_id
LEFT JOIN biz_client cl ON COALESCE(cq.client_id, cq2.client_id) = cl.client_id
WHERE di.material_id = #{materialId}
ORDER BY d.create_time DESC
</select>
</mapper>