zhubaomin
2025-04-17 1e69d160cb1e04b1438db0ca950dd5c15088619d
pipIrr-platform/pipIrr-global/src/main/resources/mapper/IrIrrigatePlanMapper.xml
@@ -163,113 +163,293 @@
  <!--根据指定的计划ID获取启动模式-->
  <select id="getStartupMode" resultType="java.lang.Byte">
    SELECT
        startup_mode AS startupMode
    startup_mode AS startupMode
    FROM ir_irrigate_plan
    WHERE id = #{planId}
  </select>
  <!--根据指定的计划ID获取已发布的灌溉计划数量-->
  <select id="getPublishedCount" resultType="java.lang.Integer">
    SELECT COUNT(*)
    FROM ir_irrigate_plan plan
    WHERE plan.id = #{planId}
      AND plan.plan_state = 2
      AND plan.deleted = 0
  </select>
  <!--发布指定的灌溉计划-->
  <update id="publishIrrigatePlan">
    UPDATE ir_irrigate_plan SET plan_state = 2 WHERE id = #{planId}
  </update>
  <!--根据指定的条件获取计划数量-->
  <select id="getIrrigatePlanCount" resultType="java.lang.Long">
    SELECT COUNT(*)
    FROM ir_irrigate_plan plan
    INNER JOIN ir_project pro ON pro.id = plan.project_id
    <where>
      AND plan.deleted = 0
      AND pro.deleted = 0
      <if test="projectName != null and projectName != ''">
        AND pro.project_name LIKE CONCAT('%', #{projectName}, '%')
      </if>
  <!--  <select id="getIrrigatePlanCount" resultType="java.lang.Long">-->
  <!--    SELECT COUNT(*)-->
  <!--    FROM ir_irrigate_plan plan-->
  <!--    INNER JOIN ir_project pro ON pro.id = plan.project_id-->
  <!--    <where>-->
  <!--      AND plan.deleted = 0-->
  <!--      AND pro.deleted = 0-->
  <!--      <if test="projectName != null and projectName != ''">-->
  <!--        AND pro.project_name LIKE CONCAT('%', #{projectName}, '%')-->
  <!--      </if>-->
      <if test="planName != null and planName != ''">
        AND plan.plan_name LIKE CONCAT('%', #{planName}, '%')
      </if>
  <!--      <if test="planName != null and planName != ''">-->
  <!--        AND plan.plan_name LIKE CONCAT('%', #{planName}, '%')-->
  <!--      </if>-->
      <if test="startupMode != null">
        AND plan.startup_mode = #{startupMode}
      </if>
  <!--      <if test="startupMode != null">-->
  <!--        AND plan.startup_mode = #{startupMode}-->
  <!--      </if>-->
      <if test="planState != null">
        AND plan.plan_state = #{planState}
      </if>
  <!--      <if test="planState != null">-->
  <!--        AND plan.plan_state = #{planState}-->
  <!--      </if>-->
      <if test="executingState != null">
        AND plan.executing_state = #{executingState}
      </if>
    </where>
  </select>
  <!--      <if test="executingState != null">-->
  <!--        AND plan.executing_state = #{executingState}-->
  <!--      </if>-->
  <!--    </where>-->
  <!--  </select>-->
  <!--根据指定的条件获取计划列表-->
  <select id="getIrrigatePlans" resultType="com.dy.pipIrrGlobal.voIr.VoIrrigatePlan">
    SELECT
        plan.id AS planId,
        pro.project_name AS projectName,
        plan.plan_name AS planName,
        CASE plan.startup_mode
            WHEN 1 THEN '手动启动'
            WHEN 2 THEN '自动启动'
        END AS startupMode,
        plan.plan_start_time AS startTime,
        plan.plan_stop_time AS stopTime,
        plan.duration AS duration,
        CASE plan.plan_state
            WHEN 1 THEN '草稿'
            WHEN 2 THEN '已发布'
        END AS planState,
  <!--  <select id="getIrrigatePlans" resultType="com.dy.pipIrrGlobal.voIr.VoIrrigatePlan">-->
  <!--    SELECT-->
  <!--        plan.id AS planId,-->
  <!--        pro.project_name AS projectName,-->
  <!--        plan.plan_name AS planName,-->
  <!--        CASE plan.startup_mode-->
  <!--            WHEN 1 THEN '手动启动'-->
  <!--            WHEN 2 THEN '自动启动'-->
  <!--        END AS startupMode,-->
  <!--        plan.plan_start_time AS startTime,-->
  <!--        plan.plan_stop_time AS stopTime,-->
  <!--        plan.duration AS duration,-->
  <!--        CASE plan.plan_state-->
  <!--            WHEN 1 THEN '草稿'-->
  <!--            WHEN 2 THEN '已发布'-->
  <!--        END AS planState,-->
        CASE plan.executing_state
            WHEN 1 THEN
            '未执行'
            WHEN 2 THEN
            '执行中'
            WHEN 3 THEN
            '已暂停'
            WHEN 4 THEN
            '已终止'
        END AS executingState
  <!--        CASE plan.executing_state-->
  <!--            WHEN 1 THEN-->
  <!--            '未执行'-->
  <!--            WHEN 2 THEN-->
  <!--            '执行中'-->
  <!--            WHEN 3 THEN-->
  <!--            '已暂停'-->
  <!--            WHEN 4 THEN-->
  <!--            '已终止'-->
  <!--        END AS executingState-->
  <!--    FROM ir_irrigate_plan plan-->
  <!--    INNER JOIN ir_project pro ON pro.id = plan.project_id-->
  <!--    <where>-->
  <!--      AND plan.deleted = 0-->
  <!--      AND pro.deleted = 0-->
  <!--      <if test="projectName != null and projectName != ''">-->
  <!--        AND pro.project_name LIKE CONCAT('%', #{projectName}, '%')-->
  <!--      </if>-->
  <!--      <if test="planName != null and planName != ''">-->
  <!--        AND plan.plan_name LIKE CONCAT('%', #{planName}, '%')-->
  <!--      </if>-->
  <!--      <if test="startupMode != null">-->
  <!--        AND plan.startup_mode = #{startupMode}-->
  <!--      </if>-->
  <!--      <if test="planState != null">-->
  <!--        AND plan.plan_state = #{planState}-->
  <!--      </if>-->
  <!--      <if test="executingState != null">-->
  <!--        AND plan.executing_state = #{executingState}-->
  <!--      </if>-->
  <!--    </where>-->
  <!--    ORDER BY plan.plan_state DESC, plan.plan_start_time-->
  <!--    <trim prefix="limit ">-->
  <!--      <if test="start != null and count != null">-->
  <!--        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}-->
  <!--      </if>-->
  <!--    </trim>-->
  <!--  </select>-->
  <!--根据计划ID获取计划简单信息-->
  <select id="getPlanSimple" resultType="com.dy.pipIrrGlobal.voIr.VoPlanSimple">
    SELECT
    plan.startup_mode AS startupMode,
    plan.plan_start_time AS planStartTime,
    plan.duration AS duration
    FROM ir_irrigate_plan plan
    INNER JOIN ir_project pro ON pro.id = plan.project_id
    WHERE plan.id = #{planId}
    AND plan.deleted = 0 AND plan_state = 1
    LIMIT 1
  </select>
  <!--根据计划ID更新计划信息(起止时间、计划状态)-->
  <update id="updatePlanTimes">
    UPDATE ir_irrigate_plan
    SET plan_start_time = #{planStartTime}, plan_stop_time = #{planStopTime}, plan_state = 2
    WHERE id = #{planId}
  </update>
  <!--获取未完成的计划列表,小程序计划列表页使用-->
  <select id="getNotCompletePlans" resultType="com.dy.pipIrrGlobal.voIr.VoPlans">
    SELECT
      pro.project_name AS projectName,
      plan.id AS planId,
      plan.plan_name AS planName,
      plan.startup_mode AS startupMode,
      plan.plan_start_time AS planStartTime,
      plan.plan_stop_time AS planStopTime,
      plan.duration,
      IF(plan.plan_state = 1, 1,
         IF(NOW() &lt; plan.plan_start_time, 2,
            IF(NOW() &gt;= plan.plan_start_time AND NOW() &lt; plan.plan_stop_time, 3, 4)
           )
        ) AS planState
    FROM ir_irrigate_plan plan
        INNER JOIN ir_project pro ON pro.id = plan.project_id
    <where>
      AND plan.deleted = 0
      AND pro.deleted = 0
      <if test="projectName != null and projectName != ''">
        AND pro.project_name LIKE CONCAT('%', #{projectName}, '%')
      </if>
      <if test="planName != null and planName != ''">
        AND plan.plan_name LIKE CONCAT('%', #{planName}, '%')
      </if>
      <if test="startupMode != null">
        AND plan.startup_mode = #{startupMode}
      </if>
      <if test="planState != null">
        AND plan.plan_state = #{planState}
      </if>
      <if test="executingState != null">
        AND plan.executing_state = #{executingState}
      </if>
      AND (plan.plan_state = 1 OR NOW() &lt; plan.plan_stop_time)
      AND plan.executing_state != 3
    </where>
    ORDER BY plan.plan_state DESC, plan.plan_start_time
    ORDER BY plan.plan_state DESC
  </select>
  <!--获取已完成的计划数量-->
  <select id="getCompletedPlansCount" resultType="java.lang.Long">
    SELECT
        COUNT(*) AS recordCount
    FROM ir_irrigate_plan plan
    INNER JOIN ir_project pro ON pro.id = plan.project_id
    WHERE plan.deleted = 0 AND ((plan.plan_state = 2 AND NOW() &gt;= plan.plan_stop_time) OR (plan.executing_state = 3))
  </select>
  <!--获取已完成的计划列表,小程序计划列表页使用-->
  <select id="getCompletedPlans" resultType="com.dy.pipIrrGlobal.voIr.VoPlans">
    SELECT
      pro.project_name AS projectName,
      plan.id AS planId,
      plan.plan_name AS planName,
      plan.startup_mode AS startupMode,
      plan.plan_start_time AS planStartTime,
      plan.plan_stop_time AS planStopTime,
      plan.duration,
      IF(plan.executing_state = 3, 5, 4) AS planState
    FROM ir_irrigate_plan plan
        INNER JOIN ir_project pro ON pro.id = plan.project_id
        INNER JOIN ir_plan_operate po ON po.plan_id = plan.id
    WHERE plan.deleted = 0 AND ((plan.plan_state = 2 AND NOW() &gt;= plan.plan_stop_time) OR (plan.executing_state = 3)) AND po.operate_type = 1
    ORDER BY po.operate_time DESC
    <trim prefix="limit ">
      <if test="start != null and count != null">
        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
      </if>
    </trim>
  </select>
  <!--根据计划ID获取待终止计划的结束时间:未删除、未终止、已发布、当前时间小于计划结束时间-->
  <select id="getToTerminatePlan" resultType="java.util.Date">
    SELECT
      plan_start_time AS planStartTime
    FROM ir_irrigate_plan
    <where>
      AND deleted = 0
      AND executing_state != 3
      AND plan_state = 2
      AND NOW() &lt; plan_stop_time
      <if test = "planId != null">
        AND id = #{planId}
      </if>
    </where>
  </select>
  <!--根据计划ID获取计划详情,包括计划名称,项目名,计划开始时间,计划结束时间,计划详情页使用-->
  <select id="getPlanDetails" resultType="com.dy.pipIrrGlobal.voIr.VoPlanDetails">
    SELECT
      plan.plan_name AS planName,
      pro.project_name AS projectName,
      IF(plan.executing_state = 3, '5',
         IF(NOW() &lt; plan.plan_start_time,'2',
            IF(NOW() &lt; plan.plan_stop_time, '3', '4'))) AS state,
      plan.plan_start_time AS planStartTime,
      plan.plan_stop_time AS planStopTime,
      NULL AS groupDetails,
      NULL AS failureCount
    FROM ir_irrigate_plan plan
        INNER JOIN ir_project pro ON pro.id = plan.project_id
    WHERE plan.id = #{planId}
    AND plan.deleted = 0
  </select>
  <!--根据计划ID获取已终止计划的详情,结束时间为实际终止时间-->
  <select id="getPlanDetails_terminate" resultType="com.dy.pipIrrGlobal.voIr.VoPlanDetails">
    SELECT
        plan.plan_name AS planName,
        pro.project_name AS projectName,
<!--        IF(#{terminateTime} &lt; plan.plan_start_time, 6,-->
<!--          IF(#{terminateTime} &lt; plan.plan_stop_time, 5, 4)) AS state,-->
        IF(plan.executing_state = 3, 5,
            IF(NOW() &lt; plan_start_time, 2,
                IF(NOW() &lt; plan_stop_time, 3, 4)
            )
        ) AS state,
        plan.plan_start_time AS planStartTime,
        plan.plan_stop_time AS planStopTime,
        #{terminateTime} AS realStopTime,
        NULL AS groupDetails,
        NULL AS failureCount
    FROM ir_irrigate_plan plan
      INNER JOIN ir_project pro ON pro.id = plan.project_id
    WHERE plan.id = #{planId}
    AND plan.deleted = 0
  </select>
  <!--根据计划ID获取计划状态,用于判断是否可以删除计划-->
  <select id="getPlanState" resultType="java.lang.Integer">
    SELECT
      plan_state
    FROM ir_irrigate_plan
    WHERE id = #{planId}
    AND deleted = 0
  </select>
  <!--判断当前项目是否存在已发布、未终止、未删除、未完成的计划,发布计划前判断使用-->
  <select id="hasPlan_CurrentProject" resultType="java.lang.Integer">
    SELECT
      COUNT(*) AS recordCount
    FROM ir_irrigate_plan
    WHERE project_id = (SELECT project_id FROM ir_irrigate_plan WHERE id = #{planId})
      AND id != #{planId}
      AND plan_state = 2
      AND executing_state != 3
      AND deleted = 0
      AND NOW() &lt; plan_stop_time
  </select>
  <!--判断当前计划包含的轮灌组是否与其他项目下计划包含的轮灌组有交集,且其他项目的计划状态为已发布、未终止、未删除、未完成,发布计划前判断使用-->
  <select id="hasPlan_OtherProject" resultType="java.lang.Integer">
    SELECT EXISTS(
        SELECT sche.group_id
        FROM ir_irrigate_plan plan
            INNER JOIN ir_plan_schedule ps ON ps.plan_id = plan.id
            INNER JOIN ir_irrigate_schedule sche ON sche.id = ps.schedule_id
        WHERE plan.project_id != (SELECT project_id FROM ir_irrigate_plan WHERE id = #{planId})
            AND plan_state = 2
            AND executing_state != 3
            AND deleted = 0
            AND NOW() &lt; plan_stop_time
        INTERSECT
        SELECT sche.group_id
        FROM ir_irrigate_schedule sche
            INNER JOIN ir_plan_schedule ps ON schedule_id = sche.id
        WHERE ps.plan_id = #{planId}
        LIMIT 1
    ) AS has_intersection
  </select>
  <!--根据计划ID获取计划最新状态-->
  <select id="getPlanLatestState" resultType="java.lang.Integer">
    SELECT
        IF(plan_state = 1, 1,
            IF(executing_state = 3, 5,
                IF(NOW() &lt; plan_start_time, 2,
                  IF(NOW() > plan_stop_time, 3, 4)
                )
            )
    ) AS planState
    FROM ir_irrigate_plan
    WHERE deleted = 0 AND id = #{planId}
  </select>
</mapper>