22 changed files with 712 additions and 0 deletions
			
			
		| @ -0,0 +1,18 @@ | |||
| package com.epmet.dto.customize; | |||
| 
 | |||
| import lombok.Data; | |||
| 
 | |||
| import java.io.Serializable; | |||
| 
 | |||
| 
 | |||
| 
 | |||
| @Data | |||
| public class IcResiCategoryConfigDTO implements Serializable { | |||
|     private String configId; | |||
|     /** | |||
|      * 列名 | |||
|      */ | |||
|     private String columnName; | |||
| 
 | |||
|     private String itemLabel; | |||
| } | |||
| @ -0,0 +1,32 @@ | |||
| package com.epmet.dto.extract.form; | |||
| 
 | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.Length; | |||
| 
 | |||
| import java.io.Serializable; | |||
| 
 | |||
| /** | |||
|  * 数字社区-人员类别分析,按天计算,入参 | |||
|  * 以下参数都可以为空 | |||
|  */ | |||
| @Data | |||
| public class IcUserCategoryAnalysisDailyFormDTO implements Serializable { | |||
|     public interface AddUserInternalGroup { | |||
|     } | |||
| 
 | |||
|     private String customerId; | |||
|     @Length(max = 8, message = "日期格式:yyyyMMdd", groups = AddUserInternalGroup.class) | |||
|     private String dateId; | |||
| 
 | |||
|     /** | |||
|      * 开始时间 | |||
|      */ | |||
|     @Length(max = 8, message = "开始日期日期格式:yyyyMMdd", groups = AddUserInternalGroup.class) | |||
|     private String startDate; | |||
|     /** | |||
|      * 结束时间 | |||
|      */ | |||
|     @Length(max = 8, message = "截止日期格式:yyyyMMdd", groups = AddUserInternalGroup.class) | |||
|     private String endDate; | |||
| 
 | |||
| } | |||
| @ -0,0 +1,12 @@ | |||
| package com.epmet.dto.user.result; | |||
| 
 | |||
| import lombok.Data; | |||
| 
 | |||
| import java.io.Serializable; | |||
| 
 | |||
| @Data | |||
| public class OrgIcUserTotalDTO implements Serializable { | |||
|     private String orgId; | |||
|     private Integer total; | |||
|     private String columnName; | |||
| } | |||
| @ -0,0 +1,76 @@ | |||
| package com.epmet.controller; | |||
| 
 | |||
| 
 | |||
| import com.epmet.commons.tools.constant.NumConstant; | |||
| import com.epmet.commons.tools.utils.DateUtils; | |||
| import com.epmet.commons.tools.utils.Result; | |||
| import com.epmet.commons.tools.validator.ValidatorUtils; | |||
| import com.epmet.dto.extract.form.IcUserCategoryAnalysisDailyFormDTO; | |||
| import com.epmet.service.stats.DimCustomerService; | |||
| import com.epmet.service.stats.FactIcuserCategoryAnalysisDailyService; | |||
| import org.apache.commons.collections4.CollectionUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.PostMapping; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| 
 | |||
| import java.time.LocalDate; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| 
 | |||
| /** | |||
|  * @Description 数字社区相关统计任务可以放这,目前只有人员类别分析 | |||
|  * @Author yinzuomei | |||
|  * @Date 2022/01/17 | |||
|  * @Version 1.0 | |||
|  */ | |||
| @RestController | |||
| @RequestMapping("ic") | |||
| public class IcController { | |||
| 
 | |||
|     @Autowired | |||
|     private FactIcuserCategoryAnalysisDailyService userCategoryAnalysisDailyService; | |||
|     @Autowired | |||
|     private DimCustomerService dimCustomerService; | |||
| 
 | |||
|     /** | |||
|      * 数字社区-基础信息-人员类别分析-每个类别的人员总数、较上月迁入迁出人数 | |||
|      * 说明:安调统计,截止到当前dateId的党员总数;+30:迁入党员+之前的居民在本月内变更为党员身份的;-10:在本月丢失党员身份的人+迁出的人 | |||
|      * @return | |||
|      */ | |||
|     @PostMapping("/user/category-analysis-daily") | |||
|     public Result statUserCategoryDaily(@RequestBody IcUserCategoryAnalysisDailyFormDTO formDTO) { | |||
|         ValidatorUtils.validateEntity(formDTO, IcUserCategoryAnalysisDailyFormDTO.AddUserInternalGroup.class); | |||
|         List<String> customerIds = new ArrayList<>(); | |||
|         if (StringUtils.isNotBlank(formDTO.getCustomerId())) { | |||
|             customerIds.add(formDTO.getCustomerId()); | |||
|         } else { | |||
|             //未指定客户,则查询dim_customer表
 | |||
|             customerIds = dimCustomerService.selectCustomerIdPage(NumConstant.ONE, NumConstant.ONE_THOUSAND); | |||
|         } | |||
|         if (CollectionUtils.isNotEmpty(customerIds)) { | |||
|             customerIds.forEach(customerId -> { | |||
|                 if (StringUtils.isNotBlank(formDTO.getStartDate()) && StringUtils.isNotBlank(formDTO.getEndDate())) { | |||
|                     //[a,b]yyyyMMdd
 | |||
|                     List<String> daysBetween = DateUtils.getDaysBetween(formDTO.getStartDate(), formDTO.getEndDate()); | |||
|                     daysBetween.forEach(dateId -> { | |||
|                         //计算网格维度的数据
 | |||
|                         userCategoryAnalysisDailyService.statUserCategoryGridDaily(customerId, dateId); | |||
|                     }); | |||
|                 } else if (StringUtils.isNotBlank(formDTO.getDateId())) { | |||
|                     //计算网格维度的数据
 | |||
|                     userCategoryAnalysisDailyService.statUserCategoryGridDaily(customerId, formDTO.getDateId()); | |||
|                 } else { | |||
|                     //计算网格维度的数据
 | |||
|                     //当前时间的前一天yyyyMMdd
 | |||
|                     String dateId = LocalDate.now().minusDays(NumConstant.ONE).toString().replace("-", ""); | |||
|                     userCategoryAnalysisDailyService.statUserCategoryGridDaily(customerId, dateId); | |||
|                 } | |||
|             }); | |||
|         } | |||
|         return new Result(); | |||
|     } | |||
| 
 | |||
| } | |||
| @ -0,0 +1,14 @@ | |||
| package com.epmet.dao.customize; | |||
| 
 | |||
| 
 | |||
| import com.epmet.dto.customize.IcResiCategoryConfigDTO; | |||
| import org.apache.ibatis.annotations.Mapper; | |||
| 
 | |||
| import java.util.List; | |||
| 
 | |||
| @Mapper | |||
| public interface IcResiCategoryStatsConfigDao { | |||
| 
 | |||
| 
 | |||
|     List<IcResiCategoryConfigDTO> queryDataColumn(String customerId); | |||
| } | |||
| @ -0,0 +1,20 @@ | |||
| package com.epmet.dao.stats; | |||
| 
 | |||
| import com.epmet.commons.mybatis.dao.BaseDao; | |||
| import com.epmet.entity.stats.FactIcuserCategoryAnalysisDailyEntity; | |||
| import org.apache.ibatis.annotations.Mapper; | |||
| import org.apache.ibatis.annotations.Param; | |||
| 
 | |||
| /** | |||
|  * 人员类别分析 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2022-01-17 | |||
|  */ | |||
| @Mapper | |||
| public interface FactIcuserCategoryAnalysisDailyDao extends BaseDao<FactIcuserCategoryAnalysisDailyEntity> { | |||
| 
 | |||
|     int limitDelete(@Param("customerId")String customerId, | |||
|                     @Param("dateId")String dateId, | |||
|                     @Param("orgType")String orgType); | |||
| } | |||
| @ -0,0 +1,71 @@ | |||
| package com.epmet.entity.stats; | |||
| 
 | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.epmet.commons.mybatis.entity.BaseEpmetEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| 
 | |||
| /** | |||
|  * 人员类别分析 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2022-01-17 | |||
|  */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper=false) | |||
| @TableName("fact_icuser_category_analysis_daily") | |||
| public class FactIcuserCategoryAnalysisDailyEntity extends BaseEpmetEntity { | |||
| 
 | |||
| 	private static final long serialVersionUID = 1L; | |||
| 
 | |||
|     /** | |||
|      * 客户id | |||
|      */ | |||
| 	private String customerId; | |||
| 
 | |||
|     /** | |||
|      * 预警配置ID | |||
|      */ | |||
| 	private String configId; | |||
| 
 | |||
|     /** | |||
|      * 当前数据是截止到XXX的:yyyyMMdd | |||
|      */ | |||
| 	private String dateId; | |||
| 
 | |||
|     /** | |||
|      * 网格id或者组织id | |||
|      */ | |||
| 	private String orgId; | |||
| 
 | |||
|     /** | |||
|      * grid或者agency | |||
|      */ | |||
| 	private String orgType; | |||
| 
 | |||
|     /** | |||
|      * orgid的上级 | |||
|      */ | |||
| 	private String pid; | |||
| 
 | |||
|     /** | |||
|      * orgid的所有上级 | |||
|      */ | |||
| 	private String pids; | |||
| 
 | |||
|     /** | |||
|      * 当前类别总人数 | |||
|      */ | |||
| 	private Integer total; | |||
| 
 | |||
|     /** | |||
|      * 较上月迁出 | |||
|      */ | |||
| 	private Integer qcIncr; | |||
| 
 | |||
|     /** | |||
|      * 较上月迁入 | |||
|      */ | |||
| 	private Integer qrIncr; | |||
| 
 | |||
| } | |||
| @ -0,0 +1,22 @@ | |||
| package com.epmet.service.customize; | |||
| 
 | |||
| 
 | |||
| import com.epmet.dto.customize.IcResiCategoryConfigDTO; | |||
| 
 | |||
| import java.util.List; | |||
| 
 | |||
| /** | |||
|  * 居民类别配置表 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2021-11-04 | |||
|  */ | |||
| public interface IcResiCategoryStatsConfigService { | |||
| 
 | |||
|     /** | |||
|      * 返回用于数据分析的列名+居民类别配置表的id | |||
|      * @param customerId | |||
|      * @return | |||
|      */ | |||
|     List<IcResiCategoryConfigDTO> queryDataColumn(String customerId); | |||
| } | |||
| @ -0,0 +1,40 @@ | |||
| package com.epmet.service.customize.impl; | |||
| 
 | |||
| import com.epmet.commons.dynamic.datasource.annotation.DataSource; | |||
| import com.epmet.constant.DataSourceConstant; | |||
| import com.epmet.dao.customize.IcResiCategoryStatsConfigDao; | |||
| import com.epmet.dto.customize.IcResiCategoryConfigDTO; | |||
| import com.epmet.service.customize.IcResiCategoryStatsConfigService; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| 
 | |||
| import java.util.List; | |||
| 
 | |||
| 
 | |||
| /** | |||
|  * 居民类别配置表 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2021-11-04 | |||
|  */ | |||
| @Slf4j | |||
| @DataSource(DataSourceConstant.OPER_CUSTOMIZE) | |||
| @Service | |||
| public class IcResiCategoryStatsConfigServiceImpl implements IcResiCategoryStatsConfigService{ | |||
| 
 | |||
|     @Autowired | |||
|     private IcResiCategoryStatsConfigDao baseDao; | |||
| 
 | |||
| 
 | |||
|     /** | |||
|      * 返回用于数据分析的列名+居民类别配置表的id | |||
|      * | |||
|      * @param customerId | |||
|      * @return | |||
|      */ | |||
|     @Override | |||
|     public List<IcResiCategoryConfigDTO> queryDataColumn(String customerId) { | |||
|         return baseDao.queryDataColumn(customerId); | |||
|     } | |||
| } | |||
| @ -0,0 +1,20 @@ | |||
| package com.epmet.service.stats; | |||
| 
 | |||
| import com.epmet.commons.mybatis.service.BaseService; | |||
| import com.epmet.entity.stats.FactIcuserCategoryAnalysisDailyEntity; | |||
| 
 | |||
| /** | |||
|  * 人员类别分析 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2022-01-17 | |||
|  */ | |||
| public interface FactIcuserCategoryAnalysisDailyService extends BaseService<FactIcuserCategoryAnalysisDailyEntity> { | |||
|     /** | |||
|      * 数字社区-基础信息-人员类别分析-每个类别的人员总数、较上月迁入迁出人数 | |||
|      * 网格 | |||
|      * @param customerId | |||
|      * @param dateId | |||
|      */ | |||
|     void statUserCategoryGridDaily(String customerId, String dateId); | |||
| } | |||
| @ -0,0 +1,153 @@ | |||
| package com.epmet.service.stats.impl; | |||
| 
 | |||
| import com.epmet.commons.dynamic.datasource.annotation.DataSource; | |||
| import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; | |||
| import com.epmet.commons.tools.constant.NumConstant; | |||
| import com.epmet.commons.tools.enums.OrgTypeEnum; | |||
| import com.epmet.constant.DataSourceConstant; | |||
| import com.epmet.dao.stats.FactIcuserCategoryAnalysisDailyDao; | |||
| import com.epmet.dto.CustomerGridDTO; | |||
| import com.epmet.dto.customize.IcResiCategoryConfigDTO; | |||
| import com.epmet.dto.user.result.OrgIcUserTotalDTO; | |||
| import com.epmet.entity.stats.FactIcuserCategoryAnalysisDailyEntity; | |||
| import com.epmet.service.customize.IcResiCategoryStatsConfigService; | |||
| import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; | |||
| import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; | |||
| import com.epmet.service.stats.FactIcuserCategoryAnalysisDailyService; | |||
| import com.epmet.service.user.UserService; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.apache.commons.collections4.CollectionUtils; | |||
| import org.apache.commons.collections4.MapUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| 
 | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.stream.Collectors; | |||
| 
 | |||
| /** | |||
|  * 人员类别分析 | |||
|  * | |||
|  * @author generator generator@elink-cn.com | |||
|  * @since v1.0.0 2022-01-17 | |||
|  */ | |||
| @Service | |||
| @Slf4j | |||
| @DataSource(DataSourceConstant.STATS) | |||
| public class FactIcuserCategoryAnalysisDailyServiceImpl extends BaseServiceImpl<FactIcuserCategoryAnalysisDailyDao, FactIcuserCategoryAnalysisDailyEntity> implements FactIcuserCategoryAnalysisDailyService { | |||
| 
 | |||
|     @Autowired | |||
|     private IcResiCategoryStatsConfigService icResiCategoryStatsConfigService; | |||
|     @Autowired | |||
|     private ScreenCustomerAgencyService agencyService; | |||
|     @Autowired | |||
|     private ScreenCustomerGridService gridService; | |||
|     @Autowired | |||
|     private  UserService userService; | |||
|     /** | |||
|      * 数字社区-基础信息-人员类别分析-每个类别的人员总数、较上月迁入迁出人数 | |||
|      * | |||
|      * @param customerId | |||
|      * @param dateId | |||
|      */ | |||
|     @Override | |||
|     public void statUserCategoryGridDaily(String customerId, String dateId) { | |||
|         //查询出所有用语数据分析的类别column_name,没有则不计算
 | |||
|         List<IcResiCategoryConfigDTO> columnList=icResiCategoryStatsConfigService.queryDataColumn(customerId); | |||
|         if(CollectionUtils.isEmpty(columnList)){ | |||
|             return; | |||
|         } | |||
|         // //所有网格和组织查询出来
 | |||
|         // List<CustomerAgencyDTO> agencyDTOList=agencyService.getByCustomerId(customerId);
 | |||
|         List<CustomerGridDTO> gridDTOList=gridService.getByCustomerId(customerId); | |||
|         //网格维度、组织维度初始好数据
 | |||
|         List<FactIcuserCategoryAnalysisDailyEntity> initList=constructInitValue(customerId,dateId,gridDTOList,columnList); | |||
|         if(CollectionUtils.isEmpty(initList)){ | |||
|             return; | |||
|         } | |||
|         // 批量插入数据
 | |||
| 
 | |||
| 
 | |||
|         //删除旧数据
 | |||
|         clearOldDatas(customerId,dateId,OrgTypeEnum.GRID.getCode()); | |||
|     } | |||
| 
 | |||
|     private void clearOldDatas(String customerId, String dateId,String orgType) { | |||
|         int deleteNum; | |||
|         do { | |||
|             //每次删除1000条
 | |||
|             deleteNum = baseDao.limitDelete(customerId,dateId,orgType); | |||
|         } while (deleteNum != NumConstant.ZERO); | |||
|     } | |||
| 
 | |||
|     /** | |||
|      * | |||
|      * @param customerId | |||
|      * @param dateId yyyyMMdd | |||
|      * @param gridDTOList 当前客户下所有的网格 | |||
|      * @param columnList 所有需要分析的类别对应的ic_resi_user的列名,目前只有18类 | |||
|      * @return | |||
|      */ | |||
|     private List<FactIcuserCategoryAnalysisDailyEntity> constructInitValue(String customerId,String dateId, List<CustomerGridDTO> gridDTOList,List<IcResiCategoryConfigDTO> columnList) { | |||
|         List<FactIcuserCategoryAnalysisDailyEntity> list=new ArrayList<>(); | |||
|         if(CollectionUtils.isEmpty(gridDTOList)){ | |||
|             //没有配置的类别,退出吧
 | |||
|             return list; | |||
|         } | |||
| 
 | |||
|         //1、total
 | |||
|         // 查询明细ic_user_change_detailed变更明细表,各个网格的各个分类的总人数
 | |||
|         Map<String, List<OrgIcUserTotalDTO>> totalMapList=userService.calGridIcUserTotal(customerId,dateId); | |||
| 
 | |||
|         String monthId=dateId.substring(NumConstant.ZERO,NumConstant.SIX); | |||
|         String startDate=monthId.concat("01"); | |||
|         String endDate=dateId; | |||
| 
 | |||
|         //2、迁入+30:eg:dateId:20211226,  [20211201,20211226],类别sum值=1的
 | |||
|         Map<String, List<OrgIcUserTotalDTO>> qrList=userService.calGridIcUserQr(customerId,dateId); | |||
| 
 | |||
|         //3、迁出 -10 :eg:dateId:20211226,  [20211201,20211226],类别sum值 !=1的
 | |||
|         Map<String, List<OrgIcUserTotalDTO>> qrList=userService.calGridIcUserQr(customerId,dateId); | |||
| 
 | |||
|         for(IcResiCategoryConfigDTO config:columnList){ | |||
|             gridDTOList.forEach(grid->{ | |||
|                 FactIcuserCategoryAnalysisDailyEntity gridData=new FactIcuserCategoryAnalysisDailyEntity(); | |||
|                 gridData.setCustomerId(customerId); | |||
|                 gridData.setConfigId(config.getConfigId()); | |||
|                 gridData.setDateId(dateId); | |||
|                 gridData.setOrgId(grid.getId()); | |||
|                 gridData.setOrgType(OrgTypeEnum.GRID.getCode()); | |||
|                 gridData.setPid(StringUtils.isNotBlank(grid.getPid())?grid.getPid(): NumConstant.ZERO_STR); | |||
|                 gridData.setPids(grid.getPids()); | |||
| 
 | |||
|                 boolean zeroFlag=true; | |||
|                 if(MapUtils.isNotEmpty(totalMapList)&&totalMapList.containsKey(grid.getId())){ | |||
|                     //当前网格下,有的类别
 | |||
|                     List<OrgIcUserTotalDTO> crrentGrid=totalMapList.get(grid.getId()); | |||
|                     if(CollectionUtils.isNotEmpty(crrentGrid)){ | |||
|                         //各个类别对应的数
 | |||
|                         Map<String,Integer> categoryTotalMap=crrentGrid.stream().collect(Collectors.toMap(OrgIcUserTotalDTO::getColumnName, OrgIcUserTotalDTO::getTotal, (key1, key2) -> key2)); | |||
|                         if(MapUtils.isNotEmpty(categoryTotalMap)&&categoryTotalMap.containsKey(config.getColumnName())){ | |||
|                             zeroFlag=false; | |||
|                             gridData.setTotal(categoryTotalMap.get(config.getColumnName())); | |||
|                         } | |||
|                     } | |||
|                 } | |||
|                 if(zeroFlag){ | |||
|                     gridData.setTotal(NumConstant.ZERO); | |||
|                 } | |||
|                 gridData.setQcIncr(NumConstant.ZERO); | |||
|                 gridData.setQrIncr(NumConstant.ZERO); | |||
|                 list.add(gridData); | |||
|             }); | |||
|         } | |||
|         return list; | |||
|     } | |||
| 
 | |||
|     public static void main(String[] args) { | |||
|         String dateId="20211225"; | |||
|         System.out.println(dateId.substring(0,6)); | |||
|     } | |||
| } | |||
| @ -0,0 +1,23 @@ | |||
| <?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.epmet.dao.customize.IcResiCategoryStatsConfigDao"> | |||
| 
 | |||
|     <select id="queryDataColumn" parameterType="java.lang.String" resultType="com.epmet.dto.customize.IcResiCategoryConfigDTO"> | |||
|         SELECT | |||
|             m.COLUMN_NAME as columnName, | |||
|             c.id as configId, | |||
|             m.LABEL as itemLabel | |||
|         FROM | |||
|             ic_form_item m | |||
|             INNER JOIN ic_resi_category_stats_config c ON ( m.CUSTOMER_ID = c.CUSTOMER_ID AND m.COLUMN_NAME = c.COLUMN_NAME AND c.DEL_FLAG = '0' ) | |||
|         WHERE | |||
|             m.DEL_FLAG = '0' | |||
|             AND m.DATA_ANALYSE = '1' | |||
|             AND m.CUSTOMER_ID = #{customerId} | |||
|         ORDER BY | |||
|             m.SORT ASC | |||
|     </select> | |||
| 
 | |||
| 
 | |||
| </mapper> | |||
| @ -0,0 +1,13 @@ | |||
| <?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.epmet.dao.stats.FactIcuserCategoryAnalysisDailyDao"> | |||
| 
 | |||
|     <delete id="limitDelete" parameterType="map"> | |||
|         delete from fact_icuser_category_analysis_daily | |||
|         where CUSTOMER_ID = #{customerId} | |||
|         and date_id=#{dateId} | |||
|         and org_type=#{orgType} | |||
|         limit 1000 | |||
|     </delete> | |||
| </mapper> | |||
					Loading…
					
					
				
		Reference in new issue