liubp
2025-12-26 c08d1c10fbafd7f57eb51c51269a95c281383ae3
公共收益金增删查改
10个文件已修改
1408 ■■■■ 已修改文件
public/css/vc.css 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/add/add.html 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/add/add.js 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/costDetail.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/detail/detail.html 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/detail/detail.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/edit/edit.html 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/edit/edit.js 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/more/more.html 213 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/more/more.js 356 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/css/vc.css
@@ -1366,13 +1366,15 @@
    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;
}
@@ -1583,6 +1585,132 @@
    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;
@@ -1639,6 +1767,7 @@
    width: 180px;
    height: 32px;
}
#buildingScope{
    position: relative;
    top: 12px;
@@ -1662,6 +1791,7 @@
}
@media (max-width: 1400px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc((100% - 60px) / 7);
@@ -1669,6 +1799,7 @@
}
@media (max-width: 1200px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc((100% - 50px) / 6);
@@ -1676,6 +1807,7 @@
}
@media (max-width: 992px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc((100% - 40px) / 5);
@@ -1683,11 +1815,13 @@
}
@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;
}
@@ -1698,7 +1832,6 @@
    color: #1677ff;
}
/* 编辑公共收益金弹窗样式 */
.edit-public-income-modal .edit-form-group {
    display: flex;
    align-items: center;
@@ -1752,7 +1885,6 @@
    cursor: pointer;
}
/* 确保编辑公共收益金弹窗居中显示 */
#editPublicIncomeModal {
    display: flex !important;
    align-items: center;
public/pages/property/costDetail/add/add.html
@@ -53,7 +53,16 @@
                <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>
        <!-- 分摊范围 + 维修类型 -->
@@ -78,13 +87,43 @@
            </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>
public/pages/property/costDetail/add/add.js
@@ -21,16 +21,201 @@
                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;
@@ -48,7 +233,34 @@
                    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,
@@ -61,14 +273,16 @@
                    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) {
@@ -111,4 +325,3 @@
        }
    });
})(window.vc);
public/pages/property/costDetail/costDetail.js
@@ -45,28 +45,22 @@
        },
        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,
@@ -74,7 +68,6 @@
                    row: _rows
                };
                
                // 添加可选查询参数
                if ($that.costDetailInfo.conditions.flowNumber) {
                    params.flowNumber = $that.costDetailInfo.conditions.flowNumber;
                }
@@ -251,7 +244,6 @@
                $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 {
@@ -285,27 +277,21 @@
                $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) {
@@ -346,7 +332,6 @@
                        );
                    });
                } else {
                    // 如果 vc.confirm 不存在,使用 window.confirm 作为后备方案
                    if (window.confirm('确定要删除这条费用明细吗?')) {
                        var param = {
                            id: _item.costDetailId,
public/pages/property/costDetail/detail/detail.html
@@ -4,29 +4,29 @@
        <!-- 流转编码 + 日期 -->
        <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>
@@ -36,15 +36,15 @@
        <!-- 业委会金额 + 审价金额 + 是否盖章 + 签报部门 -->
        <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>
        <!-- 分摊范围 + 维修类型 -->
@@ -54,25 +54,16 @@
                <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>
        <!-- 按钮组 -->
public/pages/property/costDetail/detail/detail.js
@@ -28,7 +28,6 @@
        },
        _initMethod: function () {
            $that = vc.component;
            // 从URL获取costDetailId
            var costDetailId = vc.getParam('costDetailId');
            if (costDetailId) {
                $that.costDetailInfo.costDetailId = costDetailId;
@@ -44,11 +43,10 @@
        },
        methods: {
            _loadCostDetail: function () {
                // 查询所有数据,然后找到匹配的记录
                var params = {
                    communityName: vc.getCurrentCommunity().name,
                    page: 1,
                    row: 1000  // 查询足够多的数据以找到目标记录
                    row: 1000
                };
                
                var param = {
@@ -68,7 +66,6 @@
                                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++) {
@@ -112,22 +109,18 @@
            _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 || '';
@@ -142,7 +135,6 @@
                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 = '全体';
public/pages/property/costDetail/edit/edit.html
@@ -53,7 +53,16 @@
                <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>
        <!-- 分摊范围 + 维修类型 -->
@@ -78,13 +87,43 @@
            </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>
public/pages/property/costDetail/edit/edit.js
@@ -22,13 +22,156 @@
                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;
@@ -41,12 +184,53 @@
            }
        },
        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 = {
@@ -66,7 +250,6 @@
                                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++) {
@@ -110,17 +293,15 @@
            _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 || '';
@@ -132,36 +313,61 @@
                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;
@@ -179,7 +385,34 @@
                    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,
@@ -193,14 +426,16 @@
                    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) {
@@ -212,7 +447,6 @@
                    }
                }
                
                // 调用更新API
                vc.http.apiPost('/maintenancePayment/updateMaintenancePayment',
                    JSON.stringify(saveData), {
                        emulateJSON: true
public/pages/property/costDetail/more/more.html
@@ -8,9 +8,9 @@
            <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>
@@ -19,47 +19,56 @@
    <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>
@@ -252,13 +261,20 @@
                <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>
@@ -293,18 +309,6 @@
            </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'">
@@ -352,9 +356,12 @@
                <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>
@@ -379,15 +386,7 @@
            </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'">
@@ -432,37 +431,134 @@
            <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>
@@ -470,10 +566,12 @@
                    <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>
@@ -481,10 +579,12 @@
                    <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>
@@ -496,4 +596,3 @@
        </div>
    </div>
</div>
public/pages/property/costDetail/more/more.js
@@ -1,5 +1,5 @@
/**
 业委会公约管理
 费用明细更多管理
 **/
(function (vc) {
    var DEFAULT_PAGE = 1;
@@ -27,15 +27,27 @@
                    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);
            }
@@ -44,7 +56,6 @@
        },
        methods: {
            _initDate: function () {
                // 初始化日期选择器
                $(".startDate").datetimepicker({
                    minView: "month",
                    language: 'zh-CN',
@@ -68,12 +79,11 @@
                    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;
@@ -100,7 +110,6 @@
                        }
                    });
                // 防止多次点击时间插件失去焦点
                var startDateElements = document.getElementsByClassName('form-control startDate');
                if (startDateElements.length > 0) {
                    startDateElements[0].addEventListener('click', function (e) {
@@ -116,19 +125,17 @@
            },
            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);
@@ -156,7 +163,6 @@
                    }
                };
                
                // 调用公共收益金接口
                vc.http.apiGet('/announcementTimeRange/queryAnnouncementTimeRangeInfo',
                    param,
                    function (json, res) {
@@ -165,7 +171,6 @@
                            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;
@@ -174,7 +179,6 @@
                                $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) {
@@ -224,6 +228,89 @@
                    }
                );
            },
            _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;
@@ -232,7 +319,6 @@
                var param = {
                    params: $that.moreInfo.conditions
                };
                // 发送get请求 - 这里需要根据实际API调整
                vc.http.apiGet('/costDetail/queryMore',
                    param,
                    function (json, res) {
@@ -245,7 +331,6 @@
                    },
                    function (errInfo, error) {
                        console.log('请求失败处理');
                        // 模拟数据用于演示
                        $that.moreInfo.dataList = [
                            {
                                amount: '张三三',
@@ -266,7 +351,6 @@
                var pageList = [];
                if (total <= 7) {
                    // 总页数小于等于7,显示所有页码
                    for (var i = 1; i <= total; i++) {
                        pageList.push({
                            page: i,
@@ -275,9 +359,7 @@
                        });
                    }
                } else {
                    // 总页数大于7,显示部分页码
                    if (currentPage <= 4) {
                        // 当前页在前4页
                        for (var i = 1; i <= 5; i++) {
                            pageList.push({
                                page: i,
@@ -296,7 +378,6 @@
                            currentPage: false
                        });
                    } else if (currentPage >= total - 3) {
                        // 当前页在后4页
                        pageList.push({
                            page: 1,
                            pageView: 1,
@@ -315,7 +396,6 @@
                            });
                        }
                    } else {
                        // 当前页在中间
                        pageList.push({
                            page: 1,
                            pageView: 1,
@@ -351,6 +431,8 @@
            _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);
                }
@@ -361,6 +443,8 @@
                }
                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);
                }
@@ -375,20 +459,101 @@
                }
                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 () {
@@ -409,16 +574,104 @@
                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,
@@ -441,13 +694,47 @@
                );
            },
            _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) {
@@ -458,6 +745,7 @@
                            vc.message(errInfo);
                        }
                    );
                    }
                });
            }
        }