* @date 2020.07.31 15:11
**/
Integer selectSumByEvent(@Param("userId") String userId, @Param("eventId") String eventId, @Param("sourceId") String sourceId, @Param("customerId") String customerId, @Param("dateCheck") Date dateCheck,@Param("right")Date right);
+
+ /**
+ * 获取今日积分增量
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:56
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ */
+ Integer selectIncrease(@Param("type")String type, @Param("objectId")String objectId);
}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointTotalDetailEntity.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointTotalDetailEntity.java
new file mode 100644
index 0000000000..b05bc59705
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointTotalDetailEntity.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("biz_point_total_detail")
+public class BizPointTotalDetailEntity extends BaseEpmetEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 客户ID
+ */
+ private String customerId;
+
+ /**
+ * 组织Id
+ */
+ private String agencyId;
+
+ /**
+ * 网格ID
+ */
+ private String gridId;
+
+ /**
+ * 业务类型:小组:group
+ */
+ private String bizType;
+
+ /**
+ * 业务类型的对象id
+ */
+ private String objectId;
+
+ /**
+ * OBJECTID的总积分 总积分=objectId下所有的用户积分
+ */
+ private Integer totalPoint;
+
+}
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointUserTotalDetailEntity.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointUserTotalDetailEntity.java
new file mode 100644
index 0000000000..e0f2960604
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/BizPointUserTotalDetailEntity.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("biz_point_user_total_detail")
+public class BizPointUserTotalDetailEntity extends BaseEpmetEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 客户ID
+ */
+ private String customerId;
+
+ /**
+ * 组织Id
+ */
+ private String agencyId;
+
+ /**
+ * 网格ID
+ */
+ private String gridId;
+
+ /**
+ * 用户ID
+ */
+ private String userId;
+
+ /**
+ * 业务类型:小组:group
+ */
+ private String bizType;
+
+ /**
+ * 业务类型的对象id
+ */
+ private String objectId;
+
+ /**
+ * OBJECTID的总积分 总积分=objectId下所有的用户积分
+ */
+ private Integer totalPoint;
+
+}
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/UserPointActionLogEntity.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/UserPointActionLogEntity.java
index b52ed79b2f..2a282b06f3 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/UserPointActionLogEntity.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/entity/UserPointActionLogEntity.java
@@ -58,6 +58,18 @@ public class UserPointActionLogEntity extends BaseEpmetEntity {
*/
private String eventId;
+ /**
+ * 业务类型:小组:group
+ */
+ private String bizType;
+
+ /**
+ * 业务类型的对象id
+ */
+ private String objectId;
+
+ private String sourceType;
+
/**
* 来源Id,可以是活动Id
* */
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointTotalDetailService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointTotalDetailService.java
new file mode 100644
index 0000000000..f72e49ba39
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointTotalDetailService.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.service;
+
+import com.epmet.commons.mybatis.service.BaseService;
+import com.epmet.commons.tools.page.PageData;
+import com.epmet.dto.BizPointTotalDetailDTO;
+import com.epmet.dto.form.GroupPointFormDTO;
+import com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO;
+import com.epmet.dto.result.GroupPointRankingResultDTO;
+import com.epmet.entity.BizPointTotalDetailEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+public interface BizPointTotalDetailService extends BaseService {
+
+ /**
+ * 默认分页
+ *
+ * @param params
+ * @return PageData
+ * @author generator
+ * @date 2021-04-20
+ */
+ PageData page(Map params);
+
+ /**
+ * 默认查询
+ *
+ * @param params
+ * @return java.util.List
+ * @author generator
+ * @date 2021-04-20
+ */
+ List list(Map params);
+
+ /**
+ * 单条查询
+ *
+ * @param id
+ * @return BizPointTotalDetailDTO
+ * @author generator
+ * @date 2021-04-20
+ */
+ BizPointTotalDetailDTO get(String id);
+
+ /**
+ * 默认保存
+ *
+ * @param dto
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void save(BizPointTotalDetailDTO dto);
+
+ /**
+ * 默认更新
+ *
+ * @param dto
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void update(BizPointTotalDetailDTO dto);
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void delete(String[] ids);
+
+ /**
+ * 根据业务类型查找数据
+ *
+ * @param type
+ * @param objectId
+ * @return com.epmet.dto.BizPointTotalDetailDTO
+ * @author zhaoqifeng
+ * @date 2021/4/20 16:53
+ */
+ BizPointTotalDetailDTO getDataByObject(String type, String objectId);
+
+ /**
+ * 小组积分详情
+ *
+ * @param formDTO
+ * @return com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:05
+ */
+ GroupPointDetailResultDTO pointDetail(GroupPointFormDTO formDTO);
+
+ /**
+ * 网格小组积分排行
+ *
+ * @param formDTO
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:05
+ */
+ List groupPointRanking(GroupPointFormDTO formDTO);
+}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointUserTotalDetailService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointUserTotalDetailService.java
new file mode 100644
index 0000000000..51e8172f7c
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/BizPointUserTotalDetailService.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.service;
+
+import com.epmet.commons.mybatis.service.BaseService;
+import com.epmet.commons.tools.page.PageData;
+import com.epmet.commons.tools.security.dto.TokenDto;
+import com.epmet.dto.BizPointUserTotalDetailDTO;
+import com.epmet.dto.form.GroupPointFormDTO;
+import com.epmet.dto.result.PointRankingResultDTO;
+import com.epmet.entity.BizPointUserTotalDetailEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+public interface BizPointUserTotalDetailService extends BaseService {
+
+ /**
+ * 默认分页
+ *
+ * @param params
+ * @return PageData
+ * @author generator
+ * @date 2021-04-20
+ */
+ PageData page(Map params);
+
+ /**
+ * 默认查询
+ *
+ * @param params
+ * @return java.util.List
+ * @author generator
+ * @date 2021-04-20
+ */
+ List list(Map params);
+
+ /**
+ * 单条查询
+ *
+ * @param id
+ * @return BizPointUserTotalDetailDTO
+ * @author generator
+ * @date 2021-04-20
+ */
+ BizPointUserTotalDetailDTO get(String id);
+
+ /**
+ * 默认保存
+ *
+ * @param dto
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void save(BizPointUserTotalDetailDTO dto);
+
+ /**
+ * 默认更新
+ *
+ * @param dto
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void update(BizPointUserTotalDetailDTO dto);
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return void
+ * @author generator
+ * @date 2021-04-20
+ */
+ void delete(String[] ids);
+
+
+ /**
+ * 根据业务类型查找用户数据
+ *
+ * @param type
+ * @param objectId
+ * @param userId
+ * @return com.epmet.dto.BizPointTotalDetailDTO
+ * @author zhaoqifeng
+ * @date 2021/4/20 16:53
+ */
+ BizPointUserTotalDetailDTO getDataByObject(String type, String objectId, String userId);
+
+ /**
+ * 根据业务类型查找积分总和
+ *
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/20 17:21
+ */
+ Integer getTotalByObject(String type, String objectId);
+
+ /**
+ * 小组积分贡献榜
+ *
+ * @param tokenDto
+ * @param formDTO
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:06
+ */
+ List pointRanking(TokenDto tokenDto, GroupPointFormDTO formDTO);
+
+ /**
+ * 获取今日增量
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:41
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ */
+ Integer getIncrease(String type, String objectId);
+}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java
index 28ec8991c2..cd39750f34 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java
@@ -24,6 +24,7 @@ import com.epmet.dto.form.PointDetailFormDTO;
import com.epmet.dto.form.PointRuleFormDTO;
import com.epmet.dto.form.PointRuleListFormDTO;
import com.epmet.dto.result.CustomerFunctionResultDTO;
+import com.epmet.dto.result.GroupPointRuleResultDTO;
import com.epmet.dto.result.PointDetailResultDTO;
import com.epmet.dto.result.PointRuleResultDTO;
import com.epmet.entity.PointRuleEntity;
@@ -69,4 +70,13 @@ public interface PointRuleService extends BaseService {
PointRuleEntity getByEventCodeAndCustomerId(String customerId,String eventCode);
InitPointRuleResultDTO initPointRule();
+
+ /**
+ * 获取小组积分规则
+ * @author zhaoqifeng
+ * @date 2021/4/22 15:20
+ * @param customerId
+ * @return com.epmet.dto.result.GroupPointRuleResultDTO
+ */
+ GroupPointRuleResultDTO getGroupRule(String customerId);
}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/UserPointActionLogService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/UserPointActionLogService.java
index 8a35954ef0..892fd67a11 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/UserPointActionLogService.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/UserPointActionLogService.java
@@ -123,4 +123,14 @@ public interface UserPointActionLogService extends BaseService
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.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.constant.NumConstant;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.page.PageData;
+import com.epmet.commons.tools.utils.ConvertUtils;
+import com.epmet.commons.tools.constant.FieldConstant;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.dao.BizPointTotalDetailDao;
+import com.epmet.dto.BizPointTotalDetailDTO;
+import com.epmet.dto.form.GroupPointFormDTO;
+import com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO;
+import com.epmet.dto.result.GroupPointRankingResultDTO;
+import com.epmet.entity.BizPointTotalDetailEntity;
+import com.epmet.resi.group.dto.group.ResiGroupDTO;
+import com.epmet.resi.group.feign.ResiGroupOpenFeignClient;
+import com.epmet.service.BizPointTotalDetailService;
+import com.epmet.service.BizPointUserTotalDetailService;
+import com.epmet.service.UserPointActionLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+@Service
+public class BizPointTotalDetailServiceImpl extends BaseServiceImpl implements BizPointTotalDetailService {
+
+ @Autowired
+ private ResiGroupOpenFeignClient resiGroupOpenFeignClient;
+ @Autowired
+ private BizPointUserTotalDetailService bizPointUserTotalDetailService;
+ @Autowired
+ private UserPointActionLogService userPointActionLogService;
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, FieldConstant.CREATED_TIME, false),
+ getWrapper(params)
+ );
+ return getPageData(page, BizPointTotalDetailDTO.class);
+ }
+
+ @Override
+ public List list(Map params) {
+ List entityList = baseDao.selectList(getWrapper(params));
+
+ return ConvertUtils.sourceToTarget(entityList, BizPointTotalDetailDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ String id = (String)params.get(FieldConstant.ID_HUMP);
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id);
+
+ return wrapper;
+ }
+
+ @Override
+ public BizPointTotalDetailDTO get(String id) {
+ BizPointTotalDetailEntity entity = baseDao.selectById(id);
+ return ConvertUtils.sourceToTarget(entity, BizPointTotalDetailDTO.class);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(BizPointTotalDetailDTO dto) {
+ BizPointTotalDetailEntity entity = ConvertUtils.sourceToTarget(dto, BizPointTotalDetailEntity.class);
+ insert(entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(BizPointTotalDetailDTO dto) {
+ BizPointTotalDetailEntity entity = ConvertUtils.sourceToTarget(dto, BizPointTotalDetailEntity.class);
+ updateById(entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void delete(String[] ids) {
+ // 逻辑删除(@TableLogic 注解)
+ baseDao.deleteBatchIds(Arrays.asList(ids));
+ }
+
+ /**
+ * 根据业务类型查找数据
+ *
+ * @param type
+ * @param objectId
+ * @return com.epmet.dto.BizPointTotalDetailDTO
+ * @author zhaoqifeng
+ * @date 2021/4/20 16:53
+ */
+ @Override
+ public BizPointTotalDetailDTO getDataByObject(String type, String objectId) {
+ return baseDao.selectDataByObject(type, objectId);
+ }
+
+ /**
+ * 小组积分详情
+ *
+ * @param formDTO
+ * @return com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:05
+ */
+ @Override
+ public GroupPointDetailResultDTO pointDetail(GroupPointFormDTO formDTO) {
+ Result result = resiGroupOpenFeignClient.groupPointDetail(formDTO.getGroupId());
+ if (!result.success() || null == result.getData()) {
+ throw new RenException(result.getCode(), result.getMsg());
+ }
+ GroupPointDetailResultDTO detail = result.getData();
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("BIZ_TYPE", "group")
+ .eq("OBJECT_ID", formDTO.getGroupId())
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ BizPointTotalDetailEntity entity = baseDao.selectOne(wrapper);
+ Integer increase = userPointActionLogService.getIncrease("group", formDTO.getGroupId());
+ detail.setIncrease(increase.toString());
+ if (null == entity) {
+ detail.setToUpgrade(detail.getNextLevelPoint());
+ detail.setTotal(NumConstant.ZERO_STR);
+ detail.setCurrentPoint(NumConstant.ZERO_STR);
+ } else {
+ int toUpgrade = Integer.parseInt(detail.getNextLevelPoint()) - entity.getTotalPoint();
+ detail.setToUpgrade(Integer.toString(toUpgrade));
+ detail.setTotal(entity.getTotalPoint().toString());
+ detail.setCurrentPoint(entity.getTotalPoint().toString());
+ }
+ return detail;
+ }
+
+ /**
+ * 网格小组积分排行
+ *
+ * @param formDTO
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:05
+ */
+ @Override
+ public List groupPointRanking(GroupPointFormDTO formDTO) {
+ List list;
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("BIZ_TYPE", "group")
+ .eq("GRID_ID", formDTO.getGridId())
+ .eq("DEL_FLAG", NumConstant.ZERO_STR)
+ .orderByDesc("TOTAL_POINT");
+ List totalDetailList = baseDao.selectList(wrapper);
+ Result> groupList = resiGroupOpenFeignClient.getGroupListByGrid(formDTO.getGridId());
+ list = groupList.getData().stream().map(item -> {
+ GroupPointRankingResultDTO dto = new GroupPointRankingResultDTO();
+ dto.setGroupId(item.getId());
+ dto.setGroupName(item.getGroupName());
+ dto.setPoint(NumConstant.ZERO_STR);
+ if (formDTO.getGroupId().equals(item.getId())) {
+ dto.setIsMine(NumConstant.ONE_STR);
+ } else {
+ dto.setIsMine(NumConstant.ZERO_STR);
+ }
+ return dto;
+ }).collect(Collectors.toList());
+ list.forEach(item -> totalDetailList.stream().filter(detail -> item.getGroupId().equals(detail.getObjectId())).forEach(total -> {
+ item.setPoint(total.getTotalPoint().toString());
+
+ }));
+ list =
+ list.stream().sorted(Comparator.comparing(GroupPointRankingResultDTO :: getPoint, Comparator.comparingInt(Integer::parseInt)).reversed()
+ .thenComparing(GroupPointRankingResultDTO::getGroupName, Collator.getInstance(Locale.CHINA)))
+ .collect(Collectors.toList());
+ AtomicInteger i = new AtomicInteger(1);
+ list.forEach(dto -> {
+ dto.setRanking(String.valueOf(i.getAndIncrement()));
+ });
+ return list;
+ }
+
+}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointUserTotalDetailServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointUserTotalDetailServiceImpl.java
new file mode 100644
index 0000000000..1e3563fb6d
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointUserTotalDetailServiceImpl.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.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.constant.FieldConstant;
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.constant.StrConstant;
+import com.epmet.commons.tools.enums.BizTypeEnum;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.page.PageData;
+import com.epmet.commons.tools.security.dto.TokenDto;
+import com.epmet.commons.tools.utils.ConvertUtils;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.dao.BizPointUserTotalDetailDao;
+import com.epmet.dto.BizPointUserTotalDetailDTO;
+import com.epmet.dto.form.GroupPointFormDTO;
+import com.epmet.dto.result.PointRankingResultDTO;
+import com.epmet.dto.result.UserBaseInfoResultDTO;
+import com.epmet.entity.BizPointUserTotalDetailEntity;
+import com.epmet.feign.EpmetUserOpenFeignClient;
+import com.epmet.resi.group.dto.group.ResiGroupDTO;
+import com.epmet.resi.group.dto.member.ResiGroupMemberDTO;
+import com.epmet.resi.group.feign.ResiGroupOpenFeignClient;
+import com.epmet.service.BizPointUserTotalDetailService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 按业务类型积分总计
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-20
+ */
+@Service
+public class BizPointUserTotalDetailServiceImpl extends BaseServiceImpl implements BizPointUserTotalDetailService {
+
+ @Autowired
+ private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
+ @Autowired
+ private ResiGroupOpenFeignClient resiGroupOpenFeignClient;
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, FieldConstant.CREATED_TIME, false),
+ getWrapper(params)
+ );
+ return getPageData(page, BizPointUserTotalDetailDTO.class);
+ }
+
+ @Override
+ public List list(Map params) {
+ List entityList = baseDao.selectList(getWrapper(params));
+
+ return ConvertUtils.sourceToTarget(entityList, BizPointUserTotalDetailDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ String id = (String)params.get(FieldConstant.ID_HUMP);
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id);
+
+ return wrapper;
+ }
+
+ @Override
+ public BizPointUserTotalDetailDTO get(String id) {
+ BizPointUserTotalDetailEntity entity = baseDao.selectById(id);
+ return ConvertUtils.sourceToTarget(entity, BizPointUserTotalDetailDTO.class);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(BizPointUserTotalDetailDTO dto) {
+ BizPointUserTotalDetailEntity entity = ConvertUtils.sourceToTarget(dto, BizPointUserTotalDetailEntity.class);
+ insert(entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(BizPointUserTotalDetailDTO dto) {
+ BizPointUserTotalDetailEntity entity = ConvertUtils.sourceToTarget(dto, BizPointUserTotalDetailEntity.class);
+ updateById(entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void delete(String[] ids) {
+ // 逻辑删除(@TableLogic 注解)
+ baseDao.deleteBatchIds(Arrays.asList(ids));
+ }
+
+ /**
+ * 根据业务类型查找用户数据
+ *
+ * @param type
+ * @param objectId
+ * @param userId
+ * @return com.epmet.dto.BizPointTotalDetailDTO
+ * @author zhaoqifeng
+ * @date 2021/4/20 16:53
+ */
+ @Override
+ public BizPointUserTotalDetailDTO getDataByObject(String type, String objectId, String userId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("USER_ID", userId)
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ BizPointUserTotalDetailEntity entity = baseDao.selectOne(wrapper);
+ return ConvertUtils.sourceToTarget(entity, BizPointUserTotalDetailDTO.class);
+ }
+
+ /**
+ * 根据业务类型查找积分总和
+ *
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/20 17:21
+ */
+ @Override
+ public Integer getTotalByObject(String type, String objectId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.select("IFNULL(SUM(TOTAL_POINT), 0) as TOTAL_POINT")
+ .eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ BizPointUserTotalDetailEntity entity = baseDao.selectOne(wrapper);
+ if (null == entity) {
+ return NumConstant.ZERO;
+ }
+ return entity.getTotalPoint();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(BizTypeEnum.ACTIVITY.getType());
+ }
+
+ /**
+ * 小组积分贡献榜
+ *
+ * @param tokenDto
+ * @param formDTO
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/21 14:06
+ */
+ @Override
+ public List pointRanking(TokenDto tokenDto, GroupPointFormDTO formDTO) {
+ List list = new ArrayList<>();
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("BIZ_TYPE", "group")
+ .eq("OBJECT_ID", formDTO.getGroupId())
+ .eq("DEL_FLAG", NumConstant.ZERO_STR)
+ .orderByDesc("TOTAL_POINT");
+ List userTotalList = baseDao.selectList(wrapper);
+ AtomicInteger i = new AtomicInteger(1);
+
+ //获取小组信息
+ Result group = resiGroupOpenFeignClient.getGroupDetail(formDTO.getGroupId());
+ if (!group.success() || null == group.getData()) {
+ throw new RenException(group.getCode(), group.getMsg());
+ }
+ List memberList = group.getData().getMemberList();
+ list = memberList.stream().map(item -> {
+ PointRankingResultDTO dto = new PointRankingResultDTO();
+ dto.setUserId(item.getCustomerUserId());
+ dto.setPoint(NumConstant.ZERO_STR);
+ if (tokenDto.getUserId().equals(item.getCustomerUserId())) {
+ dto.setIsMine(NumConstant.ONE_STR);
+ } else {
+ dto.setIsMine(NumConstant.ZERO_STR);
+ }
+ return dto;
+ }).collect(Collectors.toList());
+ list.forEach(item -> userTotalList.stream().filter(user -> user.getUserId().equals(item.getUserId())).forEach(total -> {
+ item.setPoint(total.getTotalPoint().toString());
+ }));
+ //获取用户信息
+ List userIds = memberList.stream().map(ResiGroupMemberDTO :: getCustomerUserId).collect(Collectors.toList());
+ Result> userInfoListResult = epmetUserOpenFeignClient.queryUserBaseInfo(userIds);
+ if (!userInfoListResult.success() || null == userInfoListResult.getData()) {
+ throw new RenException(userInfoListResult.getCode(), userInfoListResult.getMsg());
+ }
+ list.forEach(item -> userInfoListResult.getData().stream().filter(baseInfo -> item.getUserId().equals(baseInfo.getUserId())).forEach(
+ user -> {
+ //楼院小组显示昵称,支部小组显示姓名
+ if (("ordinary").equals(group.getData().getGroupType())) {
+ item.setName(user.getNickname());
+ } else {
+ item.setName(StrConstant.EPMETY_STR);
+ if (StringUtils.isNotBlank(user.getSurname())){
+ item.setName(user.getSurname());
+ }
+ if (StringUtils.isNotBlank(user.getName())){
+ item.setName(item.getName().concat(user.getName()));
+ }
+ }
+ item.setHeadPhoto(user.getHeadImgUrl());
+ }
+ ));
+ list = list.stream().sorted(Comparator.comparing(PointRankingResultDTO :: getPoint, Comparator.comparingInt(Integer::parseInt)).reversed()
+ .thenComparing(PointRankingResultDTO::getName, Collator.getInstance(Locale.CHINA)))
+ .collect(Collectors.toList());
+ list.forEach(item -> item.setRanking(String.valueOf(i.getAndIncrement())));
+ return list;
+ }
+
+ /**
+ * 获取今日增量
+ *
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:41
+ */
+ @Override
+ public Integer getIncrease(String type, String objectId) {
+ return baseDao.selectIncrease(type, objectId);
+ }
+
+}
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointAdjustmentLogServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointAdjustmentLogServiceImpl.java
index 3d943ba887..e5aad18cef 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointAdjustmentLogServiceImpl.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointAdjustmentLogServiceImpl.java
@@ -206,6 +206,11 @@ public class PointAdjustmentLogServiceImpl extends BaseServiceImpl list = new ArrayList<>();
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("CUSTOMER_ID", customerId)
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ List ruleList = baseDao.selectList(wrapper);
+ if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(ruleList)) {
+ AtomicInteger index=new AtomicInteger(1);
+ list = ruleList.stream().filter(i -> ("resi_group").equals(Objects.requireNonNull(EventEnum.getEnum(i.getEventCode())).getEventClass())).map(item -> {
+ String rule = index.getAndIncrement() + "." + item.getRuleName() + "," + "" + item.getPoint() + "分";
+ if (NumConstant.ZERO != item.getUpLimit()) {
+ rule = rule + "(每天最多得" + item.getUpLimit() + "分)";
+ }
+ return rule;
+ }).collect(Collectors.toList());
+ }
+ resultDTO.setRules(list);
+ return resultDTO;
+ }
+
private void insertOperateRecord(TokenDto tokenDTO, PointRuleEntity entityNew, PointRuleEntity entityDB, String opType) {
RuleOperateLogEntity record = new RuleOperateLogEntity();
if (tokenDTO != null) {
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/UserPointActionLogServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/UserPointActionLogServiceImpl.java
index 3fce5f3edd..af4b5fd499 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/UserPointActionLogServiceImpl.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/UserPointActionLogServiceImpl.java
@@ -31,17 +31,14 @@ import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dao.UserPointActionLogDao;
+import com.epmet.dto.BizPointTotalDetailDTO;
+import com.epmet.dto.BizPointUserTotalDetailDTO;
import com.epmet.dto.UserPointActionLogDTO;
import com.epmet.dto.form.CommonPageUserFormDTO;
import com.epmet.dto.result.ResiPointLogListResultDTO;
import com.epmet.dto.result.ResiPointLogPeriodResultDTO;
-import com.epmet.entity.PointRuleEntity;
-import com.epmet.entity.UserPointActionLogEntity;
-import com.epmet.entity.UserPointStatisticalDailyEntity;
-import com.epmet.entity.UserPointTotalEntity;
-import com.epmet.service.UserPointActionLogService;
-import com.epmet.service.UserPointStatisticalDailyService;
-import com.epmet.service.UserPointTotalService;
+import com.epmet.entity.*;
+import com.epmet.service.*;
import com.epmet.utils.DimIdGenerator;
import com.epmet.utils.ModuleConstant;
import com.epmet.utils.RuleCycleEnum;
@@ -77,6 +74,10 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl page(Map params) {
IPage page = baseDao.selectPage(
@@ -253,7 +254,7 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl NumConstant.ZERO){
//不按照sourceId查询,查询指定日期内的相关积分规则的总和
Integer sum = baseDao.selectSumByEvent(event.getUserId(),eventCode,null,event.getCustomerId(),dateCheck,right);
- if(null == sum) sum = NumConstant.ZERO;
+ if(null == sum) {
+ sum = NumConstant.ZERO;
+ }
if(StringUtils.equals(ModuleConstant.OPERATION_TYPE_PLUS,ruleInfo.getOperateType())){
if(ruleInfo.getPoint() < NumConstant.ZERO){
//保证要加的积分是正数
@@ -317,8 +320,16 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl【%s】", JSON.toJSON(event)));
+ log.error(String.format("未检测到该用户下有效的积分规则,消息体->【%s】", JSON.toJSON(event)));
}
}
+ /**
+ * 获取今日增量
+ *
+ * @param type
+ * @param objectId
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:41
+ */
+ @Override
+ public Integer getIncrease(String type, String objectId) {
+ return baseDao.selectIncrease(type, objectId);
+ }
+
private void plusPoint(SendPointFormDTO grantPoint) {
ValidatorUtils.validateEntity(grantPoint, SendPointFormDTO.SendPointGroup.class);
@@ -379,6 +446,7 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl wrapper = new QueryWrapper<>();
+ wrapper.select("IFNULL(SUM(POINT), 0) as POINT")
+ .eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("ACTION_FLAG", "plus")
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ UserPointActionLogEntity entity1 = baseDao.selectOne(wrapper);
+ int plusTotal = null == entity1? NumConstant.ZERO : entity1.getPoint();
+ wrapper = new QueryWrapper<>();
+ wrapper.select("IFNULL(SUM(POINT), 0) as POINT")
+ .eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("ACTION_FLAG", "minus")
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ UserPointActionLogEntity entity2 = baseDao.selectOne(wrapper);
+ int minusTotal = null == entity2? NumConstant.ZERO : entity2.getPoint();
+ return plusTotal - minusTotal;
+ }
+
+ private Integer getUserTotalByObject(String type, String objectId, String userId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.select("IFNULL(SUM(POINT), 0) as POINT")
+ .eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("USER_ID", userId)
+ .eq("ACTION_FLAG", "plus")
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ UserPointActionLogEntity entity1 = baseDao.selectOne(wrapper);
+ int plusTotal = null == entity1? NumConstant.ZERO : entity1.getPoint();
+ wrapper = new QueryWrapper<>();
+ wrapper.select("IFNULL(SUM(POINT), 0) as POINT")
+ .eq("BIZ_TYPE", type)
+ .eq("OBJECT_ID", objectId)
+ .eq("USER_ID", userId)
+ .eq("ACTION_FLAG", "minus")
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ UserPointActionLogEntity entity2 = baseDao.selectOne(wrapper);
+ int minusTotal = null == entity2? NumConstant.ZERO : entity2.getPoint();
+ return plusTotal - minusTotal;
+ }
}
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/utils/ModuleConstant.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/utils/ModuleConstant.java
index be66473992..b65cab7b2a 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/utils/ModuleConstant.java
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/utils/ModuleConstant.java
@@ -122,4 +122,7 @@ public interface ModuleConstant extends Constant {
String EVENT_NAME_ADD_LIVE = "添加活动实况";
String VERIFICATED_POINT_CAN_NOT_BE_NULL = "核销积分不能为空";
+
+ String GROUP_RULE_SUMMARY = "小组积分是指组内所有成员在本组内活动时所获取的积分总和。";
+ String CONTRI_SUMMARY = "组内贡献是指组内成员在本组进行活动时所获取的积分贡献值。";
}
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.10__updateRule.sql b/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.10__updateRule.sql
new file mode 100644
index 0000000000..e9fa5a7fd7
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.10__updateRule.sql
@@ -0,0 +1,3 @@
+UPDATE point_rule_default SET RULE_NAME = '组长转话题为议题' WHERE EVENT_CODE = 'shift_topic_to_issue';
+UPDATE point_rule SET RULE_NAME = '组长转话题为议题' WHERE EVENT_CODE = 'shift_topic_to_issue';
+INSERT INTO `epmet_point`.`point_rule_default`(`ID`, `RULE_NAME`, `RULE_DESC`, `EVENT_CODE`, `FUNCTION_ID`, `OPERATE_TYPE`, `UP_LIMIT`, `UP_LIMIT_DESC`, `UP_LIMIT_PREFIX`, `RULE_PERIOD`, `POINT`, `POINT_UNIT`, `ENABLED_FLAG`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('10', '组长解决话题', '组长解决组内话题', 'leader_resolve_topic', '1', 'plus', 0, '无上限', NULL, 'day', 2, 'time', '0', '0', 0, 'APP_USER', '2021-04-19 15:55:18', 'APP_USER', '2021-04-19 15:55:18');
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.9__groupPoint.sql b/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.9__groupPoint.sql
new file mode 100644
index 0000000000..3e22e64f7a
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/db/migration/V0.0.9__groupPoint.sql
@@ -0,0 +1,40 @@
+CREATE TABLE `biz_point_total_detail` (
+ `ID` varchar(64) NOT NULL COMMENT '主键',
+ `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户ID',
+ `AGENCY_ID` varchar(64) NOT NULL COMMENT '组织Id',
+ `GRID_ID` varchar(64) NOT NULL COMMENT '网格ID',
+ `BIZ_TYPE` varchar(64) NOT NULL DEFAULT '0' COMMENT '业务类型:小组:group',
+ `OBJECT_ID` varchar(64) NOT NULL DEFAULT '0' COMMENT '业务类型的对象id',
+ `TOTAL_POINT` int(11) NOT NULL DEFAULT '0' COMMENT 'OBJECTID的总积分 总积分=objectId下所有的用户积分',
+ `DEL_FLAG` varchar(1) NOT NULL DEFAULT '0' COMMENT '删除标识',
+ `REVISION` int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁',
+ `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人',
+ `CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人',
+ `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
+ PRIMARY KEY (`ID`) USING BTREE,
+ UNIQUE KEY `unx_o_point` (`OBJECT_ID`,`BIZ_TYPE`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按业务类型积分总计';
+CREATE TABLE `biz_point_user_total_detail` (
+ `ID` varchar(64) NOT NULL COMMENT '主键',
+ `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户ID',
+ `AGENCY_ID` varchar(64) NOT NULL COMMENT '组织Id',
+ `GRID_ID` varchar(64) NOT NULL COMMENT '网格ID',
+ `USER_ID` varchar(64) NOT NULL COMMENT '用户ID',
+ `BIZ_TYPE` varchar(64) NOT NULL DEFAULT '0' COMMENT '业务类型:小组:group',
+ `OBJECT_ID` varchar(64) NOT NULL DEFAULT '0' COMMENT '业务类型的对象id',
+ `TOTAL_POINT` int(11) NOT NULL DEFAULT '0' COMMENT 'OBJECTID的总积分 总积分=objectId下所有的用户积分',
+ `DEL_FLAG` varchar(1) NOT NULL DEFAULT '0' COMMENT '删除标识',
+ `REVISION` int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁',
+ `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人',
+ `CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人',
+ `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
+ PRIMARY KEY (`ID`) USING BTREE,
+ UNIQUE KEY `unx_point` (`USER_ID`,`OBJECT_ID`,`BIZ_TYPE`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按业务类型积分总计';
+
+ALTER TABLE `user_point_action_log`
+ ADD COLUMN `BIZ_TYPE` varchar(64) NULL COMMENT '业务类型:小组:group 活动 activity' AFTER `EVENT_ID`,
+ ADD COLUMN `OBJECT_ID` varchar(64) NULL COMMENT '业务类型的对象id' AFTER `BIZ_TYPE`,
+ ADD COLUMN `SOURCE_TYPE` varchar(20) NULL COMMENT '活动 activity 活动ID\r\n志愿者 volunteer 用户ID\r\n邀请进组 invite 用户ID\r\n话题 topic 话题ID\r\n话题转议题 issue 议题id\r\n话题转项目 project 话题ID' AFTER `OBJECT_ID`;
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointTotalDetailDao.xml b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointTotalDetailDao.xml
new file mode 100644
index 0000000000..e1e8202e83
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointTotalDetailDao.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select ID,
+ CUSTOMER_ID,
+ AGENCY_ID,
+ GRID_ID,
+ TOTAL_POINT
+ from biz_point_total_detail
+ where BIZ_TYPE = #{type}
+ and OBJECT_ID = #{objectId}
+
+
+
+
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointUserTotalDetailDao.xml b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointUserTotalDetailDao.xml
new file mode 100644
index 0000000000..a846469881
--- /dev/null
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/BizPointUserTotalDetailDao.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT IFNULL(SUM(TOTAL_POINT), 0)
+ FROM biz_point_user_total_detail
+ WHERE
+ BIZ_TYPE = #{type}
+ AND OBJECT_ID = #{objectId}
+ AND DATE_FORMAT(CREATED_TIME, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
+
+
+
+
\ No newline at end of file
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/PointRuleDao.xml b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/PointRuleDao.xml
index 23d372e0e7..c18c78976b 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/PointRuleDao.xml
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/PointRuleDao.xml
@@ -28,7 +28,11 @@
SELECT DISTINCT FUNCTION_ID FROM point_rule WHERE CUSTOMER_ID = #{customerId,jdbcType=VARCHAR}
- SELECT ID,RULE_NAME,RULE_DESC,POINT,POINT_UNIT,ENABLED_FLAG FROM point_rule WHERE CUSTOMER_ID = #{customerId,jdbcType=VARCHAR} AND FUNCTION_ID = #{functionId,jdbcType=VARCHAR}
+ SELECT ID,RULE_NAME,RULE_DESC,POINT,POINT_UNIT,ENABLED_FLAG FROM point_rule
+ WHERE
+ CUSTOMER_ID = #{customerId,jdbcType=VARCHAR}
+ AND FUNCTION_ID = #{functionId,jdbcType=VARCHAR}
+ AND DEL_FLAG = '0'
UPDATE point_rule
@@ -50,4 +54,4 @@
SELECT DISTINCT CUSTOMER_ID FROM point_rule WHERE DEL_FLAG = '0'
-
\ No newline at end of file
+
diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml
index 8e9a860b37..c7c6bf89c2 100644
--- a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml
+++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml
@@ -65,4 +65,12 @@
AND CREATED_TIME #{right}
+
+ SELECT IFNULL(SUM(POINT), 0)
+ FROM USER_POINT_ACTION_LOG
+ WHERE
+ BIZ_TYPE = #{type}
+ AND OBJECT_ID = #{objectId}
+ AND DATE_FORMAT(CREATED_TIME, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
+
\ No newline at end of file
diff --git a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/GovIssueOpenFeignClient.java b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/GovIssueOpenFeignClient.java
index 2977849e22..190cbaf2f8 100644
--- a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/GovIssueOpenFeignClient.java
+++ b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/GovIssueOpenFeignClient.java
@@ -301,4 +301,12 @@ public interface GovIssueOpenFeignClient {
**/
@PostMapping(value = "/gov/issue/issueprojectcategorydict/getcategorytaglist")
Result getCategoryTagList(@RequestBody CategoryTagListFormDTO formDTO);
+
+ /**
+ * @param customerId
+ * @Description 根据客户Id获取 议题列表
+ * @Author sun
+ **/
+ @PostMapping(value = "/gov/issue/issue/getissuelist")
+ Result> getIssueList(@RequestParam String customerId);
}
diff --git a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/fallback/GovIssueOpenFeignClientFallBack.java b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/fallback/GovIssueOpenFeignClientFallBack.java
index d8cc8c9d92..67e41d309a 100644
--- a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/fallback/GovIssueOpenFeignClientFallBack.java
+++ b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/feign/fallback/GovIssueOpenFeignClientFallBack.java
@@ -256,4 +256,9 @@ public class GovIssueOpenFeignClientFallBack implements GovIssueOpenFeignClient
public Result getCategoryTagList(CategoryTagListFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.GOV_ISSUE_SERVER, "getCategoryTagList", formDTO);
}
+
+ @Override
+ public Result> getIssueList(String customerId) {
+ return ModuleUtils.feignConError(ServiceConstant.GOV_ISSUE_SERVER, "getIssueList", customerId);
+ }
}
diff --git a/epmet-module/gov-issue/gov-issue-server/pom.xml b/epmet-module/gov-issue/gov-issue-server/pom.xml
index cce26d7129..db20e31756 100644
--- a/epmet-module/gov-issue/gov-issue-server/pom.xml
+++ b/epmet-module/gov-issue/gov-issue-server/pom.xml
@@ -216,7 +216,6 @@
192.168.1.130:9876;192.168.1.132:9876
- epmet_message
diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueController.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueController.java
index c64573730a..a539727606 100644
--- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueController.java
+++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueController.java
@@ -12,10 +12,7 @@ import com.epmet.resi.group.dto.group.result.GroupVotingListResultDTO;
import com.epmet.resi.group.dto.topic.form.TopicInfoFormDTO;
import com.epmet.service.IssueService;
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 org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -246,5 +243,18 @@ public class IssueController {
return new Result>().ok(issueService.getClosedListByGroup(formDTO));
}
+ /**
+ * desc: 获取议题列表
+ *
+ * @param customerId
+ * @return com.epmet.commons.tools.utils.Result>
+ * @author LiuJanJun
+ * @date 2021/4/27 10:19 上午
+ */
+ @PostMapping("getissuelist")
+ public Result> getIssueList(@RequestParam String customerId) {
+ return new Result>().ok(issueService.getIssueList(customerId));
+ }
+
}
diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueService.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueService.java
index e22236e324..90e06f1185 100644
--- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueService.java
+++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueService.java
@@ -315,4 +315,14 @@ public interface IssueService extends BaseService {
* @return java.util.List
*/
List getClosedListByGroup(AllIssueFormDTO formDTO);
+
+ /**
+ * desc: 根据客户Id获取议题列表
+ *
+ * @param customerId
+ * @return java.util.List
+ * @author LiuJanJun
+ * @date 2021/4/27 10:23 上午
+ */
+ List getIssueList(String customerId);
}
diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java
index 9b6bdb6688..7532a52fdb 100644
--- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java
+++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java
@@ -5,6 +5,7 @@ import com.alibaba.nacos.client.utils.StringUtils;
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.rocketmq.messages.GroupAchievementMQMsg;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.NumConstant;
@@ -27,14 +28,15 @@ import com.epmet.dao.IssueDao;
import com.epmet.dao.IssueProcessDao;
import com.epmet.dao.IssueProjectRelationDao;
import com.epmet.dto.*;
-import com.epmet.dto.form.*;
import com.epmet.dto.form.IssueAuditionFormDTO;
import com.epmet.dto.form.IssueShiftedFromTopicFormDTO;
+import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.IssueEntity;
import com.epmet.entity.IssueProcessEntity;
import com.epmet.entity.IssueProjectRelationEntity;
import com.epmet.feign.*;
+import com.epmet.commons.tools.enums.AchievementTypeEnum;
import com.epmet.redis.GovIssueRedis;
import com.epmet.redis.IssueVoteDetailRedis;
import com.epmet.resi.group.dto.group.form.AllIssueFormDTO;
@@ -44,10 +46,11 @@ import com.epmet.resi.group.dto.group.result.GroupInfoResultDTO;
import com.epmet.resi.group.dto.group.result.GroupShiftProjectListResultDTO;
import com.epmet.resi.group.dto.group.result.GroupVotingListResultDTO;
import com.epmet.resi.group.dto.topic.ResiTopicDTO;
-import com.epmet.resi.group.dto.topic.form.*;
import com.epmet.resi.group.dto.topic.form.GovTopicIssueInfoFormDTO;
+import com.epmet.resi.group.dto.topic.form.*;
import com.epmet.resi.group.dto.topic.result.GovTopicIssueInfoResultDTO;
import com.epmet.resi.group.feign.ResiGroupOpenFeignClient;
+import com.epmet.send.SendMqMsgUtil;
import com.epmet.service.*;
import com.epmet.utils.ModuleConstants;
import com.github.pagehelper.PageHelper;
@@ -553,7 +556,12 @@ public class IssueServiceImpl extends BaseServiceImpl imp
//}
//applicationService.update(app2update);
-
+ //发送小组成就消息
+ boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient)
+ .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(application.getCustomerId(), application.getGroupId(), AchievementTypeEnum.TOISSUE.getCode()));
+ if (!flag) {
+ logger.error("发送(小组成就)系统消息到message服务失败");
+ }
return app2update.getIssueId();
}
@@ -1387,4 +1395,17 @@ public class IssueServiceImpl extends BaseServiceImpl imp
return baseDao.selectClosedListByTopic(formDTO);
}
+ @Override
+ public List getIssueList(String customerId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda()
+ .eq(IssueEntity::getCustomerId,customerId)
+ .eq(IssueEntity::getDelFlag,NumConstant.ZERO_STR);
+ List issueEntities = baseDao.selectList(queryWrapper);
+ if (CollectionUtils.isEmpty(issueEntities)){
+ return null;
+ }
+ return ConvertUtils.sourceToTarget(issueEntities,IssueDTO.class);
+ }
+
}
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
index b378946ff3..bfe0f9f00f 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
@@ -2,6 +2,7 @@ package com.epmet.mq;
import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants;
import com.epmet.commons.rocketmq.constants.TopicConstants;
+import com.epmet.commons.tools.enums.EnvEnum;
import com.epmet.mq.listener.InitCustomerOrgRolesListener;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListener;
@@ -14,7 +15,8 @@ import javax.annotation.PostConstruct;
@Component
public class RocketMQConsumerRegister {
-
+ @Value("${spring.profiles.active}")
+ private String env;
@Value("${rocketmq.name-server}")
private String nameServer;
@@ -27,7 +29,9 @@ public class RocketMQConsumerRegister {
@PostConstruct
public void registerAllListeners() {
try {
- register(nameServer, ConsomerGroupConstants.INIT_CUSTOMER_ORG_ROLES_GROUP, MessageModel.CLUSTERING, TopicConstants.INIT_CUSTOMER, "*", new InitCustomerOrgRolesListener());
+ if (!EnvEnum.LOCAL.getCode().equals(env)) {
+ register(nameServer, ConsomerGroupConstants.INIT_CUSTOMER_ORG_ROLES_GROUP, MessageModel.CLUSTERING, TopicConstants.INIT_CUSTOMER, "*", new InitCustomerOrgRolesListener());
+ }
} catch (MQClientException e) {
e.printStackTrace();
}
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgListener.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgListener.java
deleted file mode 100644
index 6ddc79801b..0000000000
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgListener.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.epmet.mq.listener;
-
-import com.alibaba.fastjson.JSON;
-import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants;
-import com.epmet.commons.rocketmq.constants.TopicConstants;
-import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg;
-import com.epmet.commons.tools.distributedlock.DistributedLock;
-import com.epmet.commons.tools.exception.ExceptionUtils;
-import com.epmet.commons.tools.exception.RenException;
-import com.epmet.constant.UserWorkType;
-import com.epmet.dto.CustomerAgencyDTO;
-import com.epmet.dto.form.AddAgencyAndStaffFormDTO;
-import com.epmet.dto.form.AdminStaffFromDTO;
-import com.epmet.service.AgencyService;
-import org.apache.rocketmq.common.message.MessageExt;
-import org.apache.rocketmq.spring.annotation.MessageModel;
-import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-import org.apache.rocketmq.spring.core.RocketMQListener;
-import org.redisson.api.RLock;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * 监听初始化客户动作,为客户初始化角色列表
- */
-//@RocketMQMessageListener(topic = TopicConstants.INIT_CUSTOMER,
-// consumerGroup = ConsomerGroupConstants.INIT_CUSTOMER_ORG_ROLES_GROUP,
-// messageModel = MessageModel.CLUSTERING,
-// selectorExpression = "*")
-//@Component
-public class InitCustomerOrgListener implements RocketMQListener {
-
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- @Autowired
- private AgencyService agencyService;
-
- @Autowired
- private DistributedLock distributedLock;
-
- @Override
- public void onMessage(MessageExt messageExt) {
- String msg = new String(messageExt.getBody());
- logger.info("初始化客户-初始化组织信息-收到消息内容:{}", msg);
- InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class);
-
- RLock lock = null;
- try {
- lock = distributedLock.getLock(String.format("lock:init_customer_org:%s", msgObj.getCustomerId()),
- 30l, 30l, TimeUnit.SECONDS);
- agencyService.saveRootAgency(constructRootAndAgencyDTO(msgObj));
- } catch (RenException e) {
- // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试
- logger.error("【RocketMQ】初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e)));
- } catch (Exception e) {
- // 不是我们自己抛出的异常,可以让MQ重试
- logger.error("【RocketMQ】初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e)));
- throw e;
- } finally {
- distributedLock.unLock(lock);
- }
- }
-
- /**
- * @Description 构造dto
- * @return
- * @author wxz
- * @date 2021.01.06 15:03
- */
- private AddAgencyAndStaffFormDTO constructRootAndAgencyDTO(InitCustomerMQMsg msgObj) {
- AddAgencyAndStaffFormDTO agencyAndStaff = new AddAgencyAndStaffFormDTO();
- //客户组织信息
- CustomerAgencyDTO agencyDTO = new CustomerAgencyDTO();
- agencyDTO.setId(msgObj.getAgency().getAgencyId());
- agencyDTO.setCustomerId(msgObj.getCustomerId());
- agencyDTO.setOrganizationName(msgObj.getAgency().getOrganizationName());
- agencyDTO.setLevel(msgObj.getAgency().getLevel());
- agencyDTO.setAreaCode(msgObj.getAgency().getAreaCode());
- agencyDTO.setProvince(msgObj.getAgency().getProvince());
- agencyDTO.setCity(msgObj.getAgency().getCity());
- agencyDTO.setDistrict(msgObj.getAgency().getDistrict());
- agencyAndStaff.setAgencyDTO(agencyDTO);
-
- //客户管理员信息
- AdminStaffFromDTO staffSubmitFrom = new AdminStaffFromDTO();
- staffSubmitFrom.setCustomerId(msgObj.getCustomerId());
- staffSubmitFrom.setAgencyId(msgObj.getStaff().getAgencyId());
- staffSubmitFrom.setGender(msgObj.getStaff().getGender());
- staffSubmitFrom.setMobile(msgObj.getStaff().getMobile());
- staffSubmitFrom.setName(msgObj.getStaff().getName());
- staffSubmitFrom.setWorkType(UserWorkType.FULL_TIME);
- agencyAndStaff.setStaffDTO(staffSubmitFrom);
-
- return agencyAndStaff;
- }
-}
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java
index 1225da9abd..010e2044a3 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java
@@ -23,11 +23,12 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
/**
+ * @author wxz
* @Description 创建客户-组织和角色监听器
* @return
- * @author wxz
* @date 2021.03.03 16:10
-*/
+ */
+//@Component
public class InitCustomerOrgRolesListener implements MessageListenerConcurrently {
private Logger logger = LoggerFactory.getLogger(getClass());
@@ -37,7 +38,8 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ logger.error(ExceptionUtils.getErrorStackTrace(e));
+ return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
@@ -52,7 +54,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
try {
distributedLock = SpringContextUtils.getBean(DistributedLock.class);
lock = distributedLock.getLock(String.format("lock:init_customer_org:%s", msgObj.getCustomerId()),
- 30l, 30l, TimeUnit.SECONDS);
+ 30L, 30L, TimeUnit.SECONDS);
SpringContextUtils.getBean(AgencyService.class).saveRootAgency(constructRootAndAgencyDTO(msgObj));
} catch (RenException e) {
// 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试
@@ -67,8 +69,8 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
}
/**
- * @Description 构造dto
* @return
+ * @Description 构造dto
* @author wxz
* @date 2021.01.06 15:03
*/
@@ -98,4 +100,14 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
return agencyAndStaff;
}
+
+ /* @Override
+ public ConsumerConfigProperties getConsumerProperty() {
+ ConsumerConfigProperties configProperties = new ConsumerConfigProperties();
+ configProperties.setConsumerGroup(ConsomerGroupConstants.INIT_CUSTOMER_ORG_ROLES_GROUP);
+ configProperties.setTopic(TopicConstants.INIT_CUSTOMER);
+ configProperties.setTag("*");
+ configProperties.setConsumerListener(this);
+ return configProperties;
+ }*/
}
diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
new file mode 100644
index 0000000000..057cf3c501
--- /dev/null
+++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
@@ -0,0 +1,62 @@
+package com.epmet.mq;
+
+import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants;
+import com.epmet.commons.rocketmq.constants.TopicConstants;
+import com.epmet.mq.listener.InitCustomerComponentsListener;
+import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.consumer.listener.MessageListener;
+import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public class RocketMQConsumerRegister {
+
+ @Value("${rocketmq.name-server}")
+ private String nameServer;
+
+ /**
+ * @return
+ * @Description 注册监听器
+ * @author wxz
+ * @date 2021.03.03 16:09
+ */
+ @PostConstruct
+ public void registerAllListeners() {
+ try {
+ register(nameServer, ConsomerGroupConstants.INIT_CUSTOMER_COMPONENTS_GROUP, MessageModel.CLUSTERING, TopicConstants.INIT_CUSTOMER, "*", new InitCustomerComponentsListener());
+ } catch (MQClientException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void register(String nameServer, String group, MessageModel messageModel, String topic, String subException, MessageListener listener) throws MQClientException {
+ // 实例化消费者
+ DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group);
+
+ // 设置NameServer的地址
+ consumer.setNamesrvAddr(nameServer);
+ consumer.setMessageModel(messageModel);
+ consumer.setInstanceName(buildInstanceName());
+ // 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
+ consumer.subscribe(topic, subException);
+ // 注册回调实现类来处理从broker拉取回来的消息
+ consumer.registerMessageListener(listener);
+ // 启动消费者实例
+ consumer.start();
+ }
+
+ private String buildInstanceName() {
+ String instanceName = "";
+ for (int i = 0; i < 4; i++) {
+ int t = (int) (Math.random() * 10);
+ instanceName = instanceName.concat(t + "");
+ }
+
+ return instanceName;
+ }
+
+}
diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerCustomizeListener.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java
similarity index 54%
rename from epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerCustomizeListener.java
rename to epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java
index 6fa846c46c..d21ea39357 100644
--- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerCustomizeListener.java
+++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java
@@ -1,46 +1,45 @@
package com.epmet.mq.listener;
import com.alibaba.fastjson.JSON;
-import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants;
-import com.epmet.commons.rocketmq.constants.TopicConstants;
import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.dto.CustomerHomeDTO;
import com.epmet.service.CustomerHomeService;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
+import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
-import org.apache.rocketmq.spring.annotation.MessageModel;
-import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-import org.apache.rocketmq.spring.core.RocketMQListener;
import org.redisson.api.RLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 监听初始化客户动作,为客户初始化角色列表
*/
-@RocketMQMessageListener(topic = TopicConstants.INIT_CUSTOMER,
- consumerGroup = ConsomerGroupConstants.INIT_CUSTOMER_COMPONENTS_GROUP,
- messageModel = MessageModel.CLUSTERING,
- selectorExpression = "*")
-@Component
-public class InitCustomerCustomizeListener implements RocketMQListener {
+//@Component
+public class InitCustomerComponentsListener implements MessageListenerConcurrently {
private Logger logger = LoggerFactory.getLogger(getClass());
- @Autowired
- private CustomerHomeService customerHomeService;
-
- @Autowired
- private DistributedLock distributedLock;
-
@Override
- public void onMessage(MessageExt messageExt) {
+ public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) {
+ try {
+ msgs.forEach(msg -> consumeMessage(msg));
+ } catch (Exception e) {
+ logger.error(ExceptionUtils.getErrorStackTrace(e));
+ return ConsumeConcurrentlyStatus.RECONSUME_LATER;
+ }
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ }
+
+ private void consumeMessage(MessageExt messageExt) {
String msg = new String(messageExt.getBody());
logger.info("初始化客户-初始化客户自定义信息-收到消息内容:{}", msg);
InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class);
@@ -48,10 +47,14 @@ public class InitCustomerCustomizeListener implements RocketMQListener
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.resi.group.dto.group;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+
+/**
+ * 小组成就统计表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Data
+public class ResiGroupAchievementStatsDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ private String id;
+
+ /**
+ * 客户Id
+ */
+ private String customerId;
+
+ /**
+ * 小组Id
+ */
+ private String groupId;
+
+ /**
+ * 里程ID
+ */
+ private String achievementId;
+
+ /**
+ * 里程名称
+ */
+ private String achievementName;
+
+ /**
+ * 实现时间
+ */
+ private Date arriveTime;
+
+ /**
+ * 当前值
+ */
+ private Integer currentValue;
+
+ /**
+ * 目标值
+ */
+ private Integer targetValue;
+
+ /**
+ * 目标是否实现,是:1;否:0
+ */
+ private Integer isArrive;
+
+ /**
+ * 删除标记 0:未删除,1:已删除
+ */
+ private String delFlag;
+
+ /**
+ * 乐观锁
+ */
+ private Integer revision;
+
+ /**
+ * 创建人
+ */
+ private String createdBy;
+
+ /**
+ * 创建时间
+ */
+ private Date createdTime;
+
+ /**
+ * 更新人
+ */
+ private String updatedBy;
+
+ /**
+ * 更新时间
+ */
+ private Date updatedTime;
+
+}
\ No newline at end of file
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupDTO.java
index eb83fd5162..9ed8c34510 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupDTO.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupDTO.java
@@ -17,10 +17,12 @@
package com.epmet.resi.group.dto.group;
+import com.epmet.resi.group.dto.member.ResiGroupMemberDTO;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
+import java.util.List;
/**
@@ -85,6 +87,16 @@ Ps: 如果一个小组被拒绝,当前小组的状态将永久停留在“审
*/
private String visitSwitch;
+ /**
+ * 小组类型(ordinary:楼院小组 branch:支部小组)
+ */
+ private String groupType;
+
+ /**
+ * 小组等级
+ */
+ private Integer level;
+
/**
* 删除标记 0:未删除,1:已删除
*/
@@ -114,9 +126,7 @@ Ps: 如果一个小组被拒绝,当前小组的状态将永久停留在“审
* 更新时间
*/
private Date updatedTime;
+
+ private List memberList;
- /**
- * 小组类型(ordinary:楼院小组 branch:支部小组)
- */
- private String groupType;
}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupInfoRedisDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupInfoRedisDTO.java
index 88fa69ac31..66014b9c5e 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupInfoRedisDTO.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/ResiGroupInfoRedisDTO.java
@@ -46,6 +46,11 @@ public class ResiGroupInfoRedisDTO implements Serializable{
* */
private String gridId;
+ /**
+ * 小组等级
+ * */
+ private String level;
+
/**
* 组状态
* */
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/form/GroupFormDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/form/GroupFormDTO.java
new file mode 100644
index 0000000000..2fc8ba7b9a
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/form/GroupFormDTO.java
@@ -0,0 +1,17 @@
+package com.epmet.resi.group.dto.group.form;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zhaoqifeng
+ * @dscription
+ * @date 2021/4/19 15:57
+ */
+@Data
+public class GroupFormDTO implements Serializable {
+ private static final long serialVersionUID = 5330629771935235995L;
+ private String groupId;
+ private String gridId;
+}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/AchievementDetailResultDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/AchievementDetailResultDTO.java
new file mode 100644
index 0000000000..76ebe24978
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/AchievementDetailResultDTO.java
@@ -0,0 +1,41 @@
+package com.epmet.resi.group.dto.group.result;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author zhaoqifeng
+ * @dscription
+ * @date 2021/4/19 14:19
+ */
+@NoArgsConstructor
+@Data
+public class AchievementDetailResultDTO implements Serializable {
+
+ private static final long serialVersionUID = 2426917315141725167L;
+ /**
+ * 小组创建时间
+ */
+ private Long createdDate;
+ private List achievement;
+
+ @NoArgsConstructor
+ @Data
+ public static class AchievementBean {
+ /**
+ * 达成时间
+ */
+ private Long completionDate;
+ /**
+ * 成就描述(分拼在一起)
+ */
+ private String describe;
+ /**
+ * 是否达成 0,1
+ */
+ private Integer isArrive;
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GovGroupSummarizeResultDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GovGroupSummarizeResultDTO.java
index e0b0c2fd4c..da9773d04a 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GovGroupSummarizeResultDTO.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GovGroupSummarizeResultDTO.java
@@ -40,4 +40,8 @@ public class GovGroupSummarizeResultDTO implements Serializable {
* 话题总数
*/
private Integer totalTopics;
+ /**
+ * 小组等级
+ */
+ private String level;
}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupPointDetailResultDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupPointDetailResultDTO.java
new file mode 100644
index 0000000000..bc98f16da2
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupPointDetailResultDTO.java
@@ -0,0 +1,46 @@
+package com.epmet.resi.group.dto.group.result;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author zhaoqifeng
+ * @dscription
+ * @date 2021/4/21 10:37
+ */
+@NoArgsConstructor
+@Data
+public class GroupPointDetailResultDTO implements Serializable {
+
+ private static final long serialVersionUID = -1158521486690554498L;
+ /**
+ * 小组当前等级
+ */
+ private String level;
+ /**
+ * 总积分
+ */
+ private String total;
+ /**
+ * 今日增长
+ */
+ private String increase;
+ /**
+ * 距离升级所需积分
+ */
+ private String toUpgrade;
+ /**
+ * 下一等级积分
+ */
+ private String nextLevelPoint;
+ /**
+ * 下一等级
+ */
+ private String nextLevel;
+ /**
+ * 当前积分
+ */
+ private String currentPoint;
+}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupSummarizeResultDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupSummarizeResultDTO.java
index 0b19208c9f..dbf681b90d 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupSummarizeResultDTO.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/group/result/GroupSummarizeResultDTO.java
@@ -69,6 +69,8 @@ public class GroupSummarizeResultDTO implements Serializable {
* 进组审核open开启;close关闭
*/
private String auditSwitch;
+
+ private String level;
public GroupSummarizeResultDTO(){
this.setGroupId("");
this.setGroupHeadPhoto("");
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/AchievementResultDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/AchievementResultDTO.java
new file mode 100644
index 0000000000..29c1954dea
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/AchievementResultDTO.java
@@ -0,0 +1,18 @@
+package com.epmet.resi.group.dto.member.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author zhaoqifeng
+ * @dscription
+ * @date 2021/4/22 9:24
+ */
+@Data
+public class AchievementResultDTO implements Serializable {
+ private static final long serialVersionUID = 8079550501852632061L;
+ private String groupId;
+ private String achievementDesc;
+}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/GroupAchievementDTO.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/GroupAchievementDTO.java
new file mode 100644
index 0000000000..f041bba578
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/dto/member/result/GroupAchievementDTO.java
@@ -0,0 +1,18 @@
+package com.epmet.resi.group.dto.member.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zhaoqifeng
+ * @dscription
+ * @date 2021/4/22 9:42
+ */
+@Data
+public class GroupAchievementDTO implements Serializable {
+ private static final long serialVersionUID = 2195790168656351743L;
+ private String groupId;
+ private String groupName;
+ private String achievementName;
+}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/ResiGroupOpenFeignClient.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/ResiGroupOpenFeignClient.java
index 26dab5da6b..292972c45e 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/ResiGroupOpenFeignClient.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/ResiGroupOpenFeignClient.java
@@ -5,10 +5,7 @@ import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.resi.group.dto.group.ResiGroupDTO;
import com.epmet.resi.group.dto.group.form.*;
-import com.epmet.resi.group.dto.group.result.ApplicationDetailCopyResultDTO;
-import com.epmet.resi.group.dto.group.result.ApplyingGroupResultDTO;
-import com.epmet.resi.group.dto.group.result.GroupEditionDetailResultDTO;
-import com.epmet.resi.group.dto.group.result.GroupInfoResultDTO;
+import com.epmet.resi.group.dto.group.result.*;
import com.epmet.resi.group.dto.topic.MyCreateTopicsFormDTO;
import com.epmet.resi.group.dto.topic.ResiTopicDTO;
import com.epmet.resi.group.dto.topic.form.*;
@@ -226,4 +223,34 @@ public interface ResiGroupOpenFeignClient {
*/
@PostMapping("/resi/group/topic/allmessages")
Result> allMessages(@RequestBody AllMessagesFormDTO formDTO);
+
+ /**
+ * 获取小组详情
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:20
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("resi/group/group/groupDetail/{groupId}")
+ Result getGroupDetail(@PathVariable String groupId);
+
+ /**
+ * 获取网格下小组
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:57
+ * @param gridId
+ * @return com.epmet.commons.tools.utils.Result>
+ */
+ @PostMapping("resi/group/group/groupList/{gridId}")
+ Result> getGroupListByGrid(@PathVariable String gridId);
+
+ /**
+ * 小组积分详情
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:30
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("resi/group/group/groupPointDetail/{groupId}")
+ Result groupPointDetail(@PathVariable String groupId);
}
diff --git a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/fallback/ResiGroupOpenFeignClientFallback.java b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/fallback/ResiGroupOpenFeignClientFallback.java
index 544e18c6ba..84dee1113d 100644
--- a/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/fallback/ResiGroupOpenFeignClientFallback.java
+++ b/epmet-module/resi-group/resi-group-client/src/main/java/com/epmet/resi/group/feign/fallback/ResiGroupOpenFeignClientFallback.java
@@ -5,10 +5,7 @@ import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.resi.group.dto.group.ResiGroupDTO;
import com.epmet.resi.group.dto.group.form.*;
-import com.epmet.resi.group.dto.group.result.ApplicationDetailCopyResultDTO;
-import com.epmet.resi.group.dto.group.result.ApplyingGroupResultDTO;
-import com.epmet.resi.group.dto.group.result.GroupEditionDetailResultDTO;
-import com.epmet.resi.group.dto.group.result.GroupInfoResultDTO;
+import com.epmet.resi.group.dto.group.result.*;
import com.epmet.resi.group.dto.topic.MyCreateTopicsFormDTO;
import com.epmet.resi.group.dto.topic.ResiTopicDTO;
import com.epmet.resi.group.dto.topic.form.*;
@@ -162,4 +159,43 @@ public class ResiGroupOpenFeignClientFallback implements ResiGroupOpenFeignClien
public Result> allMessages(AllMessagesFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.RESI_GROUP_SERVER, "allMessages", formDTO);
}
+
+ /**
+ * 获取小组详情
+ *
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:20
+ */
+ @Override
+ public Result getGroupDetail(String groupId) {
+ return ModuleUtils.feignConError(ServiceConstant.RESI_GROUP_SERVER, "getGroupDetail", groupId);
+ }
+
+ /**
+ * 获取网格下小组
+ *
+ * @param gridId
+ * @return com.epmet.commons.tools.utils.Result>
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:57
+ */
+ @Override
+ public Result> getGroupListByGrid(String gridId) {
+ return ModuleUtils.feignConError(ServiceConstant.RESI_GROUP_SERVER, "getGroupListByGrid", gridId);
+ }
+
+ /**
+ * 小组积分详情
+ *
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:30
+ */
+ @Override
+ public Result groupPointDetail(String groupId) {
+ return ModuleUtils.feignConError(ServiceConstant.RESI_GROUP_SERVER, "groupPointDetail", groupId);
+ }
}
diff --git a/epmet-module/resi-group/resi-group-server/pom.xml b/epmet-module/resi-group/resi-group-server/pom.xml
index e7432526b2..05aeff9885 100644
--- a/epmet-module/resi-group/resi-group-server/pom.xml
+++ b/epmet-module/resi-group/resi-group-server/pom.xml
@@ -112,6 +112,18 @@
2.0.0
compile
+
+
+ com.epmet
+ epmet-commons-rocketmq
+ 2.0.0
+
+
+ com.epmet
+ oper-crm-client
+ 2.0.0
+ compile
+
@@ -185,6 +197,10 @@
SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+ 192.168.1.130:9876;192.168.1.132:9876
+ epmet_message
@@ -237,6 +253,8 @@
SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+ 192.168.1.130:9876;192.168.1.132:9876
@@ -288,6 +306,9 @@
SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+ 192.168.10.161:9876
@@ -336,6 +357,9 @@
SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1
+
+
+ 192.168.11.187:9876;192.168.11.184:9876
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupController.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupController.java
index 54fe089221..0cbfbe2e52 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupController.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupController.java
@@ -25,18 +25,21 @@ import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.modules.group.service.ResiGroupService;
import com.epmet.modules.group.service.ResiGroupStatisticalService;
+import com.epmet.modules.group.service.StatsAchievementService;
import com.epmet.resi.group.dto.group.GroupProcessingCountResultDTO;
import com.epmet.resi.group.dto.group.ResiGroupDTO;
import com.epmet.resi.group.dto.group.form.*;
import com.epmet.resi.group.dto.group.result.*;
import com.epmet.resi.group.dto.member.form.EditAuditSwitchFormDTO;
import com.epmet.resi.group.dto.member.form.ResiIdentityFormDTO;
+import com.epmet.resi.group.dto.member.result.AchievementResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
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 org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
@@ -55,6 +58,8 @@ public class ResiGroupController {
private ResiGroupService resiGroupService;
@Autowired
private ResiGroupStatisticalService resiGroupStatisticalService;
+ @Autowired
+ private StatsAchievementService statsAchievementService;
/**
* @param tokenDto
@@ -511,4 +516,78 @@ public class ResiGroupController {
return new Result>().ok(resiGroupService.allGroupList(formDTO));
}
+ /**
+ * 小组成就详情
+ * @author zhaoqifeng
+ * @date 2021/4/19 14:25
+ * @param formDTO
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("achievementdetail")
+ public Result achievementDetail(@RequestBody GroupFormDTO formDTO) {
+ return new Result().ok(resiGroupService.achievementDetail(formDTO));
+ }
+
+ /**
+ * 获取小组详情
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:17
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("groupDetail/{groupId}")
+ public Result getGroupDetail(@PathVariable String groupId) {
+ ResiGroupDTO groupDTO = resiGroupService.getGroupInfoAndGroupMember(groupId);
+ return new Result().ok(groupDTO);
+ }
+
+ /**
+ * 获取网格下小组
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:57
+ * @param gridId
+ * @return com.epmet.commons.tools.utils.Result>
+ */
+ @PostMapping("groupList/{gridId}")
+ public Result> getGroupListByGrid(@PathVariable String gridId) {
+ List list = resiGroupService.getGroupListByGrid(gridId);
+ return new Result>().ok(list);
+ }
+
+ /**
+ * 小组积分详情
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:22
+ * @param groupId
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("groupPointDetail/{groupId}")
+ public Result groupPointDetail(@PathVariable String groupId) {
+ return new Result().ok(resiGroupService.groupPointDetail(groupId));
+ }
+
+ /**
+ * 小组近段时间实现的成就列表
+ * @author zhaoqifeng
+ * @date 2021/4/22 9:27
+ * @param tokenDto
+ * @return com.epmet.commons.tools.utils.Result
+ */
+ @PostMapping("achievement")
+ public Result> achievement(@LoginUser TokenDto tokenDto, @RequestBody GroupFormDTO formDTO) {
+ return new Result>().ok(resiGroupService.achievement(tokenDto, formDTO));
+ }
+
+ /**
+ * desc: 初始化小组成就(用于小组成就上线后-历史小组的成就的初始化;执行过后就再无意义)
+ *
+ * @param customerId
+ * @return com.epmet.commons.tools.utils.Result
+ * @author LiuJanJun
+ * @date 2021/4/25 12:41 下午
+ */
+ @GetMapping("initachievement")
+ public Result initAchievement(@RequestParam String customerId) {
+ return new Result().ok(statsAchievementService.initAllGroupAchievement(customerId));
+ }
}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java
new file mode 100644
index 0000000000..b53a2cf69c
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java
@@ -0,0 +1,57 @@
+package com.epmet.modules.group.dao; /**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+
+
+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;
+
+/**
+ * 小组成就配置表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Mapper
+public interface ResiGroupAchievementConfigDao extends BaseDao {
+
+ /**
+ * desc: 获取成就配置 比targetValue
+ *
+ * @param achievementType
+ * @param offset
+ * @param pageSize
+ * @return java.util.List
+ * @author LiuJanJun
+ * @date 2021/4/21 10:04 下午
+ */
+ List 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);
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java
new file mode 100644
index 0000000000..d79f769aeb
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.dao;
+
+import com.epmet.commons.mybatis.dao.BaseDao;
+import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity;
+import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 小组成就统计表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Mapper
+public interface ResiGroupAchievementStatsDao extends BaseDao {
+ /**
+ * 获取未完成的成就
+ *
+ * @param groupId
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/19 15:52
+ */
+ List 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 list
+ * @param updateAll
+ * @return int
+ * @author LiuJanJun
+ * @date 2021/4/22 3:03 下午
+ */
+ int saveOrUpdate(@Param("list") List list, @Param("updateAll") boolean updateAll);
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupDao.java
index e372cd4d70..d31a9a22c0 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupDao.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupDao.java
@@ -29,6 +29,7 @@ import com.epmet.resi.group.dto.notice.result.UnReadListResultDTO;
import com.epmet.resi.group.dto.topic.result.AllMessagesResultDTO;
import com.epmet.resi.group.dto.topic.result.GetPastTopicListV2ResultDTO;
import com.epmet.resi.group.dto.topic.result.LatestTenResultDTO;
+import com.epmet.resi.group.dto.member.result.GroupAchievementDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -323,4 +324,13 @@ public interface ResiGroupDao extends BaseDao {
* @date 2021/4/25 上午9:10
*/
List selectReadFlagByUserAndId(@Param("ids")List ids,@Param("userIds")List userIds);
+
+ /**
+ * 我所在小组最近完成的成就
+ * @author zhaoqifeng
+ * @date 2021/4/22 9:47
+ * @param userId
+ * @return java.util.List
+ */
+ List selectRecentGroupAchievements(@Param("userId") String userId, @Param("gridId") String gridId);
}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementConfigEntity.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementConfigEntity.java
new file mode 100644
index 0000000000..8749ef16a0
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementConfigEntity.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.entity;
+
+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 2021-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("resi_group_achievement_config")
+public class ResiGroupAchievementConfigEntity extends BaseEpmetEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 客户Id
+ */
+ private String customerId;
+
+ /**
+ * 里程名称
+ */
+ private String achievementName;
+
+ /**
+ * 目标值
+ */
+ private Integer targetValue;
+
+ /**
+ * 里程类型:小组人数:member;topic:话题数;转议题数:toIssue;话题解决数:resloveTopic
+ */
+ private String achievementType;
+
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java
new file mode 100644
index 0000000000..3559786095
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 小组成就统计表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("resi_group_achievement_stats")
+public class ResiGroupAchievementStatsEntity extends BaseEpmetEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 客户Id
+ */
+ private String customerId;
+
+ /**
+ * 小组Id
+ */
+ private String groupId;
+
+ /**
+ * 成就ID
+ */
+ private String achievementId;
+
+ /**
+ * 成就名称
+ */
+ private String achievementName;
+
+ /**
+ * 成就类型
+ */
+ private String achievementType;
+
+ /**
+ * 实现时间
+ */
+ private Date arriveTime;
+
+ /**
+ * 当前值
+ */
+ private Integer currentValue;
+
+ /**
+ * 目标值
+ */
+ private Integer targetValue;
+
+ /**
+ * 目标是否实现,是:1;否:0
+ */
+ private Integer isArrive;
+
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupEntity.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupEntity.java
index 147aed6717..b50f50a417 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupEntity.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupEntity.java
@@ -88,4 +88,9 @@ Ps: 如果一个小组被拒绝,当前小组的状态将永久停留在“审
* 小组类型(ordinary:楼院小组 branch:支部小组)
*/
private String groupType;
+
+ /**
+ * 小组等级
+ */
+ private Integer level;
}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/redis/ResiGroupRedis.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/redis/ResiGroupRedis.java
index 03dcc4ecba..9d52a420b1 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/redis/ResiGroupRedis.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/redis/ResiGroupRedis.java
@@ -101,6 +101,7 @@ public class ResiGroupRedis {
ResiGroupInfoRedisDTO groupRedis = ConvertUtils.sourceToTarget(groupMySql,ResiGroupInfoRedisDTO.class);
groupRedis.setGroupId(groupMySql.getId());
groupRedis.setGroupState(groupMySql.getState());
+ groupRedis.setLevel("LV" + groupMySql.getLevel());
Map param = new HashMap<>();
param.put(TopicConstant.RESI_GROUP_ID,groupId);
param.put(FieldConstant.DEL_FLAG, NumConstant.ZERO_STR);
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java
new file mode 100644
index 0000000000..6bc56370a5
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java
@@ -0,0 +1,138 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service;
+
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.constant.StrConstant;
+import com.epmet.commons.tools.enums.AchievementTypeEnum;
+import com.epmet.commons.tools.exception.EpmetErrorCode;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.utils.UniqueIdGenerator;
+import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
+import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity;
+import com.epmet.modules.support.GroupAchievementUtils;
+import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * desc:实时计算小组成就完成情况
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+public abstract class AbstractStatsAchievementService {
+
+ @Autowired
+ private ResiGroupAchievementConfigService achievementConfigService;
+ @Autowired
+ private ResiGroupAchievementStatsService achievementStatsService;
+
+
+ /**
+ * desc: 根据成绩类型 分页获取成就配置 按targetValue 升序
+ *
+ * @param pageNum
+ * @param pageSize
+ * @return java.util.List
+ * @author LiuJanJun
+ * @date 2021/4/22 1:36 下午
+ */
+ protected List getAchievementConfigPage(int pageNum, int pageSize, String achievementType) {
+ return achievementConfigService.selectMoreThanOneByValue(achievementType, (pageNum - NumConstant.ONE) * pageSize, pageSize);
+ }
+
+ /**
+ * desc:初始化配置5条
+ *
+ * @param achievementType
+ * @return
+ */
+ protected List initAchievementConfig(String achievementType) {
+ AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType);
+ if (anEnum == null) {
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ if (AchievementTypeEnum.MEMBER.getCode().equals(anEnum.getCode())) {
+ throw new RenException("小组人数都到10000啦?");
+ }
+ ResiGroupAchievementConfigEntity lastOne = achievementConfigService.getLastOne(achievementType);
+ if (lastOne == null){
+ throw new RenException("小组成就配置有误,type:{}",achievementType);
+ }
+ List newConfigList = new ArrayList<>();
+ Integer nextTargetValue = null;
+ int preValue = lastOne.getTargetValue();
+ String oldName = lastOne.getAchievementName().replace(String.valueOf(lastOne.getTargetValue()), StrConstant.UNDER_LINE);
+ for (int i = 0; i < 5; i++) {
+ nextTargetValue = GroupAchievementUtils.getNextTargetValue(achievementType, preValue);
+ ResiGroupAchievementConfigEntity next = new ResiGroupAchievementConfigEntity();
+ //生成ID 自增
+ next.setId(UniqueIdGenerator.generate24());
+ next.setCustomerId(lastOne.getCustomerId());
+ next.setAchievementName(oldName.replace(StrConstant.UNDER_LINE, String.valueOf(nextTargetValue)));
+ preValue = nextTargetValue;
+ next.setTargetValue(nextTargetValue);
+ next.setAchievementType(lastOne.getAchievementType());
+ newConfigList.add(next);
+ }
+ achievementConfigService.insertBatch(newConfigList);
+ return newConfigList;
+ }
+
+ /**
+ * desc: 插入或新增成就统计
+ *
+ * @param haveArrive
+ * @param updateAll
+ * @return void
+ * @author LiuJanJun
+ * @date 2021/4/25 12:26 下午
+ */
+ protected Integer saveOrUpdate(List haveArrive, boolean updateAll){
+ return achievementStatsService.saveOrUpdate(haveArrive,updateAll);
+ }
+
+ /**
+ * desc: 获取小组最后一个未实现的成就
+ *
+ * @param customerId
+ * @param groupId
+ * @param achievementType
+ * @return com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity
+ * @author LiuJanJun
+ * @date 2021/4/25 12:28 下午
+ */
+ protected ResiGroupAchievementStatsEntity selectLastUnAchieved(String customerId, String groupId, String achievementType){
+ return achievementStatsService.selectLastUnAchieved(customerId, groupId, achievementType);
+ }
+
+ /**
+ * desc: 更新小组成就
+ *
+ * @param recordDTO
+ * @return java.lang.Integer
+ * @author LiuJanJun
+ * @date 2021/4/25 12:30 下午
+ */
+ protected void update(ResiGroupAchievementStatsDTO recordDTO){
+ achievementStatsService.update(recordDTO);
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java
new file mode 100644
index 0000000000..d7de022e82
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service;
+
+import com.epmet.commons.mybatis.service.BaseService;
+import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
+
+import java.util.List;
+
+/**
+ * 小组成就配置表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+public interface ResiGroupAchievementConfigService extends BaseService {
+
+ ResiGroupAchievementConfigEntity getLastOne(String achievementType);
+
+ List selectMoreThanOneByValue(String achievementType,int offset,int pageSize);
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java
new file mode 100644
index 0000000000..4ad098eedc
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service;
+
+import com.epmet.commons.mybatis.service.BaseService;
+import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity;
+import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO;
+
+import java.util.List;
+
+/**
+ * 小组成就统计表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+public interface ResiGroupAchievementStatsService extends BaseService {
+
+ /**
+ * 默认更新
+ *
+ * @param dto
+ * @return void
+ * @author generator
+ * @date 2021-04-19
+ */
+ void update(ResiGroupAchievementStatsDTO dto);
+
+ /**
+ * 已达成的成就
+ * @author zhaoqifeng
+ * @date 2021/4/19 15:15
+ * @param groupId
+ * @return java.util.List
+ */
+ List getAchieved(String groupId);
+
+ /**
+ * 未达成的成就
+ * @author zhaoqifeng
+ * @date 2021/4/19 15:15
+ * @param groupId
+ * @return java.util.List
+ */
+ List 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 haveArrive, boolean updateAll);
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupService.java
index c2073a7952..d5ae200dd7 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupService.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupService.java
@@ -20,6 +20,7 @@ package com.epmet.modules.group.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
+import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.modules.group.entity.ResiGroupEntity;
import com.epmet.resi.group.dto.UserRoleDTO;
@@ -28,6 +29,8 @@ import com.epmet.resi.group.dto.group.ResiGroupDTO;
import com.epmet.resi.group.dto.group.form.*;
import com.epmet.resi.group.dto.group.result.*;
import com.epmet.resi.group.dto.member.form.EditAuditSwitchFormDTO;
+import com.epmet.resi.group.dto.member.result.AchievementResultDTO;
+import jdk.nashorn.internal.parser.Token;
import java.util.HashMap;
import java.util.List;
@@ -378,4 +381,49 @@ public interface ResiGroupService extends BaseService {
* @Description 所有小组查询
**/
List allGroupList(AllGroupListFormDTO formDTO);
+
+ /**
+ * 小组成就详情
+ * @author zhaoqifeng
+ * @date 2021/4/19 14:25
+ * @param formDTO
+ * @return com.epmet.resi.group.dto.group.result.AchievementDetailResultDTO
+ */
+ AchievementDetailResultDTO achievementDetail(GroupFormDTO formDTO);
+
+ /**
+ * 获取网格下小组列表
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:42
+ * @param gridId
+ * @return java.util.List
+ */
+ List getGroupListByGrid(String gridId);
+
+ /**
+ * 小组积分详情
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:22
+ * @param groupId
+ * @return com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO
+ */
+ GroupPointDetailResultDTO groupPointDetail(String groupId);
+
+ /**
+ * 小组近段时间实现的成就列表
+ * @author zhaoqifeng
+ * @date 2021/4/22 9:27
+ * @param tokenDto
+ * @return com.epmet.resi.group.dto.member.result.AchievementResultDTO
+ */
+ List achievement(TokenDto tokenDto, GroupFormDTO formDTO);
+
+ /**
+ * 获取小组信息及小组成员
+ * @author zhaoqifeng
+ * @date 2021/4/23 14:56
+ * @param groupId
+ * @return com.epmet.resi.group.dto.group.ResiGroupDTO
+ */
+ ResiGroupDTO getGroupInfoAndGroupMember(String groupId);
}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java
new file mode 100644
index 0000000000..981c31f46a
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service;
+
+/**
+ * desc:实时计算小组成就完成情况
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+public interface StatsAchievementService{
+
+ /**
+ * desc: 初始化所有小组的各种成就入口
+ *
+ * @param customerId
+ * @return java.lang.Boolean
+ * @author LiuJanJun
+ * @date 2021/4/20
+ */
+ Boolean initAllGroupAchievement(String customerId);
+
+ /**
+ * desc: 根据小组Id计算小组成就 入口
+ *
+ * @param customerId
+ * @param groupId
+ * @param achievementType 成就类型 小组人数、话题数、转议题数、小组内问题解决数
+ * @return java.lang.Boolean
+ * @author LiuJanJun
+ * @date 2021/4/20
+ */
+ Boolean calculateAcm(String customerId, String groupId, String achievementType);
+
+
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java
new file mode 100644
index 0000000000..85a8077e78
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service.impl;
+
+import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
+import com.epmet.modules.group.dao.ResiGroupAchievementConfigDao;
+import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
+import com.epmet.modules.group.service.ResiGroupAchievementConfigService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 小组成就配置表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Service
+public class ResiGroupAchievementConfigServiceImpl extends BaseServiceImpl implements ResiGroupAchievementConfigService {
+
+ @Override
+ public ResiGroupAchievementConfigEntity getLastOne(String achievementType) {
+ return baseDao.getLastOne(achievementType);
+ }
+
+ @Override
+ public List selectMoreThanOneByValue(String achievementType,int offset,int pageSize) {
+ return baseDao.selectMoreThanOneByValue(achievementType,offset,pageSize);
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java
new file mode 100644
index 0000000000..f111f2f3b7
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.modules.group.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.utils.ConvertUtils;
+import com.epmet.modules.group.dao.ResiGroupAchievementStatsDao;
+import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity;
+import com.epmet.modules.group.service.ResiGroupAchievementStatsService;
+import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 小组成就统计表
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-04-19
+ */
+@Service
+public class ResiGroupAchievementStatsServiceImpl extends BaseServiceImpl implements ResiGroupAchievementStatsService {
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(ResiGroupAchievementStatsDTO dto) {
+ ResiGroupAchievementStatsEntity entity = ConvertUtils.sourceToTarget(dto, ResiGroupAchievementStatsEntity.class);
+ updateById(entity);
+ }
+
+ /**
+ * 已达成的成就
+ *
+ * @param groupId
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/19 15:15
+ */
+ @Override
+ public List getAchieved(String groupId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("GROUP_ID", groupId);
+ wrapper.eq("IS_ARRIVE", NumConstant.ONE);
+ wrapper.eq("DEL_FLAG", NumConstant.ZERO);
+ wrapper.orderByDesc("ARRIVE_TIME");
+ wrapper.orderByDesc("TARGET_VALUE");
+ List list = baseDao.selectList(wrapper);
+ return ConvertUtils.sourceToTarget(list, ResiGroupAchievementStatsDTO.class);
+ }
+
+ /**
+ * 未达成的成就
+ *
+ * @param groupId
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/19 15:15fang
+ */
+ @Override
+ public List getUnAchieved(String groupId) {
+ 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 haveArrive, boolean updateAll) {
+ return baseDao.saveOrUpdate(haveArrive, updateAll);
+ }
+
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java
index bf50316c61..2c73841cbc 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java
@@ -21,6 +21,7 @@ import com.alibaba.fastjson.JSON;
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.rocketmq.messages.GroupAchievementMQMsg;
import com.epmet.commons.tools.constant.*;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.RenException;
@@ -30,6 +31,7 @@ import com.epmet.commons.tools.scan.param.ImgTaskDTO;
import com.epmet.commons.tools.scan.param.TextScanParamDTO;
import com.epmet.commons.tools.scan.param.TextTaskDTO;
import com.epmet.commons.tools.scan.result.SyncScanResult;
+import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.security.user.LoginUserUtil;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
@@ -43,6 +45,7 @@ import com.epmet.dto.result.UserRoleResultDTO;
import com.epmet.feign.EpmetMessageOpenFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.modules.constant.UserMessageConstant;
+import com.epmet.commons.tools.enums.AchievementTypeEnum;
import com.epmet.modules.feign.EpmetMessageFeignClient;
import com.epmet.modules.feign.EpmetUserFeignClient;
import com.epmet.modules.feign.GovOrgFeignClient;
@@ -53,15 +56,14 @@ import com.epmet.modules.group.entity.GroupEditSubmitRecordEntity;
import com.epmet.modules.group.entity.ResiGroupEntity;
import com.epmet.modules.group.entity.ResiGroupOperationEntity;
import com.epmet.modules.group.redis.ResiGroupRedis;
-import com.epmet.modules.group.service.ResiGroupCodeService;
-import com.epmet.modules.group.service.ResiGroupOperationService;
-import com.epmet.modules.group.service.ResiGroupService;
-import com.epmet.modules.group.service.ResiGroupStatisticalService;
+import com.epmet.modules.group.service.*;
import com.epmet.modules.member.dao.GroupMemeberOperationDao;
import com.epmet.modules.member.dao.ResiGroupMemberDao;
+import com.epmet.modules.member.entity.ResiGroupMemberEntity;
import com.epmet.modules.member.redis.ResiGroupMemberRedis;
import com.epmet.modules.member.service.GroupMemeberOperationService;
import com.epmet.modules.member.service.ResiGroupMemberService;
+import com.epmet.modules.support.GroupLevelUtils;
import com.epmet.modules.topic.service.ResiTopicService;
import com.epmet.modules.utils.ModuleConstant;
import com.epmet.resi.group.constant.*;
@@ -75,7 +77,11 @@ import com.epmet.resi.group.dto.member.GroupMemeberOperationDTO;
import com.epmet.resi.group.dto.member.ResiGroupMemberDTO;
import com.epmet.resi.group.dto.member.ResiGroupMemberInfoRedisDTO;
import com.epmet.resi.group.dto.member.form.EditAuditSwitchFormDTO;
+import com.epmet.resi.group.dto.member.result.AchievementResultDTO;
+import com.epmet.resi.group.dto.member.result.GroupAchievementDTO;
+import com.epmet.send.SendMqMsgUtil;
import com.github.pagehelper.PageHelper;
+import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -85,7 +91,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
-import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -168,6 +173,9 @@ public class ResiGroupServiceImpl extends BaseServiceImpl page(Map params) {
IPage page = baseDao.selectPage(
@@ -689,6 +697,14 @@ public class ResiGroupServiceImpl extends BaseServiceImpl msgList = new ArrayList<>();
msgList.add(wxSubscribeMessageFormDTO);
epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList);
+
+ //发送小组成就消息
+ boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient)
+ .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(resiGroupDTO.getCustomerId(), resiGroupDTO.getId(), AchievementTypeEnum.MEMBER.getCode()));
+ if (!flag) {
+ logger.error("发送(小组成就)系统消息到message服务失败");
+ }
+
return new Result();
}
@@ -858,6 +874,7 @@ public class ResiGroupServiceImpl extends BaseServiceImpl> getGroupIdsByGridIdList(List gridIdList) {
- if(null == gridIdList || gridIdList.size() < NumConstant.ONE){
+ if(null == gridIdList || gridIdList.size() < NumConstant.ONE) {
return null;
}
Map> result = new HashMap<>();
@@ -1222,6 +1239,135 @@ public class ResiGroupServiceImpl extends BaseServiceImpl achievementList = new ArrayList<>();
+ //1.小组创建时间
+ ResiGroupEntity group = baseDao.selectById(formDTO.getGroupId());
+ resultDTO.setCreatedDate(DateUtils.dateToTimestamp(group.getCreatedTime()));
+
+ //2.即将完成的3个成就
+ List unAchievedList = resiGroupAchievementStatsService.getUnAchieved(formDTO.getGroupId());
+ if (CollectionUtils.isNotEmpty(unAchievedList)) {
+ Collections.reverse(unAchievedList);
+ unAchievedList.forEach(item -> {
+ AchievementDetailResultDTO.AchievementBean bean = new AchievementDetailResultDTO.AchievementBean();
+ String describe = item.getAchievementName() + "(" + item.getCurrentValue().toString() + "/" + item.getTargetValue().toString() + ")";
+ bean.setDescribe(describe);
+ bean.setIsArrive(item.getIsArrive());
+ achievementList.add(bean);
+ });
+ }
+ //3.已完成的成就
+ List achievedList = resiGroupAchievementStatsService.getAchieved(formDTO.getGroupId());
+ if (CollectionUtils.isNotEmpty(achievedList)) {
+ achievedList.forEach(item -> {
+ AchievementDetailResultDTO.AchievementBean bean = new AchievementDetailResultDTO.AchievementBean();
+ bean.setDescribe(item.getAchievementName());
+ if (item.getArriveTime() != null){
+ bean.setCompletionDate(DateUtils.dateToTimestamp(item.getArriveTime()));
+ }
+ bean.setIsArrive(item.getIsArrive());
+ achievementList.add(bean);
+ });
+ }
+ resultDTO.setAchievement(achievementList);
+ return resultDTO;
+ }
+
+ /**
+ * 获取网格下小组列表
+ *
+ * @param gridId
+ * @return java.util.List
+ * @author zhaoqifeng
+ * @date 2021/4/21 15:42
+ */
+ @Override
+ public List getGroupListByGrid(String gridId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("GRID_ID", gridId)
+ .eq("STATE", GroupStateConstant.GROUP_APPROVED)
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ List list = baseDao.selectList(wrapper);
+ return ConvertUtils.sourceToTarget(list, ResiGroupDTO.class);
+ }
+
+ /**
+ * 小组积分详情
+ *
+ * @param groupId
+ * @return com.epmet.resi.group.dto.group.result.GroupPointDetailResultDTO
+ * @author zhaoqifeng
+ * @date 2021/4/21 16:22
+ */
+ @Override
+ public GroupPointDetailResultDTO groupPointDetail(String groupId) {
+ GroupPointDetailResultDTO result = new GroupPointDetailResultDTO();
+ ResiGroupEntity group = baseDao.selectById(groupId);
+ Integer nextLevel = group.getLevel() + 1;
+ Integer nextLevelPoint = GroupLevelUtils.getPoint(nextLevel);
+ result.setLevel("LV" + group.getLevel().toString());
+ result.setNextLevel("LV" + nextLevel.toString());
+ result.setNextLevelPoint(nextLevelPoint.toString());
+ return result;
+ }
+
+ /**
+ * 小组近段时间实现的成就列表
+ *
+ * @param tokenDto
+ * @return com.epmet.resi.group.dto.member.result.AchievementResultDTO
+ * @author zhaoqifeng
+ * @date 2021/4/22 9:27
+ */
+ @Override
+ public List achievement(TokenDto tokenDto, GroupFormDTO formDTO) {
+ List result = new ArrayList<>();
+
+ List list = baseDao.selectRecentGroupAchievements(tokenDto.getUserId(), formDTO.getGridId());
+ if (CollectionUtils.isNotEmpty(list)) {
+ result =
+ list.stream().map(item -> {
+ AchievementResultDTO dto = new AchievementResultDTO();
+ String desc = item.getGroupName() + ":" + "达成“" + item.getAchievementName() + "”" + "成就";
+ dto.setAchievementDesc(desc);
+ dto.setGroupId(item.getGroupId());
+ return dto;
+ }).collect(Collectors.toList());
+ }
+ return result;
+ }
+
+ /**
+ * 获取小组信息及小组成员
+ *
+ * @param groupId
+ * @return com.epmet.resi.group.dto.group.ResiGroupDTO
+ * @author zhaoqifeng
+ * @date 2021/4/23 14:56
+ */
+ @Override
+ public ResiGroupDTO getGroupInfoAndGroupMember(String groupId) {
+ ResiGroupDTO group = this.get(groupId);
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("RESI_GROUP_ID", groupId)
+ .eq("STATUS", GroupStateConstant.GROUP_APPROVED)
+ .eq("DEL_FLAG", NumConstant.ZERO_STR);
+ List memberList = resiGroupMemberDao.selectList(wrapper);
+ group.setMemberList(ConvertUtils.sourceToTarget(memberList, ResiGroupMemberDTO.class));
+ return group;
+ }
+
@Override
public GroupDetailResultDTO getGroupDetail(String groupId) {
GroupDetailResultDTO groupDetail = new GroupDetailResultDTO();
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java
new file mode 100644
index 0000000000..e88b2ce588
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java
@@ -0,0 +1,399 @@
+package com.epmet.modules.group.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.exception.EpmetErrorCode;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.dto.CustomerDTO;
+import com.epmet.dto.IssueDTO;
+import com.epmet.feign.GovIssueOpenFeignClient;
+import com.epmet.feign.OperCrmOpenFeignClient;
+import com.epmet.commons.tools.enums.AchievementTypeEnum;
+import com.epmet.modules.group.dao.ResiGroupDao;
+import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity;
+import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity;
+import com.epmet.modules.group.entity.ResiGroupEntity;
+import com.epmet.modules.group.service.AbstractStatsAchievementService;
+import com.epmet.modules.group.service.StatsAchievementService;
+import com.epmet.modules.member.dao.ResiGroupMemberDao;
+import com.epmet.modules.member.entity.ResiGroupMemberEntity;
+import com.epmet.modules.topic.dao.ResiTopicDao;
+import com.epmet.modules.topic.entity.ResiTopicEntity;
+import com.epmet.resi.group.constant.TopicConstant;
+import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * desc:
+ *
+ * @author: LiuJanJun
+ * @date: 2021/4/20 5:48 下午
+ * @version: 1.0
+ */
+@Slf4j
+@Service
+public class StatsAchievementServiceImpl extends AbstractStatsAchievementService implements StatsAchievementService {
+ @Autowired
+ private ResiGroupMemberDao resiGroupMemberDao;
+ @Autowired
+ private ResiTopicDao resiTopicDao;
+ @Autowired
+ private ResiGroupDao resiGroupDao;
+ @Autowired
+ private OperCrmOpenFeignClient operCrmOpenFeignClient;
+ @Autowired
+ private GovIssueOpenFeignClient govIssueOpenFeignClient;
+
+
+ /**
+ * desc: 计算小组成就 统一入口
+ *
+ * @return java.lang.Boolean
+ * @author LiuJanJun
+ * @date 2021/4/20
+ */
+ @Override
+ public Boolean initAllGroupAchievement(String cId) {
+ //计算所有类型的 小组人数、话题数、转议题数、小组内问题解决数
+ //1。获取客户
+ List customerIdList = getCustomerIds(cId);
+ if (CollectionUtils.isEmpty(customerIdList)) {
+ throw new RenException("没有需要初始化的客户数据");
+ }
+ for (String customerId : customerIdList) {
+ //2。获取小组数据
+ List groupEntities = getCustomerGroupList(customerId);
+ if (CollectionUtils.isEmpty(groupEntities)) {
+ log.warn("没有需要初始化的小组数据,customerId:{}", customerId);
+ continue;
+ }
+ //3 获取客户下议题数据
+ Result> issueListResult = govIssueOpenFeignClient.getIssueList(customerId);
+ if (issueListResult == null || CollectionUtils.isEmpty(issueListResult.getData())) {
+ log.warn("没有需要初始化的小组转为议题的数据,customerId:{}", customerId);
+ continue;
+ }
+ Map issueCreateTimeMap = issueListResult.getData().stream().collect(Collectors.toMap(IssueDTO::getId, IssueDTO::getCreatedTime));
+ for (ResiGroupEntity groupEntity : groupEntities) {
+ //2.1 获取小组成员数据
+ String groupId = groupEntity.getId();
+ List groupMemberList = getGroupMemberList(customerId, groupId);
+ if (CollectionUtils.isEmpty(groupMemberList)) {
+ log.warn("没有需要初始化的小组成员数据,customerId:{},groupId:{}", customerId, groupId);
+ //初始化小组的前4个成就
+ calculateGroupAchievement(customerId, groupId, NumConstant.ZERO, AchievementTypeEnum.MEMBER.getCode());
+ } else {
+ //2.2 计算出 组成员 达到的成就
+ List memberArriveList = new ArrayList<>();
+ buildAchievementEntityList(customerId, groupId, AchievementTypeEnum.MEMBER.getCode(), groupMemberList.size(), null, memberArriveList);
+ //设置实际达到成就时间 最后一条为未实现 所以-1
+ for (int j = 0; j < memberArriveList.size() - 1; j++) {
+ memberArriveList.get(j).setArriveTime(groupMemberList.get(j).getCreatedTime());
+ }
+ saveOrUpdate(memberArriveList, true);
+ }
+
+ //2.3 获取小组话题数据
+ List groupTopicList = getGroupTopicList(customerId, groupId);
+ if (CollectionUtils.isEmpty(groupTopicList)) {
+ log.warn("没有需要初始化的小组话题数据,customerId:{},groupId:{}", customerId, groupId);
+ continue;
+ }
+
+ //2.4 计算出 话题 达到的成就
+ List topicArriveList = new ArrayList<>();
+ buildAchievementEntityList(customerId, groupId, AchievementTypeEnum.TOPIC.getCode(), groupTopicList.size(), null, topicArriveList);
+ //设置实际达到成就时间 最后一条为未实现 所以-1
+ for (int j = 0; j < topicArriveList.size() - 1; j++) {
+ topicArriveList.get(j).setArriveTime(groupTopicList.get(j).getCreatedTime());
+ }
+
+ //2.5 计算出 转议题 达到的成就
+ List toIssueTopicList = groupTopicList.stream().filter(ResiTopicEntity::getShiftIssue).collect(Collectors.toList());
+ List toIssueArriveList = new ArrayList<>();
+ buildAchievementEntityList(customerId, groupId, AchievementTypeEnum.TOISSUE.getCode(), toIssueTopicList.size(), null, toIssueArriveList);
+
+ //设置实际达到成就时间 最后一条为未实现 所以-1
+ for (int j = 0; j < toIssueArriveList.size() - 1; j++) {
+ toIssueArriveList.get(j).setArriveTime(issueCreateTimeMap.getOrDefault(toIssueTopicList.get(j).getIssueId(), new Date()));
+ }
+
+ //2.6 计算出 话题被解决 达到的成就
+ List resolveTopicList = groupTopicList.stream()
+ .filter(o -> TopicConstant.CLOSED.equals(o.getStatus()) && TopicConstant.RESOLVED.equals(o.getClosedStatus())).collect(Collectors.toList());
+ List resolveTopicArriveList = new ArrayList<>();
+ buildAchievementEntityList(customerId, groupId, AchievementTypeEnum.RESOVLE_TOPIC.getCode(), resolveTopicList.size(), null, resolveTopicArriveList);
+
+ //设置实际达到成就时间 最后一条为未实现 所以-1
+ for (int j = 0; j < resolveTopicArriveList.size() - 1; j++) {
+ resolveTopicArriveList.get(j).setArriveTime(resolveTopicList.get(j).getCreatedTime());
+ }
+ List list = new ArrayList<>();
+ list.addAll(topicArriveList);
+ list.addAll(toIssueArriveList);
+ list.addAll(resolveTopicArriveList);
+ saveOrUpdate(list, true);
+ }
+ }
+
+ return true;
+ }
+
+
+ /**
+ * desc: 根据小组Id计算小组成就 入口
+ *
+ * @param customerId
+ * @param groupId
+ * @param achievementType 成就类型 小组人数、话题数、转议题数、小组内问题解决数
+ * @return java.lang.Boolean
+ * @author LiuJanJun
+ * @date 2021/4/20
+ */
+ @Override
+ public Boolean calculateAcm(String customerId, String groupId, String achievementType) {
+ AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType);
+ if (StringUtils.isBlank(customerId) || StringUtils.isBlank(groupId) || anEnum == null) {
+ return false;
+ }
+ Integer currentValue = null;
+ switch (anEnum) {
+ case TOPIC:
+ //查询话题数
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId, customerId)
+ .eq(ResiTopicEntity::getGroupId, groupId)
+ .eq(ResiTopicEntity::getDelFlag, NumConstant.ZERO_STR);
+ currentValue = resiTopicDao.selectCount(queryWrapper);
+ break;
+ case MEMBER:
+ currentValue = resiGroupMemberDao.countAllMembers(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_STR);
+ currentValue = 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_STR);
+ currentValue = resiTopicDao.selectCount(queryWrapper);
+ break;
+ default:
+ log.info("calculateAcm error");
+ }
+ log.info("calculateAcm achievementType:{},groupId:{},currentValue:{}", groupId, currentValue, achievementType);
+ calculateGroupAchievement(customerId, groupId, currentValue, achievementType);
+ return true;
+ }
+
+ /**
+ * desc: 插入或更新小组成就
+ *
+ * @param customerId
+ * @param groupId
+ */
+ private void calculateGroupAchievement(String customerId, String groupId, int currentValue, String achievementType) {
+ //根据成就类型获取小组未实现成就 数据库正常只会有一条
+ ResiGroupAchievementStatsEntity one = super.selectLastUnAchieved(customerId, groupId, achievementType);
+
+ List haveArrive = new ArrayList<>();
+ //如果没有实现的成就则说明是初始化
+ if (one == null) {
+ //第一次创建小组时;初始化那集中类型的成就;没有即将完成的成就 且 类型为小组成员 且 成员(不包括组长)数为0 所以需要初始化下 小组成就的那4类
+ if (AchievementTypeEnum.MEMBER.getCode().equals(achievementType) && currentValue == NumConstant.ZERO) {
+ for (AchievementTypeEnum achievement : AchievementTypeEnum.values()) {
+ initAchievementStat(customerId, groupId, achievement.getCode(), currentValue, haveArrive);
+ }
+ } else {
+ initAchievementStat(customerId, groupId, achievementType, currentValue, haveArrive);
+ }
+
+ //初始化如果记录存在 只更新修改时间
+ super.saveOrUpdate(haveArrive, false);
+ return;
+ }
+
+ boolean isBatch = false;
+ Integer targetValue = one.getTargetValue();
+ //改为已实现
+ if (currentValue >= targetValue) {
+ isBatch = true;
+ buildAchievementEntityList(customerId, groupId, achievementType, currentValue, one.getTargetValue(), haveArrive);
+ }
+
+ if (isBatch) {
+ super.saveOrUpdate(haveArrive, true);
+ } else {
+ //未实现 只更新当前值
+ ResiGroupAchievementStatsDTO newStat = new ResiGroupAchievementStatsDTO();
+ newStat.setId(one.getId());
+ newStat.setCurrentValue(currentValue);
+ super.update(newStat);
+ }
+ }
+
+ /**
+ * desc: 初始化成就
+ *
+ * @return void
+ * @author LiuJanJun
+ * @date 2021/4/23 6:20 下午
+ */
+ private void initAchievementStat(String customerId, String groupId, String achievementType, int currentValue, List haveArrive) {
+ buildAchievementEntityList(customerId, groupId, achievementType, currentValue, null, haveArrive);
+ if (CollectionUtils.isEmpty(haveArrive)) {
+ throw new RenException("小组达成成就失败");
+ }
+ }
+
+ private void buildAchievementEntityList(String customerId, String groupId, String achievementType,
+ Integer currentValue, Integer targetValue, List haveArrive) {
+ boolean isContinue;
+ int pageNum = NumConstant.ONE;
+ int pageSize = NumConstant.TEN;
+ do { //没有任何数据说明是初始化
+ List list = getConfigByType(achievementType, pageNum++, pageSize);
+ //查询和初始化都失败啦
+ if (CollectionUtils.isEmpty(list)) {
+ log.error("calculateMember get config fail");
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ isContinue = buildArriveList(customerId, groupId, achievementType, currentValue, targetValue, haveArrive, list);
+ } while (isContinue);
+ }
+
+ private boolean buildArriveList(String customerId, String groupId, String achievementType, int currentValue, Integer targetValue,
+ List haveArrive, List list) {
+ boolean isContinue = true;
+ for (ResiGroupAchievementConfigEntity configEntity : list) {
+ if (targetValue != null) {
+ //筛选出已经完成的成就
+ if (configEntity.getTargetValue() < targetValue) {
+ continue;
+ }
+ }
+ ResiGroupAchievementStatsEntity statsEntity = new ResiGroupAchievementStatsEntity();
+ statsEntity.setCustomerId(customerId);
+ statsEntity.setGroupId(groupId);
+ statsEntity.setAchievementId(configEntity.getId());
+ statsEntity.setAchievementName(configEntity.getAchievementName());
+
+ statsEntity.setAchievementType(achievementType);
+ statsEntity.setCurrentValue(currentValue);
+ statsEntity.setTargetValue(configEntity.getTargetValue());
+ statsEntity.setDelFlag(NumConstant.ZERO_STR);
+ statsEntity.setArriveTime(new Date());
+
+ haveArrive.add(statsEntity);
+ if (currentValue >= configEntity.getTargetValue()) {
+ statsEntity.setIsArrive(NumConstant.ONE);
+
+ } else {
+ //如果没有达到则 放入这一条后 退出
+ statsEntity.setIsArrive(NumConstant.ZERO);
+ statsEntity.setArriveTime(null);
+ isContinue = false;
+ break;
+ }
+ }
+ return isContinue;
+ }
+
+ private List getConfigByType(String achievementType, int pageNum, int pageSize) {
+ List list = super.getAchievementConfigPage(pageNum, pageSize, achievementType);
+ if (CollectionUtils.isEmpty(list)) {
+ log.warn("获取小组成就配置错误,{} 开始进行初始化规则", achievementType);
+ list = super.initAchievementConfig(achievementType);
+ }
+ return list;
+ }
+
+ /**
+ * desc:获取小组List 按创建时间升序
+ *
+ * @param customerId
+ * @return
+ */
+ private List getCustomerGroupList(String customerId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda()
+ .eq(ResiGroupEntity::getDelFlag, NumConstant.ZERO_STR)
+ .eq(ResiGroupEntity::getCustomerId, customerId)
+ .orderByAsc(ResiGroupEntity::getCreatedTime);
+ return resiGroupDao.selectList(queryWrapper);
+ }
+
+ /**
+ * desc:获取小组成员(非组长)List 按创建时间升序
+ *
+ * @param customerId
+ * @return
+ */
+ private List getGroupMemberList(String customerId, String groupId) {
+ QueryWrapper memberQuery = new QueryWrapper<>();
+ memberQuery.lambda()
+ .eq(ResiGroupMemberEntity::getCustomerId, customerId)
+ .eq(ResiGroupMemberEntity::getResiGroupId, groupId)
+ .eq(ResiGroupMemberEntity::getDelFlag, NumConstant.ZERO_STR)
+ .eq(ResiGroupMemberEntity::getGroupLeaderFlag, TopicConstant.MEMBER)
+ .orderByAsc(ResiGroupMemberEntity::getCreatedTime);
+ return resiGroupMemberDao.selectList(memberQuery);
+ }
+
+ /**
+ * desc:获取小组话题List 按创建时间升序
+ *
+ * @param customerId
+ * @return
+ */
+ private List getGroupTopicList(String customerId, String groupId) {
+ QueryWrapper memberQuery = new QueryWrapper<>();
+ memberQuery.lambda()
+ .eq(ResiTopicEntity::getCustomerId, customerId)
+ .eq(ResiTopicEntity::getGroupId, groupId)
+ .eq(ResiTopicEntity::getDelFlag, NumConstant.ZERO_STR)
+ .orderByAsc(ResiTopicEntity::getCreatedTime);
+ return resiTopicDao.selectList(memberQuery);
+ }
+
+ /**
+ * desc:获取客户IdList
+ *
+ * @param customerId
+ * @return
+ */
+ private List getCustomerIds(String customerId) {
+ List customerIdList = new ArrayList<>();
+ if (StringUtils.isBlank(customerId)) {
+ Result> allCustomerList = operCrmOpenFeignClient.getAllCustomerList();
+ if (allCustomerList != null && !CollectionUtils.isEmpty(allCustomerList.getData())) {
+ customerIdList.addAll(allCustomerList.getData().stream().map(CustomerDTO::getId).collect(Collectors.toList()));
+ }
+ } else {
+ customerIdList.add(customerId);
+ }
+ return customerIdList;
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java
index 0f9ed73ce4..08b62c9d1c 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java
@@ -170,4 +170,15 @@ public interface ResiGroupMemberDao extends BaseDao {
String selectUserRole(@Param("groupId")String groupId, @Param("userId")String userId);
int exitGroupById(@Param("id") String id, @Param("updatedBy") String updatedBy);
+
+ /**
+ * desc: 仅统计除组长之外的成员数
+ *
+ * @param customerId
+ * @param groupId
+ * @return int
+ * @author LiuJanJun
+ * @date 2021/4/23 3:14 下午
+ */
+ int countAllMembers(@Param("customerId") String customerId, @Param("groupId") String groupId);
}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/GroupMemeberOperationServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/GroupMemeberOperationServiceImpl.java
index 6813b2edbc..343a6dbd64 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/GroupMemeberOperationServiceImpl.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/service/impl/GroupMemeberOperationServiceImpl.java
@@ -36,10 +36,13 @@ import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.utils.SendMqMsgUtils;
import com.epmet.dto.IssueShareLinkRecordDTO;
import com.epmet.dto.IssueShareLinkVisitRecordDTO;
+import com.epmet.dto.form.CommonGridIdFormDTO;
import com.epmet.dto.form.GetRoleKeyListFormDTO;
+import com.epmet.dto.result.CommonDataFilterResultDTO;
import com.epmet.dto.result.UserBaseInfoResultDTO;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovIssueOpenFeignClient;
+import com.epmet.modules.feign.GovOrgFeignClient;
import com.epmet.modules.group.dao.ResiGroupDao;
import com.epmet.modules.group.entity.ResiGroupEntity;
import com.epmet.modules.group.redis.ResiGroupRedis;
@@ -115,6 +118,8 @@ public class GroupMemeberOperationServiceImpl extends BaseServiceImpl page(Map params) {
@@ -292,11 +297,12 @@ public class GroupMemeberOperationServiceImpl extends BaseServiceImpl visitRecordResult = issueOpenFeignClient.visitRecord(param.getShareLinkId(), param.getUserId());
if(!visitRecordResult.success() || null == visitRecordResult.getData()){
log.error("【{}】该用户入组方式为议题分享链接入组,但未查询到链接访问记录,链接Id【{}】",param.getUserId(),param.getShareLinkId());
throw new RenException("未找到链接访问记录");
}
- if(NumConstant.ZERO == visitRecordResult.getData().getIsInviteRegister()) isNew = true;
+ if(NumConstant.ZERO == visitRecordResult.getData().getIsInviteRegister()) {
+ isNew = true;
+ }
}
if(StringUtils.isNotBlank(inviter)){
+
+ CommonGridIdFormDTO dataFilterParam = new CommonGridIdFormDTO();
+ dataFilterParam.setGridId(resiGroupDTO.getGridId());
+ dataFilterParam.setUserId(param.getUserId());
+ Result dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
//mq的事件类型
MqBaseMsgDTO mqBaseMsgDTO = new MqBaseMsgDTO();
//事件code
@@ -340,11 +359,17 @@ public class GroupMemeberOperationServiceImpl extends BaseServiceImpl pointEventMsgList = new ArrayList<>();
BasePointEventMsg pointEventMsg = new BasePointEventMsg();
pointEventMsg.setCustomerId(resiGroupDTO.getCustomerId());
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
+ pointEventMsg.setGridId(resiGroupDTO.getGridId());
+ pointEventMsg.setGroupId(groupId);
+ pointEventMsg.setSourceType("invite");
+ pointEventMsg.setSourceId(param.getUserId());
pointEventMsg.setUserId(inviter);
pointEventMsg.setActionFlag(MqConstant.PLUS);
pointEventMsg.setIsCommon(false);
pointEventMsg.setTargetDate(current);
pointEventMsg.setEventTag(mqBaseMsgDTO.getEventTag());
+ pointEventMsg.setEventClass(mqBaseMsgDTO.getEventClass());
//pointEventMsg.setRemark("通过".concat(StringUtils.equals(param.getShareLinkType(),"topic")
// ? "话题":"议题").concat("分享链接邀请").concat(isNew ? "新" : "").concat("用户进组"));
@@ -391,15 +416,21 @@ public class GroupMemeberOperationServiceImpl extends BaseServiceImpl page(Map params) {
@@ -611,7 +619,9 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl response = issueClient.visitRecord(groupMemeberOperationDTO.getGroupInvitationId(), groupMemeberOperationDTO.getCustomerUserId());
@@ -620,7 +630,9 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
//mq的事件类型
MqBaseMsgDTO mqBaseMsgDTO = new MqBaseMsgDTO();
mqBaseMsgDTO.setEventClass("resi_group");
@@ -636,6 +657,11 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl pointEventMsgList = new ArrayList<>();
BasePointEventMsg pointEventMsg = new BasePointEventMsg();
pointEventMsg.setCustomerId(groupCache.getCustomerId());
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
+ pointEventMsg.setGridId(groupCache.getGridId());
+ pointEventMsg.setGroupId(groupCache.getGroupId());
+ pointEventMsg.setSourceType("invite");
+ pointEventMsg.setSourceId(agreeApplyFormDTO.getUserId());
pointEventMsg.setUserId(inviter);
pointEventMsg.setActionFlag(MqConstant.PLUS);
pointEventMsg.setIsCommon(false);
@@ -664,6 +690,12 @@ public class ResiGroupMemberServiceImpl extends BaseServiceImpl msgList = new ArrayList<>();
msgList.add(wxSubscribeMessageFormDTO);
epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList);
+
+ //发送小组成就消息
+ boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient)
+ .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(resiGroupDTO.getCustomerId(), resiGroupDTO.getId(), AchievementTypeEnum.MEMBER.getCode()));
+ if (!flag) {
+ logger.error("发送(小组成就)系统消息到message服务失败");
+ }
+
}
/**
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java
new file mode 100644
index 0000000000..2ca6448e93
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java
@@ -0,0 +1,81 @@
+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.commons.tools.enums.AchievementTypeEnum;
+
+/**
+ * desc:小组成就下一等级规则工具类
+ *
+ * @author: LiuJanJun
+ * @date: 2021/4/19 4:11 下午
+ * @version: 1.0
+ * @remark 利用此工具类生成下一等级的目标值
+ */
+public class GroupAchievementUtils {
+ //小组人数、话题数、转议题数、小组内问题解决数
+
+ /**
+ * desc:获取下一等级的话题数目标值 步长500 起始值 500
+ *
+ * @param currentValue
+ */
+ private static Integer getNextTopicTargetValue(Integer currentValue) {
+ if (currentValue < NumConstant.FIVE_HUNDRED) {
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ return currentValue + NumConstant.FIVE_HUNDRED;
+ }
+
+ /**
+ * desc:获取下一等级的转议题数目标值 步长50 起始值 100
+ *
+ * @param currentValue
+ */
+ private static Integer getNextToIssueTargetValue(Integer currentValue) {
+ if (currentValue < NumConstant.ONE_HUNDRED) {
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ return currentValue + NumConstant.FIFTY;
+ }
+
+ /**
+ * desc:获取下一等级的话题解决数目标值 步长100 起始值 100
+ *
+ * @param 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;
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupLevelUtils.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupLevelUtils.java
new file mode 100644
index 0000000000..17d14fb2f6
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupLevelUtils.java
@@ -0,0 +1,76 @@
+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 lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 小组等级积分工具类 0,300,700,1200,1800
+ *
+ * @author zhaoqifeng
+ * @date 2021/4/21 10:22
+ */
+@Slf4j
+public class GroupLevelUtils {
+
+ /**
+ * 根据等级算出升级所需的积分
+ *
+ * @param level
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/21 10:25
+ * @remark 通项公式:an=n(n-1)/2+2n-2(n∈N+) -3+n(n-1)/2(需要特殊处理,所以引用前面的)
+ */
+ public static Integer getPoint(Integer level) {
+ if (level == null || level < NumConstant.ONE) {
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ Integer point = (level * (level - NumConstant.ONE) / NumConstant.TWO + NumConstant.TWO * level - NumConstant.TWO) * NumConstant.ONE_HUNDRED;
+ log.info("getPoint level:{},point:{}", level, point);
+ return point;
+ }
+
+ /**
+ * 根据积分算出当前的等级
+ *
+ * @param point
+ * @return java.lang.Integer
+ * @author zhaoqifeng
+ * @date 2021/4/21 10:25
+ */
+ public static Integer getLevel(Integer point) {
+ if (point == null || point < NumConstant.ZERO) {
+ throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode());
+ }
+ //如果是0 则返回等级1
+ if (point == NumConstant.ZERO) {
+ return NumConstant.ONE;
+ }
+ AtomicBoolean flag = new AtomicBoolean(false);
+ AtomicInteger initLevel = new AtomicInteger(1);
+ do {
+ Integer point1 = getPoint(initLevel.incrementAndGet());
+ if (point < point1) {
+ int i = initLevel.decrementAndGet();
+ log.info("getLevel level:{},point:{}", i, point);
+ return i;
+ }
+
+ } while (!flag.get());
+ return null;
+ }
+
+ public static void main(String[] args) {
+ for (int i = 1; i < 10; i++) {
+ System.out.println("lv" + i + ":" + getPoint(i));
+ }
+ System.out.println(getLevel(3300));
+ System.out.println(getLevel(299));
+
+ }
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java
index 828401e23e..ef4a773ccf 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java
@@ -47,6 +47,7 @@ public class ResiTopicController {
* @Author wangc
* @Date 2020.03.31 13:15
**/
+ @Deprecated
@PostMapping("createtopic")
public Result createTopic(@LoginUser TokenDto tokenDto, @RequestBody ResiTopicPublishFormDTO topicPublishFormDTO){
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicCommentServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicCommentServiceImpl.java
index 702c088bcf..dd02ae9142 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicCommentServiceImpl.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicCommentServiceImpl.java
@@ -39,8 +39,10 @@ import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.utils.ScanContentUtils;
import com.epmet.commons.tools.utils.SendMqMsgUtils;
+import com.epmet.dto.form.CommonGridIdFormDTO;
import com.epmet.dto.form.UserResiInfoListFormDTO;
import com.epmet.dto.result.UserInfoResultDTO;
+import com.epmet.dto.result.CommonDataFilterResultDTO;
import com.epmet.dto.result.UserResiInfoResultDTO;
import com.epmet.modules.comment.entity.ResiTopicCommentEntity;
import com.epmet.modules.constant.ResiGroupRedisKeys;
@@ -48,6 +50,7 @@ import com.epmet.modules.constant.WxmpSubscribeConstant;
import com.epmet.modules.feign.EpmetUserFeignClient;
import com.epmet.modules.group.dao.ResiGroupDao;
import com.epmet.modules.group.entity.ResiGroupEntity;
+import com.epmet.modules.feign.GovOrgFeignClient;
import com.epmet.modules.group.redis.ResiGroupRedis;
import com.epmet.modules.member.dao.ResiGroupMemberDao;
import com.epmet.modules.member.redis.ResiGroupMemberRedis;
@@ -62,6 +65,7 @@ import com.epmet.resi.group.constant.TopicConstant;
import com.epmet.resi.group.dto.comment.form.ResiQueryCommentFormDTO;
import com.epmet.resi.group.dto.comment.result.ResiCommentResultDTO;
import com.epmet.resi.group.dto.group.ResiGroupDTO;
+import com.epmet.resi.group.dto.group.ResiGroupInfoRedisDTO;
import com.epmet.resi.group.dto.member.ResiGroupMemberDTO;
import com.epmet.resi.group.dto.member.ResiGroupMemberInfoRedisDTO;
import com.epmet.resi.group.dto.member.result.ResiGroupMemberInfoRedisResultDTO;
@@ -116,6 +120,8 @@ public class ResiTopicCommentServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
pointEventMsg.setCustomerId(customerId);
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
+ pointEventMsg.setGridId(groupCache.getGridId());
+ pointEventMsg.setGroupId(topic.getGroupId());
+ pointEventMsg.setSourceType("topic");
+ pointEventMsg.setSourceId(topic.getId());
pointEventMsg.setUserId(tokenDto.getUserId());
// 加分
pointEventMsg.setActionFlag(MqConstant.PLUS);
pointEventMsg.setIsCommon(false);
pointEventMsg.setEventTag(mqBaseMsgDTO.getEventTag());
+ pointEventMsg.setEventClass(mqBaseMsgDTO.getEventClass());
//某某小组中评论话题“某某某…”
StringBuilder builder = new StringBuilder(groupRedis.get(topic.getGroupId()).getGroupName()).append("小组中评论");
String content = CharMatcher.WHITESPACE.trimFrom(topic.getTopicContent());
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java
index bf33cc61d3..6c4ff65b4f 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java
@@ -22,6 +22,7 @@ import com.alibaba.fastjson.JSON;
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.rocketmq.messages.GroupAchievementMQMsg;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.MqConstant;
import com.epmet.commons.tools.constant.NumConstant;
@@ -54,6 +55,7 @@ import com.epmet.feign.GovOrgOpenFeignClient;
import com.epmet.modules.constant.GroupMemberConstant;
import com.epmet.modules.constant.ResiGroupRedisKeys;
import com.epmet.modules.constant.WxmpSubscribeConstant;
+import com.epmet.commons.tools.enums.AchievementTypeEnum;
import com.epmet.modules.feign.EpmetUserFeignClient;
import com.epmet.modules.feign.GovIssueFeignClient;
import com.epmet.modules.feign.GovOrgFeignClient;
@@ -101,9 +103,11 @@ import com.epmet.resi.group.dto.topic.form.*;
import com.epmet.resi.group.dto.topic.result.CheckTopicPublisherResultDTO;
import com.epmet.resi.group.dto.topic.result.GovTopicIssueInfoResultDTO;
import com.epmet.resi.group.dto.topic.result.*;
+import com.epmet.send.SendMqMsgUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.base.CharMatcher;
+import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
@@ -125,6 +129,7 @@ import java.util.stream.Collectors;
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-03-31
*/
+@Data
@Service
@Slf4j
public class ResiTopicServiceImpl extends BaseServiceImpl implements ResiTopicService {
@@ -406,6 +411,7 @@ public class ResiTopicServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
}
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
pointEventMsg.setUserId(tokenDto.getUserId());
// 加分
pointEventMsg.setActionFlag(MqConstant.PLUS);
pointEventMsg.setIsCommon(false);
pointEventMsg.setEventTag(mqBaseMsgDTO.getEventTag());
+ pointEventMsg.setEventClass(mqBaseMsgDTO.getEventClass());
pointEventMsgList.add(pointEventMsg);
mqBaseMsgDTO.setMsg(JSON.toJSONString(pointEventMsgList));
@@ -767,6 +791,61 @@ public class ResiTopicServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
+
+ //mq的事件类型
+ MqBaseMsgDTO mqBaseMsgDTO = new MqBaseMsgDTO();
+ mqBaseMsgDTO.setEventClass("resi_group");
+ //事件code 组长解决组内话题
+ mqBaseMsgDTO.setEventTag(EventEnum.LEADER_RESOLVE_TOPIC.getEventTag());
+ List pointEventMsgList = new ArrayList<>();
+
+ BasePointEventMsg pointEventMsg = new BasePointEventMsg();
+ pointEventMsg.setCustomerId(tokenDto.getCustomerId());
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
+ pointEventMsg.setGridId(groupCache.getGridId());
+ pointEventMsg.setGroupId(groupCache.getGroupId());
+ pointEventMsg.setSourceType("topic");
+ pointEventMsg.setSourceId(closeFormDTO.getTopicId());
+ pointEventMsg.setUserId(tokenDto.getUserId());
+ pointEventMsg.setActionFlag(MqConstant.PLUS);
+ pointEventMsg.setIsCommon(false);
+ pointEventMsg.setEventTag(EventEnum.LEADER_RESOLVE_TOPIC.getEventTag());
+ pointEventMsg.setEventClass(EventEnum.LEADER_RESOLVE_TOPIC.getEventClass());
+ //将话题“某某某…” (前十个字后面省略号) 转为议题
+ String content = CharMatcher.WHITESPACE.trimFrom(topic.getTopicContent());
+ pointEventMsg.setRemark(
+ (StringUtils.isBlank(content)
+ || StringUtils.equals("语音话题", content) ? "语音话题" :
+ "话题\"" +
+ content
+ .substring(NumConstant.ZERO, content.length() < NumConstant.TEN ? content.length() : NumConstant.TEN)
+ + (NumConstant.TEN > content.length() ? "\"" : "…\"")) +
+ "已被解决");
+ pointEventMsgList.add(pointEventMsg);
+
+ mqBaseMsgDTO.setMsg(JSON.toJSONString(pointEventMsgList));
+ if(!SendMqMsgUtils.sendMsg(mqBaseMsgDTO).success()){
+ log.error("组长解决话题事件发送失败,参数:{}",JSON.toJSONString(closeFormDTO));
+ }
+ }
+ //发送小组成就消息
+ boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient)
+ .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(topic.getCustomerId(), topic.getGroupId(), AchievementTypeEnum.RESOVLE_TOPIC.getCode()));
+ if (!flag) {
+ log.error("发送(小组成就)系统消息到message服务失败");
+ }
return new Result();
}
@@ -1663,6 +1742,7 @@ public class ResiTopicServiceImpl extends BaseServiceImpl {
+ MqBaseMsgDTO msgDTO = new MqBaseMsgDTO();
+ msgDTO.setEventClass("resi_group");
+ //事件code 因为楼院小组的事件回调统一入口,外层的EventTag不能够判断具体的事件
+ //因为可能会一次发送多个事件集合,需要对集合里的对象逐个判断
+ msgDTO.setEventTag(EventEnum.SHIFT_TOPIC_TO_ISSUE.getEventTag());
+ List msgList = new ArrayList<>();
+ msgList.add(item);
+ msgDTO.setMsg(JSON.toJSONString(msgList));
+ if(!SendMqMsgUtils.sendMsg(msgDTO).success()){
+ log.error("话题转议题事件发送失败,参数:{}",JSON.toJSONString(topicTurnIssueFromDTO));
+ }
+ });
+ } else {
ValidatorUtils.validateEntity(result, FirstTopicShiftedToIssueApplicationResultDTO.AllowAuditionGroup.class);
}
}else {
throw new RenException(dataFilterResult.getMsg());
}
-
+ //发送小组成就消息
+ boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient)
+ .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(group.getCustomerId(), group.getGroupId(), AchievementTypeEnum.TOISSUE.getCode()));
+ if (!flag) {
+ log.error("发送(小组成就)系统消息到message服务失败");
+ }
return result;
}
@@ -1915,26 +2019,36 @@ public class ResiTopicServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
//发送积分
//mq的事件类型
- MqBaseMsgDTO mqBaseMsgDTO = new MqBaseMsgDTO();
- mqBaseMsgDTO.setEventClass("resi_group");
+// MqBaseMsgDTO mqBaseMsgDTO = new MqBaseMsgDTO();
+// mqBaseMsgDTO.setEventClass("resi_group");
//事件code 因为楼院小组的事件回调统一入口,外层的EventTag不能够判断具体的事件
//因为可能会一次发送多个事件集合,需要对集合里的对象逐个判断
- mqBaseMsgDTO.setEventTag(EventEnum.SHIFT_TOPIC_TO_ISSUE.getEventTag());
+// mqBaseMsgDTO.setEventTag(EventEnum.SHIFT_TOPIC_TO_ISSUE.getEventTag());
List pointEventMsgList = new ArrayList<>();
//1.话题被转为议题 组内成员
BasePointEventMsg pointEventMsg = new BasePointEventMsg();
pointEventMsg.setCustomerId(groupCache.getCustomerId());
+ pointEventMsg.setAgencyId(dataFilterResult.getData().getAgencyId());
+ pointEventMsg.setGridId(group.getGridId());
+ pointEventMsg.setGroupId(group.getGroupId());
+ pointEventMsg.setSourceType("issue");
+ pointEventMsg.setSourceId(param.getIssueId());
pointEventMsg.setUserId(group.getTopicAuthorId());
pointEventMsg.setActionFlag(MqConstant.PLUS);
pointEventMsg.setIsCommon(false);
pointEventMsg.setEventTag(EventEnum.TOPIC_SHIFTED_TO_ISSUE.getEventTag());
+ pointEventMsg.setEventClass(EventEnum.TOPIC_SHIFTED_TO_ISSUE.getEventClass());
//某某小组中发布的话题“某某某…” (前十个字后面省略号) 被转为议题
String content = CharMatcher.WHITESPACE.trimFrom(topic.getTopicContent());
pointEventMsg.setRemark(new StringBuilder(groupCache.getGroupName()).append("小组中发布的")
@@ -1951,10 +2065,16 @@ public class ResiTopicServiceImpl extends BaseServiceImpl {
+ MqBaseMsgDTO msgDTO = new MqBaseMsgDTO();
+ msgDTO.setEventClass("resi_group");
+ //事件code 因为楼院小组的事件回调统一入口,外层的EventTag不能够判断具体的事件
+ //因为可能会一次发送多个事件集合,需要对集合里的对象逐个判断
+ msgDTO.setEventTag(EventEnum.SHIFT_TOPIC_TO_ISSUE.getEventTag());
+ List msgList = new ArrayList<>();
+ msgList.add(item);
+ msgDTO.setMsg(JSON.toJSONString(msgList));
+ if(!SendMqMsgUtils.sendMsg(msgDTO).success()){
+ log.error("话题转议题事件发送失败,参数:{}",JSON.toJSONString(param));
+ }
+ });
}
return issueInfo;
}
@@ -2301,6 +2429,15 @@ public class ResiTopicServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
//某某小组中发布的话题“某某某…” (前十个字后面省略号) 被转为项目
if(EventEnum.TOPIC_SHIFTED_TO_PROJECT == param.getEvent()){
@@ -2313,10 +2450,16 @@ public class ResiTopicServiceImpl extends BaseServiceImpl NumConstant.TEN ? (content.substring(NumConstant.TEN) + "…") : content);
+ breviary.append("话题\"");
+ breviary.append(content.length() > NumConstant.TEN ? (content.substring(NumConstant.ZERO,NumConstant.TEN) + "…") : content);
breviary.append("\"");
}else {
- breviary.append("话题");
+ breviary.append("语音话题");
}
- sendMqMsg(draft.getCreatedBy(), draft.getCustomerId(),draft.getCreatedTime(),resiGroupRedis.get(draft.getGroupId()).getGroupName(),breviary.toString());
//2021.4.22 start sun 因业务调整,新增组内消息记录表,新增话题时相应的初始数据
GroupMessageEntity messageEntity = new GroupMessageEntity();
@@ -814,6 +824,16 @@ public class TopicDraftServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+
+ sendMqMsg(draft.getCreatedBy(), draft.getCustomerId(), draft.getCreatedTime(),resiGroupRedis.get(draft.getGroupId()).getGroupName(),
+ breviary.toString(), dataFilterResult.getData().getAgencyId(), draft.getGridId(), draft.getGroupId(), resiTopic.getId());
}
//记录操作记录
entity = baseDao.selectById(formDTO.getTopicDraftId());
@@ -942,7 +962,6 @@ public class TopicDraftServiceImpl extends BaseServiceImpl dataFilterResult = govOrgFeignClient.gridDataFilter(dataFilterParam);
+ if (!dataFilterResult.success() || null == dataFilterResult.getData()) {
+ throw new RenException(dataFilterResult.getMsg());
+ }
+ sendMqMsg(tokenDto.getUserId(), formDTO.getCustomerId(), draft.getCreatedTime(), resiGroupRedis.get(draft.getGroupId()).getGroupName(),
+ breviary.toString(), dataFilterResult.getData().getAgencyId(), formDTO.getGridId(), formDTO.getGroupId(), topic.getId());
+
+
}
/**
@@ -970,7 +1000,8 @@ public class TopicDraftServiceImpl extends BaseServiceImpl actPointEventMsgList=new ArrayList<>();
BasePointEventMsg actPointEventMsg=new BasePointEventMsg();
actPointEventMsg.setCustomerId(customerId);
+ actPointEventMsg.setAgencyId(agencyId);
+ actPointEventMsg.setGridId(gridId);
+ actPointEventMsg.setGroupId(groupId);
+ actPointEventMsg.setSourceType("topic");
+ actPointEventMsg.setSourceId(topicId);
actPointEventMsg.setUserId(userId);
actPointEventMsg.setActionFlag(MqConstant.PLUS);
actPointEventMsg.setIsCommon(false);
actPointEventMsg.setRemark(new StringBuilder(groupName).append("小组中发布").append(topicBreviary).toString());
actPointEventMsg.setTargetDate(targetDate);
actPointEventMsg.setEventTag(EventEnum.PUBLISH_ONE_TOPIC.getEventTag());
+ actPointEventMsg.setEventClass(EventEnum.PUBLISH_ONE_TOPIC.getEventClass());
actPointEventMsgList.add(actPointEventMsg);
mqBaseMsgDTO.setMsg(JSON.toJSONString(actPointEventMsgList));
@@ -993,6 +1030,14 @@ public class TopicDraftServiceImpl extends BaseServiceImpl msgs, ConsumeConcurrentlyContext context) {
+ long start = System.currentTimeMillis();
+ try {
+ msgs.forEach(this::consumeMessage);
+ } catch (Exception e) {
+ //失败重发
+ logger.error("consumeMessage fail,msg:{}",e.getMessage());
+ return ConsumeConcurrentlyStatus.RECONSUME_LATER;
+ }
+ log.info("consumeMessage success, cost:{} ms",System.currentTimeMillis() - start);
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ }
+
+ private void consumeMessage(MessageExt messageExt) {
+ logger.info("receive msg:{}", JSON.toJSONString(messageExt));
+ String msg = new String(messageExt.getBody());
+
+ GroupAchievementMQMsg msgObj = JSON.parseObject(msg, GroupAchievementMQMsg.class);
+ if (msgObj == null){
+ log.warn("consumeMessage msg body is blank");
+ return;
+ }
+
+ DistributedLock distributedLock = null;
+ RLock lock = null;
+ try {
+ distributedLock = SpringContextUtils.getBean(DistributedLock.class);
+ lock = distributedLock.getLock(String.format("lock:group_achievement:%s", msgObj.getCustomerId())
+ ,30L, 30L, TimeUnit.SECONDS);
+
+ if (StringUtils.isBlank(msgObj.getAchievementType()) || StringUtils.isBlank(msgObj.getCustomerId())
+ || StringUtils.isBlank(msgObj.getGroupId())){
+ logger.error("consumer groupAchievement fail,msg:{}",msgObj);
+ return;
+ }
+ //消息被消费太快 业务数据还没有完成 歇一会先
+ try {
+ Thread.sleep(60L);
+ } catch (InterruptedException e) {
+ logger.error("consumeMessage sleep exception",e);
+ }
+ Boolean aBoolean = SpringContextUtils.getBean(StatsAchievementService.class).calculateAcm(msgObj.getCustomerId(), msgObj.getGroupId(), msgObj.getAchievementType());
+ logger.info("consumer groupAchievement msg success,{}",aBoolean);
+ } catch (RenException e) {
+ // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试
+ logger.error("【RocketMQ】消费小组成就消息失败:",e);
+ } catch (Exception e) {
+ // 不是我们自己抛出的异常,可以让MQ重试
+ logger.error("【RocketMQ】消费小组成就消息失败:",e);
+ throw e;
+ } finally {
+ if (distributedLock != null){
+ distributedLock.unLock(lock);
+ }
+ }
+ }
+
+
+
+ /*@Override
+ public ConsumerConfigProperties getConsumerProperty() {
+ ConsumerConfigProperties configProperties = new ConsumerConfigProperties();
+ configProperties.setConsumerGroup(ConsomerGroupConstants.GROUP_ACHIEVEMENT_COMPONENTS_GROUP);
+ configProperties.setTopic(TopicConstants.GROUP_ACHIEVEMENT);
+ configProperties.setTag("*");
+ configProperties.setConsumerListener(this);
+ return configProperties;
+ }*/
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
new file mode 100644
index 0000000000..e219987289
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/RocketMQConsumerRegister.java
@@ -0,0 +1,68 @@
+package com.epmet.mq;
+
+import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants;
+import com.epmet.commons.rocketmq.constants.TopicConstants;
+import com.epmet.commons.tools.enums.EnvEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
+import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Component
+public class RocketMQConsumerRegister {
+ @Value("${spring.profiles.active}")
+ private String env;
+ @Value("${rocketmq.name-server}")
+ private String nameServer;
+
+ /**
+ * @return
+ * @Description 注册监听器
+ * @author wxz
+ * @date 2021.03.03 16:09
+ */
+ @PostConstruct
+ public void registerAllListeners() {
+ try {
+ if (!EnvEnum.LOCAL.getCode().equals(env)) {
+ register(ConsomerGroupConstants.GROUP_ACHIEVEMENT_COMPONENTS_GROUP, MessageModel.CLUSTERING, TopicConstants.GROUP_ACHIEVEMENT, "*", new GroupAchievementCustomListener());
+ }
+ } catch (MQClientException e) {
+ log.error("registerAllListeners exception", e);
+ }
+ }
+
+ public void register(String group, MessageModel messageModel, String topic, String subException, MessageListenerConcurrently listener) throws MQClientException {
+ // 实例化消费者
+ DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group);
+
+ // 设置NameServer的地址
+ consumer.setNamesrvAddr(nameServer);
+ consumer.setMessageModel(messageModel);
+ consumer.setInstanceName(buildInstanceName());
+ // 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
+ consumer.subscribe(topic, subException);
+ consumer.setConsumeMessageBatchMaxSize(10);
+ // 注册回调实现类来处理从broker拉取回来的消息
+ consumer.registerMessageListener(listener);
+ // 启动消费者实例
+ consumer.start();
+ }
+
+ private String buildInstanceName() {
+ String instanceName = "";
+ for (int i = 0; i < 4; i++) {
+ int t = (int) (Math.random() * 10);
+ instanceName = instanceName.concat(t + "");
+ }
+
+ return instanceName;
+ }
+
+}
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml
index 35cade577d..d3a33a6d2a 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml
@@ -157,3 +157,6 @@ shutdown:
graceful:
enable: true #是否开启优雅停机
waitTimeSecs: 30 # 优雅停机等待时间,每超过30秒,打印一次错误日志
+
+rocketmq:
+ name-server: @rocketmq.nameserver@
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/db/migration/V0.0.18__groupAchievement.sql b/epmet-module/resi-group/resi-group-server/src/main/resources/db/migration/V0.0.18__groupAchievement.sql
new file mode 100644
index 0000000000..2bb5dc4dd0
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/db/migration/V0.0.18__groupAchievement.sql
@@ -0,0 +1,89 @@
+CREATE TABLE `resi_group_achievement_config` (
+ `ID` varchar(64) NOT NULL COMMENT '主键',
+ `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id',
+ `ACHIEVEMENT_NAME` varchar(64) NOT NULL COMMENT '成就名称',
+ `TARGET_VALUE` int(11) NOT NULL COMMENT '目标值',
+ `ACHIEVEMENT_TYPE` varchar(16) NOT NULL COMMENT '成就类型:小组人数:member;topic:话题数;转议题数:toissue;话题解决数:reslovetopic',
+ `DEL_FLAG` varchar(1) NOT NULL DEFAULT '0' COMMENT '删除标记 0:未删除,1:已删除',
+ `REVISION` int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁',
+ `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人',
+ `CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
+ `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
+ PRIMARY KEY (`ID`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小组成就配置表';
+CREATE TABLE `resi_group_achievement_stats` (
+ `ID` varchar(64) NOT NULL COMMENT '主键',
+ `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id',
+ `GROUP_ID` varchar(64) NOT NULL COMMENT '小组Id',
+ `ACHIEVEMENT_ID` varchar(64) NOT NULL COMMENT '成就ID',
+ `ACHIEVEMENT_NAME` varchar(64) NOT NULL COMMENT '成就名称',
+ `ACHIEVEMENT_TYPE` varchar(16) NOT NULL COMMENT '成就类型',
+ `ARRIVE_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '实现时间',
+ `CURRENT_VALUE` int(11) NOT NULL DEFAULT '0' COMMENT '当前值',
+ `TARGET_VALUE` int(11) NOT NULL DEFAULT '0' COMMENT '目标值',
+ `IS_ARRIVE` int(1) NOT NULL DEFAULT '0' COMMENT '目标是否实现,是:1;否:0',
+ `DEL_FLAG` varchar(1) NOT NULL COMMENT '删除标记 0:未删除,1:已删除',
+ `REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
+ `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人',
+ `CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
+ `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
+ PRIMARY KEY (`ID`) USING BTREE,
+ UNIQUE KEY `unx_gid_mid` (`GROUP_ID`,`ACHIEVEMENT_ID`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小组成就统计表';
+
+ALTER TABLE `resi_group`
+ ADD COLUMN `LEVEL` int(11) DEFAULT '1' COMMENT '小组等级' AFTER `GROUP_TYPE`;
+
+-- ----------------------------
+-- Records of resi_group_achievement_config
+-- ----------------------------
+BEGIN;
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700001', 'default', '组内第1名成员加入', 1, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700002', 'default', '组内成员达到3人', 3, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700003', 'default', '组内成员达到10人', 10, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700004', 'default', '组内成员达到20人', 20, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700005', 'default', '组内成员达到50人', 50, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700006', 'default', '组内成员达到100人', 100, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700007', 'default', '组内成员达到200人', 200, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700008', 'default', '组内成员达到500人', 500, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700009', 'default', '组内成员达到1000人', 1000, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700010', 'default', '组内成员达到2000人', 2000, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700011', 'default', '组内成员达到5000人', 5000, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261402388211700012', 'default', '组内成员达到10000人', 10000, 'member', '0', 0, 'APP_USER', '2021-04-19 16:19:49', 'APP_USER', '2021-04-19 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700001', 'default', '组内第1条话题诞生', 1, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700002', 'default', '组内发布话题数3条', 3, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700003', 'default', '组内发布话题数5条', 5, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700004', 'default', '组内发布话题数10条', 10, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700005', 'default', '组内发布话题数20条', 20, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700006', 'default', '组内发布话题数50条', 50, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700007', 'default', '组内发布话题数100条', 100, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700008', 'default', '组内发布话题数200条', 200, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700009', 'default', '组内发布话题数500条', 500, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700010', 'default', '组内发布话题数1000条', 1000, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700011', 'default', '组内发布话题数1500条', 1500, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700012', 'default', '组内发布话题数2000条', 2000, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700013', 'default', '组内发布话题数2500条', 2500, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261403464411700014', 'default', '组内发布话题数3000条', 3000, 'topic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700001', 'default', '组内第1次话题转议题', 1, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700002', 'default', '组内话题转议题数3条', 3, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700003', 'default', '组内话题转议题数5条', 5, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700004', 'default', '组内话题转议题数10条', 10, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700005', 'default', '组内话题转议题数20条', 20, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700006', 'default', '组内话题转议题数50条', 50, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700007', 'default', '组内话题转议题数100条', 100, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700008', 'default', '组内话题转议题数150条', 150, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404210411700009', 'default', '组内话题转议题数200条', 200, 'toissue', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700001', 'default', '组内话题第1次被解决', 1, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700002', 'default', '组内话题解决数3条', 3, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700003', 'default', '组内话题解决数5条', 5, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700004', 'default', '组内话题解决数10条', 10, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700005', 'default', '组内话题解决数30条', 30, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700006', 'default', '组内话题解决数50条', 50, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700007', 'default', '组内话题解决数100条', 100, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700008', 'default', '组内话题解决数200条', 200, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+INSERT INTO `resi_group_achievement_config` VALUES ('202104261404543611700009', 'default', '组内话题解决数300条', 300, 'resovletopic', '0', 0, 'APP_USER', '2021-04-20 16:19:49', 'APP_USER', '2021-04-20 16:19:52');
+COMMIT;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml
new file mode 100644
index 0000000000..cce26029ed
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+ SELECT
+ id, customer_id, achievement_name, 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
+ id, customer_id, achievement_name, target_value, achievement_type
+ FROM resi_group_achievement_config
+ WHERE
+ ACHIEVEMENT_TYPE = #{achievementType}
+ AND DEL_FLAG = '0'
+ order by TARGET_VALUE DESC
+ LIMIT 1
+
+
+
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml
new file mode 100644
index 0000000000..2d18215754
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT
+ ACHIEVEMENT_ID,
+ ACHIEVEMENT_NAME,
+ CURRENT_VALUE,
+ TARGET_VALUE,
+ IS_ARRIVE
+ FROM
+ resi_group_achievement_stats
+ WHERE DEL_FLAG = '0'
+ AND GROUP_ID = #{groupId}
+ AND IS_ARRIVE = 0
+ ORDER BY
+ CURRENT_VALUE / TARGET_VALUE DESC
+ LIMIT 3
+
+
+ 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
+ ORDER BY TARGET_VALUE
+ LIMIT 1
+
+
+ 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
+
+ (
+ #{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}
+ )
+
+ ON DUPLICATE KEY UPDATE
+
+ CURRENT_VALUE = values(CURRENT_VALUE),
+ TARGET_VALUE = values(TARGET_VALUE),
+ ARRIVE_TIME = if(IS_ARRIVE,ARRIVE_TIME,values(ARRIVE_TIME)),
+ IS_ARRIVE = VALUES(IS_ARRIVE),
+ UPDATED_TIME = VALUES(UPDATED_TIME),
+
+ UPDATED_BY = VALUES(UPDATED_BY)
+
+
+
+
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupDao.xml
index 50006ae2dd..74c02e9907 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupDao.xml
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupDao.xml
@@ -144,6 +144,7 @@
rgs.TOTAL_MEMBERS AS totalMember,
rgs.TOTAL_PARTY_MEMBERS AS totalPartyMember,
rgm.GROUP_LEADER_FLAG AS leaderFlag,
+ CONCAT('LV', rg.level) AS level,
(
SELECT
count(1)
@@ -531,6 +532,23 @@
GROUP BY
temp.gridId
+
+ SELECT
+ rgas.GROUP_ID,
+ rg.GROUP_NAME,
+ rgas.ACHIEVEMENT_NAME
+ FROM
+ resi_group_achievement_stats rgas
+ INNER JOIN resi_group rg ON rgas.GROUP_ID = rg.ID AND rg.GRID_ID = #{gridId}
+ INNER JOIN resi_group_member rgm ON rgas.GROUP_ID = rgm.RESI_GROUP_ID
+ AND rgm.CUSTOMER_USER_ID = #{userId} AND rgm.DEL_FLAG = '0'
+
+ WHERE
+ rgas.IS_ARRIVE = 1
+ AND DATE_SUB(CURDATE(), INTERVAL 3 DAY) <= date(rgas.CREATED_TIME)
+ ORDER BY
+ rgas.ARRIVE_TIME DESC
+
SELECT
diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml
index a8e89256f9..243b301d19 100644
--- a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml
+++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml
@@ -191,6 +191,18 @@
ORDER BY
rgm.CREATED_TIME DESC
+
+
+ SELECT
+ count(*)
+ FROM
+ resi_group_member rgm
+ WHERE
+ rgm.RESI_GROUP_ID = #{groupId}
+ AND rgm.CUSTOMER_ID = #{customerId}
+ AND rgm.GROUP_LEADER_FLAG = 'member'
+
+
SELECT
diff --git a/epmet-module/resi-group/resi-group-server/src/test/com/epmet/modules/group/service/impl/StatsAchievementServiceImplTest.java b/epmet-module/resi-group/resi-group-server/src/test/com/epmet/modules/group/service/impl/StatsAchievementServiceImplTest.java
new file mode 100644
index 0000000000..c38cf87259
--- /dev/null
+++ b/epmet-module/resi-group/resi-group-server/src/test/com/epmet/modules/group/service/impl/StatsAchievementServiceImplTest.java
@@ -0,0 +1,37 @@
+package com.epmet.modules.group.service.impl;
+
+import com.epmet.modules.group.service.StatsAchievementService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class StatsAchievementServiceImplTest {
+ @Autowired
+ private StatsAchievementService statsAchievementService;
+
+ @Test
+ public void initAll() {
+ Boolean aBoolean = statsAchievementService.initAllGroupAchievement(null);
+ System.out.println(aBoolean);
+ }
+
+ @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 = "toissue";
+ Boolean aBoolean = statsAchievementService.calculateAcm(customerId, groupId, achievementType);
+ System.out.println(aBoolean);
+ }
+}