From 2af0c7beaeb52dd2f1f1f32ee187ef7851ce7f01 Mon Sep 17 00:00:00 2001 From: liyawei Date: Fri, 1 Apr 2022 09:08:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=8B=86=E5=88=86=E6=9D=A1?= =?UTF-8?q?=E6=AC=BE-=E5=AF=BC=E5=85=A5=E6=8B=86=E5=88=86=E7=BB=93?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/opensso/URLRequestResultUtil.java | 56 -- .../controller/SSOLoginController.java | 34 +- .../FileSplitItemsEOController.java | 4 +- .../service/IFileSplitItemsEOService.java | 4 +- .../impl/FileSplitItemsEOServiceImpl.java | 481 ++++++++++++++++-- .../impl/SarFileSplitInfoServiceImpl.java | 3 + .../impl/SarFileSplitMenuEOServiceImpl.java | 80 +-- .../src/main/resources/application-dev.yml | 20 +- 8 files changed, 509 insertions(+), 173 deletions(-) delete mode 100644 jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/URLRequestResultUtil.java diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/URLRequestResultUtil.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/URLRequestResultUtil.java deleted file mode 100644 index 30935001a..000000000 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/URLRequestResultUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jero.modules.opensso; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -/** - * @Description - * @Author liyawei - * @Create 2021/8/17 - */ -public class URLRequestResultUtil { - public static String getProxyRequestResult(String url) { - StringBuffer requestResult = new StringBuffer(); - BufferedReader in = null; - - try { - System.out.println(url); - URL realUrl = new URL(url); - // 打开和URL之间的连接 - URLConnection connection = realUrl.openConnection(); - // 设置通用的请求属性 - connection.setRequestProperty("accept", "*/*"); - connection.setRequestProperty("connection", "Keep-Alive"); - connection.setRequestProperty("user-agent", - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); - // 建立实际的连接 - connection.connect(); - // 定义 BufferedReader输入流来读取URL的响应 - in = new BufferedReader(new InputStreamReader( - connection.getInputStream(), "utf-8")); - String line; - while ((line = in.readLine()) != null) { - requestResult.append(line); - } - } - // 使用finally块来关闭输入流 - catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (Exception e2) { - e2.printStackTrace(); - } - } - return requestResult.toString(); - } -} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/controller/SSOLoginController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/controller/SSOLoginController.java index 5dd4b3156..828401057 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/controller/SSOLoginController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/opensso/controller/SSOLoginController.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jero.common.api.vo.Result; import com.jero.common.aspect.annotation.AutoLog; import com.jero.common.constant.CommonConstant; -import com.jero.common.system.api.ISysBaseAPI; import com.jero.common.system.util.JwtUtil; import com.jero.common.system.vo.LoginUser; import com.jero.common.util.RedisUtil; @@ -16,9 +15,7 @@ import com.jero.modules.system.entity.SysDepart; import com.jero.modules.system.entity.SysUser; import com.jero.modules.system.service.ISysDepartService; import com.jero.modules.system.service.ISysDictService; -import com.jero.modules.system.service.ISysLogService; import com.jero.modules.system.service.ISysUserService; -import com.jero.modules.system.util.HttpRequestUtil; import com.jero.modules.system.util.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,7 +27,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -53,10 +49,6 @@ public class SSOLoginController { @Autowired private ISysUserService sysUserService; @Autowired - private ISysBaseAPI sysBaseAPI; - @Autowired - private ISysLogService logService; - @Autowired private RedisUtil redisUtil; @Autowired private ISysDepartService sysDepartService; @@ -64,8 +56,6 @@ public class SSOLoginController { private ISysDictService sysDictService; @Resource private BaseCommonService baseCommonService; - @Autowired - private RestTemplate restTemplate; private static final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890"; //密码登录错误的次数前缀 @@ -73,10 +63,14 @@ public class SSOLoginController { //密码登录错误的最大限制次数 public static final int RETRY_LOGIN_MAX_COUNT = 5; - private String accessTokenUrl = "https://signin-test.nio.com/oauth2/accessToken"; - private String profileUrl = "https://signin-test.nio.com/oauth2/profile"; - private String clientId = "100679"; - private String clientSecret = "CDf2D9404C6ac1B0f7c3e3845ae0282a"; + @Value("${opensso.accessTokenUrl}") + private String accessTokenUrl; + @Value("${opensso.profileUrl}") + private String profileUrl; + @Value("${opensso.clientId}") + private String clientId; + @Value("${opensso.clientSecret}") + private String clientSecret; @Value("${opensso.redirectUri}") private String redirectUri; @@ -94,7 +88,9 @@ public class SSOLoginController { } } //https://signin-test.nio.com/oauth2/authorize?client_id=100679&redirect_uri=http%3A%2F%2F139.9.235.66%3A8008%2Fjero-boot%2Fopensso%2Fcallback&response_type=code + //https://signin-test.nio.com/oauth2/authorize?client_id=100679&redirect_uri=http%3A%2F%2F139.9.235.66%3A8010&response_type=code + //http://139.9.235.66:8010 @AutoLog(value = "单点登录回调") @ApiOperation(value = "单点登录回调", notes = "单点登录回调") @GetMapping(value = "/callback") @@ -107,8 +103,8 @@ public class SSOLoginController { log.info("access_token_url:" + getAccessTokenUrl); Map headerMapToken = new HashMap<>(); headerMapToken.put("Content-Type", "text/html;charset=utf-8"); - String accessTokenResult = HttpRequestUtil.getResponseOfGET(getAccessTokenUrl, headerMapToken); -// String accessTokenResult = URLRequestResultUtil.getProxyRequestResult(getAccessTokenUrl); +// String accessTokenResult = HttpRequestUtil.getResponseOfGET(getAccessTokenUrl, headerMapToken); + String accessTokenResult = "access_token=2.0N6OFCARTH7MRCVPSENQONSA67WGHV4FDR25TSHFCCXI6FA3NRVAA----&expires=602405"; log.info("获取access_token返回结果:" + accessTokenResult); // 返回结果:access_token=2.0N6OFCARTH7MRCVPSENQONSA67WGHV4FDR25TSHFCCXI6FA3NRVAA----&expires=602405 if(StringUtils.isEmpty(accessTokenResult) || !accessTokenResult.contains("access_token")){ @@ -124,10 +120,10 @@ public class SSOLoginController { log.info("profile_url:" + getProfileUrl); Map headerMapProfile = new HashMap<>(); headerMapProfile.put("Content-Type", "application/json; charset=utf-8"); - String profileResult = HttpRequestUtil.getResponseOfGET(getProfileUrl, headerMapProfile); -// String profileResult = URLRequestResultUtil.getProxyRequestResult(getProfileUrl); +// String profileResult = HttpRequestUtil.getResponseOfGET(getProfileUrl, headerMapProfile); + String profileResult = "{ id: \"chengjun.wang.o\", attributes: [{workNo: \"\"},{account_id: \"\"},{user_name: \"chengjun.wang.o\"},{email: \"chengjun.wang.o@nio.com\"}]}"; log.info("获取profile返回结果:" + profileResult); - // 返回结果:{ id: "xuetao.li3.o", attributes: [{workNo: "CW19057"},{account_id: ""},{user_name: "xuetao.li3.o"},{email: "xuetao.li3.o@nio.com"}]} + // 返回结果:{ id: "chengjun.wang.o", attributes: [{workNo: ""},{account_id: ""},{user_name: "chengjun.wang.o"},{email: "chengjun.wang.o@nio.com"}]} JSONObject userThirdIdJson = JSONObject.parseObject(profileResult); if(ObjectUtil.isEmpty(userThirdIdJson) || !userThirdIdJson.containsKey("id")){ return Result.error("【单点登录】获取用户profile失败"); diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java index f2b88c137..5eb6db3ad 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java @@ -191,10 +191,10 @@ public class FileSplitItemsEOController extends JeroController importSplitResult( MultipartFile file, + public Result importSplitResult( String splitFileId, String cut, SarFileSplitInfoEO splitInfoEO) throws IOException { - return fileSplitItemsEOService.importSplitResult(file,cut,splitInfoEO); + return fileSplitItemsEOService.importSplitResult(splitFileId, cut,splitInfoEO); } @AutoLog(value = "文档拆分条款信息-导入") diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/IFileSplitItemsEOService.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/IFileSplitItemsEOService.java index 1ab3ccfd7..6e88497dc 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/IFileSplitItemsEOService.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/IFileSplitItemsEOService.java @@ -45,11 +45,11 @@ public interface IFileSplitItemsEOService extends IService int batchSet(Map parameter); - Result importSplitItemsData(List> list, String menuId, String filepath, String infoId, List getSheetTableList); + Result importSplitItemsData(List> list, String menuId, String filepath, String infoId, String cut, List getSheetTableList); Result importSplitItems(MultipartFile file, String cut, String menuId, String infoId) throws IOException; - Result importSplitResult(MultipartFile file, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException; + Result importSplitResult(String splitFileId, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException; void exportTemplate(String cut, HttpServletResponse response, HttpServletRequest request); diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java index 39a299d89..85b0f142d 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java @@ -11,14 +11,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.api.vo.Result; import com.jero.common.constant.enums.CutEnum; +import com.jero.common.constant.enums.IsMustEnum; import com.jero.common.constant.enums.ModuleEnum; import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.DateUtils; import com.jero.generater.modules.online.cgform.entity.OnlCgformField; import com.jero.generater.modules.online.cgform.service.impl.OnlCgformFieldServiceImpl; import com.jero.modules.document.enums.FieldTypeEnum; -import com.jero.modules.lanswitch.service.ILanguageSwitchService; import com.jero.modules.ocr.util.UUIDUtils; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; @@ -50,6 +51,7 @@ import com.jero.modules.system.util.UserUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; @@ -61,10 +63,11 @@ import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.jetbrains.annotations.NotNull; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -87,6 +90,7 @@ import static com.jero.modules.split.util.ExcelUtil.checkObjAllFieldsIsNull; * @Date: Created in 14:59 2022/3/24 */ @Service +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public class FileSplitItemsEOServiceImpl extends ServiceImpl implements IFileSplitItemsEOService { @Autowired private FileSplitItemsEOMapper dao; @@ -112,6 +116,8 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl parameter){ @@ -673,11 +679,21 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl importSplitItemsData(List> list, String menuId, String filepath, String infoId, List getSheetTableList) { + public Result importSplitItemsData(List> list, + String menuId, String filepath, + String infoId, + String cut, + List getSheetTableList) { //此处需要做各种验证,数据库操作 try { + //树形数据字典 + List categoryList = sysCategoryService.list(); + //普通数据字典 + List dictItemList = sysDictItemServiceImpl.selectItemsAll(); + // 表头 + List> fieldList = getImportOnlField(ModuleEnum.FILE_SPLIT_ITEMS.getValue(),cut); //验证导入数据是否符合规则 - Map map = validateImportDatas(list,filepath); + Map map = validateImportDatas(list,categoryList,dictItemList,fieldList,filepath,cut); boolean isOk = (boolean) map.get("result"); if (!isOk) { //验证没有通过 @@ -703,7 +719,7 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl oldItems = addItemsEOList.get(addItemsEOList.size()-1); if (itemNum > 0 && importDto.get("items_num").equals(oldItems.get("items_num")) && importDto.get("items_name").equals(oldItems.get("items_name"))) { - addItemValList = (List) oldItems.get("itemValEOList"); // TODO + addItemValList = (List) oldItems.get("itemValEOList"); String itemContent = oldItems.get("iterms_conditions").toString() + importDto.get("iterms_conditions").toString(); oldItems.put("iterms_conditions", itemContent); String[] valArr = importDto.get("iterms_conditions").toString().split("\n"); @@ -722,13 +738,23 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); if (nowfilelist != null && !nowfilelist.isEmpty()) { - OSSFile oSSFile = ossFileService.uploadLocal((MultipartFile) nowfilelist.get(0), "","1"); // TODO MultipartFile强转不知道会不会成功 + String url = nowfilelist.get(0).getPath(); + MultipartFile multipartFile = createMfileByPath(url); + String state = "0"; + String fileSuffix = url.substring(url.lastIndexOf(".")); + String fileTypeStr = ".doc,.DOC,.docx,.DOCX,.xls, .XLS,.xlsx,.XLSX,.pdf,.PDF"; + if (fileTypeStr.contains(fileSuffix)) { + state = "1"; + } + OSSFile oSSFile = ossFileService.uploadLocal(multipartFile, "",state); if(oSSFile!=null){ + oSSFile = ossFileService.getById(oSSFile.getId()); isText = false; - String path = "uploadPath/" + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")+1); - String imgCon = ""; + String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")); + String imgCon = ""; valEO.setType("IMG"); - valEO.setItemContent(imgCon); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); } } if (isText) { @@ -756,13 +782,23 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); if (nowfilelist != null && !nowfilelist.isEmpty()) { - OSSFile oSSFile = ossFileService.uploadLocal((MultipartFile) nowfilelist.get(0), "","1"); // TODO MultipartFile强转不知道会不会成功 + String url = nowfilelist.get(0).getPath(); + MultipartFile multipartFile = createMfileByPath(url); + String state = "0"; + String fileSuffix = url.substring(url.lastIndexOf(".")); + String fileTypeStr = ".doc,.DOC,.docx,.DOCX,.xls, .XLS,.xlsx,.XLSX,.pdf,.PDF"; + if (fileTypeStr.contains(fileSuffix)) { + state = "1"; + } + OSSFile oSSFile = ossFileService.uploadLocal(multipartFile, "",state); if(oSSFile!=null){ + oSSFile = ossFileService.getById(oSSFile.getId()); isText = false; - String path = "uploadPath/" + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")+1); - String imgCon = ""; + String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")); + String imgCon = ""; valEO.setType("IMG"); - valEO.setItemContent(imgCon); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); } } if (isText) { @@ -792,13 +828,14 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); if (nowfilelist != null && !nowfilelist.isEmpty()) { - OSSFile oSSFile = ossFileService.uploadLocal((MultipartFile) nowfilelist.get(0), "","1"); // TODO MultipartFile强转不知道会不会成功 + OSSFile oSSFile = ossFileService.uploadLocal((MultipartFile) nowfilelist.get(0), "","1"); if(oSSFile!=null){ isText = false; - String path = "uploadPath/" + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")+1); - String imgCon = ""; + String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf("/")); + String imgCon = ""; valEO.setType("IMG"); - valEO.setItemContent(imgCon); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); } } if (isText) { @@ -983,6 +1020,7 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl message = importSplitItemsData(datasUpdate,menuId,unzipfilepath,infoId,getSheetTableList); + Result message = importSplitItemsData(datasUpdate,menuId,unzipfilepath,infoId,cut,getSheetTableList); //删除原上传文件 FileUnZip.deleteDir(saveDirectory); return message; @@ -1033,7 +1071,10 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl importSplitResult(MultipartFile file, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException { + public Result importSplitResult(String splitFileId, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException { + OSSFile ossFile = ossFileService.getById(splitFileId); + String url = ossFile.getUrl(); + MultipartFile mFile = createMfileByPath(url); // 新增拆分记录 Date now = new Date(); String infoId = UUID.randomUUID().toString().replace("-", ""); @@ -1054,9 +1095,26 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl> read(File file, List dbfieldList) { try { //最终返回数据 @@ -1173,45 +1231,334 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl> datas, String filepath) throws Exception { + private Map validateImportDatas(List> datas, + List categoryList, + List dictItemList, + List> fieldList, + String filepath, + String cut) throws Exception { + //树形数据字典 + List treeNameList = new ArrayList<>(); + //普通数据字典 + List itemNameList = new ArrayList<>(); + if (CutEnum.CN.getValue().equals(cut)) { + treeNameList = categoryList.stream().map(SysCategory::getName).collect(Collectors.toList()); + itemNameList = dictItemList.stream().map(SysDictItem::getItemText).collect(Collectors.toList()); + } else if(CutEnum.EN.getValue().equals(cut)){ + treeNameList = categoryList.stream().map(SysCategory::getEnName).collect(Collectors.toList()); + itemNameList = dictItemList.stream().map(SysDictItem::getEnName).collect(Collectors.toList()); + } + //存放数据验证结果信息 List stringMessage = new ArrayList<>(); - int i = 1; //记录行号 + int i = 2; //记录行号 int num = 0; //记录是第几条数据 //循环验证数据 for (Map dto : datas) { i++; int countError = 0; //记录失败数据数量 String errorMsg = "第" + i + "行:"; - if (num > 0 && org.apache.commons.lang.StringUtils.isEmpty(dto.get("items_num").toString()) - && org.apache.commons.lang.StringUtils.isEmpty(dto.get("items_name").toString())) { - String nowItemContent = dto.get("iterms_conditions").toString(); - BeanUtils.copyProperties(datas.get(num-1), dto); - dto.put("iterms_conditions", nowItemContent); - } - if (org.apache.commons.lang.StringUtils.isEmpty(dto.get("items_num").toString())) { - errorMsg += "条款号不能为空;"; - countError++; - } else { - if (dto.get("items_num").toString().length()>100) { - errorMsg += "条款号不能超过100个字符;"; - countError++; - } - } - if (org.apache.commons.lang.StringUtils.isEmpty(dto.get("items_name").toString())) { - errorMsg += "条款名称不能为空;"; - countError++; - } else { - if (dto.get("items_name").toString().length()>100) { - errorMsg += "条款名称不能超过100个字符;"; - countError++; - } - } + //判断发布日期,新车型实施日期,在产车实施日期 +// try { +// String issueTime = (String) stringStringMap.get("issue_time"); +// if(StringUtils.isNotBlank(issueTime)){ +// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); +// Date issueTimeDate = df.parse(issueTime); +// String implementTime = (String) stringStringMap.get("implement_time");//在产车实施日期 +// String newCarimplementTime = (String) stringStringMap.get("xin1_che1_xing2_ren4_zheng4_shi2_jian1");//新车型实施日期 +// if(StringUtils.isNotBlank(implementTime)){ +// Date implementTimeDate = df.parse(implementTime); +// if (issueTimeDate.after(implementTimeDate)) { +// errorMsg += "发布日期不能大于在产车实施日期"; +// countError++; +// } +// } +// if(StringUtils.isNotBlank(newCarimplementTime)){ +// Date newCarimplementTimeDate = df.parse(newCarimplementTime); +// if (issueTimeDate.after(newCarimplementTimeDate)) { +// errorMsg += "发布日期不能大于新车型实施日期"; +// countError++; +// } +// } +// } +// } catch (Exception e) { +// log.error("文档库导入失败导入"); +// } + for (Map.Entry entry : dto.entrySet()) { + + String key = entry.getKey(); + if (key.contains("*")) { + key = key.replace("*", ""); + } + String value = entry.getValue().toString(); + String field = ""; + for (Map map : fieldList) { + String fieldName = (String) map.get("db_field_txt");//中文名称 + String dbfieldName = (String) map.get("db_field_name");//字段名 + String mustInput = (String) map.get("field_must_input");//是否必填 + String dbLength = map.get("db_length").toString();//字段长度 + String fieldShowType = (String) map.get("field_show_type");//字段类型 + + if (key.equals(dbfieldName)) { + field = dbfieldName; + //验证字段是否必填,长度,下拉框和树形的值是否匹配 + if (FieldTypeEnum.TREE.getValue().equals(fieldShowType)) { + //树形 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符"; + countError++; + } + //判断数据是否匹配 + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (!treeNameList.contains(valueTemp)) { + errorMsg += fieldName + "中的" + valueTemp + "与数据字典不匹配"; + countError++; + } + } + } + String valueId = ""; + //文字转ID + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (treeNameList.contains(valueTemp)) { + // TODO 树形结构导入格式 a/b/c 需特殊处理 + List collect = new ArrayList<>(); + if(CutEnum.CN.getValue().equals(cut)) { + collect = categoryList.stream().filter(e -> e.getName().equals(valueTemp)).collect(Collectors.toList()); + } else if(CutEnum.EN.getValue().equals(cut)) { + collect = categoryList.stream().filter(e -> e.getEnName().equals(valueTemp)).collect(Collectors.toList()); + } + if (collect.size() != 0) { + valueId += collect.get(0).getId(); + } + } + } + value = valueId; + } + + } else if (FieldTypeEnum.TEXT_STRING.getValue().equals(fieldShowType)) { + //输入框 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符"; + countError++; + } + + } else if (FieldTypeEnum.TEXT_NUMBER.getValue().equals(fieldShowType)) { + //正则判断仅能为 负号(-),小数点(.)和数字 + + + } else if (FieldTypeEnum.PULL_SINGLE.getValue().equals(fieldShowType)) { + //下拉单选 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符"; + countError++; + } + //判断是否是单选 + if (StringUtils.isNotBlank(value) && value.contains(",")) { + errorMsg += fieldName + "为单选项"; + countError++; + } + //判断数据是否匹配 + if (StringUtils.isNotBlank(value)) { + if (!itemNameList.contains(value)) { + errorMsg += fieldName + "中的" + value + "与数据字典不匹配"; + countError++; + } + } + //文字转数据字典编码 + if (itemNameList.contains(value)) { + String finalValue = value; + List collect = new ArrayList<>(); + if(CutEnum.CN.getValue().equals(cut)) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getItemText()) && e.getItemText().equals(finalValue)).collect(Collectors.toList()); + } else if(CutEnum.EN.getValue().equals(cut)) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getEnName()) && e.getEnName().equals(finalValue)).collect(Collectors.toList()); + } + if (collect.size() != 0) { + value = collect.get(0).getItemValue(); + } + } + } else if (FieldTypeEnum.PULL_MORE.getValue().equals(fieldShowType)) { + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符"; + countError++; + } + //下拉多选 + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (!itemNameList.contains(valueTemp)) { + errorMsg += fieldName + "中的" + valueTemp + "与数据字典不匹配"; + countError++; + } + } + } + + String valueId = ""; + //文字转数据字典id + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (itemNameList.contains(valueTemp)) { + List collect = new ArrayList<>(); + if(CutEnum.CN.getValue().equals(cut)) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getItemText()) && e.getItemText().equals(valueTemp)).collect(Collectors.toList()); + } else if(CutEnum.EN.getValue().equals(cut)) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getEnName()) && e.getEnName().equals(valueTemp)).collect(Collectors.toList()); + } + valueId += collect.get(0).getItemValue() + ","; + } + } + if (StringUtils.isNotBlank(valueId)) { + value = valueId.substring(0, valueId.length() - 1); + } + } + } else if (FieldTypeEnum.DATE_SINGLE.getValue().equals(fieldShowType)) { + //单选日期 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //a判断是否是单日期选择 + if (StringUtils.isNotBlank(value) && value.contains(",")) { + errorMsg += fieldName + "为单日期选项"; + countError++; + } + //判断格式是否正确 + if (!DateUtils.isValidDate((String) value)) { + errorMsg += fieldName + "格式不正确,正确格式如:yyyy/m/d、yyyy-MM-dd、yyyy年MM月dd日"; + countError++; + } + + } else if (FieldTypeEnum.DATE_SINGLE.getValue().equals(fieldShowType)) { + //多选日期 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断格式是否正确 + if (!DateUtils.isValidDate((String) value)) { + errorMsg += fieldName + "格式不正确,正确格式如:yyyy/m/d、yyyy-MM-dd、yyyy年MM月dd日"; + countError++; + } + + + } else if (FieldTypeEnum.FILE.getValue().equals(fieldShowType)) { + //文件 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += fieldName + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符"; + countError++; + } + if (StringUtils.isNotBlank(value)) { + StringBuilder sb = new StringBuilder(); + value = value.replace(",",","); + for (String fileName : value.split(",")) { + List nowFileList = FileUnZip.readFileByFilename(filepath, fileName); + if (nowFileList.size() == 0) { + errorMsg += fieldName + "压缩包中没有" + fileName + "文件; "; + countError++; + } else { + try { + FileInputStream input = new FileInputStream(nowFileList.get(0)); + MultipartFile multipartFile = + new MockMultipartFile(nowFileList.get(0).getName(), nowFileList.get(0).getName(), "text/plain", input); + //文件存入文件表 + OSSFile ossFile = ossFileService.uploadLocal(multipartFile, "", null); + if (ObjectUtils.isNotEmpty(ossFile)) { + sb.append(ossFile.getId() + ","); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + if (StringUtils.isNotBlank(sb)) { + String substring = sb.substring(0, sb.length() - 1); + value = substring; + } + } + + } /*else if (FieldTypeEnum.STANDARD.getValue().equals(fieldShowType)) { + //标准选择 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + errorMsg += key + "为必填项,不能为空"; + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + errorMsg += key + "不能超过" + dbLength + "个字符"; + countError++; + } + //判断库中是否存在,如果存在则存id,如果不存在则存输入的值 + List> listBySerialNumber = getListBySerialNumber(value); + String serialNumberStr = ""; + StringBuilder sb = new StringBuilder(); + List list = new ArrayList<>(); + for (Map stringObjectMap : listBySerialNumber) { + sb.append((String) stringObjectMap.get("id") + ","); + list.add((String) stringObjectMap.get("serial_number")); + } + if (StringUtils.isNotBlank(value)) { + for (String s : value.split(",")) { + if (!list.contains(s)) { + sb.append(s); + } + } + } + if (ObjectUtils.isNotEmpty(sb)) { + String substring = sb.toString(); + if (substring.endsWith(",") || substring.endsWith(",")){ + substring = substring.substring(0, substring.length() - 1); + } + value = substring; + } + }*/ + } + } + if((dto.get(key)== null && value != null) || (dto.get(key)!= null && !dto.get(key).toString().equals(value))){ + dto.put(key, value); // 覆盖原来的值 + } + } if (countError > 0) { stringMessage.add(errorMsg); } - num++; } Map map = new HashMap(); if (stringMessage.isEmpty()) { @@ -1711,6 +2058,46 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl> getImportOnlField(String flag, String cut) { + List fieldList = onlCgformFieldService.getFieldList(flag); + if (fieldList.size() != 0) { + //过滤出搜索条件() + fieldList = fieldList.stream() + .filter(e -> YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) + || "条款内容".equals(e.getDbFieldName())) + .collect(Collectors.toList()); + } + //树形数据字典 + List sysCategoryTree = sysCategoryService.getSysCategoryTreeByCut(cut); // 查询所有 并以树结构返回 + + List> list = new ArrayList<>(); + for (OnlCgformField onlCgformField : fieldList) { + Map map = new HashMap<>(); + if (FieldTypeEnum.TREE.getValue().equals(onlCgformField.getFieldShowType())) { + List sysCategoryTreeVOList = sysCategoryTree.stream() + .filter(e -> onlCgformField.getDictId().equals(e.getDictId())) + .collect(Collectors.toList()); + map.put("tree", sysCategoryTreeVOList); // 树形结构字段 设置树形结构字段值 + } else { + map.put("tree", new ArrayList<>()); // 其他类型字段 该key为空 + } + + map.put("area", null);//展示区域。没用到 + map.put("field_show_type", onlCgformField.getFieldShowType());//类型(判断是下拉还是输入框,等等) + map.put("field_must_input", onlCgformField.getFieldMustInput());//是否必填 + map.put("dict_field", onlCgformField.getDictField()); //下拉类型的数据字典编码 + map.put("db_field_name", onlCgformField.getDbFieldName());//字段 + map.put("db_length", onlCgformField.getDbLength());//字段长度 + if (CutEnum.CN.getValue().equals(cut)) { + map.put("db_field_txt", onlCgformField.getDbFieldTxt());//字段中文名 + } else { + map.put("db_field_txt", onlCgformField.getDbFieldEnName());//字段英文名 + } + list.add(map); + } + return list; + } + /** * 过滤map中的值为 null的键值对 * @param map diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitInfoServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitInfoServiceImpl.java index 679a95f32..6c3756a5e 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitInfoServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitInfoServiceImpl.java @@ -20,6 +20,8 @@ import com.jero.modules.system.service.ISysDictItemService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; @@ -31,6 +33,7 @@ import java.util.stream.Collectors; * @Version: V1.0 */ @Service +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public class SarFileSplitInfoServiceImpl extends ServiceImpl implements ISarFileSplitInfoService { @Autowired diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java index cc06b5bf5..009c666ff 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java @@ -391,26 +391,26 @@ public class SarFileSplitMenuEOServiceImpl extends ServiceImpl sarFileSplitMenuEOList = dao.queryAllChildrenByid(sarMenuEO); - sarMenuEO = dao.selectByPrimaryKey(sarMenuEO.getId()); - int maxDisplay = dao.getMaxDisplayByid(sarMenuEO.getId()); - SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); - sarFileSplitMenuEO.setDisplaySeqStart(Long.valueOf(maxDisplay + 1)); - sarFileSplitMenuEO.setDisplaySeqEnd(10000L); - sarFileSplitMenuEO.setChildrenCount(1L); - sarFileSplitMenuEO.setModifyUser(UserUtils.getUserId()); - sarFileSplitMenuEO.setModifyTime(new Date()); - sarFileSplitMenuEO.setInfoId(itemsMap.get("info_id").toString()); - dao.updateDisplaySeqAdd(sarFileSplitMenuEO); +// List sarFileSplitMenuEOList = dao.queryAllChildrenByid(sarMenuEO); +// sarMenuEO = dao.selectByPrimaryKey(sarMenuEO.getId()); +// int maxDisplay = dao.getMaxDisplayByid(sarMenuEO.getId()); +// SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); +// sarFileSplitMenuEO.setDisplaySeqStart(Long.valueOf(maxDisplay + 1)); +// sarFileSplitMenuEO.setDisplaySeqEnd(10000L); +// sarFileSplitMenuEO.setChildrenCount(1L); +// sarFileSplitMenuEO.setModifyUser(UserUtils.getUserId()); +// sarFileSplitMenuEO.setModifyTime(new Date()); +// sarFileSplitMenuEO.setInfoId(itemsMap.get("info_id").toString()); +// dao.updateDisplaySeqAdd(sarFileSplitMenuEO); // SAR_FILE_ITEMS_MENU 添加数据, - sarMenuEO.setId(UUID.randomUUID().toString().replace("-", "")); - sarMenuEO.setDisplaySeq(Long.valueOf(maxDisplay + 1)); - sarMenuEO.setCreationTime(new Date()); - sarMenuEO.setModifyTime(new Date()); - sarMenuEO.setCreationUser(UserUtils.getUserId()); - sarMenuEO.setModifyUser(UserUtils.getUserId()); - result = dao.insertSelective(sarMenuEO); +// sarMenuEO.setId(UUID.randomUUID().toString().replace("-", "")); +// sarMenuEO.setDisplaySeq(Long.valueOf(maxDisplay + 1)); +// sarMenuEO.setCreationTime(new Date()); +// sarMenuEO.setModifyTime(new Date()); +// sarMenuEO.setCreationUser(UserUtils.getUserId()); +// sarMenuEO.setModifyUser(UserUtils.getUserId()); +// result = dao.insertSelective(sarMenuEO); // SAR_FILE_ITEMS 添加数据, String newItemId = UUID.randomUUID().toString().replace("-", ""); @@ -440,29 +440,29 @@ public class SarFileSplitMenuEOServiceImpl extends ServiceImpl sarFileSplitItemsParamsEOList = sarFileSplitItemsParamsMapper.queryItemsParamsByMenuId(oldItemIdList); - for (SarFileSplitItemsParamsEO sarFileSplitItemsParamsEO : sarFileSplitItemsParamsEOList) { - sarFileSplitItemsParamsEO.setId(UUID.randomUUID().toString().replace("-", "")); - sarFileSplitItemsParamsEO.setItemId(newItemId); - sarFileSplitItemsParamsEO.setCreationTime(new Date()); - sarFileSplitItemsParamsEO.setModifyTime(new Date()); - } - if (sarFileSplitItemsParamsEOList.size()>0){ - result += sarFileSplitItemsParamsMapper.insertForeach(sarFileSplitItemsParamsEOList); - } +// List sarFileSplitItemsParamsEOList = sarFileSplitItemsParamsMapper.queryItemsParamsByMenuId(oldItemIdList); +// for (SarFileSplitItemsParamsEO sarFileSplitItemsParamsEO : sarFileSplitItemsParamsEOList) { +// sarFileSplitItemsParamsEO.setId(UUID.randomUUID().toString().replace("-", "")); +// sarFileSplitItemsParamsEO.setItemId(newItemId); +// sarFileSplitItemsParamsEO.setCreationTime(new Date()); +// sarFileSplitItemsParamsEO.setModifyTime(new Date()); +// } +// if (sarFileSplitItemsParamsEOList.size()>0){ +// result += sarFileSplitItemsParamsMapper.insertForeach(sarFileSplitItemsParamsEOList); +// } // SAR_FILE_ITEMS_TABLE 添加数据, - List sarFileSplitItemsTableEOList = sarFileSplitItemsTableEOMapper.queryItemsTableByMenuId(oldItemIdList); - for (SarFileSplitItemsTableEO sarFileSplitItemsTableEO : sarFileSplitItemsTableEOList) { - sarFileSplitItemsTableEO.setId(UUID.randomUUID().toString().replace("-", "")); - sarFileSplitItemsTableEO.setItemsId(newItemId); - sarFileSplitItemsTableEO.setItemsValId(itemValIdMap.get(sarFileSplitItemsTableEO.getItemsValId()).toString()); - sarFileSplitItemsTableEO.setCreationTime(new Date()); - sarFileSplitItemsTableEO.setModifyTime(new Date()); - sarFileSplitItemsTableEO.setModifyUser(UserUtils.getUserId()); - } - if (sarFileSplitItemsTableEOList.size()>0){ - result += sarFileSplitItemsTableEOMapper.insertForeach(sarFileSplitItemsTableEOList); - } +// List sarFileSplitItemsTableEOList = sarFileSplitItemsTableEOMapper.queryItemsTableByMenuId(oldItemIdList); +// for (SarFileSplitItemsTableEO sarFileSplitItemsTableEO : sarFileSplitItemsTableEOList) { +// sarFileSplitItemsTableEO.setId(UUID.randomUUID().toString().replace("-", "")); +// sarFileSplitItemsTableEO.setItemsId(newItemId); +// sarFileSplitItemsTableEO.setItemsValId(itemValIdMap.get(sarFileSplitItemsTableEO.getItemsValId()).toString()); +// sarFileSplitItemsTableEO.setCreationTime(new Date()); +// sarFileSplitItemsTableEO.setModifyTime(new Date()); +// sarFileSplitItemsTableEO.setModifyUser(UserUtils.getUserId()); +// } +// if (sarFileSplitItemsTableEOList.size()>0){ +// result += sarFileSplitItemsTableEOMapper.insertForeach(sarFileSplitItemsTableEOList); +// } return result; } diff --git a/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml b/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml index 6b57f75af..47ab3f685 100644 --- a/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml +++ b/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml @@ -138,14 +138,14 @@ spring: # url: jdbc:mysql://10.0.3.44:3306/jero-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai -# url: jdbc:mysql://10.10.10.44:3306/laws_weilai_test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false -# username: root -# password: 123456 + url: jdbc:mysql://10.10.10.44:3306/laws_weilai_test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false + username: root + password: 123456 # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://121.36.69.172:3307/laws_weilai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false - url: jdbc:mysql://121.36.69.172:3307/laws_weilai_zhn?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai - username: root - password: hzwlsoft.com +# url: jdbc:mysql://121.36.69.172:3307/laws_weilai_zhn?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai +# username: root +# password: hzwlsoft.com driver-class-name: com.mysql.cj.jdbc.Driver # 多数据源配置 #multi-datasource1: @@ -193,6 +193,7 @@ jero : path : #文件上传根目录 设置 upload: D://opt//upFiles + img: D://opt//upFiles #webapp文件路径 webapp: D://opt//webapp shiro: @@ -381,4 +382,9 @@ Feishu: local-tool: uri: http://139.9.235.66:9022 opensso: - redirectUri: http%3A%2F%2F139.9.235.66%3A8008%2Fjero-boot%2Fopensso%2Fcallback + # TEST版 + accessTokenUrl: https://signin-test.nio.com/oauth2/accessToken + profileUrl: https://signin-test.nio.com/oauth2/profile + clientId: 100679 + clientSecret: CDf2D9404C6ac1B0f7c3e3845ae0282a + redirectUri: http%3A%2F%2F139.9.235.66%3A8010