<?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.xmomen.module.stock.entity.mapper.StockMapper">
  <!--
      定义结果映射，将数据库查询结果映射到 Java 实体类 com.xmomen.module.stock.entity.Stock。
      id: 结果映射的唯一标识。
      type: 要映射到的 Java 实体类。
  -->
  <resultMap id="BaseResultMap" type="com.xmomen.module.stock.entity.Stock">
    <!-- 定义主键映射，将数据库列 id 映射到实体类的 id 属性 -->
    <id column="id" property="id" jdbcType="VARCHAR" />
    <!-- 定义其他字段的映射，将数据库列映射到实体类的对应属性 -->
    <result column="item_id" property="itemId" jdbcType="INTEGER" />
    <result column="stock_num" property="stockNum" jdbcType="INTEGER" />
    <result column="warning_num" property="warningNum" jdbcType="INTEGER" />
    <result column="insert_date" property="insertDate" jdbcType="TIMESTAMP" />
    <result column="insert_user_id" property="insertUserId" jdbcType="INTEGER" />
    <result column="update_date" property="updateDate" jdbcType="TIMESTAMP" />
    <result column="update_user_id" property="updateUserId" jdbcType="INTEGER" />
  </resultMap>

  <!--
      定义查询条件 SQL 片段，用于生成动态的 WHERE 子句。
      这里根据 StockExample 中的查询条件集合 oredCriteria 来生成条件。
  -->
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" suffix=")" prefixOverrides="and">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <!-- 当条件不带值时（如 IS NULL 等） -->
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <!-- 当条件带单个值时 -->
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <!-- 当条件带范围值时（如 BETWEEN 条件） -->
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <!-- 当条件带值列表时（如 IN 条件） -->
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

  <!--
      定义更新操作的 WHERE 子句 SQL 片段，逻辑与 Example_Where_Clause 类似，
      用于根据 Example 中的条件生成更新的 WHERE 子句。
  -->
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" suffix=")" prefixOverrides="and">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

  <!-- 定义基础列列表，列出要查询的数据库列 -->
  <sql id="Base_Column_List">
    id, item_id, stock_num, warning_num, insert_date, insert_user_id, update_date, update_user_id
  </sql>

  <!--
      定义根据示例条件查询的 SQL 语句。
      id: 语句的唯一标识。
      resultMap: 使用的结果映射，这里是 BaseResultMap。
      parameterType: 传入的参数类型，这里是 StockExample。
  -->
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.xmomen.module.stock.entity.StockExample">
    select
    <if test="distinct">
      distinct
    </if>
    <!-- 引入基础列列表 -->
    <include refid="Base_Column_List" />
    from cd_stock
    <if test="_parameter != null">
      <!-- 引入查询条件 SQL 片段 -->
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>

  <!--
      定义根据示例条件删除的 SQL 语句。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是 StockExample。
  -->
  <delete id="deleteByExample" parameterType="com.xmomen.module.stock.entity.StockExample">
    delete from cd_stock
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>

  <!--
      定义插入操作的 SQL 语句，使用选择性插入（只插入非空字段）。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是 Stock 实体类。
      useGeneratedKeys: 是否使用数据库生成的主键，这里设为 true。
      keyProperty: 主键对应的实体类属性。
      keyColumn: 主键对应的数据库列。
  -->
  <insert id="insertSelective" parameterType="com.xmomen.module.stock.entity.Stock" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    <!-- 生成 UUID 作为主键，在插入前执行 -->
    <selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">
      SELECT replace(UUID(),'-','')
    </selectKey>
    insert into cd_stock
    <trim prefix="(" suffix=")" suffixOverrides=",">
      id,
      <if test="itemId != null">
        item_id,
      </if>
      <if test="stockNum != null">
        stock_num,
      </if>
      <if test="warningNum != null">
        warning_num,
      </if>
      <if test="insertDate != null">
        insert_date,
      </if>
      <if test="insertUserId != null">
        insert_user_id,
      </if>
      <if test="updateDate != null">
        update_date,
      </if>
      <if test="updateUserId != null">
        update_user_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      #{id,jdbcType=VARCHAR},
      <if test="itemId != null">
        #{itemId,jdbcType=INTEGER},
      </if>
      <if test="stockNum != null">
        #{stockNum,jdbcType=INTEGER},
      </if>
      <if test="warningNum != null">
        #{warningNum,jdbcType=INTEGER},
      </if>
      <if test="insertDate != null">
        #{insertDate,jdbcType=TIMESTAMP},
      </if>
      <if test="insertUserId != null">
        #{insertUserId,jdbcType=INTEGER},
      </if>
      <if test="updateDate != null">
        #{updateDate,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUserId != null">
        #{updateUserId,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>

  <!--
      定义根据示例条件统计数量的 SQL 语句。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是 StockExample。
      resultType: 返回的结果类型，这里是整数类型。
  -->
  <select id="countByExample" parameterType="com.xmomen.module.stock.entity.StockExample" resultType="java.lang.Integer">
    select count(*) from cd_stock
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>

  <!--
      定义根据示例条件选择性更新的 SQL 语句。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是一个 Map，包含 record 和 example 等信息。
  -->
  <update id="updateByExampleSelective" parameterType="map">
    update cd_stock
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=VARCHAR},
      </if>
      <if test="record.itemId != null">
        item_id = #{record.itemId,jdbcType=INTEGER},
      </if>
      <if test="record.stockNum != null">
        stock_num = #{record.stockNum,jdbcType=INTEGER},
      </if>
      <if test="record.warningNum != null">
        warning_num = #{record.warningNum,jdbcType=INTEGER},
      </if>
      <if test="record.insertDate != null">
        insert_date = #{record.insertDate,jdbcType=TIMESTAMP},
      </if>
      <if test="record.insertUserId != null">
        insert_user_id = #{record.insertUserId,jdbcType=INTEGER},
      </if>
      <if test="record.updateDate != null">
        update_date = #{record.updateDate,jdbcType=TIMESTAMP},
      </if>
      <if test="record.updateUserId != null">
        update_user_id = #{record.updateUserId,jdbcType=INTEGER},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
</mapper>