package com.terra.system.service.data; import com.alibaba.fastjson.JSON; import com.terra.system.entity.all.ResponseMsg; import com.terra.system.entity.all.StaticData; import com.terra.system.entity.ctrl.PubEntity; import com.terra.system.entity.ctrl.RegisterEntity; import com.terra.system.entity.data.MetaEntity; import com.terra.system.entity.data.PublishEntity; import com.terra.system.entity.sys.UserEntity; import com.terra.system.helper.PathHelper; import com.terra.system.helper.RestHelper; import com.terra.system.helper.StringHelper; import com.terra.system.helper.WebHelper; import com.terra.system.mapper.data.PublishMapper; import com.terra.system.service.sys.TokenService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 数据发布 * @author WWW */ @Service public class PublishService implements PublishMapper { @Value("${sys.exportServer}") private String exportServer; @Value("${sys.iisHost}") private String iisHost; @Resource PublishMapper publishMapper; @Resource FmeService fmeService; @Resource PathHelper pathHelper; @Resource TokenService tokenService; private final static Log log = LogFactory.getLog(PublishService.class); @Override public Integer selectCount(String name, String dircode, String type) { name = StringHelper.getLikeUpperStr(name); dircode = StringHelper.getRightLike(dircode); return publishMapper.selectCount(name, dircode, type); } @Override public List selectByPage(String name, String dircode, String type, Integer limit, Integer offset) { name = StringHelper.getLikeUpperStr(name); dircode = StringHelper.getRightLike(dircode); return publishMapper.selectByPage(name, dircode, type, limit, offset); } @Override public List selectAll() { return publishMapper.selectAll(); } @Override public PublishEntity selectById(int id) { return publishMapper.selectById(id); } @Override public List selectByIds(String ids) { return publishMapper.selectByIds(ids); } @Override public List selectCodesForDir(String dircode, Integer isDom) { return publishMapper.selectCodesForDir(dircode, isDom); } @Override public Integer insert(PublishEntity entity) { return publishMapper.insert(entity); } @Override public Integer inserts(List list) { return publishMapper.inserts(list); } @Override public Integer insertPubDown(Integer pubid, Integer downid, Integer createUser) { return publishMapper.insertPubDown(pubid, downid, createUser); } @Override public Integer delete(int id) { return publishMapper.delete(id); } @Override public Integer deletes(String ids) { return publishMapper.deletes(ids); } @Override public Integer update(PublishEntity entity) { return publishMapper.update(entity); } @Override public Integer updates(List list) { return publishMapper.updates(list); } @Override public Integer selectMetasByCount(String depcode, String dircode, Integer verid, String types, String name) { depcode = StringHelper.getRightLike(depcode); dircode = StringHelper.getRightLike(dircode); name = StringHelper.getLikeUpperStr(name); return publishMapper.selectMetasByCount(depcode, dircode, verid, types, name); } @Override public List selectMetasByPage(String depcode, String dircode, Integer verid, String types, String name, Integer limit, Integer offset) { depcode = StringHelper.getRightLike(depcode); dircode = StringHelper.getRightLike(dircode); name = StringHelper.getLikeUpperStr(name); return publishMapper.selectMetasByPage(depcode, dircode, verid, types, name, limit, offset); } public List selectLasCs(PubEntity entity, String method, HttpServletRequest req) { Map map = getMapData(entity); String str = RestHelper.postForRest(exportServer + method, map); if (StringHelper.isEmpty(str)) { return null; } ResponseMsg msg = JSON.parseObject(str, ResponseMsg.class); if (msg == null || msg.getCode() != StaticData.TWO_HUNDRED) { return null; } String rs = msg.getResult(); if (StringHelper.isEmpty(rs)) { return null; } return StringHelper.strToIntegers(rs); } /** * 发送发布请求 */ public long postForPub(PubEntity entity, String method, HttpServletRequest req) { Map map = getMapData(entity); String str = RestHelper.postForRest(exportServer + method, map); if (StringHelper.isEmpty(str)) { return 0; } ResponseMsg msg = JSON.parseObject(str, ResponseMsg.class); if (msg == null || msg.getCode() != StaticData.TWO_HUNDRED) { return 0; } if (msg.getCount() > 0) { serverRegister(msg.getResult(), req); } return msg.getCount(); } /** * 获取Map数据 */ private Map getMapData(PubEntity entity) { Map map = new HashMap<>(3); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { try { if ("serialVersionUID".equals(field.getName())) { continue; } field.setAccessible(true); Object obj = field.get(entity); map.put(field.getName(), obj); } catch (Exception ex) { // } } return map; } /** * 服务注册 */ private void serverRegister(String ids, HttpServletRequest req) { List list = selectByIds(ids); if (null == list || list.isEmpty()) { return; } for (PublishEntity entity : list) { // 避免重复注册 if (null != entity.getUpdateTime()) { continue; } String url = entity.getUrl().replace("{host}", iisHost); String type = getServerType(entity); RegisterEntity reg = fmeService.serverRegister(entity.getName(), url, type, req); if (null == reg || StringHelper.isEmpty(reg.getSerialnum())) { continue; } fmeService.serverApply(reg.getSerialnum(), entity.getId(), req); entity.setRegid(reg.getHashid()); update(entity); } } /** * 获取服务类型 */ private String getServerType(PublishEntity entity) { switch (entity.getType()) { case "DOM": return "TMS服务"; case "DEM": return "三维地形服务"; case "mpt": return "三维场景服务"; case "las": case "laz": case "cpt": return "三维点云服务"; default: return "三维模型服务"; } } /** * 删除多条 */ public Integer deletes(List idList, HttpServletRequest req) { String ids = StringHelper.join(idList, ","); deleteRes(ids, req); return deletes(ids); } /** * 删除资源 */ private void deleteRes(String ids, HttpServletRequest req) { List list = selectByIds(ids); if (null == list || list.isEmpty()) { return; } for (PublishEntity entity : list) { if (StringHelper.isEmpty(entity.getRegid())) { continue; } try { fmeService.deleteRes(entity.getRegid(), req); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } /** * 删除发布文件 */ public void deleteFiles(List list) { String lfData = pathHelper.getConfig().getLfData(); for (PublishEntity pub : list) { if (null != pub.getUrl() && pub.getUrl().contains("/SG/")) { continue; } String path = lfData + pub.getPath().replace("\\tileset.json", ""); File file = new File(path); if (!file.exists() || !file.isDirectory()) { continue; } String cmd = String.format("cmd /c rd \"%s\" /s /q", path); WebHelper.exec(cmd); } } /** * 删除发布文件 */ public void deleteFiles(List ids, HttpServletRequest req) { PubEntity entity = new PubEntity(); entity.setIds(ids); entity.setDircode("00"); UserEntity ue = tokenService.getCurrentUser(req); if (ue != null) { entity.setUserId(ue.getId()); entity.setToken(WebHelper.getToken(req)); } long rows = postForPub(entity, "/Convert/DeleteFiles"); } /** * 发送发布请求 */ public long postForPub(PubEntity entity, String method) { Map map = getMapData(entity); String str = RestHelper.postForRest(exportServer + method, map); if (StringHelper.isEmpty(str)) { return 0; } ResponseMsg msg = JSON.parseObject(str, ResponseMsg.class); if (msg == null || msg.getCode() != StaticData.TWO_HUNDRED) { return 0; } return msg.getCount(); } /** * 测试查询 */ public String selectForTest(Integer seconds) { String str = RestHelper.get(exportServer + "/TB/Wait?seconds=" + seconds); if (StringHelper.isEmpty(str)) { return null; } ResponseMsg msg = JSON.parseObject(str, ResponseMsg.class); if (msg == null || msg.getCode() != StaticData.TWO_HUNDRED) { return null; } return msg.getResult(); } }