<?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="cn.ezhizao.project.system.mapper.SysDeptMapper">

	<resultMap type="cn.ezhizao.project.system.domain.SysDept" id="SysDeptResult">
		<id     property="deptId"     column="dept_id"     />
		<result property="parentId"   column="parent_id"   />
		<result property="ancestors"  column="ancestors"   />
		<result property="deptName"   column="dept_name"   />
		<result property="deptCode"   column="dept_code"   />
		<result property="orderNum"   column="order_num"   />
		<result property="phone"      column="phone"       />
		<result property="email"      column="email"       />
		<result property="status"     column="status"      />
		<result property="delFlag"    column="del_flag"    />
		<result property="parentName" column="parent_name" />
		<result property="createBy"   column="create_by"   />
		<result property="createTime" column="create_time" />
		<result property="updateBy"   column="update_by"   />
		<result property="updateTime" column="update_time" />
		<result property="isWorkSection" column="is_work_section"/>
		<result property="type" column="type" />
	</resultMap>


	<sql id="selectDeptVo">
		select d.type,d.is_work_section, d.dept_id,d.tenant_id,d.parent_id, d.ancestors, d.dept_name,d.dept_code, d.order_num, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time, d.workshop_id
		from sys_dept d
	</sql>

	<select id="getDeptOptions" parameterType="Long" resultMap="SysDeptResult">
		SELECT dept_name as Label,dept_id as `Value`,dept_code  FROM sys_dept where del_flag = '0'
		   and is_work_section = 1 and dept_id in
		<foreach collection="list" item="ids" open="(" separator="," close=")">
			#{ids}
		</foreach>
	</select>

	<select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
		<include refid="selectDeptVo"/>
		where d.del_flag = '0'
		<if test="deptId != null and deptId != 0">
			AND dept_id = #{deptId}
		</if>
		<if test="tenantId != null and tenantId != 0">
			AND tenant_id = #{tenantId}
		</if>
		<if test="isWorkSection !=null and isWorkSection!=''">
			AND is_work_section=#{isWorkSection}
		</if>
		<if test="parentId != null and parentId != 0">
			AND parent_id = #{parentId}
		</if>
		<if test="deptName != null and deptName != ''">
			AND dept_name like concat('%', #{deptName}, '%')
		</if>
		<if test="deptCode != null and deptCode != ''">
			AND dept_code like concat('%', #{deptCode}, '%')
		</if>
		<if test="status != null and status != ''">
			AND status = #{status}
		</if>
		<if test="type != null ">
			AND type = #{type}
		</if>
		<if test="userId != null">
			and exists (select 1 from sys_dept_user du where du.dept_id = d.dept_id and du.user_id = #{userId})
		</if>
		<!-- 数据范围过滤 -->
		${params.dataScope}
		order by parent_id, order_num
	</select>

	<select id="selectDeptListByTechnologyWasteRecyclingId" resultType="cn.ezhizao.project.system.domain.SysDept">
		SELECT DISTINCT dp.dept_id, d.dept_name, d.workshop_id,d.is_sort_packaging
		FROM sys_dept d
				 INNER JOIN biz_dept_process dp ON d.dept_id = dp.dept_id
				 INNER JOIN
			 (SELECT DISTINCT btwrd.process_id
			  FROM biz_lot_technological_process_detail btwrd
			  WHERE btwrd.lot_technological_process_id = #{lotTechnologicalProcessId}

		<if test="processStepNumber != null"> and btwrd.process_step_number &gt; #{processStepNumber}</if>
		) AS m ON m.process_id = dp.process_id AND d.is_work_section = 1 AND d.tenant_id = #{tenantId} and d.del_flag = '0' and d.dept_code != '170000'
	</select>

	<select id="selectDeptListByPlanDetailsId" resultType="cn.ezhizao.project.system.domain.SysDept">
		SELECT DISTINCT dp.dept_id, d.dept_name, d.workshop_id,d.is_sort_packaging
		FROM sys_dept d
				 INNER JOIN biz_dept_process dp ON d.dept_id = dp.dept_id
				 INNER JOIN
			 (SELECT DISTINCT btpd.process_id
			  FROM biz_technological_process_detail btpd
					   INNER JOIN biz_production_plan_detail bppd
								  ON bppd.technological_process_id = btpd.technological_process_id
			  WHERE bppd.id = #{productionPlanDetailId} and btpd.tenant_id !=9
		<if test="processStepNumber != null"> and btpd.process_step_number &gt; #{processStepNumber}</if>
		) AS m ON m.process_id = dp.process_id AND d.is_work_section = 1 AND d.tenant_id = #{tenantId} and d.del_flag = '0' and d.dept_code != '170000'
	</select>
	<select id="getWXDeptInfo" resultType="cn.ezhizao.project.system.domain.SysDept">
		select * from sys_dept where del_flag = '0' and dept_code = '170000'
	</select>

	<select id="getDeptList" parameterType="SysDept" resultMap="SysDeptResult">
		SELECT dept_name as Label,dept_id as `Value` FROM sys_dept d where del_flag = '0'
<!--		And type = #{type}-->

		<if test="type != null ">
			AND d.type = #{type}
		</if>
		<if test="deptName != null and deptName != ''">
			AND d.dept_name like concat('%', #{deptName}, '%')
		</if>
		<if test="deptCode != null and deptCode != ''">
			AND d.dept_code like concat('%', #{deptCode}, '%')
		</if>
		<if test="userId != null">
			and exists (select 1 from sys_dept_user du where du.dept_id = d.dept_id and du.user_id = #{userId})
		</if>
	</select>
	<select id="selectDeptListByRoleId" resultType="Long">
		select d.dept_id
		from sys_dept d
		left join sys_role_dept rd on d.dept_id = rd.dept_id
		where rd.role_id = #{roleId}
		<if test="deptCheckStrictly">
			and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
		</if>
		order by d.parent_id, d.order_num
	</select>

	<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
		select d.type,d.dept_id,d.is_work_section,d.tenant_id,d.parent_id, d.ancestors, d.dept_name,d.dept_code, d.order_num, d.phone, d.email, d.status,d.auto_allocation,d.supplier_id,d.is_outsourcing,
			   (select dept_name from sys_dept where dept_id = d.parent_id) parent_name,
		d.dept_key
		from sys_dept d
		where d.dept_id = #{deptId}
	</select>


	<select id="specialSelectDeptById" parameterType="Long" resultMap="SysDeptResult">
		select
			d.type,
			d.dept_id,
			d.tenant_id,
			d.parent_id,
			d.workshop_id,
			d.ancestors,
			d.dept_name,
			d.dept_code,
			d.dept_key,
			d.order_num,
			d.manager,
			d.phone,
			d.email,
			d.status,
			d.auto_allocation,
			d.equiment_flag,
			d.auto_unbind,
			d.has_quick,
			(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
		from sys_dept d
		where d.dept_id = #{deptId}
	</select>

	<select id="selectDeptByCode" resultMap="SysDeptResult">
		select *
		from sys_dept d
		where d.dept_code= #{deptCode}
	</select>



	<select id="checkDeptExistUser" parameterType="Long" resultType="int">
		select count(1) from sys_dept_user where dept_id = #{deptId} and deleted = 0
	</select>

	<select id="hasChildByDeptId" parameterType="Long" resultType="int">
		select count(1) from sys_dept
		where del_flag = '0' and parent_id = #{deptId} limit 1
	</select>

	<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
		select * from sys_dept where find_in_set(#{deptId}, ancestors)
	</select>

	<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
		select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
	</select>

	<select id="checkDeptNameUnique" resultMap="SysDeptResult">
		<include refid="selectDeptVo"/>
		where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
	</select>

	<select id="checkDeptCodeUnique" resultMap="SysDeptResult">
		<include refid="selectDeptVo"/>
		where dept_code=#{deptCode} and parent_id = #{parentId} and del_flag = '0' limit 1
	</select>

	<select id="getRootParentId" parameterType="Long">
		SELECT dept_id FROM sys_dept where parent_id = 0 AND dept_id IN
		<foreach collection="array" item="deptId" open="(" separator="," close=")">
			#{deptId}
		</foreach>
	</select>


	<insert id="insertDept" parameterType="SysDept">
		insert into sys_dept(
		<if test="deptId != null and deptId != 0">dept_id,</if>
		<if test="tenantId != null and tenantId != 0">tenant_id,</if>
		<if test="parentId != null and parentId != 0">parent_id,</if>
		<if test="deptName != null and deptName != ''">dept_name,</if>
		<if test="deptCode != null and deptCode != ''">dept_code,</if>
		<if test="ancestors != null and ancestors != ''">ancestors,</if>
		<if test="orderNum != null">order_num,</if>
		<if test="phone != null and phone != ''">phone,</if>
		<if test="email != null and email != ''">email,</if>
		<if test="status != null">status,</if>
		<if test="createBy != null and createBy != ''">create_by,</if>
		<if test="type != null ">type,</if>
		create_time
		)values(
		<if test="deptId != null and deptId != 0">#{deptId},</if>
		<if test="tenantId != null and tenantId != 0">#{tenantId},</if>
		<if test="parentId != null and parentId != 0">#{parentId},</if>
		<if test="deptName != null and deptName != ''">#{deptName},</if>
		<if test="deptCode != null and deptCode != ''">#{deptCode},</if>
		<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
		<if test="orderNum != null">#{orderNum},</if>
		<if test="phone != null and phone != ''">#{phone},</if>
		<if test="email != null and email != ''">#{email},</if>
		<if test="status != null">#{status},</if>
		<if test="createBy != null and createBy != ''">#{createBy},</if>
		<if test="type != null">#{type},</if>
		sysdate()
		)
	</insert>

	<update id="updateDept" parameterType="SysDept">
		update sys_dept
		<set>
			<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
			<if test="tenantId != null and tenantId != 0">tenant_id = #{tenantId},</if>
			<if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
			<if test="deptCode != null and deptCode != ''">dept_code = #{deptCode},</if>
			<if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
		    <if test="isWorkSection!= null and isWorkSection!= ''">is_work_section = #{isWorkSection},</if>
			<if test="orderNum != null">order_num = #{orderNum},</if>
			<if test="phone != null">phone = #{phone},</if>
			<if test="email != null">email = #{email},</if>
			<if test="status != null and status != ''">status = #{status},</if>
			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
			<if test="type != null">type = #{type},</if>
			update_time = sysdate()
		</set>
		where dept_id = #{deptId}
	</update>

	<update id="updateDeptChildren" parameterType="java.util.List">
		update sys_dept set ancestors =
		<foreach collection="depts" item="item" index="index"
				 separator=" " open="case dept_id" close="end">
			when #{item.deptId} then #{item.ancestors}
		</foreach>
		where dept_id in
		<foreach collection="depts" item="item" index="index"
				 separator="," open="(" close=")">
			#{item.deptId}
		</foreach>
	</update>

	<update id="updateDeptStatusNormal" parameterType="Long">
		update sys_dept set status = '0' where dept_id in
		<foreach collection="array" item="deptId" open="(" separator="," close=")">
			#{deptId}
		</foreach>
	</update>



	<delete id="deleteDeptById" parameterType="Long">
		update sys_dept set del_flag = '2' where dept_id = #{deptId}
	</delete>
</mapper>
