1
This commit is contained in:
+313
-96
@@ -680,13 +680,26 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
<div class="sidebar-item" data-menu="inbound">
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke="#52c41a" stroke-width="2" stroke-linecap="round"/><path d="M9 14l2 2 4-4" stroke="#52c41a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>国内仓<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
<div class="sub-menu-item active" onclick="switchPage('inbound-list',this)">入库单列表</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('inbound-dedup',this)">入库单测量</div>
|
||||
<div class="sub-menu-item active" onclick="switchPage('inbound-list',this)">订单列表</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('inbound-dedup',this)">订单测量</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('inbound-measure',this)">测量数据审核</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('overseas-location',this)">库位管理</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('pallet-manage',this)">托盘管理</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-item" data-menu="fba-return">
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><path d="M4 12a8 8 0 1 1 2.34 5.6" stroke="#eb2f96" stroke-width="2" stroke-linecap="round"/><path d="M4 12V7M4 12h5" stroke="#eb2f96" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="12" r="2.4" fill="#eb2f96"/></svg></span>海外仓<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-inbound-order',this)">入库单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-relabel-order',this)">换标单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-outbound-order',this)">出库单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-pallet',this)">托盘管理</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-carton',this)">箱号管理</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-product',this)">产品库</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-return-stock',this)">退货库存</div>
|
||||
<div class="sub-menu-item active" onclick="switchPage('overseas-stock',this)">暂扣库存</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-item" data-menu="outbound">
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><path d="M20 8h-3V4H3c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zM6 18.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5H17V9.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z" fill="#1890ff"/></svg></span>海外派送<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
@@ -707,6 +720,7 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><path d="M3 21V9l9-6 9 6v12" stroke="#eb2f96" stroke-width="2" stroke-linejoin="round"/><path d="M9 21v-6h6v6" stroke="#eb2f96" stroke-width="2" stroke-linejoin="round"/></svg></span>供应商中心<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
<div class="sub-menu-item" onclick="switchPage('supplier-list',this)">供应商列表</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('ocean-channel',this)">海运渠道</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('gen-express',this)">快递公司</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('gen-counterparty',this)">往来单位</div>
|
||||
</div>
|
||||
@@ -727,22 +741,10 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
<div class="sub-menu-item" onclick="switchPage('overseas-looseboard',this)">本土散板</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-item" data-menu="fba-return">
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><path d="M4 12a8 8 0 1 1 2.34 5.6" stroke="#eb2f96" stroke-width="2" stroke-linecap="round"/><path d="M4 12V7M4 12h5" stroke="#eb2f96" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="12" r="2.4" fill="#eb2f96"/></svg></span>海外仓库存<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-inbound-order',this)">入库单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-relabel-order',this)">换标单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-outbound-order',this)">出库单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-pallet',this)">托盘管理</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-carton',this)">箱号管理</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-product',this)">产品库</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('fba-return-stock',this)">退货库存</div>
|
||||
<div class="sub-menu-item active" onclick="switchPage('overseas-stock',this)">暂扣库存</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-item" data-menu="finance">
|
||||
<div class="menu-label" onclick="toggleMenu(this)"><span class="icon"><svg viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="10" stroke="#f5a623" stroke-width="2"/><path d="M12 6v6l4 2" stroke="#f5a623" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="12" r="2" fill="#f5a623"/></svg></span>财务管理<span class="arrow">▶</span></div>
|
||||
<div class="sub-menu">
|
||||
<div class="sub-menu-item" onclick="switchPage('customer-account',this)">客户账户</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('customer-arap',this)">客户应收应付</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('customer-recon-stmt',this)">客户对账单</div>
|
||||
<div class="sub-menu-item" onclick="switchPage('settlement-ar',this)">结算单应收</div>
|
||||
@@ -3673,34 +3675,65 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
<table><thead><tr><th>单位名称</th><th>类型</th><th>联系人</th><th>电话</th><th>状态</th><th>操作</th></tr></thead><tbody id="tbody-gen-counterparty"></tbody></table>
|
||||
<div class="pagination"><span>共 64 条</span><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">...</button><button class="page-btn">7</button></div></div></div>
|
||||
|
||||
<style>
|
||||
#page-gen-voyage .voyage-tabs{display:flex;gap:28px;padding:0 22px;border-bottom:1px solid #e8ebf2;background:#fff}
|
||||
#page-gen-voyage .voyage-tab{position:relative;padding:17px 2px 15px;color:#64748b;font-size:14px;font-weight:600;cursor:pointer}
|
||||
#page-gen-voyage .voyage-tab.active{color:#667eea}.voyage-tab.active:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:3px;border-radius:3px 3px 0 0;background:linear-gradient(90deg,#667eea,#764ba2)}
|
||||
#page-gen-voyage .voyage-pane{display:none}#page-gen-voyage .voyage-pane.active{display:block}
|
||||
#page-gen-voyage .week-summary{display:flex;align-items:center;gap:10px;padding:10px 16px;margin:0 20px 14px;border-radius:9px;background:#f5f7ff;color:#475569;font-size:13px}
|
||||
#page-gen-voyage .current-week-badge{padding:3px 9px;border-radius:10px;background:#e8edff;color:#667eea;font-size:12px;font-weight:700}
|
||||
#page-gen-voyage .cost-hero{margin:18px 20px 14px;padding:18px 20px;border-radius:14px;background:linear-gradient(135deg,#f5f7ff,#faf8ff);border:1px solid #e7e9fb}
|
||||
#page-gen-voyage .cost-hero-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:16px}
|
||||
#page-gen-voyage .cost-hero-title{font-size:16px;font-weight:750;color:#1e293b}.cost-hero-sub{font-size:12px;color:#7c8799;margin-top:5px}
|
||||
#page-gen-voyage .cost-fields{display:grid;grid-template-columns:repeat(7,minmax(125px,1fr));gap:12px}
|
||||
#page-gen-voyage .cost-field label{display:block;font-size:12px;color:#64748b;margin-bottom:6px}.cost-field input,.cost-field select{width:100%;height:36px;padding:0 10px;border:1px solid #dce1ea;border-radius:7px;background:#fff;color:#334155;box-sizing:border-box;outline:none}
|
||||
#page-gen-voyage .cost-field input:focus,.cost-field select:focus,.cost-input:focus{border-color:#667eea;box-shadow:0 0 0 2px rgba(102,126,234,.1)}
|
||||
#page-gen-voyage .cost-table-wrap{margin:0 20px;overflow:auto;border:1px solid #e8ebf2;border-radius:10px}
|
||||
#page-gen-voyage .cost-table{width:2100px;min-width:2100px;font-size:12px}.cost-table th{padding:10px 8px;background:#f7f8fc;text-align:center}.cost-table td{padding:8px;text-align:center}
|
||||
#page-gen-voyage .cost-input{width:82px;height:30px;padding:0 7px;border:1px solid #dce1ea;border-radius:5px;text-align:right;box-sizing:border-box;outline:none}.cost-input.warehouse{width:72px;text-align:left;font-weight:650}
|
||||
#page-gen-voyage .calc-cell{font-variant-numeric:tabular-nums;font-weight:650;color:#334155}.cost-quote{color:#667eea;font-weight:750}
|
||||
#page-gen-voyage .cost-footnote{padding:12px 22px 18px;color:#8490a3;font-size:12px}
|
||||
@media(max-width:1500px){#page-gen-voyage .cost-fields{grid-template-columns:repeat(4,minmax(150px,1fr))}}
|
||||
</style>
|
||||
<div class="page" id="page-gen-voyage">
|
||||
<div class="table-card"><div class="table-toolbar"><span class="title">船期价格表</span><div class="toolbar-actions"><button class="btn btn-primary">+ 新增</button><button class="btn btn-default">导入</button><button class="btn btn-default">导出</button></div></div>
|
||||
<div class="search-row">
|
||||
<input placeholder="FBA仓库" style="width:160px"/>
|
||||
<select style="width:160px"><option>全部渠道</option><option>美森正班海卡</option><option>美森加班海卡</option><option>EXX海卡</option><option>合德海卡</option><option>纽约EXX海铁</option><option>洛杉矶普船海卡</option><option>洛杉矶普船全卡</option><option>芝加哥普船海铁</option><option>休斯顿普船海卡</option></select>
|
||||
<select style="width:130px"><option>全部船期</option><option>周一</option><option>周二</option><option>周三</option><option>周四</option><option>周五</option><option>周六</option><option>周日</option></select>
|
||||
<select style="width:140px"><option>全部时效</option><option>15-20天</option><option>20-25天</option><option>25-30天</option><option>30天以上</option></select>
|
||||
<button class="btn btn-sm btn-primary">查询</button>
|
||||
<button class="btn btn-sm btn-default">重置</button>
|
||||
</div>
|
||||
<div class="inbound-table-container">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th>FBA仓库</th>
|
||||
<th>华东仓(义乌)<br/>不包税(/CBM)</th>
|
||||
<th>华东仓(义乌)<br/>包税(/KG)</th>
|
||||
<th>华南仓(深圳)<br/>包税(/KG)</th>
|
||||
<th>参考时效<br/>(船开后)</th>
|
||||
<th>最晚进仓时间</th>
|
||||
<th>船期</th>
|
||||
<th>附加费</th>
|
||||
<th>备注</th>
|
||||
<th>操作</th>
|
||||
</tr></thead>
|
||||
<tbody id="tbody-gen-voyage"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination"><span>共 26 条</span><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button></div></div></div>
|
||||
<div class="table-card">
|
||||
<div class="table-toolbar"><div><span class="title">船期价格表</span><span style="font-size:12px;color:#94a3b8;margin-left:10px">按周沉淀渠道价格,支持成本测算</span></div></div>
|
||||
<div class="voyage-tabs">
|
||||
<div class="voyage-tab active" data-tab="weekly" onclick="switchVoyageTab('weekly')">渠道周价格</div>
|
||||
<div class="voyage-tab" data-tab="cost" onclick="switchVoyageTab('cost')">成本测算</div>
|
||||
</div>
|
||||
|
||||
<div class="voyage-pane active" id="voyage-pane-weekly">
|
||||
<div class="table-toolbar" style="padding-bottom:4px"><span style="font-size:13px;color:#64748b">当前与历史周价格档案</span><div class="toolbar-actions"><button class="btn btn-primary">+ 新增</button><button class="btn btn-default">导入</button><button class="btn btn-default">导出</button></div></div>
|
||||
<div class="search-row">
|
||||
<input id="voyage-filter-fba" placeholder="FBA仓库" style="width:145px"/>
|
||||
<select id="voyage-filter-channel" style="width:180px"><option value="">全部渠道</option><option>美森正班海卡</option><option>美森加班海卡</option><option>EXX海卡</option><option>合德海卡</option><option>纽约EXX海铁</option><option>洛杉矶普船海卡</option><option>洛杉矶普船全卡</option><option>芝加哥普船海铁</option><option>休斯顿普船海卡</option></select>
|
||||
<select id="voyage-filter-week" style="width:205px"><option value="2026-08-03">2026-08-03 至 08-09(当前周)</option><option value="2026-07-27">2026-07-27 至 08-02</option><option value="2026-07-20">2026-07-20 至 07-26</option><option value="2026-07-13">2026-07-13 至 07-19</option><option value="2026-07-06">2026-07-06 至 07-12</option><option value="2026-06-29">2026-06-29 至 07-05</option></select>
|
||||
<select id="voyage-filter-sailing" style="width:125px"><option value="">全部船期</option><option>周一</option><option>周二</option><option>周三</option><option>周四</option><option>周五</option><option>周六</option><option>周日</option></select>
|
||||
<button class="btn btn-sm btn-primary" onclick="filterVoyageWeeklyPrices()">查询</button><button class="btn btn-sm btn-default" onclick="resetVoyageWeeklyFilters()">重置</button>
|
||||
</div>
|
||||
<div class="week-summary"><span class="current-week-badge" id="voyage-week-badge">当前周</span><strong id="voyage-week-title">2026-08-03 至 2026-08-09</strong><span id="voyage-week-note">本周价格生效中,后续修改仅影响当前周数据</span></div>
|
||||
<div class="inbound-table-container"><table><thead><tr><th>操作</th><th>FBA仓库</th><th>渠道</th><th>华东仓(义乌)<br/>不包税(/CBM)</th><th>华东仓(义乌)<br/>包税(/KG)</th><th>华南仓(深圳)<br/>包税(/CBM)</th><th>华南仓(深圳)<br/>包税(/KG)</th><th>参考时效<br/>(船开后)</th><th>最晚进仓时间</th><th>船期</th><th>附加费</th><th>备注</th><th>生效状态</th></tr></thead><tbody id="tbody-gen-voyage"></tbody></table></div>
|
||||
<div class="pagination"><span id="voyage-total-count">共 26 条</span><button class="page-btn active">1</button></div>
|
||||
</div>
|
||||
|
||||
<div class="voyage-pane" id="voyage-pane-cost">
|
||||
<div class="cost-hero">
|
||||
<div class="cost-hero-head"><div><div class="cost-hero-title">芝加哥普船海铁 · 成本测算</div><div class="cost-hero-sub">参考《芝加哥普船海铁成本测算》,所有费用均可编辑,点击测算后自动更新成本与报价。</div></div><div class="toolbar-actions"><button class="btn btn-default" onclick="addCostCalcRow()">+ 新增仓库行</button><button class="btn btn-default" onclick="saveCostCalcPlan()">保存方案</button><button class="btn btn-primary" onclick="calculateVoyageCosts()">测算成本</button></div></div>
|
||||
<div class="cost-fields">
|
||||
<div class="cost-field"><label>渠道</label><select id="cost-channel"><option>芝加哥普船海铁</option><option>纽约EXX海铁</option><option>洛杉矶普船海卡</option></select></div>
|
||||
<div class="cost-field"><label>计税方式</label><select id="cost-tax-mode" onchange="toggleCostTaxMode()"><option value="tax">包税(按重量)</option><option value="noTax">不包税(按立方)</option></select></div>
|
||||
<div class="cost-field"><label>船期</label><input id="cost-voyage-date" type="date" value="2026-08-13"/></div>
|
||||
<div class="cost-field"><label>海运费成本(USD)</label><input id="cost-ocean" type="number" value="8700" step="100"/></div>
|
||||
<div class="cost-field"><label>汇率</label><input id="cost-rate" type="number" value="6.9" step="0.01"/></div>
|
||||
<div class="cost-field"><label id="cost-markup-label">报价加成(元/kg)</label><input id="cost-markup" type="number" value="0.6" step="0.1"/></div>
|
||||
<div class="cost-field"><label>参考时效</label><input id="cost-time" value="船开后约35天"/></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cost-table-wrap"><table class="cost-table"><thead><tr><th>操作</th><th>亚马逊仓</th><th>AMS+换单费</th><th>内陆</th><th>清关/报关费</th><th>关税</th><th>提柜费</th><th>拆柜费</th><th>托盘费</th><th>派送费</th><th>费用小计</th><th>海运费成本</th><th>总成本(USD)</th><th>汇率</th><th>折人民币</th><th id="cost-base-header">重量(kg)</th><th id="cost-unit-header">成本单价(元/kg)</th><th>建议报价</th></tr></thead><tbody id="tbody-voyage-cost"></tbody></table></div>
|
||||
<div class="cost-footnote">计算公式:费用小计 = AMS/换单 + 内陆 + 清关/报关 + 关税 + 提柜 + 拆柜 + 托盘 + 派送;总成本 = 小计 + 海运费;成本单价 = 总成本 × 汇率 ÷ 计费基数。</div>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
<!-- ==================== SALES MANAGEMENT ==================== -->
|
||||
<div class="page" id="page-gen-sales">
|
||||
@@ -5197,6 +5230,26 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
<div class="table-card"><div class="table-toolbar"><span class="title">业财一体化</span><div class="toolbar-actions"><button class="btn btn-primary">+ 同步凭证</button><button class="btn btn-default">对账</button></div></div>
|
||||
<table><thead><tr><th>凭证号</th><th>业务类型</th><th>关联运单</th><th>金额</th><th>会计科目</th><th>同步时间</th><th>状态</th><th>操作</th></tr></thead><tbody id="tbody-integration"></tbody></table></div></div>
|
||||
|
||||
<!-- ==================== CUSTOMER ACCOUNT ==================== -->
|
||||
<style>
|
||||
#page-customer-account .ca-balance{font-size:16px;font-weight:750;color:#16a34a;font-variant-numeric:tabular-nums}#page-customer-account .ca-negative{color:#ef4444}.ca-customer{display:flex;align-items:center;gap:10px}.ca-avatar{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,#e9edff,#f3eaff);color:#667eea;display:flex;align-items:center;justify-content:center;font-weight:750;flex-shrink:0}
|
||||
#page-customer-account-detail .ca-info-grid{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid #edf0f5;border-radius:10px;overflow:hidden}.ca-info-item{padding:14px 16px;border-right:1px solid #edf0f5}.ca-info-item:last-child{border-right:0}.ca-info-label{font-size:12px;color:#94a3b8;margin-bottom:6px}.ca-info-value{font-size:13px;color:#334155;font-weight:600}.ca-amount-in{color:#16a34a;font-weight:700}.ca-amount-out{color:#ef4444;font-weight:700}.ca-transaction-note{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
</style>
|
||||
<div class="page" id="page-customer-account">
|
||||
<div class="page-nav"><span class="nav-item" onclick="switchPage('dashboard',this)">首页</span><span class="nav-sep">></span><span class="nav-item">财务管理</span><span class="nav-sep">></span><span class="nav-item active">客户账户</span></div>
|
||||
<div class="stat-row" style="grid-template-columns:repeat(4,1fr)"><div class="stat-card"><div class="label">客户账户数</div><div class="value" id="ca-stat-count">0<span>个</span></div></div><div class="stat-card"><div class="label">账户实际余额</div><div class="value" id="ca-stat-balance">¥0</div></div><div class="stat-card"><div class="label">冻结金额</div><div class="value" id="ca-stat-frozen" style="color:#f59e0b">¥0</div></div><div class="stat-card"><div class="label">本月累计扣款</div><div class="value" id="ca-stat-deduction" style="color:#ef4444">¥0</div></div></div>
|
||||
<div class="table-card"><div class="table-toolbar"><span class="title">客户账户</span><div class="toolbar-actions"><button class="btn btn-default" onclick="showToast('客户账户数据已导出','success')">导出</button></div></div>
|
||||
<div class="search-row"><input id="ca-filter-keyword" placeholder="客户名称/客户编号" style="width:210px"><select id="ca-filter-status" style="width:140px"><option value="">全部状态</option><option>正常</option><option>冻结</option><option>停用</option></select><select id="ca-filter-balance" style="width:150px"><option value="">全部余额</option><option value="positive">余额大于0</option><option value="zero">余额为0</option><option value="negative">余额小于0</option></select><button class="btn btn-sm btn-primary" onclick="renderCustomerAccounts()">查询</button><button class="btn btn-sm btn-default" onclick="resetCustomerAccountFilters()">重置</button></div>
|
||||
<div class="inbound-table-container"><table><thead><tr><th>操作</th><th>客户基本信息</th><th>客户编号</th><th>联系人</th><th>联系电话</th><th>实际余额</th><th>冻结金额</th><th>可用余额</th><th>账户状态</th><th>最后变动时间</th></tr></thead><tbody id="tbody-customer-account"></tbody></table></div><div class="pagination"><span id="ca-total-count">共 0 条</span><button class="page-btn active">1</button></div></div></div>
|
||||
|
||||
<div class="page" id="page-customer-account-detail">
|
||||
<div class="page-nav"><span class="nav-item" onclick="switchPage('customer-account',this)">财务管理</span><span class="nav-sep">></span><span class="nav-item" onclick="switchPage('customer-account',this)">客户账户</span><span class="nav-sep">></span><span class="nav-item active">账户详情</span></div>
|
||||
<div class="table-card" style="margin-bottom:16px"><div class="table-toolbar"><div><span class="title" id="ca-detail-name">客户账户详情</span><span class="tag tag-green" id="ca-detail-status" style="margin-left:10px">正常</span></div><div class="toolbar-actions"><button class="btn btn-default" onclick="switchPage('customer-account',this)">返回列表</button><button class="btn btn-primary" id="ca-detail-recharge-btn">手动充值</button></div></div>
|
||||
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:0 20px 18px"><div style="padding:18px;border-radius:12px;background:#f0fdf4;border:1px solid #d7f4df"><div style="font-size:12px;color:#64748b">实际余额</div><div id="ca-detail-balance" style="font-size:26px;font-weight:800;color:#16a34a;margin-top:8px">¥0.00</div></div><div style="padding:18px;border-radius:12px;background:#fffaf0;border:1px solid #ffebc0"><div style="font-size:12px;color:#64748b">冻结金额</div><div id="ca-detail-frozen" style="font-size:26px;font-weight:800;color:#f59e0b;margin-top:8px">¥0.00</div></div><div style="padding:18px;border-radius:12px;background:#f6f7ff;border:1px solid #e4e7ff"><div style="font-size:12px;color:#64748b">可用余额</div><div id="ca-detail-available" style="font-size:26px;font-weight:800;color:#667eea;margin-top:8px">¥0.00</div></div></div><div class="ca-info-grid" id="ca-detail-info" style="margin:0 20px 20px"></div></div>
|
||||
<div class="table-card"><div class="table-toolbar"><span class="title">账户明细(充值/扣款)</span><div class="toolbar-actions"><button class="btn btn-default" onclick="showToast('账户明细已导出','success')">导出明细</button></div></div><div class="search-row"><select id="ca-detail-type" style="width:150px"><option value="">全部扣款类型</option><option>充值</option><option>贴牌</option><option>出库</option><option>仓储费用</option><option>自提</option><option>暂扣</option><option>弃货</option><option>其它</option></select><input id="ca-detail-start" type="date" style="width:150px"><span style="color:#94a3b8">至</span><input id="ca-detail-end" type="date" style="width:150px"><button class="btn btn-sm btn-primary" onclick="renderCustomerAccountTransactions()">查询</button><button class="btn btn-sm btn-default" onclick="resetCustomerAccountTransactions()">重置</button></div><div class="inbound-table-container"><table><thead><tr><th>流水号</th><th>发生时间</th><th>扣款类型</th><th>关联单据</th><th>收入</th><th>支出</th><th>变动后余额</th><th>操作人</th><th>备注</th></tr></thead><tbody id="tbody-customer-account-detail"></tbody></table></div><div class="pagination"><span id="ca-detail-total">共 0 条</span><button class="page-btn active">1</button></div></div></div>
|
||||
|
||||
<div class="modal-overlay" id="modal-customer-recharge"><div class="modal" style="max-width:620px"><div class="modal-header"><span>手动充值</span><span onclick="hideModal('modal-customer-recharge')" style="cursor:pointer;font-size:20px">×</span></div><div class="modal-body" style="padding:22px 26px"><div style="padding:12px 14px;border-radius:8px;background:#f6f7ff;color:#475569;font-size:13px;margin-bottom:18px">充值后金额将立即计入客户实际余额,并自动生成一条“充值”账户明细。</div><input type="hidden" id="ca-recharge-id"><div class="form-row"><div class="form-group"><label>客户名称</label><input id="ca-recharge-customer" readonly style="background:#f5f6f8"></div><div class="form-group"><label>当前实际余额</label><input id="ca-recharge-current" readonly style="background:#f5f6f8;color:#16a34a;font-weight:700"></div></div><div class="form-row"><div class="form-group"><label>充值金额 <span style="color:#ef4444">*</span></label><input id="ca-recharge-amount" type="number" min="0.01" step="0.01" placeholder="请输入充值金额"></div><div class="form-group"><label>充值方式 <span style="color:#ef4444">*</span></label><select id="ca-recharge-method"><option>银行转账</option><option>支付宝</option><option>微信支付</option><option>现金</option><option>其它</option></select></div></div><div class="form-row"><div class="form-group"><label>到账日期 <span style="color:#ef4444">*</span></label><input id="ca-recharge-date" type="date"></div><div class="form-group"><label>收款凭证号</label><input id="ca-recharge-ref" placeholder="请输入银行流水/凭证号"></div></div><div class="form-row"><div class="form-group" style="width:100%"><label>充值备注</label><textarea id="ca-recharge-remark" rows="3" placeholder="请输入充值说明" style="resize:vertical"></textarea></div></div></div><div class="modal-footer"><button class="btn btn-default" onclick="hideModal('modal-customer-recharge')">取消</button><button class="btn btn-primary" onclick="saveCustomerRecharge()">确认充值</button></div></div></div>
|
||||
|
||||
<!-- ==================== FINANCE COST ANALYSIS ==================== -->
|
||||
<div class="page" id="page-finance-cost">
|
||||
<div class="chart-row equal" style="margin-bottom:16px">
|
||||
@@ -6299,6 +6352,15 @@ body.dashboard-fullscreen #page-dashboard table:has(>thead)>tbody>tr>td{backgrou
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ==================== OCEAN CHANNEL ==================== -->
|
||||
<div class="page" id="page-ocean-channel">
|
||||
<div class="page-nav"><span class="nav-item" onclick="switchPage('dashboard',this)">首页</span><span class="nav-sep">></span><span class="nav-item">供应商中心</span><span class="nav-sep">></span><span class="nav-item active">海运渠道</span></div>
|
||||
<div class="table-card"><div class="table-toolbar"><span class="title">海运渠道</span><div class="toolbar-actions"><button class="btn btn-primary" onclick="openOceanChannelModal()">+ 新增渠道</button><button class="btn btn-default" onclick="showToast('海运渠道已导出','success')">导出Excel</button></div></div>
|
||||
<div class="search-row"><input id="oc-search-name" placeholder="渠道名称/渠道编码" style="width:210px"><select id="oc-search-mode" style="width:130px"><option value="">全部运输方式</option><option>海铁</option><option>海卡</option></select><select id="oc-search-status" style="width:130px"><option value="">全部状态</option><option>启用</option><option>停用</option></select><button class="btn btn-sm btn-primary" onclick="renderOceanChannels()">查询</button><button class="btn btn-sm btn-default" onclick="resetOceanChannelSearch()">重置</button></div>
|
||||
<div class="inbound-table-container"><table><thead><tr><th>操作</th><th>渠道编码</th><th>渠道名称</th><th>运输方式</th><th>目的区域</th><th>参考时效</th><th>船期</th><th>合作供应商</th><th>状态</th><th>更新时间</th><th>备注</th></tr></thead><tbody id="tbody-ocean-channel"></tbody></table></div><div class="pagination"><span id="oc-total">共 0 条</span><button class="page-btn active">1</button></div></div></div>
|
||||
|
||||
<div class="modal-overlay" id="modal-ocean-channel"><div class="modal" style="max-width:760px"><div class="modal-header"><span id="oc-modal-title">新增海运渠道</span><span onclick="hideModal('modal-ocean-channel')" style="cursor:pointer;font-size:20px">×</span></div><div class="modal-body" style="padding:22px 26px"><input type="hidden" id="oc-edit-id"><div class="form-row"><div class="form-group"><label>渠道名称 <span style="color:#ef4444">*</span></label><input id="oc-name" placeholder="例如:芝加哥普船海铁"></div><div class="form-group"><label>渠道编码 <span style="color:#ef4444">*</span></label><input id="oc-code" placeholder="例如:CHI-SEA-RAIL"></div></div><div class="form-row"><div class="form-group"><label>运输方式 <span style="color:#ef4444">*</span></label><select id="oc-mode"><option>海铁</option><option>海卡</option></select></div><div class="form-group"><label>目的区域</label><input id="oc-destination" placeholder="请输入目的城市/区域"></div></div><div class="form-row"><div class="form-group"><label>参考时效</label><input id="oc-transit" placeholder="例如:船开后约35天"></div><div class="form-group"><label>船期</label><input id="oc-sailing" placeholder="例如:周四"></div></div><div class="form-row"><div class="form-group"><label>合作供应商</label><input id="oc-supplier" placeholder="请输入合作供应商"></div><div class="form-group"><label>状态</label><select id="oc-status"><option>启用</option><option>停用</option></select></div></div><div class="form-row"><div class="form-group" style="width:100%"><label>备注</label><textarea id="oc-remark" rows="3" placeholder="请输入渠道说明" style="resize:vertical"></textarea></div></div></div><div class="modal-footer"><button class="btn btn-default" onclick="hideModal('modal-ocean-channel')">取消</button><button class="btn btn-primary" onclick="saveOceanChannel()">保存</button></div></div></div>
|
||||
|
||||
<!-- ==================== SUPPLIER EDIT ==================== -->
|
||||
<div class="page" id="page-supplier-edit">
|
||||
<div class="page-nav">
|
||||
@@ -7594,20 +7656,40 @@ GARMENTS( MEN'S COTTON PADDED CLOTHES))</textarea></div>
|
||||
</div></div>
|
||||
|
||||
<!-- ==================== FBA RETURN - 入库单 ==================== -->
|
||||
<style>
|
||||
#page-fba-inbound-order .fbio-search-panel{margin:0 20px 16px;padding:16px 18px;background:#f7f9fc;border:1px solid #edf0f5;border-radius:12px}
|
||||
#page-fba-inbound-order .fbio-search-grid{display:grid;grid-template-columns:repeat(4,minmax(250px,1fr));gap:12px 24px}.fbio-field{display:flex;align-items:center;gap:10px;min-width:0}.fbio-field>label{width:96px;flex:0 0 96px;text-align:right;font-size:12px;font-weight:650;color:#526071}.fbio-field>input,.fbio-field>select{width:100%;min-width:0;height:38px;border:1px solid #dfe4ec;border-radius:7px;background:#fff;padding:0 12px;color:#334155;box-sizing:border-box;outline:none}.fbio-field>input:focus,.fbio-field>select:focus{border-color:#667eea;box-shadow:0 0 0 2px rgba(102,126,234,.1)}.fbio-date-range{display:flex;align-items:center;gap:7px;min-width:0}.fbio-date-range input{width:calc(50% - 10px);height:38px;border:1px solid #dfe4ec;border-radius:7px;padding:0 8px;box-sizing:border-box}.fbio-search-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid #e8ecf2}
|
||||
@media(max-width:1500px){#page-fba-inbound-order .fbio-search-grid{grid-template-columns:repeat(2,minmax(280px,1fr))}}
|
||||
</style>
|
||||
<div class="page" id="page-fba-inbound-order">
|
||||
<div class="breadcrumb">首页 <span class="sep">></span> FBA退货 <span class="sep">></span> <strong>入库单</strong></div>
|
||||
<div class="breadcrumb">首页 <span class="sep">></span> 海外仓 <span class="sep">></span> <strong>入库单</strong></div>
|
||||
<div class="table-card">
|
||||
<div class="table-toolbar"><span class="title">入库单</span><div class="toolbar-actions"><button class="btn btn-primary">+ 新建入库单</button><button class="btn btn-default">导出Excel</button></div></div>
|
||||
<div class="search-row" style="flex-wrap:wrap;gap:8px">
|
||||
<input id="fbio-no" placeholder="入库单号" style="width:170px"/>
|
||||
<select id="fbio-status" style="width:130px"><option value="">全部状态</option><option>待审核</option><option>已审核</option><option>已入库</option></select>
|
||||
<button class="btn btn-sm btn-primary" onclick="fbioSearch()">查询</button>
|
||||
<button class="btn btn-sm btn-default" onclick="fbioReset()">重置</button>
|
||||
</div>
|
||||
<div class="fbio-search-panel"><div class="fbio-search-grid">
|
||||
<div class="fbio-field"><label>定位仓库:</label><select id="fbio-location-wh"><option value="">请选择仓库</option><option>洛杉矶长滩海外仓</option><option>纽约海外仓</option><option>汉堡海外仓</option></select></div>
|
||||
<div class="fbio-field"><label>交货仓:</label><select id="fbio-delivery-wh"><option value="">请选择交货仓</option><option>宁波仓</option><option>义乌仓</option><option>深圳仓</option><option>上海仓</option></select></div>
|
||||
<div class="fbio-field"><label>入仓码:</label><input id="fbio-warehouse-code" placeholder="请输入入仓码"></div>
|
||||
<div class="fbio-field"><label>订单状态:</label><select id="fbio-status"><option value="">全部状态</option><option>待审核</option><option>已审核</option><option>已入库</option></select></div>
|
||||
<div class="fbio-field"><label>预计到达时间:</label><input id="fbio-eta" type="date"></div>
|
||||
<div class="fbio-field"><label>费用审核状态:</label><select id="fbio-fee-audit"><option value="">请选择费用审核状态</option><option>待审核</option><option>已审核</option><option>已驳回</option></select></div>
|
||||
<div class="fbio-field"><label>公司:</label><select id="fbio-company"><option value="">请选择公司</option><option>杭州积乐</option><option>岩盛、欧业</option><option>上海粤讯</option><option>义乌卓越</option></select></div>
|
||||
<div class="fbio-field"><label>集装箱号:</label><input id="fbio-container-no" placeholder="请输入集装箱号"></div>
|
||||
<div class="fbio-field"><label>柜号:</label><input id="fbio-cabinet-no" placeholder="请输入柜号"></div>
|
||||
<div class="fbio-field"><label>渠道:</label><select id="fbio-channel"><option value="">请选择渠道</option><option>芝加哥普船海铁</option><option>纽约EXX海铁</option><option>洛杉矶普船海卡</option></select></div>
|
||||
<div class="fbio-field"><label>船期:</label><input id="fbio-sailing-date" type="date"></div>
|
||||
<div class="fbio-field"><label>是否配载:</label><select id="fbio-loaded"><option value="">请选择是否配载</option><option>是</option><option>否</option></select></div>
|
||||
<div class="fbio-field"><label>是否整柜:</label><select id="fbio-full-container"><option value="">请选择是否整柜</option><option>是</option><option>否</option></select></div>
|
||||
<div class="fbio-field"><label>测量审核状态:</label><select id="fbio-measure-audit"><option value="">请选择测量数据审核状态</option><option>待审核</option><option>已审核</option><option>已驳回</option></select></div>
|
||||
<div class="fbio-field"><label>商品FBA编码:</label><input id="fbio-fba-code" placeholder="请输入商品FBA编码"></div>
|
||||
<div class="fbio-field"><label>创建日期:</label><div class="fbio-date-range"><input id="fbio-created-start" type="date"><span>–</span><input id="fbio-created-end" type="date"></div></div>
|
||||
<div class="fbio-field"><label>入库单号:</label><input id="fbio-no" placeholder="请输入入库单号"></div>
|
||||
<div class="fbio-field"><label>订单类型:</label><select id="fbio-type"><option value="">全部类型</option><option>国内订单</option><option>海外订单</option></select></div>
|
||||
</div><div class="fbio-search-actions"><button class="btn btn-default" onclick="fbioReset()">重置</button><button class="btn btn-primary" onclick="fbioSearch()">查询</button></div></div>
|
||||
<div style="overflow-x:auto">
|
||||
<table style="min-width:1180px;font-size:12px"><thead><tr style="background:#fafafa;color:#666">
|
||||
<th style="padding:9px 10px;text-align:left;white-space:nowrap">入库单号</th>
|
||||
<th style="padding:9px 10px;text-align:left;white-space:nowrap">BOL单号</th>
|
||||
<th style="padding:9px 10px;text-align:center;white-space:nowrap">类型</th>
|
||||
<th style="padding:9px 10px;text-align:left;white-space:nowrap">海外仓</th>
|
||||
<th style="padding:9px 10px;text-align:left;white-space:nowrap">货主</th>
|
||||
<th style="padding:9px 10px;text-align:right;white-space:nowrap">总箱数</th>
|
||||
@@ -10614,6 +10696,29 @@ const cashflowData = [
|
||||
{no:'CF20260602002',type:'收款',party:'速达供应链',amt:45000,cur:'CNY',balance:12520000,date:'2026-06-02',remark:'6月部分预付款'},
|
||||
];
|
||||
|
||||
const customerAccountData=[
|
||||
{id:'CA001',code:'KH20260018',name:'杭州积乐贸易有限公司',shortName:'积乐贸易',contact:'陈晓敏',phone:'138****6812',email:'finance@jile.com',balance:126580.50,frozen:8500,status:'正常',creditLevel:'A',settlement:'预充值',lastChange:'2026-08-05 10:26'},
|
||||
{id:'CA002',code:'KH20260026',name:'义乌卓越科技有限公司',shortName:'卓越科技',contact:'李伟',phone:'137****2935',email:'account@zhuoyue.com',balance:68720,frozen:0,status:'正常',creditLevel:'A',settlement:'预充值',lastChange:'2026-08-04 16:42'},
|
||||
{id:'CA003',code:'KH20260031',name:'岩盛进出口有限公司',shortName:'岩盛进出口',contact:'王珊',phone:'159****1066',email:'wangshan@yansheng.com',balance:18350.80,frozen:3200,status:'正常',creditLevel:'B',settlement:'预充值',lastChange:'2026-08-03 14:18'},
|
||||
{id:'CA004',code:'KH20260045',name:'宁波海联进出口有限公司',shortName:'宁波海联',contact:'周强',phone:'136****7258',email:'finance@hailian.com',balance:-2680,frozen:0,status:'冻结',creditLevel:'C',settlement:'授信月结',lastChange:'2026-08-02 11:05'},
|
||||
{id:'CA005',code:'KH20260052',name:'深圳速达供应链有限公司',shortName:'深圳速达',contact:'赵敏',phone:'135****8801',email:'zhaomin@suda.com',balance:0,frozen:0,status:'正常',creditLevel:'B',settlement:'预充值',lastChange:'2026-07-31 17:20'}
|
||||
];
|
||||
const customerAccountTransactions={
|
||||
CA001:[
|
||||
{no:'AC202608050018',time:'2026-08-05 10:26',type:'出库',order:'OUT20260805012',income:0,expense:2860,balance:126580.50,operator:'系统',remark:'一件代发出库费用'},
|
||||
{no:'AC202608040031',time:'2026-08-04 15:12',type:'仓储费用',order:'STO202607-018',income:0,expense:4250,balance:129440.50,operator:'系统',remark:'2026年7月仓储费用'},
|
||||
{no:'AC202608030026',time:'2026-08-03 11:08',type:'贴牌',order:'LBL20260803008',income:0,expense:1260,balance:133690.50,operator:'系统',remark:'SKU贴牌加工 420件'},
|
||||
{no:'AC202608010006',time:'2026-08-01 09:35',type:'充值',order:'RC20260801006',income:50000,expense:0,balance:134950.50,operator:'财务-李芳',remark:'银行转账充值'},
|
||||
{no:'AC202607300042',time:'2026-07-30 16:20',type:'自提',order:'PICK2026073003',income:0,expense:680,balance:84950.50,operator:'系统',remark:'客户自提操作费'},
|
||||
{no:'AC202607280019',time:'2026-07-28 13:46',type:'暂扣',order:'HOLD2026072811',income:0,expense:1500,balance:85630.50,operator:'客服-张燕',remark:'异常货物暂扣处理'},
|
||||
{no:'AC202607250014',time:'2026-07-25 10:12',type:'弃货',order:'DSP2026072502',income:0,expense:900,balance:87130.50,operator:'仓库-王强',remark:'弃货销毁处理费'},
|
||||
{no:'AC202607220008',time:'2026-07-22 09:30',type:'其它',order:'OTH2026072201',income:0,expense:350,balance:88030.50,operator:'财务-李芳',remark:'账户调整'}
|
||||
],
|
||||
CA002:[{no:'AC202608040029',time:'2026-08-04 16:42',type:'出库',order:'OUT20260804021',income:0,expense:3280,balance:68720,operator:'系统',remark:'FBA出库费用'},{no:'AC202608010011',time:'2026-08-01 10:20',type:'充值',order:'RC20260801011',income:30000,expense:0,balance:72000,operator:'财务-李芳',remark:'支付宝充值'}],
|
||||
CA003:[{no:'AC202608030022',time:'2026-08-03 14:18',type:'仓储费用',order:'STO202607-031',income:0,expense:1649.20,balance:18350.80,operator:'系统',remark:'7月仓储费用'},{no:'AC202607200013',time:'2026-07-20 09:12',type:'充值',order:'RC20260720013',income:20000,expense:0,balance:20000,operator:'财务-王芳',remark:'银行转账充值'}],
|
||||
CA004:[{no:'AC202608020016',time:'2026-08-02 11:05',type:'出库',order:'OUT20260802009',income:0,expense:2680,balance:-2680,operator:'系统',remark:'出库后账户余额不足,自动冻结'}],CA005:[]
|
||||
};
|
||||
|
||||
const integrationData = [
|
||||
{no:'VCH202606001',bizType:'海运费收入',orderNo:'BY20260525001',amt:48500,cur:'CNY',account:'主营业务收入',syncTime:'2026-06-01 10:30',status:'已同步'},
|
||||
{no:'VCH202606002',bizType:'海运费成本',orderNo:'BY20260525001',amt:22000,cur:'USD',account:'主营业务成本',syncTime:'2026-06-01 10:30',status:'已同步'},
|
||||
@@ -11051,12 +11156,20 @@ const fbaReturnOutboundData = [
|
||||
|
||||
/* FBA退货 - 入库单数据 */
|
||||
const fbaInboundOrderData = [
|
||||
{inboundNo:'FBIO20260720001',bolNo:'BOL260720001',wh:'洛杉矶长滩海外仓',owner:'杭州积乐',totalBoxes:120,chargeVol:24.5,palletTotal:4,status:'待审核'},
|
||||
{inboundNo:'FBIO20260721002',bolNo:'BOL260720002',wh:'纽约海外仓',owner:'岩盛、欧业',totalBoxes:200,chargeVol:38.0,palletTotal:6,status:'已审核'},
|
||||
{inboundNo:'FBIO20260722003',bolNo:'BOL260220003',wh:'汉堡海外仓',owner:'上海粤讯',totalBoxes:80,chargeVol:15.2,palletTotal:3,status:'已入库'},
|
||||
{inboundNo:'FBIO20260723004',bolNo:'BOL260240004',wh:'洛杉矶长滩海外仓',owner:'义乌卓越',totalBoxes:150,chargeVol:29.8,palletTotal:5,status:'待审核'},
|
||||
{inboundNo:'FBIO20260725005',bolNo:'BOL260250005',wh:'纽约海外仓',owner:'杭州积乐',totalBoxes:90,chargeVol:18.6,palletTotal:3,status:'已审核'},
|
||||
{inboundNo:'FBIO20260720001',bolNo:'BOL260720001',type:'国内订单',wh:'洛杉矶长滩海外仓',owner:'杭州积乐',totalBoxes:120,chargeVol:24.5,palletTotal:4,status:'待审核'},
|
||||
{inboundNo:'FBIO20260721002',bolNo:'BOL260720002',type:'海外订单',wh:'纽约海外仓',owner:'岩盛、欧业',totalBoxes:200,chargeVol:38.0,palletTotal:6,status:'已审核'},
|
||||
{inboundNo:'FBIO20260722003',bolNo:'BOL260220003',type:'海外订单',wh:'汉堡海外仓',owner:'上海粤讯',totalBoxes:80,chargeVol:15.2,palletTotal:3,status:'已入库'},
|
||||
{inboundNo:'FBIO20260723004',bolNo:'BOL260240004',type:'国内订单',wh:'洛杉矶长滩海外仓',owner:'义乌卓越',totalBoxes:150,chargeVol:29.8,palletTotal:5,status:'待审核'},
|
||||
{inboundNo:'FBIO20260725005',bolNo:'BOL260250005',type:'国内订单',wh:'纽约海外仓',owner:'杭州积乐',totalBoxes:90,chargeVol:18.6,palletTotal:3,status:'已审核'},
|
||||
];
|
||||
const fbioQueryMeta=[
|
||||
{deliveryWh:'宁波仓',warehouseCode:'RK26072001',eta:'2026-07-28',feeAudit:'已审核',containerNo:'MSCU7283910',cabinetNo:'40HQ-001',channel:'洛杉矶普船海卡',sailingDate:'2026-07-22',loaded:'是',fullContainer:'是',measureAudit:'已审核',fbaCode:'ONT8-A1001',createdDate:'2026-07-20'},
|
||||
{deliveryWh:'义乌仓',warehouseCode:'RK26072102',eta:'2026-07-31',feeAudit:'待审核',containerNo:'COSU6158243',cabinetNo:'40HQ-002',channel:'纽约EXX海铁',sailingDate:'2026-07-24',loaded:'是',fullContainer:'否',measureAudit:'待审核',fbaCode:'ABE8-B2002',createdDate:'2026-07-21'},
|
||||
{deliveryWh:'上海仓',warehouseCode:'RK26072203',eta:'2026-08-05',feeAudit:'已审核',containerNo:'MAEU9321764',cabinetNo:'40GP-003',channel:'芝加哥普船海铁',sailingDate:'2026-07-26',loaded:'是',fullContainer:'是',measureAudit:'已审核',fbaCode:'HAM2-C3003',createdDate:'2026-07-22'},
|
||||
{deliveryWh:'深圳仓',warehouseCode:'RK26072304',eta:'2026-08-02',feeAudit:'已驳回',containerNo:'OOLU4812057',cabinetNo:'40HQ-004',channel:'洛杉矶普船海卡',sailingDate:'2026-07-27',loaded:'否',fullContainer:'否',measureAudit:'已驳回',fbaCode:'LGB8-D4004',createdDate:'2026-07-23'},
|
||||
{deliveryWh:'宁波仓',warehouseCode:'RK26072505',eta:'2026-08-08',feeAudit:'待审核',containerNo:'TGHU5903218',cabinetNo:'40HQ-005',channel:'纽约EXX海铁',sailingDate:'2026-07-29',loaded:'否',fullContainer:'是',measureAudit:'待审核',fbaCode:'JFK8-E5005',createdDate:'2026-07-25'}
|
||||
];
|
||||
fbaInboundOrderData.forEach((d,i)=>Object.assign(d,fbioQueryMeta[i]||{}));
|
||||
|
||||
/* FBA退货 - 换标单数据 */
|
||||
const fbaRelabelOrderData = [
|
||||
@@ -11199,6 +11312,7 @@ const menuPermTree = [
|
||||
{key:'ct-board',label:'柜态看板'},
|
||||
]},
|
||||
{module:'财务管理',key:'finance',children:[
|
||||
{key:'customer-account',label:'客户账户'},
|
||||
{key:'finance-ar',label:'应收款'},
|
||||
{key:'finance-ap',label:'应付款'},
|
||||
{key:'finance-bill',label:'对账单'},
|
||||
@@ -12909,54 +13023,83 @@ function viewSupplierReconDetail(id){
|
||||
switchPage('finance-bill-recon-detail',null);
|
||||
}
|
||||
|
||||
function renderGenVoyage(){renderTable('tbody-gen-voyage',genVoyageData,['fba','eastCbm','eastTax','southTax','time','deadline','voyage','surcharge','remark',''],(d,c)=>{
|
||||
if(c==='eastCbm')return `¥${d.eastCbm}`;
|
||||
if(c==='eastTax')return `¥${d.eastTax}`;
|
||||
if(c==='southTax')return `¥${d.southTax}`;
|
||||
if(c==='surcharge')return d.surcharge==='—'?`<span style="color:#8c8c8c">—</span>`:`<span style="color:#f5222d">${d.surcharge}</span>`;
|
||||
if(c==='')return `<button class="btn btn-sm btn-default" onclick="editVoyageRow('${d.id}')">编辑</button> <button class="btn btn-sm btn-default">详情</button>`;
|
||||
return d[c];
|
||||
});}
|
||||
|
||||
const voyageChannels=['美森正班海卡','美森加班海卡','EXX海卡','合德海卡','纽约EXX海铁','洛杉矶普船海卡','洛杉矶普船全卡','芝加哥普船海铁','休斯顿普船海卡'];
|
||||
genVoyageData.forEach(function(d,i){if(!d.channel)d.channel=voyageChannels[i%voyageChannels.length];if(d.southCbm==null)d.southCbm=d.eastCbm+30;});
|
||||
const voyageWeekFactors={'2026-08-03':1,'2026-07-27':.985,'2026-07-20':1.018,'2026-07-13':1.035,'2026-07-06':1.012,'2026-06-29':.972};
|
||||
let voyageEditingId=null;
|
||||
|
||||
function switchVoyageTab(tab){
|
||||
document.querySelectorAll('#page-gen-voyage .voyage-tab').forEach(function(el){el.classList.toggle('active',el.dataset.tab===tab);});
|
||||
document.querySelectorAll('#page-gen-voyage .voyage-pane').forEach(function(el){el.classList.toggle('active',el.id==='voyage-pane-'+tab);});
|
||||
if(tab==='weekly')renderGenVoyage();else renderCostCalcRows();
|
||||
}
|
||||
|
||||
function voyageWeekEnd(start){var d=new Date(start+'T00:00:00');d.setDate(d.getDate()+6);return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');}
|
||||
function getVoyageWeeklyRows(){
|
||||
var week=(document.getElementById('voyage-filter-week')||{}).value||'2026-08-03',factor=voyageWeekFactors[week]||1;
|
||||
return genVoyageData.map(function(d){return Object.assign({},d,{week:week,eastCbm:Math.round(d.eastCbm*factor/10)*10,eastTax:Number((d.eastTax*factor).toFixed(1)),southCbm:Math.round(d.southCbm*factor/10)*10,southTax:Number((d.southTax*factor).toFixed(1))});});
|
||||
}
|
||||
|
||||
function filterVoyageWeeklyPrices(){voyageEditingId=null;renderGenVoyage();}
|
||||
function resetVoyageWeeklyFilters(){
|
||||
document.getElementById('voyage-filter-fba').value='';document.getElementById('voyage-filter-channel').value='';document.getElementById('voyage-filter-week').value='2026-08-03';document.getElementById('voyage-filter-sailing').value='';renderGenVoyage();
|
||||
}
|
||||
|
||||
function renderGenVoyage(){
|
||||
var tbody=document.getElementById('tbody-gen-voyage');if(!tbody)return;
|
||||
var week=document.getElementById('voyage-filter-week').value;
|
||||
var fba=document.getElementById('voyage-filter-fba').value.trim().toUpperCase(),channel=document.getElementById('voyage-filter-channel').value,sailing=document.getElementById('voyage-filter-sailing').value;
|
||||
var rows=getVoyageWeeklyRows().filter(function(d){return (!fba||d.fba.toUpperCase().indexOf(fba)>-1)&&(!channel||d.channel===channel)&&(!sailing||d.voyage.indexOf(sailing)>-1);});
|
||||
var current=week==='2026-08-03';
|
||||
document.getElementById('voyage-week-badge').textContent=current?'当前周':'历史周';document.getElementById('voyage-week-title').textContent=week+' 至 '+voyageWeekEnd(week);document.getElementById('voyage-week-note').textContent=current?'本周价格生效中,后续修改仅影响当前周数据':'历史价格仅供查看,切换至当前周可进行编辑';document.getElementById('voyage-total-count').textContent='共 '+rows.length+' 条';
|
||||
tbody.innerHTML=rows.map(function(d){
|
||||
var action=current?'<button class="btn btn-sm btn-default" onclick="editVoyageRow(\''+d.id+'\')">编辑</button> <button class="btn btn-sm btn-default" onclick="showToast(\'价格详情已展开\',\'success\')">详情</button>':'<button class="btn btn-sm btn-default" onclick="showToast(\'已查看 '+week+' 历史价格\',\'success\')">查看</button>';
|
||||
return '<tr data-row-id="'+d.id+'"><td style="white-space:nowrap">'+action+'</td><td><strong>'+d.fba+'</strong></td><td>'+d.channel+'</td><td>¥'+d.eastCbm+'</td><td>¥'+d.eastTax.toFixed(1)+'</td><td>¥'+d.southCbm+'</td><td>¥'+d.southTax.toFixed(1)+'</td><td>'+d.time+'</td><td>'+d.deadline+'</td><td>'+d.voyage+'</td><td>'+(d.surcharge==='—'?'<span style="color:#94a3b8">—</span>':'<span style="color:#ef4444">'+d.surcharge+'</span>')+'</td><td>'+(d.remark||'—')+'</td><td><span class="tag '+(current?'tag-green':'tag-gray')+'">'+(current?'生效中':'已归档')+'</span></td></tr>';
|
||||
}).join('')||'<tr><td colspan="13" style="text-align:center;padding:46px;color:#94a3b8">未查询到符合条件的周价格</td></tr>';
|
||||
}
|
||||
|
||||
function editVoyageRow(id){
|
||||
if(voyageEditingId)return;
|
||||
voyageEditingId=id;
|
||||
const d=genVoyageData.find(v=>v.id===id);if(!d)return;
|
||||
const tbody=document.getElementById('tbody-gen-voyage');
|
||||
const idx=genVoyageData.findIndex(v=>v.id===id);
|
||||
const row=tbody.querySelectorAll('tr')[idx];if(!row)return;
|
||||
const cells=row.querySelectorAll('td');
|
||||
const fields=['fba','eastCbm','eastTax','southTax','time','deadline','voyage','surcharge','remark'];
|
||||
const widths={fba:'100px',eastCbm:'80px',eastTax:'80px',southTax:'80px',time:'85px',deadline:'95px',voyage:'85px',surcharge:'80px',remark:'120px'};
|
||||
fields.forEach((f,i)=>{
|
||||
const v=d[f]||'';
|
||||
cells[i].innerHTML=`<input value="${v}" data-field="${f}" style="width:${widths[f]};padding:5px 8px;border:1px solid #d1d5db;border-radius:4px;font-size:13px"/>`;
|
||||
});
|
||||
cells[fields.length].innerHTML=`<button class="btn btn-sm btn-primary" onclick="saveVoyageRow('${id}')">保存</button> <button class="btn btn-sm btn-default" onclick="cancelVoyageEdit()">取消</button>`;
|
||||
if(voyageEditingId)return;voyageEditingId=id;
|
||||
var d=genVoyageData.find(function(v){return v.id===id;}),row=document.querySelector('#tbody-gen-voyage tr[data-row-id="'+id+'"]');if(!d||!row)return;
|
||||
var cells=row.querySelectorAll('td'),fields=['fba','channel','eastCbm','eastTax','southCbm','southTax','time','deadline','voyage','surcharge','remark'];
|
||||
cells[0].innerHTML='<button class="btn btn-sm btn-primary" onclick="saveVoyageRow(\''+id+'\')">保存</button> <button class="btn btn-sm btn-default" onclick="cancelVoyageEdit()">取消</button>';
|
||||
fields.forEach(function(f,i){cells[i+1].innerHTML='<input value="'+(d[f]||'')+'" data-field="'+f+'" style="width:'+(f==='channel'?'150':'82')+'px;padding:5px 7px;border:1px solid #d1d5db;border-radius:5px;font-size:12px">';});
|
||||
}
|
||||
|
||||
function saveVoyageRow(id){
|
||||
const tbody=document.getElementById('tbody-gen-voyage');
|
||||
const idx=genVoyageData.findIndex(v=>v.id===id);
|
||||
const row=tbody.querySelectorAll('tr')[idx];if(!row)return;
|
||||
const inputs=row.querySelectorAll('input');
|
||||
const d=genVoyageData[idx];
|
||||
inputs.forEach(inp=>{
|
||||
const f=inp.dataset.field;
|
||||
if(f && d.hasOwnProperty(f)){
|
||||
const v=inp.value.trim();
|
||||
if(f==='eastCbm')d[f]=parseInt(v)||0;
|
||||
else if(f==='eastTax'||f==='southTax')d[f]=parseFloat(v)||0;
|
||||
else d[f]=v;
|
||||
}
|
||||
});
|
||||
voyageEditingId=null;renderGenVoyage();showToast('保存成功','success');
|
||||
var d=genVoyageData.find(function(v){return v.id===id;}),row=document.querySelector('#tbody-gen-voyage tr[data-row-id="'+id+'"]');if(!d||!row)return;
|
||||
row.querySelectorAll('input[data-field]').forEach(function(inp){var f=inp.dataset.field,v=inp.value.trim();d[f]=(f==='eastCbm'||f==='southCbm'?parseInt(v)||0:(f==='eastTax'||f==='southTax'?parseFloat(v)||0:v));});
|
||||
voyageEditingId=null;renderGenVoyage();showToast('当前周价格已保存','success');
|
||||
}
|
||||
|
||||
function cancelVoyageEdit(){voyageEditingId=null;renderGenVoyage();}
|
||||
|
||||
const voyageCostWarehouses=['ORD2','IGQ2','RFD2','RFD4','MDW2','MDW6','JVL1','IND5','IND9','FWA4','MQJ1','STL4','CMH2','CMH3','STL3','TOL3','MCI4'];
|
||||
const voyageDeliveryFees=[650,650,700,700,750,800,950,1150,1200,1350,1400,1550,1750,1800,1900,2200,2450];
|
||||
let voyageCostSeq=voyageCostWarehouses.length+1;
|
||||
const voyageCostData=voyageCostWarehouses.map(function(warehouse,i){return{id:'VC'+(i+1),warehouse:warehouse,ams:105,inland:1000,customs:150,tariff:3000,pickup:700,devanning:300,pallet:200,delivery:voyageDeliveryFees[i],base:13000};});
|
||||
|
||||
function costNumber(v){v=parseFloat(v);return isNaN(v)?0:v;}
|
||||
function updateCostField(id,field,value){var row=voyageCostData.find(function(d){return d.id===id;});if(row)row[field]=field==='warehouse'?value:costNumber(value);}
|
||||
function calculateCostRow(d){
|
||||
var ocean=costNumber(document.getElementById('cost-ocean').value),rate=costNumber(document.getElementById('cost-rate').value),markup=costNumber(document.getElementById('cost-markup').value);
|
||||
var subtotal=d.ams+d.inland+d.customs+d.tariff+d.pickup+d.devanning+d.pallet+d.delivery,total=subtotal+ocean,cny=total*rate,unit=d.base?cny/d.base:0;
|
||||
return{subtotal:subtotal,ocean:ocean,total:total,rate:rate,cny:cny,unit:unit,quote:unit+markup};
|
||||
}
|
||||
function renderCostCalcRows(){
|
||||
var tbody=document.getElementById('tbody-voyage-cost');if(!tbody)return;
|
||||
tbody.innerHTML=voyageCostData.map(function(d){var c=calculateCostRow(d);function input(field,cls){return '<input class="cost-input '+(cls||'')+'" type="'+(field==='warehouse'?'text':'number')+'" value="'+d[field]+'" oninput="updateCostField(\''+d.id+'\',\''+field+'\',this.value)">';}
|
||||
return '<tr><td><button class="btn btn-sm btn-default" onclick="removeCostCalcRow(\''+d.id+'\')" style="color:#ef4444">删除</button></td><td>'+input('warehouse','warehouse')+'</td><td>'+input('ams')+'</td><td>'+input('inland')+'</td><td>'+input('customs')+'</td><td>'+input('tariff')+'</td><td>'+input('pickup')+'</td><td>'+input('devanning')+'</td><td>'+input('pallet')+'</td><td>'+input('delivery')+'</td><td class="calc-cell">$'+c.subtotal.toFixed(2)+'</td><td class="calc-cell">$'+c.ocean.toFixed(2)+'</td><td class="calc-cell">$'+c.total.toFixed(2)+'</td><td class="calc-cell">'+c.rate.toFixed(2)+'</td><td class="calc-cell">¥'+c.cny.toFixed(2)+'</td><td>'+input('base')+'</td><td class="calc-cell">¥'+c.unit.toFixed(2)+'</td><td class="cost-quote">¥'+c.quote.toFixed(2)+'</td></tr>';
|
||||
}).join('');
|
||||
}
|
||||
function calculateVoyageCosts(){renderCostCalcRows();showToast('成本测算已完成','success');}
|
||||
function toggleCostTaxMode(){
|
||||
var taxed=document.getElementById('cost-tax-mode').value==='tax';document.getElementById('cost-markup').value=taxed?'0.6':'150';document.getElementById('cost-markup-label').textContent=taxed?'报价加成(元/kg)':'报价加成(元/m³)';document.getElementById('cost-base-header').textContent=taxed?'重量(kg)':'立方(m³)';document.getElementById('cost-unit-header').textContent=taxed?'成本单价(元/kg)':'成本单价(元/m³)';
|
||||
voyageCostData.forEach(function(d){d.tariff=taxed?3000:0;d.base=taxed?13000:80;});renderCostCalcRows();
|
||||
}
|
||||
function addCostCalcRow(){voyageCostData.push({id:'VC'+voyageCostSeq++,warehouse:'新仓库',ams:105,inland:1000,customs:150,tariff:document.getElementById('cost-tax-mode').value==='tax'?3000:0,pickup:700,devanning:300,pallet:200,delivery:0,base:document.getElementById('cost-tax-mode').value==='tax'?13000:80});renderCostCalcRows();}
|
||||
function removeCostCalcRow(id){var i=voyageCostData.findIndex(function(d){return d.id===id;});if(i>-1){voyageCostData.splice(i,1);renderCostCalcRows();}}
|
||||
function saveCostCalcPlan(){renderCostCalcRows();showToast('成本测算方案已保存','success');}
|
||||
|
||||
var salesVisitEditingId=null;
|
||||
|
||||
function salesVisitNow(){
|
||||
@@ -13171,6 +13314,33 @@ function scReset(){
|
||||
renderSalesCommission();
|
||||
}
|
||||
|
||||
let currentCustomerAccountId=null;
|
||||
function caMoney(n){return '¥'+Number(n||0).toLocaleString('zh-CN',{minimumFractionDigits:2,maximumFractionDigits:2});}
|
||||
function renderCustomerAccounts(){
|
||||
var kw=(document.getElementById('ca-filter-keyword').value||'').trim().toLowerCase(),status=document.getElementById('ca-filter-status').value,balanceFilter=document.getElementById('ca-filter-balance').value;
|
||||
var list=customerAccountData.filter(function(d){var balanceOk=!balanceFilter||(balanceFilter==='positive'&&d.balance>0)||(balanceFilter==='zero'&&d.balance===0)||(balanceFilter==='negative'&&d.balance<0);return (!kw||(d.name+d.code).toLowerCase().indexOf(kw)>-1)&&(!status||d.status===status)&&balanceOk;});
|
||||
var totalBalance=customerAccountData.reduce(function(s,d){return s+d.balance;},0),totalFrozen=customerAccountData.reduce(function(s,d){return s+d.frozen;},0),monthDeduction=Object.keys(customerAccountTransactions).reduce(function(sum,id){return sum+(customerAccountTransactions[id]||[]).filter(function(t){return t.time.slice(0,7)==='2026-08';}).reduce(function(s,t){return s+t.expense;},0);},0);
|
||||
document.getElementById('ca-stat-count').innerHTML=customerAccountData.length+'<span>个</span>';document.getElementById('ca-stat-balance').textContent=caMoney(totalBalance);document.getElementById('ca-stat-frozen').textContent=caMoney(totalFrozen);document.getElementById('ca-stat-deduction').textContent=caMoney(monthDeduction);document.getElementById('ca-total-count').textContent='共 '+list.length+' 条';
|
||||
document.getElementById('tbody-customer-account').innerHTML=list.map(function(d){var available=d.balance-d.frozen,statusClass=d.status==='正常'?'tag-green':(d.status==='冻结'?'tag-orange':'tag-gray');return '<tr><td style="white-space:nowrap"><button class="btn btn-sm btn-default" onclick="showCustomerAccountDetail(\''+d.id+'\')">详情</button> <button class="btn btn-sm btn-primary" onclick="showCustomerRecharge(\''+d.id+'\')">充值</button></td><td><div class="ca-customer"><div class="ca-avatar">'+d.shortName.slice(0,1)+'</div><div><div style="font-weight:650;color:#1e293b">'+d.name+'</div><div style="font-size:12px;color:#94a3b8;margin-top:3px">'+d.email+'</div></div></div></td><td>'+d.code+'</td><td>'+d.contact+'</td><td>'+d.phone+'</td><td><span class="ca-balance '+(d.balance<0?'ca-negative':'')+'">'+caMoney(d.balance)+'</span></td><td style="color:#f59e0b">'+caMoney(d.frozen)+'</td><td style="font-weight:650">'+caMoney(available)+'</td><td><span class="tag '+statusClass+'">'+d.status+'</span></td><td>'+d.lastChange+'</td></tr>';}).join('')||'<tr><td colspan="10" style="padding:48px;text-align:center;color:#94a3b8">暂无符合条件的客户账户</td></tr>';
|
||||
}
|
||||
function resetCustomerAccountFilters(){document.getElementById('ca-filter-keyword').value='';document.getElementById('ca-filter-status').value='';document.getElementById('ca-filter-balance').value='';renderCustomerAccounts();}
|
||||
function showCustomerAccountDetail(id){currentCustomerAccountId=id;switchPage('customer-account-detail',null);renderCustomerAccountDetail();}
|
||||
function renderCustomerAccountDetail(){
|
||||
var d=customerAccountData.find(function(x){return x.id===currentCustomerAccountId;});if(!d)return;
|
||||
document.getElementById('ca-detail-name').textContent=d.name;var status=document.getElementById('ca-detail-status');status.textContent=d.status;status.className='tag '+(d.status==='正常'?'tag-green':d.status==='冻结'?'tag-orange':'tag-gray');document.getElementById('ca-detail-balance').textContent=caMoney(d.balance);document.getElementById('ca-detail-frozen').textContent=caMoney(d.frozen);document.getElementById('ca-detail-available').textContent=caMoney(d.balance-d.frozen);document.getElementById('ca-detail-recharge-btn').onclick=function(){showCustomerRecharge(d.id);};
|
||||
var info=[['客户编号',d.code],['联系人',d.contact],['联系电话',d.phone],['联系邮箱',d.email],['客户简称',d.shortName],['信用等级',d.creditLevel],['结算方式',d.settlement],['最后变动时间',d.lastChange]];document.getElementById('ca-detail-info').innerHTML=info.map(function(x){return '<div class="ca-info-item"><div class="ca-info-label">'+x[0]+'</div><div class="ca-info-value">'+x[1]+'</div></div>';}).join('');renderCustomerAccountTransactions();
|
||||
}
|
||||
function renderCustomerAccountTransactions(){
|
||||
var type=document.getElementById('ca-detail-type').value,start=document.getElementById('ca-detail-start').value,end=document.getElementById('ca-detail-end').value,rows=(customerAccountTransactions[currentCustomerAccountId]||[]).filter(function(t){var day=t.time.slice(0,10);return(!type||t.type===type)&&(!start||day>=start)&&(!end||day<=end);});document.getElementById('ca-detail-total').textContent='共 '+rows.length+' 条';document.getElementById('tbody-customer-account-detail').innerHTML=rows.map(function(t){return '<tr><td style="color:#667eea;font-weight:600">'+t.no+'</td><td>'+t.time+'</td><td><span class="tag '+(t.type==='充值'?'tag-green':'tag-orange')+'">'+t.type+'</span></td><td>'+(t.order||'—')+'</td><td class="ca-amount-in">'+(t.income?('+'+caMoney(t.income)):'—')+'</td><td class="ca-amount-out">'+(t.expense?('-'+caMoney(t.expense)):'—')+'</td><td style="font-weight:650">'+caMoney(t.balance)+'</td><td>'+t.operator+'</td><td><div class="ca-transaction-note" title="'+t.remark+'">'+(t.remark||'—')+'</div></td></tr>';}).join('')||'<tr><td colspan="9" style="padding:48px;text-align:center;color:#94a3b8">暂无账户明细</td></tr>';
|
||||
}
|
||||
function resetCustomerAccountTransactions(){document.getElementById('ca-detail-type').value='';document.getElementById('ca-detail-start').value='';document.getElementById('ca-detail-end').value='';renderCustomerAccountTransactions();}
|
||||
function caToday(){var d=new Date(),p=function(n){return String(n).padStart(2,'0');};return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate());}
|
||||
function showCustomerRecharge(id){var d=customerAccountData.find(function(x){return x.id===id;});if(!d)return;document.getElementById('ca-recharge-id').value=id;document.getElementById('ca-recharge-customer').value=d.name;document.getElementById('ca-recharge-current').value=caMoney(d.balance);document.getElementById('ca-recharge-amount').value='';document.getElementById('ca-recharge-method').value='银行转账';document.getElementById('ca-recharge-date').value=caToday();document.getElementById('ca-recharge-ref').value='';document.getElementById('ca-recharge-remark').value='';showModal('modal-customer-recharge');}
|
||||
function saveCustomerRecharge(){
|
||||
var id=document.getElementById('ca-recharge-id').value,d=customerAccountData.find(function(x){return x.id===id;}),amount=parseFloat(document.getElementById('ca-recharge-amount').value),date=document.getElementById('ca-recharge-date').value,method=document.getElementById('ca-recharge-method').value,ref=document.getElementById('ca-recharge-ref').value.trim(),remark=document.getElementById('ca-recharge-remark').value.trim();if(!d)return;if(!amount||amount<=0){showToast('请输入大于0的充值金额','error');return;}if(!date){showToast('请选择到账日期','error');return;}
|
||||
d.balance=Number((d.balance+amount).toFixed(2));d.lastChange=date+' '+new Date().toTimeString().slice(0,5);if(d.status==='冻结'&&d.balance>=0)d.status='正常';var seq=String(Date.now()).slice(-8);if(!customerAccountTransactions[id])customerAccountTransactions[id]=[];customerAccountTransactions[id].unshift({no:'AC'+date.replace(/-/g,'')+seq,time:d.lastChange,type:'充值',order:ref||('RC'+seq),income:amount,expense:0,balance:d.balance,operator:'当前用户',remark:remark||method+'手动充值'});hideModal('modal-customer-recharge');renderCustomerAccounts();if(currentCustomerAccountId===id&&document.getElementById('page-customer-account-detail').classList.contains('active'))renderCustomerAccountDetail();showToast('充值成功,账户余额已更新','success');
|
||||
}
|
||||
|
||||
function renderCashflow(){renderTable('tbody-cashflow',cashflowData,['no','type','party','amt','cur','balance','date','remark'],(d,c)=>{
|
||||
if(c==='type')return `<span class="tag ${d.type==='收款'?'tag-green':'tag-red'}">${d.type}</span>`;
|
||||
if(c==='amt')return `<strong style="color:${d.type==='收款'?'#52c41a':'#f5222d'}">${d.cur} ${d.amt.toLocaleString()}</strong>`;
|
||||
@@ -15530,6 +15700,7 @@ function renderFbaInboundOrder(list){
|
||||
tb.innerHTML=data.map(d=>`<tr style="border-bottom:1px solid #f0f0f0">
|
||||
<td style="padding:9px 10px;font-weight:600;color:#1f2937;white-space:nowrap">${d.inboundNo}</td>
|
||||
<td style="padding:9px 10px;white-space:nowrap">${d.bolNo}</td>
|
||||
<td style="padding:9px 10px;text-align:center"><span class="tag ${d.type==='国内订单'?'tag-blue':'tag-purple'}">${d.type}</span></td>
|
||||
<td style="padding:9px 10px;white-space:nowrap">${d.wh}</td>
|
||||
<td style="padding:9px 10px">${d.owner}</td>
|
||||
<td style="padding:9px 10px;text-align:right">${d.totalBoxes}</td>
|
||||
@@ -15542,19 +15713,36 @@ function renderFbaInboundOrder(list){
|
||||
if(pg)pg.textContent='共 '+data.length+' 条';
|
||||
}
|
||||
function fbioSearch(){
|
||||
const no=(document.getElementById('fbio-no')||{}).value||'';
|
||||
const st=(document.getElementById('fbio-status')||{}).value||'';
|
||||
const value=id=>(document.getElementById(id)||{}).value||'';
|
||||
const no=value('fbio-no'),type=value('fbio-type'),st=value('fbio-status'),locationWh=value('fbio-location-wh'),deliveryWh=value('fbio-delivery-wh'),warehouseCode=value('fbio-warehouse-code'),eta=value('fbio-eta'),feeAudit=value('fbio-fee-audit'),company=value('fbio-company'),containerNo=value('fbio-container-no'),cabinetNo=value('fbio-cabinet-no'),channel=value('fbio-channel'),sailingDate=value('fbio-sailing-date'),loaded=value('fbio-loaded'),fullContainer=value('fbio-full-container'),measureAudit=value('fbio-measure-audit'),fbaCode=value('fbio-fba-code'),createdStart=value('fbio-created-start'),createdEnd=value('fbio-created-end');
|
||||
const kw=s=>(''+(s||'')).toLowerCase();
|
||||
const filtered=fbaInboundOrderData.filter(d=>{
|
||||
if(no && !kw(d.inboundNo).includes(kw(no))) return false;
|
||||
if(type && d.type!==type) return false;
|
||||
if(st && d.status!==st) return false;
|
||||
if(locationWh && d.wh!==locationWh) return false;
|
||||
if(deliveryWh && d.deliveryWh!==deliveryWh) return false;
|
||||
if(warehouseCode && !kw(d.warehouseCode).includes(kw(warehouseCode))) return false;
|
||||
if(eta && d.eta!==eta) return false;
|
||||
if(feeAudit && d.feeAudit!==feeAudit) return false;
|
||||
if(company && d.owner!==company) return false;
|
||||
if(containerNo && !kw(d.containerNo).includes(kw(containerNo))) return false;
|
||||
if(cabinetNo && !kw(d.cabinetNo).includes(kw(cabinetNo))) return false;
|
||||
if(channel && d.channel!==channel) return false;
|
||||
if(sailingDate && d.sailingDate!==sailingDate) return false;
|
||||
if(loaded && d.loaded!==loaded) return false;
|
||||
if(fullContainer && d.fullContainer!==fullContainer) return false;
|
||||
if(measureAudit && d.measureAudit!==measureAudit) return false;
|
||||
if(fbaCode && !kw(d.fbaCode).includes(kw(fbaCode))) return false;
|
||||
if(createdStart && d.createdDate<createdStart) return false;
|
||||
if(createdEnd && d.createdDate>createdEnd) return false;
|
||||
return true;
|
||||
});
|
||||
renderFbaInboundOrder(filtered);
|
||||
showToast('查询完成,共 '+filtered.length+' 条','success');
|
||||
}
|
||||
function fbioReset(){
|
||||
['fbio-no','fbio-status'].forEach(id=>{const el=document.getElementById(id);if(el)el.value='';});
|
||||
['fbio-location-wh','fbio-delivery-wh','fbio-warehouse-code','fbio-status','fbio-eta','fbio-fee-audit','fbio-company','fbio-container-no','fbio-cabinet-no','fbio-channel','fbio-sailing-date','fbio-loaded','fbio-full-container','fbio-measure-audit','fbio-fba-code','fbio-created-start','fbio-created-end','fbio-no','fbio-type'].forEach(id=>{const el=document.getElementById(id);if(el)el.value='';});
|
||||
renderFbaInboundOrder();
|
||||
showToast('已重置','info');
|
||||
}
|
||||
@@ -16592,6 +16780,7 @@ if(el&&el.classList.contains('sub-menu-item'))el.classList.add('active');
|
||||
// Render data for the page
|
||||
if(page==='tenant-list')renderTenant();
|
||||
if(page==='supplier-list')renderSupplier();
|
||||
if(page==='ocean-channel')renderOceanChannels();
|
||||
if(page==='truck-list')renderTruckList();
|
||||
if(page==='overseas-users')renderOverseasUsers();
|
||||
if(page==='overseas-purchase')renderPurchaseList();
|
||||
@@ -16706,6 +16895,8 @@ if(page==='finance-bill'){
|
||||
renderBill();
|
||||
}
|
||||
if(page==='finance-bill-generate')renderSupplierRecon();
|
||||
if(page==='customer-account')renderCustomerAccounts();
|
||||
if(page==='customer-account-detail')renderCustomerAccountDetail();
|
||||
if(page==='customer-arap')renderArap();
|
||||
if(page==='customer-recon-stmt')renderCustomerReconStmt();
|
||||
if(page==='settlement-ap')renderSettleAp();
|
||||
@@ -18516,6 +18707,32 @@ function confirmPartialSettlement(){
|
||||
currentPartialSettlement=null;
|
||||
}
|
||||
|
||||
let oceanChannelData=[
|
||||
{id:'OC001',code:'CHI-SEA-RAIL',name:'芝加哥普船海铁',mode:'海铁',destination:'芝加哥及美中区域',transit:'船开后约35天',sailing:'周四',supplier:'中远海运',status:'启用',updatedAt:'2026-08-05 10:20',remark:'普船到港后转铁路'},
|
||||
{id:'OC002',code:'NYC-EXX-RAIL',name:'纽约EXX海铁',mode:'海铁',destination:'纽约及美东区域',transit:'船开后约28-32天',sailing:'周二/周五',supplier:'EXX合作船司',status:'启用',updatedAt:'2026-08-04 16:35',remark:'EXX快船衔接铁路'},
|
||||
{id:'OC003',code:'LAX-SEA-TRUCK',name:'洛杉矶普船海卡',mode:'海卡',destination:'洛杉矶及美西区域',transit:'船开后约22-28天',sailing:'周三/周六',supplier:'美西卡派供应商',status:'启用',updatedAt:'2026-08-03 14:10',remark:'普船到港后卡车派送'}
|
||||
];
|
||||
let oceanChannelSeq=4;
|
||||
function renderOceanChannels(){
|
||||
const tb=document.getElementById('tbody-ocean-channel');if(!tb)return;
|
||||
const kw=(document.getElementById('oc-search-name').value||'').trim().toLowerCase(),mode=document.getElementById('oc-search-mode').value,status=document.getElementById('oc-search-status').value;
|
||||
const rows=oceanChannelData.filter(d=>(!kw||(d.name+d.code).toLowerCase().includes(kw))&&(!mode||d.mode===mode)&&(!status||d.status===status));
|
||||
tb.innerHTML=rows.map(d=>`<tr><td style="white-space:nowrap"><button class="btn btn-sm btn-default" onclick="openOceanChannelModal('${d.id}')">编辑</button> <button class="btn btn-sm btn-default" onclick="toggleOceanChannelStatus('${d.id}')">${d.status==='启用'?'停用':'启用'}</button> <button class="btn btn-sm btn-default" style="color:#ef4444" onclick="deleteOceanChannel('${d.id}')">删除</button></td><td style="color:#667eea;font-weight:650">${d.code}</td><td><strong>${d.name}</strong></td><td><span class="tag ${d.mode==='海铁'?'tag-blue':'tag-purple'}">${d.mode}</span></td><td>${d.destination||'—'}</td><td>${d.transit||'—'}</td><td>${d.sailing||'—'}</td><td>${d.supplier||'—'}</td><td><span class="tag ${d.status==='启用'?'tag-green':'tag-gray'}">${d.status}</span></td><td>${d.updatedAt}</td><td>${d.remark||'—'}</td></tr>`).join('')||'<tr><td colspan="11" style="padding:48px;text-align:center;color:#94a3b8">暂无符合条件的海运渠道</td></tr>';
|
||||
document.getElementById('oc-total').textContent='共 '+rows.length+' 条';
|
||||
}
|
||||
function resetOceanChannelSearch(){document.getElementById('oc-search-name').value='';document.getElementById('oc-search-mode').value='';document.getElementById('oc-search-status').value='';renderOceanChannels();}
|
||||
function oceanChannelNow(){const d=new Date(),p=n=>String(n).padStart(2,'0');return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate())+' '+p(d.getHours())+':'+p(d.getMinutes());}
|
||||
function openOceanChannelModal(id){
|
||||
const d=id?oceanChannelData.find(x=>x.id===id):null;document.getElementById('oc-modal-title').textContent=d?'编辑海运渠道':'新增海运渠道';document.getElementById('oc-edit-id').value=d?d.id:'';document.getElementById('oc-name').value=d?d.name:'';document.getElementById('oc-code').value=d?d.code:'';document.getElementById('oc-mode').value=d?d.mode:'海铁';document.getElementById('oc-destination').value=d?d.destination:'';document.getElementById('oc-transit').value=d?d.transit:'';document.getElementById('oc-sailing').value=d?d.sailing:'';document.getElementById('oc-supplier').value=d?d.supplier:'';document.getElementById('oc-status').value=d?d.status:'启用';document.getElementById('oc-remark').value=d?d.remark:'';showModal('modal-ocean-channel');
|
||||
}
|
||||
function saveOceanChannel(){
|
||||
const id=document.getElementById('oc-edit-id').value,name=document.getElementById('oc-name').value.trim(),code=document.getElementById('oc-code').value.trim().toUpperCase();if(!name){showToast('请输入渠道名称','error');return;}if(!code){showToast('请输入渠道编码','error');return;}if(oceanChannelData.some(d=>d.code===code&&d.id!==id)){showToast('渠道编码已存在','error');return;}
|
||||
const data={code,name,mode:document.getElementById('oc-mode').value,destination:document.getElementById('oc-destination').value.trim(),transit:document.getElementById('oc-transit').value.trim(),sailing:document.getElementById('oc-sailing').value.trim(),supplier:document.getElementById('oc-supplier').value.trim(),status:document.getElementById('oc-status').value,updatedAt:oceanChannelNow(),remark:document.getElementById('oc-remark').value.trim()};
|
||||
if(id){const d=oceanChannelData.find(x=>x.id===id);if(d)Object.assign(d,data);}else{oceanChannelData.unshift(Object.assign({id:'OC'+String(oceanChannelSeq++).padStart(3,'0')},data));}hideModal('modal-ocean-channel');renderOceanChannels();showToast(id?'渠道修改成功':'渠道新增成功','success');
|
||||
}
|
||||
function toggleOceanChannelStatus(id){const d=oceanChannelData.find(x=>x.id===id);if(!d)return;d.status=d.status==='启用'?'停用':'启用';d.updatedAt=oceanChannelNow();renderOceanChannels();showToast('渠道已'+d.status,'success');}
|
||||
function deleteOceanChannel(id){const d=oceanChannelData.find(x=>x.id===id);if(!d)return;if(!confirm('确定删除渠道“'+d.name+'”吗?'))return;oceanChannelData=oceanChannelData.filter(x=>x.id!==id);renderOceanChannels();showToast('渠道已删除','success');}
|
||||
|
||||
var supplierData=[
|
||||
// 订舱
|
||||
{id:'sup001',name:'中远海运集装箱运输有限公司',cat:'booking',region:'宁波',legal:'王海涛',contact:'李经理',phone:'0574-8712 3456',license:'91330200MA2XXXX01',email:'sales@cosco.com',addr:'宁波市鄞州区福明路',status:'合作中',settlePeriod:'月结30天',remark:''},
|
||||
|
||||
Reference in New Issue
Block a user