Browse Source

计算小组成就放入到小组成就表

dev_shibei_match
jianjun 4 years ago
parent
commit
b74bc32b93
  1. 32
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java
  2. 30
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java
  3. 9
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java
  4. 65
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java
  5. 25
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java
  6. 64
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java
  7. 12
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java
  8. 27
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java
  9. 4
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java
  10. 34
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java
  11. 39
      epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml
  12. 63
      epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml
  13. 11
      epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml
  14. 8
      epmet-module/resi-group/resi-group-server/src/test/com/epmet/modules/group/service/impl/StatsAchievementServiceImplTest.java

32
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java

@ -1,4 +1,4 @@
/**
package com.epmet.modules.group.dao; /**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
@ -15,11 +15,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.modules.group.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 小组成就配置表
@ -29,5 +32,26 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface ResiGroupAchievementConfigDao extends BaseDao<ResiGroupAchievementConfigEntity> {
}
/**
* desc: 获取成就配置 比targetValue
*
* @param achievementType
* @param offset
* @param pageSize
* @return java.util.List<com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity>
* @author LiuJanJun
* @date 2021/4/21 10:04 下午
*/
List<ResiGroupAchievementConfigEntity> selectMoreThanOneByValue(@Param("achievementType") String achievementType, @Param("offset") int offset, @Param("pageSize") int pageSize);
/**
* desc: 获取最后一条配置
*
* @param achievementType
* @return com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity
* @author LiuJanJun
* @date 2021/4/22 1:58 下午
*/
ResiGroupAchievementConfigEntity getLastOne(@Param("achievementType") String achievementType);
}

30
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java

@ -35,10 +35,34 @@ import java.util.List;
public interface ResiGroupAchievementStatsDao extends BaseDao<ResiGroupAchievementStatsEntity> {
/**
* 获取未完成的成就
* @author zhaoqifeng
* @date 2021/4/19 15:52
*
* @param groupId
* @return java.util.List<com.epmet.resi.group.dto.group.ResiGroupMilestoneStatsDTO>
* @author zhaoqifeng
* @date 2021/4/19 15:52
*/
List<ResiGroupAchievementStatsDTO> selectUnAchieved(@Param("groupId") String groupId);
}
/**
* desc: 获取最后一个为实现的成就
*
* @param customerId
* @param groupId
* @param achievementType
* @return com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity
* @author LiuJanJun
* @date 2021/4/21 8:34 下午
*/
ResiGroupAchievementStatsEntity selectLastUnAchieved(@Param("customerId") String customerId, @Param("groupId") String groupId, @Param("achievementType") String achievementType);
/**
* desc: 插入或更新成就
*
* @param haveArrive
* @param updateAll
* @return int
* @author LiuJanJun
* @date 2021/4/22 3:03 下午
*/
int saveOrUpdate(@Param("list") List<ResiGroupAchievementStatsEntity> list, @Param("updateAll") boolean updateAll);
}

9
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java

@ -49,15 +49,20 @@ public class ResiGroupAchievementStatsEntity extends BaseEpmetEntity {
private String groupId;
/**
* 里程ID
* 成就ID
*/
private String achievementId;
/**
* 里程名称
* 成就名称
*/
private String achievementName;
/**
* 成就类型
*/
private String achievementType;
/**
* 实现时间
*/

65
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java

@ -18,12 +18,9 @@
package com.epmet.modules.group.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
import com.epmet.resi.group.dto.group.ResiGroupAchievementConfigDTO;
import java.util.List;
import java.util.Map;
/**
* 小组成就配置表
@ -33,63 +30,7 @@ import java.util.Map;
*/
public interface ResiGroupAchievementConfigService extends BaseService<ResiGroupAchievementConfigEntity> {
/**
* 默认分页
*
* @param params
* @return PageData<ResiGroupMilestoneConfigDTO>
* @author generator
* @date 2021-04-19
*/
PageData<ResiGroupAchievementConfigDTO> page(Map<String, Object> params);
ResiGroupAchievementConfigEntity getLastOne(String achievementType);
/**
* 默认查询
*
* @param params
* @return java.util.List<ResiGroupMilestoneConfigDTO>
* @author generator
* @date 2021-04-19
*/
List<ResiGroupAchievementConfigDTO> list(Map<String, Object> params);
/**
* 单条查询
*
* @param id
* @return ResiGroupMilestoneConfigDTO
* @author generator
* @date 2021-04-19
*/
ResiGroupAchievementConfigDTO get(String id);
/**
* 默认保存
*
* @param dto
* @return void
* @author generator
* @date 2021-04-19
*/
void save(ResiGroupAchievementConfigDTO dto);
/**
* 默认更新
*
* @param dto
* @return void
* @author generator
* @date 2021-04-19
*/
void update(ResiGroupAchievementConfigDTO dto);
/**
* 批量删除
*
* @param ids
* @return void
* @author generator
* @date 2021-04-19
*/
void delete(String[] ids);
}
List<ResiGroupAchievementConfigEntity> selectMoreThanOneByValue(String achievementType,int offset,int pageSize);
}

25
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java

@ -110,4 +110,27 @@ public interface ResiGroupAchievementStatsService extends BaseService<ResiGroupA
* @return java.util.List<com.epmet.resi.group.dto.group.ResiGroupMilestoneStatsDTO>
*/
List<ResiGroupAchievementStatsDTO> getUnAchieved(String groupId);
}
/**
* desc: 获取最后未实现的成就 实际每种类型 数据库只存在一条未实现的成就
*
* @param customerId
* @param groupId
* @param achievementType
* @return com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity
* @author LiuJanJun
* @date 2021/4/22 2:35 下午
*/
ResiGroupAchievementStatsEntity selectLastUnAchieved(String customerId, String groupId, String achievementType);
/**
* desc: 插入或更新成就
*
* @param haveArrive
* @param updateAll
* @return int
* @author LiuJanJun
* @date 2021/4/22 3:03 下午
*/
int saveOrUpdate(List<ResiGroupAchievementStatsEntity> haveArrive, boolean updateAll);
}

64
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java

@ -17,23 +17,13 @@
package com.epmet.modules.group.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.modules.group.dao.ResiGroupAchievementConfigDao;
import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
import com.epmet.modules.group.service.ResiGroupAchievementConfigService;
import com.epmet.resi.group.dto.group.ResiGroupAchievementConfigDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 小组成就配置表
@ -44,57 +34,13 @@ import java.util.Map;
@Service
public class ResiGroupAchievementConfigServiceImpl extends BaseServiceImpl<ResiGroupAchievementConfigDao, ResiGroupAchievementConfigEntity> implements ResiGroupAchievementConfigService {
@Override
public PageData<ResiGroupAchievementConfigDTO> page(Map<String, Object> params) {
IPage<ResiGroupAchievementConfigEntity> page = baseDao.selectPage(
getPage(params, FieldConstant.CREATED_TIME, false),
getWrapper(params)
);
return getPageData(page, ResiGroupAchievementConfigDTO.class);
}
@Override
public List<ResiGroupAchievementConfigDTO> list(Map<String, Object> params) {
List<ResiGroupAchievementConfigEntity> entityList = baseDao.selectList(getWrapper(params));
return ConvertUtils.sourceToTarget(entityList, ResiGroupAchievementConfigDTO.class);
}
private QueryWrapper<ResiGroupAchievementConfigEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get(FieldConstant.ID_HUMP);
QueryWrapper<ResiGroupAchievementConfigEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id);
return wrapper;
public ResiGroupAchievementConfigEntity getLastOne(String achievementType) {
return baseDao.getLastOne(achievementType);
}
@Override
public ResiGroupAchievementConfigDTO get(String id) {
ResiGroupAchievementConfigEntity entity = baseDao.selectById(id);
return ConvertUtils.sourceToTarget(entity, ResiGroupAchievementConfigDTO.class);
public List<ResiGroupAchievementConfigEntity> selectMoreThanOneByValue(String achievementType,int offset,int pageSize) {
return baseDao.selectMoreThanOneByValue(achievementType,offset,pageSize);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(ResiGroupAchievementConfigDTO dto) {
ResiGroupAchievementConfigEntity entity = ConvertUtils.sourceToTarget(dto, ResiGroupAchievementConfigEntity.class);
insert(entity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ResiGroupAchievementConfigDTO dto) {
ResiGroupAchievementConfigEntity entity = ConvertUtils.sourceToTarget(dto, ResiGroupAchievementConfigEntity.class);
updateById(entity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(String[] ids) {
// 逻辑删除(@TableLogic 注解)
baseDao.deleteBatchIds(Arrays.asList(ids));
}
}
}

12
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java

@ -131,4 +131,14 @@ public class ResiGroupAchievementStatsServiceImpl extends BaseServiceImpl<ResiGr
return baseDao.selectUnAchieved(groupId);
}
}
@Override
public ResiGroupAchievementStatsEntity selectLastUnAchieved(String customerId, String groupId, String achievementType) {
return baseDao.selectLastUnAchieved(customerId,groupId,achievementType);
}
@Override
public int saveOrUpdate(List<ResiGroupAchievementStatsEntity> haveArrive, boolean updateAll) {
return baseDao.saveOrUpdate(haveArrive, updateAll);
}
}

27
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java

@ -72,28 +72,43 @@ public class StatsAchievementServiceImpl extends AbstractStatsAchievementService
if (StringUtils.isBlank(customerId) || StringUtils.isBlank(groupId) || anEnum == null) {
return false;
}
Integer currentValue = null;
switch (anEnum) {
case TOPIC:
//查询话题数
QueryWrapper<ResiTopicEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId)
.eq(ResiTopicEntity::getGroupId,groupId)
.eq(ResiTopicEntity::getStatus, TopicConstant.AUTO_PASSED)
.eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO);
int currentValue = resiTopicDao.selectCount(queryWrapper);
currentValue = resiTopicDao.selectCount(queryWrapper);
break;
case MEMBER:
int currentValue = resiGroupMemberDao.countMembers(customerId, groupId);
calculateMember(customerId, groupId, currentValue, achievementType);
currentValue = resiGroupMemberDao.countMembers(customerId, groupId);
break;
case TOISSUE:
//查询已经转议题的话题数
queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId)
.eq(ResiTopicEntity::getGroupId,groupId)
.eq(ResiTopicEntity::getShiftIssue, NumConstant.ONE)
.eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO);
currentValue = 10;//resiTopicDao.selectCount(queryWrapper);
break;
case RESOVLE_TOPIC:
//查询已经关闭且为已解决的话题数
queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId)
.eq(ResiTopicEntity::getGroupId,groupId)
.eq(ResiTopicEntity::getStatus, TopicConstant.CLOSED)
.eq(ResiTopicEntity::getClosedStatus, TopicConstant.RESOLVED)
.eq(ResiTopicEntity::getShiftIssue, NumConstant.ONE)
.eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO);
currentValue = resiTopicDao.selectCount(queryWrapper);
break;
default:
log.info("calculateAcm error");
}
calculateMember(customerId, groupId, currentValue, achievementType);
return true;
}

4
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java

@ -143,5 +143,7 @@ public interface ResiGroupMemberDao extends BaseDao<ResiGroupMemberEntity> {
* @description 查询当前用户被移出群的记录按创建时间降序
* @Date 2021/4/6 12:50
**/
List<ResiGroupMemberDTO> queryMemberRemovedRecs(@Param("groupId")String groupId, @Param("userId")String userId);
List<ResiGroupMemberDTO> queryMemberRemovedRecs(@Param("groupId") String groupId, @Param("userId") String userId);
int countMembers(@Param("customerId") String customerId, @Param("groupId") String groupId);
}

34
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java

@ -3,6 +3,7 @@ package com.epmet.modules.support;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.modules.enums.AchievementTypeEnum;
/**
* desc:小组成就下一等级规则工具类
@ -20,7 +21,7 @@ public class GroupAchievementUtils {
*
* @param currentValue
*/
public static Integer getNextTopicTargetValue(Integer currentValue) {
private static Integer getNextTopicTargetValue(Integer currentValue) {
if (currentValue < NumConstant.FIVE_HUNDRED) {
throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
}
@ -32,7 +33,7 @@ public class GroupAchievementUtils {
*
* @param currentValue
*/
public static Integer getNextToIssueTargetValue(Integer currentValue) {
private static Integer getNextToIssueTargetValue(Integer currentValue) {
if (currentValue < NumConstant.ONE_HUNDRED) {
throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
}
@ -44,10 +45,37 @@ public class GroupAchievementUtils {
*
* @param currentValue
*/
public static Integer getNextResolveTopicTargetValue(Integer currentValue) {
private static Integer getNextResolveTopicTargetValue(Integer currentValue) {
if (currentValue < NumConstant.ONE_HUNDRED) {
throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
}
return currentValue + NumConstant.ONE_HUNDRED;
}
/**
* desc:获取下一等级的话题数目标值 步长500 起始值 500
*
* @param currentValue
*/
public static Integer getNextTargetValue(String achievementType, Integer currentValue) {
AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType);
if (anEnum == null){
throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
}
Integer next = null;
switch (anEnum){
case TOPIC:
next = getNextTopicTargetValue(currentValue);
break;
case TOISSUE:
next = getNextToIssueTargetValue(currentValue);
break;
case RESOVLE_TOPIC:
next = getNextResolveTopicTargetValue(currentValue);
break;
default:
}
return next;
}
}

39
epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml

@ -3,20 +3,29 @@
<mapper namespace="com.epmet.modules.group.dao.ResiGroupAchievementConfigDao">
<resultMap type="com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity" id="resiGroupAchievementConfigMap">
<result property="id" column="ID"/>
<result property="customerId" column="CUSTOMER_ID"/>
<result property="achievementName" column="ACHIEVEMENT_NAME"/>
<result property="preValue" column="PRE_VALUE"/>
<result property="targetValue" column="TARGET_VALUE"/>
<result property="achievementType" column="ACHIEVEMENT_TYPE"/>
<result property="delFlag" column="DEL_FLAG"/>
<result property="revision" column="REVISION"/>
<result property="createdBy" column="CREATED_BY"/>
<result property="createdTime" column="CREATED_TIME"/>
<result property="updatedBy" column="UPDATED_BY"/>
<result property="updatedTime" column="UPDATED_TIME"/>
</resultMap>
</mapper>
<select id="selectMoreThanOneByValue" resultType="com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity">
SELECT
id, customer_id, achievement_name, pre_value, target_value, achievement_type
FROM resi_group_achievement_config
WHERE
ACHIEVEMENT_TYPE = #{achievementType}
AND DEL_FLAG = '0'
order by TARGET_VALUE
LIMIT #{offset},#{pageSize}
</select>
<select id="getLastOne" resultType="com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity">
SELECT
id, customer_id, achievement_name, pre_value, target_value, achievement_type
FROM resi_group_achievement_config
WHERE
ACHIEVEMENT_TYPE = #{achievementType}
AND DEL_FLAG = '0'
order by TARGET_VALUE
LIMIT 1
</select>
</mapper>

63
epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml

@ -35,6 +35,67 @@
CURRENT_VALUE / TARGET_VALUE ASC
LIMIT 3
</select>
<select id="selectLastUnAchieved" resultMap="resiGroupAchievementStatsMap">
SELECT
ID, CUSTOMER_ID, GROUP_ID, ACHIEVEMENT_ID, ACHIEVEMENT_NAME, ACHIEVEMENT_TYPE, ARRIVE_TIME, CURRENT_VALUE, TARGET_VALUE, IS_ARRIVE
FROM
resi_group_achievement_stats
WHERE DEL_FLAG = '0'
AND GROUP_ID = #{groupId}
AND CUSTOMER_ID = #{customerId}
AND ACHIEVEMENT_TYPE = #{achievementType}
AND IS_ARRIVE = 0
</select>
<insert id="saveOrUpdate">
INSERT INTO resi_group_achievement_stats
(
ID,
CUSTOMER_ID,
GROUP_ID,
ACHIEVEMENT_ID,
ACHIEVEMENT_NAME,
ACHIEVEMENT_TYPE,
ARRIVE_TIME,
CURRENT_VALUE,
TARGET_VALUE,
IS_ARRIVE,
DEL_FLAG,
REVISION,
CREATED_BY,
CREATED_TIME,
UPDATED_BY,
UPDATED_TIME
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.customerId},
#{item.groupId},
#{item.achievementId},
#{item.achievementName},
#{item.achievementType},
#{item.arriveTime},
#{item.currentValue},
#{item.targetValue},
#{item.isArrive},
#{item.delFlag},
#{item.revision},
#{item.createdBy},
#{item.createdTime},
#{item.updatedBy},
#{item.updatedTime}
)
</foreach>
ON DUPLICATE KEY UPDATE
<if test="updateAll">
CURRENT_VALUE = values(CURRENT_VALUE),
TARGET_VALUE = values(TARGET_VALUE),
IS_ARRIVE = VALUES(IS_ARRIVE),
UPDATED_TIME = VALUES(UPDATED_TIME),
</if>
UPDATED_BY = VALUES(UPDATED_BY)
</insert>
</mapper>
</mapper>

11
epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml

@ -191,4 +191,15 @@
ORDER BY
rgm.CREATED_TIME DESC
</select>
<select id="countMembers" resultType="int">
SELECT
count(*)
FROM
resi_group_member rgm
WHERE
rgm.RESI_GROUP_ID = #{groupId}
AND rgm.CUSTOMER_ID = #{customerId}
and rgm.STATUS = 'approved'
</select>
</mapper>

8
epmet-module/resi-group/resi-group-server/src/test/com/epmet/modules/group/service/impl/StatsAchievementServiceImplTest.java

@ -16,9 +16,15 @@ public class StatsAchievementServiceImplTest {
@Test
public void calculateAcm() {
// String customerId = "test_cid";
// String groupId = "test_groupId";
// String achievementType = "member";
// Boolean aBoolean = statsAchievementService.calculateAcm(customerId, groupId, achievementType);
// System.out.println(aBoolean);
String customerId = "test_cid";
String groupId = "test_groupId";
String achievementType = "member";
String achievementType = "toissue";
Boolean aBoolean = statsAchievementService.calculateAcm(customerId, groupId, achievementType);
System.out.println(aBoolean);
}

Loading…
Cancel
Save