diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java index 9d4fb263cb..2e45203dc0 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java @@ -8,6 +8,7 @@ package com.epmet.commons.tools.redis; +import com.epmet.commons.tools.constant.NumConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.HashOperations; @@ -252,12 +253,13 @@ public class RedisUtils { * @date 2020.05.21 15:42 **/ public Map hincrby(String key,String field,Long delta){ + Map existed = hGetAll(key); + if(null == existed || existed.size() < NumConstant.ONE) return null; + //hincrby - Long count = redisTemplate.opsForHash().increment(key,field,delta); - if(count == -1){ - return null; - }else{ - return hGetAll(key); - } + redisTemplate.opsForHash().increment(key,field,delta); + + return hGetAll(key); + } } diff --git a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml index 97c609d056..36820f68f4 100644 --- a/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml +++ b/epmet-module/epmet-job/epmet-job-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: epmet-job-server: container_name: epmet-job-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/epmet-job-server:0.3.2 + image: 192.168.1.130:10080/epmet-cloud-dev/epmet-job-server:0.3.3 ports: - "8084:8084" network_mode: host # 使用现有网络 diff --git a/epmet-module/epmet-job/epmet-job-server/pom.xml b/epmet-module/epmet-job/epmet-job-server/pom.xml index 9af9e3e1b5..920f3f9635 100644 --- a/epmet-module/epmet-job/epmet-job-server/pom.xml +++ b/epmet-module/epmet-job/epmet-job-server/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - 0.3.2 + 0.3.3 com.epmet epmet-job diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/GovIssueFeignClient.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/GovIssueFeignClient.java new file mode 100644 index 0000000000..4c091c1c6a --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/GovIssueFeignClient.java @@ -0,0 +1,37 @@ +package com.epmet.feign; + +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.impl.GovIssueFeignClientFallBack; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @Description 议题定时任务 + * @Author wangc + * @Date 2020/5/23 13:42 + */ +@FeignClient(name = ServiceConstant.GOV_ISSUE_SERVER, fallback = GovIssueFeignClientFallBack.class) +public interface GovIssueFeignClient { + + /** + * @Description 定时任务 每天生成生成昨日的议题表决日统计数 + * @param + * @return + * @author wangc + * @date 2020.05.20 15:39 + **/ + @PostMapping(value = "gov/issue/issuevotestatisticaldaily/dailystatisticalvotejob") + Result dailyStatisticalVoteJob(); + + /** + * @Description 将所有表决中的投票数从缓存同步到数据库,要进行数据对比,若数据一致无需更新 + * @param + * @return + * @author wangc + * @date 2020.05.21 09:07 + **/ + @PostMapping(value = "gov/issue/issuevotestatistical/syncvotingcacheanddb") + Result syncVotingCacheAndDb(); + +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/impl/GovIssueFeignClientFallBack.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/impl/GovIssueFeignClientFallBack.java new file mode 100644 index 0000000000..0267ca347f --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/feign/impl/GovIssueFeignClientFallBack.java @@ -0,0 +1,26 @@ +package com.epmet.feign.impl; + +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.utils.ModuleUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.GovIssueFeignClient; +import org.springframework.stereotype.Component; + +/** + * @Description + * @ClassName GovIssueFeignClientFallBack + * @Auth wangc + * @Date 2020-05-25 09:02 + */ +@Component +public class GovIssueFeignClientFallBack implements GovIssueFeignClient { + @Override + public Result dailyStatisticalVoteJob() { + return ModuleUtils.feignConError(ServiceConstant.GOV_ISSUE_SERVER, "dailyStatisticalVoteJob"); + } + + @Override + public Result syncVotingCacheAndDb() { + return ModuleUtils.feignConError(ServiceConstant.GOV_ISSUE_SERVER, "syncVotingCacheAndDb"); + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SyncVotingCacheAndDbService.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SyncVotingCacheAndDbService.java new file mode 100644 index 0000000000..e6ae8d55ac --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SyncVotingCacheAndDbService.java @@ -0,0 +1,13 @@ +package com.epmet.service; + +import com.epmet.commons.tools.utils.Result; + +/** + * @Description 同步缓存与数据库定时任务 -> 议题表决统计 + * @Author wangc + * @Date 2020/5/20 17:39 + */ +public interface SyncVotingCacheAndDbService { + + Result syncVotingCacheAndDb(); +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/IssueVotingDailyStatisticalTaskServiceImpl.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/IssueVotingDailyStatisticalTaskServiceImpl.java new file mode 100644 index 0000000000..eb31c97810 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/IssueVotingDailyStatisticalTaskServiceImpl.java @@ -0,0 +1,24 @@ +package com.epmet.service.impl; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.GovIssueFeignClient; +import com.epmet.service.IssueVotingDailyStatisticalTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Description + * @ClassName IssueVotingDailyStatisticalTaskServiceImpl + * @Auth wangc + * @Date 2020-05-25 09:24 + */ +@Service +public class IssueVotingDailyStatisticalTaskServiceImpl implements IssueVotingDailyStatisticalTaskService { + @Autowired + private GovIssueFeignClient govIssueFeignClient; + + @Override + public Result issueVotingDailyStatistical() { + return govIssueFeignClient.dailyStatisticalVoteJob(); + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/SyncVotingCacheAndDbServiceImpl.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/SyncVotingCacheAndDbServiceImpl.java new file mode 100644 index 0000000000..83a1ad37d9 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/impl/SyncVotingCacheAndDbServiceImpl.java @@ -0,0 +1,24 @@ +package com.epmet.service.impl; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.GovIssueFeignClient; +import com.epmet.service.SyncVotingCacheAndDbService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Description + * @ClassName SyncVotingCacheAndDbServiceImpl + * @Auth wangc + * @Date 2020-05-25 09:45 + */ +@Service +public class SyncVotingCacheAndDbServiceImpl implements SyncVotingCacheAndDbService { + @Autowired + private GovIssueFeignClient govIssueFeignClient; + + @Override + public Result syncVotingCacheAndDb() { + return govIssueFeignClient.syncVotingCacheAndDb(); + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/DailyStatisticalVoteTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/DailyStatisticalVoteTask.java new file mode 100644 index 0000000000..1c33869895 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/DailyStatisticalVoteTask.java @@ -0,0 +1,34 @@ +package com.epmet.task; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.service.IssueVotingDailyStatisticalTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @Description + * @ClassName dailyStatisticalVoteTask + * @Auth wangc + * @Date 2020-05-25 09:22 + */ +@Component("dailyStatisticalVoteTask") +public class DailyStatisticalVoteTask implements ITask{ + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private IssueVotingDailyStatisticalTaskService issueVotingDailyStatisticalTaskService; + + + @Override + public void run(String params) { + logger.debug("dailyStatisticalVoteTask定时任务正在执行,参数为:{}", params); + Result result=issueVotingDailyStatisticalTaskService.issueVotingDailyStatistical(); + if(result.success()){ + logger.debug("dailyStatisticalVoteTask定时任务正在执行定时任务执行成功"); + }else{ + logger.debug("dailyStatisticalVoteTask定时任务正在执行定时任务执行失败:"+result.getMsg()); + } + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SyncVotingCacheAndDbTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SyncVotingCacheAndDbTask.java new file mode 100644 index 0000000000..9eed75bb68 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SyncVotingCacheAndDbTask.java @@ -0,0 +1,33 @@ +package com.epmet.task; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.service.SyncVotingCacheAndDbService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @Description + * @ClassName SyncVotingCacheAndDbTask + * @Auth wangc + * @Date 2020-05-25 09:47 + */ +@Component("syncVotingCacheAndDbTask") +public class SyncVotingCacheAndDbTask implements ITask { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private SyncVotingCacheAndDbService syncVotingCacheAndDbService; + + @Override + public void run(String params) { + logger.debug("syncVotingCacheAndDbTask定时任务正在执行,参数为:{}", params); + Result result = syncVotingCacheAndDbService.syncVotingCacheAndDb(); + if(result.success()){ + logger.debug("syncVotingCacheAndDbTask定时任务正在执行定时任务执行成功"); + }else{ + logger.debug("syncVotingCacheAndDbTask定时任务正在执行定时任务执行失败:"+result.getMsg()); + } + } +} diff --git a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/result/LatestIssueListResultDTO.java b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/result/LatestIssueListResultDTO.java index 1c4fe33e19..13826f91e2 100644 --- a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/result/LatestIssueListResultDTO.java +++ b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/result/LatestIssueListResultDTO.java @@ -21,16 +21,21 @@ public class LatestIssueListResultDTO implements Serializable { * 议题标题 */ private String issueTitle = ""; - /** - * 议题发起人:XX路-XX先生 - */ - private String issuePublisherName = ""; /** * 话题内容 */ private String topicContent = ""; /** - * 表达态度总人数 + * 用户头像 + */ + private String staffHeadPhoto = ""; + /** + * 议题发起人:XX路-XX先生/女士 + * + */ + private String issuePublisherName = ""; + /** + * 议题创建时间 */ - private Integer votedCount = 0; + private Long createIssueTime; } diff --git a/epmet-module/gov-issue/gov-issue-server/deploy/docker-compose-dev.yml b/epmet-module/gov-issue/gov-issue-server/deploy/docker-compose-dev.yml index 735235df5f..72f753f87e 100644 --- a/epmet-module/gov-issue/gov-issue-server/deploy/docker-compose-dev.yml +++ b/epmet-module/gov-issue/gov-issue-server/deploy/docker-compose-dev.yml @@ -2,7 +2,7 @@ version: "3.7" services: gov-issue-server: container_name: gov-issue-server-dev - image: 192.168.1.130:10080/epmet-cloud-dev/gov-issue-server:0.3.26 + image: 192.168.1.130:10080/epmet-cloud-dev/gov-issue-server:0.3.27 ports: - "8101:8101" network_mode: host # 使用现有网络 diff --git a/epmet-module/gov-issue/gov-issue-server/pom.xml b/epmet-module/gov-issue/gov-issue-server/pom.xml index 57ccdb8f54..01723c912a 100644 --- a/epmet-module/gov-issue/gov-issue-server/pom.xml +++ b/epmet-module/gov-issue/gov-issue-server/pom.xml @@ -2,7 +2,7 @@ - 0.3.26 + 0.3.27 gov-issue com.epmet diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueVoteStatisticalDailyController.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueVoteStatisticalDailyController.java index 6ff8f2e89b..c0532cbbf5 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueVoteStatisticalDailyController.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/controller/IssueVoteStatisticalDailyController.java @@ -98,8 +98,8 @@ public class IssueVoteStatisticalDailyController { * @author wangc * @date 2020.05.20 15:39 **/ - @PostMapping(value = "dailystasticalvotejob") - public Result dailyStasticalVoteJob(){ + @PostMapping(value = "dailystatisticalvotejob") + public Result dailyStatisticalVoteJob(){ issueVoteStatisticalDailyService.countVotingDailyStatistic(); return new Result(); } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueDao.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueDao.java index 8fc76e1b85..377c731120 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueDao.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueDao.java @@ -20,10 +20,6 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.IssueDTO; import com.epmet.dto.form.*; -import com.epmet.dto.result.ClosedIssueListGovResultDTO; -import com.epmet.dto.result.ClosedIssueListResultDTO; -import com.epmet.dto.result.IssueResultDTO; -import com.epmet.dto.result.VotingIssueListResultDTO; import com.epmet.dto.result.*; import com.epmet.entity.IssueEntity; import org.apache.ibatis.annotations.Mapper; diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java index 949d0c14fa..134ec32bb1 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java @@ -68,13 +68,6 @@ public interface IssueVoteStatisticalDao extends BaseDao polyLineData(IssueIdFormDTO issueId); - /** - * @param issueIdList - * @return - * @Author sun - * @Description 根据议题Id查询议题投票情况 - **/ - List selectListByissueId(@Param("issueIdList") List issueIdList); /** * @Description 得到表决中的议题 来进行缓存与数据库的同步 * @param diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java index 3692ef87b8..74a93deb8b 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java @@ -40,6 +40,8 @@ import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.Map; +import static com.epmet.commons.tools.redis.RedisUtils.NOT_EXPIRE; + /** * 议题表决记录表 * @@ -75,7 +77,7 @@ public class IssueVoteDetailRedis { String key = IssueConstant.REDIS_KEY +vote.getIssueId(); //bean to map Map map = BeanUtil.beanToMap(vote, false, true); - redisUtils.hMSet(key, map); + redisUtils.hMSet(key, map,NOT_EXPIRE); } public VoteRedisFormDTO get(String issueId){ 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 632017e990..b310d78e48 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 @@ -605,22 +605,24 @@ public class IssueServiceImpl extends BaseServiceImpl imp } //1:根据已结案项目列表查询议题项目关系表数据 List listRelation = issueProjectRelationDao.selectRelationList(projectIdList); - if(null==listRelation||listRelation.size() issueIdList = listRelation.stream().map(IssueProjectRelationEntity::getIssueId).collect(Collectors.toList()); //2:根据查询条件筛选出客户网格下已结案项目对应的议题详情列表 LatestListFormDTO latestListForm = formDTO.getLatestListForm(); - latestListForm.setPageNo((latestListForm.getPageNo()-NumConstant.ONE)*latestListForm.getPageSize()); + latestListForm.setPageNo((latestListForm.getPageNo() - NumConstant.ONE) * latestListForm.getPageSize()); List entityList = baseDao.selectIssueList(issueIdList, latestListForm); - + if (null == entityList || entityList.size() < NumConstant.ONE) { + throw new RenException(IssueConstant.SELECT_EXCEPTION); + } //3:遍历封装数据 - entityList.forEach(issue->{ - listRelation.forEach(relation->{ - if(relation.getIssueId().equals(issue.getId())){ - formDTO.getLatestListResult().forEach(project->{ - if(relation.getProjectId().equals(project.getProjectId())){ + entityList.forEach(issue -> { + listRelation.forEach(relation -> { + if (relation.getIssueId().equals(issue.getId())) { + formDTO.getLatestListResult().forEach(project -> { + if (relation.getProjectId().equals(project.getProjectId())) { LatestListResultDTO latest = ConvertUtils.sourceToTarget(project, LatestListResultDTO.class); latest.setIssueId(issue.getId()); latest.setIssueTitle(issue.getIssueTitle()); @@ -649,11 +651,7 @@ public class IssueServiceImpl extends BaseServiceImpl imp return returnList; } - //2:根据议题Id查询议题投票情况 - List issueIdList = entityList.stream().map(IssueEntity::getId).collect(Collectors.toList()); - List StatisticalList = issueVoteStatisticalDao.selectListByissueId(issueIdList); - - //3:调用epmet-user服务,查询议题发起人基本信息 + //2:调用epmet-user服务,查询议题发起人基本信息 List userIdList = entityList.stream().map(IssueEntity::getCreatedBy).collect(Collectors.toList()); UserResiInfoListFormDTO userResiInfoListFormDTO = new UserResiInfoListFormDTO(); userResiInfoListFormDTO.setUserIdList(userIdList); @@ -663,7 +661,7 @@ public class IssueServiceImpl extends BaseServiceImpl imp } List userInfoList = listResult.getData(); - //4:调用resi-group服务,批量查询话题内容 + //3:调用resi-group服务,批量查询话题内容 List topicIdList = entityList.stream().map(IssueEntity::getSourceId).collect(Collectors.toList()); Result> resultTopicList = resiGroupFeignClient.getTopicList(topicIdList); if (!resultTopicList.success() || null == resultTopicList.getData()) { @@ -671,19 +669,15 @@ public class IssueServiceImpl extends BaseServiceImpl imp } List topicList = resultTopicList.getData(); - //5:遍历组装对象 + //4:遍历组装对象 entityList.forEach(issue -> { LatestIssueListResultDTO resultDTO = new LatestIssueListResultDTO(); resultDTO.setIssueId(issue.getId()); resultDTO.setIssueTitle(issue.getIssueTitle()); - StatisticalList.forEach(sta -> { - if (issue.getId().equals(sta.getIssueId())) { - //表达态度总人数 - resultDTO.setVotedCount(sta.getSupportCount() + sta.getOppositionCount()); - } - }); + resultDTO.setCreateIssueTime(issue.getCreatedTime().getTime()/1000); userInfoList.forEach(user -> { if (issue.getCreatedBy().equals(user.getUserId())) { + resultDTO.setStaffHeadPhoto(user.getHeadPhoto()); //话题发起人昵称 resultDTO.setIssuePublisherName(user.getShowName()); } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml index 5d48526dfd..ac039d7cd0 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml +++ b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml @@ -69,17 +69,6 @@ ORDER BY statistical_date ASC - - @@ -33,33 +34,24 @@ ur.DEL_FLAG = 0 AND ur.USER_ID = #{userId} - - AND - er.APP = #{app} - - - AND - ur.CUSTOMER_ID = #{customerId} - - AND - ( ur.GRID_ID = #{gridId} OR ur.GRID_ID = 'all' ) + AND( ur.GRID_ID = #{gridId} OR ur.GRID_ID = 'all' ) - - AND - ur.GRID_ID = 'all' + + AND ur.GRID_ID = 'all' +