package com.qianwen.smartman.modules.cps.service.impl;
|
|
import java.io.File;
|
import java.io.FileReader;
|
import java.sql.Connection;
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.List;
|
import java.util.concurrent.Future;
|
import java.util.concurrent.TimeUnit;
|
import java.util.stream.Collectors;
|
|
import javax.sql.DataSource;
|
|
import org.apache.commons.io.FileUtils;
|
import org.apache.ibatis.jdbc.ScriptRunner;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.smartboot.license.client.License;
|
import org.smartboot.license.client.LicenseEntity;
|
import org.smartboot.license.client.LicenseException;
|
import org.springframework.core.env.Environment;
|
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.data.redis.connection.RedisConnection;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.aliyuncs.utils.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.qianwen.core.log.exception.ServiceException;
|
import com.qianwen.core.redis.cache.BladeRedis;
|
import com.qianwen.core.tool.api.ResultCode;
|
import com.qianwen.core.tool.utils.DigestUtil;
|
import com.qianwen.core.tool.utils.Func;
|
import com.qianwen.smartman.common.constant.CommonConstant;
|
import com.qianwen.smartman.common.constant.FmsConstant;
|
import com.qianwen.smartman.common.utils.LicenseUtil;
|
import com.qianwen.smartman.common.utils.MessageUtils;
|
import com.qianwen.smartman.modules.cps.enums.AppEnum;
|
import com.qianwen.smartman.modules.cps.mapper.InitMapper;
|
import com.qianwen.smartman.modules.cps.mapper.TdengineMapper;
|
import com.qianwen.smartman.modules.cps.service.IInitBusinessService;
|
import com.qianwen.smartman.modules.cps.service.IInitService;
|
import com.qianwen.smartman.modules.cps.utils.FileUtil;
|
import com.qianwen.smartman.modules.cps.vo.AppVO;
|
import com.qianwen.smartman.modules.cps.vo.ConfigVO;
|
import com.qianwen.smartman.modules.cps.vo.InitSettingVO;
|
import com.qianwen.smartman.modules.system.dto.LicenseDetailDTO;
|
import com.qianwen.smartman.modules.system.entity.Application;
|
import com.qianwen.smartman.modules.system.service.IApplicationService;
|
import com.qianwen.smartman.modules.visual.entity.VisualConfig;
|
import com.qianwen.smartman.modules.visual.service.IVisualConfigService;
|
|
import cn.hutool.core.io.IoUtil;
|
|
@Service
|
public class InitServiceImpl implements IInitService {
|
private static final Logger log = LoggerFactory.getLogger(InitServiceImpl.class);
|
private final InitMapper initMapper;
|
private final ConfigVO configVO;
|
private final TdengineMapper tdengineMapper;
|
private final DataSource dataSource;
|
private final IInitBusinessService initBusinessService;
|
private final BladeRedis bladeRedis;
|
private final IVisualConfigService visualConfigService;
|
private final IApplicationService applicationService;
|
private final ThreadPoolTaskExecutor taskExecutor;
|
private final Environment environment;
|
|
|
public InitServiceImpl(final InitMapper initMapper, final ConfigVO configVO, final TdengineMapper tdengineMapper, final DataSource dataSource, final IInitBusinessService initBusinessService, final BladeRedis bladeRedis, final IVisualConfigService visualConfigService, final IApplicationService applicationService, final ThreadPoolTaskExecutor taskExecutor, final Environment environment) {
|
this.initMapper = initMapper;
|
this.configVO = configVO;
|
this.tdengineMapper = tdengineMapper;
|
this.dataSource = dataSource;
|
this.initBusinessService = initBusinessService;
|
this.bladeRedis = bladeRedis;
|
this.visualConfigService = visualConfigService;
|
this.applicationService = applicationService;
|
this.taskExecutor = taskExecutor;
|
this.environment = environment;
|
}
|
|
@Override
|
public Boolean checkIsNeedInit() {
|
return this.initMapper.checkIsNeedInit(this.configVO.getDatabase(), this.configVO.getType()) <= 0;
|
}
|
|
@Override
|
public ConfigVO getConfig() {
|
return this.configVO;
|
}
|
|
@Override
|
public List<AppVO> getApp() {
|
List<AppVO> result = new ArrayList<>();
|
AppEnum[] values = AppEnum.values();
|
LicenseDetailDTO detailDTO = licenseDetail();
|
if (detailDTO == null) {
|
return result;
|
}
|
List<Integer> modules = detailDTO.getModules();
|
for (AppEnum value : values) {
|
if (modules.contains(value.getCode())) {
|
result.add(AppVO.builder().code(value.getCode()).desc(value.getDesc()).build());
|
}
|
}
|
return result;
|
}
|
|
@Override
|
@Transactional(rollbackFor = {Exception.class})
|
public Boolean initSystem(InitSettingVO initSettingVO) {
|
try {
|
if (!initSettingVO.getPassword().equals(initSettingVO.getConfirmPassword())) {
|
throw new ServiceException(MessageUtils.message("init.system.inconsistent.password", new Object[0]));
|
}
|
initSettingVO.setPassword(DigestUtil.encrypt(initSettingVO.getPassword()));
|
Connection conn = this.dataSource.getConnection();
|
ScriptRunner runner = new ScriptRunner(conn);
|
runner.setStopOnError(true);
|
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "common.sql");
|
FileUtils.copyToFile(new ClassPathResource("sql" + File.separator + this.configVO.getType() + File.separator + "common.sql").getInputStream(), file);
|
runner.runScript(new FileReader(file));
|
FileUtils.copyToFile(new ClassPathResource("sql" + File.separator + this.configVO.getType() + File.separator + "xxl_job.sql").getInputStream(), file);
|
runner.runScript(new FileReader(file));
|
List<Integer> appIds = initSettingVO.getAppList().stream().sorted().collect(Collectors.toList());
|
for (Integer appId : appIds) {
|
Future<?> asyncResult = this.taskExecutor.submit(() -> {
|
try {
|
this.initBusinessService.initApp(appId, this.configVO);
|
} catch (Exception e) {
|
throw new ServiceException(e.getMessage());
|
}
|
});
|
while (!asyncResult.isDone()) {
|
TimeUnit.NANOSECONDS.sleep(2L);
|
}
|
}
|
initAdapter(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
replaceJumuUrl();
|
this.initMapper.replaceUrlJiMu(initSettingVO);
|
if (CommonConstant.ORACLE.equals(this.configVO.getType()) && Func.isNotEmpty(initSettingVO.getAppList()) && initSettingVO.getAppList().contains(AppEnum.VISUAL.getCode())) {
|
try {
|
VisualConfig visualConfig = new VisualConfig();
|
visualConfig.setId(1510135236368261122L);
|
visualConfig.setVisualId(1510135236343095298L);
|
visualConfig.setDetail(FileUtil.getFileString(new ClassPathResource("constant" + File.separator + "VisualDetail.txt")));
|
visualConfig.setComponent(FileUtil.getFileString(new ClassPathResource("constant" + File.separator + "VisualComponent.txt")));
|
this.visualConfigService.save(visualConfig);
|
} catch (Exception e) {
|
throw new ServiceException(e.getMessage());
|
}
|
}
|
IoUtil.close(conn);
|
return true;
|
}catch(Exception ex) {
|
log.error("初始化系统失败",ex);
|
throw new ServiceException(ResultCode.FAILURE,ex);
|
}
|
}
|
|
@Override
|
public Boolean init(InitSettingVO initSettingVO) {
|
if (!checkIsNeedInit()) {
|
throw new ServiceException(MessageUtils.message("system.has.been.initialized", new Object[0]));
|
}
|
RedisConnection redisConnection = this.bladeRedis.getRedisTemplate().getRequiredConnectionFactory().getConnection();
|
redisConnection.flushAll();
|
redisConnection.close();
|
initSystem(initSettingVO);
|
this.tdengineMapper.dropTdengine();
|
this.tdengineMapper.initTdengine();
|
this.tdengineMapper.initTdengineSuperState();
|
this.tdengineMapper.initTdengineSuperJsonCollect();
|
this.tdengineMapper.initTdengineSuperAlarm();
|
this.tdengineMapper.initTdengineSuperOutput();
|
this.tdengineMapper.initTdengineSuperAggregateaOutput();
|
this.tdengineMapper.initTdengineSuperAggregateaState();
|
this.tdengineMapper.initTdengineSuperCollectData();
|
this.tdengineMapper.initTdengineDmpLogSignal();
|
this.tdengineMapper.initTdengineDmpLogSignalFlow();
|
this.tdengineMapper.initTdengineDmpLogMethodTime();
|
this.tdengineMapper.initTdengineSuperAggregateStateWithFeedback();
|
this.tdengineMapper.initTdengineCountPulseData();
|
LicenseUtil.setEncryptCode("000000", LicenseUtil.getLicenseMap().get("000000"));
|
if (Func.isNotEmpty(initSettingVO.getApplicationList())) {
|
Collection<? extends String> applicationCodes = initSettingVO.getApplicationList().keySet();
|
List<String> list = new ArrayList<>();
|
list.addAll(applicationCodes);
|
list.add("HMI");
|
|
this.applicationService.remove(Wrappers.<Application>lambdaQuery().notIn(Application::getCode, list));
|
/*
|
this.applicationService.remove((Wrapper) Wrappers.lambdaQuery().notIn((v0) -> {
|
return v0.getCode();
|
}, list));
|
Application::getDomainUrl
|
*/
|
initSettingVO.getApplicationList().forEach((k, v) -> {
|
this.applicationService.update(Wrappers.<Application>lambdaUpdate().set(Application::getDomainUrl, v).eq(Application::getCode, k));
|
});
|
}
|
System.setProperty("blade.system.need_init", FmsConstant.MANUAL);
|
return true;
|
}
|
|
@Override
|
public LicenseDetailDTO licenseDetail() {
|
try {
|
Boolean needInit = checkIsNeedInit();
|
String text = needInit ? LicenseUtil.getLicenseMap().get("000000") : LicenseUtil.getEncryptCode("000000");
|
if (StringUtils.isEmpty(text)) {
|
return null;
|
}
|
LicenseEntity licenseEntity = new License().loadLicense(text);
|
return JSONObject.parseObject(new String(licenseEntity.getData()), LicenseDetailDTO.class);
|
} catch (LicenseException e) {
|
log.error("加载licenseDetail错误",e);
|
return null;
|
}
|
}
|
|
private void initAdapter(InitSettingVO initSettingVO, String url, String type) {
|
if (Func.equals(CommonConstant.ORACLE, getConfig().getType())) {
|
this.initMapper.initBladeUser(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeOss(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeDept(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeTenant(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeCommonGroup(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeMenuVision(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeMenuVision2(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeMenuTask(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
this.initMapper.initBladeParam(initSettingVO, this.configVO.getUrl(), this.configVO.getType());
|
return;
|
}
|
this.initMapper.init(initSettingVO, url, type);
|
}
|
|
private void replaceJumuUrl() {
|
this.initMapper.initBladeReport("http://127.0.0.1:" + this.environment.getProperty("local.server.port"));
|
}
|
}
|