liurunyu
2025-04-23 e5c29d6ac2b210a9385723598d79a42ae5a9679e
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
@@ -195,72 +195,103 @@
        where com_id = #{comId,jdbcType=BIGINT}
    </update>
    <!--根据操作员ID获取未关阀记录(包含在线情况)-->
    <!--根据operator获取未关阀的RTU地址及虚拟卡编号数据对,获取未关阀记录使用-->
    <select id="getUnclosedRtus" resultType="com.dy.pipIrrGlobal.voRm.VoRtuAndVc">
        SELECT
            com.rtu_addr AS rtuAddr,
            com.param ->> '$.icCardNo' AS vcNum
        FROM rm_command_history com
        where 1=1
          AND com.operator = #{operator}
          AND com.result = 1
          AND ((com.protocol = 'p206V1' OR com.protocol = 'p206V2') AND (com.command_code = '92' OR com.command_code = '97' OR com.command_code = '99' OR com.command_code = 'A0' OR com.command_code = 'A1' OR com.command_code = 'A2'))
          AND (
            SELECT op_dt FROM rm_open_close_valve_last
            WHERE rtu_addr = com.rtu_addr AND op_ic_card_no = com.param ->> '$.icCardNo'
            ORDER BY op_dt DESC
            LIMIT 1
        ) IS NOT NULL
          AND (
            SELECT cl_dt FROM rm_open_close_valve_last
            WHERE rtu_addr = com.rtu_addr AND op_ic_card_no = com.param ->> '$.icCardNo'
            ORDER BY op_dt DESC
            LIMIT 1
        ) IS NULL
        GROUP BY com.rtu_addr, com.param ->> '$.icCardNo'
    </select>
    <!--根据RTU地址和虚拟卡编号获取成功开阀的最后一条记录,获取未关阀记录使用-->
    <select id="getLastComId" resultType="java.lang.Long">
        SELECT com_id AS comId
        FROM rm_command_history
        WHERE result = 1
            AND ((protocol = 'p206V1' OR protocol = 'p206V2')
            AND (command_code = '92' OR command_code = '97' OR command_code = '99' OR command_code = 'A0' OR command_code = 'A1' OR command_code = 'A2'))
            AND rtu_addr = #{rtuAddr} AND param ->> '$.icCardNo' = #{vcNum}
        ORDER BY send_time DESC
        LIMIT 1
    </select>
    <select id="getUnclosedValves" resultType="com.dy.pipIrrGlobal.voRm.VoUnclosedValve">
        SELECT inta.name                  AS intakeNum,
               rtus.isOnLine,
               com.rtu_addr               AS rtuAddr,
               com.param ->> '$.icCardNo' AS vcNum,
               (SELECT param ->> '$.orderNo' AS orderNo
        SELECT
            inta.name AS intakeNum,
            IFNULL(rtus.isOnLine, false) AS isOnLine,
            com.rtu_addr AS rtuAddr,
            com.param ->> '$.icCardNo' AS vcNum,
            (
                SELECT param ->> '$.orderNo' AS orderNo
                FROM rm_command_history
                WHERE rtu_addr = com.rtu_addr
                ORDER BY send_time desc
                LIMIT 0,1)                AS orderNo,
               'toClose'                  AS state
                LIMIT 0,1
            ) AS orderNo,
            'toClose'                  AS state,
            CASE
                WHEN com.command_code = 'A1' OR com.command_code = 'A2' THEN 1
                ELSE 0
            END AS planned,
            com.send_time AS sendTime,
            (SELECT dt FROM rm_work_report_last
                WHERE rtu_addr = com.rtu_addr AND ic_card_no = com.param ->> '$.icCardNo'
                    AND dt > com.send_time
                ORDER BY dt DESC
             LIMIT 1) AS dt,
            (SELECT water_instant FROM rm_work_report_last
                WHERE rtu_addr = com.rtu_addr AND ic_card_no = com.param ->> '$.icCardNo'
                    AND dt > com.send_time
                ORDER BY dt DESC
            LIMIT 1) AS waterInstant
        FROM rm_command_history com
            INNER JOIN pr_controller con ON com.rtu_addr = con.rtuAddr
            INNER JOIN pr_intake inta ON con.intakeId = inta.id
            INNER JOIN JSON_TABLE(
        <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
        #{onLineMap},
        '$[*]' COLUMNS (
            rtuAddr VARCHAR(20) PATH '$.rtuAddr',
            isOnLine BOOLEAN PATH '$.isOnLine'
            )
            ) rtus ON com.rtu_addr = rtus.rtuAddr
        <where>
            AND (com.command_code = '92' OR com.command_code = 'A2' OR com.command_code = '97')
                  AND com.operator = #{operator}
                  AND NOT EXISTS(
                    SELECT *
                    FROM rm_command_history
                    WHERE (result IS NULL OR result = 1)
                      AND (command_code = '93' OR command_code = 'A3' OR command_code = '98')
                      AND param ->> '$.orderNo' = com.param ->> '$.orderNo'
                )
        </where>
        GROUP BY inta.name, rtus.isOnLine, com.rtu_addr, com.param ->> '$.icCardNo'
        UNION ALL
        SELECT inta.name                  AS intakeNum,
               rtus.isOnLine,
               com.rtu_addr               AS rtuAddr,
               com.param ->> '$.icCardNo' AS vcNum,
               (SELECT param ->> '$.orderNo' AS orderNo
                FROM rm_command_history
                WHERE rtu_addr = com.rtu_addr
                ORDER BY send_time desc
                LIMIT 0,1)                AS orderNo,
               'toCancel'                 AS state
        FROM rm_command_history com
                 INNER JOIN pr_intake inta ON inta.id = com.intake_id
                 INNER JOIN JSON_TABLE(
            LEFT JOIN JSON_TABLE(
                <!--'[{"rtuAddr":"620201000030","isOnLine":true}]',-->
                #{onLineMap},
                '$[*]' COLUMNS (
                    rtuAddr VARCHAR(20) PATH '$.rtuAddr',
                    isOnLine BOOLEAN PATH '$.isOnLine'
                    )
                )
            ) rtus ON com.rtu_addr = rtus.rtuAddr
        <where>
            AND (command_code = 'A1' OR command_code = 'A2')
            AND com.operator = #{operator}
                  AND DATE_FORMAT(
                              CONCAT(com.param ->> '$.year', '-', com.param ->> '$.month', '-', com.param ->> '$.day',
                                     ' ',
                                     com.param ->> '$.hour', ':', com.param ->> '$.minute', ':', '0'),
                              '%Y-%m-%d %H:%i:%S') > NOW()
            AND   com.com_id in (${comIds})
            AND (
                SELECT op_dt FROM rm_open_close_valve_last
                WHERE rtu_addr = com.rtu_addr AND op_ic_card_no = com.param ->> '$.icCardNo'
                ORDER BY op_dt DESC
                LIMIT 1
            ) IS NOT NULL
            AND (
                SELECT cl_dt FROM rm_open_close_valve_last
                WHERE rtu_addr = com.rtu_addr AND op_ic_card_no = com.param ->> '$.icCardNo'
                ORDER BY op_dt DESC
                LIMIT 1
            ) IS NULL
        </where>
        GROUP BY inta.name, rtus.isOnLine, com.rtu_addr, com.param ->> '$.icCardNo', com.command_code, com.send_time, dt, waterInstant
        ORDER BY com.send_time DESC
    </select>
    <!--根据取水口ID获取该取水口未关阀参数-->
@@ -297,8 +328,6 @@
        SELECT COUNT(*) AS recordCount
        FROM rm_command_history his
                 INNER JOIN pr_intake inta ON inta.id = his.intake_id
                 LEFT JOIN se_client cli ON cli.id = his.operator
                 LEFT JOIN ba_user user ON user.id = his.operator
        <where>
            <if test="intakeId != null">
                AND his.intake_id = #{intakeId}
@@ -318,17 +347,17 @@
    <!--根据指定条件获取命令日志历史记录-->
    <select id="getCommandHistories" resultType="com.dy.pipIrrGlobal.voRm.VoCommand">
        SELECT his.com_id                  AS comId,
               his.command_name            AS commandName,
               CONCAT(his.command_name, '(', his.command_code, ')') AS commandName,
               inta.name                   AS intakeName,
               his.rtu_addr                AS rtuAddr,
               his.protocol,
               his.protocol                AS protocol,
               his.send_time               AS sendTime,
               his.result_time             AS resultTime,
               (CASE
                    WHEN his.result = 1 THEN '成功'
                    ELSE '失败'
                   END)                    AS result,
               his.result_text,
                   END)                    AS state,
               his.result_text             AS result,
               IFNULL(cli.name, user.name) AS userName
        FROM rm_command_history his
                 INNER JOIN pr_intake inta ON inta.id = his.intake_id
@@ -349,11 +378,30 @@
                AND his.send_time BETWEEN #{timeStart} AND #{timeStop}
            </if>
        </where>
        ORDER BY his.send_time DESC
        ORDER BY his.com_id 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="getTimeByCommId" resultType="java.lang.String">
        SELECT
            CONCAT(param ->> '$.year', '-', param ->> '$.month', '-', param ->> '$.day', ' ',  param ->> '$.hour', ':', param ->> '$.minute', ':00') AS openTime
        FROM rm_command_history
        WHERE com_id = #{commId}
    </select>
    <!--根据命令日志ID获取开阀信息,终止灌溉计划时使用,用来执行远程关阀-->
    <select id="getValveOpen" resultType="com.dy.pipIrrGlobal.voRm.VoIntakeVc">
        SELECT
            rtu_addr AS rtuAddr,
            param ->> '$.icCardNo' AS vcNum,
            param ->> '$.orderNo' AS orderNo
        FROM rm_command_history
        WHERE com_id = #{commandId}
        LIMIT 0, 1
    </select>
</mapper>