| | |
| | | // 确保 vc.component 已完全初始化后再调用 |
| | | let retryCount = 0; |
| | | const maxRetries = 20; // 最多重试20次(约1秒) |
| | | const loadData = function() { |
| | | const loadData = function () { |
| | | if (vc.component && typeof vc.component._loadCommunityDetail === 'function') { |
| | | vc.component._loadCommunityDetail(); |
| | | } else { |
| | |
| | | _initEvent: function () { |
| | | // 初始化时添加输入事件监听,自动移除错误样式 |
| | | const $that = this; |
| | | setTimeout(function() { |
| | | setTimeout(function () { |
| | | // 为所有输入框和选择框添加输入事件监听 |
| | | const inputs = document.querySelectorAll('.community-add input, .community-add select'); |
| | | inputs.forEach(function(input) { |
| | | input.addEventListener('input', function() { |
| | | inputs.forEach(function (input) { |
| | | input.addEventListener('input', function () { |
| | | $that.removeError(input.id); |
| | | }); |
| | | input.addEventListener('change', function() { |
| | | input.addEventListener('change', function () { |
| | | $that.removeError(input.id); |
| | | }); |
| | | }); |
| | |
| | | }, |
| | | methods: { |
| | | // 添加错误样式 |
| | | addError: function(elementId) { |
| | | addError: function (elementId) { |
| | | const element = document.getElementById(elementId); |
| | | if (element) { |
| | | element.classList.add('error'); |
| | | } |
| | | }, |
| | | // 移除错误样式 |
| | | removeError: function(elementId) { |
| | | removeError: function (elementId) { |
| | | const element = document.getElementById(elementId); |
| | | if (element) { |
| | | element.classList.remove('error'); |
| | | } |
| | | }, |
| | | // 清除所有错误样式 |
| | | clearAllErrors: function() { |
| | | clearAllErrors: function () { |
| | | const elements = document.querySelectorAll('.community-add input.error, .community-add select.error'); |
| | | elements.forEach(function(element) { |
| | | elements.forEach(function (element) { |
| | | element.classList.remove('error'); |
| | | }); |
| | | }, |
| | | toBoolString: function(value, defaultValue) { |
| | | toBoolString: function (value, defaultValue) { |
| | | if (value === undefined || value === null) { |
| | | return defaultValue; |
| | | } |
| | | return value ? 'true' : 'false'; |
| | | }, |
| | | chooseProvince: function(event) { |
| | | chooseProvince: function (event) { |
| | | const provCode = event.target.value; |
| | | vc.component.selectProv = provCode; |
| | | vc.component.selectCity = ''; |
| | |
| | | vc.component.areas = []; |
| | | // 更新 formData 中的省份名称 |
| | | if (vc.component.provs && vc.component.provs.length > 0) { |
| | | vc.component.provs.forEach(function(_param) { |
| | | vc.component.provs.forEach(function (_param) { |
| | | if (_param.areaCode == provCode) { |
| | | vc.component.selectProvName = _param.areaName; |
| | | vc.component.formData.projectAddressProvince = _param.areaName; |
| | |
| | | vc.component._initArea('202', provCode); |
| | | } |
| | | }, |
| | | chooseCity: function(event) { |
| | | chooseCity: function (event) { |
| | | const cityCode = event.target.value; |
| | | vc.component.selectCity = cityCode; |
| | | vc.component.selectArea = ''; |
| | | vc.component.areas = []; |
| | | // 更新 formData 中的城市名称 |
| | | if (vc.component.citys && vc.component.citys.length > 0) { |
| | | vc.component.citys.forEach(function(_param) { |
| | | vc.component.citys.forEach(function (_param) { |
| | | if (_param.areaCode == cityCode) { |
| | | vc.component.selectCityName = _param.areaName; |
| | | vc.component.formData.projectAddressCity = _param.areaName; |
| | |
| | | vc.component._initArea('303', cityCode); |
| | | } |
| | | }, |
| | | chooseArea: function(event) { |
| | | chooseArea: function (event) { |
| | | const areaCode = event.target.value; |
| | | vc.component.selectArea = areaCode; |
| | | vc.component.formData.cityCode = areaCode; |
| | | vc.component.formData.areaAddress = ''; |
| | | |
| | | |
| | | // 更新 formData 中的区县名称 |
| | | if (vc.component.areas && vc.component.areas.length > 0) { |
| | | vc.component.areas.forEach(function(_param) { |
| | | vc.component.areas.forEach(function (_param) { |
| | | if (_param.areaCode == areaCode) { |
| | | vc.component.selectAreaName = _param.areaName; |
| | | vc.component.formData.projectAddressDistrict = _param.areaName; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | // 构建区域地址 |
| | | if (vc.component.provs && vc.component.provs.length > 0) { |
| | | vc.component.provs.forEach(function(_param) { |
| | | vc.component.provs.forEach(function (_param) { |
| | | if (_param.areaCode == vc.component.selectProv) { |
| | | vc.component.selectProvName = _param.areaName; |
| | | vc.component.formData.areaAddress = _param.areaName; |
| | |
| | | }); |
| | | } |
| | | if (vc.component.citys && vc.component.citys.length > 0) { |
| | | vc.component.citys.forEach(function(_param) { |
| | | vc.component.citys.forEach(function (_param) { |
| | | if (_param.areaCode == vc.component.selectCity) { |
| | | vc.component.selectCityName = _param.areaName; |
| | | if (vc.component.formData.areaAddress) { |
| | |
| | | }); |
| | | } |
| | | if (vc.component.areas && vc.component.areas.length > 0) { |
| | | vc.component.areas.forEach(function(_param) { |
| | | vc.component.areas.forEach(function (_param) { |
| | | if (_param.areaCode == vc.component.selectArea) { |
| | | vc.component.selectAreaName = _param.areaName; |
| | | if (vc.component.formData.areaAddress) { |
| | |
| | | }); |
| | | } |
| | | }, |
| | | _initArea: function(_areaLevel, _parentAreaCode) { |
| | | _initArea: function (_areaLevel, _parentAreaCode) { |
| | | var _param = { |
| | | params: { |
| | | areaLevel: _areaLevel, |
| | |
| | | // 填充省份下拉框 |
| | | const provinceSelect = document.getElementById('province'); |
| | | if (provinceSelect) { |
| | | _tmpAreas.forEach(function(item) { |
| | | _tmpAreas.forEach(function (item) { |
| | | const option = document.createElement('option'); |
| | | option.value = item.areaCode; |
| | | option.textContent = item.areaName; |
| | |
| | | const citySelect = document.getElementById('city'); |
| | | if (citySelect) { |
| | | citySelect.innerHTML = '<option value="">请选择市</option>'; |
| | | _tmpAreas.forEach(function(item) { |
| | | _tmpAreas.forEach(function (item) { |
| | | const option = document.createElement('option'); |
| | | option.value = item.areaCode; |
| | | option.textContent = item.areaName; |
| | |
| | | const areaSelect = document.getElementById('area'); |
| | | if (areaSelect) { |
| | | areaSelect.innerHTML = '<option value="">请选择区</option>'; |
| | | _tmpAreas.forEach(function(item) { |
| | | _tmpAreas.forEach(function (item) { |
| | | const option = document.createElement('option'); |
| | | option.value = item.areaCode; |
| | | option.textContent = item.areaName; |
| | |
| | | return {}; |
| | | } |
| | | return { |
| | | communityId: info.communityId || info.communityId || '', |
| | | communityId: info.communityId || '', |
| | | newBId: info.newBId || '', |
| | | feePrice: info.feePrice || '', |
| | | projectAddressProvince: info.projectAddressProvince || info.provinceName || '', |
| | |
| | | groundNonMotorVehicleArea: info.groundNonMotorVehicleArea || info.nonElectricCarGroundArea || '', |
| | | undergroundNonMotorVehicleArea: info.undergroundNonMotorVehicleArea || info.nonElectricCarUndergroundArea || '', |
| | | clubhouseArea: info.clubhouseArea || info.clubArea || '', |
| | | hasDecorationRubbishPoint: vc.component.toBoolString(info.hasDecorationRubbishPoint, info.garbageFixed ? 'true' : 'false'), |
| | | hasDecorationRubbishPoint: info.hasDecorationRubbishPoint === '是' || info.garbageFixed == 1 ? '是' : '否', |
| | | securityEntranceCount: info.securityEntranceCount || info.gateGuardTotal || '', |
| | | elevatorCount: info.elevatorCount || info.elevatorTotal || '', |
| | | elevatorType: info.elevatorType || '', |
| | |
| | | } |
| | | const $that = this; |
| | | const formData = vc.component.formData; |
| | | |
| | | |
| | | // 清除之前的错误样式 |
| | | vc.component.clearAllErrors(); |
| | | |
| | | |
| | | // 验证必填字段 |
| | | if (!formData.name || formData.name.trim() === '') { |
| | | vc.toast('请输入小区名称'); |
| | | vc.component.addError('input-name'); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 构建详细地址 |
| | | const addressParts = []; |
| | | if (formData.projectAddressTown) { |
| | |
| | | addressParts.push(formData.projectAddressRoad); |
| | | } |
| | | const address = addressParts.join(' ') || ''; |
| | | |
| | | |
| | | if (!address || address.trim() === '') { |
| | | vc.toast('请输入详细地址'); |
| | | if (!formData.projectAddressTown || formData.projectAddressTown.trim() === '') { |
| | |
| | | } |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 构建区域地址 |
| | | let areaAddress = formData.areaAddress || ''; |
| | | // 如果 areaAddress 为空,尝试从省市区名称构建 |
| | |
| | | } |
| | | areaAddress = areaParts.join(''); |
| | | } |
| | | |
| | | |
| | | if (!areaAddress || areaAddress.trim() === '') { |
| | | vc.toast('请选择所在城市'); |
| | | if (!vc.component.selectProv) { |
| | |
| | | } |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 验证区域编码(必须选择到区县级别) |
| | | const cityCode = formData.cityCode || vc.component.selectArea || ''; |
| | | if (!cityCode || cityCode.trim() === '') { |
| | |
| | | } |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 验证联系电话(使用物业联系人电话或报修电话) |
| | | const tel = formData.propertyManagerPhone || formData.dayRepairPhone || ''; |
| | | if (!tel || tel.trim() === '') { |
| | |
| | | vc.component.addError('input-phone'); |
| | | } |
| | | // 如果物业联系人电话为空,且日间电话也为空,则也标记日间电话 |
| | | if ((!formData.propertyManagerPhone || formData.propertyManagerPhone.trim() === '') && |
| | | if ((!formData.propertyManagerPhone || formData.propertyManagerPhone.trim() === '') && |
| | | (!formData.dayRepairPhone || formData.dayRepairPhone.trim() === '')) { |
| | | vc.component.addError('input-day-phone'); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 状态映射:statusCd (1=正常, 2=暂停, 3=注销) -> state (状态编码) |
| | | let state = '1100'; // 默认正常状态 |
| | | if (formData.statusCd === '1') { |
| | |
| | | } else if (formData.statusCd === '3') { |
| | | state = '1300'; // 注销(假设编码) |
| | | } |
| | | |
| | | |
| | | // 构建提交数据 |
| | | const submitData = { |
| | | // 基础参数 - 必填 |
| | |
| | | tel: tel, |
| | | cityCode: cityCode, |
| | | state: state, |
| | | |
| | | |
| | | // 基础参数 - 可选 |
| | | tmpAddress: formData.tmpAddress || '', |
| | | nearbyLandmarks: formData.nearbyLandmarks || '', |
| | |
| | | communityId: formData.communityId || '', |
| | | communityCode: formData.communityCode || '', |
| | | communityArea: formData.communityArea || '', |
| | | |
| | | |
| | | // 项目扩展参数 |
| | | projectAddressProvince: formData.projectAddressProvince || '', |
| | | projectAddressCity: formData.projectAddressCity || '', |
| | |
| | | groundNonMotorVehicleArea: formData.groundNonMotorVehicleArea || '', |
| | | undergroundNonMotorVehicleArea: formData.undergroundNonMotorVehicleArea || '', |
| | | clubhouseArea: formData.clubhouseArea || '', |
| | | hasDecorationRubbishPoint: formData.hasDecorationRubbishPoint || '', |
| | | securityEntranceCount: formData.securityEntranceCount || '', |
| | | elevatorCount: formData.elevatorCount || '', |
| | | elevatorType: formData.elevatorType || '', |
| | |
| | | multilayerVillaBuildingCount: formData.multilayerVillaBuildingCount || '', |
| | | residentialHouseholdCount: formData.residentialHouseholdCount || '', |
| | | shopHouseholdCount: formData.shopHouseholdCount || '', |
| | | |
| | | |
| | | // 扩展属性 |
| | | attrs: formData.attrs || [] |
| | | }; |
| | | |
| | | |
| | | // 转换数字字段 |
| | | const numberFields = [ |
| | | 'fireHydrantCount', 'fireChannelCount', 'waterTankCount', 'reservoirCount', |
| | |
| | | 'barrierGateCount', 'waterPumpCount', 'groundParkingSpaces', 'undergroundParkingSpaces', |
| | | 'totalBuildingCount', 'buildingUnitCount', 'highRiseBuildingCount', |
| | | 'multilayerVillaBuildingCount', 'residentialHouseholdCount', 'shopHouseholdCount', |
| | | 'payFeeMonth', 'hasManagerCertificate', 'hasDecorationRubbishPoint' |
| | | 'payFeeMonth', 'hasManagerCertificate' |
| | | ]; |
| | | numberFields.forEach(field => { |
| | | if (submitData[field] !== '' && submitData[field] !== null && submitData[field] !== undefined) { |
| | | submitData[field] = Number(submitData[field]); |
| | | } else if (field === 'hasManagerCertificate' || field === 'hasDecorationRubbishPoint') { |
| | | } else if (field === 'hasManagerCertificate') { |
| | | submitData[field] = 0; |
| | | } |
| | | }); |
| | | |
| | | // 转换Decimal字段 |
| | | const decimalFields = [ |
| | | 'feePrice', 'projectLandArea', 'totalConstructionArea', 'chargeableTotalArea', |
| | | 'chargeableAreaMultilayer', 'chargeableAreaHighRise1', 'chargeableAreaHighRiseUp', |
| | | 'chargeableAreaShop', 'chargeableAreaVilla', 'chargeableAreaOffice', |
| | | 'chargeableAreaCommercialHouse', 'greenArea', 'groundNonMechanicalFee', |
| | | 'garageNonMechanicalFee', 'temporaryHourlyFee', 'temporaryDailyFee', |
| | | 'garageNonMechanicalFee', 'temporaryHourlyFee', 'temporaryDailyFee', |
| | | 'temporaryPerTimeFee', 'communityArea' |
| | | ]; |
| | | decimalFields.forEach(field => { |
| | |
| | | submitData[field] = 0; |
| | | } |
| | | }); |
| | | |
| | | |
| | | // 清理空字符串字段,转换为null或删除 |
| | | Object.keys(submitData).forEach(key => { |
| | | if (submitData[key] === '') { |