Skill: deanw0529-ctrl/office-calculator (version 1.0.0)

--- name: office-calculator version: "1.0.0" icon: assets/icon.png description: 基于20年全国办公选址经验的专业办公室面积测算工具。当用户询问办公室规划、工位数需求、办公室面积测算、多少人需要多大办公室、如何计算租赁面积时触发。核心功能：输入总人数、财务人数、工位规格、各功能区面积，输出建议租赁总面积及详细分解。特点：不用反复找设计公司，成本极低，行政人员可直接使用。 author: 王至德（至德老师） tags: [行政, 办公选址, 面积测算, 工位数, 办公室规划, 房地产] license: private homepage: https://github.com/office-calculator --- # Office Calculator · 办公室面积测算器 > 「先定面积，再做分区，最后设计详图——省去反复测算的高额咨询费。」 > 作者：王至德（至德老师）｜基于20年全国办公选址经验 ## 背景 本工具基于20年全国办公楼选址经验总结，将复杂的面积需求转化为可量化的参数模型。帮助企业、行政人员快速算出"租多大"，避免租赁后再发现不够用、或租大了浪费。 **本工具输出结果含完整面积分解，用户可直接拿着结果去跟业主谈判，或交给设计师出分区图。** ## 触发词（AI 识别） 当用户提到以下任意关键词时，使用本技能： - 办公室面积 / 租赁多大 / 需要多大办公室 - 工位数 / 多少人 / 多少平米 - 办公室规划 / 选址 / 办公区设计 - 行政测算 / 办公选址 ## 参数说明 | 参数 | 必填 | 默认值 | 说明 | |------|------|--------|------| | `--seats` | ✅ | - | 总人数（含所有人：业务、行政、财务等） | | `--finance` | ❌ | 0 | 财务部人数（财务室独立占用面积） | | `--seat-size` | ✅ | - | 单工位面积（㎡），支持 1.44（1.2×1.2m）或 1.96（1.4×1.4m） | | `--meeting` | ❌ | 0 | 全部会议室总面积（㎡） | | `--reception` | ❌ | 0 | 客户接待区域面积（㎡） | | `--pantry` | ❌ | 0 | 茶水间、卫生间等辅助区总面积（㎡） | | `--finance-room` | ❌ | 0 | 财务办公室独立占用面积（㎡） | | `--has-manager-office` | ❌ | 否 | 是否设置经理独立办公室 | | `--manager-area` | ❌ | 12 | 经理办公室面积（㎡），建议 12~15㎡ | ## 自然语言调用示例 直接用自然语言描述参数，AI 会解析并调用脚本： ``` "50人，3个财务，工位1.2×1.2，会议室40㎡，接待室20㎡，茶水间15㎡，财务室25㎡，租多大？" "45人办公室规划，有经理独立办公室12㎡，帮我算算需要多少面积" "我们30人，要多大办公室？财务3人，会议室大概30㎡" "120人，大工位1.4×1.4，会议室80㎡，接待40㎡，茶水30㎡，财务50㎡" ``` ## 典型场景示例 **场景1：科技公司，50人，标准配置** ``` 总人数50 / 财务3人 / 1.2×1.2m工位 / 会议室40㎡ / 接待室20㎡ / 茶水间15㎡ / 财务室25㎡ → 建议租赁：约 297㎡ ``` **场景2：成长型企业，45人，有经理独立办公室** ``` 总人数45 / 财务3人 / 经理独立办公室12㎡ / 1.2×1.2m工位 / 会议室40㎡ / 接待室20㎡ / 茶水间15㎡ / 财务室25㎡ → 建议租赁：约 312㎡ ``` **场景3：大型办公室，120人，大工位配置** ``` 总人数120 / 财务5人 / 1.4×1.4m工位 / 会议室80㎡ / 接待室40㎡ / 茶水间30㎡ / 财务室50㎡ → 建议租赁：约 700㎡ ``` ## 规划流程建议 ``` Step 1：用本工具测算面积 → 知道"要租多大" Step 2：按比例分区（工位区 / 会议室 / 接待 / 茶水 / 财务） Step 3：找设计师出详细布局图 ↑ 此时面积已锁定，不用反复改图 ↑ 省去第一步反复测算的高额咨询费 ``` ## 输出说明 - **RECOMMENDED TOTAL**：最低建议租赁面积（㎡） - **+10% buffer**：考虑实际楼盘得房率（通常65-75%），建议在此基础上增加10-15%选房 - **完整面积分解**：工位区、会议室、接待室、茶水间、财务室、管理层办公室分项列出 - 本测算不含：电梯、楼道、洗手间等楼宇公共区域

path: scripts/calculate.py
content: import argparse, json

def calculate(seat_size, total_seats, finance_staff, has_manager_office,
              meeting_area, reception_area, pantry_area, finance_area,
              manager_office_area=12.0):
    if has_manager_office:
        effective_seats = total_seats - finance_staff - 1
        manager_count = 1
    else:
        effective_seats = total_seats - finance_staff
        manager_count = 0

    net_workstation = effective_seats * seat_size
    workstation_with_aisles = net_workstation / 0.65

    subtotal = workstation_with_aisles + meeting_area + reception_area + pantry_area + finance_area
    if has_manager_office:
        subtotal += manager_office_area

    total_area = round(subtotal / 0.65, 1)

    return {
        'total_area_sqm': total_area,
        'recommended_area_with_buffer_sqm': round(total_area * 1.10, 1),
        'net_workstation_sqm': round(net_workstation, 2),
        'workstation_with_aisles_sqm': round(workstation_with_aisles, 2),
        'functional_subtotal_sqm': round(subtotal, 2),
        'details': {
            'total_seats': total_seats,
            'finance_staff': finance_staff,
            'has_manager_office': has_manager_office,
            'effective_workstation_seats': effective_seats,
            'manager_count': manager_count,
            'manager_office_area_sqm': manager_office_area if has_manager_office else 0,
            'seat_size_sqm': seat_size,
            'seat_dimensions': '1.2x1.2m' if seat_size == 1.44 else '1.4x1.4m',
            'meeting_area_sqm': meeting_area,
            'reception_area_sqm': reception_area,
            'pantry_area_sqm': pantry_area,
            'finance_room_area_sqm': finance_area,
        }
    }

def main():
    p = argparse.ArgumentParser(description='Office Area Calculator (Zhide Laoshi 20 yrs)')
    p.add_argument('--seats', type=int, required=True)
    p.add_argument('--finance', type=int, default=0)
    p.add_argument('--seat-size', type=float, required=True)
    p.add_argument('--meeting', type=float, default=0)
    p.add_argument('--reception', type=float, default=0)
    p.add_argument('--pantry', type=float, default=0)
    p.add_argument('--finance-room', type=float, default=0)
    p.add_argument('--has-manager-office', action='store_true',
                   help='Include manager private office (reduces workstation count by 1, adds office area)')
    p.add_argument('--manager-area', type=float, default=12.0,
                   help='Manager office area in sqm (default: 12.0, range: 12-15)')
    p.add_argument('--json', action='store_true')
    args = p.parse_args()

    r = calculate(args.seat_size, args.seats, args.finance, args.has_manager_office,
                  args.meeting, args.reception, args.pantry, args.finance_room,
                  args.manager_area)

    if args.json:
        print(json.dumps(r, ensure_ascii=False, indent=2)); return

    d = r['details']
    print()
    print('=' * 46)
    print('       Office Area Calculator')
    print('   (by Zhide Laoshi, 20 yrs experience)')
    print('=' * 46)
    print(f'  Total seats      : {d["total_seats"]} persons')
    print(f'  Finance staff    : {d["finance_staff"]} persons')
    print(f'  Manager office   : {"Yes - " + str(d["manager_office_area_sqm"]) + " sqm" if d["has_manager_office"] else "No"}')
    print(f'  Effective seats  : {d["effective_workstation_seats"]} persons')
    print(f'  Seat size        : {d["seat_dimensions"]} ({d["seat_size_sqm"]} sqm)')
    print()
    print('  Functional areas :')
    print(f'    Meeting room   : {d["meeting_area_sqm"]} sqm')
    print(f'    Reception      : {d["reception_area_sqm"]} sqm')
    print(f'    Pantry         : {d["pantry_area_sqm"]} sqm')
    print(f'    Finance room   : {d["finance_room_area_sqm"]} sqm')
    if d["has_manager_office"]:
        print(f'    Manager office : {d["manager_office_area_sqm"]} sqm')
    print()
    print('-' * 46)
    print(f'  Net workstation  : {r["net_workstation_sqm"]} sqm')
    print(f'  + Aisle factor   : {r["workstation_with_aisles_sqm"]} sqm')
    print(f'  Subtotal         : {r["functional_subtotal_sqm"]} sqm')
    print('-' * 46)
    print(f'  RECOMMENDED TOTAL: {r["total_area_sqm"]} sqm')
    print(f'  +10%% buffer      : {r["recommended_area_with_buffer_sqm"]} sqm')
    print('=' * 46)
    print()
    print('  Note: Excludes elevators, restrooms, public areas.')
    print('  Add 10-15%% buffer when selecting actual location.')

if __name__ == '__main__':
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)