diff --git a/include/traits/tdata.class.php b/include/traits/tdata.class.php index aa449e6..018d783 100644 --- a/include/traits/tdata.class.php +++ b/include/traits/tdata.class.php @@ -20,7 +20,33 @@ trait tdata { private $skip_field = []; // 场所统计查询内的公用where private $villages_where = ''; + // 根据社区类型和地图选择判断小区的ID + private $village_whereid = ''; + // 计算社区类型,地图选择,返回被选中的小区ID + private function fun_sqlk_vid(){ + global $_M, $_YW; + $idArr = $vidArr = []; + if (is_array($this->form['vtype'])) { + $vtype = arrayto_string($this->form['vtype'],','); + $vid = $this->tsql->table('village')->qfield('id')->where("v_type IN({$vtype})")->all(); + $idArr = array_column($vid,'id'); + if(count($idArr) == 0) $idArr = [-1]; + } + if($this->form['v_id']){ + $vidArr = stringto_array($this->form['v_id'],','); + // 取社区类型和地图筛选的交集,重叠ID,社区类型没有操作则直接按照地图筛选结果 + // $idArr = count($idArr) > 0?array_intersect($vidArr,$idArr):$vidArr; + if(count($idArr) > 0){ + $idArr = array_intersect($vidArr,$idArr); + // 如果交集为空,则确实通过此条件进行了筛选,就要通知SQL没有任何值满足当前条件,将ID设置为0,肯定查找不到 + if(count($idArr) == 0) $idArr = [-1]; + }else{ + $idArr = $vidArr; + } + } + return $idArr; + } //表名 public function td_sqlk() { global $_M, $_YW; @@ -29,16 +55,36 @@ trait tdata { switch ($this->tname) { case 'applan': //判断是否可选的依据 - if (!empty($this->form['slid'])) - $where = " AND nla.id != '{$this->form['slid']}' "; - + if (!empty($this->form['slid'])) $where = " AND nla.id != '{$this->form['slid']}' "; + + $ason = ''; + // 计算是否区分广告位,不考虑导出 + if (is_array($this->form['e_aps'])) { + $veaps = parent::strchange(array_filter($this->form['e_aps'])); + $this->villages_where = " nel.e_aps IN({$veaps}) "; + $ason .= " {$this->villages_where} AND "; + } + + // 根据小区单个ID + if($this->form['e_vid']){ + $ason .= " nel.e_vid = '{$this->form['e_vid']}' AND "; + } + + // 社区类型 不考虑导出 + $idArr = self::fun_sqlk_vid(); + // 通过ID筛选掉不需要的 + if(count($idArr) > 0){ + $this->village_whereid = arrayto_string(array_unique($idArr),','); + $ason .= " nel.e_vid IN({$this->village_whereid}) AND "; + } + //表 $sqlk = " {$_YW['k']['elevator']} AS el " - . "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nowe_number,ANY_VALUE( nla.id ) AS nowid,ANY_VALUE( nla.l_title ) AS nowtitle,ANY_VALUE( nla.l_starttime ) AS nowstime,ANY_VALUE( nla.l_endtime ) AS nowetime,if(NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) OR nla.l_starttime > '{$curdate}',1,0) AS estate FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) AND nla.id IS NOT NULL ORDER BY nowstime ASC ) eala GROUP BY nowe_number ) ala ON ala.nowe_number = el.e_number " - . "LEFT JOIN (SELECT nel.e_number AS ende_number, max( nla.l_endtime ) AS endtime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.id IS NOT NULL GROUP BY ende_number) cla ON cla.ende_number = el.e_number " - . "LEFT JOIN ( SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nexte_number,ANY_VALUE( nla.id ) AS nextid,ANY_VALUE( nla.l_title ) AS nexttitle,ANY_VALUE( nla.l_starttime ) AS nextstime,ANY_VALUE( nla.l_endtime ) AS nextetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_starttime > '{$curdate}' AND nla.id IS NOT NULL ORDER BY nextstime ASC ) eala GROUP BY nexte_number ) bla ON bla.nexte_number = el.e_number " - . "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nend_number,ANY_VALUE( nla.id ) AS endid,ANY_VALUE( nla.l_title ) AS endtitle,ANY_VALUE( nla.l_starttime ) AS endstime,ANY_VALUE( nla.l_endtime ) AS endetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_endtime < '{$curdate}' AND nla.id IS NOT NULL ORDER BY endetime DESC ) eala GROUP BY nend_number ) dla ON dla.nend_number = el.e_number " - . "LEFT JOIN (SELECT nel.e_number AS lde_number,count(nel.e_number) AS lanum FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE NOT ( nla.l_endtime < '{$this->form['l_starttime']}' OR nla.l_starttime > '{$this->form['l_endtime']}' ) {$where} GROUP BY lde_number) AS ela ON ela.lde_number = el.e_number "; + . "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nowe_number,ANY_VALUE( nla.id ) AS nowid,ANY_VALUE( nla.l_title ) AS nowtitle,ANY_VALUE( nla.l_starttime ) AS nowstime,ANY_VALUE( nla.l_endtime ) AS nowetime,if(NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) OR nla.l_starttime > '{$curdate}',1,0) AS estate FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE {$ason} NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) AND nla.id IS NOT NULL ORDER BY nowstime ASC ) eala GROUP BY nowe_number ) ala ON ala.nowe_number = el.e_number " + . "LEFT JOIN (SELECT nel.e_number AS ende_number, max( nla.l_endtime ) AS endtime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE {$ason} nla.id IS NOT NULL GROUP BY ende_number) cla ON cla.ende_number = el.e_number " + . "LEFT JOIN ( SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nexte_number,ANY_VALUE( nla.id ) AS nextid,ANY_VALUE( nla.l_title ) AS nexttitle,ANY_VALUE( nla.l_starttime ) AS nextstime,ANY_VALUE( nla.l_endtime ) AS nextetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE {$ason} nla.l_starttime > '{$curdate}' AND nla.id IS NOT NULL ORDER BY nextstime ASC ) eala GROUP BY nexte_number ) bla ON bla.nexte_number = el.e_number " + . "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nend_number,ANY_VALUE( nla.id ) AS endid,ANY_VALUE( nla.l_title ) AS endtitle,ANY_VALUE( nla.l_starttime ) AS endstime,ANY_VALUE( nla.l_endtime ) AS endetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE {$ason} nla.l_endtime < '{$curdate}' AND nla.id IS NOT NULL ORDER BY endetime DESC ) eala GROUP BY nend_number ) dla ON dla.nend_number = el.e_number " + . "LEFT JOIN (SELECT nel.e_number AS lde_number,count(nel.e_number) AS lanum FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE {$ason} NOT ( nla.l_endtime < '{$this->form['l_starttime']}' OR nla.l_starttime > '{$this->form['l_endtime']}' ) {$where} GROUP BY lde_number) AS ela ON ela.lde_number = el.e_number "; break; case 'elevators': $sqlk = " {$_YW['k']['elevator']} AS el LEFT JOIN {$_YW['k']['launch']} AS la ON find_in_set( el.e_number, la.l_enumber ) " @@ -70,13 +116,22 @@ trait tdata { // 计算是否区分广告位 // 检测是否通过JS传递的广告位参数,也就是导出 - if (isset($this->form['jsadd_veaps'])) - $this->form['veaps'] = stringto_array($this->form['jsadd_veaps'], ','); + if (isset($this->form['jsadd_veaps'])) $this->form['veaps'] = stringto_array($this->form['jsadd_veaps'], ','); if (is_array($this->form['veaps'])) { $veaps = parent::strchange(array_filter($this->form['veaps'])); - $this->villages_where = " el.e_aps IN($veaps) "; + $this->villages_where = " el.e_aps IN({$veaps}) "; $son .= " {$this->villages_where} AND "; } + + // 社区类型 + // 先查询出需要的ID + if (isset($this->form['jsadd_vtype'])) $this->form['vtype'] = stringto_array($this->form['jsadd_vtype'], ','); + $idArr = self::fun_sqlk_vid(); + // 通过ID筛选掉不需要的 + if(count($idArr) > 0){ + $this->village_whereid = arrayto_string(array_unique($idArr),','); + $son .= " el.e_vid IN({$this->village_whereid}) AND "; + } // 空置计算要排除当前排期中的广告位 if ($bool) { @@ -134,9 +189,6 @@ trait tdata { public function td_field() { global $_M, $_YW; switch ($this->tname) { - case 'applan': - $field = '*'; - break; case 'elevators': $field = ' el.*,max( la.l_endtime ) AS endtime,count( DISTINCT la.id ) AS e_totalnum,ala.*,if(ala.estate,1,0) AS etypes,bla.*,cla.* '; break; @@ -303,6 +355,7 @@ trait tdata { $veaps = parent::strchange(array_filter($this->form['e_aps'])); $where .= " AND e_aps IN($veaps) "; } + if (strlen($this->village_whereid) > 0) $where .= " AND el.e_vid IN({$this->village_whereid}) "; break; case 'elevators': $this->search_input = ['e_number']; @@ -385,8 +438,8 @@ trait tdata { $this->form['v_city'] = $this->form['v_address']; $this->form['v_district'] = $this->form['v_address']; - if (is_array($this->form['veaps'])) - $where .= " AND {$this->villages_where} "; + if (strlen($this->villages_where) > 0) $where .= " AND {$this->villages_where} "; + if (strlen($this->village_whereid) > 0) $where .= " AND vi.id IN({$this->village_whereid}) "; $where .= self::td_search_or($this->search_link); $where .= self::td_search(); //判断是否为备份