📊 总线索: - 📞 待外呼: - 👥 客户: - 📞 批量外呼 ✍️ 生成内容

⚡ 停车经纪 SaaS

当前经纪人
'+ '

车位买卖居间成交合同

'+ '
合同编号:'+(d.contractNo||'—')+'  签约日期:'+(new Date(d.signedAt||Date.now()).toLocaleDateString('zh-CN'))+'
'+ '
甲方(客户):'+(c?esc(maskName(c.name)):'—')+'(隐号,完整信息见客户档案)  电话:'+(c?esc(c.phone||'—'):'—')+'
'+ '
乙方(居间方):新概念Ai车位经纪  经办人:'+esc(cmName)+'
'+ '

一、成交标的

'+ '
成交总额:¥'+(d.price||0)+'  居间佣金:¥'+(d.commission||0)+'
'+ '

二、佣金分润(ACN 角色分账)

'+ ''+rolesHtml+'
角色经纪人占比金额
'+ crossHtml+ '

三、签约条款

'+ '
  1. 本合同经甲乙双方确认,居间服务已完成,佣金按上述分润结算。
  2. '+ '
  3. 跨门店联卖部分由联卖方与本公司另行结算,不计入本店经纪人业绩。
  4. '+ '
  5. 本合同自双方签字(或电子确认)之日起生效,争议提交签署地法院。
  6. '+ '
  7. 客户个人信息仅用于本次居间服务,严格保密,不向无关第三方泄露。
'+ '
甲方(客户):____________
乙方(居间方):____________
'+ '
日期:'+(new Date(d.signedAt||Date.now()).toLocaleDateString('zh-CN'))+'
'+ 'window.onload=function(){setTimeout(function(){window.print();},300);}<\/scr'+'ipt>'+ ''; var w=window.open('','_blank'); if(!w){toast('请允许弹出窗口以生成合同');return;} w.document.open();w.document.write(doc);w.document.close(); } /* ===================== 业绩 ===================== */ function brokerStats(){ var map={};S.brokers.forEach(b=>map[b.id]={broker:b,listings:0,viewings:0,deals:0,commission:0}); S.listings.forEach(l=>{if(l.maintainerId&&map[l.maintainerId]&&(l.status==='私盘'||l.status==='特盘'))map[l.maintainerId].listings++;}); S.viewings.forEach(v=>{if(map[v.brokerId])map[v.brokerId].viewings++;}); S.deals.forEach(d=>{(d.roles||[]).forEach(r=>{if(map[r.brokerId]){map[r.brokerId].deals++;map[r.brokerId].commission+=Number(r.amount)||0;}});}); return Object.values(map); } function renderPerf(){ var st=brokerStats().sort((a,b)=>b.commission-a.commission); var king={ list:Object.values(brokerStats()).sort((a,b)=>b.listings-a.listings)[0], view:Object.values(brokerStats()).sort((a,b)=>b.viewings-a.viewings)[0], deal:Object.values(brokerStats()).sort((a,b)=>b.deals-a.deals)[0] }; return '
业绩看板(提成按成交角色分佣自动核算,对齐房在线「业绩排行/房源王/带看王」)。
'+ ''+ st.map((s,i)=>'').join('')+ '
经纪人私盘房源带看成交提成合计
'+(i===0?'1':'')+esc(s.broker.name)+''+s.listings+''+s.viewings+''+s.deals+'¥'+s.commission+'
'+ '

⭐ 王者榜

'+ '
'+ (king.list?'🅿 房源王:'+esc(king.list.broker.name)+'('+king.list.listings+')':'')+ (king.view?'🚗 带看王:'+esc(king.view.broker.name)+'('+king.view.viewings+')':'')+ (king.deal?'💰 成交王:'+esc(king.deal.broker.name)+'('+king.deal.deals+')':'')+ '
'; } /* ===================== 获客(员工专属码/房单/海报) ===================== */ function agentLink(){var myIds=S.listings.filter(function(l){return l.maintainerId===meId()&&(l.status==='公盘'||l.status==='私盘'||l.status==='特盘');}).map(function(l){return l.id;});var base=location.origin+'/parking_property.html';if(myIds.length)return base+'?ids='+encodeURIComponent(myIds.join(','))+'&agent='+encodeURIComponent(ME?ME.name:'')+'&aphone='+encodeURIComponent(ME?ME.phone:'');return base+'?agent='+encodeURIComponent(ME?ME.name:'')+'&aphone='+encodeURIComponent(ME?ME.phone:'');} function fangdanLink(ids){return location.origin+'/parking_property.html?ids='+encodeURIComponent(ids.join(','))+'&agent='+encodeURIComponent(ME?ME.name:'')+'&aphone='+encodeURIComponent(ME?ME.phone:'');} function renderPromo(){ if(!ME)return '
请先选择经纪人
'; var link=agentLink(); var sellable=S.listings.filter(l=>l.status==='公盘'||l.status==='私盘'||l.status==='特盘'); var qr='https://api.qrserver.com/v1/create-qr-code/?size=150x150&data='+encodeURIComponent(link); return '
对齐房在线「员工专属获客码」:分享带你的专属联系方式,扫码打开对外宣传页/房单。
'+ '

① 员工专属获客码

'+ '
'+ '二维码'+ '
专属顾问:'+esc(ME.name)+' | '+maskPhone(ME.phone)+'
'+ ''+ '
'+ '

② 多房源房单(选房源生成分享页)

'+ '
'+ (sellable.length?sellable.map(l=>'').join(''):'
暂无在售房源
')+ '
'+ ''+ '

③ 海报

'+ '
在「房源」页点某房源的 🖼素材 上传照片/视频+卖点,再生成宣传页即可当作房源海报转发朋友圈/微信群。
'; } function genFangdan(){ var ids=Array.from(document.querySelectorAll('.fd:checked')).map(c=>c.value); if(!ids.length){toast('请先勾选房源');return;} var u=fangdanLink(ids);copyText(u);window.open(u,'_blank');toast('房单链接已生成并复制'); } function copyText(t){if(navigator.clipboard)navigator.clipboard.writeText(t).then(()=>toast('已复制'),()=>prompt('复制:',t));else prompt('复制:',t);} /* ===================== 考勤 ===================== */ function renderAtt(){ var today=plus(0); var mine=S.attendance.filter(a=>a.brokerId===meId()); var todayRows=mine.filter(a=>(a.time&&new Date(a.time).toISOString().slice(0,10)===today)); return '
对齐房在线「外勤打卡/带看定位」。
'+ '
'+ ''+ ''+ '
'+ '

今日打卡('+today+')

'+ (todayRows.length?todayRows.map(a=>'
['+new Date(a.time).toLocaleTimeString('zh-CN')+'] '+a.type+' | '+(a.loc||'')+'
').join(''):'
今日未打卡
')+ '

我的考勤记录

'+ (mine.length?mine.slice().reverse().slice(0,20).map(a=>'
['+new Date(a.time).toLocaleString('zh-CN')+'] '+a.type+' | '+(a.loc||'')+'
').join(''):'
暂无
'); } function punch(type){ var loc=''; if(navigator.geolocation&&type!==''){ navigator.geolocation.getCurrentPosition(function(p){loc=p.coords.latitude.toFixed(4)+','+p.coords.longitude.toFixed(4);doPunch(type,loc);},function(){doPunch(type,'');},{timeout:4000}); } else doPunch(type,''); } async function doPunch(type,loc){ try{await pbPost('attendance',{brokerId:meId(),type:type,loc:loc});await pbGet();toast(type+'打卡成功');render();}catch(e){toast('失败:'+e.message);} } /* ===================== 设置 ===================== */ function openSettings(){state.tab='settings';renderTabs();render();} function renderSettings(){ var st=S.settings||{protectDays:3,defaultSplit:{录入:20,维护:30,带看:20,成交:30}}; var ds=st.defaultSplit||{录入:20,维护:30,带看:20,成交:30}; var splitRows=Object.keys(ds).map(k=>'
').join(''); var brok=(S.brokers||[]).map(b=>'
'+esc(b.name)+' · '+esc(b.role||'经纪人')+' · '+maskPhone(b.phone)+'
').join('')||'
暂无经纪人
'; return '
门店级设置:抢盘保护期、默认分佣比例。
'+ '
'+ '

默认分佣比例(成交按角色拆分)

'+splitRows+ ''+ '

经纪人名单('+S.brokers.length+')

'+brok; } async function saveSettings(){ var ds={};['录入','维护','带看','成交'].forEach(k=>{var v=Number(val('sp_'+k))||0;if(v)ds[k]=v;}); try{await pbPost('settings',{protectDays:Number(val('pd'))||3,defaultSplit:ds});await pbGet();toast('设置已保存');render();}catch(e){toast('失败:'+e.message);} } async function delBroker(id){ if(!confirm('删除该经纪人?其房源/客源数据保留但不再关联。'))return; S.brokers=S.brokers.filter(b=>b.id!==id); // 直接改服务端 store:用 settings 之外的轻量更新不可行,这里通过重建 brokers 列表 try{ // 服务端无 deleteBroker action,临时用 updateBroker 置状态离职 await pbPost('updateBroker',{id:id,status:'离职'}); await pbGet();toast('已置离职');render(); }catch(e){toast('失败:'+e.message);} } /* ===================== 导出 ===================== */ function pbExport(){ var blob=new Blob([JSON.stringify(S,null,1)],{type:'application/json'}); var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='parking-broker-'+plus(0)+'.json';a.click();toast('已导出服务端全量数据'); } init().catch(function(e){ var p=document.getElementById('panel'); if(p)p.innerHTML='
⚠ 初始化失败:'+((e&&e.message)||e)+'
请刷新;若持续出现,联系管理员。
'; });