1. 新增甲方履约菜单分类,包含待发、在途、签收三个子菜单并配置权限 2. 重构发货单号生成逻辑,支持区分供应商和甲方履约订单前缀 3. 新增甲方发货单生成功能,可从确认的甲方报价单一键创建 4. 新增京东红主题样式并支持快速切换 5. 优化物料发货记录查询,兼容两种履约订单的客户信息关联 6. 修复订单详情弹窗的空值判断和异常捕获逻辑 7. 新增配套SQL脚本用于菜单初始化和数据修复
152 lines
7.3 KiB
XML
152 lines
7.3 KiB
XML
<?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()) < 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>
|