Merge branch '2.2' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile into 2.2
| | |
| | | @ApiModelProperty(value = "城市code") |
| | | private String cityCode; |
| | | |
| | | @ApiModelProperty(value = "经营类型 1=直营 2=非直营") |
| | | private Integer businessCategory; |
| | | |
| | | } |
| | |
| | | private Integer supportOrder; |
| | | @Excel(name = "*电费类型", width = 22, readConverterExp = "0=其他用电,1=商业用电,2=普通工业用电,3=大工业用电") |
| | | private Integer electricityType; |
| | | @Excel(name = "*报装类型", width = 20, readConverterExp = "1=独立报装,2=非独立报装") |
| | | @Excel(name = "*报装类型", width = 20, readConverterExp = "1=独立报装,2=非独立报装", |
| | | prompt = "填写:独立报装或非独立报装") |
| | | private Integer businessExpandType; |
| | | @Excel(name = "*报装电源容量", width = 20) |
| | | private BigDecimal capacity; |
| | |
| | | if (row.getRoundTheClock() == null) errors.add("7*24小时营业不能为空"); |
| | | if (row.getParkType() == null) errors.add("停车费类型不能为空"); |
| | | if (row.getElectricityType() == null) errors.add("电费类型不能为空"); |
| | | if (row.getBusinessExpandType() == null) errors.add("报装类型不能为空"); |
| | | if (row.getBusinessExpandType() == null) errors.add("报装类型不能为空或填写不正确,请填写独立报装或非独立报装"); |
| | | if (row.getCapacity() == null) errors.add("报装电源容量不能为空"); |
| | | if (row.getRatedPower() == null) errors.add("站点额定总功率不能为空"); |
| | | if (row.getPeriodFee() == null) errors.add("是否峰谷分时不能为空"); |
| | |
| | | t_accounting_strategy_detail a |
| | | left join |
| | | t_accounting_strategy b on (a.accounting_strategy_id = b.id) |
| | | where a.del_flag = 0 and b.del_flag = 0 and b.audit_status = 3 |
| | | where a.del_flag = 0 and b.del_flag = 0 |
| | | AND DATE_FORMAT(NOW(), '%H:%i:%s') between a.start_time and |
| | | CASE WHEN a.end_time = '00:00' THEN '23:59:59' ELSE a.end_time END) tasd on (ts.accounting_strategy_id = tasd.accounting_strategy_id) |
| | | <where> |
| | |
| | | </if> |
| | | <if test="null != query.cityCode and '' != query.cityCode"> |
| | | and ts.city_code = #{query.cityCode} |
| | | </if> |
| | | <if test="null != query.businessCategory"> |
| | | and ts.business_category = #{query.businessCategory} |
| | | </if> |
| | | AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} |
| | | AND ts.status = ${@com.ruoyi.common.core.enums.status.SiteStatusEnum@NORMAL_USE.getCode()} |
| | |
| | | t_accounting_strategy_detail a |
| | | left join |
| | | t_accounting_strategy b on (a.accounting_strategy_id = b.id) |
| | | where a.del_flag = 0 and b.del_flag = 0 and b.audit_status = 3 |
| | | where a.del_flag = 0 and b.del_flag = 0 |
| | | AND DATE_FORMAT(NOW(), '%H:%i:%s') between a.start_time AND |
| | | CASE WHEN a.end_time = '00:00' THEN '23:59:59' ELSE a.end_time END) tasd on (ts.accounting_strategy_id = tasd.accounting_strategy_id) |
| | | <where> |
| | |
| | | <if test="null != query.cityCode and '' != query.cityCode"> |
| | | and ts.city_code = #{query.cityCode} |
| | | </if> |
| | | <if test="null != query.businessCategory"> |
| | | and ts.business_category = #{query.businessCategory} |
| | | </if> |
| | | AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} |
| | | AND ts.status = ${@com.ruoyi.common.core.enums.status.SiteStatusEnum@NORMAL_USE.getCode()} |
| | | AND (tp.partner_type IS NULL OR tp.partner_type != 3) |
| | |
| | | data.createCell(column).setCellValue("SITE-IMPORT-001"); |
| | | } else if ("*站点名称".equals(title)) { |
| | | data.createCell(column).setCellValue("站点导入测试"); |
| | | } else if ("*报装类型".equals(title)) { |
| | | data.createCell(column).setCellValue("独立报装"); |
| | | } |
| | | } |
| | | workbook.write(output); |
| | |
| | | assertEquals(1, rows.size()); |
| | | assertEquals("SITE-IMPORT-001", rows.get(0).getCode()); |
| | | assertEquals("站点导入测试", rows.get(0).getName()); |
| | | assertEquals(1, rows.get(0).getBusinessExpandType()); |
| | | } |
| | | |
| | | @Test |
| | |
| | | ChargingOrderTimeVO res = chargingOrderService.chargingList(dto); |
| | | return AjaxResult.success(res); |
| | | } |
| | | |
| | | @RequiresPermissions(value = {"/chargingPeriodStatistics"}, logical = Logical.OR) |
| | | @PostMapping(value = "/chargingList/page") |
| | | @ApiOperation(value = "充电时段统计分页列表", tags = {"管理后台-财务结算"}) |
| | | public AjaxResult<PageInfo<ChargingOrderListVO>> chargingListPage(@RequestBody ChargingListQuery dto) { |
| | | return AjaxResult.success(chargingOrderService.chargingListPage(dto)); |
| | | } |
| | | |
| | | @RequiresPermissions(value = {"/chargingPeriodStatistics"}, logical = Logical.OR) |
| | | @PostMapping(value = "/chargingList/summary") |
| | | @ApiOperation(value = "充电时段统计汇总", tags = {"管理后台-财务结算"}) |
| | | public AjaxResult<ChargingOrderTimeVO> chargingListSummary(@RequestBody ChargingListQuery dto) { |
| | | return AjaxResult.success(chargingOrderService.chargingListSummary(dto)); |
| | | } |
| | | |
| | | |
| | | @RequiresPermissions(value = {"/chargingPeriodStatistics/order_info", "/chargingPeriodStatistics/charging_curve"}, logical = Logical.OR) |
| | |
| | | |
| | | |
| | | |
| | | List<Map<String, Object>> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | Map<String, Object> chargingListSum1(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | Map<String, Object> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | List<Long> chargingListSummaryOrderIds(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | |
| | | List<ChargingOrderListVO> chargingListNoPage( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | |
| | | |
| | | ChargingOrderTimeVO chargingList(ChargingListQuery dto); |
| | | |
| | | PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto); |
| | | |
| | | ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto); |
| | | |
| | | |
| | | List<ChargingOrderListVO> export(ChargingListQuery dto); |
| | | |
| | |
| | | |
| | | @Override |
| | | public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { |
| | | return chargingPeriodStatistics(dto, true, true); |
| | | } |
| | | |
| | | @Override |
| | | public PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto) { |
| | | return chargingPeriodStatistics(dto, true, false).getList(); |
| | | } |
| | | |
| | | @Override |
| | | public ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto) { |
| | | return chargingPeriodStatistics(dto, false, true); |
| | | } |
| | | |
| | | private ChargingOrderTimeVO chargingPeriodStatistics(ChargingListQuery dto, boolean includeList, boolean includeSummary) { |
| | | String startTime1 = null; |
| | | String startTime2 = null; |
| | | String endTime1 = null; |
| | |
| | | } |
| | | } |
| | | dto.setSiteIds(siteIds); |
| | | PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize()); |
| | | |
| | | PageInfo<ChargingOrderListVO> pageInfo = null; |
| | | List<ChargingOrderListVO> list = new ArrayList<>(); |
| | | if (includeList) { |
| | | pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize()); |
| | | List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2); |
| | | Map<Integer, Site> siteMap = loadChargingPeriodSites(maps); |
| | | Map<Integer, TChargingPile> pileMap = loadChargingPeriodPiles(maps); |
| | |
| | | list.add(chargingOrderListVO); |
| | | } |
| | | fillChargingPeriodShareIncome(list); |
| | | } |
| | | |
| | | |
| | | |
| | | if (includeSummary) { |
| | | // 尖峰平谷充电到账 |
| | | BigDecimal jianElectronic = new BigDecimal("0"); |
| | | BigDecimal fengElectronic = new BigDecimal("0"); |
| | |
| | | BigDecimal feng = new BigDecimal("0"); |
| | | BigDecimal ping = new BigDecimal("0"); |
| | | BigDecimal gu = new BigDecimal("0"); |
| | | List<Map<String, Object>> list1 = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2); |
| | | for (Map<String, Object> map : list1) { |
| | | if(null == map){ |
| | | continue; |
| | | } |
| | | jianElectronic = jianElectronic.add(new BigDecimal(null == map.get("jianElectronic") ? "0" : map.get("jianElectronic").toString())); |
| | | fengElectronic = fengElectronic.add(new BigDecimal(null == map.get("fengElectronic") ? "0" : map.get("fengElectronic").toString())); |
| | | pingElectronic = pingElectronic.add(new BigDecimal(null == map.get("pingElectronic") ? "0" : map.get("pingElectronic").toString())); |
| | | guElectronic = guElectronic.add(new BigDecimal(null == map.get("guElectronic") ? "0" : map.get("guElectronic").toString())); |
| | | jianService = jianService.add(new BigDecimal(null == map.get("jianService") ? "0" : map.get("jianService").toString())); |
| | | fengService = fengService.add(new BigDecimal(null == map.get("fengService") ? "0" : map.get("fengService").toString())); |
| | | pingService = pingService.add(new BigDecimal(null == map.get("pingService") ? "0" : map.get("pingService").toString())); |
| | | guService = guService.add(new BigDecimal(null == map.get("guService") ? "0" : map.get("guService").toString())); |
| | | jian = jian.add(new BigDecimal(null == map.get("jian") ? "0" : map.get("jian").toString())); |
| | | feng = feng.add(new BigDecimal(null == map.get("feng") ? "0" : map.get("feng").toString())); |
| | | ping = ping.add(new BigDecimal(null == map.get("ping") ? "0" : map.get("ping").toString())); |
| | | gu = gu.add(new BigDecimal(null == map.get("gu") ? "0" : map.get("gu").toString())); |
| | | } |
| | | Map<String, Object> map = this.baseMapper.chargingListSum1(dto, startTime1, startTime2, endTime1, endTime2); |
| | | System.err.println("充电时段统计-查询参数:" + JSON.toJSONString(dto)); |
| | | System.err.println("充电时段统计-汇总数据:" + JSON.toJSONString(map)); |
| | | Map<String, Object> map = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2); |
| | | if (map == null) { |
| | | map = new HashMap<>(); |
| | | } |
| | | jianElectronic = getSummaryDecimal(map, "jianElectronic"); |
| | | fengElectronic = getSummaryDecimal(map, "fengElectronic"); |
| | | pingElectronic = getSummaryDecimal(map, "pingElectronic"); |
| | | guElectronic = getSummaryDecimal(map, "guElectronic"); |
| | | jianService = getSummaryDecimal(map, "jianService"); |
| | | fengService = getSummaryDecimal(map, "fengService"); |
| | | pingService = getSummaryDecimal(map, "pingService"); |
| | | guService = getSummaryDecimal(map, "guService"); |
| | | jian = getSummaryDecimal(map, "jian"); |
| | | feng = getSummaryDecimal(map, "feng"); |
| | | ping = getSummaryDecimal(map, "ping"); |
| | | gu = getSummaryDecimal(map, "gu"); |
| | | //订单数量 |
| | | int orderCount = Integer.parseInt(String.valueOf(map.getOrDefault("orderCount", "0"))); |
| | | Integer summaryOrderCount = getNullableInteger(map, "orderCount"); |
| | | int orderCount = summaryOrderCount == null ? 0 : summaryOrderCount; |
| | | // 计算充电总度数 |
| | | BigDecimal electronic = new BigDecimal(String.valueOf(map.getOrDefault("electronic", "0"))); |
| | | BigDecimal electronic = getSummaryDecimal(map, "electronic"); |
| | | // 支付金额 |
| | | BigDecimal paymentAmount = new BigDecimal(String.valueOf(map.getOrDefault("paymentAmount", "0"))); |
| | | BigDecimal paymentAmount = getSummaryDecimal(map, "paymentAmount"); |
| | | // 电费 |
| | | BigDecimal electrovalence = new BigDecimal(String.valueOf(map.getOrDefault("electrovalence", "0"))); |
| | | BigDecimal electrovalence = getSummaryDecimal(map, "electrovalence"); |
| | | // 服务费 |
| | | BigDecimal serviceCharge = new BigDecimal(String.valueOf(map.getOrDefault("serviceCharge", "0"))); |
| | | BigDecimal serviceCharge = getSummaryDecimal(map, "serviceCharge"); |
| | | chargingOrderTimeVO.setOrderCount(orderCount); |
| | | chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | List<Long> summaryOrderIds = list1.stream() |
| | | .filter(Objects::nonNull) |
| | | .map(sumMap -> getSummaryLong(sumMap, "id")) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | List<Long> summaryOrderIds = this.baseMapper.chargingListSummaryOrderIds( |
| | | dto, startTime1, startTime2, endTime1, endTime2); |
| | | Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds); |
| | | chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal")); |
| | | chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal")); |
| | |
| | | + "0" + "%/" |
| | | + "0" + "%"); |
| | | } |
| | | pageInfo.setRecords(list); |
| | | chargingOrderTimeVO.setList(pageInfo); |
| | | } |
| | | if (includeList) { |
| | | pageInfo.setRecords(list); |
| | | chargingOrderTimeVO.setList(pageInfo); |
| | | } |
| | | return chargingOrderTimeVO; |
| | | } |
| | | |
| | |
| | | GROUP BY EXTRACT(MONTH FROM create_time) |
| | | </when> |
| | | <otherwise> |
| | | SELECT EXTRACT(MONTH FROM billing_cycle) AS MONTH, |
| | | SUM(IFNULL(total_electricity_charge, 0)) AS electrovalence, |
| | | SUM(IFNULL(total_service_fee, 0) - IFNULL(tripartite_commission, 0)) AS service_charge |
| | | FROM t_charging_settlement_bill |
| | | WHERE statistical_date_type = 1 AND site_id != 0 |
| | | <if test="sixBefore != null"> |
| | | AND billing_cycle >= #{sixBefore} |
| | | </if> |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | | AND site_id IN |
| | | <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> |
| | | #{siteId} |
| | | </foreach> |
| | | </if> |
| | | GROUP BY EXTRACT(MONTH FROM billing_cycle) |
| | | SELECT income.MONTH, |
| | | SUM(income.electrovalence) AS electrovalence, |
| | | SUM(income.service_charge) AS service_charge |
| | | FROM ( |
| | | SELECT EXTRACT(MONTH FROM billing_cycle) AS MONTH, |
| | | SUM(IFNULL(total_electricity_charge, 0)) AS electrovalence, |
| | | SUM(IFNULL(total_service_fee, 0) - IFNULL(tripartite_commission, 0)) AS service_charge |
| | | FROM t_charging_settlement_bill |
| | | WHERE statistical_date_type = 1 |
| | | AND site_id != 0 |
| | | AND billing_cycle < DATE_FORMAT(CURDATE(), '%Y-%m-01') |
| | | <if test="sixBefore != null"> |
| | | AND billing_cycle >= #{sixBefore} |
| | | </if> |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | | AND site_id IN |
| | | <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> |
| | | #{siteId} |
| | | </foreach> |
| | | </if> |
| | | GROUP BY EXTRACT(MONTH FROM billing_cycle) |
| | | |
| | | UNION ALL |
| | | |
| | | SELECT EXTRACT(MONTH FROM charging_order.create_time) AS MONTH, |
| | | SUM(IFNULL(accounting.period_electric_price, 0)) AS electrovalence, |
| | | SUM(CASE |
| | | WHEN charging_order.order_source = 2 |
| | | THEN IFNULL(accounting.period_service_price, 0) * 0.8 |
| | | ELSE IFNULL(accounting.period_service_price, 0) |
| | | END) AS service_charge |
| | | FROM t_charging_order_accounting_strategy accounting |
| | | INNER JOIN t_charging_order charging_order |
| | | ON accounting.charging_order_id = charging_order.id |
| | | WHERE charging_order.del_flag = 0 |
| | | AND charging_order.status = 5 |
| | | AND charging_order.recharge_payment_status = 2 |
| | | AND charging_order.create_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01') |
| | | AND charging_order.create_time < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH) |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | | AND charging_order.site_id IN |
| | | <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> |
| | | #{siteId} |
| | | </foreach> |
| | | </if> |
| | | GROUP BY EXTRACT(MONTH FROM charging_order.create_time) |
| | | ) income |
| | | GROUP BY income.MONTH |
| | | </otherwise> |
| | | </choose> |
| | | </select> |
| | |
| | | |
| | | <select id="chargingListSum" resultType="map"> |
| | | select |
| | | a.id, |
| | | a.siteId, |
| | | a.order_source as orderSource, |
| | | count(a.id) as orderCount, |
| | | sum(a.charging_capacity) as electronic, |
| | | sum(a.period_electric_price) as electrovalence, |
| | | sum(CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END) as serviceCharge, |
| | |
| | | from ( |
| | | select co.id, co.site_id as siteId, coas.type, coas.charging_capacity, coas.period_electric_price, coas.period_service_price, co.order_source |
| | | from t_charging_order_accounting_strategy coas |
| | | left join t_charging_order co on (coas.charging_order_id = co.id) |
| | | inner join t_charging_order co on (coas.charging_order_id = co.id) |
| | | where co.del_flag = 0 and co.recharge_payment_status = 2 |
| | | <if test="null != req.code and req.code!=''"> |
| | | and co.code LIKE CONCAT('%',#{req.code},'%') |
| | |
| | | <if test="req.status != null "> |
| | | and co.status = #{req.status} |
| | | </if> |
| | | <if test="req.status != null "> |
| | | and co.status = #{req.status} |
| | | </if> |
| | | <if test="req.isWhitelist != null"> |
| | | and co.is_whitelist = #{req.isWhitelist} |
| | | </if> |
| | |
| | | and co.end_time between #{endTime1} and #{endTime2} |
| | | </if> |
| | | and co.start_time IS NOT NULL and co.end_time is not null |
| | | ) as a group by a.id, a.siteId, a.order_source |
| | | ) as a |
| | | </select> |
| | | |
| | | |
| | | <select id="chargingListSum1" resultType="map"> |
| | | select |
| | | count(a.id) as orderCount, |
| | | sum(a.charging_capacity) as electronic, |
| | | sum(a.period_electric_price) as electrovalence, |
| | | sum(CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END) as serviceCharge, |
| | | sum(a.period_electric_price + (CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END)) as paymentAmount |
| | | from ( |
| | | select co.id,coas.charging_capacity, coas.period_electric_price, coas.period_service_price, co.order_source |
| | | from t_charging_order_accounting_strategy coas |
| | | left join t_charging_order co on (coas.charging_order_id = co.id) |
| | | <select id="chargingListSummaryOrderIds" resultType="java.lang.Long"> |
| | | select co.id |
| | | from t_charging_order co |
| | | where co.del_flag = 0 and co.recharge_payment_status = 2 |
| | | <if test="null != req.code and req.code!=''"> |
| | | and co.code LIKE CONCAT('%',#{req.code},'%') |
| | |
| | | and co.end_time between #{endTime1} and #{endTime2} |
| | | </if> |
| | | and co.start_time IS NOT NULL and co.end_time is not null |
| | | ) as a |
| | | </select> |
| | | |
| | | |
| | |
| | | |
| | | <select id="getChargingOrderCount" resultType="java.util.Map"> |
| | | select |
| | | count(a.id) as num, |
| | | count(distinct a.id) as num, |
| | | sum(b.charging_capacity) as charging_capacity, |
| | | sum(CASE WHEN a.order_source = 0 THEN b.period_service_price |
| | | WHEN a.order_source = 1 THEN b.period_service_price |
| | |
| | | sum(b.period_electric_price) as electrovalence, |
| | | sum(b.charging_capacity) as electricity |
| | | from t_charging_order a |
| | | left join ( |
| | | select charging_order_id, |
| | | sum(period_service_price) as period_service_price, |
| | | sum(period_electric_price) as period_electric_price, |
| | | sum(charging_capacity) as charging_capacity |
| | | from t_charging_order_accounting_strategy group by charging_order_id |
| | | ) as b on (a.id = b.charging_order_id) |
| | | where a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2 and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{time} |
| | | left join t_charging_order_accounting_strategy b on a.id = b.charging_order_id |
| | | where a.del_flag = 0 |
| | | and a.status = 5 |
| | | and a.recharge_payment_status = 2 |
| | | and a.create_time >= CONCAT(#{time}, ' 00:00:00') |
| | | and a.create_time < DATE_ADD(#{time}, INTERVAL 1 DAY) |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | | and a.site_id IN |
| | | <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> |