Commit bb225ddc authored by 韩桐桐's avatar 韩桐桐

feat(jg):八大类历史设备导入-压力管道(未完)

parent 64ee542e
...@@ -75,6 +75,10 @@ public class DictParamsConverter implements Converter<String> { ...@@ -75,6 +75,10 @@ public class DictParamsConverter implements Converter<String> {
dictMap.put("液化天然气", "LIQUEFIED_NATURAL_GAS"); dictMap.put("液化天然气", "LIQUEFIED_NATURAL_GAS");
dictMap.put("液化石油气", "LIQUEFIED_PETROLEUM_GAS"); dictMap.put("液化石油气", "LIQUEFIED_PETROLEUM_GAS");
dictMap.put("氢气", "HYDROGEN"); dictMap.put("氢气", "HYDROGEN");
dictMap.put("集选", "1");
dictMap.put("并联", "2");
dictMap.put("按钮", "3");
dictMap.put("其他控制方式", "4");
} }
@Override @Override
...@@ -101,8 +105,4 @@ public class DictParamsConverter implements Converter<String> { ...@@ -101,8 +105,4 @@ public class DictParamsConverter implements Converter<String> {
public CellData convertToExcelData(String o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { public CellData convertToExcelData(String o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return new CellData(""); return new CellData("");
} }
public static void main(String[] args) {
}
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ import java.util.Map; ...@@ -11,7 +11,7 @@ import java.util.Map;
public class EquListConverter implements Converter<String> { public class EquListConverter implements Converter<String> {
private static final Map<String, String> equipmentMap = new HashMap<>(); public static final Map<String, String> equipmentMap = new HashMap<>();
static { static {
// 填充映射关系 // 填充映射关系
......
...@@ -47,6 +47,11 @@ public class EquipInfoExcelDto extends BaseDto { ...@@ -47,6 +47,11 @@ public class EquipInfoExcelDto extends BaseDto {
@NotBlank(message = "产品名称不能为空") @NotBlank(message = "产品名称不能为空")
private String productName; private String productName;
@ApiModelProperty(value = "管道名称(登记单元)")
@ExcelProperty(value = "管道名称(登记单元)")
@NotBlank(message = "管道名称不能为空")
private String pipeName;
@ApiModelProperty(value = "设备型号") @ApiModelProperty(value = "设备型号")
@ExcelProperty(value = "设备型号") @ExcelProperty(value = "设备型号")
@NotBlank(message = "设备型号不能为空") @NotBlank(message = "设备型号不能为空")
...@@ -70,6 +75,11 @@ public class EquipInfoExcelDto extends BaseDto { ...@@ -70,6 +75,11 @@ public class EquipInfoExcelDto extends BaseDto {
@ExcelProperty(value = "工程(装置)名称") @ExcelProperty(value = "工程(装置)名称")
private String projectContraption; private String projectContraption;
@ApiModelProperty(value = "工程(装置)编号")
@ExcelProperty(value = "工程(装置)编号")
private String projectContraptionNo;
@ApiModelProperty(value = "是否球罐") @ApiModelProperty(value = "是否球罐")
@ExcelProperty(value = "是否球罐", converter = VehicleCylinderConverter.class) @ExcelProperty(value = "是否球罐", converter = VehicleCylinderConverter.class)
private String whetherSphericalTank; private String whetherSphericalTank;
......
...@@ -35,7 +35,7 @@ public class DataDockController { ...@@ -35,7 +35,7 @@ public class DataDockController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/xi-an/saveEquipmentData") @PostMapping(value = "/xi-an/saveEquipmentData")
@ApiOperation(httpMethod = "POST", value = "西安数据对接-设备批量导入", notes = "西安数据对接-导入多个设备的数据文件") @ApiOperation(httpMethod = "POST", value = "西安数据对接-设备批量导入", notes = "西安数据对接-导入多个设备的数据文件")
public ResponseModel<?> saveEquipmentData(@RequestBody List<Map<?, ?>> equLists) throws Exception { public ResponseModel<?> saveEquipmentData(@RequestBody List<Map<String, Object>> equLists) throws Exception {
return ResponseHelper.buildResponse(dataDockService.xiAnSaveEquipmentData(equLists)); return ResponseHelper.buildResponse(dataDockService.xiAnSaveEquipmentData(equLists));
} }
......
...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jg.biz.service; ...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jg.biz.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgProjectContraption; import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgProjectContraption;
...@@ -14,7 +15,7 @@ import java.util.Map; ...@@ -14,7 +15,7 @@ import java.util.Map;
* @author system_generator * @author system_generator
* @date 2024-12-11 * @date 2024-12-11
*/ */
public interface IIdxBizJgProjectContraptionService { public interface IIdxBizJgProjectContraptionService extends IService<IdxBizJgProjectContraption> {
boolean saveOrUpdateData(IdxBizJgProjectContraption projectContraption); boolean saveOrUpdateData(IdxBizJgProjectContraption projectContraption);
......
...@@ -8,6 +8,7 @@ import com.alibaba.excel.read.metadata.ReadSheet; ...@@ -8,6 +8,7 @@ import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder; import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.boot.biz.common.utils.SnowflakeIdUtil;
import com.yeejoin.amos.boot.module.common.api.dao.ESEquipmentCategory; import com.yeejoin.amos.boot.module.common.api.dao.ESEquipmentCategory;
import com.yeejoin.amos.boot.module.common.api.dto.ESEquipmentCategoryDto; import com.yeejoin.amos.boot.module.common.api.dto.ESEquipmentCategoryDto;
import com.yeejoin.amos.boot.module.jg.api.dto.EquipInfoExcelDto; import com.yeejoin.amos.boot.module.jg.api.dto.EquipInfoExcelDto;
...@@ -34,6 +35,7 @@ import java.sql.Timestamp; ...@@ -34,6 +35,7 @@ import java.sql.Timestamp;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.alibaba.fastjson.JSON.toJSONString; import static com.alibaba.fastjson.JSON.toJSONString;
...@@ -41,9 +43,11 @@ import static com.alibaba.fastjson.JSON.toJSONString; ...@@ -41,9 +43,11 @@ import static com.alibaba.fastjson.JSON.toJSONString;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class DataDockServiceImpl { public class DataDockServiceImpl {
private final SnowflakeIdUtil sequence;
private final ESEquipmentCategory esEquipmentCategory; private final ESEquipmentCategory esEquipmentCategory;
private final CategoryOtherInfoMapper categoryOtherInfoMapper; private final CategoryOtherInfoMapper categoryOtherInfoMapper;
private final IIdxBizJgUseInfoService idxBizJgUseInfoService; private final IIdxBizJgUseInfoService idxBizJgUseInfoService;
private final IIdxBizJgProjectContraptionService idxBizJgProjectContraptionService;
private final IdxBizJgDesignInfoServiceImpl idxBizJgDesignInfoService; private final IdxBizJgDesignInfoServiceImpl idxBizJgDesignInfoService;
private final IdxBizJgFactoryInfoServiceImpl idxBizJgFactoryInfoService; private final IdxBizJgFactoryInfoServiceImpl idxBizJgFactoryInfoService;
private final IdxBizJgRegisterInfoServiceImpl idxBizJgRegisterInfoServiceImpl; private final IdxBizJgRegisterInfoServiceImpl idxBizJgRegisterInfoServiceImpl;
...@@ -57,9 +61,17 @@ public class DataDockServiceImpl { ...@@ -57,9 +61,17 @@ public class DataDockServiceImpl {
private final IIdxBizJgTechParamsRidesService iIdxBizJgTechParamsRidesService; private final IIdxBizJgTechParamsRidesService iIdxBizJgTechParamsRidesService;
private final IIdxBizJgTechParamsRopewayService iIdxBizJgTechParamsRopewayService; private final IIdxBizJgTechParamsRopewayService iIdxBizJgTechParamsRopewayService;
private final IIdxBizJgTechParamsElevatorService iIdxBizJgTechParamsElevatorService; private final IIdxBizJgTechParamsElevatorService iIdxBizJgTechParamsElevatorService;
private final IdxBizJgProjectContraptionServiceImpl idxBizJgProjectContraptionServiceImpl;
private final TransactionTemplate transactionTemplate; private final TransactionTemplate transactionTemplate;
private final CommonServiceImpl commonService; private final CommonServiceImpl commonService;
private final Map<String, Object> resultError = new HashMap<>();
List<String> useInnerCodeList = new ArrayList<>();// 单位内部编号集合
List<String> equCodeList = new ArrayList<>();// 设备代码集合
List<String> factoryNumList = new ArrayList<>();// 出厂编码集合
List<String> useOrgCodeList = new ArrayList<>();// 使用登记证集合
Map<String, List<String>> projectContraptionMap = new HashMap<>();// 工程装置名称集合
/** /**
* 西安数据对接-保存设备信息 * 西安数据对接-保存设备信息
* *
...@@ -68,21 +80,23 @@ public class DataDockServiceImpl { ...@@ -68,21 +80,23 @@ public class DataDockServiceImpl {
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@GlobalTransactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public boolean xiAnSaveEquipmentData(List<Map<?, ?>> equLists) { public boolean xiAnSaveEquipmentData(List<Map<String, Object>> equLists) {
CompletableFuture.allOf(equLists.stream().map(equ -> CompletableFuture.runAsync(() -> saveEquipmentDataInTransaction(equ, "jg_his_xa", null))).toArray(CompletableFuture[]::new)).join(); CompletableFuture.allOf(equLists.stream().map(equ -> CompletableFuture.runAsync(() -> saveEquipmentDataInTransaction(equ, "jg_his_xa", null))).toArray(CompletableFuture[]::new)).join();
return Boolean.TRUE; return Boolean.TRUE;
} }
private void saveEquipmentDataInTransaction(Map<?, ?> equ, String dataSource, String remark) { private void saveEquipmentDataInTransaction(Map<String, Object> equ, String dataSource, String remark) {
try { try {
transactionTemplate.execute(status -> { transactionTemplate.execute(status -> {
String record = UUID.randomUUID().toString(); String record = UUID.randomUUID().toString();
String equList = String.valueOf(equ.get("equList")); String equList = String.valueOf(equ.get("equList"));
// 压力管道保存 工程装置表信息 必须在saveUseInfo之前进行,需要提前生成工程装置id
saveProjectContraption(equ, equList);
// 保存到设备表 // 保存到设备表
saveUseInfo(equ, record, dataSource, remark); saveUseInfo(equ, record, dataSource, remark);
saveDesignInfo(equ, record); saveDesignInfo(equ, record);
saveFactoryInfo(equ, record); saveFactoryInfo(equ, record);
saveRegisterInfo(equ, record); saveRegisterInfo(equ, record, equList);
saveSupervisionInfo(equ, record); saveSupervisionInfo(equ, record);
saveOtherInfo(equ, record, equList); saveOtherInfo(equ, record, equList);
// 保存技术参数 // 保存技术参数
...@@ -99,12 +113,60 @@ public class DataDockServiceImpl { ...@@ -99,12 +113,60 @@ public class DataDockServiceImpl {
} }
/** /**
* 保存工程装置表信息
*/
private void saveProjectContraption(Map<String, Object> equ, String equList) {
if (EquipmentClassifityEnum.YLGD.getCode().equals(equList)) {
IdxBizJgProjectContraption projectContraption = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgProjectContraption.class);
if (!ValidationUtil.isEmpty(projectContraption)) {
String useUnitCode = String.valueOf(equ.get("useUnitCode")).trim();// 使用单位Code
String useUnit = String.valueOf(equ.get("useUnit")).trim();// 使用单位名称
String proConName = String.valueOf(equ.get("projectContraption")).trim();// 工程装置名称
// 查询该企业下是否已经有该工程装置名称 有-》追加 update 无-》新增 save
IdxBizJgProjectContraption oldContraption = idxBizJgProjectContraptionService.lambdaQuery()
.eq(IdxBizJgProjectContraption::getUseUnitCreditCode, useUnitCode)
.eq(IdxBizJgProjectContraption::getUseUnitName, useUnit)
.eq(IdxBizJgProjectContraption::getProjectContraption, proConName)
.one();
projectContraption.setRecDate(new Date());
if (ObjectUtils.isEmpty(oldContraption)) { // save
Long sequenceNbr = sequence.nextId();
projectContraption.setSequenceNbr(sequenceNbr);
projectContraption.setUseUnitCreditCode(useUnitCode);
projectContraption.setUseUnitName(useUnit);
projectContraption.setEquList(equList);
projectContraption.setEquListName(EquipmentClassifityEnum.getNameByCode(equList));
projectContraption.setEquCategory((String) equ.get("equCategory"));
projectContraption.setEquCategoryName(EquipmentClassifityEnum.getNameByCode((String) equ.get("equCategory")));
projectContraption.setEquDefine((String) equ.get("equDefine"));
projectContraption.setEquDefineName(EquipmentClassifityEnum.getNameByCode((String) equ.get("equDefine")));
projectContraption.setPipelineLength(Double.parseDouble((String) equ.get("pipeLength")));
projectContraption.setUseRegistrationCode((String) equ.get("useOrgCode"));
projectContraption.setIsIntoManagement(Boolean.FALSE);
idxBizJgProjectContraptionService.save(projectContraption);
equ.put("projectContraptionId", sequenceNbr);
} else { // update
equ.put("projectContraptionId", oldContraption.getSequenceNbr());
projectContraption.setSequenceNbr(oldContraption.getSequenceNbr());
Double oldPipelineLength = oldContraption.getPipelineLength();
projectContraption.setPipelineLength(Double.sum(oldPipelineLength, Double.parseDouble((String) equ.get("pipeLength"))));
idxBizJgProjectContraptionService.updateById(projectContraption);
}
}
}
}
/**
* 保存使用信息表 * 保存使用信息表
* *
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveUseInfo(Map<?, ?> equ, String record, String dataSource, String remark) { private void saveUseInfo(Map<String, Object> equ, String record, String dataSource, String remark) {
IdxBizJgUseInfo useInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgUseInfo.class); IdxBizJgUseInfo useInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgUseInfo.class);
if (!ValidationUtil.isEmpty(useInfo)) { if (!ValidationUtil.isEmpty(useInfo)) {
useInfo.setRecDate(new Date()); useInfo.setRecDate(new Date());
...@@ -115,6 +177,7 @@ public class DataDockServiceImpl { ...@@ -115,6 +177,7 @@ public class DataDockServiceImpl {
useInfo.setUseUnitCreditCode(String.valueOf(equ.get("useUnitCode")).trim()); useInfo.setUseUnitCreditCode(String.valueOf(equ.get("useUnitCode")).trim());
useInfo.setUseUnitName(String.valueOf(equ.get("useUnit")).trim()); useInfo.setUseUnitName(String.valueOf(equ.get("useUnit")).trim());
useInfo.setRemark(remark); useInfo.setRemark(remark);
useInfo.setProjectContraptionId(String.valueOf(equ.get("projectContraptionId")));
idxBizJgUseInfoService.save(useInfo); idxBizJgUseInfoService.save(useInfo);
} }
} }
...@@ -125,7 +188,7 @@ public class DataDockServiceImpl { ...@@ -125,7 +188,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveDesignInfo(Map<?, ?> equ, String record) { private void saveDesignInfo(Map<String, Object> equ, String record) {
IdxBizJgDesignInfo designInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgDesignInfo.class); IdxBizJgDesignInfo designInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgDesignInfo.class);
if (!ValidationUtil.isEmpty(designInfo)) { if (!ValidationUtil.isEmpty(designInfo)) {
designInfo.setRecord(record); designInfo.setRecord(record);
...@@ -140,7 +203,7 @@ public class DataDockServiceImpl { ...@@ -140,7 +203,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveFactoryInfo(Map<?, ?> equ, String record) { private void saveFactoryInfo(Map<String, Object> equ, String record) {
IdxBizJgFactoryInfo factoryInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgFactoryInfo.class); IdxBizJgFactoryInfo factoryInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgFactoryInfo.class);
if (!ValidationUtil.isEmpty(factoryInfo)) { if (!ValidationUtil.isEmpty(factoryInfo)) {
factoryInfo.setRecord(record); factoryInfo.setRecord(record);
...@@ -156,12 +219,15 @@ public class DataDockServiceImpl { ...@@ -156,12 +219,15 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveRegisterInfo(Map<?, ?> equ, String record) { private void saveRegisterInfo(Map<String, Object> equ, String record, String equList) {
IdxBizJgRegisterInfo registerInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgRegisterInfo.class); IdxBizJgRegisterInfo registerInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgRegisterInfo.class);
if (!ValidationUtil.isEmpty(registerInfo)) { if (!ValidationUtil.isEmpty(registerInfo)) {
registerInfo.setRecord(record); registerInfo.setRecord(record);
registerInfo.setRecDate(new Date()); registerInfo.setRecDate(new Date());
registerInfo.setRegisterState("6045"); registerInfo.setRegisterState("6045");
if (EquipmentClassifityEnum.YLGD.getCode().equals(equList)) {
registerInfo.setEquCodeType("2");
}
idxBizJgRegisterInfoServiceImpl.save(registerInfo); idxBizJgRegisterInfoServiceImpl.save(registerInfo);
} }
} }
...@@ -172,7 +238,7 @@ public class DataDockServiceImpl { ...@@ -172,7 +238,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveSupervisionInfo(Map<?, ?> equ, String record) { private void saveSupervisionInfo(Map<String, Object> equ, String record) {
IdxBizJgSupervisionInfo supervisionInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgSupervisionInfo.class); IdxBizJgSupervisionInfo supervisionInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgSupervisionInfo.class);
if (!ValidationUtil.isEmpty(supervisionInfo)) { if (!ValidationUtil.isEmpty(supervisionInfo)) {
supervisionInfo.setRecord(record); supervisionInfo.setRecord(record);
...@@ -187,7 +253,7 @@ public class DataDockServiceImpl { ...@@ -187,7 +253,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveOtherInfo(Map<?, ?> equ, String record, String equList) { private void saveOtherInfo(Map<String, Object> equ, String record, String equList) {
IdxBizJgOtherInfo otherInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgOtherInfo.class); IdxBizJgOtherInfo otherInfo = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgOtherInfo.class);
if (!ValidationUtil.isEmpty(otherInfo)) { if (!ValidationUtil.isEmpty(otherInfo)) {
otherInfo.setRecord(record); otherInfo.setRecord(record);
...@@ -207,7 +273,7 @@ public class DataDockServiceImpl { ...@@ -207,7 +273,7 @@ public class DataDockServiceImpl {
* @param record * @param record
* @param equList * @param equList
*/ */
private void saveTechParams(Map<?, ?> equ, String record, String equList) { private void saveTechParams(Map<String, Object> equ, String record, String equList) {
if (EquipmentClassifityEnum.QZJX.getCode().equals(equList)) { if (EquipmentClassifityEnum.QZJX.getCode().equals(equList)) {
saveLiftingParams(equ, record); saveLiftingParams(equ, record);
} else if (EquipmentClassifityEnum.CC.getCode().equals(equList)) { } else if (EquipmentClassifityEnum.CC.getCode().equals(equList)) {
...@@ -233,7 +299,7 @@ public class DataDockServiceImpl { ...@@ -233,7 +299,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveLiftingParams(Map<?, ?> equ, String record) { private void saveLiftingParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsLifting equipTechParamLifting = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsLifting.class); IdxBizJgTechParamsLifting equipTechParamLifting = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsLifting.class);
if (!ValidationUtil.isEmpty(equipTechParamLifting)) { if (!ValidationUtil.isEmpty(equipTechParamLifting)) {
equipTechParamLifting.setRecord(record); equipTechParamLifting.setRecord(record);
...@@ -248,7 +314,7 @@ public class DataDockServiceImpl { ...@@ -248,7 +314,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveVehicleParams(Map<?, ?> equ, String record) { private void saveVehicleParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsVehicle equipTechParamVehicle = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsVehicle.class); IdxBizJgTechParamsVehicle equipTechParamVehicle = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsVehicle.class);
if (!ValidationUtil.isEmpty(equipTechParamVehicle)) { if (!ValidationUtil.isEmpty(equipTechParamVehicle)) {
equipTechParamVehicle.setRecord(record); equipTechParamVehicle.setRecord(record);
...@@ -263,7 +329,7 @@ public class DataDockServiceImpl { ...@@ -263,7 +329,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveBoilerParams(Map<?, ?> equ, String record) { private void saveBoilerParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsBoiler equipTechParamBoiler = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsBoiler.class); IdxBizJgTechParamsBoiler equipTechParamBoiler = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsBoiler.class);
if (!ValidationUtil.isEmpty(equipTechParamBoiler)) { if (!ValidationUtil.isEmpty(equipTechParamBoiler)) {
equipTechParamBoiler.setRecord(record); equipTechParamBoiler.setRecord(record);
...@@ -278,7 +344,7 @@ public class DataDockServiceImpl { ...@@ -278,7 +344,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveVesselParams(Map<?, ?> equ, String record) { private void saveVesselParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsVessel equipTechParamVessel = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsVessel.class); IdxBizJgTechParamsVessel equipTechParamVessel = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsVessel.class);
if (!ValidationUtil.isEmpty(equipTechParamVessel)) { if (!ValidationUtil.isEmpty(equipTechParamVessel)) {
equipTechParamVessel.setRecord(record); equipTechParamVessel.setRecord(record);
...@@ -293,7 +359,7 @@ public class DataDockServiceImpl { ...@@ -293,7 +359,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void savePipelineParams(Map<?, ?> equ, String record) { private void savePipelineParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsPipeline equipTechParamPipeline = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsPipeline.class); IdxBizJgTechParamsPipeline equipTechParamPipeline = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsPipeline.class);
if (!ValidationUtil.isEmpty(equipTechParamPipeline)) { if (!ValidationUtil.isEmpty(equipTechParamPipeline)) {
equipTechParamPipeline.setWallThickness(String.valueOf(equ.get("wallThickness_YLGD"))); equipTechParamPipeline.setWallThickness(String.valueOf(equ.get("wallThickness_YLGD")));
...@@ -312,7 +378,7 @@ public class DataDockServiceImpl { ...@@ -312,7 +378,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveRidesParams(Map<?, ?> equ, String record) { private void saveRidesParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsRides equipTechParamRides = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsRides.class); IdxBizJgTechParamsRides equipTechParamRides = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsRides.class);
if (!ValidationUtil.isEmpty(equipTechParamRides)) { if (!ValidationUtil.isEmpty(equipTechParamRides)) {
equipTechParamRides.setRecord(record); equipTechParamRides.setRecord(record);
...@@ -330,7 +396,7 @@ public class DataDockServiceImpl { ...@@ -330,7 +396,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveRopewayParams(Map<?, ?> equ, String record) { private void saveRopewayParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsRopeway equipTechParamRopeway = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsRopeway.class); IdxBizJgTechParamsRopeway equipTechParamRopeway = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsRopeway.class);
if (!ValidationUtil.isEmpty(equipTechParamRopeway)) { if (!ValidationUtil.isEmpty(equipTechParamRopeway)) {
equipTechParamRopeway.setRecord(record); equipTechParamRopeway.setRecord(record);
...@@ -345,7 +411,7 @@ public class DataDockServiceImpl { ...@@ -345,7 +411,7 @@ public class DataDockServiceImpl {
* @param equ * @param equ
* @param record * @param record
*/ */
private void saveElevatorParams(Map<?, ?> equ, String record) { private void saveElevatorParams(Map<String, Object> equ, String record) {
IdxBizJgTechParamsElevator equipTechParamElevator = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsElevator.class); IdxBizJgTechParamsElevator equipTechParamElevator = JSON.parseObject(JSON.toJSONString(equ), IdxBizJgTechParamsElevator.class);
if (!ValidationUtil.isEmpty(equipTechParamElevator)) { if (!ValidationUtil.isEmpty(equipTechParamElevator)) {
equipTechParamElevator.setRecord(record); equipTechParamElevator.setRecord(record);
...@@ -393,12 +459,6 @@ public class DataDockServiceImpl { ...@@ -393,12 +459,6 @@ public class DataDockServiceImpl {
return Boolean.TRUE; return Boolean.TRUE;
} }
private final Map<String, Object> resultError = new HashMap<>();
List<String> useInnerCodeList = new ArrayList<>();// 单位内部编号集合
List<String> equCodeList = new ArrayList<>();// 设备代码集合
List<String> factoryNumList = new ArrayList<>();// 出厂编码集合
List<String> useOrgCodeList = new ArrayList<>();// 使用登记证集合
/** /**
* excel 文件读取,字段校验 * excel 文件读取,字段校验
* *
...@@ -413,6 +473,7 @@ public class DataDockServiceImpl { ...@@ -413,6 +473,7 @@ public class DataDockServiceImpl {
equCodeList.clear(); equCodeList.clear();
factoryNumList.clear(); factoryNumList.clear();
useOrgCodeList.clear(); useOrgCodeList.clear();
projectContraptionMap.clear();
try { try {
InputStream inputStream = file.getInputStream(); InputStream inputStream = file.getInputStream();
...@@ -482,21 +543,21 @@ public class DataDockServiceImpl { ...@@ -482,21 +543,21 @@ public class DataDockServiceImpl {
StringBuffer rowError = new StringBuffer(); StringBuffer rowError = new StringBuffer();
log.info("开始解析数据,第{}条数据", rowIndex); log.info("开始解析数据,第{}条数据", rowIndex);
// 是否起重机械 // 是否起重机械
boolean isQZJX = !ValidationUtil.isEmpty(data.getEquList()) && "4000".equals(data.getEquList()); boolean isQZJX = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.QZJX.getCode().equals(data.getEquList());
// 是否场内机动车辆 // 是否场内机动车辆
boolean isCNJDXL = !ValidationUtil.isEmpty(data.getEquList()) && "5000".equals(data.getEquList()); boolean isCNJDXL = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.CC.getCode().equals(data.getEquList());
// 是否锅炉 // 是否锅炉
boolean isGL = !ValidationUtil.isEmpty(data.getEquList()) && "1000".equals(data.getEquList()); boolean isGL = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.GL.getCode().equals(data.getEquList());
// 是否压力容器 // 是否压力容器
boolean isYLRQ = !ValidationUtil.isEmpty(data.getEquList()) && "2000".equals(data.getEquList()); boolean isYLRQ = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.YLRQ.getCode().equals(data.getEquList());
// 是否压力管道 // 是否压力管道
boolean isYLGD = !ValidationUtil.isEmpty(data.getEquList()) && "8000".equals(data.getEquList()); boolean isYLGD = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.YLGD.getCode().equals(data.getEquList());
// 是否大型游乐设施 // 是否大型游乐设施
boolean isDXYNSS = !ValidationUtil.isEmpty(data.getEquList()) && "6000".equals(data.getEquList()); boolean isDXYNSS = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.YLSS.getCode().equals(data.getEquList());
// 是否客运索道 // 是否客运索道
boolean isKYSD = !ValidationUtil.isEmpty(data.getEquList()) && "9000".equals(data.getEquList()); boolean isKYSD = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.KYSD.getCode().equals(data.getEquList());
// 是否电梯 // 是否电梯
boolean isDT = !ValidationUtil.isEmpty(data.getEquList()) && "3000".equals(data.getEquList()); boolean isDT = !ValidationUtil.isEmpty(data.getEquList()) && EquipmentClassifityEnum.DT.getCode().equals(data.getEquList());
try { try {
log.info("解析第{}行数据:{}", rowIndex, JSON.toJSONString(data)); log.info("解析第{}行数据:{}", rowIndex, JSON.toJSONString(data));
...@@ -556,8 +617,11 @@ public class DataDockServiceImpl { ...@@ -556,8 +617,11 @@ public class DataDockServiceImpl {
*/ */
private void commonFieldCheck(EquipInfoExcelDto data, StringBuffer rowError) { private void commonFieldCheck(EquipInfoExcelDto data, StringBuffer rowError) {
boolean isPressureVessel = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquList()) && "2000".equals(data.getEquList());// 是否压力容器 boolean isYLRQ = !ObjectUtils.isEmpty(data.getEquList()) && EquipmentClassifityEnum.YLRQ.getCode().equals(data.getEquList());// 是否压力容器
boolean isPressurePiping = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquList()) && "8000".equals(data.getEquList());// 是否压力管道 boolean isYLGD = !ObjectUtils.isEmpty(data.getEquList()) && EquipmentClassifityEnum.YLGD.getCode().equals(data.getEquList());// 是否压力管道
boolean isDT = !ObjectUtils.isEmpty(data.getEquList()) && EquipmentClassifityEnum.DT.getCode().equals(data.getEquList());// 是否电梯
boolean isCC = !ObjectUtils.isEmpty(data.getEquList()) && EquipmentClassifityEnum.CC.getCode().equals(data.getEquList());// 是否场车
boolean isQZJX = !ObjectUtils.isEmpty(data.getEquList()) && EquipmentClassifityEnum.QZJX.getCode().equals(data.getEquList());// 是否起重机械
// 基本信息 // 基本信息
checkNotBlank(data.getEquList(), "设备种类不能为空;", rowError); checkNotBlank(data.getEquList(), "设备种类不能为空;", rowError);
...@@ -566,35 +630,79 @@ public class DataDockServiceImpl { ...@@ -566,35 +630,79 @@ public class DataDockServiceImpl {
if (useInnerCodeList.contains(data.getUseInnerCode())) { if (useInnerCodeList.contains(data.getUseInnerCode())) {
rowError.append("单位内编号不能重复;"); rowError.append("单位内编号不能重复;");
} }
checkNotBlank(data.getProductName(), "产品名称不能为空;", rowError);
checkNotBlank(data.getEquType(), "设备型号不能为空;", rowError); checkNotBlank(data.getEquType(), "设备型号不能为空;", rowError);
checkNotBlank(data.getEquCodeType(), "有无设备代码不能为空;", rowError); if (!isYLGD) {
if ("1".equals(data.getEquCodeType())) { checkNotBlank(data.getProductName(), "产品名称不能为空;", rowError);
checkNotBlank(data.getEquCode(), "设备代码不能为空;", rowError); checkNotBlank(data.getEquCodeType(), "有无设备代码不能为空;", rowError);
String equCode = data.getEquCode(); if ("1".equals(data.getEquCodeType())) {
if (equCode.matches("[a-zA-Z0-9]+")) { checkNotBlank(data.getEquCode(), "设备代码不能为空;", rowError);
if (equCode.length() <= 17) { String equCode = data.getEquCode();
rowError.append("设备代码不能小于17位;"); if (equCode.matches("[a-zA-Z0-9]+")) {
if (equCode.length() <= 17) {
rowError.append("设备代码不能小于17位;");
}
if (equCode.length() >= 20) {
rowError.append("设备代码不能大于20位;");
}
} else {
rowError.append("设备代码不能包含特殊字符;");
} }
if (equCode.length() >= 20) { if (equCodeList.contains(data.getEquCode())) {
rowError.append("设备代码不能大于20位;"); rowError.append("设备代码不能重复;");
} }
this.checkEquCodeUniqueness(data.getEquCode(), rowError);
} else { } else {
rowError.append("设备代码不能包含特殊字符;"); data.setEquCode("");
}
if (equCodeList.contains(data.getEquCode())) {
rowError.append("设备代码不能重复;");
} }
this.checkEquCodeUniqueness(data.getEquCode(), rowError);
} else {
data.setEquCode("");
} }
if (isPressurePiping) {// 校验压力管道特有的参数 if (isYLGD) {// 校验压力管道特有的参数
checkNotBlank(data.getPipeName(), "管道名称不能为空;", rowError);
checkNotBlank(data.getProjectContraption(), "工程(装置)名称不能为空;", rowError); checkNotBlank(data.getProjectContraption(), "工程(装置)名称不能为空;", rowError);
checkNotBlank(data.getProjectContraptionNo(), "工程(装置)编号不能为空;", rowError);
// todo
if (commonService.useRegistrationCertificateAccountUnique(data.getUseOrgCode(), null)) {
rowError.append("使用登记证编号已存在系统中;");
}
// 同一工程装置下管道编号不能重复
if (!ValidationUtil.isEmpty(data.getProjectContraption())) {
String useUnitCode = String.valueOf(data.getUseUnitCode()).trim();// 使用单位Code
String useUnit = String.valueOf(data.getUseUnit()).trim();// 使用单位名称
String proConName = data.getProjectContraption().trim();// 工程装置名称
// 查询该企业下工程装置名称
IdxBizJgProjectContraption oldContraption = idxBizJgProjectContraptionService.lambdaQuery()
.eq(IdxBizJgProjectContraption::getUseUnitCreditCode, useUnitCode)
.eq(IdxBizJgProjectContraption::getUseUnitName, useUnit)
.eq(IdxBizJgProjectContraption::getProjectContraption, proConName)
.one();
Optional.ofNullable(oldContraption).ifPresent(old -> {
List<String> pipelineNumberList = idxBizJgProjectContraptionServiceImpl.getBaseMapper()
.selectEquipList(String.valueOf(old.getSequenceNbr()))
.stream()
.map(item -> (String) item.get("pipelineNumber"))
.collect(Collectors.toList());
if (pipelineNumberList.contains(data.getPipelineNumber())) {
rowError.append(String.format("系统中工程装置(%s)下已经存在管道编号(%s);", data.getProjectContraption(), data.getPipelineNumber()));
}
});
List<String> list = projectContraptionMap.get(data.getProjectContraption());
if (null != list) {
// 判断该装置下是否已经存在该管道编号
if (list.contains(data.getPipelineNumber())) {
rowError.append(String.format("同一工程装置(%s)下管道编号不能重复;", data.getProjectContraption()));
}
list.add(data.getPipelineNumber());
} else {
list = new ArrayList<>();
}
projectContraptionMap.put(data.getProjectContraption(), list);
}
} else { } else {
data.setProjectContraption(""); data.setProjectContraption("");
} }
if (isPressureVessel) {// 校验压力容器特有的参数 if (isYLRQ) {// 校验压力容器特有的参数
boolean isGasCylinder = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2300".equals(data.getEquCategory());// 是否气瓶 boolean isGasCylinder = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2300".equals(data.getEquCategory());// 是否气瓶
boolean isFixedGasCylinder = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2100".equals(data.getEquCategory());// 是否固定式压力容器 boolean isFixedGasCylinder = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2100".equals(data.getEquCategory());// 是否固定式压力容器
boolean isOxygenChamber = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2400".equals(data.getEquCategory());// 是否氧舱 boolean isOxygenChamber = !org.apache.commons.lang3.ObjectUtils.isEmpty(data.getEquCategory()) && "2400".equals(data.getEquCategory());// 是否氧舱
...@@ -660,7 +768,7 @@ public class DataDockServiceImpl { ...@@ -660,7 +768,7 @@ public class DataDockServiceImpl {
} catch (Exception e) { } catch (Exception e) {
rowError.append(e.getMessage()); rowError.append(e.getMessage());
} }
if (commonService.useRegistrationCertificateAccountUnique(data.getUseOrgCode(), null)) { if (!isYLGD && commonService.useRegistrationCertificateAccountUnique(data.getUseOrgCode(), null)) {
rowError.append("使用登记证编号已存在系统中;"); rowError.append("使用登记证编号已存在系统中;");
} }
} }
...@@ -668,15 +776,17 @@ public class DataDockServiceImpl { ...@@ -668,15 +776,17 @@ public class DataDockServiceImpl {
checkNotBlank(data.getUseUnitCode(), "使用单位统一社会信用代码不能为空;", rowError); checkNotBlank(data.getUseUnitCode(), "使用单位统一社会信用代码不能为空;", rowError);
Optional.ofNullable(data.getUseUnitCode()).ifPresent(v -> checkCreditCode(v, "使用单位统一社会信用代码格式不正确;", rowError)); Optional.ofNullable(data.getUseUnitCode()).ifPresent(v -> checkCreditCode(v, "使用单位统一社会信用代码格式不正确;", rowError));
checkNotBlank(data.getUseUnit(), "使用单位名称不能为空;", rowError); checkNotBlank(data.getUseUnit(), "使用单位名称不能为空;", rowError);
// 设计信息 // 设计信息 电梯、场车、起重机械无"设计信息"
// checkNotBlank(data.getDesignUnitCreditCode(), "设计单位统一社会信用代码不能为空;", rowError); if (!isDT && !isCC && !isQZJX) {
// Optional.ofNullable(data.getDesignUnitCreditCode()).ifPresent(v -> checkCreditCode(v, "设计单位统一社会信用代码格式不正确;", rowError)); checkNotBlank(data.getDesignUnitCreditCode(), "设计单位统一社会信用代码不能为空;", rowError);
// checkNotBlank(data.getDesignUnitName(), "设计单位名称不能为空;", rowError); Optional.ofNullable(data.getDesignUnitCreditCode()).ifPresent(v -> checkCreditCode(v, "设计单位统一社会信用代码格式不正确;", rowError));
// checkNotBlank(data.getDesignUseDate(), "设计使用年限不能为空;", rowError); checkNotBlank(data.getDesignUnitName(), "设计单位名称不能为空;", rowError);
// Optional.ofNullable(data.getDesignUseDate()).ifPresent(v -> checkDateFormatNumber(v, "设计使用年限不能为数字以外的其他类型;", rowError)); checkNotBlank(data.getDesignUseDate(), "设计使用年限不能为空;", rowError);
// checkNotBlank(data.getDesignUseDate(), "设计日期不能为空;", rowError); Optional.ofNullable(data.getDesignUseDate()).ifPresent(v -> checkDateFormatNumber(v, "设计使用年限不能为数字以外的其他类型;", rowError));
// Optional.ofNullable(data.getDesignDate()).ifPresent(v -> checkDateFormatCorrect(v, "设计日期格式不正确;", rowError)); checkNotBlank(data.getDesignUseDate(), "设计日期不能为空;", rowError);
// Optional.ofNullable(data.getAppraisalDate()).ifPresent(v -> checkDateFormatCorrect(v, "设计文件鉴定日期格式不正确;", rowError)); Optional.ofNullable(data.getDesignDate()).ifPresent(v -> checkDateFormatCorrect(v, "设计日期格式不正确;", rowError));
Optional.ofNullable(data.getAppraisalDate()).ifPresent(v -> checkDateFormatCorrect(v, "设计文件鉴定日期格式不正确;", rowError));
}
// 制造信息 // 制造信息
checkNotBlank(data.getProduceUnitCreditCode(), "制造单位统一社会信用代码不能为空;", rowError); checkNotBlank(data.getProduceUnitCreditCode(), "制造单位统一社会信用代码不能为空;", rowError);
Optional.ofNullable(data.getProduceUnitCreditCode()).ifPresent(v -> checkCreditCode(v, "制造单位统一社会信用代码格式不正确;", rowError)); Optional.ofNullable(data.getProduceUnitCreditCode()).ifPresent(v -> checkCreditCode(v, "制造单位统一社会信用代码格式不正确;", rowError));
...@@ -957,7 +1067,24 @@ public class DataDockServiceImpl { ...@@ -957,7 +1067,24 @@ public class DataDockServiceImpl {
String rule25 = "^[\\u4e00-\\u9fa5][A-Z]{2}[0-9]{1}:[0-9]{3}$"; String rule25 = "^[\\u4e00-\\u9fa5][A-Z]{2}[0-9]{1}:[0-9]{3}$";
boolean flage25 = Pattern.matches(rule25, useOrgCode); boolean flage25 = Pattern.matches(rule25, useOrgCode);
return flage01 || flage02 || flage03 || flage04 || flage05 || flage06 || flage07 || flage08 || flage09 || flage10 || flage11 || flage12 || flage13 || flage14 || flage15 || flage16 || flage17 || flage18 || flage19 || flage20 || flage21 || flage22 || flage23 || flage24 || flage25; // 起1100001(21)
String rule26 = "^[\\u4e00-\\u9fa5][A-Z0-9]{7}\\(\\d{2}\\)$";
boolean flage26 = Pattern.matches(rule26, useOrgCode);
// 梯12秦汉0750(SLT03159-2020)(21)
String rule27 = "^[\\u4e00-\\u9fa5][0-9A-Z]{2}[\\u4e00-\\u9fa5]{1,2}[0-9]{4}\\([A-Z0-9]{4,8}-[A-Z0-9]{4}\\)\\(\\d{2}\\)$";
boolean flage27 = Pattern.matches(rule27, useOrgCode);
// G-01-T-003548
String rule28 = "^[a-zA-Z]{1}-[0-9]{2}-[A-Z]-\\d{6}$";
boolean flage28 = Pattern.matches(rule28, useOrgCode);
// 客1LS0013
String rule29 = "^[\\u4e00-\\u9fa5]{1}[0-9]{1}[A-Z]{1,2}[0-9]{4}$";
boolean flage29 = Pattern.matches(rule29, useOrgCode);
return flage01 || flage02 || flage03 || flage04 || flage05 || flage06 || flage07 || flage08 || flage09 || flage10 || flage11 || flage12 || flage13 || flage14 || flage15 || flage16 || flage17 || flage18 || flage19 || flage20 || flage21 || flage22 || flage23 || flage24 || flage25 || flage26 || flage27 || flage28 || flage29;
} }
...@@ -981,9 +1108,13 @@ public class DataDockServiceImpl { ...@@ -981,9 +1108,13 @@ public class DataDockServiceImpl {
for (int i = 0; i < totalSize; i += batchSize) { for (int i = 0; i < totalSize; i += batchSize) {
List<EquipInfoExcelDto> batch = equipInfoExcelDtos.subList(i, Math.min(totalSize, i + batchSize)); List<EquipInfoExcelDto> batch = equipInfoExcelDtos.subList(i, Math.min(totalSize, i + batchSize));
try { try {
CompletableFuture.allOf(batch.stream().map(equ -> CompletableFuture.runAsync(() -> this.saveEquipmentDataInTransaction(JSON.parseObject(JSON.toJSONString(equ), Map.class), "jg_his", remark))).toArray(CompletableFuture[]::new)).join(); CompletableFuture.allOf(batch.stream().map(equ -> CompletableFuture.runAsync(
() -> this.saveEquipmentDataInTransaction((Map<String, Object>) JSON.parseObject(JSON.toJSONString(equ), Map.class), "jg_his", remark)
)
).toArray(CompletableFuture[]::new)).join();
} catch (Exception e) { } catch (Exception e) {
log.error("数据上传,保存设备数据失败: ", e); log.error("数据上传,保存设备数据失败: {}", e.getMessage());
throw new BadRequest("数据上传,保存设备数据失败!");
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment