diff --git a/epmet-commons/epmet-commons-mybatis/pom.xml b/epmet-commons/epmet-commons-mybatis/pom.xml
index 502ef21e81..db396c4042 100644
--- a/epmet-commons/epmet-commons-mybatis/pom.xml
+++ b/epmet-commons/epmet-commons-mybatis/pom.xml
@@ -13,7 +13,7 @@
jar
- 3.2.0
+ 3.4.21.1.144.011.2.0.3
diff --git a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/config/MybatisPlusConfig.java b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/config/MybatisPlusConfig.java
index 4eef291b8b..8ef978f3c3 100644
--- a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/config/MybatisPlusConfig.java
+++ b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/config/MybatisPlusConfig.java
@@ -8,7 +8,9 @@
package com.epmet.commons.mybatis.config;
-import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.epmet.commons.mybatis.interceptor.DataFilterInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -37,8 +39,10 @@ public class MybatisPlusConfig {
*/
@Bean
@Order(0)
- public PaginationInterceptor paginationInterceptor() {
- return new PaginationInterceptor();
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+ return interceptor;
}
}
diff --git a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/entity/BaseEpmetEntity.java b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/entity/BaseEpmetEntity.java
index 9a70d44c39..52071d79e2 100644
--- a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/entity/BaseEpmetEntity.java
+++ b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/entity/BaseEpmetEntity.java
@@ -26,7 +26,7 @@ public abstract class BaseEpmetEntity implements Serializable {
/**
* id
*/
- @TableId(type = IdType.UUID)
+ @TableId(type = IdType.ASSIGN_ID)
private String id;
/**
diff --git a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/service/impl/BaseServiceImpl.java b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/service/impl/BaseServiceImpl.java
index 445f5a6e40..8d7327cfa0 100644
--- a/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/service/impl/BaseServiceImpl.java
+++ b/epmet-commons/epmet-commons-mybatis/src/main/java/com/epmet/commons/mybatis/service/impl/BaseServiceImpl.java
@@ -57,7 +57,7 @@ public abstract class BaseServiceImpl, T> implements Bas
Page page = initPage(params);
//默认排序
- if (StringUtils.isNotEmpty(defaultOrderField)) {
+ if (StringUtils.isNotBlank(defaultOrderField)) {
if (isAsc) {
page.addOrder(OrderItem.asc(defaultOrderField));
} else {
@@ -111,7 +111,7 @@ public abstract class BaseServiceImpl, T> implements Bas
String order = (String) params.get(Constant.ORDER);
//前端字段排序
- if (StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)) {
+ if (StringUtils.isNotBlank(orderField) && StringUtils.isNotBlank(order)) {
if (Constant.ASC.equalsIgnoreCase(order)) {
return page.addOrder(OrderItem.asc(orderField));
} else {
@@ -135,7 +135,7 @@ public abstract class BaseServiceImpl, T> implements Bas
protected Map paramsToLike(Map params, String... likes) {
for (String like : likes) {
String val = (String) params.get(like);
- if (StringUtils.isNotEmpty(val)) {
+ if (StringUtils.isNotBlank(val)) {
params.put(like, "%" + val + "%");
} else {
params.put(like, null);
@@ -294,12 +294,12 @@ public abstract class BaseServiceImpl, T> implements Bas
@Override
public boolean deleteById(Serializable id) {
- return SqlHelper.delBool(baseDao.deleteById(id));
+ return SqlHelper.retBool(baseDao.deleteById(id));
}
@Override
public boolean deleteBatchIds(Collection extends Serializable> idList) {
- return SqlHelper.delBool(baseDao.deleteBatchIds(idList));
+ return SqlHelper.retBool(baseDao.deleteBatchIds(idList));
}
@Transactional(rollbackFor = Exception.class)
@@ -311,7 +311,7 @@ public abstract class BaseServiceImpl, T> implements Bas
Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
String keyProperty = tableInfo.getKeyProperty();
Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
- Object idVal = ReflectionKit.getMethodValue(cls, entity, tableInfo.getKeyProperty());
+ Object idVal = ReflectionKit.getFieldValue( entity, tableInfo.getKeyProperty());
return StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal)) ? insert(entity) : updateById(entity);
}
return false;
@@ -335,7 +335,7 @@ public abstract class BaseServiceImpl, T> implements Bas
try (SqlSession batchSqlSession = sqlSessionBatch()) {
int i = 0;
for (T entity : entityList) {
- Object idVal = ReflectionKit.getMethodValue(cls, entity, keyProperty);
+ Object idVal = ReflectionKit.getFieldValue(entity, keyProperty);
if (StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal))) {
batchSqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), entity);
} else {
diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java
index 9ba8e7a96a..2fe5b49d9a 100644
--- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java
@@ -47,6 +47,7 @@ public interface NumConstant {
BigDecimal ONE_HUNDRED_DECIMAL = new BigDecimal(100);
BigDecimal ZERO_DECIMAL = new BigDecimal(0);
int ONE_THOUSAND = 1000;
+ int TEN_THOUSAND = 10000;
int MAX = 99999999;
int EIGHTY_EIGHT = 88;
int EIGHTY = 80;
diff --git a/epmet-module/data-aggregator/data-aggregator-client/pom.xml b/epmet-module/data-aggregator/data-aggregator-client/pom.xml
index 7f6f4cd2ff..6248b5536f 100644
--- a/epmet-module/data-aggregator/data-aggregator-client/pom.xml
+++ b/epmet-module/data-aggregator/data-aggregator-client/pom.xml
@@ -20,9 +20,8 @@
com.baomidoumybatis-plus-annotation
- 3.2.0
- compile
+ 3.4.2
-
\ No newline at end of file
+
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/GovOrgController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/GovOrgController.java
index 6011344b15..5ea1b47061 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/GovOrgController.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/GovOrgController.java
@@ -177,6 +177,24 @@ public class GovOrgController {
return new Result().ok(govOrgService.staffList(formDTO));
}
+ /**
+ * @Param formDTO
+ * @Description 获取当前组织下的【组织添加的】工作人员 组织/部门/网格下人员列表
+ * @author sun
+ */
+ @PostMapping("currentOrgStafflist")
+ public Result getCurrentOrgStafflist(@LoginUser TokenDto tokenDto, @RequestBody OrgStaffListFormDTO formDTO) {
+ ValidatorUtils.validateEntity(formDTO, OrgStaffListFormDTO.OrgStaff.class);
+ if(!"agency".equals(formDTO.getOrgType())&&!"dept".equals(formDTO.getOrgType())&&!"grid".equals(formDTO.getOrgType())){
+ throw new RenException("参数类型错误");
+ }
+ //formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc");
+ //formDTO.setStaffId("73ae6280e46a6653a5605d51d5462725");
+ formDTO.setCustomerId(tokenDto.getCustomerId());
+ formDTO.setStaffId(tokenDto.getUserId());
+ return new Result().ok(govOrgService.getCurrentOrgStafflist(formDTO));
+ }
+
/**
* @Param formDTO
* @Description 【通讯录】人员详情v2
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/CustomerStaffDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/CustomerStaffDao.java
index a046a17f9c..de989d76e6 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/CustomerStaffDao.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/CustomerStaffDao.java
@@ -64,11 +64,11 @@ public interface CustomerStaffDao extends BaseDao {
* @Description 分页查询工作人员基础信息、角色信息【组织人员单位领导角色人员在前;部门人员部门领导角色人员在前;网格人员网格长角色人员在前】
* @author sun
*/
- List selectStaffList(@Param("staffIds") LinkedList staffIds);
+ List selectStaffList(@Param("staffIds") List staffIds);
/**
* @Description 查询工作人员基础信息
* @author sun
*/
CustomerStaffDTO selectByStaffId(@Param("staffId") String staffId);
-}
\ No newline at end of file
+}
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/UserBaseInfoDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/UserBaseInfoDao.java
index e79c563c0a..4d77b2b91e 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/UserBaseInfoDao.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/UserBaseInfoDao.java
@@ -55,5 +55,5 @@ public interface UserBaseInfoDao extends BaseDao {
* @Description 查询userId的身份证号在小程序用户中存在的多个userId值
* @author sun
*/
- List getUserBaseList(@Param("userId") String userId, @Param("customerId") String customerId);
+ List getUserBaseList(@Param("customerId") String customerId, @Param("userId") String userId, @Param("idCard") String idCard);
}
\ No newline at end of file
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java
index ed93a19d5a..e4ae4c2115 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java
@@ -176,6 +176,8 @@ public interface EpmetUserService {
*/
List listStaffsByIds(List userIdsPart);
+ List selectStaffList(List staffIds);
+
/**
* 【人员类别分析】-各类别人数
* @param formDTO
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java
index 19bebf11f1..cbe81adec8 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java
@@ -35,6 +35,8 @@ import com.epmet.dataaggre.entity.epmetuser.ResiUserBadgeEntity;
import com.epmet.dataaggre.entity.epmetuser.StaffRoleEntity;
import com.epmet.dataaggre.entity.govorg.CustomerAgencyEntity;
import com.epmet.dataaggre.service.datastats.DataStatsService;
+import com.epmet.dataaggre.entity.epmetuser.*;
+import com.epmet.dataaggre.service.datastats.DataStatsService;
import com.epmet.dataaggre.service.epmetuser.EpmetUserService;
import com.epmet.dataaggre.service.epmetuser.StaffPatrolDetailService;
import com.epmet.dataaggre.service.epmetuser.StaffPatrolRecordService;
@@ -721,7 +723,13 @@ public class EpmetUserServiceImpl implements EpmetUserService {
*/
@Override
public List getUserBaseList(String userId, String customerId) {
- return userBaseInfoDao.getUserBaseList(userId, customerId);
+ List resultList = new ArrayList<>();
+ List list = userBaseInfoDao.getUserBaseList(customerId, userId, null);
+ if (!CollectionUtils.isEmpty(list) && StringUtils.isNotBlank(list.get(0).getIdNum())) {
+ return userBaseInfoDao.getUserBaseList(customerId, null, list.get(0).getIdNum());
+ }
+ resultList.addAll(list);
+ return resultList;
}
/**
@@ -750,6 +758,11 @@ public class EpmetUserServiceImpl implements EpmetUserService {
return customerStaffDao.selectList(query);
}
+ @Override
+ public List selectStaffList(List staffIds) {
+ return customerStaffDao.selectStaffList(staffIds);
+ }
+
/**
* 【人员类别分析】-各类别人数
*
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java
index 77c8c33d0f..b2101a6798 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java
@@ -11,7 +11,6 @@ import com.epmet.dataaggre.dto.govorg.form.SubOrgFormDTO;
import com.epmet.dataaggre.dto.govorg.result.*;
import com.epmet.dataaggre.dto.resigroup.result.OrgInfoCommonDTO;
import com.epmet.dataaggre.entity.govorg.CustomerAgencyEntity;
-import com.epmet.dataaggre.entity.govorg.CustomerGridEntity;
import java.util.List;
@@ -93,6 +92,7 @@ public interface GovOrgService {
* @author sun
*/
OrgStaffListResultDTO staffList(OrgStaffListFormDTO formDTO);
+ OrgStaffListResultDTO getCurrentOrgStafflist(OrgStaffListFormDTO formDTO);
/**
* @Param formDTO
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java
index 23866c207c..41e390a1c7 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java
@@ -416,6 +416,41 @@ public class GovOrgServiceImpl implements GovOrgService {
return resultDTO;
}
+ /**
+ * @Param formDTO
+ * @Description 【通讯录】组织/部门/网格下人员列表
+ * @author sun
+ */
+ @Override
+ public OrgStaffListResultDTO getCurrentOrgStafflist(OrgStaffListFormDTO formDTO) {
+ OrgStaffListResultDTO resultDTO = new OrgStaffListResultDTO();
+ //1.按类型查询组织、部门、网格下所有工作人员Id列表[需要按角色排序 所以这里不能分页]
+ List staffIds = customerStaffAgencyDao.selectStaffList(formDTO.getOrgId(), formDTO.getOrgType());
+ if (org.springframework.util.CollectionUtils.isEmpty(staffIds)) {
+ return resultDTO;
+ }
+ formDTO.setStaffIds(staffIds);
+ //是否包含自己
+ if("0".equals(formDTO.getIncludeMe())){
+ staffIds.removeIf(s->s.equals(formDTO.getStaffId()));
+ }
+
+ //2.分页查询工作人员基础信息、角色信息【组织人员单位领导角色人员在前;部门人员部门领导角色人员在前;网格人员网格长角色人员在前】
+ List staffList = epmetUserService.selectStaffList(staffIds);
+
+ //3.查询工作人员注册组织关系信息
+ List staffIdList = staffList.stream().map(ListStaffResultDTO::getStaffId).collect(Collectors.toList());
+ if (!CollectionUtils.isEmpty(staffIdList)){
+ List list = customerAgencyDao.selelctStaffOrg(staffIdList);
+ staffList.forEach(re -> list.stream().filter(l -> re.getStaffId().equals(l.getStaffId())).forEach(s -> re.setOrgType(s.getOrgType())));
+ }
+
+ //3.封装数据并返回
+ resultDTO.setStaffCount(staffIds.size());
+ resultDTO.setStaffList((null == staffList ? new ArrayList<>() : staffList));
+ return resultDTO;
+ }
+
/**
* @Param formDTO
* @Description 【通讯录】人员详情v2
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml
index 6c118e2ce0..9ba9386fb3 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml
@@ -41,13 +41,24 @@
\ No newline at end of file
diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml
index 987a0d7281..599a5da471 100644
--- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml
+++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml
@@ -29,7 +29,6 @@
WHERE
p.DEL_FLAG = '0'
AND p.CUSTOMER_ID = #{customerId}
- AND p.ORG_ID_PATH LIKE concat('%', #{agencyId}, '%')
AND p.`STATUS` = #{projectStatus}
diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/OrgRankDataShibeiResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/OrgRankDataShibeiResultDTO.java
new file mode 100644
index 0000000000..c443f78fc5
--- /dev/null
+++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/OrgRankDataShibeiResultDTO.java
@@ -0,0 +1,34 @@
+package com.epmet.evaluationindex.screen.dto.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description 市北数字社区-组织先进排行榜 查询结果dto
+ * @ClassName OrgRankDataResultDTO
+ * @Auth wangc
+ * @Date 2020-08-21 11:16
+ */
+@Data
+public class OrgRankDataShibeiResultDTO implements Serializable {
+
+ private static final long serialVersionUID = -7874641768141936572L;
+
+ private String orgId;
+ /**
+ * 名称 XXXX社区党委
+ * */
+ private String name;
+
+ /**
+ * 党员数
+ * */
+ private BigDecimal score;
+
+ /**
+ * 数据所属月份
+ */
+ private String monthId;
+}
diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java
index dcf083d507..1e4a67a0b9 100644
--- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java
+++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java
@@ -154,6 +154,19 @@ public class IndexController {
return new Result>().ok(indexService.advancedBranchRank(formDTO));
}
+ /**
+ * @param formDTO
+ * @Description 数字社区:数据分析-动力网格
+ * @author sun
+ */
+ @PostMapping("advancedbranchrank-shibei")
+ Result> advancedBranchRankShibei(@RequestBody AdvancedBranchRankFormDTO formDTO, @LoginUser TokenDto loginUser){
+ ValidatorUtils.validateEntity(formDTO, AdvancedBranchRankFormDTO.AddUserInternalGroup.class);
+ formDTO.setCustomerId(loginUser.getCustomerId());
+ //formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc");
+ return new Result>().ok(indexService.advancedBranchRankShibei(formDTO));
+ }
+
/**
* @param formDTO
* @author yinzuomei
diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenOrgRankDataShibeiDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenOrgRankDataShibeiDao.java
new file mode 100644
index 0000000000..b6df3da088
--- /dev/null
+++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenOrgRankDataShibeiDao.java
@@ -0,0 +1,42 @@
+/**
+ * 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.
+ *