权限页面完善,我的小区页面权限对接,费用明细详情页面,公共收益金编辑模态框
15个文件已修改
665 ■■■■ 已修改文件
public/components/frame/privilegeTree/privilegeTree.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/css/vc.css 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/common/enterCommunity/enterCommunity.html 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/common/enterCommunity/enterCommunity.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/frame/role/role-a/role-a.html 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/frame/role/role-a/role-a.js 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/add/add.html 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/add/add.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/costDetail.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/costDetail.js 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/detail/detail.html 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/edit/edit.html 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/edit/edit.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/more/more.html 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/property/costDetail/more/more.js 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/components/frame/privilegeTree/privilegeTree.js
@@ -160,8 +160,11 @@
                            // 获取当前页面的参数
                            let pgId = vc.component.privilegeTreeInfo._currentPgId;
                            let communityId = vc.getCurrentCommunity().communityId;
                            // 获取权限名称
                            let nodeData = $('#jstree_privilege').jstree('get_node', nodeId);
                            let pName = nodeData ? nodeData.text : '';
                            // 跳转到role-a页面,传递所有参数
                            let params = 'pId=' + pId + '&pgId=' + pgId + '&communityId=' + communityId + '&type=all';
                            let params = 'pId=' + pId + '&pgId=' + pgId + '&communityId=' + communityId + '&type=all&pName=' + encodeURIComponent(pName);
                            vc.jumpToPage('/#/pages/frame/role/role-a?' + params);
                        });
                        // 将按钮插入到节点后面
public/css/vc.css
@@ -1366,25 +1366,14 @@
    transition: all 0.3s;
}
.cost-detail-container .action-buttons .add-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 .add-btn:hover, .cost-detail-container .action-buttons .import-btn:hover {
    background: #4096ff;
}
.cost-detail-container .action-buttons .import-btn {
    background: #fff;
    color: #333;
    border: 1px solid #d9d9d9;
}
.cost-detail-container .action-buttons .import-btn:hover {
    background: #f5f5f5;
    border-color: #bfbfbf;
}
.cost-detail-container table {
@@ -1628,23 +1617,111 @@
#button-container .role-a-checkbox,
#data-container .role-a-checkbox {
    flex: 0 0 calc(20% - 8px);
    flex: 0 0 calc((100% - 70px) / 8);
    min-width: 0;
    box-sizing: border-box;
}
@media (max-width: 1200px) {
@media (max-width: 1400px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc(25% - 8px);
        flex: 0 0 calc((100% - 60px) / 7);
    }
}
@media (max-width: 1200px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc((100% - 50px) / 6);
    }
}
@media (max-width: 992px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc((100% - 40px) / 5);
    }
}
@media (max-width: 768px) {
    #button-container .role-a-checkbox,
    #data-container .role-a-checkbox {
        flex: 0 0 calc(50% - 8px);
        flex: 0 0 calc((100% - 20px) / 2);
    }
}
.role-a-checkbox label {
    padding-top: 5px;
}
.cost-detail-container .action-buttons .download-btn {
    border: 1px solid #1677ff;
    background: #fff;
    color: #1677ff;
}
/* 编辑公共收益金弹窗样式 */
.edit-public-income-modal .edit-form-group {
    display: flex;
    align-items: center;
}
.edit-public-income-modal .edit-form-label {
    min-width: 120px;
    margin: 0;
    padding: 0;
    font-weight: normal;
    color: #333;
}
.edit-public-income-modal .edit-input-wrapper {
    display: flex;
    align-items: center;
    flex: 1;
}
.edit-public-income-modal .edit-input {
    flex: 1;
    margin: 0;
}
.edit-public-income-modal .edit-input-unit {
    margin-left: 10px;
    color: #333;
}
.edit-public-income-modal .edit-radio-group {
    display: flex;
    align-items: center;
    flex: 1;
}
.edit-public-income-modal .edit-radio-label {
    margin: 0 20px 0 0;
    padding: 0;
    font-weight: normal;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
}
.edit-public-income-modal .edit-radio-label:last-child {
    margin-right: 0;
}
.edit-public-income-modal .edit-radio-label input[type="radio"] {
    margin-right: 5px;
    cursor: pointer;
}
/* 确保编辑公共收益金弹窗居中显示 */
#editPublicIncomeModal {
    display: flex !important;
    align-items: center;
    justify-content: center;
}
#editPublicIncomeModal .modal-dialog {
    margin: 0;
    position: relative;
    width: auto;
}
public/pages/common/enterCommunity/enterCommunity.html
@@ -7,7 +7,7 @@
                        <span><vc:i18n name="我的小区" namespace="enterCommunity"></vc:i18n></span>
                    </h5>
                    <div class="ibox-tools" style="top:10px;">
                        <button type="button" class="btn btn-primary btn-sm" v-on:click="_showHcUse()">
                        <button type="button" class="btn btn-primary btn-sm" v-on:click="_showHcUse()" v-show="_hasPrivilegePIds('1500201904008')">
                            <i class="fa fa-plus"></i>
                            <span><vc:i18n name="商用流程" namespace="enterCommunity"></vc:i18n></span>
                        </button>
@@ -17,34 +17,34 @@
                    <table class="footable table table-stripped toggle-arrow-tiny" data-page-size="15">
                        <thead>
                        <tr>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904009')">
                                <span><vc:i18n name="省份" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904010')">
                                <span><vc:i18n name="市/州" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" width="150px" class="text-center">
                            <th data-hide="phone" width="150px" class="text-center" v-show="_hasPrivilegePIds('1500201904011')">
                                <span><vc:i18n name="区/县" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" width="200px" class="text-center">
                            <th data-hide="phone" width="200px" class="text-center" v-show="_hasPrivilegePIds('1500201904012')">
                                <span><vc:i18n name="小区名称" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <!-- <th data-hide="phone">
                                   <span><vc:i18n name="小区地址" namespace="enterCommunity"></vc:i18n></span>
                                 </th> -->
                            <th class="text-center">
                            <th class="text-center" v-show="_hasPrivilegePIds('1500201904013')">
                                <span><vc:i18n name="小区编码" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904014')">
                                <span><vc:i18n name="客服电话" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904015')">
                                <span><vc:i18n name="面积" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904016')">
                                <span><vc:i18n name="开始时间" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <th data-hide="phone" class="text-center">
                            <th data-hide="phone" class="text-center" v-show="_hasPrivilegePIds('1500201904017')">
                                <span><vc:i18n name="结束时间" namespace="enterCommunity"></vc:i18n></span>
                            </th>
                            <!-- <th data-hide="phone,tablet" >
@@ -60,34 +60,34 @@
                        </thead>
                        <tbody>
                        <tr v-for="community in communityInfo.enterCommunityInfo">
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904009')">
                                {{community.provName}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904010')">
                                {{community.cityName}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904011')">
                                {{community.areaName}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904012')">
                                {{community.name}}
                            </td>
                            <!-- <td>
                            {{community.address}}
                             </td> -->
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904013')">
                                {{community.communityId}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904014')">
                                {{community.tel}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904015')">
                                {{community.communityArea}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904016')">
                                {{community.startTime}}
                            </td>
                            <td class="text-center">
                            <td class="text-center" v-show="_hasPrivilegePIds('1500201904017')">
                                {{community.endTime}}
                            </td>
                            <!-- <td>
@@ -100,7 +100,7 @@
                                {{_showCommunityStatus(community.auditStatusCd)}}
                            </td>
                            <td class="text-center">
                                <div class="btn-group" v-if="community.auditStatusCd == '1100' ">
                                <div class="btn-group" v-if="community.auditStatusCd == '1100' && _hasPrivilegePIds('1500201904018')">
                                    <button class="btn-white btn btn-xs"
                                            v-on:click="_openUpdateCommunityModel(community)">
                                        <span><vc:i18n name="修改" namespace="enterCommunity"></vc:i18n></span>
public/pages/common/enterCommunity/enterCommunity.js
@@ -7,10 +7,12 @@
            communityInfo: {
                enterCommunityInfo: [],
                showPage: 'myCommunity'
            }
            },
            privilegePIds: [] // 存储权限ID数组
        },
        _initMethod: function () {
            vc.component.listMyCommunity();
            vc.component._loadPrivilegePIds();
        },
        _initEvent: function () {
            vc.on('enterCommunity', 'listMyCommunity', function (_param) {
@@ -61,6 +63,57 @@
            },
            _goBack: function () {
                $that.communityInfo.showPage = 'myCommunity';
            },
            _loadPrivilegePIds: function () {
                var userInfo = vc.getData('/nav/getUserInfo');
                console.log(userInfo);
                var param = {
                    params: {
                        // pgId: userInfo ? userInfo.pgId : '',
                        pgId: '6002025062697550342',
                        communityId: '20250723478310237',
                        pId: '500201904008',
                        type: 'all'
                    }
                };
                vc.http.apiGet('/query.privilegeGroup.noAddPrivilege',
                    param,
                    function (json, res) {
                        try {
                            var data = typeof json === 'string' ? JSON.parse(json) : json;
                            if (data && Array.isArray(data)) {
                                vc.component.privilegePIds = data
                                    .filter(function(item) {
                                        return item.pgId != null && item.pgId !== '';
                                    })
                                    .map(function(item) {
                                        return item.pId;
                                    });
                            } else if (data && data.data && Array.isArray(data.data)) {
                                vc.component.privilegePIds = data.data
                                    .filter(function(item) {
                                        return item.pgId != null && item.pgId !== '';
                                    })
                                    .map(function(item) {
                                        return item.pId;
                                    });
                            }
                        } catch (e) {
                            console.error('解析权限数据失败:', e);
                            console.error('原始数据:', json);
                        }
                    },
                    function (errInfo, error) {
                        console.log('获取权限数据失败');
                    }
                );
            },
            _hasPrivilegePIds: function (pId) {
                // 检查权限ID是否在privilegePIds数组中
                if (!vc.component.privilegePIds || !Array.isArray(vc.component.privilegePIds)) {
                    return false;
                }
                return vc.component.privilegePIds.indexOf(pId) !== -1;
            }
        }
    });
public/pages/frame/role/role-a/role-a.html
@@ -1,24 +1,36 @@
<h1 style="font-weight: 600;">页面权限配置</h1>
<div class="role-a-container">
    <h3>全部</h3>
    <div class="role-a-checkbox">
        <label>全部</label>
        <input type="checkbox" name="all" id="all">
    </div>
    <h3>按钮</h3>
    <div class="role-a-checkbox" style="gap: 10px; display: flex; align-items: center;">
        <label>全部</label>
        <input type="checkbox" id="button-all">
        <h3 style="margin: 0;">全部</h3>
        <input type="checkbox" name="all" id="all" checked>
        <label style="padding-top: 8px;">全部</label>
    </div>
    <div id="button-container"></div>
    <h3>表头</h3>
    <div class="role-a-checkbox" style="gap: 10px; display: flex; align-items: center;">
    <div class="role-a-checkbox" style="border: 1px solid #e7eaec;"></div>
    <div class="role-a-checkbox" style="gap: 10px; display: flex; align-items: center; margin-top: 20px;" v-show="buttonPrivileges.length > 0">
        <h3 style="margin: 0;">按钮权限</h3>
        <input type="checkbox" id="button-all" checked>
        <label>全部</label>
        <input type="checkbox" id="data-all">
    </div>
    <div id="data-container"></div>
    <div class="role-a-buttons">
    <div id="button-container" style="margin: 0 0 0 74px;"></div>
    <div class="role-a-checkbox" style="gap: 10px; display: flex; align-items: center; margin-top: 20px;" v-show="labelPrivileges.length > 0">
        <h3 style="margin: 0;">标签权限</h3>
        <input type="checkbox" id="label-all" checked>
        <label>全部</label>
    </div>
    <div id="label-container" style="margin: 0 0 0 74px;"></div>
    <div class="role-a-checkbox" style="gap: 10px; display: flex; align-items: center; margin-top: 20px;" v-show="dataPrivileges.length > 0">
        <h3 style="margin: 0;">表头权限</h3>
        <input type="checkbox" id="data-all" checked>
        <label>全部</label>
    </div>
    <div id="data-container" style="margin: 0 0 0 74px;"></div>
    <div class="role-a-buttons" style="width: 100%; display: flex; justify-content: flex-end; gap: 10px; margin-top: 100px;">
        <button type="button" class="btn btn-primary" id="save">保存</button>
        <button type="button" class="btn btn-primary" id="cancel" v-on:click="goBack">返回</button>
        <button type="button" class="btn btn-primary" id="reset">重置</button>
        <button type="button" class="btn btn-primary" id="cancel" v-on:click="goBack" style="margin-right: 100px;">取消</button>
    </div>
</div>
</div>
public/pages/frame/role/role-a/role-a.js
@@ -7,7 +7,11 @@
                header: false
            },
            pgId: '', // 保存角色编码
            privilegeData: [] // 保存权限数据
            privilegeData: [], // 保存权限数据
            pName: '全部', // 保存权限名称,默认为"全部"
            buttonPrivileges: [], // 保存按钮权限
            labelPrivileges: [], // 保存标签权限
            dataPrivileges: [], // 保存数据权限
        },
        _initMethod: function () {
            // 获取URL参数
@@ -15,6 +19,7 @@
            let pgId = '';
            let communityId = '';
            let type = '';
            let pName = '全部'; // 默认值为"全部"
            
            // 优先从 hash 中获取参数(单页应用使用 hash 路由)
            const hash = location.hash;
@@ -36,6 +41,8 @@
                        communityId = value;
                    } else if (key === 'type') {
                        type = value;
                    } else if (key === 'pName') {
                        pName = value;
                    }
                }
            }
@@ -53,14 +60,25 @@
            if (!type) {
                type = vc.getParam('type') || '';
            }
            if (pName === '全部') {
                pName = vc.getParam('pName') || '全部';
            }
            
            // 如果缺少必要参数,使用默认值或从当前社区获取
            if (!communityId) {
                communityId = vc.getCurrentCommunity().communityId;
            }
            
            // 保存 pgId 到 data 中
            // 保存 pgId、pId 和 pName 到 data 中
            vc.component.pgId = pgId;
            vc.component.pId = pId;
            vc.component.pName = pName;
            // 更新页面标题
            const titleElement = document.querySelector('.role-a-container h3');
            if (titleElement) {
                titleElement.textContent = pName;
            }
            
            // 调用接口
            if (pgId && communityId) {
@@ -81,6 +99,9 @@
                            // 判断 json 的类型,如果已经是对象则直接使用,否则进行解析
                            let data = typeof json === 'string' ? JSON.parse(json) : json;
                            vc.component.privilegeData = data;
                            vc.component.buttonPrivileges = data.filter(item => item.type === '按钮');
                            vc.component.labelPrivileges = data.filter(item => item.type === '标签');
                            vc.component.dataPrivileges = data.filter(item => item.type === '数据');
                            vc.component.renderPrivileges(data);
                            vc.component.initCheckboxEvents();
                        } catch (e) {
@@ -106,10 +127,12 @@
            // 渲染权限复选框
            renderPrivileges: function (data) {
                const buttonContainer = document.getElementById('button-container');
                const labelContainer = document.getElementById('label-container');
                const dataContainer = document.getElementById('data-container');
                
                // 清空容器
                if (buttonContainer) buttonContainer.innerHTML = '';
                if (labelContainer) labelContainer.innerHTML = '';
                if (dataContainer) dataContainer.innerHTML = '';
                
                // 遍历数据,根据 type 创建对应的复选框
@@ -122,6 +145,7 @@
                    
                    const label = document.createElement('label');
                    label.textContent = item.pName;
                    label.style.paddingTop = '8px';
                    
                    const checkbox = document.createElement('input');
                    checkbox.type = 'checkbox';
@@ -129,14 +153,19 @@
                    checkbox.value = item.pId;
                    checkbox.setAttribute('data-pid', item.pId);
                    checkbox.setAttribute('data-type', item.type);
                    checkbox.checked = true;
                    
                    checkboxDiv.appendChild(label);
                    checkboxDiv.appendChild(checkbox);
                    checkboxDiv.appendChild(label);
                    
                    // 根据 type 添加到对应容器
                    if (item.type === '按钮') {
                        if (buttonContainer) {
                            buttonContainer.appendChild(checkboxDiv);
                        }
                    } else if (item.type === '标签') {
                        if (labelContainer) {
                            labelContainer.appendChild(checkboxDiv);
                        }
                    } else if (item.type === '数据') {
                        if (dataContainer) {
@@ -161,8 +190,10 @@
                        });
                        // 同时更新按钮和数据区域的"全部"复选框
                        const buttonAll = document.getElementById('button-all');
                        const labelAll = document.getElementById('label-all');
                        const dataAll = document.getElementById('data-all');
                        if (buttonAll) buttonAll.checked = isChecked;
                        if (labelAll) labelAll.checked = isChecked;
                        if (dataAll) dataAll.checked = isChecked;
                    });
                }
@@ -181,7 +212,22 @@
                        self.updateAllCheckbox();
                    });
                }
                // 标签区域全部复选框
                const labelAllCheckbox = document.getElementById('label-all');
                if (labelAllCheckbox) {
                    labelAllCheckbox.addEventListener('change', function () {
                        const isChecked = this.checked;
                        // 选中标签区域所有复选框
                        const labelCheckboxes = document.querySelectorAll('#label-container input[type="checkbox"][name="privilege"]');
                        labelCheckboxes.forEach(function (cb) {
                            cb.checked = isChecked;
                        });
                        // 检查是否需要更新"全部"复选框
                        self.updateAllCheckbox();
                    });
                }
                // 数据区域全部复选框
                const dataAllCheckbox = document.getElementById('data-all');
                if (dataAllCheckbox) {
@@ -213,6 +259,27 @@
                        self.savePrivileges();
                    });
                }
                // 重置按钮事件
                const resetButton = document.getElementById('reset');
                if (resetButton) {
                    resetButton.addEventListener('click', function () {
                        // 选中所有权限复选框
                        const allCheckboxes = document.querySelectorAll('input[type="checkbox"][name="privilege"]');
                        allCheckboxes.forEach(function (cb) {
                            cb.checked = true;
                        });
                        // 选中所有"全部"复选框
                        const allCheckbox = document.getElementById('all');
                        const buttonAll = document.getElementById('button-all');
                        const labelAll = document.getElementById('label-all');
                        const dataAll = document.getElementById('data-all');
                        if (allCheckbox) allCheckbox.checked = true;
                        if (buttonAll) buttonAll.checked = true;
                        if (labelAll) labelAll.checked = true;
                        if (dataAll) dataAll.checked = true;
                    });
                }
            },
            // 更新"全部"复选框状态
            updateAllCheckbox: function () {
@@ -237,6 +304,16 @@
                    buttonAll.checked = buttonAllChecked;
                }
                
                // 更新标签区域
                const labelCheckboxes = document.querySelectorAll('#label-container input[type="checkbox"][name="privilege"]');
                const labelAllChecked = labelCheckboxes.length > 0 && Array.from(labelCheckboxes).every(function (cb) {
                    return cb.checked;
                });
                const labelAll = document.getElementById('label-all');
                if (labelAll) {
                    labelAll.checked = labelAllChecked;
                }
                // 更新数据区域
                const dataCheckboxes = document.querySelectorAll('#data-container input[type="checkbox"][name="privilege"]');
                const dataAllChecked = dataCheckboxes.length > 0 && Array.from(dataCheckboxes).every(function (cb) {
@@ -263,6 +340,7 @@
                
                const requestData = {
                    pgId: vc.component.pgId,
                    parentId: vc.component.pId,
                    pIds: pIds
                };
                
public/pages/property/costDetail/add/add.html
@@ -79,24 +79,32 @@
        <div class="form-row">
            <label class="form-label">基金与设施</label>
            <div class="radio-group">
                <input type="radio" id="fundRepair" name="fundType" checked>
                <input type="radio" id="fundRepair" name="fundType" value="repair" v-model="fundType">
                <label for="fundRepair" style="margin-top: 8px;">维修资金</label>
            </div>
            <label class="form-label" for="ownerScope">业主大会范围</label>
            <select id="ownerScope" class="form-select">
                <option value="multi">多选</option>
            </select>
            <label class="form-label" for="buildingScope">门牌幢范围</label>
            <select id="buildingScope" class="form-select">
                <option value="multi">多选</option>
            </select>
            <div class="radio-group" style="margin-left: 100px;" v-if="fundType === 'repair'">
                <label class="form-label" for="ownerScope">业主大会范围</label>
                <select id="ownerScope" class="form-select">
                    <option value="multi">多选</option>
                </select>
                <label class="form-label" for="buildingScope">门牌幢范围</label>
                <select id="buildingScope" class="form-select">
                    <option value="multi">多选</option>
                </select>
            </div>
        </div>
        <div class="form-row">
            <div class="radio-group" style="margin-left: 100px;">
            <input type="radio" id="fundPublic" name="fundType">
                <input type="radio" id="fundPublic" name="fundType" value="public" v-model="fundType">
                <label for="fundPublic" style="margin-top: 8px;">公共收益</label>
            </div>
            <div class="radio-group" style="margin-left: 100px;" v-if="fundType === 'public'">
                <input type="radio" id="fundSystemOut" name="fundSystemType" value="out" v-model="fundSystemType">
                <label for="fundSystemOut" style="margin-top: 8px;">系统外</label>
                <input type="radio" id="fundSystemIn" name="fundSystemType" value="in" v-model="fundSystemType">
                <label for="fundSystemIn" style="margin-top: 8px;">系统内</label>
            </div>
        </div>
        <!-- 按钮组 -->
public/pages/property/costDetail/add/add.js
@@ -0,0 +1,10 @@
(function (vc) {
    vc.extends({
        data: {
            fundType: 'repair', // 默认选中维修资金
            fundSystemType: 'out' // 默认选中系统外
        }
    });
})(window.vc);
public/pages/property/costDetail/costDetail.html
@@ -21,10 +21,9 @@
        <button type="button" class="query-btn" v-on:click="_queryCostDetails()" style="line-height: 0px;">查询</button>
        <button type="button" class="reset-btn" v-on:click="_resetQuery()" style="line-height: 0px;">重置</button>
        <div class="action-buttons">
            <button type="button" class="add-btn" v-on:click="_addCostDetail()" style="line-height: 0px;">
                添加
            </button>
            <button type="button" class="download-btn" v-on:click="_downloadTemplate()" style="line-height: 0px; ">模板下载</button>
            <button type="button" class="import-btn" v-on:click="_importCostDetail()" style="line-height: 0px;">费用导入</button>
            <button type="button" class="add-btn" v-on:click="_addCostDetail()" style="line-height: 0px;">添加</button>
        </div>
    </div>
@@ -70,6 +69,7 @@
                <td>{{item.buildingType || '-'}}</td>
                <td>{{item.maintenanceType || '-'}}</td>
                <td>
                    <a href="javascript:void(0)" v-on:click="_viewCostDetail(item)">详情</a>
                    <a href="javascript:void(0)" v-on:click="_viewMore(item)">更多</a>
                    <a href="javascript:void(0)" v-on:click="_editCostDetail(item)">编辑</a>
                    <a href="javascript:void(0)" v-on:click="_deleteCostDetail(item)">删除</a>
public/pages/property/costDetail/costDetail.js
@@ -203,18 +203,26 @@
                }
                $that._listCostDetails(page, $that.costDetailInfo.paginationInfo.rows);
            },
            _addCostDetail: function () {
                // 跳转到添加页面或打开添加弹窗
                vc.jumpToPage('/#/pages/property/costDetail/add');
            _downloadTemplate: function () {
                // 下载模板
                vc.toast('模板下载功能');
            },
            _importCostDetail: function () {
                // 打开导入弹窗或跳转到导入页面
                // 打开本地文件
                vc.toast('费用导入功能');
            },
            _viewMore: function (_item) {
            _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);
public/pages/property/costDetail/detail/detail.html
@@ -0,0 +1,88 @@
<div class="form-container">
    <h2 style="font-weight: 600;">添加</h2>
    <form>
        <!-- 流转编码 + 日期 -->
        <div class="form-row">
            <label class="form-label" for="flowCode">流转编码</label>
            <p>{{costDetailInfo.flowCode || '-'}}</p>
            <label class="form-label" for="date">日期</label>
            <p>{{costDetailInfo.date || '-'}}</p>
        </div>
        <!-- 小区名称 + 小区编码(带备注) -->
        <div class="form-row">
            <label class="form-label" for="communityName">小区名称</label>
            <p>{{costDetailInfo.communityName || '-'}}</p>
            <label class="form-label">小区编码</label>
            <p>{{costDetailInfo.communityCode || '-'}}</p>
        </div>
        <!-- 工程内容 -->
        <div class="form-row">
            <label class="form-label" for="projectContent">工程内容</label>
            <p>{{costDetailInfo.projectContent || '-'}}</p>
        </div>
        <!-- 管理处金额 + 是否盖章 -->
        <div class="form-row">
            <label class="form-label" for="mgmtAmount">管理处金额</label>
            <p>{{costDetailInfo.managementAmount || '-'}}</p>
            <span>元</span>
            <label class="form-label">是否盖章</label>
            <div class="radio-group">
                <p>{{costDetailInfo.managementStamped == '1' ? '是' : '否'}}</p>
            </div>
        </div>
        <!-- 业委会金额 + 审价金额 + 是否盖章 + 签报部门 -->
        <div class="form-row">
            <label class="form-label" for="committeeAmount">业委会金额</label>
            <p>{{costDetailInfo.committeeAmount || '-'}}</p>
            <span>元</span>
            <label class="form-label" for="auditAmount">审价金额</label>
            <p>{{costDetailInfo.appraisalAmount || '-'}}</p>
            <span>元</span>
            <label class="form-label">是否盖章</label>
            <div class="radio-group">
                <p>{{costDetailInfo.committeeStamped == '1' ? '是' : '否'}}</p>
            </div>
            <label class="form-label" for="approveDept">签报部门</label>
            <p>{{costDetailInfo.approvalDepartment || '-'}}</p>
        </div>
        <!-- 分摊范围 + 维修类型 -->
        <div class="form-row">
            <label class="form-label">分摊范围</label>
            <div class="radio-group">
                <p>{{costDetailInfo.buildingType == '1' ? '幢' : '全体'}}</p>
            </div>
            <label class="form-label" for="repairType">维修类型</label>
            <p>{{costDetailInfo.maintenanceType || '-'}}</p>
        </div>
        <!-- 基金与设施 + 业主大会范围 + 门牌幢范围 -->
        <div class="form-row">
            <label class="form-label">基金与设施</label>
            <div class="radio-group">
                <p>{{costDetailInfo.fundTypeLevel1 == '1' ? '维修资金' : '公共收益'}}</p>
                <label for="fundRepair" style="margin-top: 8px;">维修资金</label>
            </div>
            <label class="form-label" for="ownerScope">业主大会范围</label>
            <p>{{costDetailInfo.ownerScope || '-'}}</p>
            <label class="form-label" for="buildingScope">门牌幢范围</label>
            <p>{{costDetailInfo.buildingScope || '-'}}</p>
        </div>
        <div class="form-row">
            <div class="radio-group" style="margin-left: 100px;">
                <p>{{costDetailInfo.fundTypeLevel2 == '1' ? '公共收益' : '维修资金'}}</p>
            </div>
        </div>
        <!-- 按钮组 -->
        <div class="btn-group">
            <button type="button" class="btn-cancel">取消</button>
            <button type="button" class="btn-save">保存</button>
        </div>
    </form>
</div>
public/pages/property/costDetail/edit/edit.html
@@ -79,24 +79,32 @@
        <div class="form-row">
            <label class="form-label">基金与设施</label>
            <div class="radio-group">
                <input type="radio" id="fundRepair" name="fundType" checked>
                <input type="radio" id="fundRepair" name="fundType" value="repair" v-model="fundType">
                <label for="fundRepair" style="margin-top: 8px;">维修资金</label>
            </div>
            <label class="form-label" for="ownerScope">业主大会范围</label>
            <select id="ownerScope" class="form-select">
                <option value="multi">多选</option>
            </select>
            <label class="form-label" for="buildingScope">门牌幢范围</label>
            <select id="buildingScope" class="form-select">
                <option value="multi">多选</option>
            </select>
            <div class="radio-group" style="margin-left: 100px;" v-if="fundType === 'repair'">
                <label class="form-label" for="ownerScope">业主大会范围</label>
                <select id="ownerScope" class="form-select">
                    <option value="multi">多选</option>
                </select>
                <label class="form-label" for="buildingScope">门牌幢范围</label>
                <select id="buildingScope" class="form-select">
                    <option value="multi">多选</option>
                </select>
            </div>
        </div>
        <div class="form-row">
            <div class="radio-group" style="margin-left: 100px;">
            <input type="radio" id="fundPublic" name="fundType">
                <input type="radio" id="fundPublic" name="fundType" value="public" v-model="fundType">
                <label for="fundPublic" style="margin-top: 8px;">公共收益</label>
            </div>
            <div class="radio-group" style="margin-left: 100px;" v-if="fundType === 'public'">
                <input type="radio" id="fundSystemOut" name="fundSystemType" value="out" v-model="fundSystemType">
                <label for="fundSystemOut" style="margin-top: 8px;">系统外</label>
                <input type="radio" id="fundSystemIn" name="fundSystemType" value="in" v-model="fundSystemType">
                <label for="fundSystemIn" style="margin-top: 8px;">系统内</label>
            </div>
        </div>
        <!-- 按钮组 -->
public/pages/property/costDetail/edit/edit.js
@@ -0,0 +1,10 @@
(function (vc) {
    vc.extends({
        data: {
            fundType: 'repair', // 默认选中维修资金
            fundSystemType: 'out' // 默认选中系统外
        }
    });
})(window.vc);
public/pages/property/costDetail/more/more.html
@@ -8,9 +8,9 @@
            <input type="date" class="form-control endDate" placeholder="请选择结束日期" v-model="moreInfo.conditions.endDate" />
        </div>
        <div class="action-buttons">
            <button type="button" class="download-btn" v-on:click="_downloadTemplate()" style="line-height: 0px;">下载模板</button>
            <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;">导出</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>
@@ -84,8 +84,8 @@
                <td>{{item.publishedStartDate || '-'}}</td>
                <td>{{item.publishedEndDate || '-'}}</td>
                <td>
                    <a href="javascript:void(0)" v-on:click="_viewDetail(item)">详情</a>
                    <a href="javascript:void(0)" v-on:click="_edit(item)">编辑</a>
                    <a href="javascript:void(0)" v-on:click="_viewDetailPublicIncome(item)">详情</a>
                    <a href="javascript:void(0)" v-on:click="_editPublicIncome(item)">编辑</a>
                    <a href="javascript:void(0)" v-on:click="_delete(item)">删除</a>
                </td>
            </tr>
@@ -450,3 +450,50 @@
    </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="请输入名称">
                        <span class="edit-input-unit">元</span>
                    </div>
                </div>
                <div class="form-group edit-form-group">
                    <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"> 是
                        </label>
                        <label class="edit-radio-label">
                            <input type="radio" name="meetingResolution" value="0" v-model="moreInfo.editForm.meetingResolution"> 否
                        </label>
                    </div>
                </div>
                <div class="form-group edit-form-group">
                    <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"> 是
                        </label>
                        <label class="edit-radio-label">
                            <input type="radio" name="consultationForm" value="0" v-model="moreInfo.editForm.consultationForm"> 否
                        </label>
                    </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="_hideEditPublicModal()">取消</button>
                <button type="button" class="btn btn-primary" v-on:click="_saveEditPublicIncome()">确认</button>
            </div>
        </div>
    </div>
</div>
public/pages/property/costDetail/more/more.js
@@ -17,10 +17,16 @@
                    pageList: []
                },
                jumpPage: 1,
                currentTab: 'convention',
                currentTab: 'publicIncome',
                conditions: {
                    startDate: '',
                    endDate: ''
                },
                editForm: {
                    id: '',
                    amount: '',
                    meetingResolution: '1',
                    consultationForm: '1'
                }
            }
        },
@@ -57,7 +63,7 @@
                    todayBtn: true,
                    clearBtn: true
                });
                // 设置默认日期为当前月份
                var now = new Date();
                var year = now.getFullYear();
@@ -65,12 +71,12 @@
                var startDateStr = year + '-' + (month < 10 ? '0' + month : month) + '-01';
                var endDate = new Date(year, month, 0); // 获取当月最后一天
                var endDateStr = year + '-' + (month < 10 ? '0' + month : month) + '-' + endDate.getDate();
                $that.moreInfo.conditions.startDate = startDateStr;
                $that.moreInfo.conditions.endDate = endDateStr;
                $(".startDate").val(startDateStr);
                $(".endDate").val(endDateStr);
                $('.startDate').datetimepicker()
                    .on('changeDate', function (ev) {
                        var value = $(".startDate").val();
@@ -89,17 +95,17 @@
                            $that.moreInfo.conditions.endDate = value;
                        }
                    });
                // 防止多次点击时间插件失去焦点
                var startDateElements = document.getElementsByClassName('form-control startDate');
                if (startDateElements.length > 0) {
                    startDateElements[0].addEventListener('click', function(e) {
                    startDateElements[0].addEventListener('click', function (e) {
                        e.currentTarget.blur();
                    });
                }
                var endDateElements = document.getElementsByClassName('form-control endDate');
                if (endDateElements.length > 0) {
                    endDateElements[0].addEventListener('click', function(e) {
                    endDateElements[0].addEventListener('click', function (e) {
                        e.currentTarget.blur();
                    });
                }
@@ -149,7 +155,7 @@
                var currentPage = $that.moreInfo.paginationInfo.currentPage;
                var total = $that.moreInfo.paginationInfo.total;
                var pageList = [];
                if (total <= 7) {
                    // 总页数小于等于7,显示所有页码
                    for (var i = 1; i <= total; i++) {
@@ -230,7 +236,7 @@
                        });
                    }
                }
                $that.moreInfo.paginationInfo.pageList = pageList;
            },
            _changePageSize: function () {
@@ -260,13 +266,58 @@
                // 导出功能
                vc.toast('导出功能');
            },
            _viewDetail: function (_item) {
            _viewDetailPublicIncome: function (_item) {
                // 查看详情
                vc.toast('查看详情功能');
            },
            _edit: function (_item) {
                // 编辑
                vc.toast('编辑功能');
            _showEditPublicModal: function () {
                const modal = document.getElementById('editPublicIncomeModal');
                modal.classList.add('show');
                modal.style.display = 'block';
                modal.removeAttribute('inert');
                modal.removeAttribute('aria-hidden');
                modal.setAttribute('aria-modal', 'true');
                modal.focus();
            },
            _hideEditPublicModal: function () {
                const modal = document.getElementById('editPublicIncomeModal');
                modal.classList.remove('show');
                modal.style.display = 'none';
                modal.setAttribute('inert', '');
                modal.setAttribute('aria-hidden', 'true');
                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();
            },
            _saveEditPublicIncome: function () {
                // 保存编辑
                var param = {
                    params: {
                        id: $that.moreInfo.editForm.id,
                        amount: $that.moreInfo.editForm.amount,
                        meetingResolution: $that.moreInfo.editForm.meetingResolution,
                        consultationForm: $that.moreInfo.editForm.consultationForm,
                        communityId: vc.getCurrentCommunity().communityId
                    }
                };
                vc.http.apiPost('/costDetail/updatePublicIncome',
                    param,
                    function (json, res) {
                        vc.toast('保存成功');
                        $that._hideEditPublicModal();
                        $that._listData($that.moreInfo.paginationInfo.currentPage, $that.moreInfo.paginationInfo.rows);
                    },
                    function (errInfo, error) {
                        vc.message(errInfo);
                    }
                );
            },
            _delete: function (_item) {
                vc.confirm('确定要删除这条记录吗?', function () {