<?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.dhcc.finance.main.dao.CwTjkOutcwVoucherMapper">
  	<!-- 插入凭证主表数据 -->
  <insert id="insertVoucherMainInfo" parameterType="java.util.Map">
	insert into cw_gl_voucher(PK_VOUCHER, PK_GLORGBOOK, PK_VOUCHERTY, PK_SYSTEM, VOUCHERTYPE, ABSTRACTS, 
    PK_PREPARED, PREPAREDATE, ISAUDIT, PK_AUDIT, AUDITDATE, ISSIGN, PK_SIGN, SIGNDATE, 
    VOUCHERNO, ISMODIFY, YEAR, PERIOD, TEMPSAVE, TOTALDEBIT, TOTALCREDIT, OCC_DATE,USE_STATE, 
    CREATE_USER, CREATE_TIME, UPDATE_USER, UPDATE_TIME, REMARK) 
    
    SELECT concat('HS',a.ID), #{glorgbookCode,jdbcType=VARCHAR}, '2', '02', 
    '1' AS VOUCHERTYPE, 
    CASE WHEN a.VC_IMPORT_DESCRIBE IS NULL THEN q.ABSTRACTS else a.VC_IMPORT_DESCRIBE end ABSTRACTS,
    #{userId,jdbcType=VARCHAR}, 
     <choose>
     <when test="newPreparedate != null and newPreparedate != ''">
         #{newPreparedate,jdbcType=DATE}
     </when>
     <otherwise>
         PREPAREDDATE
     </otherwise>
     </choose>,
    null,null,null,null,null,null, 
    VOUCHER_ID, '1', FISCAL_YEAR, 
    #{period,jdbcType=VARCHAR}, '0',
     q.PRIMARY_DEBIT_AMOUNT, q.PRIMARY_DEBIT_AMOUNT, PREPAREDDATE as OCC_DATE, 
     case when a.DR='0' then '1' else '0' end DR, NULL, now(), NULL, NULL, NULL 
    
   FROM cw_hs_outcw_voucher a 
   INNER JOIN ( SELECT b.L_MAINID,b.ABSTRACTS, sum( cast( PRIMARY_DEBIT_AMOUNT AS DECIMAL (20, 2))) AS PRIMARY_DEBIT_AMOUNT, sum( cast( PRIMARY_CREDIT_AMOUNT AS DECIMAL (20, 2))) AS PRIMARY_CREDIT_AMOUNT 
	     FROM cw_hs_outcw_vouchers b LEFT JOIN ( SELECT DISTINCT L_MAINID FROM cw_hs_outcw_vouchers c 
	     INNER JOIN ( SELECT distinct SUB_CODE_V FROM cw_hs_subcodemap WHERE IMPORT_FLAG="2" 
				and PRODUCT_ID in 
		     <foreach collection="list" open="(" item="item" separator="," close=")">
			  		#{item.productId,jdbcType=VARCHAR}
			</foreach>
		) f ON c.ACCOUNT_CODE = f.SUB_CODE_V ) e 
	     ON e.L_MAINID = b.L_MAINID WHERE e.L_MAINID IS NULL GROUP BY b.L_MAINID )  q
     ON a.ID = q.L_MAINID 
     where a.L_ZTBH in
	    <foreach collection="ztList" open="(" item="item" separator="," close=")">
	  		#{item,jdbcType=VARCHAR}
	  	</foreach>
		   <if test="beginDate!=null">
		  <![CDATA[ and prepareddate >= #{beginDate,jdbcType=VARCHAR} ]]>
		   </if> 
		   <if test="endDate!=null">
		    <![CDATA[and prepareddate <= #{endDate,jdbcType=VARCHAR} ]]>
		   </if>
  </insert>
<!--   插入分录表数据 -->
  <insert id="insertDetailSideInfo" parameterType="java.util.Map">
   insert into cw_gl_detail(PK_DETAIL,PK_GLORGBOOK, PK_VOUCHER,PREPAREDATE, DETAILINDEX, ABSTRACTS, PK_ACCSUBJ, SUBJCODE, SUBJNAME, PK_CURRTYPE, 
    DEBITAMOUNT, CREDITAMOUNT, LOCALDEBITAMOUNT, LOCALCREDITAMOUNT, ASSID, QTY, USE_STATE, 
    CREATE_USER, CREATE_TIME, UPDATE_USER, UPDATE_TIME, REMARK)
    
    select MD5(uuid()),#{glorgbookCode,jdbcType=VARCHAR} PK_GLORGBOOK,concat('HS',q.L_MAINID),
     <choose>
     <when test="newPreparedate != null and newPreparedate != ''">
         #{newPreparedate,jdbcType=DATE}
     </when>
     <otherwise>
         c.PREPAREDDATE
     </otherwise>
     </choose>,
    ENTRY_ID, ABSTRACTS, t.PK_ACCSUBJ,t.SUBJCODE,t.SUBJNAME,q.CURRENCY, 
    PRIMARY_DEBIT_AMOUNT,PRIMARY_CREDIT_AMOUNT, NATURAL_DEBIT_CURRENCY, NATURAL_CREDIT_CURRENCY,
     case when  q.L_ZQNM is not null then  MD5(uuid()) else null end ASSID,
     DEBIT_QUANTITY, case when DR='0' then '1' else '0' end DR,null,now(),null,null,q.L_ZQNM 
    from cw_hs_outcw_vouchers q 
    left join (select distinct L_MAINID from cw_hs_outcw_vouchers a inner join  (select distinct SUB_CODE_V from cw_hs_subcodemap where IMPORT_FLAG="2" 
         and PRODUCT_ID in 
	     <foreach collection="list" open="(" item="item" separator="," close=")">
		  		#{item.productId,jdbcType=VARCHAR}
		</foreach>
     ) b 
    on a.ACCOUNT_CODE=b.SUB_CODE_V) x on q.L_MAINID = x.L_MAINID 
    inner join (select ID ,PREPAREDDATE from cw_hs_outcw_voucher where L_ZTBH in 
    <foreach collection="ztList" open="(" item="item" separator="," close=")">
	  		#{item,jdbcType=VARCHAR}
	</foreach>
     <if test="beginDate!=null"> 
     <![CDATA[and prepareddate >=  #{beginDate,jdbcType=VARCHAR}  ]]>
     </if> 
     <if test="endDate!=null">
      <![CDATA[and prepareddate <= #{endDate,jdbcType=VARCHAR}]]>
    </if>
    ) c on c.ID=q.L_MAINID
    left join (select distinct PK_ACCSUBJ,SUBJCODE,SUBJNAME,SUB_CODE_V from  cw_hs_subcodemap t left join cw_bd_accsubj s on t.SUB_CODE=s.SUBJCODE 
    where IMPORT_FLAG = "1" and  s.PK_SUBJSCHEME=(SELECT PK_SUBJSCHEME FROM cw_bd_subjscheme WHERE ENABLESTATE='1')  and PRODUCT_ID in 
     <foreach collection="list" open="(" item="item" separator="," close=")">
	  		#{item.productId,jdbcType=VARCHAR}
	</foreach>) t on t.SUB_CODE_V=q.ACCOUNT_CODE
    where x.L_MAINID  is null 
  </insert>
    <!-- 科目对照关系表是否对应匹配 -->
  <select id="selectExistSubjectCount" parameterType="java.util.Map" resultType="java.lang.String">
  select GROUP_CONCAT(ACCOUNT_CODE ) from(
    select  distinct ACCOUNT_CODE from cw_hs_outcw_vouchers a 
    inner join (select ID from cw_hs_outcw_voucher
     where L_ZTBH in 
     <foreach collection="ztList" open="(" item="item" separator="," close=")">
	  		#{item,jdbcType=VARCHAR}
	</foreach> 
	<if test="beginDate!=null">
	<![CDATA[and PREPAREDDATE >=   #{beginDate,jdbcType=VARCHAR}]]>
	</if>
	<if test="endDate!=null">
	<![CDATA[and PREPAREDDATE <= #{endDate,jdbcType=VARCHAR}]]>
	</if>
	)b on a.L_MAINID=b.ID
     where a.ACCOUNT_CODE not in (select distinct SUB_CODE_V from cw_hs_subcodemap where PRODUCT_ID in
      <foreach collection="list" open="(" item="item" separator="," close=")">
	  		#{item.productId,jdbcType=VARCHAR}
	</foreach>)
	)a
  </select>
  <!-- 查询对照关系是否存在非末级科目 -->
  <select id="selectIsFinalstage" parameterType="java.util.Map" resultType="java.lang.String">
    select GROUP_CONCAT(a.SUB_CODE ) from (
     select  distinct  SUB_CODE from cw_hs_subcodemap where PRODUCT_ID in 
     <foreach collection="list" open="(" item="item" separator="," close=")">
	  		#{item.productId,jdbcType=VARCHAR}
	 </foreach> 
	 and SUB_CODE_V in(       
         select distinct a.ACCOUNT_CODE  from cw_hs_outcw_vouchers a 
         inner join (select ID from cw_hs_outcw_voucher
         where L_ZTBH   in 
	     <foreach collection="ztList" open="(" item="item" separator="," close=")">
		  		#{item,jdbcType=VARCHAR}
		</foreach> 
		<![CDATA[and PREPAREDDATE >=   #{beginDate,jdbcType=VARCHAR} and PREPAREDDATE <= #{endDate,jdbcType=VARCHAR}]]>
		)b  on a.L_MAINID=b.ID  
		 )
	 )a left join 
	 (
	        select  SUBJCODE, FINALSTAGE from   cw_bd_accsubj  where USE_STATE='1' 
	        and PK_SUBJSCHEME =(select  PK_SUBJSCHEME from cw_bd_glorgbook  where PK_GLORGBOOK=#{glorgbookCode,jdbcType=VARCHAR})
	 )b
	 on a.SUB_CODE=b.SUBJCODE
	 where <![CDATA[ b.FINALSTAGE  <> '1' or b.FINALSTAGE is null]]>
  </select>
 
  <!-- 插入辅助项 -->
  <insert id="insertForFreevalue" parameterType="java.util.Map">
	insert into cw_gl_freevalue (PK_FREEVALUE, ASSID, CHECKTYPE, CHECKVALUE, VALUECODE, VALUENAME, DEBITAMOUNT, CREDITAMOUNT,PK_SYSTEM, USE_STATE,CREATE_TIME)
	select  a.PK_FREEVALUE,a.ASSID ,a.CHECKTYPE,b.L_ZQNM, b.L_ZQNM,concat(b.VC_ZQDM, '_', b.VC_ZQJC),a.LOCALDEBITAMOUNT,a.LOCALCREDITAMOUNT,'02' PK_SYSTEM ,'1' USE_STATE,now() CREATE_TIME from
	(
      select  MD5(uuid())  PK_FREEVALUE ,ASSID,'2019032120300101100012'  as CHECKTYPE ,REMARK  as CHECKVALUE,LOCALDEBITAMOUNT,LOCALCREDITAMOUNT from cw_gl_detail  d
      inner join ( select  PK_VOUCHER  from cw_gl_voucher      where pk_glorgbook=#{glorgbookCode,jdbcType=VARCHAR} and
      <![CDATA[  OCC_DATE>=#{beginDate,jdbcType=VARCHAR} and OCC_DATE<=#{endDate,jdbcType=VARCHAR} and pk_system='02']]>  )c on c.PK_VOUCHER=d.PK_VOUCHER
      where  d.REMARK is not null
	)a
 	left join cw_hs_outcw_zqxx b on a.CHECKVALUE=L_ZQNM  
  </insert>
    <!-- 删除凭证-->
  <delete id="deleteForVoucher" parameterType="java.util.Map">
    delete from   cw_gl_voucher where pk_glorgbook=#{glorgbookCode,jdbcType=VARCHAR} and  PERIOD = #{period,jdbcType=VARCHAR} and
     <![CDATA[  OCC_DATE>=#{beginDate,jdbcType=VARCHAR} and OCC_DATE<=#{endDate,jdbcType=VARCHAR} and pk_system='02']]>
  </delete>
    <!-- 删除分录 -->
  <delete id="deleteForDetail" parameterType="java.util.Map">
    delete a from  cw_gl_detail a inner join (select pk_voucher from cw_gl_voucher where pk_glorgbook=#{glorgbookCode,jdbcType=VARCHAR} and PERIOD = #{period,jdbcType=VARCHAR} and
   <![CDATA[  OCC_DATE>=#{beginDate,jdbcType=VARCHAR} and OCC_DATE<=#{endDate,jdbcType=VARCHAR} and pk_system='02']]>) b
    on a.pk_voucher=b.pk_voucher
  </delete>
   <!-- 删除辅助项 -->
  <delete id="deleteForFreevalue" parameterType="java.util.Map">
     delete  a from  cw_gl_freevalue  a inner join (   select assid from  cw_gl_detail where pk_voucher in(select pk_voucher from cw_gl_voucher where pk_glorgbook=#{glorgbookCode,jdbcType=VARCHAR} and
     PERIOD = #{period,jdbcType=VARCHAR} and <![CDATA[  OCC_DATE>=#{beginDate,jdbcType=VARCHAR} and OCC_DATE<=#{endDate,jdbcType=VARCHAR} and pk_system='02']]>)) b
    on a.assid =b.assid
  </delete>
  <select id="countExistThisBatch" parameterType="java.lang.String" resultType="java.lang.Long">
   <![CDATA[select count(1) from cw_gl_voucher   where   PK_GLORGBOOK=#{pkGlorgbook,jdbcType=VARCHAR} and  pk_system='02' 
   and OCC_DATE>=#{beginDate,jdbcType=VARCHAR}  and OCC_DATE <=#{endDate,jdbcType=VARCHAR}  and USE_STATE='1' ]]>
  </select>
</mapper>