lanan-system/dl-module-inspection/src/main/resources/mapper/InspectionWorkNodeMapper.xml
2025-06-06 10:47:57 +08:00

344 lines
17 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="cn.iocoder.yudao.module.inspection.mapper.InspectionWorkNodeMapper">
<update id="cancelAnOrder">
UPDATE inspection_work_node
SET status = '0', deal_user_id = null, deal_user_name = null, deal_images = null, remark = null
WHERE id = #{id} AND inspection_info_id = #{inspectionInfoId}
</update>
<update id="recheck">
UPDATE inspection_work_node
SET status = #{status}, deal_user_id = null, deal_user_name = null, deal_images = null, remark = null,type = null
WHERE id in (
<foreach collection="list" item="item" separator=",">
#{item.id}
</foreach>
)
</update>
<select id="getWeorkNodesById" resultType="cn.iocoder.yudao.module.inspection.entity.InspectionWorkNode"
parameterType="java.lang.Integer">
SELECT wn.*,ip.project_name AS projectName
FROM inspection_work_node wn
LEFT JOIN inspection_project ip ON ip.id = wn.project_id
WHERE wn.inspection_info_id = #{inspectionId}
ORDER BY wn.order_num ASC
</select>
<select id="getRoyaltyList" resultType="java.util.Map">
SELECT
node.id AS node_id,
node.project_id,
proj.project_name AS projectName, -- Assuming there's a project name in the inspection project table
node.deal_user_name AS handlerName,
IFNULL(royalty.royalty_amount, 0) / 100 AS royaltyAmount,
node.update_time AS node_create_time,
node.update_time AS royalty_create_time
FROM
inspection_work_node AS node
LEFT JOIN
system_users AS users
ON node.deal_user_id = users.id
LEFT JOIN
inspection_project AS proj -- Assuming this is the table for project details
ON node.project_id = proj.id
LEFT JOIN
inspection_info AS info
ON node.inspection_info_id = info.id
LEFT JOIN
order_info orders
ON info.inspection_order_id = orders.id
LEFT JOIN
inspection_project_royalty AS royalty
ON node.project_id = royalty.project_id and orders.goods_id = royalty.goods_id
<where>
node.status = '2' AND info.status = '1'
<if test="inspectionWorkNode.createTime != null">
AND node.create_time = #{inspectionWorkNode.createTime}
</if>
<if test="inspectionWorkNode.projectId != null">
AND node.project_id = #{inspectionWorkNode.projectId}
</if>
<if test="inspectionWorkNode.dealUserId != null">
AND node.deal_user_id = #{inspectionWorkNode.dealUserId}
</if>
<if test="inspectionWorkNode.dealUserName != null">
AND node.deal_user_name LIKE CONCAT('%', #{inspectionWorkNode.dealUserName} , '%')
</if>
<if test="inspectionWorkNode.rescueStartMonth != null">
AND DATE_FORMAT(node.create_time, '%Y-%m') = #{inspectionWorkNode.rescueStartMonth}
</if>
<if test="inspectionWorkNode.rescueStart != null and inspectionWorkNode.rescueEnd != null">
AND node.create_time BETWEEN #{inspectionWorkNode.rescueStart} AND #{inspectionWorkNode.rescueEnd}
</if>
</where>
ORDER BY
node.create_time DESC;
</select>
<select id="getRoyaltySum" resultType="java.util.Map">
SELECT
IFNULL(SUM(IFNULL(royalty.royalty_amount, 0) / 100 ),0)AS royaltyAmountSum
FROM
inspection_work_node AS node
LEFT JOIN
system_users AS users
ON node.deal_user_id = users.id
LEFT JOIN
inspection_project AS proj -- Assuming this is the table for project details
ON node.project_id = proj.id
LEFT JOIN
inspection_info AS info
ON node.inspection_info_id = info.id
LEFT JOIN
order_info orders
ON info.inspection_order_id = orders.id
LEFT JOIN
inspection_project_royalty AS royalty
ON node.project_id = royalty.project_id and orders.goods_id = royalty.goods_id
<where>
node.status = '2' AND info.status = '1' and node.deleted = 0
<if test="inspectionWorkNode.createTime != null">
AND node.create_time = #{inspectionWorkNode.createTime}
</if>
<if test="inspectionWorkNode.projectId != null">
AND node.project_id = #{inspectionWorkNode.projectId}
</if>
<if test="inspectionWorkNode.dealUserId != null">
AND node.deal_user_id = #{inspectionWorkNode.dealUserId}
</if>
<if test="inspectionWorkNode.dealUserName != null">
AND node.deal_user_name LIKE CONCAT('%', #{inspectionWorkNode.dealUserName} , '%')
</if>
<if test="inspectionWorkNode.rescueStartMonth != null">
AND DATE_FORMAT(node.create_time, '%Y-%m') = #{inspectionWorkNode.rescueStartMonth}
</if>
<if test="inspectionWorkNode.rescueStart != null and inspectionWorkNode.rescueEnd != null">
AND node.create_time BETWEEN #{inspectionWorkNode.rescueStart} AND #{inspectionWorkNode.rescueEnd}
</if>
</where>
ORDER BY
node.create_time DESC;
</select>
<!-- <select id="getStaffCount" resultType="java.util.Map"-->
<!-- parameterType="cn.iocoder.yudao.module.inspection.entity.DlInspectionProject">-->
<!-- SELECT-->
<!-- su.id AS deal_user_id, &#45;&#45; 处理人员ID-->
<!-- su.nickname, &#45;&#45; 处理人员名称-->
<!-- su.avatar, &#45;&#45; 处理人员头像-->
<!-- COUNT(DISTINCT iwn.id) AS orderCount, &#45;&#45; 统计每个员工的唯一订单数量-->
<!-- SUM(IFNULL(royalty.royalty_amount, 0)) / 100 AS royaltyAmount, &#45;&#45; 计算每个员工的总佣金-->
<!-- su.mobile, &#45;&#45; 处理人员手机号-->
<!-- COALESCE(proj_stats.waijianCount, 0) AS waijianCount, &#45;&#45; 包含“外检”的订单数量-->
<!-- COALESCE(proj_stats.anjianCount, 0) AS anjianCount, &#45;&#45; 包含“安检”的订单数量-->
<!-- COALESCE(proj_stats.otherCount, 0) AS otherCount &#45;&#45; 其他订单数量(排除“外检”和“安检”)-->
<!-- FROM system_users su-->
<!-- LEFT JOIN system_user_role sr-->
<!-- ON su.id = sr.user_id-->
<!-- LEFT JOIN system_role sr2-->
<!-- ON sr.role_id = sr2.id-->
<!-- LEFT JOIN inspection_work_node iwn-->
<!-- ON su.id = iwn.deal_user_id-->
<!-- LEFT JOIN inspection_info info-->
<!-- ON iwn.inspection_info_id = info.id-->
<!-- LEFT JOIN order_info orders-->
<!-- ON info.inspection_order_id = orders.id-->
<!-- LEFT JOIN inspection_project_royalty royalty-->
<!-- ON iwn.project_id = royalty.project_id-->
<!-- AND orders.goods_id = royalty.goods_id-->
<!-- LEFT JOIN (-->
<!-- SELECT-->
<!-- iwn.deal_user_id,-->
<!-- SUM(CASE WHEN proj.project_name LIKE '%外检%' THEN 1 ELSE 0 END) AS waijianCount,-->
<!-- SUM(CASE WHEN proj.project_name LIKE '%安检%' THEN 1 ELSE 0 END) AS anjianCount,-->
<!-- SUM(CASE-->
<!-- WHEN proj.project_name NOT LIKE '%外检%'-->
<!-- AND proj.project_name NOT LIKE '%安检%'-->
<!-- THEN 1 ELSE 0-->
<!-- END) AS otherCount &#45;&#45; 统计不包含“外检”和“安检”的订单-->
<!-- FROM inspection_work_node iwn-->
<!-- LEFT JOIN inspection_project proj-->
<!-- ON iwn.project_id = proj.id-->
<!-- LEFT JOIN inspection_info info-->
<!-- ON iwn.inspection_info_id = info.id-->
<!-- WHERE-->
<!-- iwn.deleted = 0 &#45;&#45; 排除已删除的数据-->
<!-- AND iwn.deal_user_id IS NOT NULL &#45;&#45; 排除 deal_user_id 为空的记录-->
<!-- AND iwn.status = 2-->
<!-- AND info.status = 1-->
<!-- GROUP BY iwn.deal_user_id-->
<!-- ) proj_stats-->
<!-- ON su.id = proj_stats.deal_user_id &#45;&#45; 获取“外检”和“安检”的统计-->
<!-- WHERE-->
<!-- sr2.service_package_id = 'jiance' &#45;&#45; 角色条件-->
<!-- AND sr2.code != 'jcyh' &#45;&#45; 排除特定角色-->
<!-- AND (iwn.deleted = 0 OR iwn.deleted IS NULL) &#45;&#45; 允许 iwn 为空-->
<!-- AND (iwn.deal_user_id IS NOT NULL OR iwn.deal_user_id IS NULL) &#45;&#45; 允许没有工单的用户-->
<!--# AND (iwn.status = 2 OR iwn.status IS NULL) &#45;&#45; 允许 iwn 为空-->
<!-- AND (iwn.status = 2) &#45;&#45; 允许 iwn 为空-->
<!-- AND (info.status = 1 OR info.status IS NULL)-->
<!-- <if test="id != null and id != ''">-->
<!-- AND iwn.project_id = #{id} &#45;&#45; 只在这里加上id过滤-->
<!-- </if>-->
<!-- GROUP BY su.id &#45;&#45; 根据处理人员ID进行分组-->
<!-- ORDER BY orderCount DESC; &#45;&#45; 根据接单数量进行降序排序-->
<!-- </select>-->
<!-- <select id="getStaffCount" resultType="java.util.Map"-->
<!-- parameterType="cn.iocoder.yudao.module.inspection.entity.DlInspectionProject">-->
<!-- SELECT-->
<!-- iwn.deal_user_id, &#45;&#45; 处理人员ID-->
<!-- su.nickname, &#45;&#45; 处理人员名称-->
<!-- su.avatar, &#45;&#45; 处理人员头像-->
<!-- COUNT(DISTINCT iwn.id) AS orderCount, &#45;&#45; 统计每个员工的唯一订单数量-->
<!-- SUM(IFNULL(royalty.royalty_amount, 0) / 100) AS royaltyAmount, &#45;&#45; 计算每个员工的总佣金-->
<!-- su.mobile, &#45;&#45; 处理人员手机号-->
<!-- COALESCE(waijianCount, 0) AS waijianCount, &#45;&#45; 包含“外检”的订单数量-->
<!-- COALESCE(anjianCount, 0) AS anjianCount, &#45;&#45; 包含“安检”的订单数量-->
<!-- COALESCE(proj_stats.otherCount, 0) AS otherCount &#45;&#45; 其他订单数量(排除“外检”和“安检”)-->
<!-- FROM-->
<!-- inspection_work_node iwn-->
<!-- LEFT JOIN system_users su ON su.id = iwn.deal_user_id &#45;&#45; 处理人员信息-->
<!-- LEFT JOIN inspection_info AS info ON iwn.inspection_info_id = info.id-->
<!-- LEFT JOIN order_info orders ON info.inspection_order_id = orders.id-->
<!-- LEFT JOIN inspection_project_royalty AS royalty-->
<!-- ON iwn.project_id = royalty.project_id-->
<!-- AND orders.goods_id = royalty.goods_id-->
<!-- LEFT JOIN (-->
<!-- SELECT-->
<!-- iwn.deal_user_id,-->
<!-- SUM(CASE WHEN proj.project_name LIKE '环检外检%' THEN 1 ELSE 0 END) AS waijianCount,-->
<!-- SUM(CASE WHEN proj.project_name LIKE '安检%' THEN 1 ELSE 0 END) AS anjianCount,-->
<!-- SUM(-->
<!-- CASE-->
<!-- WHEN proj.project_name NOT LIKE '环检外检%'-->
<!-- AND proj.project_name NOT LIKE '安检%'-->
<!-- THEN 1 ELSE 0-->
<!-- END-->
<!-- ) AS otherCount &#45;&#45; 统计不包含“外检”和“安检”的订单-->
<!-- FROM-->
<!-- inspection_work_node iwn-->
<!-- LEFT JOIN inspection_project AS proj ON iwn.project_id = proj.id-->
<!-- LEFT JOIN inspection_info AS info ON iwn.inspection_info_id = info.id-->
<!-- WHERE iwn.deleted = 0 &#45;&#45; 排除已删除的数据-->
<!-- AND iwn.deal_user_id IS NOT NULL &#45;&#45; 排除 deal_user_id 为 NULL 的记录-->
<!-- AND iwn.status = 2-->
<!-- AND info.status = 1-->
<!-- GROUP BY-->
<!-- iwn.deal_user_id-->
<!-- ) proj_stats ON iwn.deal_user_id = proj_stats.deal_user_id &#45;&#45; 获取“外检”和“安检”的统计-->
<!-- <where>-->
<!-- iwn.deleted = 0 &#45;&#45; 排除已删除的数据-->
<!-- AND iwn.deal_user_id IS NOT NULL &#45;&#45; 排除 deal_user_id 为 NULL 的记录-->
<!-- AND iwn.status = 2-->
<!-- AND info.status = 1-->
<!-- <if test="id != null and id != ''">-->
<!-- AND iwn.project_id = #{id} &#45;&#45; 只在这里加上id过滤-->
<!-- </if>-->
<!-- </where>-->
<!-- GROUP BY-->
<!-- iwn.deal_user_id &#45;&#45; 根据处理人员ID进行分组-->
<!-- ORDER BY-->
<!-- orderCount DESC; &#45;&#45; 根据接单数量进行降序排序-->
<!-- </select>-->
<select id="getStaffCount" resultType="cn.iocoder.yudao.module.inspection.vo.StaffProjectCountVO"
parameterType="cn.iocoder.yudao.module.inspection.entity.DlInspectionProject">
SELECT
ip.id AS project_id,
ip.project_name,
is2.user_id,
su.nickname,
COUNT(iwn.id) AS count
FROM inspection_staff is2
CROSS JOIN inspection_project ip
LEFT JOIN system_users su ON su.id = is2.user_id
LEFT JOIN inspection_work_node iwn ON
iwn.deal_user_id = is2.user_id
AND iwn.project_id = ip.id
<if test="datetimeRange != null">
AND iwn.create_time BETWEEN #{datetimeRange[0]} AND #{datetimeRange[1]}
</if>
WHERE
is2.deleted = 0
AND ip.deleted = 0
GROUP BY is2.user_id, ip.id
</select>
<select id="selectExceptionNodesByInspectionIds" resultType="java.util.Map">
SELECT
w.inspection_info_id AS inspectionInfoId,
w.id AS nodeId,
p.project_name AS projectName
FROM inspection_work_node w
INNER JOIN inspection_project p
ON p.id = w.project_id
WHERE w.inspection_info_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND w.status &lt;&gt; '2' <!-- 未完成 -->
AND EXISTS ( <!-- 同时“制证”节点已完成 -->
SELECT 1
FROM inspection_work_node w2
INNER JOIN inspection_project p2
ON p2.id = w2.project_id
WHERE w2.inspection_info_id = w.inspection_info_id
AND p2.project_name LIKE '%制证%'
AND w2.status = '2'
AND w2.type = 1
)
ORDER BY w.order_num
</select>
<select id="selectStaffProjectByUserId" resultType="java.util.Map">
SELECT
ii.id AS inspectionInfoId,
ii.user_id AS userId,
ii.user_name AS userName,
ii.buy_name AS buyName,
ii.buy_phone AS buyPhone,
ii.car_num AS carNum,
ii.car_model AS carModel,
ii.car_status AS carStatus,
ii.start_time AS startTime,
ii.end_time AS endTime,
ii.unit_name AS unitName,
ii.partner_id,
ii.work_id AS workId,
ii.worker_name AS workerName,
ii.worker_phone AS workerPhone,
ii.worker_avatar AS workerAvatar,
CASE
WHEN ii.is_pass = '0' THEN '不通过'
WHEN ii.is_pass = '1' THEN '通过'
WHEN ii.is_pass IS NULL THEN '进行中'
ELSE '未知'
END AS status,
GROUP_CONCAT(ip.project_name ORDER BY iwn.order_num SEPARATOR ',') AS projectName
FROM inspection_work_node iwn
LEFT JOIN inspection_info ii ON iwn.inspection_info_id = ii.id
LEFT JOIN inspection_project ip ON ip.id = iwn.project_id
<where>
<if test="query.userId != null">
AND iwn.deal_user_id = #{query.userId}
</if>
<if test="query.customerSource != null">
AND ii.customer_source = #{query.customerSource}
</if>
<if test="query.datetimeRange != null">
AND ii.create_time BETWEEN #{query.datetimeRange[0]} AND #{query.datetimeRange[1]}
</if>
<if test="query.customSource != null">
AND ii.customer_source = #{query.customSource}
</if>
<if test="query.bussiness != null">
AND ii.business_channel = #{query.bussiness}
</if>
<if test="query.projectId != null">
AND ip.id = #{query.projectId}
</if>
AND iwn.status = '2'
AND iwn.deleted = b'0'
</where>
GROUP BY ii.id
ORDER BY ii.start_time DESC;
</select>
</mapper>