master
liuqingkun 3 years ago
parent 28fc0241e6
commit d0f21df318
  1. 41
      doc/api.md
  2. BIN
      doc/上传数据_模板.xls
  3. 2
      src/main/java/org/springblade/modules/business/controller/AppealRegController.java
  4. 2
      src/main/java/org/springblade/modules/business/entity/DataEntity.java
  5. 2
      src/main/java/org/springblade/modules/business/mapper/AppealRegMapper.xml
  6. 2
      src/main/java/org/springblade/modules/business/service/ILargeScreenService.java
  7. 35
      src/main/java/org/springblade/modules/business/service/impl/AppealMediationServiceImpl.java
  8. 31
      src/main/java/org/springblade/modules/business/service/impl/AppealRegServiceImpl.java
  9. 126
      src/main/java/org/springblade/modules/business/service/impl/LargeScreenServiceImpl.java
  10. 6
      src/main/java/org/springblade/modules/business/vo/AppealMediationVO.java
  11. 36
      src/main/resources/application-dev.yml
  12. 13
      src/main/resources/application-prod.yml
  13. 238
      src/main/resources/application-test.yml
  14. 124
      src/main/resources/log/logback-dev.xml
  15. 4
      src/main/resources/log/logback-prod.xml

@ -627,7 +627,7 @@
| talkingHis | String | N | 接谈记录 |
| talkingAdvice | String | N | 接谈意见 |
| disputeLevel | String | N | 事件等级 |
| status | String | N | 诉求状态 |
| appealStatus | String | N | 诉求状态 |
| dutyDeptIds | String | N | 负责部门ID, 以逗号分割 |
| copyDeptIds | String | N | 抄送部门ID, 以逗号分割 |
| feedbackDeadline | String | N | 反馈时限 |
@ -636,7 +636,7 @@
| visitTime | String | N | 来访时间 |
| submitTime | String | N | 提交时间 |
| fileList | list | N | 上传文件列表 |
| - url | list | N | 上传文件路径 |
| - fileAddr | list | N | 上传文件路径 |
- 请求示例
```json
@ -699,15 +699,16 @@
- 返回示例
```json
{
"code": 200,
"success": true,
"data": {
"link": "http://xxxx/file.png",
"domain": "http:xxx",
"name": "file.png",
"originalName": "file"
},
"msg": "操作成功"
"code": 200,
"success": true,
"data": {
"link": "http://192.168.1.106:9000/mediation-paltform/upload/20230613/e39ca485ce9726eb1e2f65b794c9aba7.png",
"domain": "http://192.168.1.106:9000/mediation-paltform",
"name": "upload/20230613/e39ca485ce9726eb1e2f65b794c9aba7.png",
"originalName": "20230220174333.png",
"attachId": null
},
"msg": "操作成功"
}
```
@ -749,15 +750,15 @@
- 返回示例
```json
{
"code": 200,
"success": true,
"data": {
"mon": "20",
"quarterly": "50",
"year": "200",
"all": "300"
},
"msg": "操作成功"
"code": 200,
"success": true,
"data": {
"week": 7,
"year": 7,
"mon": 7,
"day": 4
},
"msg": "操作成功"
}
```

Binary file not shown.

@ -97,7 +97,7 @@ public class AppealRegController extends BladeController {
IPage<AppealListVO> vos = regService.getPage(Condition.getPage(query), appealStatus, startTime, endTime, appealType, windowId, username);
vos.getRecords().forEach(vo -> {
String cardNo = vo.getCardno();
if (Func.isNotBlank(cardNo)) {
if (Func.isNotBlank(cardNo) && cardNo.length() > 6) {
vo.setCardno(cardNo.substring(0, cardNo.length() - 6) + "******");
}
});

@ -7,5 +7,5 @@ public class DataEntity {
private String name;
private Integer num;
private Integer value;
}

@ -60,7 +60,7 @@
/* 找出每个诉求的最后一次登记记录 */
FROM (SELECT t.* FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY appeal_id ORDER BY create_time DESC) AS row_index FROM mp_appeal_reg reg) t WHERE t.row_index = 1) t2
/* 找出每次登记的第一张用户 */
LEFT JOIN (SELECT t.* FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY cardno ORDER BY sort ASC) AS row_index FROM mp_appeal_visitor vis) t WHERE t.row_index = 1) t3 ON t2.id = t3.appeal_reg_id
LEFT JOIN (SELECT t.* FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY appeal_reg_id ORDER BY sort ASC) AS row_index FROM mp_appeal_visitor vis) t WHERE t.row_index = 1) t3 ON t2.id = t3.appeal_reg_id
) b ON a.id = b.appeal_id
LEFT JOIN blade_dict_biz biz ON a.dispute_id = biz.id
WHERE a.source_type = 0

@ -42,7 +42,7 @@ public interface ILargeScreenService {
Map<String, List<Object>> getAppealByMon();
Map<String, Object> getAppealTypePercent();
List<Map<String, Object>> getAppealTypePercent();
Map<String, Object> getAppealSubmitCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException;

@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.*;
import org.springblade.modules.business.mapper.AppealMediationMapper;
@ -73,8 +74,9 @@ public class AppealMediationServiceImpl extends BaseServiceImpl<AppealMediationM
appeal.setSourceType(BusinessConstant.SOURCE_TYPE_SYSTEM);
// 更新诉求和诉求登记的信息
appeal.setSkipGrant(appeal.getSkipGrant() == -1 ? BusinessConstant.CODE_FALSE : appeal.getSkipGrant());
appeal.setDisputeLevel(appeal.getDisputeLevel() == -1 ? BusinessConstant.DISPUTE_LEVEL_ZERO : appeal.getDisputeLevel());
appeal.setSkipGrant((Func.isEmpty(appeal.getSkipGrant()) || appeal.getSkipGrant() == -1) ? BusinessConstant.CODE_FALSE : appeal.getSkipGrant());
appeal.setDisputeLevel((Func.isEmpty(appeal.getDisputeLevel()) || appeal.getDisputeLevel() == -1) ? BusinessConstant.DISPUTE_LEVEL_ZERO : appeal.getDisputeLevel());
appeal.setStatus(entity.getAppealStatus());
appealService.updateById(appeal);
reg.setId(entity.getAppealRegId());
appealRegService.updateById(reg);
@ -82,17 +84,20 @@ public class AppealMediationServiceImpl extends BaseServiceImpl<AppealMediationM
List<AppealMediationDetailListVO> talkingHisList = entity.getTalkingHisList();
if (Func.isEmpty(talkingHisList))
return false;
mediation.setTalkingTime(talkingHisList.get(0).getTalkingTime());
mediation.setTalkingHis(talkingHisList.get(0).getTalkingHis());
mediation.setTalkingTime(talkingHisList.get(talkingHisList.size() - 1).getTalkingTime());
mediation.setTalkingHis(talkingHisList.get(talkingHisList.size() - 1).getTalkingHis());
mediation.setSubmitTime(Func.isEmpty(mediation.getSubmitTime()) ? DateUtil.now() : mediation.getSubmitTime());
save(mediation);
List<AppealMediationFile> fileList = entity.getFileList();
fileList.forEach(file -> {
file.setAppealId(mediation.getAppealId());
file.setAppealId(mediation.getAppealRegId());
file.setMediationId(mediation.getId());
});
fileService.saveBatch(fileList);
if (Func.isNotEmpty(fileList)) {
fileList.forEach(file -> {
file.setAppealId(mediation.getAppealId());
file.setAppealRegId(mediation.getAppealRegId());
file.setMediationId(mediation.getId());
});
fileService.saveBatch(fileList);
}
return true;
}
@ -130,7 +135,9 @@ public class AppealMediationServiceImpl extends BaseServiceImpl<AppealMediationM
// 4. 组织返回对象数据
vo.setAppealId(Long.valueOf(appealId));
vo.setAppealRegId(appealReg.getId());
vo.setVisitors(visitorList);
vo.setPersonNum(visitorList.size());
vo.setStreetId(appeal.getStreetId());
vo.setDisputeId(appeal.getDisputeId());
vo.setDisputeName(appeal.getDisputeName());
@ -142,16 +149,16 @@ public class AppealMediationServiceImpl extends BaseServiceImpl<AppealMediationM
vo.setLegalPaper(appealReg.getLegalPaper());
vo.setFirstRegTime(appeal.getFirstRegTime());
vo.setProblemDesc(appeal.getProblemDesc());
vo.setAppealStatus(appeal.getStatus());
vo.setTalkingHisList(detailList);
if (Func.isNotEmpty(mediation)) {
List<AppealMediationFile> fileList = fileService.list(
Wrappers.<AppealMediationFile>lambdaQuery().eq(AppealMediationFile::getMediationId, mediation.getId()));
vo.setAttitude(mediation.getAttitude());
vo.setTalkingAdvice(mediation.getAttitude());
vo.setDutyDeptIds(mediation.getAttitude());
vo.setCopyDeptIds(mediation.getAttitude());
vo.setTalkingAdvice(mediation.getTalkingAdvice());
vo.setDutyDeptIds(mediation.getDutyDeptIds());
vo.setCopyDeptIds(mediation.getCopyDeptIds());
vo.setDisputeLevel(appeal.getDisputeLevel());
vo.setFeedbackDeadline(mediation.getFeedbackDeadline());
vo.setFinishDeadline(mediation.getFinishDeadline());

@ -30,6 +30,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.modules.business.entity.Appeal;
import org.springblade.modules.business.entity.AppealReg;
import org.springblade.modules.business.entity.AppealVisitor;
@ -132,8 +133,10 @@ public class AppealRegServiceImpl extends BaseServiceImpl<AppealRegMapper, Appea
// 1. 先保存appeal, 固定数据来源为系统
appeal.setSourceType(BusinessConstant.SOURCE_TYPE_SYSTEM);
int nums = 0;
appeal.setFirstRegTime(DateUtil.now());
boolean nums = false;
IAppealService appealService = SpringUtil.getBean(IAppealService.class);
appeal.setStatus(BusinessConstant.APPEAL_STATUS_WAITING);
if (Func.isEmpty(appeal.getId())) {
ServerWindowsDispute swDispute = swDisputeService.getOne(Wrappers.<ServerWindowsDispute>lambdaQuery().eq(ServerWindowsDispute::getDisputeId, appeal.getDisputeId()));
if (Func.isNotEmpty(swDispute)) {
@ -142,12 +145,12 @@ public class AppealRegServiceImpl extends BaseServiceImpl<AppealRegMapper, Appea
appeal.setHandleDept(BusinessConstant.DEFAULT_HANDLE_DEPT);
}
appeal.setSkipGrant(BusinessConstant.CODE_FALSE);
appeal.setStatus(BusinessConstant.APPEAL_STATUS_WAITING);
nums = appealMapper.insert(appeal);
appeal.setFirstRegTime(DateUtil.now());
nums = appealService.save(appeal);
} else {
nums = appealMapper.updateById(appeal);
nums = appealService.updateById(appeal);
}
if (nums <= 0) {
if (!nums) {
return false;
}
@ -213,13 +216,13 @@ public class AppealRegServiceImpl extends BaseServiceImpl<AppealRegMapper, Appea
// 纠纷等级(事件等级), 0:简单, 1:一般, 2:重大, 3:疑难
if (StringUtils.isNotBlank(excel.getDisputeLevel())) {
if ("简单".equals(excel.getDisputeLevel())) {
appeal.setDisputeLevel(0);
appeal.setDisputeLevel(BusinessConstant.DISPUTE_LEVEL_ZERO);
} else if ("一般".equals(excel.getDisputeLevel())) {
appeal.setDisputeLevel(1);
appeal.setDisputeLevel(BusinessConstant.DISPUTE_LEVEL_ONE);
} else if ("重大".equals(excel.getDisputeLevel())) {
appeal.setDisputeLevel(2);
appeal.setDisputeLevel(BusinessConstant.DISPUTE_LEVEL_TWO);
} else if ("疑难".equals(excel.getDisputeLevel())) {
appeal.setDisputeLevel(3);
appeal.setDisputeLevel(BusinessConstant.DISPUTE_LEVEL_THREE);
}
}
@ -228,18 +231,18 @@ public class AppealRegServiceImpl extends BaseServiceImpl<AppealRegMapper, Appea
try {
appeal.setFirstRegTime(dateFormat.parse(excel.getFirstRegTime()));
} catch (ParseException e) {
e.printStackTrace();
log.error("时间格式转换错误, 格式应为yyyy-mm-dd");
}
}
// 诉求状态(办理状态)
if (StringUtils.isNotBlank(excel.getStatus())) {
if ("正在处理".equals(excel.getStatus())) {
appeal.setStatus(1);
appeal.setStatus(BusinessConstant.APPEAL_STATUS_HANDING);
} else if ("达成协议".equals(excel.getStatus())) {
appeal.setStatus(2);
appeal.setStatus(BusinessConstant.APPEAL_STATUS_AGREEMENT);
} else if ("调解成功".equals(excel.getStatus()) || "完成归档".equals(excel.getStatus())) {
appeal.setStatus(3);
appeal.setStatus(BusinessConstant.APPEAL_STATUS_FINISH);
}
}

@ -19,9 +19,12 @@ package org.springblade.modules.business.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.Appeal;
import org.springblade.modules.business.entity.AppealVisitor;
import org.springblade.modules.business.entity.DataEntity;
@ -29,6 +32,9 @@ import org.springblade.modules.business.service.IAppealService;
import org.springblade.modules.business.service.IAppealVisitorService;
import org.springblade.modules.business.service.ILargeScreenService;
import org.springblade.modules.business.utils.LocalDateTimeUtils;
import org.springblade.modules.system.entity.DictBiz;
import org.springblade.modules.system.entity.User;
import org.springblade.modules.system.service.IDictBizService;
import org.springblade.modules.system.service.IUserService;
import org.springframework.stereotype.Service;
@ -57,6 +63,7 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
private final IUserService userService;
private final IDictBizService dictService;
@Override
public Map<String, Object> getMediateFinish() {
@ -98,23 +105,25 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
Map<String, Object> map = new HashMap<>();
LambdaQueryWrapper<Appeal> wrapper = new LambdaQueryWrapper<>();
// 总化解数
map.put("all", appealService.count(wrapper));
wrapper.clear();
// 本年度化解数
wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.yearStartTime(), LocalDateTimeUtils.yearEndTime());
map.put("year", appealService.count(wrapper));
wrapper.clear();
// 本季度化解数
wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.quarterStartTime(), LocalDateTimeUtils.quarterEndTime());
map.put("quarterly", appealService.count(wrapper));
wrapper.clear();
// 本月化解数
// 本月度化解数
wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.monthStartTime(), LocalDateTimeUtils.monthEndTime());
map.put("mon", appealService.count(wrapper));
wrapper.clear();
// 本周度化解数
wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.weekStartTime(), LocalDateTimeUtils.weekEndTime());
map.put("week", appealService.count(wrapper));
wrapper.clear();
// 本日化解数
wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.todayStartTime(), LocalDateTimeUtils.todayEndTime());
map.put("day", appealService.count(wrapper));
wrapper.clear();
return map;
}
@ -127,8 +136,6 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
state.add(1);
LambdaQueryWrapper<Appeal> wrapper = new LambdaQueryWrapper<>();
// 只查这几个字段值
// wrapper.select(Appeal::getId, Appeal::getDisputeName, Appeal::getFirstRegTime, Appeal::getStatus, Appeal::getStreetId);
// 待处理、正在处理
wrapper.in(Appeal::getStatus, state);
// 根据登记时间倒序
@ -139,7 +146,11 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
List<Appeal> appealList = appeals.stream().limit(50).collect(Collectors.toList());
// 所属街道赋字典值
appealList.forEach(appeal -> appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue()));
appealList.forEach(appeal -> {
appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue());
String disputeName = Func.isEmpty(appeal.getDisputeName()) ? DictBizCache.getById(appeal.getDisputeId()).getDictValue() : appeal.getDisputeName();
appeal.setDisputeName(disputeName);
});
return appealList;
}
@ -177,9 +188,13 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
}
@Override
public Map<String, Object> getAppealTypePercent() {
public List<Map<String, Object>> getAppealTypePercent() {
// 先查所有
List<Appeal> appeals = appealService.list();
appeals.forEach(appeal -> {
String disputeName = Func.isEmpty(appeal.getDisputeName()) ? DictBizCache.getById(appeal.getDisputeId()).getDictValue() : appeal.getDisputeName();
appeal.setDisputeName(disputeName);
});
// 根据纠纷类型分组
Map<String, List<Appeal>> collect = appeals.stream().collect(Collectors.groupingBy(Appeal::getDisputeName));
@ -195,30 +210,41 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
list.sort((o1, o2) -> o2.getValue() - o1.getValue());
List result = new ArrayList();
Map<String, Object> hashMap = new HashMap<>();
DecimalFormat df = new DecimalFormat("#0.0");
// 如果类型小于5,正常计算
if (list.size() <= 5) {
// 如果类型小于5,正常计算
for (Map.Entry<String, Integer> entry : list) {
hashMap.put(entry.getKey(), df.format((double) entry.getValue() / (double) appeals.size() * 100) + "%");
hashMap = new HashMap<>();
hashMap.put("name", entry.getKey());
hashMap.put("value", entry.getValue());
result.add(hashMap);
}
}
// 如果类型大于5,前五正常计算,其余全部按照其他纠纷计算
else {
} else {
// 如果类型大于5,前五正常计算,其余全部按照其他纠纷计算
for (int i = 0; i < 5; i++) {
Map.Entry<String, Integer> entry = list.get(i);
hashMap.put(entry.getKey(), df.format((double) entry.getValue() / (double) appeals.size() * 100) + "%");
hashMap = new HashMap<>();
hashMap.put("name", entry.getKey());
hashMap.put("value", entry.getValue());
result.add(hashMap);
}
int size = 0;
for (int i = 5; i < list.size(); i++) {
Map.Entry<String, Integer> entry = list.get(i);
size += entry.getValue();
}
hashMap.put("其他纠纷", df.format((double) size / (double) appeals.size() * 100) + "%");
hashMap = new HashMap<>();
hashMap.put("name", "其他纠纷");
hashMap.put("value", size);
result.add(hashMap);
}
return hashMap;
return result;
}
@Override
@ -342,48 +368,62 @@ public class LargeScreenServiceImpl implements ILargeScreenService {
public Map<String, List<DataEntity>> getAppealHot() {
Map<String, List<DataEntity>> map = new HashMap();
// 化解成功状态数组
List<Integer> state = new ArrayList<>();
state.add(2);
state.add(3);
List<Integer> state = Arrays.asList(BusinessConstant.APPEAL_STATUS_AGREEMENT, BusinessConstant.APPEAL_STATUS_FINISH);
// 获取所有化解成功的诉求记录
LambdaQueryWrapper<Appeal> wrapper = new LambdaQueryWrapper<>();
wrapper.in(Appeal::getStatus, state);
List<Appeal> appeals = appealService.list(wrapper);
appeals.forEach(appeal -> {
appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue());
appeal.setName(userService.getById(appeal.getHandleDept()).getName());
});
// 过滤掉无街道和处理部门的, 防止异常
appeals = appeals.stream().filter(
appeal -> Func.isNotEmpty(appeal.getStreetId()) && Func.isNotEmpty(appeal.getHandleDept())
).collect(Collectors.toList());
// 给街道和用户赋值
// appeals.forEach(appeal -> {
// appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue());
// appeal.setName(userService.getById(appeal.getHandleDept()).getName());
// });
// 获取所有街道
String code = "street";
List<DictBiz> dataList = dictService.getList(code);
// 根据街道分组
Map<String, List<Appeal>> street = appeals.stream().collect(Collectors.groupingBy(Appeal::getStreet));
Set<String> names = street.keySet();
Map<Long, List<Appeal>> street = appeals.stream().collect(Collectors.groupingBy(Appeal::getStreetId));
// 封装到数据对象
List<DataEntity> strees = new ArrayList<>();
for (String name : names) {
dataList.forEach(dictBiz -> {
Long dictBizId = dictBiz.getId();
DataEntity entity = new DataEntity();
entity.setName(name);
entity.setNum(street.get(name).size());
entity.setName(dictBiz.getDictValue());
entity.setValue(street.containsKey(dictBizId) ? street.get(dictBizId).size() : 0);
strees.add(entity);
}
});
// 倒序
List<DataEntity> streeList = strees.stream().sorted(Comparator.comparing(DataEntity::getNum).reversed()).collect(Collectors.toList());
List<DataEntity> streeList = strees.stream().sorted(Comparator.comparing(DataEntity::getValue).reversed()).collect(Collectors.toList());
map.put("street", streeList);
// 获取所有部门
String deptId = "1666621912872280065";
List<User> userList = userService.list(Wrappers.<User>lambdaQuery().eq(User::getDeptId, deptId));
// 根据部门分组
Map<String, List<Appeal>> town = appeals.stream().collect(Collectors.groupingBy(Appeal::getName));
Set<String> depts = town.keySet();
Map<Long, List<Appeal>> town = appeals.stream().collect(Collectors.groupingBy(Appeal::getHandleDept));
// 封装到数据对象
List<DataEntity> towns = new ArrayList<>();
for (String name : depts) {
userList.forEach(user -> {
Long id = user.getId();
DataEntity entity = new DataEntity();
entity.setName(name);
entity.setNum(town.get(name).size());
entity.setName(user.getName());
entity.setValue(town.containsKey(id) ? town.get(id).size() : 0);
towns.add(entity);
}
});
// 倒序
List<DataEntity> townList = towns.stream().sorted(Comparator.comparing(DataEntity::getNum).reversed()).collect(Collectors.toList());
List<DataEntity> townList = towns.stream().sorted(Comparator.comparing(DataEntity::getValue).reversed()).collect(Collectors.toList());
map.put("town", townList);
return map;

@ -63,6 +63,11 @@ public class AppealMediationVO implements Serializable {
*/
private String disputeName;
/**
* 诉求状态
*/
private Integer appealStatus;
/**
* 何单位处理过-单位id
*/
@ -150,6 +155,7 @@ public class AppealMediationVO implements Serializable {
*/
private String remark;
/**
* 提交时间
*/

@ -1,4 +1,4 @@
#数据源配置
##数据源配置 - dev
spring:
redis:
##redis 单机环境配置
@ -7,10 +7,6 @@ spring:
password:
database: 0
ssl: false
##redis 集群环境配置
#cluster:
# nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
# commandTimeout: 5000
datasource:
# MySql
url: jdbc:mysql://localhost:3306/mediation_platform?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
@ -22,17 +18,19 @@ social:
enabled: true
domain: http://127.0.0.1:1888
#blade配置
blade:
#分布式锁配置
lock:
##是否启用分布式锁
enabled: false
##redis服务地址
address: redis://127.0.0.1:6379
#本地文件上传
file:
remote-mode: true
upload-domain: http://localhost:8999
remote-path: /usr/share/nginx/html
#server:
# port: 10000
#
##数据源配置
#spring:
# redis:
# ##redis 单机环境配置
# host: 223.80.105.200
# port: 41307
# password: asdf.1234
# database: 0
# ssl: false
# datasource:
# url: jdbc:mysql://223.80.105.200:41306/mediation_platform?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
# username: root
# password: asdf.1234

@ -1,12 +1,15 @@
server:
port: 10000
#数据源配置
spring:
redis:
##redis 单机环境配置
##将docker脚本部署的redis服务映射为宿主机ip
##生产环境推荐使用阿里云高可用redis服务并设置密码
host: 127.0.0.1
port: 6379
password:
host: 223.80.105.200
port: 41307
password: asdf.1234
database: 0
ssl: false
##redis 集群环境配置
@ -14,9 +17,9 @@ spring:
# nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
# commandTimeout: 5000
datasource:
url: jdbc:mysql://localhost:3306/bladex_boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
url: jdbc:mysql://223.80.105.200:41306/mediation_platform?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
password: asdf.1234
#第三方登陆
social:

@ -1,40 +1,226 @@
#数据源配置
#服务器配置
server:
port: 10000
undertow:
threads:
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
io: 16
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker: 400
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
buffer-size: 1024
# 是否分配的直接内存
direct-buffers: true
spring:
redis:
##redis 单机环境配置
##将docker脚本部署的redis服务映射为宿主机ip
##生产环境推荐使用阿里云高可用redis服务并设置密码
host: 127.0.0.1
port: 6379
password:
host: 223.80.105.200
port: 41307
password: asdf.1234
database: 0
ssl: false
##redis 集群环境配置
#cluster:
# nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
# commandTimeout: 5000
datasource:
url: jdbc:mysql://localhost:3306/bladex_boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://223.80.105.200:41306/mediation_platform?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
password: asdf.1234
druid:
# MySql、PostgreSQL、SqlServer、DaMeng校验
validation-query: select 1
# Oracle、YashanDB校验
#oracle: true
#validation-query: select 1 from dual
validation-query-timeout: 2000
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 60000
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
stat-view-servlet:
enabled: true
login-username: blade
login-password: 1qaz@WSX
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
session-stat-enable: true
session-stat-max-count: 10
#第三方登陆
social:
# mybatis
mybatis-plus:
mapper-locations: classpath:org/springblade/**/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: org.springblade.**.entity
#typeEnumsPackage: org.springblade.dashboard.entity.enums
global-config:
# 关闭MP3.0自带的banner
banner: false
db-config:
#主键类型 0:"数据库ID自增", 1:"不操作", 2:"用户输入ID",3:"数字型snowflake", 4:"全局唯一ID UUID", 5:"字符串型snowflake";
id-type: assign_id
#字段策略
insert-strategy: not_null
update-strategy: not_null
where-strategy: not_null
#驼峰下划线转换
table-underline: true
# 逻辑删除配置
# 逻辑删除全局值(1表示已删除,这也是Mybatis Plus的默认配置)
logic-delete-value: 1
# 逻辑未删除全局值(0表示未删除,这也是Mybatis Plus的默认配置)
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
jdbc-type-for-null: 'null'
#knife4j配置
knife4j:
#启用
enable: true
#基础认证
basic:
enable: false
username: blade
password: blade
#增强配置
setting:
enableSwaggerModels: true
enableDocumentManage: true
enableHost: false
enableHostText: http://localhost
enableRequestCache: true
enableFilterMultipartApis: false
enableFilterMultipartApiMethodType: POST
language: zh_cn
enableFooter: false
enableFooterCustom: true
footerCustomContent: Copyright © 2023 BladeX All Rights Reserved
#报表配置
report:
enabled: false
database:
provider:
prefix: blade-
#oss默认配置
oss:
enabled: true
domain: http://127.0.0.1:1888
name: qiniu
tenant-mode: true
endpoint: http://prt1thnw3.bkt.clouddn.com
access-key: N_Loh1ngBqcJovwiAJqR91Ifj2vgOWHOf8AwBA_h
secret-key: AuzuA1KHAbkIndCU0dB3Zfii2O3crHNODDmpxHRS
bucket-name: bladex
#blade配置
blade:
#分布式锁配置
lock:
##是否启用分布式锁
enabled: false
##将docker脚本部署的redis服务映射为宿主机ip
##生产环境推荐使用阿里云高可用redis服务并设置密码
address: redis://127.0.0.1:6379
password: 123456
#本地文件上传
file:
remote-mode: true
upload-domain: http://localhost:8999
remote-path: /usr/share/nginx/html
#token配置
token:
#是否有状态
state: false
#是否单用户登录
single: false
#单用户登录范围
single-level: all
#token签名
#使用 @org.springblade.test.SignKeyGenerator 获取
sign-key: vaD8YIYMYcoCQi63y8X0szEGsKy8Gstj
#redis序列化方式
redis:
# serializer-type: protostuff
serializer-type: json
#接口配置
api:
#报文加密配置
crypto:
#启用报文加密配置
enabled: false
#使用AesUtil.genAesKey()生成
aes-key: O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm
#使用DesUtil.genDesKey()生成
des-key: jMVCBsFGDQr1USHo
#jackson配置
jackson:
#null自动转空值
null-to-empty: true
#大数字自动转字符串
big-num-to-string: true
#支持text文本请求,与报文加密同时开启
support-text-plain: false
#日志配置
log:
request:
#开启控制台请求日志
enabled: true
#控制台请求日志忽略
skip-url:
- /blade-desk/notice/list
- /blade-chat/weixin/**
#开启错误日志入库
error-log: true
#xss配置
xss:
enabled: true
skip-url:
- /blade-chat/weixin
- /blade-desk/notice/submit
#安全框架配置
secure:
#接口放行
skip-url:
- /blade-test/**
- /blade-business/**
- /blade-system/dict/common/**
#授权认证配置
auth:
- method: POST
pattern: /blade-desk/dashboard/upload
expression: "hasTimeAuth(9, 17)"
- method: POST
pattern: /blade-desk/dashboard/submit
expression: "hasAnyRole('administrator', 'admin', 'user')"
#动态签名认证配置
sign:
- method: ALL
pattern: /blade-desk/dashboard/sign
crypto: "sha1"
#多终端认证配置
client:
- client-id: sword
path-patterns:
- /blade-sword/**
- client-id: saber
path-patterns:
- /blade-saber/**
#多租户配置
tenant:
#多租户增强
enhance: true
#多租户授权保护
license: false
#动态数据源功能
dynamic-datasource: false
#动态数据源全局扫描
dynamic-global: false
#多租户字段名
column: tenant_id
#排除多租户逻辑
exclude-tables:
- blade_user
#第三方登陆
social:
enabled: false
domain: http://127.0.0.1:1888

@ -21,10 +21,44 @@
</encoder>
</appender>
<!-- 生成日志文件 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>target/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
</encoder>
<!-- 打印日志级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 生成日志文件 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>target/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
</encoder>
<!-- 打印日志级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<if condition='property("ELK_MODE").toUpperCase().contains("TRUE")'>
<then>
<!-- 推送日志至elk -->
<appender name="STDOUT_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<appender name="INFO_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${DESTINATION}</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
@ -53,6 +87,50 @@
<stackTrace/>
</providers>
</encoder>
<!-- 打印日志级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 推送日志至elk -->
<appender name="ERROR_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${DESTINATION}</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"traceId": "%X{traceId}",
"requestId": "%X{requestId}",
"accountId": "%X{accountId}",
"tenantId": "%X{tenantId}",
"logLevel": "%level",
"serviceName": "${springAppName:-SpringApp}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"line":"%L",
"message": "%message"
}
</pattern>
</pattern>
<mdc/>
<stackTrace/>
</providers>
</encoder>
<!-- 打印日志级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
</then>
</if>
@ -60,54 +138,14 @@
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="${STDOUT_APPENDER}"/>
<appender-ref ref="${INFO_APPENDER}"/>
<appender-ref ref="${ERROR_APPENDER}"/>
</root>
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="druid.sql" level="INFO"/>
<!-- MyBatis log configure -->
<logger name="com.apache.ibatis" level="INFO"/>
<logger name="org.mybatis.spring" level="INFO"/>
<logger name="java.sql.Connection" level="INFO"/>
<logger name="java.sql.Statement" level="INFO"/>
<logger name="java.sql.PreparedStatement" level="INFO"/>
<!-- 减少部分debug日志 -->
<logger name="druid.sql" level="INFO"/>
<logger name="org.apache.shiro" level="INFO"/>
<logger name="org.mybatis.spring" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<logger name="org.springframework.context" level="WARN"/>
<logger name="org.springframework.beans" level="WARN"/>
<logger name="com.baomidou.mybatisplus" level="INFO"/>
<logger name="org.apache.ibatis.io" level="INFO"/>
<logger name="org.apache.velocity" level="INFO"/>
<logger name="org.eclipse.jetty" level="INFO"/>
<logger name="io.undertow" level="INFO"/>
<logger name="org.xnio.nio" level="INFO"/>
<logger name="org.thymeleaf" level="INFO"/>
<logger name="springfox.documentation" level="INFO"/>
<logger name="org.hibernate.validator" level="INFO"/>
<logger name="com.netflix.loadbalancer" level="INFO"/>
<logger name="com.netflix.hystrix" level="INFO"/>
<logger name="com.netflix.zuul" level="INFO"/>
<logger name="de.codecentric" level="INFO"/>
<!-- cache INFO -->
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="org.springframework.cache" level="INFO"/>
<!-- cloud -->
<logger name="org.apache.http" level="INFO"/>
<logger name="com.netflix.discovery" level="INFO"/>
<logger name="com.netflix.eureka" level="INFO"/>
<!-- 业务日志 -->
<Logger name="org.springblade" level="INFO"/>
<Logger name="org.springblade.core.tenant" level="INFO"/>
<Logger name="org.springblade.core.version" level="INFO"/>
<!-- 减少nacos日志 -->
<logger name="com.alibaba.nacos" level="ERROR"/>
</configuration>

@ -25,7 +25,7 @@
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>target/blade/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
<FileNamePattern>target/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
@ -42,7 +42,7 @@
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>target/blade/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
<FileNamePattern>target/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>

Loading…
Cancel
Save