<?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.jeeplus.modules.projectrecord.dao.ProjectRecordsDao">

	<sql id="projectRecordsColumns">
		a.id AS "id",
		a.create_by AS "createBy.id",
		a.create_date AS "createDate",
		a.update_by AS "updateBy.id",
		a.update_date AS "updateDate",
		a.del_flag AS "delFlag",
		a.contract_id AS "workContractInfo.id",
		a.project_id AS "projectId",
		a.project_name AS "projectName",
		a.scale_type AS "scaleType",
		a.scale_unit AS "scaleUnit",
		a.scale_quantity AS "scaleQuantity",
		a.area_id AS "area.id",
		a.project_site AS "projectSite",
		a.project_desc AS "projectDesc",
		a.remarks AS "remarks",
		a.status AS "projectStatus",
		a.process_instance_id AS "processInstanceId",
		a.company_id AS "company.id",
		a.office_id AS "office.id",
		a.alter_process_id AS "alterProcessId",
		area.name AS "area.name",
		a.province,
		a.city,
		a.area_name AS "county",
		a.project_structure AS "projectStructure",
		a.on_ground_num AS "onGroundNum",
		a.under_ground_num AS "underGroundNum",
		a.building_scale AS "buildingScale",
		a.measuring_unit AS "measuringUnit",
		a.project_use AS "projectUse",
		a.install_fees AS "installFees",
		a.building_fees AS "buildingFees",
		a.building_percent AS "buildingPercent",
		a.install_percent AS "installPercent",
		a.unit_fees AS "unitFees",
		a.building_unit_fees AS "buildingUnitFees",
		a.install_unit_fees AS "installUnitFees",
		a.total_fees AS "totalFees"
	</sql>
	
	<sql id="projectRecordsJoins">
		LEFT JOIN sys_area area ON area.id = a.area_id
	</sql>
	
    
	<select id="get" resultType="ProjectRecords" >
		SELECT
			<include refid="projectRecordsColumns"/>
        ,su.name AS "createBy.name"
        ,o.top_company AS "office.name"
        FROM project_records a
        <include refid="projectRecordsJoins"/>
        LEFT JOIN sys_user su ON su.id = a.create_by
        LEFT JOIN sys_office o ON o.id = a.office_id
		WHERE a.id = #{id}
	</select>
	
	<select id="findList" resultType="ProjectRecords" >
		SELECT
			<include refid="projectRecordsColumns"/>
		,
		wci.name AS "workContractInfo.name",
		wct.id AS "workContractInfo.client.id",
		wct.name AS "workContractInfo.client.name",
		o.top_company AS "office.name"
		FROM project_records a
		<include refid="projectRecordsJoins"/>

        <if test="leaderNameStr !=null and leaderNameStr !=''">
            LEFT JOIN work_project_user w on a.id = w.project_id
            LEFT JOIN sys_user su on w.user_id = su.id
        </if>
        LEFT JOIN work_project_user w1 on a.id = w1.project_id
		LEFT JOIN work_contract_info wci on a.contract_id = wci.id
		LEFT JOIN work_client_info wct on wci.client_id = wct.id
        LEFT JOIN sys_office o ON o.id = a.office_id
		<where>
			<if test="projectId != null and projectId != ''">
				AND a.project_id like concat('%',#{projectId},'%')
			</if>
			<if test="projectName != null and projectName != ''">
				AND a.project_name like concat(concat('%',#{projectName}),'%')
			</if>
			<if test="scaleType != null and scaleType != ''">
				AND a.scale_type = #{scaleType}
			</if>
			<if test="scaleUnit != null and scaleUnit != ''">
				AND a.scale_unit = #{scaleUnit}
			</if>
			<if test="scaleQuantity != null and scaleQuantity != ''">
				AND a.scale_quantity = #{scaleQuantity}
			</if>
			<if test="projectSite != null and projectSite != ''">
				AND a.project_site LIKE concat('%',#{projectSite},'%')
			</if>
			<if test="remarks != null and remarks != ''">
				AND a.remarks LIKE concat('%',#{remarks},'%')
			</if>
			<if test="projectDesc != null and projectDesc != ''">
				AND a.project_desc LIKE concat('%',#{projectDesc},'%')
			</if>
			<if test="area != null and area.id != null and area.id != ''">
				AND a.area_id = #{area.id}
			</if>
			<if test="workContractInfo !=null and workContractInfo.name !=null and workContractInfo.name !=''">
				AND wci.name like concat(concat('%',#{workContractInfo.name}),'%')
			</if>
			<if test="workContractInfo !=null and workContractInfo.contractNum !=null and workContractInfo.contractNum !=''">
				AND wci.contract_num like concat(concat('%',#{workContractInfo.contractNum}),'%')
			</if>
			<if test="workContractInfo !=null and workContractInfo.contractPrice !=null and workContractInfo.contractPrice !=''">
				AND wci.contract_price = #{workContractInfo.contractPrice}
			</if>
			<if test="workContractInfo !=null and workContractInfo.contractType !=null and workContractInfo.contractType !=''">
				AND wci.contract_type = #{workContractInfo.contractType}
			</if>
			<if test="workContractInfo!=null and workContractInfo.client !=null and workContractInfo.client.name !=null and workContractInfo.client.name !=''">
				AND wct.name like concat(concat('%',#{workContractInfo.client.name}),'%')
			</if>
            <if test="leaderNameStr !=null and leaderNameStr !=''">
                AND su.name like concat(concat('%',#{leaderNameStr}),'%') AND w.is_master = '1' AND w.del_flag='0'
            </if>
            <if test="projectStatus !=null">
                AND a.status = #{projectStatus}
            </if>
            <if test="beginDate !=null">
                AND a.create_date >= #{beginDate}
            </if>
            <if test="endDate !=null">
                AND a.create_date &lt; #{endDate}
            </if>
            AND  a.status != 7 AND a.del_flag = #{DEL_FLAG_NORMAL}
            <if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
               AND ((w1.user_id = #{currentUser.id} AND w1.del_flag='0' AND a.company_id = #{currentUser.company.id} )${sqlMap.dsf} )
            </if>
		</where>
            GROUP BY a.id
		<choose>
			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
				ORDER BY ${page.orderBy}
			</when>
			<otherwise>
				ORDER BY a.update_date DESC
			</otherwise>
		</choose>
	</select>

    <select id="queryCount" resultType="int" >
        SELECT count(DISTINCT a.id)
        FROM project_records a
        <if test="leaderNameStr !=null and leaderNameStr !=''">
            LEFT JOIN work_project_user w on a.id = w.project_id
            LEFT JOIN sys_user su on w.user_id = su.id
        </if>
        LEFT JOIN work_project_user w1 on a.id = w1.project_id
        <if test="workContractInfo !=null">
            LEFT JOIN work_contract_info wci on a.contract_id = wci.id
        </if>
        <if test="workContractInfo!=null and workContractInfo.client !=null and workContractInfo.client.name !=null and workContractInfo.client.name !=''">
            LEFT JOIN work_client_info wct on wci.client_id = wct.id
        </if>
        <where>
            <if test="projectId != null and projectId != ''">
                AND a.project_id like concat('%',#{projectId},'%')
            </if>
            <if test="projectName != null and projectName != ''">
                AND a.project_name like concat(concat('%',#{projectName}),'%')
            </if>
            <if test="scaleType != null and scaleType != ''">
                AND a.scale_type = #{scaleType}
            </if>
            <if test="scaleUnit != null and scaleUnit != ''">
                AND a.scale_unit = #{scaleUnit}
            </if>
            <if test="scaleQuantity != null and scaleQuantity != ''">
                AND a.scale_quantity = #{scaleQuantity}
            </if>
            <if test="projectSite != null and projectSite != ''">
                AND a.project_site LIKE concat('%',#{projectSite},'%')
            </if>
            <if test="remarks != null and remarks != ''">
                AND a.remarks LIKE concat('%',#{remarks},'%')
            </if>
            <if test="projectDesc != null and projectDesc != ''">
                AND a.project_desc LIKE concat('%',#{projectDesc},'%')
            </if>
            <if test="area != null and area.id != null and area.id != ''">
                AND a.area_id = #{area.id}
            </if>
            <if test="workContractInfo !=null and workContractInfo.name !=null and workContractInfo.name !=''">
                AND wci.name like concat(concat('%',#{workContractInfo.name}),'%')
            </if>
            <if test="workContractInfo !=null and workContractInfo.contractNum !=null and workContractInfo.contractNum !=''">
                AND wci.contract_num like concat(concat('%',#{workContractInfo.contractNum}),'%')
            </if>
            <if test="workContractInfo !=null and workContractInfo.contractPrice !=null and workContractInfo.contractPrice !=''">
                AND wci.contract_price = #{workContractInfo.contractPrice}
            </if>
            <if test="workContractInfo !=null and workContractInfo.contractType !=null and workContractInfo.contractType !=''">
                AND wci.contract_type = #{workContractInfo.contractType}
            </if>
            <if test="workContractInfo!=null and workContractInfo.client !=null and workContractInfo.client.name !=null and workContractInfo.client.name !=''">
                AND wct.name like concat(concat('%',#{workContractInfo.client.name}),'%')
            </if>
            <if test="leaderNameStr !=null and leaderNameStr !=''">
                AND su.name like concat(concat('%',#{leaderNameStr}),'%') AND w.is_master = '1' AND w.del_flag='0'
            </if>
            <if test="projectStatus !=null">
                AND a.status = #{projectStatus}
            </if>
            <if test="beginDate !=null">
                AND a.create_date >= #{beginDate}
            </if>
            <if test="endDate !=null">
                AND a.create_date &lt; #{endDate}
            </if>
            AND  a.status != 7 AND a.del_flag = #{DEL_FLAG_NORMAL}
            <if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
                AND ((w1.user_id = #{currentUser.id} AND w1.del_flag='0' AND a.company_id = #{currentUser.company.id})${sqlMap.dsf} )
            </if>
        </where>
    </select>

	<select id="findListByStatus" resultType="ProjectRecords" >
		SELECT
		<include refid="projectRecordsColumns"/>
		,
		wci.name AS "workContractInfo.name",
		wci.contract_num AS "workContractInfo.contractNum",
		wct.id AS "workContractInfo.client.id",
		wct.name AS "workContractInfo.client.name",
		o.top_company AS "office.name"
		FROM project_records a
		<include refid="projectRecordsJoins"/>
		LEFT JOIN work_project_user w on a.id = w.project_id
		LEFT JOIN work_project_user w1 on a.id = w1.project_id
        LEFT JOIN sys_user su on w.user_id = su.id
        LEFT JOIN sys_user u on a.create_by = u.id
		LEFT JOIN work_contract_info wci on a.contract_id = wci.id
		LEFT JOIN work_client_info wct on wci.client_id = wct.id
		LEFT JOIN sys_office s ON s.id = a.company_id
		LEFT JOIN sys_office o ON o.id = a.office_id
		<where>
			<if test="projectId != null and projectId != ''">
				AND a.project_id like concat('%',#{projectId},'%')
			</if>
			<if test="projectName != null and projectName != ''">
				AND a.project_name like concat(concat('%',#{projectName}),'%')
			</if>
			<if test="workContractInfo !=null and workContractInfo.name !=null and workContractInfo.name !=''">
				AND wci.name like concat(concat('%',#{workContractInfo.name}),'%')
			</if>
			<if test="workContractInfo!=null and workContractInfo.client !=null and workContractInfo.client.name !=null and workContractInfo.client.name !=''">
				AND wct.name like concat(concat('%',#{workContractInfo.client.name}),'%')
			</if>
			<if test="leaderNameStr !=null and leaderNameStr !=''">
				AND su.name like concat(concat('%',#{leaderNameStr}),'%')
			</if>
			AND w.is_master = '1' AND  a.status  = '5' AND a.del_flag='0'
			<if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
                AND ((w1.user_id = #{currentUser.id} AND w1.del_flag='0' AND (s.id = #{currentUser.company.id} or find_in_set( #{currentUser.company.id}, s.parent_ids ) ))${sqlMap.dsf} )
			</if>
            AND a.del_flag = #{DEL_FLAG_NORMAL}
		</where>
		GROUP BY a.id
		<choose>
			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
				ORDER BY ${page.orderBy}
			</when>
			<otherwise>
				ORDER BY a.update_date DESC
			</otherwise>
		</choose>
	</select>

    <select id="queryCountByStatus" resultType="int" >
        SELECT count(DISTINCT a.id)
        FROM project_records a
        LEFT JOIN work_project_user w on a.id = w.project_id
        LEFT JOIN work_project_user w1 on a.id = w1.project_id
        LEFT JOIN sys_user su on w.user_id = su.id
        LEFT JOIN sys_user u on a.create_by = u.id
        LEFT JOIN work_contract_info wci on a.contract_id = wci.id
        LEFT JOIN work_client_info wct on wci.client_id = wct.id
        LEFT JOIN sys_office s ON s.id = a.company_id
        LEFT JOIN sys_office o ON o.id = a.office_id
        <where>
            <if test="projectId != null and projectId != ''">
                AND a.project_id like concat('%',#{projectId},'%')
            </if>
            <if test="projectName != null and projectName != ''">
                AND a.project_name like concat(concat('%',#{projectName}),'%')
            </if>
            <if test="workContractInfo !=null and workContractInfo.name !=null and workContractInfo.name !=''">
                AND wci.name like concat(concat('%',#{workContractInfo.name}),'%')
            </if>
            <if test="workContractInfo!=null and workContractInfo.client !=null and workContractInfo.client.name !=null and workContractInfo.client.name !=''">
                AND wct.name like concat(concat('%',#{workContractInfo.client.name}),'%')
            </if>
            <if test="leaderNameStr !=null and leaderNameStr !=''">
                AND su.name like concat(concat('%',#{leaderNameStr}),'%')
            </if>
            AND w.is_master = '1' AND  a.status  = '5' AND a.del_flag='0'
            <if test="sqlMap.dsf !=null and sqlMap.dsf!=''">
                AND ((w1.user_id = #{currentUser.id} AND w1.del_flag='0' AND (s.id = #{currentUser.company.id} or find_in_set( #{currentUser.company.id}, s.parent_ids ) ))${sqlMap.dsf} )
            </if>
            AND a.del_flag = #{DEL_FLAG_NORMAL}
        </where>
    </select>
	
	<select id="findAllList" resultType="ProjectRecords" >
		SELECT 
			<include refid="projectRecordsColumns"/>
		FROM project_records a
		<include refid="projectRecordsJoins"/>
		<where>
			a.del_flag = #{DEL_FLAG_NORMAL}
		</where>		
		<choose>
			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
				ORDER BY ${page.orderBy}
			</when>
			<otherwise>
				ORDER BY a.update_date DESC
			</otherwise>
		</choose>
	</select>
	
	<insert id="insert">
		INSERT INTO project_records(
			id,
			create_by,
			create_date,
			update_by,
			update_date,
			del_flag,
			contract_id,
			project_id,
			project_name,
			scale_type,
			scale_unit,
			scale_quantity,
			area_id,
			project_site,
			project_desc,
			remarks,
			status,
			company_id,
		    office_id,
		    alter_process_id,
		    province,
		    city,
		    area_name,
		    project_structure,
		    on_ground_num,
		    under_ground_num,
		    building_scale,
		    measuring_unit,
		    project_use,
		    install_fees,
		    building_fees,
		    building_percent,
		    install_percent,
		    unit_fees,
		    building_unit_fees,
		    install_unit_fees,
		    total_fees
		) VALUES (
			#{id},
			#{createBy.id},
			#{createDate},
			#{updateBy.id},
			#{updateDate},
			#{delFlag},
			#{workContractInfo.id},
			#{projectId},
			#{projectName},
			#{scaleType},
			#{scaleUnit},
			#{scaleQuantity},
			#{area.id},
			#{projectSite},
			#{projectDesc},
			#{remarks},
			#{projectStatus},
			#{company.id},
			#{office.id},
			#{alterProcessId},
			#{province},
			#{city},
			#{county},
			#{projectStructure},
			#{onGroundNum},
			#{underGroundNum},
			#{buildingScale},
			#{measuringUnit},
			#{projectUse},
			#{installFees},
			#{buildingFees},
			#{buildingPercent},
			#{installPercent},
			#{unitFees},
			#{buildingUnitFees},
			#{installUnitFees},
			#{totalFees}
		)
	</insert>
	
	<update id="update">
		UPDATE project_records SET 	
			update_by = #{updateBy.id},
			update_date = #{updateDate},
			contract_id = #{workContractInfo.id},
			project_id = #{projectId},
			project_name = #{projectName},
			scale_type = #{scaleType},
			scale_unit = #{scaleUnit},
			scale_quantity = #{scaleQuantity},
			area_id = #{area.id},
			project_site = #{projectSite},
			project_desc = #{projectDesc},
			remarks = #{remarks},
			status = #{projectStatus},
			company_id = #{company.id},
			office_id = #{office.id},
			alter_process_id = #{alterProcessId},
			province = #{province},
		    city = #{city},
		    area_name = #{county},
		    project_structure =  #{projectStructure},
		    on_ground_num = #{onGroundNum},
		    under_ground_num = #{underGroundNum},
		    building_scale = #{buildingScale},
		    measuring_unit =  #{measuringUnit},
		    project_use =  #{projectUse},
		    install_fees =  #{installFees},
		    building_fees =  #{buildingFees},
		    building_percent =  #{buildingPercent},
		    install_percent =  #{installPercent},
		    unit_fees = #{unitFees},
		    building_unit_fees = #{buildingUnitFees},
		    install_unit_fees =  #{installUnitFees},
		    total_fees =  #{totalFees}
		WHERE id = #{id}
	</update>
	
	
	<!--物理删除-->
	<update id="delete">
		UPDATE project_records SET
			del_flag = #{DEL_FLAG_DELETE}
		WHERE id = #{id}
	</update>
	
	<!--逻辑删除-->
	<update id="deleteByLogic">
		UPDATE project_records SET 
			del_flag = #{DEL_FLAG_DELETE}
		WHERE id = #{id}
	</update>

	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
	<select id="findUniqueByProperty" resultType="ProjectRecords" statementType="STATEMENT">
		select
			<include refid="projectRecordsColumns"/>
		FROM project_records a
		<include refid="projectRecordsJoins"/>
		where ${propertyName} = '${value}'
	</select>

    <select id="findUseableByProjectId" resultType="ProjectRecords">
        select
        <include refid="projectRecordsColumns"/>
        FROM project_records a
        <include refid="projectRecordsJoins"/>
        WHERE a.project_id = #{projectId} and a.status != 7
    </select>

    <update id="updateProcessIdAndStatus" >
        UPDATE  project_records SET
          process_instance_id = #{processInstanceId},
          status = #{projectStatus}
        WHERE id = #{id}
    </update>
	
	<update id="updateSelectiveById">
		UPDATE  project_records 
		<set>
			<if test="updateBy!=null and updateBy.id!=null and updateBy.id!=''">
				update_by = #{updateBy.id},
			</if>
			<if test="updateDate!=null">
				update_date = #{updateDate},
			</if>
			<if test="workContractInfo!=null and workContractInfo.id!=null and workContractInfo.id!=''">
				contract_id = #{workContractInfo.id},
			</if>
			<if test="projectId!=null and projectId!=''">
				project_id = #{projectId},
			</if>
			<if test="projectName!=null and projectName!=''">
				project_name = #{projectName},
			</if>
			<if test="scaleType!=null and scaleType!=''">
				scale_type = #{scaleType},
			</if>
			<if test="scaleUnit!=null and scaleUnit!=''">
				scale_unit = #{scaleUnit},
			</if>
			<if test="scaleQuantity !=null and scaleQuantity != ''">
				scale_quantity = #{scaleQuantity},
			</if>
			<if test="area!=null and area.id!=null and area.id!=''">
				area_id = #{area.id},
			</if>
			<if test="projectSite!=null and projectSite!=''">
				project_site = #{projectSite},
			</if>
			<if test="projectDesc!=null and projectDesc!=''">
				project_desc = #{projectDesc},
			</if>
			<if test="remarks!=null and remarks!=''">
				remarks = #{remarks},
			</if>
			<if test="projectStatus !=null and projectStatus != 0">
				status = #{projectStatus},
			</if>
			<if test="company!=null and company.id!=null and company.id!=''">
				company_id = #{company.id},
			</if>
			<if test="office!=null and office.id!=null and office.id!=''">
				office_id = #{office.id},
			</if>
			<if test="alterProcessId!=null and alterProcessId!=''">
                alter_process_id = #{alterProcessId}
			</if>
		</set>
		WHERE id = #{id}
	</update>

	<update id="updateSelectiveByProjectId">
		UPDATE  project_records
		<set>
			<if test="updateBy!=null and updateBy.id!=null and updateBy.id!=''">
				update_by = #{updateBy.id},
			</if>
			<if test="updateDate!=null">
				update_date = #{updateDate},
			</if>
			<if test="workContractInfo!=null and workContractInfo.id!=null and workContractInfo.id!=''">
				contract_id = #{workContractInfo.id},
			</if>
			<if test="projectName!=null and projectName!=''">
				project_name = #{projectName},
			</if>
			<if test="scaleType!=null and scaleType!=''">
				scale_type = #{scaleType},
			</if>
			<if test="scaleUnit!=null and scaleUnit!=''">
				scale_unit = #{scaleUnit},
			</if>
			<if test="scaleQuantity !=null and scaleQuantity != ''">
				scale_quantity = #{scaleQuantity},
			</if>
			<if test="area!=null and area.id!=null and area.id!=''">
				area_id = #{area.id},
			</if>
			<if test="projectSite!=null and projectSite!=''">
				project_site = #{projectSite},
			</if>
			<if test="projectDesc!=null and projectDesc!=''">
				project_desc = #{projectDesc},
			</if>
			<if test="remarks!=null and remarks!=''">
				remarks = #{remarks},
			</if>
			<if test="projectStatus !=null and projectStatus != 0">
				status = #{projectStatus},
			</if>
			<if test="company!=null and company.id!=null and company.id!=''">
				company_id = #{company.id},
			</if>
			<if test="office!=null and office.id!=null and office.id!=''">
				office_id = #{office.id},
			</if>
			<if test="alterProcessId!=null and alterProcessId!=''">
				alter_process_id = #{alterProcessId}
			</if>
		</set>
		WHERE project_id = #{projectId}
	</update>

	<select id="findPageByRe" resultType="ProjectRecords" >
		SELECT
		<include refid="projectRecordsColumns"/>
		,
		wci.name AS "workContractInfo.name",
		wci.contract_num AS "workContractInfo.contractNum",
		wct.id AS "workContractInfo.client.id",
		wct.name AS "workContractInfo.client.name",
		o.name AS "office.name"
		FROM project_records a
		<include refid="projectRecordsJoins"/>
		LEFT JOIN work_project_user w on a.id = w.project_id
		LEFT JOIN sys_user su on w.user_id = su.id
		LEFT JOIN sys_user u on a.create_by = u.id
		LEFT JOIN work_contract_info wci on a.contract_id = wci.id
		LEFT JOIN work_client_info wct on wci.client_id = wct.id
		LEFT JOIN sys_office s ON s.id = a.company_id
		LEFT JOIN sys_office o ON o.id = a.office_id
		where a.status='5'  and a.del_flag='0' and w.user_id=#{userId} and w.del_flag='0'
		and wci.del_flag='0' and (wci.completion_status!='5' or wci.completion_status is null)
		GROUP BY a.id
		<choose>
			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
				ORDER BY ${page.orderBy}
			</when>
			<otherwise>
				ORDER BY a.update_date DESC
			</otherwise>
		</choose>
	</select>
</mapper>