| | |
| | | transition: all 0.3s; |
| | | } |
| | | |
| | | .cost-detail-container .action-buttons .add-btn, .cost-detail-container .action-buttons .import-btn{ |
| | | .cost-detail-container .action-buttons .add-btn, |
| | | .cost-detail-container .action-buttons .import-btn { |
| | | background: #1677ff; |
| | | color: #fff; |
| | | border: 1px solid #1677ff; |
| | | } |
| | | |
| | | .cost-detail-container .action-buttons .add-btn:hover, .cost-detail-container .action-buttons .import-btn:hover { |
| | | .cost-detail-container .action-buttons .add-btn:hover, |
| | | .cost-detail-container .action-buttons .import-btn:hover { |
| | | background: #4096ff; |
| | | } |
| | | |
| | |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .multi-select-wrapper { |
| | | position: relative; |
| | | display: inline-block; |
| | | width: 220px; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | .multi-select-input { |
| | | position: relative; |
| | | top: 12px; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 6px 30px 6px 6px; |
| | | border: 1px solid #ddd; |
| | | border-radius: 4px; |
| | | background-color: #fff; |
| | | cursor: pointer; |
| | | min-height: 32px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .multi-select-input:hover { |
| | | border-color: #1ab394; |
| | | } |
| | | |
| | | .multi-select-input.active { |
| | | border-color: #1ab394; |
| | | box-shadow: 0 0 0 2px rgba(26, 179, 148, 0.1); |
| | | } |
| | | |
| | | .multi-select-tags { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 4px; |
| | | flex: 1; |
| | | align-items: center; |
| | | } |
| | | |
| | | .multi-select-tag { |
| | | display: inline-flex; |
| | | align-items: center; |
| | | padding: 2px 6px; |
| | | background-color: #f0f0f0; |
| | | border: 1px solid #ddd; |
| | | border-radius: 3px; |
| | | font-size: 12px; |
| | | color: #333; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .multi-select-tag-close { |
| | | margin-left: 4px; |
| | | cursor: pointer; |
| | | color: #999; |
| | | font-size: 14px; |
| | | line-height: 1; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .multi-select-tag-close:hover { |
| | | color: #ed5565; |
| | | } |
| | | |
| | | .multi-select-placeholder { |
| | | color: #999; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .multi-select-arrow { |
| | | position: absolute; |
| | | right: 8px; |
| | | top: 50%; |
| | | transform: translateY(-50%); |
| | | color: #666; |
| | | font-size: 12px; |
| | | pointer-events: none; |
| | | transition: transform 0.2s; |
| | | } |
| | | |
| | | .multi-select-input.active .multi-select-arrow { |
| | | transform: translateY(-50%) rotate(180deg); |
| | | } |
| | | |
| | | .multi-select-dropdown { |
| | | position: absolute; |
| | | top: 110%; |
| | | left: 0; |
| | | right: 0; |
| | | margin-top: 4px; |
| | | background-color: #fff; |
| | | border: 1px solid #ddd; |
| | | border-radius: 4px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | z-index: 1000; |
| | | max-height: 300px; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .multi-select-option { |
| | | |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 8px 12px; |
| | | cursor: pointer; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .multi-select-option:hover { |
| | | background-color: #f5f5f5; |
| | | } |
| | | |
| | | .multi-select-option input[type="checkbox"] { |
| | | margin-right: 8px; |
| | | cursor: pointer; |
| | | width: 16px; |
| | | height: 16px; |
| | | } |
| | | |
| | | .multi-select-option label { |
| | | cursor: pointer; |
| | | flex: 1; |
| | | margin: 0; |
| | | font-size: 14px; |
| | | color: #333; |
| | | } |
| | | |
| | | .form-container .btn-group { |
| | | margin-left: 95px; |
| | | margin-top: 25px; |
| | |
| | | width: 180px; |
| | | height: 32px; |
| | | } |
| | | |
| | | #buildingScope{ |
| | | position: relative; |
| | | top: 12px; |
| | |
| | | } |
| | | |
| | | @media (max-width: 1400px) { |
| | | |
| | | #button-container .role-a-checkbox, |
| | | #data-container .role-a-checkbox { |
| | | flex: 0 0 calc((100% - 60px) / 7); |
| | |
| | | } |
| | | |
| | | @media (max-width: 1200px) { |
| | | |
| | | #button-container .role-a-checkbox, |
| | | #data-container .role-a-checkbox { |
| | | flex: 0 0 calc((100% - 50px) / 6); |
| | |
| | | } |
| | | |
| | | @media (max-width: 992px) { |
| | | |
| | | #button-container .role-a-checkbox, |
| | | #data-container .role-a-checkbox { |
| | | flex: 0 0 calc((100% - 40px) / 5); |
| | |
| | | } |
| | | |
| | | @media (max-width: 768px) { |
| | | |
| | | #button-container .role-a-checkbox, |
| | | #data-container .role-a-checkbox { |
| | | flex: 0 0 calc((100% - 20px) / 2); |
| | | } |
| | | } |
| | | |
| | | .role-a-checkbox label { |
| | | padding-top: 5px; |
| | | } |
| | |
| | | color: #1677ff; |
| | | } |
| | | |
| | | /* 编辑公共收益金弹窗样式 */ |
| | | .edit-public-income-modal .edit-form-group { |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | cursor: pointer; |
| | | } |
| | | |
| | | /* 确保编辑公共收益金弹窗居中显示 */ |
| | | #editPublicIncomeModal { |
| | | display: flex !important; |
| | | align-items: center; |
| | |
| | | <label for="committeeSealNo" style="margin-top: 8px;">否</label> |
| | | </div> |
| | | <label class="form-label" for="approveDept">签报部门</label> |
| | | <input type="text" id="approveDept" class="form-input" placeholder="请输入" v-model="costDetailInfo.approvalDepartment" style="width: 120px;"> |
| | | <select id="approveDept" class="form-input" v-model="costDetailInfo.approvalDepartment" style="width: 120px;"> |
| | | <option value="">请选择</option> |
| | | <option value="电梯部">电梯部</option> |
| | | <option value="工程部">工程部</option> |
| | | <option value="管理处">管理处</option> |
| | | <option value="业委会">业委会</option> |
| | | <option value="智能化">智能化</option> |
| | | <option value="品质部">品质部</option> |
| | | <option value="小区经理">小区经理</option> |
| | | </select> |
| | | </div> |
| | | |
| | | <!-- 分摊范围 + 维修类型 --> |
| | |
| | | </div> |
| | | <div class="radio-group" style="margin-left: 100px;" v-if="costDetailInfo.fundType === 'repair'"> |
| | | <label class="form-label" for="ownerScope">业主大会范围</label> |
| | | <select id="ownerScope" class="form-select"> |
| | | <option value="multi">多选</option> |
| | | </select> |
| | | <div class="multi-select-wrapper"> |
| | | <div class="multi-select-input" @click="toggleOwnerScopeDropdown" :class="{ 'active': ownerScopeDropdownOpen }"> |
| | | <div class="multi-select-tags"> |
| | | <span v-for="(item, index) in (costDetailInfo.ownerScope || [])" :key="'tag-' + index" class="multi-select-tag"> |
| | | {{ item }} |
| | | <span class="multi-select-tag-close" @click.stop="removeOwnerScopeItem(index)">×</span> |
| | | </span> |
| | | <span v-if="!costDetailInfo.ownerScope || costDetailInfo.ownerScope.length === 0" class="multi-select-placeholder">请选择</span> |
| | | </div> |
| | | <span class="multi-select-arrow">▼</span> |
| | | </div> |
| | | <div class="multi-select-dropdown" v-show="ownerScopeDropdownOpen"> |
| | | <div class="multi-select-option" v-for="(option, index) in ownerScopeOptions" :key="'option-' + index" @click.stop="toggleOwnerScopeOption(option)"> |
| | | <input type="checkbox" :checked="costDetailInfo.ownerScope && costDetailInfo.ownerScope.indexOf(option) !== -1" @click.stop="toggleOwnerScopeOption(option)"> |
| | | <label>{{ option }}</label> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <label class="form-label" for="buildingScope">门牌幢范围</label> |
| | | <select id="buildingScope" class="form-select"> |
| | | <option value="multi">多选</option> |
| | | </select> |
| | | <div class="multi-select-wrapper"> |
| | | <div class="multi-select-input" @click="toggleBuildingScopeDropdown" :class="{ 'active': buildingScopeDropdownOpen }"> |
| | | <div class="multi-select-tags"> |
| | | <span v-for="(item, index) in (costDetailInfo.buildingScope || [])" :key="'building-tag-' + index" class="multi-select-tag"> |
| | | {{ item }} |
| | | <span class="multi-select-tag-close" @click.stop="removeBuildingScopeItem(index)">×</span> |
| | | </span> |
| | | <span v-if="!costDetailInfo.buildingScope || costDetailInfo.buildingScope.length === 0" class="multi-select-placeholder">请选择</span> |
| | | </div> |
| | | <span class="multi-select-arrow">▼</span> |
| | | </div> |
| | | <div class="multi-select-dropdown" v-show="buildingScopeDropdownOpen"> |
| | | <div class="multi-select-option" v-for="(option, index) in buildingScopeOptions" :key="'building-option-' + index" @click.stop="toggleBuildingScopeOption(option)"> |
| | | <input type="checkbox" :checked="costDetailInfo.buildingScope && costDetailInfo.buildingScope.indexOf(option) !== -1" @click.stop="toggleBuildingScopeOption(option)"> |
| | | <label>{{ option }}</label> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | fundTypeLevel2: '', |
| | | buildingType: '1', |
| | | maintenanceType: '', |
| | | fundType: 'repair', // 默认选中维修资金 |
| | | fundSystemType: 'out' // 默认选中系统外 |
| | | } |
| | | fundType: 'repair', |
| | | fundSystemType: 'out', |
| | | ownerScope: [], |
| | | buildingScope: [] |
| | | }, |
| | | ownerScopeOptions: [ |
| | | '机动车停车库(位)', |
| | | '小区道路', |
| | | '交通附属设施', |
| | | '非机动车车库(相朋)', |
| | | '小区公共照明', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '公共景观绿化', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '楼栋外立面', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)' |
| | | ], |
| | | ownerScopeDropdownOpen: false, |
| | | buildingScopeOptions: [ |
| | | '机动车停车库(位)', |
| | | '交通附属设施', |
| | | '小区道路', |
| | | '公共景观绿化', |
| | | '非机动车车库(棚)', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '太阳能设施', |
| | | '坡屋面', |
| | | '结构', |
| | | '楼栋外立面', |
| | | '楼幢入口', |
| | | '楼幢公共', |
| | | '楼道设施', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)', |
| | | '法院强制执行' |
| | | ], |
| | | buildingScopeDropdownOpen: false |
| | | }, |
| | | _initMethod: function () { |
| | | $that = vc.component; |
| | | if (!$that.costDetailInfo) { |
| | | $that.costDetailInfo = {}; |
| | | } |
| | | if (!$that.costDetailInfo.ownerScope || !Array.isArray($that.costDetailInfo.ownerScope)) { |
| | | $that.costDetailInfo.ownerScope = []; |
| | | } |
| | | if (!$that.costDetailInfo.buildingScope || !Array.isArray($that.costDetailInfo.buildingScope)) { |
| | | $that.costDetailInfo.buildingScope = []; |
| | | } |
| | | if (!$that.ownerScopeOptions || !Array.isArray($that.ownerScopeOptions)) { |
| | | $that.ownerScopeOptions = [ |
| | | '机动车停车库(位)', |
| | | '小区道路', |
| | | '交通附属设施', |
| | | '非机动车车库(相朋)', |
| | | '小区公共照明', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '公共景观绿化', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '楼栋外立面', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)' |
| | | ]; |
| | | } |
| | | if ($that.ownerScopeDropdownOpen === undefined) { |
| | | $that.ownerScopeDropdownOpen = false; |
| | | } |
| | | if (!$that.buildingScopeOptions || !Array.isArray($that.buildingScopeOptions)) { |
| | | $that.buildingScopeOptions = [ |
| | | '机动车停车库(位)', |
| | | '交通附属设施', |
| | | '小区道路', |
| | | '公共景观绿化', |
| | | '非机动车车库(棚)', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '太阳能设施', |
| | | '坡屋面', |
| | | '结构', |
| | | '楼栋外立面', |
| | | '楼幢入口', |
| | | '楼幢公共', |
| | | '楼道设施', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)', |
| | | '法院强制执行' |
| | | ]; |
| | | } |
| | | if ($that.buildingScopeDropdownOpen === undefined) { |
| | | $that.buildingScopeDropdownOpen = false; |
| | | } |
| | | var clickHandler = function (e) { |
| | | if (!e.target.closest('.multi-select-wrapper')) { |
| | | if ($that && $that.ownerScopeDropdownOpen !== undefined) { |
| | | $that.ownerScopeDropdownOpen = false; |
| | | } |
| | | if ($that && $that.buildingScopeDropdownOpen !== undefined) { |
| | | $that.buildingScopeDropdownOpen = false; |
| | | } |
| | | } |
| | | }; |
| | | setTimeout(function () { |
| | | document.addEventListener('click', clickHandler); |
| | | }, 100); |
| | | }, |
| | | methods: { |
| | | toggleOwnerScopeDropdown: function () { |
| | | if ($that && $that.ownerScopeDropdownOpen !== undefined) { |
| | | $that.ownerScopeDropdownOpen = !$that.ownerScopeDropdownOpen; |
| | | } |
| | | }, |
| | | toggleOwnerScopeOption: function (option) { |
| | | if (!$that || !$that.costDetailInfo || !$that.costDetailInfo.ownerScope) { |
| | | return; |
| | | } |
| | | var index = $that.costDetailInfo.ownerScope.indexOf(option); |
| | | if (index === -1) { |
| | | $that.costDetailInfo.ownerScope.push(option); |
| | | } else { |
| | | $that.costDetailInfo.ownerScope.splice(index, 1); |
| | | } |
| | | }, |
| | | removeOwnerScopeItem: function (index) { |
| | | if ($that && $that.costDetailInfo && $that.costDetailInfo.ownerScope) { |
| | | $that.costDetailInfo.ownerScope.splice(index, 1); |
| | | } |
| | | }, |
| | | toggleBuildingScopeDropdown: function () { |
| | | if ($that && $that.buildingScopeDropdownOpen !== undefined) { |
| | | $that.buildingScopeDropdownOpen = !$that.buildingScopeDropdownOpen; |
| | | } |
| | | }, |
| | | toggleBuildingScopeOption: function (option) { |
| | | if (!$that || !$that.costDetailInfo || !$that.costDetailInfo.buildingScope) { |
| | | return; |
| | | } |
| | | var index = $that.costDetailInfo.buildingScope.indexOf(option); |
| | | if (index === -1) { |
| | | $that.costDetailInfo.buildingScope.push(option); |
| | | } else { |
| | | $that.costDetailInfo.buildingScope.splice(index, 1); |
| | | } |
| | | }, |
| | | removeBuildingScopeItem: function (index) { |
| | | if ($that && $that.costDetailInfo && $that.costDetailInfo.buildingScope) { |
| | | $that.costDetailInfo.buildingScope.splice(index, 1); |
| | | } |
| | | }, |
| | | _saveCostDetail: function () { |
| | | // 验证必填字段 |
| | | if (!$that.costDetailInfo.flowCode) { |
| | | vc.toast('请输入流转编码'); |
| | | return; |
| | |
| | | return; |
| | | } |
| | | |
| | | // 构建保存数据 |
| | | var fundTypeLevel1 = ''; |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | fundTypeLevel1 = '维修资金'; |
| | | } else if ($that.costDetailInfo.fundType === 'public') { |
| | | fundTypeLevel1 = '公共收益'; |
| | | } |
| | | |
| | | var fundTypeLevel2 = ''; |
| | | var buildingOrAll = ''; |
| | | |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | fundTypeLevel2 = ($that.costDetailInfo.ownerScope && $that.costDetailInfo.ownerScope.length > 0) |
| | | ? $that.costDetailInfo.ownerScope.join(',') |
| | | : ''; |
| | | buildingOrAll = ($that.costDetailInfo.buildingScope && $that.costDetailInfo.buildingScope.length > 0) |
| | | ? $that.costDetailInfo.buildingScope.join(',') |
| | | : ''; |
| | | } else if ($that.costDetailInfo.fundType === 'public') { |
| | | if ($that.costDetailInfo.fundSystemType === 'out') { |
| | | fundTypeLevel2 = '系统外'; |
| | | } else if ($that.costDetailInfo.fundSystemType === 'in') { |
| | | fundTypeLevel2 = '系统内'; |
| | | } |
| | | buildingOrAll = ''; |
| | | } else { |
| | | buildingOrAll = ''; |
| | | } |
| | | |
| | | var saveData = { |
| | | flowNumber: $that.costDetailInfo.flowCode, |
| | | date: $that.costDetailInfo.date, |
| | |
| | | auditAmount: parseFloat($that.costDetailInfo.appraisalAmount) || 0, |
| | | ownersCommitteeSeal: $that.costDetailInfo.committeeStamped === '1' ? '是' : '否', |
| | | reportDepartment: $that.costDetailInfo.approvalDepartment || '', |
| | | fundTypeLevel1: $that.costDetailInfo.fundType === 'repair' ? '维修资金' : '公共收益', |
| | | fundTypeLevel2: $that.costDetailInfo.fundType === 'public' ? ($that.costDetailInfo.fundSystemType === 'out' ? '系统外' : '系统内') : '', |
| | | buildingOrAll: $that.costDetailInfo.buildingType === '全体' ? '全体' : ($that.costDetailInfo.buildingType || '1'), |
| | | fundTypeLevel1: fundTypeLevel1, |
| | | fundTypeLevel2: fundTypeLevel2, |
| | | maintenanceType: $that.costDetailInfo.maintenanceType || '', |
| | | communityId: vc.getCurrentCommunity().communityId |
| | | }; |
| | | |
| | | // 解析日期 |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | saveData.buildingOrAll = buildingOrAll; |
| | | } |
| | | |
| | | if (saveData.date) { |
| | | var dateParts = saveData.date.split('-'); |
| | | if (dateParts.length >= 2) { |
| | |
| | | } |
| | | }); |
| | | })(window.vc); |
| | | |
| | |
| | | }, |
| | | methods: { |
| | | _initDate: function () { |
| | | // 年份输入框不需要特殊初始化,使用 v-model 双向绑定即可 |
| | | }, |
| | | _loadCommunityList: function () { |
| | | // 获取所有小区列表 |
| | | var communityInfos = vc.getCommunitys(); |
| | | if (communityInfos && Array.isArray(communityInfos) && communityInfos.length > 0) { |
| | | $that.costDetailInfo.communityList = communityInfos; |
| | | // 默认选择第一个小区 |
| | | $that.costDetailInfo.conditions.communityName = communityInfos[0].name; |
| | | } else { |
| | | // 如果获取不到列表,使用当前小区 |
| | | var currentCommunity = vc.getCurrentCommunity(); |
| | | if (currentCommunity && currentCommunity.name) { |
| | | $that.costDetailInfo.communityList = [currentCommunity]; |
| | | $that.costDetailInfo.conditions.communityName = currentCommunity.name; |
| | | } |
| | | } |
| | | // 加载数据 |
| | | $that._listCostDetails(DEFAULT_PAGE, DEFAULT_ROWS); |
| | | }, |
| | | _listCostDetails: function (_page, _rows) { |
| | | // 使用选中的小区名称,如果没有选中则使用当前小区名称 |
| | | var selectedCommunityName = $that.costDetailInfo.conditions.communityName || vc.getCurrentCommunity().name; |
| | | var params = { |
| | | communityName: selectedCommunityName, |
| | |
| | | row: _rows |
| | | }; |
| | | |
| | | // 添加可选查询参数 |
| | | if ($that.costDetailInfo.conditions.flowNumber) { |
| | | params.flowNumber = $that.costDetailInfo.conditions.flowNumber; |
| | | } |
| | |
| | | $that._listCostDetails(DEFAULT_PAGE, $that.costDetailInfo.paginationInfo.rows); |
| | | }, |
| | | _resetQuery: function () { |
| | | // 重置时恢复为第一个小区 |
| | | if ($that.costDetailInfo.communityList && $that.costDetailInfo.communityList.length > 0) { |
| | | $that.costDetailInfo.conditions.communityName = $that.costDetailInfo.communityList[0].name; |
| | | } else { |
| | |
| | | $that._listCostDetails(page, $that.costDetailInfo.paginationInfo.rows); |
| | | }, |
| | | _downloadTemplate: function () { |
| | | // 下载模板 |
| | | vc.toast('模板下载功能'); |
| | | }, |
| | | _importCostDetail: function () { |
| | | // 打开本地文件 |
| | | vc.toast('费用导入功能'); |
| | | }, |
| | | _addCostDetail: function () { |
| | | // 跳转到添加页面 |
| | | vc.jumpToPage('/#/pages/property/costDetail/add'); |
| | | }, |
| | | _viewCostDetail: function (_item) { |
| | | // 查看详情 |
| | | vc.jumpToPage('/#/pages/property/costDetail/detail?costDetailId=' + _item.costDetailId); |
| | | }, |
| | | _viewMore: function (_item) { |
| | | // 查看更多 |
| | | vc.jumpToPage('/#/pages/property/costDetail/more?costDetailId=' + _item.costDetailId); |
| | | }, |
| | | _editCostDetail: function (_item) { |
| | | // 编辑 |
| | | vc.jumpToPage('/#/pages/property/costDetail/edit?costDetailId=' + _item.costDetailId); |
| | | }, |
| | | _deleteCostDetail: function (_item) { |
| | |
| | | ); |
| | | }); |
| | | } else { |
| | | // 如果 vc.confirm 不存在,使用 window.confirm 作为后备方案 |
| | | if (window.confirm('确定要删除这条费用明细吗?')) { |
| | | var param = { |
| | | id: _item.costDetailId, |
| | |
| | | <!-- 流转编码 + 日期 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail" for="flowCode">流转编码</label> |
| | | <p>{{costDetailInfo.flowCode || '-'}}</p> |
| | | <p>{{costDetailInfo.flowCode || '--'}}</p> |
| | | <label class="form-label-detail" for="date">日期</label> |
| | | <p>{{costDetailInfo.date || '-'}}</p> |
| | | <p>{{costDetailInfo.date || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 小区名称 + 小区编码 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail" for="communityName">小区名称</label> |
| | | <p>{{costDetailInfo.communityName || '-'}}</p> |
| | | <p>{{costDetailInfo.communityName || '--'}}</p> |
| | | <label class="form-label-detail">小区编码</label> |
| | | <p>{{costDetailInfo.communityCode || '-'}}</p> |
| | | <p>{{costDetailInfo.communityCode || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 工程内容 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail" for="projectContent">工程内容</label> |
| | | <p>{{costDetailInfo.projectContent || '-'}}</p> |
| | | <p>{{costDetailInfo.projectContent || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 管理处金额 + 是否盖章 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail" for="mgmtAmount">管理处金额</label> |
| | | <p>{{costDetailInfo.managementAmount || '-'}} <span>元</span></p> |
| | | <p>{{costDetailInfo.managementAmount || '--'}} <span>元</span></p> |
| | | <label class="form-label-detail">是否盖章</label> |
| | | <div class="radio-group"> |
| | | <p>{{costDetailInfo.managementStamped == '1' ? '是' : '否'}}</p> |
| | |
| | | <!-- 业委会金额 + 审价金额 + 是否盖章 + 签报部门 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail" for="committeeAmount">业委会金额</label> |
| | | <p>{{costDetailInfo.committeeAmount || '-'}} <span>元</span></p> |
| | | <p>{{costDetailInfo.committeeAmount || '--'}} <span>元</span></p> |
| | | <label class="form-label-detail" for="auditAmount">审价金额</label> |
| | | <p>{{costDetailInfo.appraisalAmount || '-'}} <span>元</span></p> |
| | | <p>{{costDetailInfo.appraisalAmount || '--'}} <span>元</span></p> |
| | | <label class="form-label-detail">是否盖章</label> |
| | | <div class="radio-group"> |
| | | <p>{{costDetailInfo.committeeStamped == '1' ? '是' : '否'}}</p> |
| | | </div> |
| | | <label class="form-label-detail" for="approveDept">签报部门</label> |
| | | <p>{{costDetailInfo.approvalDepartment || '-'}}</p> |
| | | <p>{{costDetailInfo.approvalDepartment || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 分摊范围 + 维修类型 --> |
| | |
| | | <p>{{costDetailInfo.buildingType == '全体' || costDetailInfo.buildingType == '2' ? '全体' : '幢'}}</p> |
| | | </div> |
| | | <label class="form-label-detail" for="repairType">维修类型</label> |
| | | <p>{{costDetailInfo.maintenanceType || '-'}}</p> |
| | | <p>{{costDetailInfo.maintenanceType || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 基金与设施 + 业主大会范围 + 门牌幢范围 --> |
| | | <div class="form-row"> |
| | | <label class="form-label-detail">基金与设施</label> |
| | | <div class="radio-group"> |
| | | <p>{{costDetailInfo.fundTypeLevel1 || '-'}}</p> |
| | | </div> |
| | | <label class="form-label-detail" for="ownerScope">业主大会范围</label> |
| | | <p>{{costDetailInfo.ownerScope || '-'}}</p> |
| | | <label class="form-label-detail" for="buildingScope">门牌幢范围</label> |
| | | <p>{{costDetailInfo.buildingScope || '-'}}</p> |
| | | </div> |
| | | |
| | | <div class="form-row" v-if="costDetailInfo.fundTypeLevel2"> |
| | | <div class="radio-group" style="margin-left: 100px;"> |
| | | <p>{{costDetailInfo.fundTypeLevel2}}</p> |
| | | </div> |
| | | <label class="form-label-detail">{{costDetailInfo.fundTypeLevel1}}</label> |
| | | <label class="form-label-detail" for="ownerScope" v-if="costDetailInfo.fundTypeLevel1 == '维修基金'">业主大会范围</label> |
| | | <p>{{costDetailInfo.fundTypeLevel2 || '--'}}</p> |
| | | <label class="form-label-detail" for="buildingScope" v-if="costDetailInfo.fundTypeLevel1 == '维修基金'">门牌幢范围</label> |
| | | <p v-if="costDetailInfo.fundTypeLevel1 == '维修基金'">{{costDetailInfo.buildingScope || '--'}}</p> |
| | | </div> |
| | | |
| | | <!-- 按钮组 --> |
| | |
| | | }, |
| | | _initMethod: function () { |
| | | $that = vc.component; |
| | | // 从URL获取costDetailId |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (costDetailId) { |
| | | $that.costDetailInfo.costDetailId = costDetailId; |
| | |
| | | }, |
| | | methods: { |
| | | _loadCostDetail: function () { |
| | | // 查询所有数据,然后找到匹配的记录 |
| | | var params = { |
| | | communityName: vc.getCurrentCommunity().name, |
| | | page: 1, |
| | | row: 1000 // 查询足够多的数据以找到目标记录 |
| | | row: 1000 |
| | | }; |
| | | |
| | | var param = { |
| | |
| | | var records = Array.isArray(_json.data) ? _json.data : []; |
| | | console.log('查询到记录数:', records.length); |
| | | |
| | | // 查找匹配的记录 - 支持字符串和数字类型的ID比较 |
| | | var foundItem = null; |
| | | var targetId = String($that.costDetailInfo.costDetailId); |
| | | for (var i = 0; i < records.length; i++) { |
| | |
| | | _fillDetailData: function (item) { |
| | | console.log('开始填充详情数据,原始数据:', item); |
| | | |
| | | // 填充详情数据 |
| | | var dateStr = ''; |
| | | if (item.date) { |
| | | // 如果日期格式是 yyyy-mm-dd 或 yyyy-mm-dd HH:mm:ss,只取日期部分 |
| | | dateStr = item.date.substring(0, 10); |
| | | } else if (item.year && item.month) { |
| | | var monthStr = item.month < 10 ? '0' + item.month : String(item.month); |
| | | var dayStr = item.day ? (item.day < 10 ? '0' + item.day : String(item.day)) : '01'; |
| | | dateStr = item.year + '-' + monthStr + '-' + dayStr; |
| | | } else if (item.year && item.month) { |
| | | // 只有年月的情况 |
| | | var monthStr = item.month < 10 ? '0' + item.month : String(item.month); |
| | | dateStr = item.year + '-' + monthStr; |
| | | } |
| | | |
| | | // 使用Vue.set或者直接赋值来确保响应式更新 |
| | | vc.component.costDetailInfo.flowCode = item.flowNumber || ''; |
| | | vc.component.costDetailInfo.date = dateStr; |
| | | vc.component.costDetailInfo.communityName = item.projectName || ''; |
| | |
| | | vc.component.costDetailInfo.fundTypeLevel1 = item.fundTypeLevel1 || ''; |
| | | vc.component.costDetailInfo.fundTypeLevel2 = item.fundTypeLevel2 || ''; |
| | | |
| | | // 处理buildingType字段 |
| | | var buildingType = item.buildingOrAll || '1'; |
| | | if (buildingType === '全体' || buildingType === '2' || buildingType === 2) { |
| | | vc.component.costDetailInfo.buildingType = '全体'; |
| | |
| | | <label for="committeeSealNo" style="margin-top: 8px;">否</label> |
| | | </div> |
| | | <label class="form-label" for="approveDept">签报部门</label> |
| | | <input type="text" id="approveDept" class="form-input" placeholder="请输入" v-model="costDetailInfo.approvalDepartment" style="width: 120px;"> |
| | | <select id="approveDept" class="form-input" v-model="costDetailInfo.approvalDepartment" style="width: 120px;"> |
| | | <option value="">请选择</option> |
| | | <option value="电梯部">电梯部</option> |
| | | <option value="工程部">工程部</option> |
| | | <option value="管理处">管理处</option> |
| | | <option value="业委会">业委会</option> |
| | | <option value="智能化">智能化</option> |
| | | <option value="品质部">品质部</option> |
| | | <option value="小区经理">小区经理</option> |
| | | </select> |
| | | </div> |
| | | |
| | | <!-- 分摊范围 + 维修类型 --> |
| | |
| | | </div> |
| | | <div class="radio-group" style="margin-left: 100px;" v-if="costDetailInfo.fundType === 'repair'"> |
| | | <label class="form-label" for="ownerScope">业主大会范围</label> |
| | | <select id="ownerScope" class="form-select"> |
| | | <option value="multi">多选</option> |
| | | </select> |
| | | <div class="multi-select-wrapper"> |
| | | <div class="multi-select-input" @click="toggleOwnerScopeDropdown" :class="{ 'active': ownerScopeDropdownOpen }"> |
| | | <div class="multi-select-tags"> |
| | | <span v-for="(item, index) in (costDetailInfo.ownerScope || [])" :key="'tag-' + index" class="multi-select-tag"> |
| | | {{ item }} |
| | | <span class="multi-select-tag-close" @click.stop="removeOwnerScopeItem(index)">×</span> |
| | | </span> |
| | | <span v-if="!costDetailInfo.ownerScope || costDetailInfo.ownerScope.length === 0" class="multi-select-placeholder">请选择</span> |
| | | </div> |
| | | <span class="multi-select-arrow">▼</span> |
| | | </div> |
| | | <div class="multi-select-dropdown" v-show="ownerScopeDropdownOpen"> |
| | | <div class="multi-select-option" v-for="(option, index) in ownerScopeOptions" :key="'option-' + index" @click.stop="toggleOwnerScopeOption(option)"> |
| | | <input type="checkbox" :checked="costDetailInfo.ownerScope && costDetailInfo.ownerScope.indexOf(option) !== -1" @click.stop="toggleOwnerScopeOption(option)"> |
| | | <label>{{ option }}</label> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <label class="form-label" for="buildingScope">门牌幢范围</label> |
| | | <select id="buildingScope" class="form-select"> |
| | | <option value="multi">多选</option> |
| | | </select> |
| | | <div class="multi-select-wrapper"> |
| | | <div class="multi-select-input" @click="toggleBuildingScopeDropdown" :class="{ 'active': buildingScopeDropdownOpen }"> |
| | | <div class="multi-select-tags"> |
| | | <span v-for="(item, index) in (costDetailInfo.buildingScope || [])" :key="'building-tag-' + index" class="multi-select-tag"> |
| | | {{ item }} |
| | | <span class="multi-select-tag-close" @click.stop="removeBuildingScopeItem(index)">×</span> |
| | | </span> |
| | | <span v-if="!costDetailInfo.buildingScope || costDetailInfo.buildingScope.length === 0" class="multi-select-placeholder">请选择</span> |
| | | </div> |
| | | <span class="multi-select-arrow">▼</span> |
| | | </div> |
| | | <div class="multi-select-dropdown" v-show="buildingScopeDropdownOpen"> |
| | | <div class="multi-select-option" v-for="(option, index) in buildingScopeOptions" :key="'building-option-' + index" @click.stop="toggleBuildingScopeOption(option)"> |
| | | <input type="checkbox" :checked="costDetailInfo.buildingScope && costDetailInfo.buildingScope.indexOf(option) !== -1" @click.stop="toggleBuildingScopeOption(option)"> |
| | | <label>{{ option }}</label> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | fundTypeLevel2: '', |
| | | buildingType: '1', |
| | | maintenanceType: '', |
| | | fundType: 'repair', // 默认选中维修资金 |
| | | fundSystemType: 'out' // 默认选中系统外 |
| | | } |
| | | fundType: 'repair', |
| | | fundSystemType: 'out', |
| | | ownerScope: [], |
| | | buildingScope: [] |
| | | }, |
| | | ownerScopeOptions: [ |
| | | '机动车停车库(位)', |
| | | '小区道路', |
| | | '交通附属设施', |
| | | '非机动车车库(相朋)', |
| | | '小区公共照明', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '公共景观绿化', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '楼栋外立面', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)' |
| | | ], |
| | | ownerScopeDropdownOpen: false, |
| | | buildingScopeOptions: [ |
| | | '机动车停车库(位)', |
| | | '交通附属设施', |
| | | '小区道路', |
| | | '公共景观绿化', |
| | | '非机动车车库(棚)', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '太阳能设施', |
| | | '坡屋面', |
| | | '结构', |
| | | '楼栋外立面', |
| | | '楼幢入口', |
| | | '楼幢公共', |
| | | '楼道设施', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)', |
| | | '法院强制执行' |
| | | ], |
| | | buildingScopeDropdownOpen: false |
| | | }, |
| | | _initMethod: function () { |
| | | $that = vc.component; |
| | | // 从URL获取costDetailId |
| | | if (!$that.costDetailInfo) { |
| | | $that.costDetailInfo = {}; |
| | | } |
| | | if (!$that.costDetailInfo.ownerScope || !Array.isArray($that.costDetailInfo.ownerScope)) { |
| | | $that.costDetailInfo.ownerScope = []; |
| | | } |
| | | if (!$that.costDetailInfo.buildingScope || !Array.isArray($that.costDetailInfo.buildingScope)) { |
| | | $that.costDetailInfo.buildingScope = []; |
| | | } |
| | | if (!$that.ownerScopeOptions || !Array.isArray($that.ownerScopeOptions)) { |
| | | $that.ownerScopeOptions = [ |
| | | '机动车停车库(位)', |
| | | '小区道路', |
| | | '交通附属设施', |
| | | '非机动车车库(相朋)', |
| | | '小区公共照明', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '公共景观绿化', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '楼栋外立面', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)' |
| | | ]; |
| | | } |
| | | if ($that.ownerScopeDropdownOpen === undefined) { |
| | | $that.ownerScopeDropdownOpen = false; |
| | | } |
| | | if (!$that.buildingScopeOptions || !Array.isArray($that.buildingScopeOptions)) { |
| | | $that.buildingScopeOptions = [ |
| | | '机动车停车库(位)', |
| | | '交通附属设施', |
| | | '小区道路', |
| | | '公共景观绿化', |
| | | '非机动车车库(棚)', |
| | | '锅炉', |
| | | '排水、排污设施', |
| | | '消防系统', |
| | | '安防设施', |
| | | '健身、游乐设施', |
| | | '小区宣传、标识', |
| | | '强电', |
| | | '弱电', |
| | | '通信设施', |
| | | '公共用房', |
| | | '平屋面', |
| | | '太阳能设施', |
| | | '坡屋面', |
| | | '结构', |
| | | '楼栋外立面', |
| | | '楼幢入口', |
| | | '楼幢公共', |
| | | '楼道设施', |
| | | '供电设施', |
| | | '暖通系统', |
| | | '供水系统', |
| | | '通用设施(配件)', |
| | | '法院强制执行' |
| | | ]; |
| | | } |
| | | if ($that.buildingScopeDropdownOpen === undefined) { |
| | | $that.buildingScopeDropdownOpen = false; |
| | | } |
| | | var clickHandler = function (e) { |
| | | if (!e.target.closest('.multi-select-wrapper')) { |
| | | if ($that && $that.ownerScopeDropdownOpen !== undefined) { |
| | | $that.ownerScopeDropdownOpen = false; |
| | | } |
| | | if ($that && $that.buildingScopeDropdownOpen !== undefined) { |
| | | $that.buildingScopeDropdownOpen = false; |
| | | } |
| | | } |
| | | }; |
| | | setTimeout(function () { |
| | | document.addEventListener('click', clickHandler); |
| | | }, 100); |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (costDetailId) { |
| | | $that.costDetailInfo.costDetailId = costDetailId; |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | toggleOwnerScopeDropdown: function () { |
| | | if ($that && $that.ownerScopeDropdownOpen !== undefined) { |
| | | $that.ownerScopeDropdownOpen = !$that.ownerScopeDropdownOpen; |
| | | } |
| | | }, |
| | | toggleOwnerScopeOption: function (option) { |
| | | if (!$that || !$that.costDetailInfo || !$that.costDetailInfo.ownerScope) { |
| | | return; |
| | | } |
| | | var index = $that.costDetailInfo.ownerScope.indexOf(option); |
| | | if (index === -1) { |
| | | $that.costDetailInfo.ownerScope.push(option); |
| | | } else { |
| | | $that.costDetailInfo.ownerScope.splice(index, 1); |
| | | } |
| | | }, |
| | | removeOwnerScopeItem: function (index) { |
| | | if ($that && $that.costDetailInfo && $that.costDetailInfo.ownerScope) { |
| | | $that.costDetailInfo.ownerScope.splice(index, 1); |
| | | } |
| | | }, |
| | | toggleBuildingScopeDropdown: function () { |
| | | if ($that && $that.buildingScopeDropdownOpen !== undefined) { |
| | | $that.buildingScopeDropdownOpen = !$that.buildingScopeDropdownOpen; |
| | | } |
| | | }, |
| | | toggleBuildingScopeOption: function (option) { |
| | | if (!$that || !$that.costDetailInfo || !$that.costDetailInfo.buildingScope) { |
| | | return; |
| | | } |
| | | var index = $that.costDetailInfo.buildingScope.indexOf(option); |
| | | if (index === -1) { |
| | | $that.costDetailInfo.buildingScope.push(option); |
| | | } else { |
| | | $that.costDetailInfo.buildingScope.splice(index, 1); |
| | | } |
| | | }, |
| | | removeBuildingScopeItem: function (index) { |
| | | if ($that && $that.costDetailInfo && $that.costDetailInfo.buildingScope) { |
| | | $that.costDetailInfo.buildingScope.splice(index, 1); |
| | | } |
| | | }, |
| | | _loadCostDetail: function () { |
| | | // 查询所有数据,然后找到匹配的记录 |
| | | var params = { |
| | | communityName: vc.getCurrentCommunity().name, |
| | | page: 1, |
| | | row: 1000 // 查询足够多的数据以找到目标记录 |
| | | row: 1000 |
| | | }; |
| | | |
| | | var param = { |
| | |
| | | var records = Array.isArray(_json.data) ? _json.data : []; |
| | | console.log('查询到记录数:', records.length); |
| | | |
| | | // 查找匹配的记录 - 支持字符串和数字类型的ID比较 |
| | | var foundItem = null; |
| | | var targetId = String($that.costDetailInfo.costDetailId); |
| | | for (var i = 0; i < records.length; i++) { |
| | |
| | | _fillFormData: function (item) { |
| | | console.log('开始填充表单数据,原始数据:', item); |
| | | |
| | | // 填充表单数据 |
| | | var dateStr = ''; |
| | | if (item.date) { |
| | | dateStr = item.date.substring(0, 10); // 取日期部分 yyyy-mm-dd |
| | | dateStr = item.date.substring(0, 10); |
| | | } else if (item.year && item.month) { |
| | | var monthStr = item.month < 10 ? '0' + item.month : String(item.month); |
| | | var dayStr = item.day ? (item.day < 10 ? '0' + item.day : String(item.day)) : '01'; |
| | | dateStr = item.year + '-' + monthStr + '-' + dayStr; |
| | | } |
| | | |
| | | // 使用Vue.set或者直接赋值来确保响应式更新 |
| | | vc.component.costDetailInfo.flowCode = item.flowNumber || ''; |
| | | vc.component.costDetailInfo.date = dateStr; |
| | | vc.component.costDetailInfo.communityName = item.projectName || ''; |
| | |
| | | vc.component.costDetailInfo.appraisalAmount = item.auditAmount || ''; |
| | | vc.component.costDetailInfo.committeeStamped = (item.ownersCommitteeSeal === '是' || item.ownersCommitteeSeal === '1') ? '1' : '0'; |
| | | vc.component.costDetailInfo.approvalDepartment = item.reportDepartment || ''; |
| | | |
| | | if (item.fundTypeLevel1 === '维修资金') { |
| | | vc.component.costDetailInfo.fundType = 'repair'; |
| | | if (item.fundTypeLevel2) { |
| | | vc.component.costDetailInfo.ownerScope = typeof item.fundTypeLevel2 === 'string' |
| | | ? item.fundTypeLevel2.split(',').filter(function (item) { return item.trim(); }) |
| | | : []; |
| | | } else { |
| | | vc.component.costDetailInfo.ownerScope = []; |
| | | } |
| | | if (item.buildingOrAll) { |
| | | vc.component.costDetailInfo.buildingScope = typeof item.buildingOrAll === 'string' |
| | | ? item.buildingOrAll.split(',').filter(function (item) { return item.trim(); }) |
| | | : []; |
| | | } else { |
| | | vc.component.costDetailInfo.buildingScope = []; |
| | | } |
| | | vc.component.costDetailInfo.fundSystemType = 'out'; |
| | | } else if (item.fundTypeLevel1 === '公共收益') { |
| | | vc.component.costDetailInfo.fundType = 'public'; |
| | | if (item.fundTypeLevel2 === '系统外') { |
| | | vc.component.costDetailInfo.fundSystemType = 'out'; |
| | | } else if (item.fundTypeLevel2 === '系统内') { |
| | | vc.component.costDetailInfo.fundSystemType = 'in'; |
| | | } else { |
| | | vc.component.costDetailInfo.fundSystemType = 'out'; |
| | | } |
| | | vc.component.costDetailInfo.ownerScope = []; |
| | | vc.component.costDetailInfo.buildingScope = []; |
| | | } else { |
| | | vc.component.costDetailInfo.fundType = 'repair'; |
| | | vc.component.costDetailInfo.ownerScope = []; |
| | | vc.component.costDetailInfo.buildingScope = []; |
| | | vc.component.costDetailInfo.fundSystemType = 'out'; |
| | | } |
| | | |
| | | vc.component.costDetailInfo.fundTypeLevel1 = item.fundTypeLevel1 || ''; |
| | | vc.component.costDetailInfo.fundTypeLevel2 = item.fundTypeLevel2 || ''; |
| | | |
| | | // 处理buildingType字段 |
| | | var buildingType = item.buildingOrAll || '1'; |
| | | if (buildingType === '全体' || buildingType === '2' || buildingType === 2) { |
| | | vc.component.costDetailInfo.buildingType = '全体'; |
| | | } else { |
| | | if (buildingType && buildingType.indexOf(',') !== -1) { |
| | | vc.component.costDetailInfo.buildingType = '1'; |
| | | } else { |
| | | vc.component.costDetailInfo.buildingType = buildingType || '1'; |
| | | } |
| | | } |
| | | |
| | | vc.component.costDetailInfo.maintenanceType = item.maintenanceType || ''; |
| | | |
| | | // 设置基金类型 |
| | | if (item.fundTypeLevel1) { |
| | | vc.component.costDetailInfo.fundType = (item.fundTypeLevel1 === '维修资金' || item.fundTypeLevel1 === '1') ? 'repair' : 'public'; |
| | | } else { |
| | | vc.component.costDetailInfo.fundType = 'repair'; // 默认值 |
| | | } |
| | | |
| | | if (item.fundTypeLevel2) { |
| | | vc.component.costDetailInfo.fundSystemType = (item.fundTypeLevel2 === '系统外' || item.fundTypeLevel2 === 'out') ? 'out' : 'in'; |
| | | } else { |
| | | vc.component.costDetailInfo.fundSystemType = 'out'; // 默认值 |
| | | } |
| | | |
| | | console.log('表单数据填充完成:', vc.component.costDetailInfo); |
| | | }, |
| | | _saveCostDetail: function () { |
| | | // 验证必填字段 |
| | | if (!$that.costDetailInfo.flowCode) { |
| | | vc.toast('请输入流转编码'); |
| | | return; |
| | |
| | | return; |
| | | } |
| | | |
| | | // 构建保存数据 |
| | | var fundTypeLevel1 = ''; |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | fundTypeLevel1 = '维修资金'; |
| | | } else if ($that.costDetailInfo.fundType === 'public') { |
| | | fundTypeLevel1 = '公共收益'; |
| | | } |
| | | |
| | | var fundTypeLevel2 = ''; |
| | | var buildingOrAll = ''; |
| | | |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | fundTypeLevel2 = ($that.costDetailInfo.ownerScope && $that.costDetailInfo.ownerScope.length > 0) |
| | | ? $that.costDetailInfo.ownerScope.join(',') |
| | | : ''; |
| | | buildingOrAll = ($that.costDetailInfo.buildingScope && $that.costDetailInfo.buildingScope.length > 0) |
| | | ? $that.costDetailInfo.buildingScope.join(',') |
| | | : ''; |
| | | } else if ($that.costDetailInfo.fundType === 'public') { |
| | | if ($that.costDetailInfo.fundSystemType === 'out') { |
| | | fundTypeLevel2 = '系统外'; |
| | | } else if ($that.costDetailInfo.fundSystemType === 'in') { |
| | | fundTypeLevel2 = '系统内'; |
| | | } |
| | | buildingOrAll = ''; |
| | | } else { |
| | | buildingOrAll = ''; |
| | | } |
| | | |
| | | var saveData = { |
| | | id: $that.costDetailInfo.costDetailId, |
| | | flowNumber: $that.costDetailInfo.flowCode, |
| | |
| | | auditAmount: parseFloat($that.costDetailInfo.appraisalAmount) || 0, |
| | | ownersCommitteeSeal: $that.costDetailInfo.committeeStamped === '1' ? '是' : '否', |
| | | reportDepartment: $that.costDetailInfo.approvalDepartment || '', |
| | | fundTypeLevel1: $that.costDetailInfo.fundType === 'repair' ? '维修资金' : '公共收益', |
| | | fundTypeLevel2: $that.costDetailInfo.fundType === 'public' ? ($that.costDetailInfo.fundSystemType === 'out' ? '系统外' : '系统内') : '', |
| | | buildingOrAll: $that.costDetailInfo.buildingType === '全体' ? '全体' : ($that.costDetailInfo.buildingType || '1'), |
| | | fundTypeLevel1: fundTypeLevel1, |
| | | fundTypeLevel2: fundTypeLevel2, |
| | | maintenanceType: $that.costDetailInfo.maintenanceType || '', |
| | | communityId: vc.getCurrentCommunity().communityId |
| | | }; |
| | | |
| | | // 解析日期 |
| | | if ($that.costDetailInfo.fundType === 'repair') { |
| | | saveData.buildingOrAll = buildingOrAll; |
| | | } |
| | | |
| | | if (saveData.date) { |
| | | var dateParts = saveData.date.split('-'); |
| | | if (dateParts.length >= 2) { |
| | |
| | | } |
| | | } |
| | | |
| | | // 调用更新API |
| | | vc.http.apiPost('/maintenancePayment/updateMaintenancePayment', |
| | | JSON.stringify(saveData), { |
| | | emulateJSON: true |
| | |
| | | <p style="position: relative; top: 6px;">{{moreInfo.conditions.endDate || '--'}}</p> |
| | | </div> |
| | | <div class="action-buttons"> |
| | | <!-- <button type="button" class="edit-btn" v-on:click="_editPublicIncome()" style="line-height: 0px;">编辑</button> --> |
| | | <button type="button" class="add-btn" v-on:click="_add()" style="line-height: 0px;">添加</button> |
| | | <button type="button" class="import-btn" v-on:click="_export()" style="line-height: 0px; background-color: white; color: #333; border: 1px solid #e8e8e8;">导出</button> |
| | | <button type="button" class="import-btn" v-on:click="_export()" |
| | | style="line-height: 0px; background-color: white; color: #333; border: 1px solid #e8e8e8;">导出</button> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | <div class="margin-top-sm"> |
| | | <ul class="nav nav-tabs"> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'publicIncome'}" v-on:click="changeTab('publicIncome')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'publicIncome'}" |
| | | v-on:click="changeTab('publicIncome')"> |
| | | 公共收益金 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'convention'}" v-on:click="changeTab('convention')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'convention'}" |
| | | v-on:click="changeTab('convention')"> |
| | | 业委会公约 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'withdrawalIssues'}" v-on:click="changeTab('withdrawalIssues')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'withdrawalIssues'}" |
| | | v-on:click="changeTab('withdrawalIssues')"> |
| | | 支取存在问题 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'warranty'}" v-on:click="changeTab('warranty')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'warranty'}" |
| | | v-on:click="changeTab('warranty')"> |
| | | 质保金/验收审核 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'printDetail'}" v-on:click="changeTab('printDetail')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'printDetail'}" |
| | | v-on:click="changeTab('printDetail')"> |
| | | 打印明细 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'printSummary'}" v-on:click="changeTab('printSummary')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'printSummary'}" |
| | | v-on:click="changeTab('printSummary')"> |
| | | 打印汇总 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'payablePaid'}" v-on:click="changeTab('payablePaid')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'payablePaid'}" |
| | | v-on:click="changeTab('payablePaid')"> |
| | | 应付/实付 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'payablePaidSummary'}" v-on:click="changeTab('payablePaidSummary')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'payablePaidSummary'}" |
| | | v-on:click="changeTab('payablePaidSummary')"> |
| | | 应付实付汇总 |
| | | </a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'remarks'}" v-on:click="changeTab('remarks')"> |
| | | <a class="nav-link" v-bind:class="{active:moreInfo.currentTab == 'remarks'}" |
| | | v-on:click="changeTab('remarks')"> |
| | | 备注 |
| | | </a> |
| | | </li> |
| | |
| | | <th style="background-color: rgb(233, 243, 255);">序号</th> |
| | | <th style="background-color: rgb(233, 243, 255);">打印合计</th> |
| | | <th style="background-color: rgb(233, 243, 255);">到账合计</th> |
| | | <th style="background-color: rgb(233, 243, 255);">到账率 <span title="维修基金或公共收益金到账率" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">尚缺金额 <span title="维修基金或公共收益金尚缺金额" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">管理费占比 <span title="按照施工单位承诺函,人工输入值" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">管理费 <span title="按照施工单位承诺函,人工输入值" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额A <span title="签报业委会金额—管理费" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额B <span title="签报业委会金额—质保金金额—管理" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额C <span title="按到账应付—同比管理费,到账金额不包含质保金" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">到账率 <span title="维修基金或公共收益金到账率" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">尚缺金额 <span title="维修基金或公共收益金尚缺金额" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">管理费占比 <span title="按照施工单位承诺函,人工输入值" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">管理费 <span title="按照施工单位承诺函,人工输入值" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额A <span title="签报业委会金额—管理费" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额B <span title="签报业委会金额—质保金金额—管理" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">应付金额C <span title="按到账应付—同比管理费,到账金额不包含质保金" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">支付公司或个人名称</th> |
| | | <th style="background-color: rgb(233, 243, 255);">身份证号</th> |
| | | <th style="background-color: rgb(233, 243, 255);">开户银行</th> |
| | |
| | | </tr> |
| | | </tbody> |
| | | </table> |
| | | <!-- 打印汇总备注说明 --> |
| | | <!-- <div v-if="moreInfo.currentTab == 'printSummary'" style="margin-top: 20px; padding: 10px; background-color: #f5f5f5; border-radius: 4px;"> |
| | | <div style="font-weight: bold; margin-bottom: 10px;">备注:光标浮在①上时,有解释提示,内容如下:</div> |
| | | <div style="margin-left: 20px;"> |
| | | <div><strong>到账率:</strong> 维修基金或公共收益金到账率</div> |
| | | <div><strong>尚缺金额:</strong> 维修基金或公共收益金尚缺金额</div> |
| | | <div><strong>管理费占比:</strong> 按照施工单位承诺函,人工输入值</div> |
| | | <div><strong>应付金额A:</strong> 签报业委会金额—管理费</div> |
| | | <div><strong>应付金额B:</strong> 签报业委会金额—质保金金额—管理</div> |
| | | <div><strong>应付金额C:</strong> 按到账应付—同比管理费,到账金额不包含质保金</div> |
| | | </div> |
| | | </div> --> |
| | | |
| | | <!-- 数据表格 - 应付/实付 --> |
| | | <table v-if="moreInfo.currentTab == 'payablePaid'"> |
| | |
| | | <th style="background-color: rgb(233, 243, 255);">未付合计</th> |
| | | <th style="background-color: rgb(233, 243, 255);">垫付金额</th> |
| | | <th style="background-color: rgb(233, 243, 255);">未付合计-到帐口径</th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额A <span title="签报业委会金额—管理费" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额B <span title="签报业委会金额—质保金金额—管理" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额C <span title="按到账应付—同比管理费,到账金额不包含质保金" style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额A <span title="签报业委会金额—管理费" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额B <span title="签报业委会金额—质保金金额—管理" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">待付金额C <span title="按到账应付—同比管理费,到账金额不包含质保金" |
| | | style="cursor: pointer;">①</span></th> |
| | | <th style="background-color: rgb(233, 243, 255);">操作</th> |
| | | </tr> |
| | | </thead> |
| | |
| | | </tr> |
| | | </tbody> |
| | | </table> |
| | | <!-- 应付实付汇总备注说明 --> |
| | | <!-- <div v-if="moreInfo.currentTab == 'payablePaidSummary'" style="margin-top: 20px; padding: 10px; background-color: #f5f5f5; border-radius: 4px;"> |
| | | <div style="font-weight: bold; margin-bottom: 10px;">备注:光标浮在①上时,有解释提示,内容如下:</div> |
| | | <div style="margin-left: 20px;"> |
| | | <div><strong>待付金额A:</strong> 签报业委会金额—管理费</div> |
| | | <div><strong>待付金额B:</strong> 签报业委会金额—质保金金额—管理</div> |
| | | <div><strong>待付金额C:</strong> 按到账应付—同比管理费,到账金额不包含质保金</div> |
| | | </div> |
| | | </div> --> |
| | | |
| | | |
| | | <!-- 数据表格 - 备注 --> |
| | | <table v-if="moreInfo.currentTab == 'remarks'"> |
| | |
| | | <button class="page-btn" v-on:click="_goToPage(moreInfo.paginationInfo.currentPage - 1)" |
| | | :disabled="moreInfo.paginationInfo.currentPage == 1">‹</button> |
| | | <button class="page-btn" v-for="page in moreInfo.paginationInfo.pageList" |
| | | :class="{active: page.currentPage}" |
| | | v-on:click="_goToPage(page.page)" |
| | | v-if="page.pageView != '...'"> |
| | | :class="{active: page.currentPage}" v-on:click="_goToPage(page.page)" v-if="page.pageView != '...'"> |
| | | {{page.pageView}} |
| | | </button> |
| | | <span v-for="page in moreInfo.paginationInfo.pageList" |
| | | v-if="page.pageView == '...'" |
| | | <span v-for="page in moreInfo.paginationInfo.pageList" v-if="page.pageView == '...'" |
| | | class="page-ellipsis">...</span> |
| | | <button class="page-btn" v-on:click="_goToPage(moreInfo.paginationInfo.currentPage + 1)" |
| | | :disabled="moreInfo.paginationInfo.currentPage == moreInfo.paginationInfo.total">›</button> |
| | | <span class="jump-label">跳转至</span> |
| | | <input type="number" class="jump-input" v-model="moreInfo.jumpPage" min="1" :max="moreInfo.paginationInfo.total" /> |
| | | <input type="number" class="jump-input" v-model="moreInfo.jumpPage" min="1" |
| | | :max="moreInfo.paginationInfo.total" /> |
| | | <span class="page-label">页</span> |
| | | <button class="page-btn" v-on:click="_jumpToPage()">确定</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 编辑公共收益金 Modal --> |
| | | <div class="modal fade" id="editPublicIncomeModal" inert aria-hidden="true" tabindex="-1" style="position: relative; top: 50%; left: 50%; transform: translate(-50%, -30%);"> |
| | | <!-- 添加公告时间范围 Modal --> |
| | | <div class="modal fade" id="addAnnouncementTimeRangeModal" inert aria-hidden="true" tabindex="-1" |
| | | style="position: relative; top: 50%; left: 50%; transform: translate(-50%, -30%);"> |
| | | <div class="modal-dialog"> |
| | | <div class="modal-content" style="border-radius: 10px;"> |
| | | <div class="modal-header"> |
| | | <h4 class="modal-title">添加</h4> |
| | | <button type="button" class="close" v-on:click="_hideAddAnnouncementModal()" aria-label="Close"><span |
| | | aria-hidden="true">×</span></button> |
| | | </div> |
| | | <div class="modal-body edit-public-income-modal"> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">拟公布-起始(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.addForm.plannedAnnouncementStart" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">拟公布-止(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.addForm.plannedAnnouncementEnd" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">已公布-起始(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.addForm.publishedAnnouncementStart" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">已公布-止(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.addForm.publishedAnnouncementEnd" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="display: flex; justify-content: center; padding-bottom: 20px; gap: 20px;"> |
| | | <button type="button" class="btn btn-white" v-on:click="_hideAddAnnouncementModal()">取消</button> |
| | | <button type="button" class="btn btn-primary" v-on:click="_saveAddAnnouncementTimeRange()">确认</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 编辑公告时间范围 Modal --> |
| | | <div class="modal fade" id="editAnnouncementTimeRangeModal" inert aria-hidden="true" tabindex="-1" |
| | | style="position: relative; top: 50%; left: 50%; transform: translate(-50%, -30%);"> |
| | | <div class="modal-dialog"> |
| | | <div class="modal-content" style="border-radius: 10px;"> |
| | | <div class="modal-header"> |
| | | <h4 class="modal-title">编辑</h4> |
| | | <button type="button" class="close" v-on:click="_hideEditPublicModal()" aria-label="Close"><span aria-hidden="true">×</span></button> |
| | | <button type="button" class="close" v-on:click="_hideEditAnnouncementModal()" aria-label="Close"><span |
| | | aria-hidden="true">×</span></button> |
| | | </div> |
| | | <div class="modal-body edit-public-income-modal"> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">拟公布-起始(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.editAnnouncementForm.plannedAnnouncementStart" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">拟公布-止(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.editAnnouncementForm.plannedAnnouncementEnd" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">已公布-起始(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.editAnnouncementForm.publishedAnnouncementStart" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">已公布-止(年月)</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="month" class="form-control edit-input" |
| | | v-model.trim="moreInfo.editAnnouncementForm.publishedAnnouncementEnd" placeholder="请选择年月"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="display: flex; justify-content: center; padding-bottom: 20px; gap: 20px;"> |
| | | <button type="button" class="btn btn-white" v-on:click="_hideEditAnnouncementModal()">取消</button> |
| | | <button type="button" class="btn btn-primary" v-on:click="_saveEditAnnouncementTimeRange()">确认</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 编辑公共收益金 Modal --> |
| | | <div class="modal fade" id="editPublicIncomeModal" inert aria-hidden="true" tabindex="-1" |
| | | style="position: relative; top: 50%; left: 50%; transform: translate(-50%, -30%);"> |
| | | <div class="modal-dialog"> |
| | | <div class="modal-content" style="border-radius: 10px;"> |
| | | <div class="modal-header"> |
| | | <h4 class="modal-title">编辑</h4> |
| | | <button type="button" class="close" v-on:click="_hideEditPublicModal()" aria-label="Close"><span |
| | | aria-hidden="true">×</span></button> |
| | | </div> |
| | | <div class="modal-body edit-public-income-modal"> |
| | | <div class="form-group edit-form-group"> |
| | | <label class="edit-form-label">额度</label> |
| | | <div class="edit-input-wrapper"> |
| | | <input type="text" class="form-control edit-input" v-model.trim="moreInfo.editForm.amount" placeholder="请输入名称"> |
| | | <input type="text" class="form-control edit-input" v-model.trim="moreInfo.editForm.amount" |
| | | placeholder="请输入名称"> |
| | | <span class="edit-input-unit">元</span> |
| | | </div> |
| | | </div> |
| | |
| | | <label class="edit-form-label">业委会大会决议</label> |
| | | <div class="edit-radio-group"> |
| | | <label class="edit-radio-label"> |
| | | <input type="radio" name="meetingResolution" value="1" v-model="moreInfo.editForm.meetingResolution"> 是 |
| | | <input type="radio" name="meetingResolution" value="1" |
| | | v-model="moreInfo.editForm.meetingResolution"> 是 |
| | | </label> |
| | | <label class="edit-radio-label"> |
| | | <input type="radio" name="meetingResolution" value="0" v-model="moreInfo.editForm.meetingResolution"> 否 |
| | | <input type="radio" name="meetingResolution" value="0" |
| | | v-model="moreInfo.editForm.meetingResolution"> 否 |
| | | </label> |
| | | </div> |
| | | </div> |
| | |
| | | <label class="edit-form-label">业委会征询表</label> |
| | | <div class="edit-radio-group"> |
| | | <label class="edit-radio-label"> |
| | | <input type="radio" name="consultationForm" value="1" v-model="moreInfo.editForm.consultationForm"> 是 |
| | | <input type="radio" name="consultationForm" value="1" |
| | | v-model="moreInfo.editForm.consultationForm"> 是 |
| | | </label> |
| | | <label class="edit-radio-label"> |
| | | <input type="radio" name="consultationForm" value="0" v-model="moreInfo.editForm.consultationForm"> 否 |
| | | <input type="radio" name="consultationForm" value="0" |
| | | v-model="moreInfo.editForm.consultationForm"> 否 |
| | | </label> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | /** |
| | | 业委会公约管理 |
| | | 费用明细更多管理 |
| | | **/ |
| | | (function (vc) { |
| | | var DEFAULT_PAGE = 1; |
| | |
| | | amount: '', |
| | | meetingResolution: '1', |
| | | consultationForm: '1' |
| | | }, |
| | | addForm: { |
| | | plannedAnnouncementStart: '', |
| | | plannedAnnouncementEnd: '', |
| | | publishedAnnouncementStart: '', |
| | | publishedAnnouncementEnd: '' |
| | | }, |
| | | editAnnouncementForm: { |
| | | id: '', |
| | | mpId: '', |
| | | plannedAnnouncementStart: '', |
| | | plannedAnnouncementEnd: '', |
| | | publishedAnnouncementStart: '', |
| | | publishedAnnouncementEnd: '' |
| | | } |
| | | } |
| | | }, |
| | | _initMethod: function () { |
| | | $that = vc.component; |
| | | $that._initDate(); |
| | | // 进入页面时立即调用接口 |
| | | $that._loadPublicIncomeData(DEFAULT_PAGE, DEFAULT_ROWS); |
| | | // 根据当前标签页加载数据 |
| | | if ($that.moreInfo.currentTab !== 'publicIncome') { |
| | | $that._listData(DEFAULT_PAGE, DEFAULT_ROWS); |
| | | } |
| | |
| | | }, |
| | | methods: { |
| | | _initDate: function () { |
| | | // 初始化日期选择器 |
| | | $(".startDate").datetimepicker({ |
| | | minView: "month", |
| | | language: 'zh-CN', |
| | |
| | | clearBtn: true |
| | | }); |
| | | |
| | | // 设置默认日期为当前月份 |
| | | var now = new Date(); |
| | | var year = now.getFullYear(); |
| | | var month = now.getMonth() + 1; |
| | | var startDateStr = year + '-' + (month < 10 ? '0' + month : month) + '-01'; |
| | | var endDate = new Date(year, month, 0); // 获取当月最后一天 |
| | | var endDate = new Date(year, month, 0); |
| | | var endDateStr = year + '-' + (month < 10 ? '0' + month : month) + '-' + endDate.getDate(); |
| | | |
| | | $that.moreInfo.conditions.startDate = startDateStr; |
| | |
| | | } |
| | | }); |
| | | |
| | | // 防止多次点击时间插件失去焦点 |
| | | var startDateElements = document.getElementsByClassName('form-control startDate'); |
| | | if (startDateElements.length > 0) { |
| | | startDateElements[0].addEventListener('click', function (e) { |
| | |
| | | }, |
| | | changeTab: function (_tab) { |
| | | $that.moreInfo.currentTab = _tab; |
| | | // 根据标签页加载不同数据 |
| | | if (_tab === 'publicIncome') { |
| | | // 公共收益金标签,调用特殊接口 |
| | | $that._loadPublicIncomeData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } else if (_tab === 'convention') { |
| | | $that._loadConventionData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | $that._listData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } |
| | | }, |
| | | _loadPublicIncomeData: function (_page, _rows) { |
| | | // 获取URL参数中的costDetailId |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (!costDetailId) { |
| | | // 尝试从hash中获取 |
| | | var hash = location.hash; |
| | | if (hash && hash.indexOf('?') !== -1) { |
| | | var hashParams = hash.substring(hash.indexOf('?') + 1); |
| | |
| | | } |
| | | }; |
| | | |
| | | // 调用公共收益金接口 |
| | | vc.http.apiGet('/announcementTimeRange/queryAnnouncementTimeRangeInfo', |
| | | param, |
| | | function (json, res) { |
| | |
| | | if (_json.code === "0000") { |
| | | var total = _json.total || 0; |
| | | var rows = _rows || DEFAULT_ROWS; |
| | | // 计算总页数 |
| | | var totalPages = Math.ceil(total / rows); |
| | | if (totalPages === 0) { |
| | | totalPages = 1; |
| | |
| | | $that.moreInfo.paginationInfo.dataCount = total; |
| | | $that.moreInfo.paginationInfo.total = totalPages; |
| | | |
| | | // 映射数据字段 |
| | | var dataList = []; |
| | | if (_json.data && Array.isArray(_json.data)) { |
| | | dataList = _json.data.map(function(item) { |
| | |
| | | } |
| | | ); |
| | | }, |
| | | _loadConventionData: function (_page, _rows) { |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (!costDetailId) { |
| | | var hash = location.hash; |
| | | if (hash && hash.indexOf('?') !== -1) { |
| | | var hashParams = hash.substring(hash.indexOf('?') + 1); |
| | | var params = hashParams.split('&'); |
| | | for (var i = 0; i < params.length; i++) { |
| | | var param = params[i].split('='); |
| | | if (param[0] === 'costDetailId') { |
| | | costDetailId = decodeURIComponent(param[1] || ''); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (!costDetailId) { |
| | | vc.toast('缺少costDetailId参数'); |
| | | return; |
| | | } |
| | | |
| | | var param = { |
| | | params: { |
| | | mpId: costDetailId, |
| | | page: _page || 1, |
| | | row: _rows || DEFAULT_ROWS |
| | | } |
| | | }; |
| | | |
| | | vc.http.apiGet('/ownersCommitteeConvention/queryOwnersCommitteeConvention', |
| | | param, |
| | | function (json, res) { |
| | | try { |
| | | var _json = JSON.parse(json); |
| | | if (_json.code === "0000") { |
| | | var total = _json.total || 0; |
| | | var rows = _rows || DEFAULT_ROWS; |
| | | var totalPages = Math.ceil(total / rows); |
| | | if (totalPages === 0) { |
| | | totalPages = 1; |
| | | } |
| | | |
| | | $that.moreInfo.paginationInfo.dataCount = total; |
| | | $that.moreInfo.paginationInfo.total = totalPages; |
| | | |
| | | var dataList = []; |
| | | if (_json.data && Array.isArray(_json.data)) { |
| | | dataList = _json.data; |
| | | } |
| | | |
| | | $that.moreInfo.dataList = dataList; |
| | | $that.moreInfo.paginationInfo.currentPage = _page; |
| | | $that._freshPageList(); |
| | | } else { |
| | | vc.toast(_json.msg || '查询失败'); |
| | | $that.moreInfo.dataList = []; |
| | | $that.moreInfo.paginationInfo.dataCount = 0; |
| | | $that.moreInfo.paginationInfo.total = 1; |
| | | $that.moreInfo.paginationInfo.currentPage = _page; |
| | | $that._freshPageList(); |
| | | } |
| | | } catch (e) { |
| | | console.error('数据解析失败:', e); |
| | | vc.toast('数据解析失败'); |
| | | $that.moreInfo.dataList = []; |
| | | $that.moreInfo.paginationInfo.dataCount = 0; |
| | | $that.moreInfo.paginationInfo.total = 1; |
| | | $that.moreInfo.paginationInfo.currentPage = _page; |
| | | $that._freshPageList(); |
| | | } |
| | | }, |
| | | function (errInfo, error) { |
| | | console.error('请求失败:', errInfo, error); |
| | | vc.toast(errInfo || '请求失败,请检查网络连接'); |
| | | $that.moreInfo.dataList = []; |
| | | $that.moreInfo.paginationInfo.dataCount = 0; |
| | | $that.moreInfo.paginationInfo.total = 1; |
| | | $that.moreInfo.paginationInfo.currentPage = _page; |
| | | $that._freshPageList(); |
| | | } |
| | | ); |
| | | }, |
| | | _listData: function (_page, _rows) { |
| | | $that.moreInfo.conditions.page = _page; |
| | | $that.moreInfo.conditions.row = _rows; |
| | |
| | | var param = { |
| | | params: $that.moreInfo.conditions |
| | | }; |
| | | // 发送get请求 - 这里需要根据实际API调整 |
| | | vc.http.apiGet('/costDetail/queryMore', |
| | | param, |
| | | function (json, res) { |
| | |
| | | }, |
| | | function (errInfo, error) { |
| | | console.log('请求失败处理'); |
| | | // 模拟数据用于演示 |
| | | $that.moreInfo.dataList = [ |
| | | { |
| | | amount: '张三三', |
| | |
| | | var pageList = []; |
| | | |
| | | if (total <= 7) { |
| | | // 总页数小于等于7,显示所有页码 |
| | | for (var i = 1; i <= total; i++) { |
| | | pageList.push({ |
| | | page: i, |
| | |
| | | }); |
| | | } |
| | | } else { |
| | | // 总页数大于7,显示部分页码 |
| | | if (currentPage <= 4) { |
| | | // 当前页在前4页 |
| | | for (var i = 1; i <= 5; i++) { |
| | | pageList.push({ |
| | | page: i, |
| | |
| | | currentPage: false |
| | | }); |
| | | } else if (currentPage >= total - 3) { |
| | | // 当前页在后4页 |
| | | pageList.push({ |
| | | page: 1, |
| | | pageView: 1, |
| | |
| | | }); |
| | | } |
| | | } else { |
| | | // 当前页在中间 |
| | | pageList.push({ |
| | | page: 1, |
| | | pageView: 1, |
| | |
| | | _changePageSize: function () { |
| | | if ($that.moreInfo.currentTab === 'publicIncome') { |
| | | $that._loadPublicIncomeData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } else if ($that.moreInfo.currentTab === 'convention') { |
| | | $that._loadConventionData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | $that._listData(DEFAULT_PAGE, $that.moreInfo.paginationInfo.rows); |
| | | } |
| | |
| | | } |
| | | if ($that.moreInfo.currentTab === 'publicIncome') { |
| | | $that._loadPublicIncomeData(_page, $that.moreInfo.paginationInfo.rows); |
| | | } else if ($that.moreInfo.currentTab === 'convention') { |
| | | $that._loadConventionData(_page, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | $that._listData(_page, $that.moreInfo.paginationInfo.rows); |
| | | } |
| | |
| | | } |
| | | if ($that.moreInfo.currentTab === 'publicIncome') { |
| | | $that._loadPublicIncomeData(page, $that.moreInfo.paginationInfo.rows); |
| | | } else if ($that.moreInfo.currentTab === 'convention') { |
| | | $that._loadConventionData(page, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | $that._listData(page, $that.moreInfo.paginationInfo.rows); |
| | | } |
| | | }, |
| | | _add: function () { |
| | | // 添加功能 |
| | | vc.toast('添加功能'); |
| | | if ($that.moreInfo.currentTab !== 'publicIncome') { |
| | | return; |
| | | } |
| | | $that.moreInfo.addForm = { |
| | | plannedAnnouncementStart: '', |
| | | plannedAnnouncementEnd: '', |
| | | publishedAnnouncementStart: '', |
| | | publishedAnnouncementEnd: '' |
| | | }; |
| | | $that._showAddAnnouncementModal(); |
| | | }, |
| | | _showAddAnnouncementModal: function () { |
| | | const modal = document.getElementById('addAnnouncementTimeRangeModal'); |
| | | modal.classList.add('show'); |
| | | modal.style.display = 'block'; |
| | | modal.removeAttribute('inert'); |
| | | modal.removeAttribute('aria-hidden'); |
| | | modal.setAttribute('aria-modal', 'true'); |
| | | modal.focus(); |
| | | }, |
| | | _hideAddAnnouncementModal: function () { |
| | | const modal = document.getElementById('addAnnouncementTimeRangeModal'); |
| | | modal.classList.remove('show'); |
| | | modal.style.display = 'none'; |
| | | modal.setAttribute('inert', ''); |
| | | modal.setAttribute('aria-hidden', 'true'); |
| | | modal.removeAttribute('aria-modal'); |
| | | }, |
| | | _saveAddAnnouncementTimeRange: function () { |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (!costDetailId) { |
| | | var hash = location.hash; |
| | | if (hash && hash.indexOf('?') !== -1) { |
| | | var hashParams = hash.substring(hash.indexOf('?') + 1); |
| | | var params = hashParams.split('&'); |
| | | for (var i = 0; i < params.length; i++) { |
| | | var param = params[i].split('='); |
| | | if (param[0] === 'costDetailId') { |
| | | costDetailId = decodeURIComponent(param[1] || ''); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (!costDetailId) { |
| | | vc.toast('缺少costDetailId参数'); |
| | | return; |
| | | } |
| | | |
| | | var requestData = { |
| | | mpId: costDetailId, |
| | | plannedAnnouncementStart: $that.moreInfo.addForm.plannedAnnouncementStart || '', |
| | | plannedAnnouncementEnd: $that.moreInfo.addForm.plannedAnnouncementEnd || '', |
| | | publishedAnnouncementStart: $that.moreInfo.addForm.publishedAnnouncementStart || '', |
| | | publishedAnnouncementEnd: $that.moreInfo.addForm.publishedAnnouncementEnd || '' |
| | | }; |
| | | |
| | | vc.http.apiPost('/announcementTimeRange/saveAnnouncementTimeRangeInfo', |
| | | JSON.stringify(requestData), |
| | | { |
| | | emulateJSON: true |
| | | }, |
| | | function (json, res) { |
| | | try { |
| | | var _json = JSON.parse(json); |
| | | if (_json.code === "0000") { |
| | | vc.toast(_json.msg || '保存成功'); |
| | | $that._hideAddAnnouncementModal(); |
| | | $that._loadPublicIncomeData($that.moreInfo.paginationInfo.currentPage, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | vc.toast(_json.msg || '保存失败'); |
| | | } |
| | | } catch (e) { |
| | | console.error('数据解析失败:', e); |
| | | vc.toast('数据解析失败'); |
| | | } |
| | | }, |
| | | function (errInfo, error) { |
| | | console.error('请求失败:', errInfo, error); |
| | | vc.toast(errInfo || '保存失败,请检查网络连接'); |
| | | } |
| | | ); |
| | | }, |
| | | _export: function () { |
| | | // 导出功能 |
| | | vc.toast('导出功能'); |
| | | }, |
| | | _viewDetailPublicIncome: function (_item) { |
| | | // 查看详情 |
| | | vc.toast('查看详情功能'); |
| | | }, |
| | | _showEditPublicModal: function () { |
| | |
| | | modal.removeAttribute('aria-modal'); |
| | | }, |
| | | _editPublicIncome: function (_item) { |
| | | // 编辑 - 填充表单数据 |
| | | // $that.moreInfo.editForm.id = _item.id || ''; |
| | | // $that.moreInfo.editForm.amount = _item.amount || ''; |
| | | // $that.moreInfo.editForm.meetingResolution = _item.meetingResolution || '1'; |
| | | // $that.moreInfo.editForm.consultationForm = _item.consultationForm || '1'; |
| | | // 打开弹窗 |
| | | $that._showEditPublicModal(); |
| | | if (!_item || !_item.id) { |
| | | vc.toast('数据错误,无法编辑'); |
| | | return; |
| | | } |
| | | |
| | | var costDetailId = vc.getParam('costDetailId'); |
| | | if (!costDetailId) { |
| | | var hash = location.hash; |
| | | if (hash && hash.indexOf('?') !== -1) { |
| | | var hashParams = hash.substring(hash.indexOf('?') + 1); |
| | | var params = hashParams.split('&'); |
| | | for (var i = 0; i < params.length; i++) { |
| | | var param = params[i].split('='); |
| | | if (param[0] === 'costDetailId') { |
| | | costDetailId = decodeURIComponent(param[1] || ''); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | var formatDate = function (dateStr) { |
| | | if (!dateStr || dateStr === '-' || dateStr.trim() === '') { |
| | | return ''; |
| | | } |
| | | return dateStr.trim(); |
| | | }; |
| | | |
| | | $that.moreInfo.editAnnouncementForm = { |
| | | id: _item.id || '', |
| | | mpId: costDetailId || _item.mpId || '', |
| | | plannedAnnouncementStart: formatDate(_item.proposedStartDate), |
| | | plannedAnnouncementEnd: formatDate(_item.proposedEndDate), |
| | | publishedAnnouncementStart: formatDate(_item.publishedStartDate), |
| | | publishedAnnouncementEnd: formatDate(_item.publishedEndDate) |
| | | }; |
| | | |
| | | $that._showEditAnnouncementModal(); |
| | | }, |
| | | _showEditAnnouncementModal: function () { |
| | | const modal = document.getElementById('editAnnouncementTimeRangeModal'); |
| | | modal.classList.add('show'); |
| | | modal.style.display = 'block'; |
| | | modal.removeAttribute('inert'); |
| | | modal.removeAttribute('aria-hidden'); |
| | | modal.setAttribute('aria-modal', 'true'); |
| | | modal.focus(); |
| | | }, |
| | | _hideEditAnnouncementModal: function () { |
| | | const modal = document.getElementById('editAnnouncementTimeRangeModal'); |
| | | modal.classList.remove('show'); |
| | | modal.style.display = 'none'; |
| | | modal.setAttribute('inert', ''); |
| | | modal.setAttribute('aria-hidden', 'true'); |
| | | modal.removeAttribute('aria-modal'); |
| | | }, |
| | | _saveEditAnnouncementTimeRange: function () { |
| | | if (!$that.moreInfo.editAnnouncementForm.id) { |
| | | vc.toast('缺少主键ID,无法保存'); |
| | | return; |
| | | } |
| | | |
| | | var requestData = { |
| | | id: $that.moreInfo.editAnnouncementForm.id, |
| | | mpId: $that.moreInfo.editAnnouncementForm.mpId || '', |
| | | plannedAnnouncementStart: $that.moreInfo.editAnnouncementForm.plannedAnnouncementStart || '', |
| | | plannedAnnouncementEnd: $that.moreInfo.editAnnouncementForm.plannedAnnouncementEnd || '', |
| | | publishedAnnouncementStart: $that.moreInfo.editAnnouncementForm.publishedAnnouncementStart || '', |
| | | publishedAnnouncementEnd: $that.moreInfo.editAnnouncementForm.publishedAnnouncementEnd || '' |
| | | }; |
| | | |
| | | vc.http.apiPost('/announcementTimeRange/updateAnnouncementTimeRangeInfo', |
| | | JSON.stringify(requestData), |
| | | { |
| | | emulateJSON: true |
| | | }, |
| | | function (json, res) { |
| | | try { |
| | | var _json = JSON.parse(json); |
| | | if (_json.code === "0000") { |
| | | vc.toast(_json.msg || '修改成功'); |
| | | $that._hideEditAnnouncementModal(); |
| | | $that._loadPublicIncomeData($that.moreInfo.paginationInfo.currentPage, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | vc.toast(_json.msg || '修改失败'); |
| | | } |
| | | } catch (e) { |
| | | console.error('数据解析失败:', e); |
| | | vc.toast('数据解析失败'); |
| | | } |
| | | }, |
| | | function (errInfo, error) { |
| | | console.error('请求失败:', errInfo, error); |
| | | vc.toast(errInfo || '修改失败,请检查网络连接'); |
| | | } |
| | | ); |
| | | }, |
| | | _saveEditPublicIncome: function () { |
| | | // 保存编辑 |
| | | var param = { |
| | | params: { |
| | | id: $that.moreInfo.editForm.id, |
| | |
| | | ); |
| | | }, |
| | | _delete: function (_item) { |
| | | if (!_item || !_item.id) { |
| | | vc.toast('数据错误,无法删除'); |
| | | return; |
| | | } |
| | | |
| | | vc.confirm('确定要删除这条记录吗?', function () { |
| | | if ($that.moreInfo.currentTab === 'publicIncome') { |
| | | var requestData = { |
| | | id: _item.id |
| | | }; |
| | | |
| | | vc.http.apiPost('/announcementTimeRange/deleteAnnouncementTimeRangeInfo', |
| | | JSON.stringify(requestData), |
| | | { |
| | | emulateJSON: true |
| | | }, |
| | | function (json, res) { |
| | | try { |
| | | var _json = JSON.parse(json); |
| | | if (_json.code === "0000") { |
| | | vc.toast(_json.msg || '删除成功'); |
| | | $that._loadPublicIncomeData($that.moreInfo.paginationInfo.currentPage, $that.moreInfo.paginationInfo.rows); |
| | | } else { |
| | | vc.toast(_json.msg || '删除失败'); |
| | | } |
| | | } catch (e) { |
| | | console.error('数据解析失败:', e); |
| | | vc.toast('数据解析失败'); |
| | | } |
| | | }, |
| | | function (errInfo, error) { |
| | | console.error('请求失败:', errInfo, error); |
| | | vc.toast(errInfo || '删除失败,请检查网络连接'); |
| | | } |
| | | ); |
| | | } else { |
| | | var param = { |
| | | params: { |
| | | id: _item.id |
| | | } |
| | | }; |
| | | // 这里需要根据实际API调整 |
| | | vc.http.apiPost('/costDetail/deleteMore', |
| | | param, |
| | | function (json, res) { |
| | |
| | | vc.message(errInfo); |
| | | } |
| | | ); |
| | | } |
| | | }); |
| | | } |
| | | } |