<?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.cool.store.mapper.StoreMapper">
    <resultMap id="BaseResultMap" type="com.cool.store.entity.StoreDO">
        <!--
          WARNING - @mbggenerated
        -->
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="store_id" property="storeId" jdbcType="VARCHAR"/>
        <result column="store_name" property="storeName" jdbcType="VARCHAR"/>
        <result column="store_num" property="storeNum" jdbcType="VARCHAR"/>
        <result column="store_address" property="storeAddress" jdbcType="VARCHAR"/>
        <result column="location_address" property="locationAddress" jdbcType="VARCHAR"/>
        <result column="is_lock" property="isLock" jdbcType="CHAR"/>
        <result column="longitude_latitude" property="longitudeLatitude" jdbcType="VARCHAR"/>
        <result column="longitude" property="longitude" jdbcType="VARCHAR"/>
        <result column="latitude" property="latitude" jdbcType="VARCHAR"/>
        <result column="is_delete" property="isDelete" jdbcType="CHAR"/>
        <result column="telephone" property="telephone" jdbcType="VARCHAR"/>
        <result column="business_hours" property="businessHours" jdbcType="VARCHAR"/>
        <result column="store_acreage" property="storeAcreage" jdbcType="VARCHAR"/>
        <result column="store_bandwidth" property="storeBandwidth" jdbcType="VARCHAR"/>
        <result column="create_time" property="createTime" jdbcType="BIGINT"/>
        <result column="create_name" property="createName" jdbcType="VARCHAR"/>
        <result column="create_user" property="createUser" jdbcType="VARCHAR"/>
        <result column="update_time" property="updateTime" jdbcType="BIGINT"/>
        <result column="update_name" property="updateName" jdbcType="VARCHAR"/>
        <result column="update_user" property="updateUser" jdbcType="VARCHAR"/>
        <result column="remark" property="remark" jdbcType="LONGVARCHAR"/>
        <result column="is_device" property="isDevice" jdbcType="VARCHAR"/>
        <result column="aliyun_corp_id" property="aliyunCorpId" jdbcType="VARCHAR"/>
        <result column="vds_corp_id" property="vdsCorpId" jdbcType="VARCHAR"/>
        <result column="syn_ding_dept_id" property="synDingDeptId" jdbcType="VARCHAR"/>
        <result column="region_path" property="regionPath" jdbcType="VARCHAR"/>
        <result column="has_camera" property="hasCamera" jdbcType="TINYINT"/>
        <result column="region_id" property="regionId" jdbcType="VARCHAR"/>
        <result column="store_status" property="storeStatus" jdbcType="VARCHAR"/>
        <result column="open_date" property="openDate" jdbcType="DATE"/>
        <result column="monthly_rent" property="monthlyRent"/>
        <result column="monthly_personnel_salary" property="monthlyPersonnelSalary"/>
        <result column="monthly_other_expenses" property="monthlyOtherExpenses"/>
        <result column="unified_management" property="unifiedManagement" jdbcType="TINYINT"/>
        <result column="join_model" property="joinModel" jdbcType="TINYINT"/>
        <result column="join_brand" property="joinBrand" jdbcType="TINYINT"/>
        <result column="store_type" property="storeType" jdbcType="TINYINT"/>
        <result column="mini_program_order_store_name" property="miniProgramOrderStoreName"/>
        <result column="is_iot" property="isIot" jdbcType="TINYINT"/>
        <result column="addressee_name" property="addresseeName" jdbcType="VARCHAR"/>
        <result column="addressee_mobile" property="addresseeMobile" jdbcType="VARCHAR"/>
        <result column="addressee_area" property="addresseeArea" jdbcType="VARCHAR"/>
        <result column="addressee_address" property="addresseeAddress" jdbcType="VARCHAR"/>
        <result column="branch" property="branch" jdbcType="TINYINT"/>
    </resultMap>

    <select id="getByStoreId" resultMap="BaseResultMap">
        select *
        from store_${enterpriseId}
        where store_id = #{storeId}
    </select>

    <select id="getEffectiveStoreByStoreIds" resultMap="BaseResultMap">
        select *
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="storeIds != null">
            <foreach collection="storeIds" item="item" separator="," open="and store_id in (" close=")">
                #{item}
            </foreach>
        </if>
    </select>

    <select id="listStoreByRegionId" resultMap="BaseResultMap">
        select *
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="regionId != null and regionId!= '' ">
            and region_path like concat('%/', #{regionId}, '/%')
        </if>
    </select>
    <select id="getStoreNumByStoreIds" resultType="java.lang.String">
        select store_num
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="storeIds != null">
            <foreach collection="storeIds" item="item" separator="," open="and store_id in (" close=")">
                #{item}
            </foreach>
        </if>
    </select>
    <select id="getByStoreNum" resultMap="BaseResultMap">
        select *
        from store_${enterpriseId}
        where store_num = #{storeNum} and is_delete = 'effective'
    </select>

    <select id="listByMobile" resultMap="BaseResultMap">
        select a.*
        from store_${enterpriseId} a left join store_master_signer_info_${enterpriseId} b on a.store_id = b.store_id
        <where>
            and a.is_delete = 'effective'
            <if test="mobile!=null and mobile !=''">
                and ( b.signer1_mobile = #{mobile} or b.signer2_mobile = #{mobile})
            </if>
        </where>
        union
        select *
        from store_${enterpriseId}
        <where>
            and is_delete = 'effective'
            <if test="mobile!=null and mobile !=''">
                and `extend_field` like concat('%', #{mobile}, '%')
            </if>
        </where>
    </select>

    <select id="getSubStoreByRegionIdsAndMobile" resultType="com.cool.store.response.MiniShopsResponse">
        <choose>
            <!-- 情况1：regionIdList不为空，使用UNION优化 -->
            <when test="regionIdList != null and regionIdList.size > 0">
                SELECT store_id as storeId, store_name as shopName, store_num as shopCode, store_address as detailAddress
                FROM store_${enterpriseId} a
                WHERE a.is_delete = 'effective' and a.store_status != 'closed'
                <if test="storeName!=null and storeName!=''">
                    AND a.store_name LIKE CONCAT('%', #{storeName}, '%')
                </if>
                <if test="storeNum!=null and storeNum!=''">
                    AND a.store_num = #{storeNum}
                </if>
                AND (
                <foreach collection="regionIdList" item="regionId" separator=" OR ">
                    a.region_path LIKE CONCAT('%/', #{regionId}, '/%')
                </foreach>
                )

                UNION

                SELECT a.store_id as storeId, a.store_name as shopName, a.store_num as shopCode, a.store_address as detailAddress
                FROM store_${enterpriseId} a
                INNER JOIN store_master_signer_info_${enterpriseId} b ON a.store_id = b.store_id
                WHERE a.is_delete = 'effective' and a.store_status != 'closed'
                <if test="storeName!=null and storeName!=''">
                    AND a.store_name LIKE CONCAT('%', #{storeName}, '%')
                </if>
                <if test="storeNum!=null and storeNum!=''">
                    AND a.store_num = #{storeNum}
                </if>
                AND (b.signer1_mobile = #{mobile} OR b.signer2_mobile = #{mobile})
            </when>

            <!-- 情况2：regionIdList为空，直接查询关联表 -->
            <otherwise>
                SELECT a.store_id as storeId, a.store_name as shopName, a.store_num as shopCode, a.store_address as detailAddress
                FROM store_${enterpriseId} a
                INNER JOIN store_master_signer_info_${enterpriseId} b ON a.store_id = b.store_id
                WHERE a.is_delete = 'effective' and a.store_status != 'closed'
                <if test="storeName!=null and storeName!=''">
                    AND a.store_name LIKE CONCAT('%', #{storeName}, '%')
                </if>
                <if test="storeNum!=null and storeNum!=''">
                    AND a.store_num = #{storeNum}
                </if>
                AND (b.signer1_mobile = #{mobile} OR b.signer2_mobile = #{mobile})
            </otherwise>
        </choose>
    </select>


    <select id="list" resultMap="BaseResultMap">
        select *
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="isIot != null">
            AND is_iot = #{isIot}
        </if>
        order by id asc
    </select>

    <select id="getStoreAreaList" resultType="com.cool.store.dto.store.StoreAreaDTO">
        select
        a.store_num as storeCode,
        a.store_name as storeName,
        a.store_id as storeId,
        a.region_path as regionPath,
        a.region_id as regionId,
        a.region_id as areaId,
        a.store_status as storeStatus
        FROM store_${enterpriseId} a
        <where>
            a.is_delete='effective'
            <if test="storeIds!=null and storeIds.size>0">
                <foreach collection="storeIds" item="storeId" index="index" separator="," open="and  a.store_id in("
                         close=")">
                    #{storeId}
                </foreach>
            </if>
        </where>

    </select>
    <select id="getStoreNumByStoreCodes"  resultMap="BaseResultMap">
        select  *
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="storeCodeIds != null">
            <foreach collection="storeCodeIds" item="item" separator="," open="and store_num in (" close=")">
                #{item}
            </foreach>
        </if>
    </select>

    <select id="listStoreByRegionPathList" resultType="com.cool.store.dto.store.StoreAreaDTO">
        select
        store_name as storeName,
        store_id as storeId,
        region_path as regionPath,
        region_id as regionId,
        region_id as areaId
        from store_${enterpriseId}
        where is_delete = 'effective'
        <if test="regionPathList != null and regionPathList.size >0 ">
            <foreach collection="regionPathList" item="regionPath" separator=" or " open="and (" close=" )">
                region_path like concat(#{regionPath}, '%')
            </foreach>
        </if>
    </select>

    <insert id="batchInsertOrUpdateOrderTime">
        INSERT INTO store_extend_info_${enterpriseId}
        <trim prefix="(" suffix=")" suffixOverrides=",">
            store_id,
            latest_order_time
        </trim>
        VALUES
        <foreach collection="dtoList" item="dto" separator=",">
            <trim prefix="(" suffix=")" suffixOverrides=",">
                #{dto.storeId},
                #{dto.latestOrderTime}
            </trim>
        </foreach>
        ON DUPLICATE KEY UPDATE
        <trim suffixOverrides=",">
            store_id = VALUES(store_id),
            latest_order_time = VALUES(latest_order_time),
            update_time = now(),
        </trim>
    </insert>

    <select id="getAllStoreIdAndNum" resultType="com.cool.store.entity.StoreDO">
        SELECT store_id, store_num
        FROM store_${enterpriseId}
        WHERE is_delete = 'effective'
        <if test="storeStatus != null and !storeStatus.isEmpty()">
            AND store_status IN
            <foreach item="item" collection="storeStatus" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
    </select>
</mapper>
