Commit ccee761a authored by 麻笑宇's avatar 麻笑宇

Merge remote-tracking branch 'origin/develop_tzs_register' into develop_tzs_register

# Conflicts: # amos-boot-system-tzs/amos-boot-module-jg/amos-boot-module-jg-api/src/main/java/com/yeejoin/amos/boot/module/jg/api/mapper/JgUseRegistrationMapper.java
parents f3fb7805 d1c567cb
......@@ -134,6 +134,9 @@ public class ESEquipmentCategoryDto {
@Field(type = FieldType.Text)
private String WHETHER_SKID_MOUNTED_PRESSURE_VESSEL;
@Field(type = FieldType.Text)
private String CYLINDER_CATEGORY;
/**
* 问题状态
*/
......
......@@ -26,7 +26,7 @@ public enum UserPostEnum {
//质量保证体系人员(非字典表字段,后期修改code)
ZLBZTXRY("质量保证体系人员","nullnull","1,3,4"),
ZLBZTXRY("质量保证体系人员","6619","1,3,4"),
;
String name;
......
package com.yeejoin.amos.boot.module.jg.api.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class CylinderCategoryConverter implements Converter<String> {
private static final String LPG_CYLINDER = "液化石油气瓶";
private static final String INDUSTRY_CYLINDER = "工业气瓶";
private static final String OTHER = "其他";
@Override
public Class<?> supportJavaTypeKey() {
// 实体类中对象属性类型
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty,
GlobalConfiguration globalConfiguration) {
// 从Cell中读取数据
String cellValue = cellData.getStringValue();
// 判断Excel中的值,将其转换为预期的数值
if (LPG_CYLINDER.equals(cellValue)) {
return "0";
} else if (INDUSTRY_CYLINDER.equals(cellValue)) {
return "1";
}else if (OTHER.equals(cellValue)){
return "2";
}
return null;
}
@Override
public CellData convertToExcelData(String o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
// 判断实体类中获取的值,转换为Excel预期的值,并封装为CellData对象
if (o == null) {
return new CellData("");
} else if (o.equals("0")) {
return new CellData(LPG_CYLINDER);
} else if (o.equals("1")) {
return new CellData(INDUSTRY_CYLINDER);
}else if (o.equals("2")) {
return new CellData(OTHER);
}
return new CellData("");
}
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.jg.api.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class InformationSituationConverter implements Converter<String> {
private static final String TYPE_QR_CODE = "二维码";
private static final String TYPE_STAMP = "电子标签";
private static final String TYPE_NO = "无";
@Override
public Class<?> supportJavaTypeKey() {
// 实体类中对象属性类型
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty,
GlobalConfiguration globalConfiguration) {
// 从Cell中读取数据
String cellValue = cellData.getStringValue();
// 判断Excel中的值,将其转换为预期的数值
if (TYPE_QR_CODE.equals(cellValue)) {
return "1";
} else if (TYPE_STAMP.equals(cellValue)) {
return "2";
}
return "99";
}
@Override
public CellData convertToExcelData(String o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
// 判断实体类中获取的值,转换为Excel预期的值,并封装为CellData对象
if (o == null) {
return new CellData("");
} else if (o.equals("1")) {
return new CellData(TYPE_QR_CODE);
} else if (o.equals("2")) {
return new CellData(TYPE_STAMP);
}
return new CellData(TYPE_NO);
}
}
\ No newline at end of file
......@@ -168,4 +168,7 @@ public class JgUseRegistrationDto extends BaseDto {
@ApiModelProperty(value = "工程装置名称")
private String projectContraption;
@ApiModelProperty(value = "气瓶类别(0液化石油气瓶、1工业气瓶、2其他)")
private String cylinderCategory;
}
......@@ -246,4 +246,13 @@ public class JgUseRegistration extends BaseEntity {
*/
@TableField("project_contraption")
private String projectContraption;
/**
* 气瓶类别(液化石油气瓶、工业气瓶、其他)
* 0:液化石油气瓶
* 1:工业气瓶
* 2:其他
*/
@TableField("cylinder_category")
private String cylinderCategory;
}
......@@ -95,6 +95,16 @@ public interface JgUseRegistrationMapper extends BaseMapper<JgUseRegistration> {
List<Map<String, Object>> getCylinderInfoList(@Param("records") List<String> records);
/**
* 批量更新 CYLINDER_CATEGORY 根据 equCode
*
* @param cylinderCategory 需要更新的参数列表
* @param equCodeList equCode列表
* @return 更新成功返回 true,失败返回 false
*/
Boolean updateByEquCodeList(@Param("cylinderCategory") String cylinderCategory, @Param("equCodeList") List<String> equCodeList);
List<Map> stopStateCount(@Param("orgCode") String orgCode);
List<Map> cancelStateCount(@Param("orgCode") String orgCode, @Param("cancelType") int cancelType);
......
......@@ -210,7 +210,8 @@
ibjui.USE_INNER_CODE as useInnerCode,
ibjui.LONGITUDE_LATITUDE as longitudeLatitude,
ibjui.FACTORY_USE_SITE_STREET as factoryUseSiteStreet
FROM "idx_biz_jg_use_info" ibjui left join tzs_user_info tzi on ibjui."PHONE" = tzi."phone" where RECORD = #{id}
FROM "idx_biz_jg_use_info" ibjui left join tzs_user_info tzi on ibjui."PHONE" = tzi."phone"
where RECORD = #{id} AND tzi.is_delete = 'f'
</select>
<select id="getEquipListPage" resultType="java.util.Map">
SELECT jri.EQU_CODE as equCode,
......@@ -873,4 +874,19 @@
LEFT JOIN idx_biz_jg_factory_info fi on ri."RECORD" = fi."RECORD"
LEFT JOIN idx_biz_jg_tech_params_vessel pv ON pv."RECORD" = ui."RECORD"
</sql>
<update id="updateByEquCodeList" parameterType="java.util.Map">
UPDATE "tzs_jg_use_registration" tjur
SET tjur."cylinderCategory" = #{cylinderCategory}
WHERE tjur."sequence_nbr" IN (
SELECT tjure."equip_transfer_id"
FROM "tzs_jg_use_registration_eq" tjure
LEFT JOIN idx_biz_jg_register_info ri ON ri."RECORD" = tjure."equ_id"
WHERE ri."EQU_CODE" IN
<foreach collection="equCodeList" separator="," item="equCode" open="(" close=")">
#{equCode}
</foreach>
)
</update>
</mapper>
......@@ -177,7 +177,7 @@ public class PressureVesselListener extends AnalysisEventListener<EquipInfoCylin
}
private void checkInspectOrg(String inspectOrgCode){
List<Map<String, Object>> InspectOrgList = commonService.getAllInspectionInfo("inspection");
List<Map<String, Object>> InspectOrgList = commonService.getAllInspectionInfo("检验检测机构");
if (findUseCode(InspectOrgList, inspectOrgCode) == null) {
result.append("未查询到该检验机构");
}
......
......@@ -10,6 +10,7 @@ import com.yeejoin.amos.boot.module.jg.api.dto.JgChangeRegistrationNameDto;
import com.yeejoin.amos.boot.module.jg.api.dto.JgUseRegistrationManageDto;
import com.yeejoin.amos.boot.module.jg.api.enums.WorkFlowStatusEnum;
import com.yeejoin.amos.boot.module.jg.biz.service.impl.JgChangeRegistrationNameServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.common.StringUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -91,7 +92,6 @@ public class JgChangeRegistrationNameController extends BaseController {
@PostMapping(value = "/flowExecute")
@ApiOperation(httpMethod = "POST", value = "执行流程", notes = "执行流程")
public ResponseModel<Object> flowExecute(@RequestBody JSONObject map) {
LinkedHashMap model1 = (LinkedHashMap) map.get("model");
LinkedHashMap jgRegistrationInfoMap = (LinkedHashMap) model1.get("jgRegistrationInfo");
JgChangeRegistrationNameDto jgScrapCancelDto = JSON.parseObject(JSON.toJSONString(jgRegistrationInfoMap), JgChangeRegistrationNameDto.class);
......@@ -99,11 +99,16 @@ public class JgChangeRegistrationNameController extends BaseController {
jgChangeRegistrationNameService.flowExecute(Long.valueOf(String.valueOf(jgScrapCancelDto.getSequenceNbr())),
jgScrapCancelDto.getInstanceId(),
String.valueOf(map.get("operate")),
String.valueOf(map.get("remark")),
this.getComment(map),
String.valueOf(map.get("nextTaskId")));
return ResponseHelper.buildResponse("ok");
}
private String getComment(JSONObject map){
// 驳回(opinion)和通过(remark)字段不一样 ,兼容修改
return StringUtil.isNotEmpty(map.getString("remark")) ? map.getString("remark") : map.getString("opinion");
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "POST", value = "列表全部数据查询", notes = "列表全部数据查询")
@PostMapping(value = "/getList")
......
......@@ -287,4 +287,20 @@ public class JgUseRegistrationController extends BaseController {
map.put("useUnitCreditCode", useUnitCreditCode);
return ResponseHelper.buildResponse(jgUseRegistrationServiceImpl.queryByRegistrationCode(map));
}
/**
* 根据equCode更新气瓶分类历史数据
* @param cylinderCategory 气瓶类别(0:液化石油气瓶、1:工业气瓶、2其他)
* @param equCodeList 设备代码集合
* @return o
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/updateCylinderCategory")
@ApiOperation(httpMethod = "POST", value = "根据equCode更新气瓶分类历史数据", notes = "根据equCode更新气瓶分类历史数据")
public ResponseModel<Object> handleErrorForm(@RequestParam("cylinderCategory") String cylinderCategory,
@RequestParam("equCodeList") List<String> equCodeList) {
return ResponseHelper.buildResponse(jgUseRegistrationServiceImpl.updateCylinderCategoryByEquCodeBatch(cylinderCategory, equCodeList));
}
}
......@@ -791,7 +791,7 @@ public class CommonServiceImpl implements ICommonService {
@Override
public List<Map<String, Object>> getAllInspectionInfo(String type) {
List<Map<String, Object>> unitList = new ArrayList<>();
if ("inspection".equals(type)) {
if ("检验检测机构".equals(type)) {
Systemctl.dictionarieClient.dictValues("OLD_INSPECTION_TESTING_UNIT").getResult()
.forEach(x -> convertAndAddToUnitList(x, unitList));
}
......@@ -964,11 +964,15 @@ public class CommonServiceImpl implements ICommonService {
}
map.put("supervisoryCode", ImageUtils.generateQRCode(Optional.ofNullable(map.get("applyNo")).orElse("").toString(), 100, 100));
map.put("printingType", PrintingTypeEnum.REGULAR.getCode());
map.put("printingType", PrintingTypeEnum.OVERPLAY.getCode());
String manageType = Optional.ofNullable(map.get("manageType")).orElse("").toString();
String templateFileName = "use-registration-model.ftl";
if ("unit".equals(manageType)) {
templateFileName = "unit-use-registration-model.ftl";
}
File file = null;
try (ServletOutputStream out = response.getOutputStream()) {
file = WordTemplateUtils.createDoc("/templates/use-registration-model.ftl", map, configuration.getTemplate("use-registration-model.ftl", "UTF-8"));
file = WordTemplateUtils.createDoc("/templates/use-registration-model.ftl", map, configuration.getTemplate(templateFileName, "UTF-8"));
try (InputStream fin = Files.newInputStream(file.toPath())) {
response.setCharacterEncoding("utf-8");
......
......@@ -499,7 +499,10 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
equipInfoMap.put("EQU_CODE_TYPE", "1");
equipInfoMap.put("SUPERVISORY_CODE", null);
equipInfoMap.put("CAR_NUMBER", null);
equIpClassMap.put("CAR_NUMBER", null);
// 气瓶的部分信息赋空
equipInfoMap.put("INFORMATION_SITUATION", null);
equipInfoMap.put("INFORMATION_MANAGE_CODE", null);
equipInfoMap.put("CYLINDER_STAMP_ATTACHMENT", null);
}
return resultMap;
}
......@@ -984,9 +987,11 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
if (!ValidationUtil.isEmpty(fieldType)) {
otherInfoMap = Bean.BeantoMap(otherInfo);
otherInfoMap.put("otherinfoSeq", otherInfo.getSequenceNbr());
otherInfoMap.put("cylinderStampAttachment", JSON.parse(otherInfo.getCylinderStampAttachment()));
} else {
otherInfoMap = convertCamelToUnderscore(otherInfo, null);
otherInfoMap.put("OTHERINFO_SEQ", otherInfo.getSequenceNbr());
otherInfoMap.put("CYLINDER_STAMP_ATTACHMENT", JSON.parse(otherInfo.getCylinderStampAttachment()));
}
if (!otherInfoMap.isEmpty()) {
Map<String, Object> filterMap = otherInfoMap.entrySet()
......@@ -2368,6 +2373,9 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
// 96333码和监管码置空
otherInfo.setCode96333(null);
otherInfo.setSupervisoryCode(null);
otherInfo.setCylinderStampAttachment(null);
otherInfo.setInformationSituation(null);
otherInfo.setInformationManageCode(null);
}
iIdxBizJgOtherInfoService.saveOrUpdateData(otherInfo);
......@@ -2678,9 +2686,9 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
factoryNumList.clear();
try {
EasyExcel.read(multipartFile.getInputStream(), EquipInfoCylinderExcelDto.class, new AnalysisEventListener<EquipInfoCylinderExcelDto>() {
// 每读取一行就调用该方法
@Override
public void invoke(EquipInfoCylinderExcelDto data, AnalysisContext context) {
// 每读取一行就调用该方法
@Override
public void invoke(EquipInfoCylinderExcelDto data, AnalysisContext context) {
EquipInfoCylinderExcelDto fireExperts = new EquipInfoCylinderExcelDto();
BeanUtils.copyProperties(data, fireExperts);
resultError.add(checkExcelData(data, context).toString());
......@@ -2820,6 +2828,7 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
registerInfo.setProductPhoto(productPhoto);
registerInfo.setOtherAccessoriesReg(otherAccessoriesReg);
registerInfo.setUseOrgCode(equipInfoDto.getUseOrgCode());
registerInfo.setCylinderCategory(data.getCylinderCategory());
if ("his".equals(equipInfoDto.getDataSource())) {
registerInfo.setEquCode(this.getEquCode(registerInfo, factoryInfo, equipInfoDto.getReceiveOrgCode()));
}
......@@ -2843,10 +2852,12 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
inspectionDetectionInfoList.add(inspectionDetectionInfo);
// 其他信息
String cylinderStampAttachment = getUrlByKey(fileDataList, "CYLINDER_STAMP_ATTACHMENT");
IdxBizJgOtherInfo otherInfo = new IdxBizJgOtherInfo();
BeanUtils.copyProperties(data, otherInfo);
otherInfo.setRecord(record);
otherInfo.setRecDate(new Date());
otherInfo.setCylinderStampAttachment(cylinderStampAttachment);
if ("his".equals(equipInfoDto.getDataSource())) {
otherInfo.setSupervisoryCode(this.getSupervisoryCode(equipInfoDto.getPossession(), registerInfo));
otherInfo.setClaimStatus("已认领");
......@@ -3068,8 +3079,12 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
checkNotBlank(data.getProduceUnitName(), "制造单位名称不能为空;", result);
checkNotBlank(data.getProduceLicenseNum(), "制造许可编号不能为空;", result);
checkNotBlank(data.getFactoryNum(), "出厂编号/产品编码不能为空;", result);
if ("0".equals(data.getWhetherVehicleCylinder()) && factoryNumList.contains(data.getFactoryNum()))
result.append("出厂编号/产品编码不能重复;");
if ("0".equals(data.getWhetherVehicleCylinder())) {
if (factoryNumList.contains(data.getFactoryNum())) {
result.append("出厂编号/产品编码不能重复;");
}
checkNotBlank(data.getCylinderCategory(), "气瓶分类不能为空;", result);
}
checkFactoryNumUniqueness(data.getFactoryNum(), null, result);
checkNotBlank(data.getProduceDate(), "制造日期不能为空;", result);
Optional.ofNullable(data.getProduceDate()).ifPresent(v -> checkDateFormatCorrect(v, "制造日期格式不正确;", result));
......@@ -3082,6 +3097,9 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
checkNotBlank(data.getSingleBottleVolume(), "单瓶容积不能为空;", result);
checkNotBlank(data.getChargingMedium(), "充装介质不能为空;", result);
checkNotBlank(data.getNominalWorkingPressure(), "公称工作压力不能为空;", result);
checkNotBlank(data.getInformationSituation(), "信息化管理情况(二维码、电子标签、无)不能为空;", result);
// 信息化管理情况校验
checkInformatManageInfo(data, result);
// 如果存在错误信息,则抛出 BadRequest 异常
if (result.length() > 0) {
result.insert(0, "Excel第[" + rowIndex + "]行 -> ");
......@@ -3094,6 +3112,13 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
return result;
}
private void checkInformatManageInfo(EquipInfoCylinderExcelDto data, StringBuilder result) {
// 非车用气瓶时(0)时且信息化管理情况非无时检验二维码编号/电子标签编号必填
if(data.getInformationSituation() != null && !"99".equals(data.getInformationSituation()) && "0".equals(data.getWhetherVehicleCylinder())){
checkNotBlank(data.getInformationManageCode(), "二维码编号/电子标签编号不能为空;", result);
}
}
private void checkEquCodeUniqueness(String equCode, StringBuilder result) {
// 根据设备代码检查唯一性
LambdaQueryWrapper<RegistrationInfo> wrapper = new LambdaQueryWrapper<>();
......@@ -3112,7 +3137,7 @@ public class IdxBizJgRegisterInfoServiceImpl extends BaseService<IdxBizJgRegiste
}
private void checkInspectOrg(String inspectOrgCode, StringBuilder result) {
List<Map<String, Object>> InspectOrgList = commonService.getAllInspectionInfo("inspection");
List<Map<String, Object>> InspectOrgList = commonService.getAllInspectionInfo("检验检测机构");
if (findUseCode(InspectOrgList, inspectOrgCode) == null) {
result.append("未查询到该检验机构;");
}
......
......@@ -29,9 +29,11 @@ import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgRegisterInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.mapper.IdxBizJgOtherInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper;
import com.yeejoin.amos.component.feign.utils.FeignUtil;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.CompanyModel;
import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
import com.yeejoin.amos.feign.systemctl.model.TaskV2Model;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO;
......@@ -100,6 +102,8 @@ public class JgChangeVehicleRegistrationUnitServiceImpl extends BaseService<JgCh
@Autowired
private IdxBizJgOtherInfoMapper otherInfoMapper;
private volatile Map<String, Object> fillingMediumMap;
public void changeData(JgChangeVehicleRegistrationUnit dto, CompanyBo company) {
if (!ObjectUtils.isEmpty(dto.getReceiveCompanyCode())) {
......@@ -713,6 +717,9 @@ public class JgChangeVehicleRegistrationUnitServiceImpl extends BaseService<JgCh
if (!ObjectUtils.isEmpty(registrationManage) && !ObjectUtils.isEmpty(registrationManage.getCarNumber())) {
a.put("carNumber", registrationManage.getCarNumber());
}
if(!ObjectUtils.isEmpty(registrationManage.getCarNumber())){
a.put("chargingMedium", getFillingMediumMap().get(a.getOrDefault("chargingMedium", "") + ""));
}
});
map.put("dataList", equList);
// 组件回显
......@@ -723,6 +730,20 @@ public class JgChangeVehicleRegistrationUnitServiceImpl extends BaseService<JgCh
return map;
}
private Map<String, Object> getFillingMediumMap() {
if (fillingMediumMap == null) {
synchronized (this) {
if (fillingMediumMap == null) {
List<DictionarieValueModel> fillingMedium = FeignUtil.remoteCall(() -> Systemctl.dictionarieClient.dictValues("FILLING_MEDIUM"));
fillingMediumMap = fillingMedium.stream().collect(Collectors.toMap(DictionarieValueModel::getDictDataKey, DictionarieValueModel::getDictDataValue));
}
return fillingMediumMap;
}
}
return fillingMediumMap;
}
@Transactional(rollbackFor = Exception.class)
public Boolean deleteMessage(String sequenceNbr) {
JgChangeVehicleRegistrationUnit jgChangeVehicleRegistrationUnit = this.baseMapper.selectById(sequenceNbr);
......
......@@ -19,6 +19,7 @@ import com.yeejoin.amos.boot.module.ymt.api.common.StringUtil;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgMaintenanceRecordInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgUseInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.EquipmentCategoryEnum;
import org.apache.commons.io.IOUtils;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.elasticsearch.action.search.SearchRequest;
......@@ -393,9 +394,15 @@ public class JgUseRegistrationManageServiceImpl extends BaseService<JgUseRegistr
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.trackTotalHits(true);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 且登记证筛选
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("USE_ORG_CODE", useOrgCodes);
boolQuery.must(termsQuery);
// 且已认领状态
boolQuery.must(QueryBuilders.termQuery("STATUS", EquipmentCategoryEnum.YRL.getName()));
// 且已纳管状态
boolQuery.must(QueryBuilders.termQuery("IS_INTO_MANAGEMENT", true));
// 设备状态 对应枚举EquimentEnum
if (!ObjectUtils.isEmpty(enableType)) {
......
......@@ -40,10 +40,7 @@ import com.yeejoin.amos.boot.module.jg.biz.service.IIdxBizJgInspectionDetectionI
import com.yeejoin.amos.boot.module.jg.biz.utils.CodeUtil;
import com.yeejoin.amos.boot.module.ymt.api.common.StringUtil;
import com.yeejoin.amos.boot.module.ymt.api.entity.*;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.EquCodeTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.EquimentEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.*;
import com.yeejoin.amos.boot.module.ymt.api.mapper.*;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
......@@ -334,7 +331,8 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
this.updateOrCreateInspectionDetection(map);
// 更新注册登记信息表
LambdaUpdateWrapper<IdxBizJgRegisterInfo> IdxBizJgRegLambda = new UpdateWrapper<IdxBizJgRegisterInfo>().lambda();
IdxBizJgRegLambda.eq(IdxBizJgRegisterInfo::getRecord, map.get("equipId")).set(IdxBizJgRegisterInfo::getRegisterState, this.getRegCode());
IdxBizJgRegLambda.eq(IdxBizJgRegisterInfo::getRecord, map.get("equipId"))
.set(IdxBizJgRegisterInfo::getRegisterState, this.getRegCode()).set(IdxBizJgRegisterInfo::getCylinderCategory, map.get("cylinderCategory"));
idxBizJgRegisterInfoService.update(IdxBizJgRegLambda);
// 更新设备监管部门
IdxBizJgSupervisionInfo idxBizJgSupervisionInfo = new IdxBizJgSupervisionInfo();
......@@ -705,6 +703,7 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
useRegistration.setPromoter(reginParams.getUserModel().getUserId());
useRegistration.setCreateUserId(reginParams.getUserModel().getUserId());
useRegistration.setCreateUserName(reginParams.getUserModel().getUserName());
useRegistration.setCylinderCategory(map.getString("cylinderCategory"));//气瓶分类
// 使用单位信息
useRegistration.setUseUnitName(CompanyTypeEnum.INDIVIDUAL.getName().equals(company.getCompanyType()) ?
company.getCompanyName().split("_")[1] : company.getCompanyName());
......@@ -1409,6 +1408,7 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
param.put("USC_UNIT_NAME", "");
param.put("EQU_CODE", dataMap.get("equCode"));
param.put("USE_ORG_CODE", jgUseRegistration.getUseRegistrationCode());
param.put("CYLINDER_CATEGORY", dataMap.get("cylinderCategory"));
objMap.put((String) dataMap.get("equipId"), param);
tzsServiceFeignClient.commonUpdateEsDataByIds(objMap);
}
......@@ -2079,14 +2079,29 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
int end = ((current - 1) * size + size) < total ? (current - 1) * size + size : (int) total;
// 数据截取
List<Object> equData = equipmentLists.subList(start, end);
Map<String, String> recordInformationMap = this.getInformationManageInfo(equData);
// 设备数据填充
this.fillInCylinderEquData(exportParamsMap, equData, size);
this.fillInCylinderEquData(exportParamsMap, equData, size, recordInformationMap);
return commonService.generateSummaryOfCylinderInfo(exportParamsMap, wordPath, filePrefix);
})).collect(Collectors.toList());
CompletableFuture.allOf(futures.toArray(new CompletableFuture[page])).join();
return futures;
}
private Map<String, String> getInformationManageInfo(List<Object> equData) {
List<String> records = new ArrayList<>();
equData.forEach(e->{
JSONObject jsonObject = (JSONObject)e;
String record = jsonObject.getString("record");
records.add(record);
});
LambdaQueryWrapper<IdxBizJgOtherInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.select(IdxBizJgOtherInfo::getRecord,IdxBizJgOtherInfo::getInformationSituation);
wrapper.in(IdxBizJgOtherInfo::getRecord, records);
List<IdxBizJgOtherInfo> jgOtherInfos = otherInfoMapper.selectList(wrapper);
return jgOtherInfos.stream().collect(Collectors.toMap(IdxBizJgOtherInfo::getRecord, d-> InformationManageTypeEnum.getName(d.getInformationSituation()),(k1, k2) ->k2));
}
/**
* 压力管道数据
*
......@@ -2140,14 +2155,16 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
/**
* 气瓶设备数据填充
*/
public void fillInCylinderEquData(Map<String, Object> exportParamsMap, List<Object> equData, int size) {
private void fillInCylinderEquData(Map<String, Object> exportParamsMap, List<Object> equData, int size, Map<String, String> recordInformationMap) {
String[] fieldNames = {"equDefineName", "factoryNum", "chargingMedium",
"produceUnitName", "produceDate", "nominalWorkingPressure",
"singleBottleVolume", "inspectDate", "nextInspectDate", "useInnerCode"};
"singleBottleVolume", "inspectDate", "nextInspectDate", "useInnerCode","informationSituation"};
// 填充有效数据
for (int curr = 0; curr < equData.size(); curr++) {
JSONObject obj = (JSONObject) equData.get(curr);
// 新增字段信息化管理情况
obj.put("informationSituation", recordInformationMap.get(obj.getString("record")));
int serialNum = curr + 1;
for (String fieldName : fieldNames) {
exportParamsMap.put(fieldName + serialNum, ValidationUtil.isEmpty(obj.get(fieldName)) ? "" : obj.get(fieldName));
......@@ -2862,7 +2879,7 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
useInfo.setIsNotXiXian(String.valueOf(map.get("isXixian")));
useInfo.setEstateUnitCreditCode(String.valueOf(map.get("estateUnitName")).split("_")[0]);
useInfo.setEstateUnitName(String.valueOf(map.get("estateUnitName")).split("_")[1]);
useInfo.setPhone(String.valueOf(map.get("safetyManager")).split("_")[0]);
useInfo.setPhone(String.valueOf(map.get("phone")));
useInfo.setSafetyManager(String.valueOf(map.get("safetyManager")).split("_")[1]);
useInfo.setUseDate(String.valueOf(map.get("useDate")));
useInfo.setLongitudeLatitude(JSON.toJSONString(map.get("longitudeLatitude")));
......@@ -3236,4 +3253,12 @@ public class JgUseRegistrationServiceImpl extends BaseService<JgUseRegistrationD
}
}
@Transactional
public Object updateCylinderCategoryByEquCodeBatch(String cylinderCategory, List<String> equCodeList) {
if (idxBizJgRegisterInfoMapper.updateCylinderCategoryByEquCodeBatch(cylinderCategory, equCodeList)){
return this.baseMapper.updateByEquCodeList(cylinderCategory, equCodeList);
}
return true;
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.tcm.api.service;
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.module.tcm.api.dto.GroupAndPersonInfoDto;
import com.yeejoin.amos.boot.module.tcm.api.dto.TzIndividualityDto;
import com.yeejoin.amos.boot.module.tcm.api.dto.TzsEquipListDto;
......@@ -35,6 +36,8 @@ public interface ITzsUserInfoService extends IService<TzsUserInfo> {
Map<String,Object> getCompanyType();
Map<String,Object> getCompanyTypeForRedis(ReginParams selectedOrgInfo);
Page<TzsEquipListDto> getEquipList(String type,String userSeq,TzsEquipListDto dto, Page<TzsEquipListDto> page);
Boolean equipBind(String type, String userSeq, String creditCode, Map<String,Object> map);
......
......@@ -43,6 +43,12 @@ public class TzsUserInfoVo {
private JSONArray post;
/**
* 岗位 (后期post迁移数组至此)
*/
@TableField("new_post")
private JSONArray newPost;
/**
* 联系电话
*/
@TableField("phone")
......
......@@ -49,9 +49,9 @@
</if>
<if test="dto.menuTypeUnderPost != null and dto.menuTypeUnderPost.size() > 0">
AND (
<foreach collection="dto.menuTypeUnderPost" separator="or" item="postType">
post like concat('%',#{postType},'%')
</foreach>
<foreach collection="dto.menuTypeUnderPost" separator="or" item="postType">
new_post like concat('%',#{postType},'%')
</foreach>
)
</if>
<if test="dto.postName != '' and dto.postName != null">
......
......@@ -181,6 +181,14 @@ public class TzsUserInfoController extends BaseController {
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/getCompanyTypeForRedis")
@ApiOperation(httpMethod = "GET", value = "从redis获取当前登录用户单位类型获取,避免多角色的单位获取到多个单位类型", notes = "从redis获取当前登录用户单位类型获取,避免多角色的单位获取到多个单位类型")
public ResponseModel<Map<String, Object>> getCompanyTypeForRedis() {
ReginParams selectedOrgInfo = getSelectedOrgInfo();
return ResponseHelper.buildResponse(tzsUserInfoService.getCompanyTypeForRedis(selectedOrgInfo));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/getUserType")
@ApiOperation(httpMethod = "GET", value = "根据单位类型获取人员类型", notes = "根据单位类型获取人员类型")
public ResponseModel<List<Map<String, Object>>> getUserType(@RequestParam(value = "unitType") String unitType) {
......
......@@ -109,7 +109,7 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
// 安全总监管理
menuMap.put("aqzj", Collections.singletonList("6547"));
// 质量保证体系人员管理
menuMap.put("zlbztxry", Arrays.asList("6551","6550"));
menuMap.put("zlbztxry", Collections.singletonList("6619"));
// 质量安全员管理
menuMap.put("zlaqy", Collections.singletonList("6551"));
// 质量安全总监管理
......@@ -119,12 +119,17 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
// 检验人员管理
menuMap.put("jyry", Collections.singletonList("66151"));
// 其他人员管理
menuMap.put("qtry", Arrays.asList("6546","6617","6553"));
menuMap.put("qtry", Collections.singletonList("6546"));
}
@Override
public Page<TzsUserInfoDto> page(TzsUserInfoDto dto, Page<TzsUserInfoDto> page) {
dto.setMenuTypeUnderPost(menuMap.get(dto.getMenuType()));
// 其他人员管理 包含 普通员工、安全管理员、安改维负责人
// 上面menuMap中的其他人员只是在新增人员时为页面赋默认值
if ("qtry".equals(dto.getMenuType())){
dto.setMenuTypeUnderPost(Arrays.asList("6546","6617","6553"));
}
Page<TzsUserInfoDto> tzsUserInfoDtoPage = tzsUserInfoMapper.selectPageMessage(page, dto);
tzsUserInfoDtoPage.getRecords().forEach(item -> {
if (!ObjectUtils.isEmpty(item.getProfile())) {
......@@ -247,6 +252,9 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
if (!ObjectUtils.isEmpty(tzsUserInfo.getPost())) {
tzsUserInfoVo.setPost(JSON.parseArray(tzsUserInfo.getPost()));
}
if (!ObjectUtils.isEmpty(tzsUserInfo.getNewPost())) {
tzsUserInfoVo.setNewPost(JSON.parseArray(tzsUserInfo.getNewPost()));
}
if (!ObjectUtils.isEmpty(tzsUserInfo.getEquipType())) {
tzsUserInfoVo.setEquipType(JSON.parseArray(tzsUserInfo.getEquipType()));
}
......@@ -477,6 +485,50 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
}
@Override
public Map<String, Object> getCompanyTypeForRedis(ReginParams selectedOrgInfo) {
Map<String, Object> result = new HashMap<>();
result.put("companyType", null);
CompanyBo company = selectedOrgInfo.getCompany();
if (ObjectUtils.isEmpty(company)) {
return result;
}
result.put("creditCode", company.getCompanyCode());
boolean productCompany = false;
boolean useCompany = false;
boolean installCompany = false;
boolean inspectionCompany = false;
String companyType = company.getCompanyType();
if (companyType.contains("使用单位") || companyType.contains("个人主体")) {
useCompany = true;
}
if (companyType.contains("充装单位") || companyType.contains("安装改造维修单位") || companyType.contains("制造单位") || companyType.contains("设计单位")) {
productCompany = true;
}
if (companyType.contains("安装改造维修单位")) {
installCompany = true;
}
if (companyType.contains("检验检测机构")) {
inspectionCompany = true;
}
StringBuilder companyTypeStr = new StringBuilder();
if (useCompany) {
companyTypeStr.append("use-");
}
if (productCompany) {
companyTypeStr.append("pro-");
}
if (installCompany) {
companyTypeStr.append("install-");
}
if (inspectionCompany) {
companyTypeStr.append("inspection");
}
result.put("companyType", companyTypeStr);
return result;
}
@Override
public Page<TzsEquipListDto> getEquipList(String type, String userSeq, TzsEquipListDto dto, Page<TzsEquipListDto> page) {
List<CompanyModel> companyModels = FeignUtil.remoteCall(() -> Privilege.companyClient.queryListByChild(RequestContext.getExeUserId()));
if (companyModels.isEmpty()) {
......@@ -779,7 +831,7 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
tzsUserInfo.setAppointDoc(tzsUserInfo.getAppointDoc());
tzsUserInfo.setRecDate(new Date());
// 兼容前端只传一个值,并且非json类型的情况
JSONArray postArray = JSONArray.parseArray(this.isJSONValid(tzsUserInfo.getPost()) ? tzsUserInfo.getPost() : "[\"" + tzsUserInfo.getPost() + "\"]");
JSONArray postArray = JSONArray.parseArray(this.isJSONValid(tzsUserInfo.getNewPost()) ? tzsUserInfo.getNewPost() : "[\"" + tzsUserInfo.getNewPost() + "\"]");
tzsUserInfo.setNewPost(JSONArray.toJSONString(postArray));
// 兼容 人员类型为【作业人员】且 【作业项目】含有【电梯修理】项目的为【维保人员】post为“6618”
JSONArray permissionData6552 = tzsUserInfo.getPermissionData6552();
......@@ -791,7 +843,7 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
}
}
tzsUserInfo.setPost(JSONArray.toJSONString(postArray));
tzsUserInfo.setPostName(this.setPostName(tzsUserInfo.getPost()));
tzsUserInfo.setPostName(this.setPostName(tzsUserInfo.getNewPost()));
tzsUserInfo = this.createWithModel(tzsUserInfo);
// 保存资质
tzsUserPermissionServiceImpl.savePermissionData(tzsUserInfo);
......@@ -842,7 +894,7 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
tzsUserInfoDto.setSequenceNbr(rowId);
tzsUserInfoDto.setRecDate(new Date());
// 兼容前端只传一个值,并且非json类型的情况
JSONArray postArray = JSONArray.parseArray(this.isJSONValid(tzsUserInfoDto.getPost()) ? tzsUserInfoDto.getPost() : "[\"" + tzsUserInfoDto.getPost() + "\"]");
JSONArray postArray = JSONArray.parseArray(this.isJSONValid(tzsUserInfoDto.getNewPost()) ? tzsUserInfoDto.getNewPost() : "[\"" + tzsUserInfoDto.getNewPost() + "\"]");
tzsUserInfoDto.setNewPost(JSONArray.toJSONString(postArray));
// 兼容 人员类型为【作业人员】且 【作业项目】含有【电梯修理】项目的为【维保人员】post为“6618”
JSONArray permissionData6552 = tzsUserInfoDto.getPermissionData6552();
......@@ -854,7 +906,7 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
}
}
tzsUserInfoDto.setPost(JSONArray.toJSONString(postArray));
String postName = this.setPostName(tzsUserInfoDto.getPost());
String postName = this.setPostName(tzsUserInfoDto.getNewPost());
tzsUserInfoDto.setPostName(postName);
if (!ObjectUtils.isEmpty(selectOne.getAmosUserId())) {
// 添加新的人员与组的关系
......@@ -878,7 +930,8 @@ public class TzsUserInfoServiceImpl extends BaseService<TzsUserInfoDto, TzsUserI
if (userTypeCode.isEmpty()) {
return Collections.emptyList();
}
return iDataDictionaryService.getBaseMapper().selectBatchIds(userTypeCode);
List<String> act = new ArrayList<>(userTypeCode);
return iDataDictionaryService.getBaseMapper().selectBatchIds(act);
}
}
......@@ -151,17 +151,21 @@ public class TzsUserPermissionServiceImpl extends BaseService<TzsUserPermissionD
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
String expiryDateString = String.valueOf(permissionData.get("expiryDate"));
LocalDate localDate1 = LocalDate.parse(expiryDateString, formatter);
LocalDateTime localDateTime1 = localDate1.atStartOfDay();
Date expiryDate = Date.from(localDateTime1.atZone(ZoneId.systemDefault()).toInstant());
permission.setExpiryDate(expiryDate);
String issueDateString = String.valueOf(permissionData.get("issueDate"));
LocalDate localDate2 = LocalDate.parse(issueDateString, formatter);
LocalDateTime localDateTime2 = localDate2.atStartOfDay();
Date issueDate = Date.from(localDateTime2.atZone(ZoneId.systemDefault()).toInstant());
permission.setIssueDate(issueDate);
String expiryDateString = String.valueOf(Optional.ofNullable(permissionData.get("expiryDate")).orElse(""));
if (!ValidationUtil.isEmpty(expiryDateString)) {
LocalDate localDate1 = LocalDate.parse(expiryDateString, formatter);
LocalDateTime localDateTime1 = localDate1.atStartOfDay();
Date expiryDate = Date.from(localDateTime1.atZone(ZoneId.systemDefault()).toInstant());
permission.setExpiryDate(expiryDate);
}
String issueDateString = String.valueOf(Optional.ofNullable(permissionData.get("issueDate")).orElse(""));
if (!ValidationUtil.isEmpty(issueDateString)) {
LocalDate localDate2 = LocalDate.parse(issueDateString, formatter);
LocalDateTime localDateTime2 = localDate2.atStartOfDay();
Date issueDate = Date.from(localDateTime2.atZone(ZoneId.systemDefault()).toInstant());
permission.setIssueDate(issueDate);
}
permission.setApprovedOrgan((String) permissionData.get("approvedOrgan"));
permission.setCertAttachment(JSONArray.toJSONString(permissionData.get("certAttachment")));
......
......@@ -111,4 +111,23 @@ public class IdxBizJgOtherInfo extends TzsBaseEntity {
@TableField("\"EDIT_STATUS\"")
private String editStatus;
/**
* 信息化管理情况:1-二维码;2-电子标签;99-无
*/
@TableField(value = "\"INFORMATION_SITUATION\"")
private String informationSituation;
/**
* 信息化管理二维码或者电子标签编号
*/
@TableField(value = "\"INFORMATION_MANAGE_CODE\"")
private String informationManageCode;
/**
* 气瓶钢印标识
*/
@TableField(value = "\"CYLINDER_STAMP_ATTACHMENT\"")
private String cylinderStampAttachment;
}
......@@ -200,4 +200,13 @@ public class IdxBizJgRegisterInfo extends TzsBaseEntity {
@TableField("\"WHETHER_SPHERICAL_TANK\"")
private String whetherSphericalTank;
/**
* 气瓶类别(液化石油气瓶、工业气瓶、其他)
* 0:液化石油气瓶
* 1:工业气瓶
* 2:其他
*/
@TableField("\"CYLINDER_CATEGORY\"")
private String cylinderCategory;
}
......@@ -64,5 +64,24 @@ public class OtherInfo extends AbstractEquipBaseEntity {
@TableField(value ="\"SUPERVISORY_CODE\"")
private String supervisoryCode;
/**
* 信息化管理情况:1-二维码;2-电子标签;99-无
*/
@TableField(value = "\"INFORMATION_SITUATION\"")
private String informationSituation;
/**
* 信息化管理二维码或者电子标签编号
*/
@TableField(value = "\"INFORMATION_MANAGE_CODE\"")
private String informationManageCode;
/**
* 气瓶钢印标识
*/
@TableField(value = "\"CYLINDER_STAMP_ATTACHMENT\"")
private String cylinderStampAttachment;
}
package com.yeejoin.amos.boot.module.ymt.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
@AllArgsConstructor
@Getter
public enum InformationManageTypeEnum {
/**
* 信息化管理情况枚举
*/
TYPE_QR_CODE("1", "二维码"),
TYPE_STAMP("2", "二维码"),
TYPE_NO("99", "无");
private String code;
private String name;
public static String getName(String code) {
Optional<String> op = Arrays.stream(InformationManageTypeEnum.values()).filter(e -> e.getCode().equals(code)).map(InformationManageTypeEnum::getName).findFirst();
return op.orElse("");
}
}
......@@ -45,4 +45,15 @@ public interface IdxBizJgRegisterInfoMapper extends BaseMapper<IdxBizJgRegisterI
"GROUP BY " +
"jui.PROJECT_CONTRAPTION")
List<Map<String, Object>> getProjectContraptionList(String useUnitCreditCode);
void updateCylinderCategoryByRecordBatch(@Param("recordList") List<String> recordList, @Param("cylinderCategory") String cylinderCategory);
/**
* 批量更新 CYLINDER_CATEGORY 根据 equCode
*
* @param cylinderCategory 需要更新的参数列表
* @param equCodeList equCode列表
* @return 更新成功返回 true,失败返回 false
*/
Boolean updateCylinderCategoryByEquCodeBatch(@Param("cylinderCategory") String cylinderCategory, @Param("equCodeList") List<String> equCodeList);
}
......@@ -17,6 +17,24 @@
</where>
GROUP BY jui.PROJECT_CONTRAPTION
</select>
<update id="updateCylinderCategoryByRecordBatch">
UPDATE idx_biz_jg_register_info
SET "CYLINDER_CATEGORY" = #{cylinderCategory}
WHERE "RECORD" IN
<foreach collection="recordList" separator="," item="record" open="(" close=")">
#{record}
</foreach>
</update>
<update id="updateCylinderCategoryByEquCodeBatch" parameterType="java.util.List">
UPDATE idx_biz_jg_register_info
SET "CYLINDER_CATEGORY" = #{cylinderCategory}
WHERE "EQU_CODE" IN
<foreach collection="equCodeList" separator="," item="equCode" open="(" close=")">
#{equCode}
</foreach>
</update>
</mapper>
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