'+
+ html+='
业务类型:'+profitBusinessLabels[profitBusiness]+'关联货柜:'+agg.ctNo+'客户:'+agg.cust+'渠道:'+agg.channel+'业务月份:'+agg.month+'
'+
'
收入明细
| 费用项 | 金额 |
'+incRows+'| 小计 | '+fmt(iSum)+' |
'+
'
成本明细
| 费用项 | 金额 |
'+cosRows+'| 小计 | '+fmt(cSum)+' |
'+
'
';
@@ -8219,44 +9921,75 @@ let ownVehiclesData=[
{id:'VO3',plate:'浙A·K5532',model:'解放J6P 9.6米',fuel:22.8,mileage:45600,driver:'王磊',phone:'13700137003',status:'维修中',region:'domestic',note:'变速箱检修中'},
{id:'VO4',plate:'苏E·L7788',model:'东风天锦 6.8米',fuel:17.5,mileage:98230,driver:'赵敏',phone:'13600136004',status:'在役',region:'domestic',note:''},
{id:'VO5',plate:'沪C·M1190',model:'依维柯 厢式',fuel:10.8,mileage:53400,driver:'陈浩',phone:'13500135005',status:'停用',region:'domestic',note:'年检过期待处理'},
-{id:'VO6',plate:'浙B·N3344',model:'重汽豪沃 12.5米',fuel:26.3,mileage:31200,driver:'刘洋',phone:'13300133006',status:'在役',region:'overseas',note:'海外仓自有拖车'},
+{id:'VO6',plate:'浙B·N3344',model:'重汽豪沃 12.5米',fuel:26.3,mileage:31200,driver:'刘洋',phone:'13300133006',email:'liuyang@baiyue-logistics.com',status:'在役',region:'overseas',note:'海外仓自有拖车'},
{id:'VO7',plate:'沪A·P6677',model:'福田奥铃 4.2米',fuel:12.9,mileage:67800,driver:'孙倩',phone:'18800188007',status:'在役',region:'domestic',note:''},
-{id:'VO8',plate:'苏B·Q8821',model:'五十铃 5.2米',fuel:14.6,mileage:78900,driver:'周杰',phone:'18600186008',status:'外派中',region:'overseas',note:'外派至海外合作仓库'}
+{id:'VO8',plate:'苏B·Q8821',model:'五十铃 5.2米',fuel:14.6,mileage:78900,driver:'周杰',phone:'18600186008',email:'zhoujie@baiyue-logistics.com',status:'外派中',region:'overseas',note:'外派至海外合作仓库'}
];
let dispatchVehiclesData=[
{id:'VD1',plate:'沪D·R2233',model:'解放 9.6米',fuel:21.0,mileage:56000,driver:'顺通物流',phone:'021-58886661',status:'外派中',region:'domestic',note:''},
{id:'VD2',plate:'浙C·S4455',model:'东风 6.8米',fuel:18.2,mileage:41000,driver:'恒丰运输',phone:'0571-86667772',status:'外派中',region:'domestic',note:''},
{id:'VD3',plate:'沪E·T6677',model:'江铃 4.2米',fuel:12.5,mileage:33000,driver:'速达配送',phone:'021-57778883',status:'已归还',region:'domestic',note:''},
-{id:'VD4',plate:'苏A·U8899',model:'重汽 12.5米',fuel:25.4,mileage:28000,driver:'联运物流',phone:'025-84449994',status:'外派中',region:'overseas',note:'外派海外仓'},
-{id:'VD5',plate:'浙D·V1122',model:'福田 5.2米',fuel:15.1,mileage:47000,driver:'安捷运输',phone:'0579-85556665',status:'已归还',region:'overseas',note:'外派海外仓'}
+{id:'VD4',plate:'苏A·U8899',model:'重汽 12.5米',fuel:25.4,mileage:28000,driver:'联运物流',phone:'025-84449994',email:'dispatch@lianyun-logistics.com',status:'外派中',region:'overseas',note:'外派海外仓'},
+{id:'VD5',plate:'浙D·V1122',model:'福田 5.2米',fuel:15.1,mileage:47000,driver:'安捷运输',phone:'0579-85556665',email:'service@anjie-transport.com',status:'已归还',region:'overseas',note:'外派海外仓'}
];
+const seededDispatchFleetRecord=staticDispatchRecords.find(item=>item.dispatchNo==='YWBHK200615001');
+const seededDispatchFleetVehicle=dispatchVehiclesData.find(item=>item.id==='VD4');
+if(seededDispatchFleetRecord&&seededDispatchFleetVehicle){
+ applyDispatchFleetChange(seededDispatchFleetRecord,null,seededDispatchFleetVehicle,'','2026-06-15 09:00','李输入');
+}
let vehicleTab='own';
-let vehicleRegion={own:'all',dispatch:'all'};
+let vehicleRegion='domestic';
let vehicleEditCtx={key:'own',id:null};
+let vehicleDetailContext={key:'own',id:'',region:'domestic',tab:'own',scrollTop:0};
function vehicleStatusTag(s){
const map={'在役':['#52c41a','#f6ffed','#b7eb8f'],'外派中':['#1677ff','#e6f4ff','#91caff'],'维修中':['#fa8c16','#fff7e6','#ffd591'],'停用':['#8c8c8c','#fafafa','#d9d9d9'],'已归还':['#722ed1','#f9f0ff','#d3adf7']};
const c=map[s]||['#8c8c8c','#fafafa','#d9d9d9'];
return '
'+s+'';
}
function vehicleRegionTag(r){
- if(r==='overseas')return '
国外';
+ if(r==='overseas')return '
海外';
return '
国内';
}
-function setVehicleRegion(key,reg,el){
- vehicleRegion[key]=reg;
- document.querySelectorAll('#panel-vehicle-'+key+' .vregion-pill').forEach(p=>{p.style.color='#374151';p.style.background='#fff';p.style.borderColor='#e5e7eb';});
- if(el){el.style.color='#fa8c16';el.style.background='#fff7e6';el.style.borderColor='#ffd591';}
+function syncVehicleTabState(){
+ document.querySelectorAll('#page-vehicle .vehicle-region-tab').forEach(tab=>{
+ const active=tab.dataset.region===vehicleRegion;
+ tab.classList.toggle('active',active);
+ tab.setAttribute('aria-selected',active?'true':'false');
+ });
+ document.querySelectorAll('#page-vehicle .vehicle-owner-tab').forEach(tab=>{
+ const active=tab.dataset.owner===vehicleTab;
+ tab.classList.toggle('active',active);
+ tab.setAttribute('aria-selected',active?'true':'false');
+ });
+ document.querySelectorAll('#page-vehicle .vehicle-panel').forEach(panel=>{panel.style.display='none';});
+ const panel=document.getElementById('panel-vehicle-'+vehicleTab);
+ if(panel)panel.style.display='block';
+ document.querySelectorAll('#page-vehicle .vehicle-overseas-only').forEach(cell=>{cell.style.display=vehicleRegion==='overseas'?'':'none';});
+}
+function syncVehicleEmailFieldVisibility(){
+ const region=(document.getElementById('vehicle-m-region')||{}).value||'domestic';
+ const group=document.getElementById('vehicle-email-group');
+ const email=document.getElementById('vehicle-m-email');
+ if(group)group.style.display=region==='overseas'?'':'none';
+ if(email&®ion!=='overseas')email.value='';
+}
+function switchVehicleRegion(el,region){
+ vehicleRegion=region;
+ syncVehicleTabState();
renderVehicle();
}
function vehicleRenderOne(arr,tbodyId,key){
const tb=document.getElementById(tbodyId);
if(!tb)return;
- if(!arr.length){tb.innerHTML='
| 暂无车辆 |
';return;}
+ if(!arr.length){tb.innerHTML='
| 暂无车辆 |
';return;}
const fmt=n=>n.toLocaleString('zh-CN');
tb.innerHTML=arr.map(d=>{
- const ops='
查看'+
+ ensureFleetSyncState(d);
+ const ops='
查看'+
'
编辑'+
'
删除';
+ const fleetCells=key==='dispatch'?'
'+lmoEsc(d.currentDispatchNo||'—')+' | '+
+ '
'+lmoEsc(d.lastFleetChangeReason||'—')+' | ':'';
return '
'+
'| '+d.plate+' | '+
''+d.model+' | '+
@@ -8264,6 +9997,8 @@ function vehicleRenderOne(arr,tbodyId,key){
''+fmt(d.mileage)+' | '+
''+d.driver+' | '+
''+d.phone+' | '+
+ (d.region==='overseas'?''+lmoEsc(d.email||'—')+' | ':'')+
+ fleetCells+
''+vehicleStatusTag(d.status)+' | '+
''+vehicleRegionTag(d.region)+' | '+
''+ops+' |
';
@@ -8273,7 +10008,7 @@ function vehicleApplyFilter(){
const kw=((document.getElementById('vehicle-kw')||{}).value||'').trim().toLowerCase();
const st=(document.getElementById('vehicle-status')||{}).value||'';
const filt=arr=>arr.filter(d=>{
- const okw=!kw||(d.plate+' '+d.driver+' '+d.model+' '+(d.phone||'')).toLowerCase().includes(kw);
+ const okw=!kw||(d.plate+' '+d.driver+' '+d.model+' '+(d.phone||'')+' '+(d.email||'')).toLowerCase().includes(kw);
const os=!st||d.status===st;
return okw&&os;
});
@@ -8281,19 +10016,18 @@ function vehicleApplyFilter(){
}
function renderVehicle(){
const f=vehicleApplyFilter();
- const own=f.own.filter(d=>vehicleRegion.own==='all'||d.region===vehicleRegion.own);
- const dispatch=f.dispatch.filter(d=>vehicleRegion.dispatch==='all'||d.region===vehicleRegion.dispatch);
+ const own=f.own.filter(d=>d.region===vehicleRegion);
+ const dispatch=f.dispatch.filter(d=>d.region===vehicleRegion);
vehicleRenderOne(own,'tbody-vehicle-own','own');
vehicleRenderOne(dispatch,'tbody-vehicle-dispatch','dispatch');
const pg=document.getElementById('vehicle-total');
- if(pg)pg.textContent='共 '+(own.length+dispatch.length)+' 条(自有 '+own.length+' · 外派 '+dispatch.length+')';
+ const current=vehicleTab==='own'?own:dispatch;
+ if(pg)pg.textContent='共 '+current.length+' 条';
}
function switchVehicleTab(el,key){
vehicleTab=key;
- document.querySelectorAll('#page-vehicle .vehicle-stab').forEach(t=>{t.style.color='#374151';t.style.borderBottomColor='transparent';t.style.fontWeight='';});
- el.style.color='#1677ff';el.style.borderBottomColor='#1677ff';el.style.fontWeight='600';
- document.querySelectorAll('#page-vehicle .vehicle-panel').forEach(p=>p.style.display='none');
- document.getElementById('panel-vehicle-'+key).style.display='block';
+ syncVehicleTabState();
+ renderVehicle();
}
function vehicleSearch(){renderVehicle();showToast('查询完成','success');}
function vehicleReset(){
@@ -8319,6 +10053,7 @@ function openVehicleModal(mode,key,id){
setV('vehicle-m-status',d.status);
setV('vehicle-m-region',d.region||'domestic');
setV('vehicle-m-phone',d.phone||'');
+ setV('vehicle-m-email',d.region==='overseas'?(d.email||''):'');
setV('vehicle-m-note',d.note||'');
}else{
setV('vehicle-m-type',vehicleTab);
@@ -8328,10 +10063,12 @@ function openVehicleModal(mode,key,id){
setV('vehicle-m-mileage','');
setV('vehicle-m-driver','');
setV('vehicle-m-status','在役');
- setV('vehicle-m-region','domestic');
+ setV('vehicle-m-region',vehicleRegion);
setV('vehicle-m-phone','');
+ setV('vehicle-m-email','');
setV('vehicle-m-note','');
}
+ syncVehicleEmailFieldVisibility();
showModal('modal-vehicle-edit');
}
function saveVehicle(){
@@ -8344,6 +10081,7 @@ function saveVehicle(){
const status=document.getElementById('vehicle-m-status').value;
const region=document.getElementById('vehicle-m-region').value;
const phone=(document.getElementById('vehicle-m-phone').value||'').trim();
+ const email=region==='overseas'?(document.getElementById('vehicle-m-email').value||'').trim():'';
const note=(document.getElementById('vehicle-m-note').value||'').trim();
if(!plate){showToast('请填写车牌号','warning');return;}
if(!model){showToast('请填写车型','warning');return;}
@@ -8351,37 +10089,96 @@ function saveVehicle(){
if(isNaN(mileage)||mileage<0){showToast('请填写有效公里码','warning');return;}
const arr=getVehicleArr(key);
if(vehicleEditCtx.id){
- const d=arr.find(x=>x.id===vehicleEditCtx.id);
- if(d){Object.assign(d,{plate,model,fuel,mileage,driver,status,region,phone,note});}
+ const sourceArr=getVehicleArr(vehicleEditCtx.key);
+ const sourceIndex=sourceArr.findIndex(x=>x.id===vehicleEditCtx.id);
+ const d=sourceIndex>=0?sourceArr[sourceIndex]:null;
+ if(d){
+ Object.assign(d,{plate,model,fuel,mileage,driver,status,region,phone,email,note});
+ if(sourceArr!==arr){sourceArr.splice(sourceIndex,1);arr.unshift(d);}
+ }
showToast('车辆已更新','success');
}else{
const id=(key==='own'?'VO':'VD')+(arr.length+1);
- arr.unshift({id,plate,model,fuel,mileage,driver,status,region,phone,note});
+ arr.unshift({id,plate,model,fuel,mileage,driver,status,region,phone,email,note});
showToast('车辆已添加','success');
}
+ vehicleRegion=region;
+ vehicleTab=key;
+ syncVehicleTabState();
renderVehicle();
- const tabEl=[...document.querySelectorAll('#page-vehicle .vehicle-stab')].find(t=>(key==='own'?'自有':'外派')===t.textContent.trim());
- if(tabEl)switchVehicleTab(tabEl,key);
hideModal('modal-vehicle-edit');
}
-function viewVehicle(key,id){
- const d=getVehicleArr(key).find(x=>x.id===id);
- if(!d)return;
- document.getElementById('vehicle-view-title').textContent='车辆详情 · '+d.plate;
+function getVehicleDispatchOrders(vehicle,records){
+ const vehicleId=String(vehicle&&vehicle.id||'');
+ const historyNos=new Set((vehicle&&vehicle.fleetChangeHistory||[]).map(item=>String(item.dispatchNo||item.bolNo||'')).filter(Boolean));
+ const matches=new Map();
+ (records||[]).forEach(record=>{
+ const dispatchNo=String(record.dispatchNo||record.bolNo||record.firstLegNo||'');
+ const isCurrent=String(record.fleetVehicleId||'')===vehicleId;
+ const isHistory=historyNos.has(dispatchNo);
+ if(!dispatchNo||(!isCurrent&&!isHistory))return;
+ const next={record,relation:isCurrent?'当前关联':'历史关联'};
+ const previous=matches.get(dispatchNo);
+ if(!previous||next.relation==='当前关联')matches.set(dispatchNo,next);
+ });
+ return Array.from(matches.values());
+}
+function renderVehicleFleetHistory(vehicle){
+ const tbody=document.getElementById('vehicle-detail-history-body');
+ if(!tbody)return;
+ ensureFleetSyncState(vehicle);
+ const history=vehicle.fleetChangeHistory||[];
+ tbody.innerHTML=history.length?history.map(item=>'
| '+lmoEsc(item.time||'—')+' | '+lmoEsc(item.dispatchNo||item.bolNo||'—')+' | '+lmoEsc(item.action||'—')+' | '+lmoEsc(item.otherVehicle||'—')+' | '+lmoEsc(item.reason||'—')+' | '+lmoEsc(item.operator||'—')+' |
').join(''):'
| 暂无派送更换记录 |
';
+}
+function renderVehicleDetail(vehicle,key){
+ const plate=document.getElementById('vehicle-detail-plate'),status=document.getElementById('vehicle-detail-status'),info=document.getElementById('vehicle-detail-info'),ordersBody=document.getElementById('vehicle-detail-orders-body');
+ if(!plate||!status||!info||!ordersBody)return;
+ ensureFleetSyncState(vehicle);
const fmt=n=>n.toLocaleString('zh-CN');
const rows=[
- ['车牌号',d.plate],
- ['车型',d.model],
- ['油耗',d.fuel+' L/100km'],
- ['当前公里码',fmt(d.mileage)+' km'],
- ['司机 / 外派单位',d.driver||'—'],
- ['联系电话',d.phone||'—'],
- ['状态',vehicleStatusTag(d.status)],
- ['区域',vehicleRegionTag(d.region)],
- ['备注',d.note||'—']
+ ['车辆归属',key==='own'?'自有车辆':'外派车辆'],
+ ['区域',vehicle.region==='overseas'?'海外':'国内'],
+ ['车牌号',vehicle.plate],
+ ['车型',vehicle.model],
+ [key==='own'?'司机':'外派单位',vehicle.driver||'—'],
+ ['联系电话',vehicle.phone||'—'],
+ ...(vehicle.region==='overseas'?[['邮箱',vehicle.email||'—']]:[]),
+ ['油耗',vehicle.fuel+' L/100km'],
+ ['当前公里码',fmt(vehicle.mileage)+' km'],
+ ['状态',vehicle.status||'—'],
+ ['备注',vehicle.note||'—']
];
- document.getElementById('vehicle-view-body').innerHTML='
'+rows.map(r=>'
'+r[0]+'
'+r[1]+'
').join('')+'
';
- showModal('modal-vehicle-view');
+ plate.textContent=vehicle.plate||'—';
+ status.className='';
+ status.innerHTML=vehicleStatusTag(vehicle.status||'—');
+ info.innerHTML=rows.map(row=>'
'+lmoEsc(row[0])+'
'+lmoEsc(row[1])+'
').join('');
+ const orders=getVehicleDispatchOrders(vehicle,[...lastMileDispatchData,...staticDispatchRecords]);
+ ordersBody.innerHTML=orders.length?orders.map(item=>{
+ const record=item.record;
+ const relationClass=item.relation==='当前关联'?'is-current':'is-history';
+ return '
| '+lmoEsc(record.dispatchNo||record.bolNo||'—')+' | '+lmoEsc(record.bolNo||record.lastMileNo||record.firstLegNo||record.vehicleNo||'—')+' | '+lmoEsc(record.customer||record.owner||'—')+' | '+lmoEsc(record.destFba||record.warehouse||'—')+' | '+lmoEsc(record.appointmentDate||record.depart||'—')+' | '+lmoEsc(record.status||'—')+' | '+item.relation+' |
';
+ }).join(''):'
| 暂无派送订单明细 |
';
+ renderVehicleFleetHistory(vehicle);
+}
+function openVehicleDetail(key,id){
+ const vehicle=getVehicleArr(key).find(item=>item.id===id);
+ if(!vehicle){showToast('未找到该车辆记录','error');return;}
+ const mainScroll=document.querySelector('.main-content');
+ const vehicleNav=document.querySelector('.sub-menu-item[onclick="switchPage(\'vehicle\',this)"]');
+ vehicleDetailContext={key,id,region:vehicleRegion,tab:vehicleTab,scrollTop:mainScroll?mainScroll.scrollTop:0};
+ renderVehicleDetail(vehicle,key);
+ switchPage('vehicle-detail',vehicleNav);
+ if(mainScroll)mainScroll.scrollTop=0;
+}
+function backToVehicleList(){
+ vehicleRegion=vehicleDetailContext.region||'domestic';
+ vehicleTab=vehicleDetailContext.tab||vehicleDetailContext.key||'own';
+ const vehicleNav=document.querySelector('.sub-menu-item[onclick="switchPage(\'vehicle\',this)"]');
+ switchPage('vehicle',vehicleNav);
+ syncVehicleTabState();
+ renderVehicle();
+ const mainScroll=document.querySelector('.main-content');
+ if(mainScroll)requestAnimationFrame(()=>{mainScroll.scrollTop=vehicleDetailContext.scrollTop||0;});
}
function deleteVehicle(key,id){
if(typeof confirm==='function' && !confirm('确认删除该车辆?此操作不可撤销。'))return;
@@ -8462,8 +10259,11 @@ 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==='delivery-fleet-quote')renderDeliveryFleetQuotes();
if(page==='ocean-channel')renderOceanChannels();
if(page==='truck-list')renderTruckList();
+if(page==='truck-add'){truckAddRegion=truckRegion;updateTruckCurrencyLabels();}
+if(page==='truck-edit')updateTruckCurrencyLabels();
if(page==='overseas-users')renderOverseasUsers();
if(page==='overseas-purchase')switchPurchaseOrderTab('domestic');
if(page==='overseas-truck')renderTruckOrderList();
@@ -8514,6 +10314,7 @@ if(page==='inbound-detail'){
document.querySelectorAll('.ops-panel').forEach(p=>p.style.display='none');
const skuPanel=document.getElementById('ops-sku-detail');
if(skuPanel)skuPanel.style.display='block';
+ renderDomesticInboundFees();
}
if(page==='wh-inbound')renderInbound();
if(page==='wh-check')renderWhCheck();
@@ -8553,6 +10354,7 @@ if(page==='overseas-stock')renderOverseasStock();
if(page==='overseas-inbound')renderOverseasInbound();
if(page==='overseas-outbound')renderOverseasOutbound();
if(page==='overseas-relabel')renderOverseasRelabel();
+if(page==='domestic-location')renderDomesticLocation();
if(page==='overseas-location')renderOverseasLocation();
if(page==='fba-return-list')renderFbaReturn();
if(page==='fba-return-inbound')renderFbaReturnInbound();
@@ -8571,6 +10373,7 @@ if(page==='pallet-manage')renderOverseasPallet();
if(page==='ct-preload')renderCtPreload();
if(page==='ct-board')renderCtBoard();
if(page==='outbound-dispatch')renderLastMileDispatchRows();
+if(page==='outbound-exception')renderDispatchExceptions();
if(page==='outbound-vehicle')renderOutboundVehicle();
if(page==='finance-ar')renderAR();
if(page==='finance-ap')renderAP();
@@ -8587,9 +10390,10 @@ if(page==='finance-bill'){
renderBill();
}
if(page==='finance-bill-generate')renderSupplierRecon();
-if(page==='customer-account')renderCustomerAccounts();
+if(page==='customer-account'){renderCustomerAccounts();renderCustomerRechargeApplications();}
if(page==='customer-account-detail')renderCustomerAccountDetail();
if(page==='customer-arap')renderArap();
+if(page==='finance-ar-detail-report')renderReceivableDetailReport();
if(page==='customer-recon-stmt')renderCustomerReconStmt();
if(page==='settlement-ap')renderSettleAp();
if(page==='settlement-ar')renderSettlementAr();
@@ -8606,7 +10410,11 @@ if(page==='rpt-freight'){renderFreightReport();requestAnimationFrame(()=>{reques
if(page==='rpt-business')renderRptBusiness();
if(page==='gen-product')renderGenProduct();
if(page==='gen-fee')renderGenFee();
+if(page==='gen-exchange-rate')renderExchangeRates();
+if(page==='gen-owned-warehouse')renderOwnedWarehouse();
if(page==='gen-fba')renderGenFba();
+if(page==='gen-partner-warehouse')renderPartnerWarehouse();
+if(page==='gen-overseas-quote')renderOverseasWarehouseQuotes();
if(page==='gen-download')renderDownloadCenter();
if(page==='gen-pallet')renderGenPallet();
if(page==='gen-location')renderGenLocation();
@@ -8624,12 +10432,150 @@ if(page==='sys-tenant')renderSysTenant();
if(window.innerWidth<768)document.getElementById('sidebar').classList.remove('mobile-open');
}
+const domesticInboundFeeData=[];
+let domesticInboundDetailOrderCode='PCKK2606151065';
+let domesticInboundFeeContext={mode:'pickup',orderCode:domesticInboundDetailOrderCode,trigger:null,voucherName:''};
+
+function buildDomesticInboundFeeRecord(form,context,now){
+return {
+orderCode:context.orderCode,
+type:form.type,
+amount:Number(form.amount),
+currency:form.currency,
+voucherName:form.voucherName||'',
+remark:form.remark||'',
+auditStatus:'待审核',
+businessDate:now.slice(0,10)
+};
+}
+
+function domesticInboundFeeLocalDateTime(){
+const now=new Date();
+const pad=value=>String(value).padStart(2,'0');
+return now.getFullYear()+'-'+pad(now.getMonth()+1)+'-'+pad(now.getDate())+' '+pad(now.getHours())+':'+pad(now.getMinutes())+':'+pad(now.getSeconds());
+}
+
+function escapeDomesticInboundFeeHtml(value){
+return String(value==null?'':value).replace(/[&<>"']/g,char=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char]));
+}
+
+function setDomesticInboundDetailOrderCode(orderCode){
+domesticInboundDetailOrderCode=String(orderCode||'PCKK2606151065');
+const code=document.getElementById('domestic-inbound-detail-code');
+if(code)code.textContent='入库码:'+domesticInboundDetailOrderCode;
+}
+
+function openDomesticInboundDetail(orderCode){
+setDomesticInboundDetailOrderCode(orderCode);
+switchPage('inbound-detail');
+}
+
+function syncDomesticInboundDetailOrderFromListClick(event){
+const link=event.target.closest('a');
+if(!link||link.getAttribute('onclick')!=="switchPage('inbound-detail')")return;
+const row=link.closest('tr');
+const orderCode=row&&row.cells[2]?row.cells[2].textContent.trim():'';
+if(orderCode)setDomesticInboundDetailOrderCode(orderCode);
+}
+
+document.addEventListener('click',syncDomesticInboundDetailOrderFromListClick,true);
+
+function renderDomesticInboundFees(){
+const body=document.getElementById('domestic-inbound-fee-body');
+if(!body)return;
+const rows=domesticInboundFeeData.filter(item=>item.orderCode===domesticInboundDetailOrderCode);
+if(!rows.length){
+body.innerHTML='
暂无费用明细 |
';
+return;
+}
+body.innerHTML=rows.map((item,index)=>{
+const display=escapeDomesticInboundFeeHtml;
+const amount=Number(item.amount).toFixed(2);
+const voucher=item.voucherName?'
'+display(item.voucherName)+'':'—';
+return '
| 查看 | '+display(item.auditStatus)+' | 应付 | — | — | '+display(item.orderCode)+' | '+display(item.businessDate)+' | — | — | — | — | — | — | '+display(item.type)+' | '+display(item.currency)+' | '+amount+' | — | — | — | — | — | 否 | — | — | — | '+voucher+' | '+display(item.remark||'—')+' |
';
+}).join('');
+}
+
+function openDomesticInboundFeeModal(mode,orderCode,trigger){
+const isCourier=mode==='courier';
+domesticInboundFeeContext={mode:isCourier?'courier':'pickup',orderCode:String(orderCode||domesticInboundDetailOrderCode),trigger:trigger||null,voucherName:''};
+const type=document.getElementById('domestic-fee-type');
+const amount=document.getElementById('domestic-fee-amount');
+const currency=document.getElementById('domestic-fee-currency');
+const remark=document.getElementById('domestic-fee-remark');
+const code=document.getElementById('domestic-fee-order-code');
+if(type){type.disabled=isCourier;type.value=isCourier?'快递费':'取货费';}
+if(amount)amount.value='';
+if(currency)currency.value='CNY';
+if(remark)remark.value='';
+if(code)code.textContent=domesticInboundFeeContext.orderCode;
+removeDomesticFeeVoucher();
+syncDomesticFeeVoucherRequirement();
+document.querySelectorAll('.more-dropdown').forEach(item=>item.classList.remove('open'));
+showModal('modal-domestic-inbound-fee');
+setTimeout(()=>amount&&amount.focus(),0);
+}
+
+function syncDomesticFeeVoucherRequirement(){
+const type=document.getElementById('domestic-fee-type')?.value||'取货费';
+const wrap=document.getElementById('domestic-fee-voucher-wrap');
+const required=document.getElementById('domestic-fee-voucher-required');
+if(wrap)wrap.style.display=type==='取货费'?'block':'none';
+if(required)required.style.display=type==='取货费'?'inline':'none';
+if(type!=='取货费')removeDomesticFeeVoucher();
+}
+
+function handleDomesticFeeVoucher(input){
+const file=input&&input.files&&input.files[0];
+if(!file){removeDomesticFeeVoucher();return;}
+const allowed=/\.(pdf|png|jpe?g|gif|webp)$/i.test(file.name)||String(file.type).startsWith('image/')||file.type==='application/pdf';
+if(!allowed){
+showToast('付款凭证仅支持图片或 PDF 文件','error');
+removeDomesticFeeVoucher();
+return;
+}
+domesticInboundFeeContext.voucherName=file.name;
+const name=document.getElementById('domestic-fee-voucher-name');
+const remove=document.getElementById('domestic-fee-voucher-remove');
+if(name){name.textContent=file.name;name.style.color='#334155';name.title=file.name;}
+if(remove)remove.style.display='inline-flex';
+}
+
+function removeDomesticFeeVoucher(){
+domesticInboundFeeContext.voucherName='';
+const input=document.getElementById('domestic-fee-voucher');
+const name=document.getElementById('domestic-fee-voucher-name');
+const remove=document.getElementById('domestic-fee-voucher-remove');
+if(input)input.value='';
+if(name){name.textContent='未选择文件';name.style.color='#94a3b8';name.title='';}
+if(remove)remove.style.display='none';
+}
+
+function saveDomesticInboundFee(){
+const type=document.getElementById('domestic-fee-type')?.value||'';
+const amountValue=document.getElementById('domestic-fee-amount')?.value||'';
+const amount=Number(amountValue);
+const currency=document.getElementById('domestic-fee-currency')?.value||'CNY';
+const remark=(document.getElementById('domestic-fee-remark')?.value||'').trim();
+if(!amountValue||!Number.isFinite(amount)||amount<=0){showToast('请输入大于 0 的费用金额','error');return;}
+if(type==='取货费'&&!domesticInboundFeeContext.voucherName){showToast('取货费必须上传付款凭证','error');return;}
+const now=domesticInboundFeeLocalDateTime();
+domesticInboundFeeData.push(buildDomesticInboundFeeRecord({type,amount,currency,voucherName:domesticInboundFeeContext.voucherName,remark},domesticInboundFeeContext,now));
+document.querySelectorAll('[data-inbound-fee-status]').forEach(cell=>{
+if(cell.getAttribute('data-inbound-fee-status')===domesticInboundFeeContext.orderCode)cell.innerHTML='
待审核';
+});
+renderDomesticInboundFees();
+hideModal('modal-domestic-inbound-fee');
+showToast('费用已保存,等待审核','success');
+}
+
function switchDetailTab(el,panelId){
document.querySelectorAll('#detail-tabs .detail-tab').forEach(t=>t.classList.remove('active'));
el.classList.add('active');
document.querySelectorAll('.detail-panel').forEach(p=>p.style.display='none');
const panel=document.getElementById(panelId);
if(panel)panel.style.display='block';
+if(panelId==='detail-fee')renderDomesticInboundFees();
}
function toggleMoreDropdown(btn){
@@ -8676,6 +10622,7 @@ tabs.forEach(t=>t.classList.remove('active'));
el.classList.add('active');
document.getElementById('dispatch-sku-panel').style.display=tab==='sku'?'block':'none';
document.getElementById('dispatch-fee-panel').style.display=tab==='fee'?'block':'none';
+if(tab==='fee')renderOutboundVehicleCourierFeeRows();
}
function switchBolTab(tab,el){
@@ -8695,12 +10642,14 @@ document.getElementById('selfpickup-detail-panel').style.display=tab==='detail'?
function submitOtherInfo(){
const detainFlag=document.querySelector('input[name="detainFlag"]:checked')?.value;
+const boxChargeFlag=document.querySelector('input[name="boxChargeFlag"]:checked')?.value||'0';
const detainReason=document.getElementById('detainReason')?.value||'';
const expressCo=document.getElementById('expressCompany')?.value||'';
const expressNo=document.getElementById('expressNo')?.value||'';
const remark=document.getElementById('remark')?.value||'';
const internalRemark=document.getElementById('internalRemark')?.value||'';
-showToast('其他信息已提交','success');
+const boxChargeLabel=boxChargeFlag==='1'?'是':'否';
+showToast('其他信息已提交,箱子是否计费:'+boxChargeLabel,'success');
}
function toggleMenu(label){
@@ -10107,38 +12056,295 @@ var supplierCatNames={booking:'订舱',customs:'报关',trucking:'拖车',cert:'
// ============ 客户应收应付 ============
var arapData=[
-{customer:'义乌市赛恩进出口有限公司',billNo:'',joinSettle:'是',auditStatus:'客服提交',arAp:'应收',whCode:'HDHK2606271801',orderStatus:'派送待审',dispatchNo:'',feeType:'运费',containerNo:'ZCSU7140067',cabinetNo:'D2129(以是快揽)'},
-{customer:'义乌市赛恩进出口有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'PCKK2606301559',orderStatus:'派送完成',dispatchNo:'20260623056',feeType:'仓储费',containerNo:'CAUU8853971',cabinetNo:'D2062(上海合禧快揽)'},
-{customer:'义乌市华牧贸易有限公司',billNo:'',joinSettle:'是',auditStatus:'新增',arAp:'应收',whCode:'PCHWK2606161088',orderStatus:'入库完成',dispatchNo:'',feeType:'运费',containerNo:'',cabinetNo:''},
-{customer:'义乌市博隆网络科技有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'HPHK2605160727',orderStatus:'派送完成',dispatchNo:'C1720260625190',feeType:'仓储费',containerNo:'SMCU1009301',cabinetNo:'D2037(SML)'},
-{customer:'上海粤祺网络科技有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'HPHK2605140527',orderStatus:'派送完成',dispatchNo:'C1720260625355',feeType:'仓储费',containerNo:'SMCU1009301',cabinetNo:'D2037(SML)'}
+{customer:'义乌市赛恩进出口有限公司',billNo:'',joinSettle:'是',auditStatus:'客服提交',arAp:'应收',whCode:'HDHK2606271801',orderStatus:'派送待审',dispatchNo:'',feeType:'运费',amount:'1280.00',containerNo:'ZCSU7140067',cabinetNo:'D2129(以是快揽)'},
+{customer:'义乌市赛恩进出口有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'PCKK2606301559',orderStatus:'派送完成',dispatchNo:'20260623056',feeType:'仓储费',amount:'560.00',containerNo:'CAUU8853971',cabinetNo:'D2062(上海合禧快揽)'},
+{customer:'义乌市华牧贸易有限公司',billNo:'',joinSettle:'是',auditStatus:'新增',arAp:'应收',whCode:'PCHWK2606161088',orderStatus:'入库完成',dispatchNo:'',feeType:'运费',amount:'980.50',containerNo:'',cabinetNo:''},
+{customer:'义乌市博隆网络科技有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'HPHK2605160727',orderStatus:'派送完成',dispatchNo:'C1720260625190',feeType:'仓储费',amount:'720.00',containerNo:'SMCU1009301',cabinetNo:'D2037(SML)'},
+{customer:'上海粤祺网络科技有限公司',billNo:'',joinSettle:'是',auditStatus:'财务通过',arAp:'应收',whCode:'HPHK2605140527',orderStatus:'派送完成',dispatchNo:'C1720260625355',feeType:'仓储费',amount:'645.80',containerNo:'SMCU1009301',cabinetNo:'D2037(SML)'}
];
+
+function getArapActionState(status){
+ return {canEdit:status!=='审核通过',canAudit:status==='待审核'};
+}
+function getArapStatusAfterSave(){
+ return '待审核';
+}
+function getArapAuditStatus(action){
+ return action==='pass'?'审核通过':'审核驳回';
+}
+function normalizeArapAmount(value){
+ var text=String(value==null?'':value).trim();
+ if(!/^\d+(\.\d{1,2})?$/.test(text))return '';
+ var amount=Number(text);
+ return Number.isFinite(amount)&&amount>=0?amount.toFixed(2):'';
+}
+function appendArapLog(record,node,result,remark){
+ if(!Array.isArray(record.logs))record.logs=[];
+ record.logs.push({time:new Date().toLocaleString('zh-CN',{hour12:false}),node:node,operator:'财务专员',result:result,remark:remark||'—'});
+}
+arapData.forEach(function(record,index){
+ var legacyStatus=record.auditStatus;
+ record.auditStatus=legacyStatus==='财务通过'?'审核通过':'待审核';
+ record.logs=[{time:'2026-08-'+String(10+index).padStart(2,'0')+' 09:20',node:'费用已生成',operator:'系统',result:'成功',remark:'由业务单据自动生成'}];
+ if(legacyStatus==='客服提交')record.logs.push({time:'2026-08-'+String(10+index).padStart(2,'0')+' 10:05',node:'提交审核',operator:'客服专员',result:'待审核',remark:'费用信息核对完成'});
+ if(legacyStatus==='财务通过')record.logs.push({time:'2026-08-'+String(10+index).padStart(2,'0')+' 14:30',node:'财务审核',operator:'财务专员',result:'审核通过',remark:'允许参与结算'});
+});
+
function renderArap(){
var tb=document.getElementById('tbody-arap');
if(!tb)return;
-var auditCls={'财务通过':'color:#52c41a;background:#f6ffed;border:1px solid #b7eb8f;padding:2px 10px;border-radius:10px;font-size:12px','客服提交':'color:#1890ff;background:#e6f7ff;border:1px solid #91d5ff;padding:2px 10px;border-radius:10px;font-size:12px','新增':'color:#fa8c16;background:#fff7e6;border:1px solid #ffd591;padding:2px 10px;border-radius:10px;font-size:12px'};
-tb.innerHTML=arapData.map(function(d,i){
-var ops='
详情'
-+'
审核'
-+'
编辑'
-+'
禁止结算'
-+'
删除';
-return '
'
-+' | '
-+''+ops+' | '
-+''+d.customer+' | '
-+''+(d.billNo||'')+' | '
-+''+d.joinSettle+' | '
-+''+d.auditStatus+' | '
-+''+d.arAp+' | '
-+''+d.whCode+' | '
-+''+d.orderStatus+' | '
-+''+(d.dispatchNo||'')+' | '
-+''+d.feeType+' | '
-+''+d.containerNo+' | '
-+''+d.cabinetNo+' | '
-+'
';
+var auditCls={'审核通过':'tag-green','待审核':'tag-orange','审核驳回':'tag-red'};
+var statusFilter=document.getElementById('arap-filter-audit-status');
+var queryStatus=statusFilter?statusFilter.value:'';
+var rows=arapData.map(function(d,i){
+ if(queryStatus&&d.auditStatus!==queryStatus)return '';
+ var state=getArapActionState(d.auditStatus);
+ var ops='
详情';
+ if(state.canAudit)ops+='
审核';
+ if(state.canEdit)ops+='
编辑';
+ ops+='
禁止结算';
+ return '
'
+ +' | '
+ +''+ops+' | '
+ +''+d.customer+' | '
+ +''+(d.billNo||'')+' | '
+ +''+d.joinSettle+' | '
+ +''+d.auditStatus+' | '
+ +''+d.arAp+' | '
+ +''+d.whCode+' | '
+ +''+d.orderStatus+' | '
+ +''+(d.dispatchNo||'')+' | '
+ +''+d.feeType+' | '
+ +''+d.amount+' | '
+ +''+d.containerNo+' | '
+ +''+d.cabinetNo+' | '
+ +'
';
}).join('');
+tb.innerHTML=rows||'
| 暂无匹配数据 |
';
+}
+
+// ============ 应收款统计表 ============
+var receivableDetailReportData=[
+ {year:2026,receivableEntity:'浙江柏悦贸易有限公司',currency:'CNY',customer:'柏悦贸易',monthlyAmounts:{1:{direct:86400,special:22000},2:{direct:92500,special:30800},3:{direct:75300,special:28600},4:{direct:104000,special:35200},5:{direct:128000,special:36500},6:{direct:99800,special:42300},7:{direct:113600,special:52000,received:142000,deduction:200}},remark:'7月专线待核销'},
+ {year:2026,receivableEntity:'付银装',currency:'CNY',customer:'付银装',monthlyAmounts:{1:{direct:45800,special:18600},2:{direct:58200,special:21300},3:{direct:72000,special:25000},4:{direct:67800,special:29100},5:{direct:86000,special:28600},6:{direct:74500,special:31200},7:{direct:92400,special:34800,received:118000,deduction:0}},remark:''},
+ {year:2026,receivableEntity:'曼博无锡配送仓库',currency:'CNY',customer:'曼博无锡',monthlyAmounts:{1:{direct:36000,special:12800},2:{direct:42500,special:15200},3:{direct:48900,special:16800},4:{direct:55300,special:17600},5:{direct:52800,special:18000},6:{direct:61400,special:21500},7:{direct:68700,special:24300,received:80000,deduction:60}},remark:'待补收款凭证'},
+ {year:2026,receivableEntity:'深圳前海跨境电商有限公司',currency:'USD',customer:'前海跨境',monthlyAmounts:{3:{direct:8800,special:2400},4:{direct:9600,special:3100},5:{direct:10600,special:3600},6:{direct:11500,special:4200},7:{direct:12800,special:4600,received:15000,deduction:25}},remark:'按美元原币统计'},
+ {year:2026,receivableEntity:'杭州积乐贸易有限公司',currency:'CNY',customer:'积乐贸易',monthlyAmounts:{5:{direct:0,special:16500},6:{direct:48600,special:19200},7:{direct:52700,special:22800,received:70000,deduction:0}},remark:''},
+ {year:2025,receivableEntity:'浙江柏悦贸易有限公司',currency:'CNY',customer:'柏悦贸易',monthlyAmounts:{11:{direct:80600,special:26100},12:{direct:94200,special:31500,received:110000,deduction:100}},remark:'2025年历史数据'}
+];
+var receivableReportEditingIndex=-1;
+function calculateReceivableReportRow(record,monthKey){
+ var normalizedMonth=/^\d{4}-\d{2}$/.test(String(monthKey||''))?String(monthKey):'2026-07';
+ var parts=normalizedMonth.split('-');
+ var selectedYear=Number(parts[0]),selectedMonth=Number(parts[1]);
+ var source=record.year===selectedYear&&record.monthlyAmounts&&record.monthlyAmounts[selectedMonth];
+ var month=source?{direct:Number(source.direct)||0,special:Number(source.special)||0}:{direct:null,special:null};
+ var receivableAmount=(month.direct||0)+(month.special||0);
+ var receivedAmount=source?Number(source.received)||0:0;
+ var deductionAmount=source?Number(source.deduction)||0:0;
+ return Object.assign({},record,{monthKey:normalizedMonth,month:month,receivableAmount:receivableAmount,receivedAmount:receivedAmount,deductionAmount:deductionAmount,balanceAmount:receivableAmount-receivedAmount-deductionAmount});
+}
+function summarizeReceivableReportByCurrency(rows){
+ return rows.reduce(function(summary,row){
+ var currency=row.currency||'CNY';
+ if(!summary[currency])summary[currency]={receivable:0,received:0,deduction:0,balance:0};
+ summary[currency].receivable+=row.receivableAmount;
+ summary[currency].received+=row.receivedAmount;
+ summary[currency].deduction+=row.deductionAmount;
+ summary[currency].balance+=row.balanceAmount;
+ return summary;
+ },{});
+}
+function formatReceivableReportAmount(amount,currency){
+ return (currency||'CNY')+' '+Number(amount||0).toLocaleString('zh-CN',{minimumFractionDigits:2,maximumFractionDigits:2});
+}
+function buildReceivableReportHeader(monthKey){
+ return '
| 序号 | 应收单位 | 币种 | FBA直发 | FBA专线 | 应收总金额 | 已收合计 | 零头减免 | 余额未收 | 客户 | 备注 | 操作 |
|---|
';
+}
+function updateReceivableReportEditableFields(record,customer,remark){
+ var normalizedCustomer=String(customer==null?'':customer).trim();
+ var normalizedRemark=String(remark==null?'':remark).trim();
+ if(!record||!normalizedCustomer||normalizedCustomer.length>50||normalizedRemark.length>200)return false;
+ record.customer=normalizedCustomer;
+ record.remark=normalizedRemark;
+ return true;
+}
+function escapeReceivableReportText(value){
+ return String(value==null?'':value).replace(/[&<>"']/g,function(char){return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[char];});
+}
+function receivableReportCellAmount(value){
+ return Number(value||0).toLocaleString('zh-CN',{minimumFractionDigits:2,maximumFractionDigits:2});
+}
+function populateReceivableReportFilters(){
+ var entity=document.getElementById('ardr-entity'),currency=document.getElementById('ardr-currency');
+ if(!entity||!currency)return;
+ var oldEntity=entity.value,oldCurrency=currency.value;
+ var entities=[...new Set(receivableDetailReportData.map(function(item){return item.receivableEntity;}))].sort();
+ var currencies=[...new Set(receivableDetailReportData.map(function(item){return item.currency;}))].sort();
+ entity.innerHTML='
'+entities.map(function(item){return '
';}).join('');
+ currency.innerHTML='
'+currencies.map(function(item){return '
';}).join('');
+ if(entities.indexOf(oldEntity)>=0)entity.value=oldEntity;
+ if(currencies.indexOf(oldCurrency)>=0)currency.value=oldCurrency;
+}
+function renderReceivableReportSummary(summary){
+ var currencies=Object.keys(summary).sort();
+ if(!currencies.length)currencies=['CNY'];
+ var fields=[['ardr-total-receivable','receivable'],['ardr-total-received','received'],['ardr-total-deduction','deduction'],['ardr-total-balance','balance']];
+ fields.forEach(function(pair){
+ var el=document.getElementById(pair[0]);
+ if(!el)return;
+ el.innerHTML=currencies.map(function(currency){return formatReceivableReportAmount(summary[currency]?summary[currency][pair[1]]:0,currency);}).join('
');
+ });
+}
+function renderReceivableDetailReport(){
+ var tbody=document.getElementById('tbody-receivable-detail-report');
+ var thead=document.getElementById('thead-receivable-detail-report');
+ var monthEl=document.getElementById('ardr-month');
+ if(!tbody||!thead||!monthEl)return;
+ populateReceivableReportFilters();
+ var monthKey=/^\d{4}-\d{2}$/.test(monthEl.value)?monthEl.value:'2026-07';
+ var year=Number(monthKey.slice(0,4));
+ var month=Number(monthKey.slice(5,7));
+ var entity=(document.getElementById('ardr-entity')||{}).value||'';
+ var currency=(document.getElementById('ardr-currency')||{}).value||'';
+ var rows=receivableDetailReportData.filter(function(item){return item.year===year&&item.monthlyAmounts&&item.monthlyAmounts[month]&&(!entity||item.receivableEntity===entity)&&(!currency||item.currency===currency);}).map(function(item){var row=calculateReceivableReportRow(item,monthKey);row.sourceIndex=receivableDetailReportData.indexOf(item);return row;});
+ var summary=summarizeReceivableReportByCurrency(rows);
+ renderReceivableReportSummary(summary);
+ thead.innerHTML=buildReceivableReportHeader(monthKey);
+ var title=document.getElementById('ardr-table-title');
+ if(title)title.textContent='应收款明细';
+ var count=document.getElementById('ardr-table-count');
+ if(count)count.textContent='共 '+rows.length+' 个应收单位 · 金额按原币种统计';
+ if(!rows.length){tbody.innerHTML='
| 暂无匹配的应收款明细 |
';return;}
+ var body=rows.map(function(row,index){
+ var cells='
'+(index+1)+' | '+escapeReceivableReportText(row.receivableEntity)+' | '+escapeReceivableReportText(row.currency)+' | ';
+ cells+='
'+((row.month.direct===null)?'—':receivableReportCellAmount(row.month.direct))+' | '+((row.month.special===null)?'—':receivableReportCellAmount(row.month.special))+' | ';
+ cells+='
'+receivableReportCellAmount(row.receivableAmount)+' | '+receivableReportCellAmount(row.receivedAmount)+' | '+receivableReportCellAmount(row.deductionAmount)+' | '+receivableReportCellAmount(row.balanceAmount)+' | '+escapeReceivableReportText(row.customer||'—')+' | '+escapeReceivableReportText(row.remark||'—')+' | | ';
+ return '
'+cells+'
';
+ }).join('');
+ Object.keys(summary).sort().forEach(function(currencyKey){
+ var matching=rows.filter(function(row){return row.currency===currencyKey;});
+ if(!matching.length)return;
+ var monthTotal=matching.reduce(function(total,row){return {direct:total.direct+(row.month.direct||0),special:total.special+(row.month.special||0)};},{direct:0,special:0});
+ var total=summary[currencyKey],cells='
'+currencyKey+' 合计 | ';
+ cells+='
'+receivableReportCellAmount(monthTotal.direct)+' | '+receivableReportCellAmount(monthTotal.special)+' | ';
+ cells+='
'+receivableReportCellAmount(total.receivable)+' | '+receivableReportCellAmount(total.received)+' | '+receivableReportCellAmount(total.deduction)+' | '+receivableReportCellAmount(total.balance)+' | — | — | — | ';
+ body+='
'+cells+'
';
+ });
+ tbody.innerHTML=body;
+}
+function openReceivableReportEdit(index){
+ var record=receivableDetailReportData[index];
+ if(!record)return;
+ receivableReportEditingIndex=index;
+ var entity=document.getElementById('ardr-edit-entity');
+ var customer=document.getElementById('ardr-edit-customer');
+ var remark=document.getElementById('ardr-edit-remark');
+ if(entity)entity.value=record.receivableEntity||'';
+ if(customer)customer.value=record.customer||'';
+ if(remark)remark.value=record.remark||'';
+ showModal('modal-receivable-report-edit');
+ if(customer)setTimeout(function(){customer.focus();},0);
+}
+function saveReceivableReportEdit(){
+ var record=receivableDetailReportData[receivableReportEditingIndex];
+ var customer=document.getElementById('ardr-edit-customer');
+ var remark=document.getElementById('ardr-edit-remark');
+ var customerValue=customer?customer.value.trim():'';
+ var remarkValue=remark?remark.value.trim():'';
+ if(!customerValue){showToast('请输入客户','warning');if(customer)customer.focus();return;}
+ if(customerValue.length>50){showToast('客户最多输入 50 个字符','warning');if(customer)customer.focus();return;}
+ if(remarkValue.length>200){showToast('备注最多输入 200 个字符','warning');if(remark)remark.focus();return;}
+ if(!updateReceivableReportEditableFields(record,customerValue,remarkValue))return;
+ hideModal('modal-receivable-report-edit');
+ receivableReportEditingIndex=-1;
+ renderReceivableDetailReport();
+ showToast('应收款明细已更新','success');
+}
+function resetReceivableDetailReportFilters(){
+ var month=document.getElementById('ardr-month'),entity=document.getElementById('ardr-entity'),currency=document.getElementById('ardr-currency');
+ if(month)month.value='2026-07';
+ if(entity)entity.value='';
+ if(currency)currency.value='';
+ renderReceivableDetailReport();
+}
+function printReceivableDetailReport(){showToast('正在打开打印预览','info');}
+function exportReceivableDetailReport(){showToast('应收款统计表已导出','success');}
+
+var currentArapFormIndex=-1;
+var currentArapAuditIndex=-1;
+function setArapFormValue(id,value){var el=document.getElementById(id);if(el)el.value=value==null?'':value;}
+function getArapFormValue(id){var el=document.getElementById(id);return el?el.value.trim():'';}
+function openArapForm(index){
+ var hasIndex=typeof index==='number'&&index>=0;
+ if(hasIndex){
+ var record=arapData[index];
+ if(!record)return;
+ var state=getArapActionState(record.auditStatus);
+ if(!state.canEdit){showToast('审核通过的记录不可编辑','warning');return;}
+ currentArapFormIndex=index;
+ document.getElementById('arap-form-title').textContent='编辑客户应收应付';
+ [['arap-form-customer',record.customer],['arap-form-join-settle',record.joinSettle],['arap-form-type',record.arAp],['arap-form-wh-code',record.whCode],['arap-form-order-status',record.orderStatus],['arap-form-dispatch-no',record.dispatchNo],['arap-form-fee-type',record.feeType],['arap-form-amount',record.amount],['arap-form-container-no',record.containerNo],['arap-form-cabinet-no',record.cabinetNo]].forEach(function(pair){setArapFormValue(pair[0],pair[1]);});
+ }else{
+ currentArapFormIndex=-1;
+ document.getElementById('arap-form-title').textContent='新增客户应收应付';
+ ['arap-form-customer','arap-form-join-settle','arap-form-type','arap-form-wh-code','arap-form-order-status','arap-form-dispatch-no','arap-form-fee-type','arap-form-amount','arap-form-container-no','arap-form-cabinet-no'].forEach(function(id){setArapFormValue(id,'');});
+ }
+ setArapFormValue('arap-form-index',currentArapFormIndex);
+ showModal('modal-arap-form');
+}
+function saveArapForm(){
+ var required=[['arap-form-customer','客户公司名'],['arap-form-join-settle','参与结算'],['arap-form-type','应收/应付'],['arap-form-wh-code','入仓码'],['arap-form-order-status','订单状态'],['arap-form-fee-type','费用类型'],['arap-form-amount','金额']];
+ for(var i=0;i
=0){
+ var existing=arapData[currentArapFormIndex];
+ if(!existing||!getArapActionState(existing.auditStatus).canEdit){showToast('审核通过的记录不可编辑','warning');hideModal('modal-arap-form');return;}
+ Object.keys(values).forEach(function(key){existing[key]=values[key];});
+ existing.auditStatus=getArapStatusAfterSave('edit');
+ appendArapLog(existing,'编辑记录','待审核','修改后重新提交审核');
+ showToast('编辑成功,已提交审核','success');
+ }else{
+ var record=Object.assign({billNo:'',auditStatus:getArapStatusAfterSave('new'),logs:[]},values);
+ arapData.unshift(record);
+ appendArapLog(record,'新增记录','待审核','新增后提交审核');
+ currentArapDetailIndex=0;
+ showToast('新增成功,已提交审核','success');
+ }
+ hideModal('modal-arap-form');
+ renderArap();
+ if(currentArapDetailIndex>=0&&document.getElementById('page-customer-arap-detail').classList.contains('active'))renderArapDetail();
+}
+function openArapAudit(index){
+ var record=arapData[index];
+ if(!record)return;
+ var state=getArapActionState(record.auditStatus);
+ if(!state.canAudit){showToast('当前状态不可审核','warning');return;}
+ currentArapAuditIndex=index;
+ setArapFormValue('arap-audit-index',index);
+ document.getElementById('arap-audit-doc-no').textContent=arapDetailDocumentNo(index,record);
+ document.getElementById('arap-audit-customer').textContent=record.customer||'—';
+ document.getElementById('arap-audit-fee-type').textContent=record.feeType||'—';
+ document.getElementById('arap-audit-amount').textContent=record.amount||'—';
+ document.getElementById('arap-audit-status').textContent=record.auditStatus;
+ setArapFormValue('arap-audit-remark','');
+ setArapFormValue('arap-audit-reject-reason','');
+ showModal('modal-arap-audit');
+}
+function submitArapAudit(action){
+ var record=arapData[currentArapAuditIndex];
+ if(!record||!getArapActionState(record.auditStatus).canAudit){showToast('当前状态不可审核','warning');return;}
+ var rejectReason=getArapFormValue('arap-audit-reject-reason');
+ if(action==='reject'&&!rejectReason){showToast('驳回原因不能为空','error');return;}
+ var result=getArapAuditStatus(action);
+ record.auditStatus=result;
+ appendArapLog(record,action==='pass'?'财务审核':'财务驳回',result,action==='pass'?getArapFormValue('arap-audit-remark'):rejectReason);
+ hideModal('modal-arap-audit');
+ renderArap();
+ if(document.getElementById('page-customer-arap-detail').classList.contains('active'))renderArapDetail();
+ showToast(action==='pass'?'审核通过,记录已锁定':'审核已驳回,可编辑后重新提交',action==='pass'?'success':'warning');
}
var currentArapDetailIndex=-1;
@@ -10166,7 +12372,8 @@ function renderArapDetail(){
var d=arapData[currentArapDetailIndex];
if(!d)return;
var docNo=arapDetailDocumentNo(currentArapDetailIndex,d);
- var auditClass={'财务通过':'tag-green','客服提交':'tag-blue','新增':'tag-orange'}[d.auditStatus]||'tag-gray';
+ var actionState=getArapActionState(d.auditStatus);
+ var auditClass={'审核通过':'tag-green','待审核':'tag-orange','审核驳回':'tag-red'}[d.auditStatus]||'tag-gray';
document.getElementById('arap-detail-nav-no').textContent=docNo;
document.getElementById('arap-detail-title').textContent='费用单据详情 · '+docNo;
var auditBadge=document.getElementById('arap-detail-audit-badge');
@@ -10181,32 +12388,32 @@ function renderArapDetail(){
document.getElementById('arap-detail-join').textContent=d.joinSettle||'否';
document.getElementById('arap-detail-join').style.color=d.joinSettle==='是'?'#16a34a':'#ef4444';
document.getElementById('arap-detail-audit').textContent=d.auditStatus||'—';
- document.getElementById('arap-detail-audit').style.color=d.auditStatus==='财务通过'?'#16a34a':d.auditStatus==='客服提交'?'#1677ff':'#d97706';
- document.getElementById('arap-detail-audit-btn').style.display=d.auditStatus==='财务通过'?'none':'inline-flex';
+ document.getElementById('arap-detail-audit').style.color=d.auditStatus==='审核通过'?'#16a34a':d.auditStatus==='审核驳回'?'#dc2626':'#d97706';
+ document.getElementById('arap-detail-edit-btn').style.display=actionState.canEdit?'inline-flex':'none';
+ document.getElementById('arap-detail-audit-btn').style.display=actionState.canAudit?'inline-flex':'none';
- var basic=[['费用单号',docNo],['客户公司',d.customer],['应收/应付',d.arAp],['费用类型',d.feeType],['参与结算',d.joinSettle],['审核状态',d.auditStatus],['账单编号',d.billNo||'暂未生成'],['费用来源','业务系统自动生成']];
+ var basic=[['费用单号',docNo],['客户公司',d.customer],['应收/应付',d.arAp],['费用类型',d.feeType],['金额',d.amount],['参与结算',d.joinSettle],['审核状态',d.auditStatus],['账单编号',d.billNo||'暂未生成'],['费用来源','业务系统自动生成']];
document.getElementById('arap-detail-basic').innerHTML=basic.map(function(item){return ''+item[0]+''+item[1]+'
';}).join('');
- var steps=[{name:'费用已生成',done:true,desc:'业务单据触发费用生成'},{name:'客服已提交',done:d.auditStatus!=='新增',desc:d.auditStatus==='新增'?'等待客服确认':'费用信息已提交财务'},{name:'财务已审核',done:d.auditStatus==='财务通过',desc:d.auditStatus==='财务通过'?'审核通过,可参与对账':'等待财务审核'}];
+ var steps=[{name:'费用已生成',done:true,desc:'业务单据触发费用生成'},{name:'待财务审核',done:d.auditStatus!=='待审核',desc:d.auditStatus==='待审核'?'等待财务审核':'审核已处理'},{name:'财务审核结果',done:d.auditStatus!=='待审核',desc:d.auditStatus==='审核通过'?'审核通过,记录已锁定':d.auditStatus==='审核驳回'?'审核驳回,可编辑后重新提交':'等待审核结果'}];
document.getElementById('arap-detail-timeline').innerHTML=steps.map(function(step,i){return ''+(step.done?'✓':'·')+''+(i
':'')+''+step.name+''+step.desc+'
';}).join('');
document.getElementById('tbody-arap-detail-business').innerHTML='| '+(d.whCode||'—')+' | '+(d.orderStatus||'—')+' | '+(d.dispatchNo||'—')+' | '+(d.containerNo||'—')+' | '+(d.cabinetNo||'—')+' | '+(d.billNo||'暂未生成')+' |
';
- var baseDay=String(10+currentArapDetailIndex).padStart(2,'0');
- var logs=[{time:'2026-07-'+baseDay+' 09:20',node:'生成费用',operator:'系统',result:'成功',remark:'由业务单据自动生成'}];
- if(d.auditStatus!=='新增')logs.push({time:'2026-07-'+baseDay+' 10:05',node:'客服提交',operator:'客服专员',result:'已提交',remark:'费用信息核对完成'});
- if(d.auditStatus==='财务通过')logs.push({time:'2026-07-'+baseDay+' 14:30',node:'财务审核',operator:'财务专员',result:'审核通过',remark:'允许参与结算'});
- document.getElementById('tbody-arap-detail-log').innerHTML=logs.map(function(log){return '| '+log.time+' | '+log.node+' | '+log.operator+' | '+log.result+' | '+log.remark+' |
';}).join('');
+ var logs=Array.isArray(d.logs)?d.logs:[];
+ var resultClass={成功:'tag-green','待审核':'tag-orange','审核通过':'tag-green','审核驳回':'tag-red','已提交':'tag-blue'};
+ document.getElementById('tbody-arap-detail-log').innerHTML=logs.map(function(log){return '| '+log.time+' | '+log.node+' | '+log.operator+' | '+log.result+' | '+log.remark+' |
';}).join('')||'| 暂无操作记录 |
';
}
// ============ 客户对账单 ============
var customerReconStmtData=[
-{id:'Y2607095',status:'待审核',customer:'杭州恺予科技有限公司',startDate:'2026-07-21',endDate:'2026-08-20',period:7,currency:'CNY',rate:6.8,totalAr:86809.8,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-21 14:14:22',updater:'叶珊珊',updateDate:'2026-07-21 14:14:22'},
-{id:'Y2607093',status:'待审核',customer:'义乌市恒瑞网络科技有限公司',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:583.43,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:07:59',updater:'叶珊珊',updateDate:'2026-07-13 18:07:59'},
-{id:'Y2607091',status:'待审核',customer:'义乌市恒瑞电子商务商行',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:7049.7,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:07:17',updater:'叶珊珊',updateDate:'2026-07-13 18:07:17'},
-{id:'Y2607089',status:'待审核',customer:'义乌市飞骥电子商务有限公司',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:5743.4,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:06:06',updater:'叶珊珊',updateDate:'2026-07-13 18:06:06'},
-{id:'Y2607087',status:'待审核',customer:'上海驿道电子商务有限公司',startDate:'2026-07-08',endDate:'2026-08-07',period:7,currency:'CNY',rate:6.8,totalAr:488848.6,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-08 10:30:41',updater:'叶珊珊',updateDate:'2026-07-08 10:30:41'},
-{id:'Y2607085',status:'审核通过',customer:'深圳市前海环球物流有限公司',startDate:'2026-07-05',endDate:'2026-08-04',period:7,currency:'CNY',rate:6.8,totalAr:125600,paidAr:80000,lastPayTime:'2026-07-15 10:30:00',settled:'否',invoiceDate:'2026-07-10',remark:'',creator:'李明',createDate:'2026-07-05 09:15:22',updater:'李明',updateDate:'2026-07-15 11:20:33'},
-{id:'Y2607083',status:'审核拒绝',customer:'宁波海联进出口有限公司',startDate:'2026-07-01',endDate:'2026-07-31',period:7,currency:'CNY',rate:6.8,totalAr:45600,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'数据有误',creator:'王芳',createDate:'2026-07-01 16:42:10',updater:'王芳',updateDate:'2026-07-02 09:10:15'}
+{id:'Y2607095',status:'待审核',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'杭州恺予科技有限公司',startDate:'2026-07-21',endDate:'2026-08-20',period:7,currency:'CNY',rate:6.8,totalAr:86809.8,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-21 14:14:22',updater:'叶珊珊',updateDate:'2026-07-21 14:14:22'},
+{id:'Y2607093',status:'待审核',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'义乌市恒瑞网络科技有限公司',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:583.43,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:07:59',updater:'叶珊珊',updateDate:'2026-07-13 18:07:59'},
+{id:'Y2607091',status:'待审核',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'义乌市恒瑞电子商务商行',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:7049.7,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:07:17',updater:'叶珊珊',updateDate:'2026-07-13 18:07:17'},
+{id:'Y2607089',status:'待审核',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'义乌市飞骥电子商务有限公司',startDate:'2026-07-13',endDate:'2026-08-12',period:7,currency:'CNY',rate:6.8,totalAr:5743.4,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-13 18:06:06',updater:'叶珊珊',updateDate:'2026-07-13 18:06:06'},
+{id:'Y2607087',status:'待审核',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'上海驿道电子商务有限公司',startDate:'2026-07-08',endDate:'2026-08-07',period:7,currency:'CNY',rate:6.8,totalAr:488848.6,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'',creator:'叶珊珊',createDate:'2026-07-08 10:30:41',updater:'叶珊珊',updateDate:'2026-07-08 10:30:41'},
+{id:'Y2607085',status:'审核通过',customerConfirmStatus:'待确认',pushTime:'2026-08-14 10:20:00',confirmTime:'',settlementId:'',customer:'深圳市前海环球物流有限公司',startDate:'2026-07-05',endDate:'2026-08-04',period:7,currency:'CNY',rate:6.8,totalAr:125600,paidAr:80000,lastPayTime:'2026-07-15 10:30:00',settled:'否',invoiceDate:'2026-07-10',remark:'',creator:'李明',createDate:'2026-07-05 09:15:22',updater:'李明',updateDate:'2026-07-15 11:20:33'},
+{id:'Y2607084',status:'审核通过',customerConfirmStatus:'已确认',pushTime:'2026-08-13 14:10:00',confirmTime:'2026-08-14 09:35:00',settlementId:'',customer:'浙江柏悦贸易有限公司',startDate:'2026-07-01',endDate:'2026-07-31',period:30,currency:'CNY',rate:6.8,totalAr:98000,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'客户已确认',creator:'叶珊珊',createDate:'2026-08-13 13:42:00',updater:'叶珊珊',updateDate:'2026-08-14 09:35:00'},
+{id:'Y2607083',status:'审核拒绝',customerConfirmStatus:'未推送',pushTime:'',confirmTime:'',settlementId:'',customer:'宁波海联进出口有限公司',startDate:'2026-07-01',endDate:'2026-07-31',period:7,currency:'CNY',rate:6.8,totalAr:45600,paidAr:0,lastPayTime:'',settled:'否',invoiceDate:'',remark:'数据有误',creator:'王芳',createDate:'2026-07-01 16:42:10',updater:'王芳',updateDate:'2026-07-02 09:10:15'}
];
var reconStmtDetailData={
@@ -10245,10 +12452,104 @@ var reconStmtPayData={
var reconStmtSelectedId='';
+function getReconStmtActionState(record){
+ var hasSettlement=!!(record&&record.settlementId);
+ return {
+ canPush:!!record&&record.status==='审核通过'&&record.customerConfirmStatus!=='已确认',
+ canSettle:!!record&&record.customerConfirmStatus==='已确认'&&!hasSettlement,
+ hasSettlement:hasSettlement
+ };
+}
+
+function markReconStmtPushed(record,time){
+ if(!getReconStmtActionState(record).canPush)return false;
+ record.customerConfirmStatus='待确认';
+ record.pushTime=time;
+ record.updateDate=time;
+ record.updater='财务专员';
+ return true;
+}
+
+function buildSettlementFromReconStmt(record,settlementId,date){
+ if(!getReconStmtActionState(record).canSettle)return null;
+ var received=Number(record.paidAr||0);
+ var total=Number(record.totalAr||0);
+ return {
+ id:settlementId,
+ customer:record.customer,
+ feeType:'客户对账',
+ currency:record.currency,
+ arAmount:total,
+ received:received,
+ balance:Math.max(0,total-received),
+ billNo:record.id,
+ period:record.startDate+' ~ '+record.endDate,
+ genDate:date,
+ dueDate:record.endDate,
+ payStatus:received>0?'部分收款':'待收款',
+ approveStatus:'草稿',
+ creator:'财务专员',
+ reviewer:'',
+ status:'草稿'
+ };
+}
+
+function reconStmtNowText(){
+ return new Date().toLocaleString('zh-CN',{hour12:false}).replace(/\//g,'-');
+}
+
+function nextReconSettlementId(){
+ var stamp=new Date().toISOString().slice(0,10).replace(/-/g,'');
+ var sequence=String(settlementArData.length+1).padStart(3,'0');
+ return 'SAR-'+stamp+'-'+sequence;
+}
+
+function pushReconStmtToCustomer(id){
+ var record=customerReconStmtData.find(function(item){return item.id===id;});
+ if(!record){showToast('未找到对账单','error');return;}
+ if(!markReconStmtPushed(record,reconStmtNowText())){
+ showToast(record.status!=='审核通过'?'审核通过后才可推送':'客户已确认,无需再次推送','warning');
+ return;
+ }
+ renderCustomerReconStmt();
+ showToast('对账单已推送给客户,等待客户确认','success');
+}
+
+function createSettlementFromReconStmt(id){
+ var record=customerReconStmtData.find(function(item){return item.id===id;});
+ if(!record){showToast('未找到对账单','error');return;}
+ if(record.settlementId){
+ showToast('该对账单已生成结算单 '+record.settlementId,'info');
+ switchPage('settlement-ar');
+ renderSettlementAr();
+ return;
+ }
+ if(!getReconStmtActionState(record).canSettle){
+ showToast('客户确认后才可结算','warning');
+ return;
+ }
+ var date=new Date().toISOString().slice(0,10);
+ var settlement=buildSettlementFromReconStmt(record,nextReconSettlementId(),date);
+ if(!settlement){showToast('客户确认后才可结算','warning');return;}
+ settlementArData.unshift(settlement);
+ record.settlementId=settlement.id;
+ record.updateDate=reconStmtNowText();
+ record.updater='财务专员';
+ renderCustomerReconStmt();
+ switchPage('settlement-ar');
+ renderSettlementAr();
+ showToast('结算单已生成:'+settlement.id,'success');
+}
+
function renderCustomerReconStmt(){
var tb=document.getElementById('tbody-customer-recon-stmt');
if(!tb)return;
var statusMap={'待审核':'color:#faad14;background:#fffbe6;border:1px solid #ffe58f;padding:1px 6px;border-radius:4px;font-size:11px','审核通过':'color:#52c41a;background:#f6ffed;border:1px solid #b7eb8f;padding:1px 6px;border-radius:4px;font-size:11px','审核拒绝':'color:#f5222d;background:#fff2f0;border:1px solid #ffccc7;padding:1px 6px;border-radius:4px;font-size:11px','待确认':'color:#1890ff;background:#e6f7ff;border:1px solid #91d5ff;padding:1px 6px;border-radius:4px;font-size:11px'};
+var confirmMap={
+'未推送':'color:#64748b;background:#f1f5f9;border:1px solid #cbd5e1;padding:1px 6px;border-radius:4px;font-size:11px',
+'待确认':'color:#d97706;background:#fffbeb;border:1px solid #fde68a;padding:1px 6px;border-radius:4px;font-size:11px',
+'已确认':'color:#16a34a;background:#f0fdf4;border:1px solid #bbf7d0;padding:1px 6px;border-radius:4px;font-size:11px'
+};
var qStatus=document.getElementById('rsq-status').value;
var qBillno=(document.getElementById('rsq-billno').value||'').trim().toLowerCase();
var qCustomer=(document.getElementById('rsq-customer').value||'').trim().toLowerCase();
@@ -10260,15 +12561,28 @@ if(qCustomer && !d.customer.toLowerCase().includes(qCustomer))return;
count++;
var checked=reconStmtSelectedId===d.id?' checked':'';
var unpaid=d.totalAr-d.paidAr;
+var actionState=getReconStmtActionState(d);
+var actions=''+
+''+
+'';
+if(d.status==='待审核'){
+actions+=''+
+'';
+}
+if(d.status==='审核通过'&&d.customerConfirmStatus!=='已确认'){
+actions+='';
+}
+if(actionState.hasSettlement){
+actions+='';
+}else{
+actions+='';
+}
rows+=''+
-'| '+
-''+
-'导出账单明细'+
-'删除'+
-'审核通过'+
-'审核拒绝'+
-' | '+
+''+actions+' | '+
''+d.status+' | '+
+''+d.customerConfirmStatus+' | '+
''+d.id+' | '+
''+d.customer+' | '+
''+d.startDate+' | '+
@@ -10288,7 +12602,7 @@ rows+='
'+
'| '+d.updateDate+' | '+
'
';
});
-tb.innerHTML=rows||'| 暂无匹配数据 |
';
+tb.innerHTML=rows||'| 暂无匹配数据 |
';
document.getElementById('recon-stmt-pagination').innerHTML='共 '+count+' 条...5条/页跳至页';
renderReconStmtDetail();
renderReconStmtPay();
@@ -10433,14 +12747,16 @@ function renderSettlementAr(){
if(cur!=='全部币种'&&d.currency!==cur)return null;
if(no&&!d.id.toLowerCase().includes(no)&&!d.billNo.toLowerCase().includes(no))return null;
totalAr+=d.arAmount;totalRec+=d.received;totalBal+=d.balance;
+ var voucherCount=Array.isArray(d.paymentVouchers)?d.paymentVouchers.length:0;
+ var voucherText='上传付款凭证'+(voucherCount?'('+voucherCount+')':'');
return ''+
' | '+
'详情 '+
+ ' '+
(d.balance>0&&d.status==='生效'?'':'')+' | '+
''+d.id+' | '+
''+d.customer+' | '+
- ''+d.feeType+' | '+
- ''+d.currency+' | '+
+ ''+d.currency+' | '+
''+(d.currency==='USD'?'$':'¥')+d.arAmount.toLocaleString()+' | '+
''+(d.currency==='USD'?'$':'¥')+d.received.toLocaleString()+' | '+
''+(d.currency==='USD'?'$':'¥')+d.balance.toLocaleString()+' | '+
@@ -10455,7 +12771,7 @@ function renderSettlementAr(){
''+d.status+' | '+
'
';
}).filter(Boolean);
- tb.innerHTML=rows.length?rows.join(''):'| 暂无匹配数据 |
';
+ tb.innerHTML=rows.length?rows.join(''):'| 暂无匹配数据 |
';
document.getElementById('sar-total').textContent='¥'+totalAr.toLocaleString();
document.getElementById('sar-received').textContent='¥'+totalRec.toLocaleString();
document.getElementById('sar-pending').textContent='¥'+totalBal.toLocaleString();
@@ -10479,29 +12795,35 @@ var settlementApData=[
function renderSettleAp(){
var tb=document.getElementById('tbody-settle-ap');
if(!tb)return;
- var status=document.getElementById('sap-status')?document.getElementById('sap-status').value:'全部状态';
+ var status=document.getElementById('sap-status')?document.getElementById('sap-status').value:'全部付款状态';
var supplier=document.getElementById('sap-supplier')?document.getElementById('sap-supplier').value:'全部供应商';
var currency=document.getElementById('sap-currency')?document.getElementById('sap-currency').value:'全部币种';
var no=(document.getElementById('sap-no')?document.getElementById('sap-no').value:'').trim().toLowerCase();
var payCls={'已结清':'tag-green','部分付款':'tag-orange','待付款':'tag-red'};
- var approveCls={'已审批':'tag-green','审批中':'tag-orange','草稿':'tag-gray'};
+ var approveCls={'已审批':'tag-green','审批中':'tag-orange','已驳回':'tag-red','草稿':'tag-gray'};
var statusCls={'生效':'tag-green','待审批':'tag-orange','草稿':'tag-gray'};
var total=0,paid=0,balance=0,profit=0;
var rows=settlementApData.map(function(d){
- if(status!=='全部状态'&&d.payStatus!==status)return null;
+ if(status!=='全部付款状态'&&d.payStatus!==status)return null;
if(supplier!=='全部供应商'&&d.supplier!==supplier)return null;
if(currency!=='全部币种'&&d.currency!==currency)return null;
if(no&&!d.id.toLowerCase().includes(no)&&!d.billNo.toLowerCase().includes(no))return null;
total+=d.apAmount;paid+=d.paid;balance+=d.balance;profit+=d.profitAmount||0;
var symbol=d.currency==='USD'?'$':'¥';
+ var voucherCount=Array.isArray(d.paymentVouchers)?d.paymentVouchers.length:0;
+ var voucherText='上传付款凭证'+(voucherCount?'('+voucherCount+')':'');
+ var actionHtml='详情 '+
+ ' '+
+ ' '+
+ (d.balance>0&&d.status==='生效'?'':'');
return ''+
- ' | 详情 '+(d.balance>0&&d.status==='生效'?'':'')+' | '+d.id+' | '+d.supplier+' | '+d.feeType+' | '+d.currency+' | '+
+ ' | '+actionHtml+' | '+d.id+' | '+d.supplier+' | '+d.currency+' | '+
''+symbol+d.apAmount.toLocaleString()+' | '+symbol+d.paid.toLocaleString()+' | '+symbol+d.balance.toLocaleString()+' | '+
''+d.billNo+' | '+d.period+' | '+d.genDate+' | '+d.dueDate+' | '+
''+d.payStatus+' | '+d.approveStatus+' | '+
''+d.hasProfit+' | '+symbol+(d.profitAmount||0).toLocaleString()+' | '+d.creator+' | '+(d.reviewer||'-')+' | '+d.status+' |
';
}).filter(Boolean);
- tb.innerHTML=rows.length?rows.join(''):'| 暂无匹配数据 |
';
+ tb.innerHTML=rows.length?rows.join(''):'| 暂无匹配数据 |
';
document.getElementById('sap-total').textContent='¥'+total.toLocaleString();
document.getElementById('sap-paid').textContent='¥'+paid.toLocaleString();
document.getElementById('sap-pending').textContent='¥'+balance.toLocaleString();
@@ -10516,6 +12838,187 @@ function resetSettlementAp(){
renderSettleAp();
}
+var currentSettlementVoucher=null;
+var settlementApVoucherDraft=[];
+var settlementApVoucherOriginalCount=0;
+var currentSettlementApApprovalId='';
+
+function getSettlementApApprovalActionState(status){
+ var readonly=status==='已审批';
+ return {canSubmit:!readonly,readonly:readonly};
+}
+
+function getSettlementApApprovalResult(action){
+ return action==='pass'?{approveStatus:'已审批',status:'生效'}:{approveStatus:'已驳回',status:'待审批'};
+}
+
+function formatSettlementApVoucherSize(size){
+ var bytes=Number(size||0);
+ if(bytes<1024)return bytes+' B';
+ if(bytes<1024*1024)return (bytes/1024).toFixed(1)+' KB';
+ return (bytes/1024/1024).toFixed(1)+' MB';
+}
+
+function escapeSettlementApHtml(value){
+ return String(value==null?'':value).replace(/[&<>"']/g,function(char){return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[char];});
+}
+
+function validateSettlementApVoucherFile(file,existing){
+ var allowedExtensions=['pdf','jpg','jpeg','png'];
+ var allowedTypes=['application/pdf','image/jpeg','image/png'];
+ var name=String(file&&file.name||'').trim();
+ var extension=(name.split('.').pop()||'').toLowerCase();
+ if(allowedExtensions.indexOf(extension)<0||(file.type&&allowedTypes.indexOf(file.type)<0))return name+' 格式不支持,仅支持 PDF、JPG、JPEG、PNG';
+ if(Number(file.size||0)>10 * 1024 * 1024)return name+' 超过 10MB,无法添加';
+ if((existing||[]).some(function(item){return String(item.name||'').toLowerCase()===name.toLowerCase();}))return name+' 已存在,请勿重复上传';
+ return '';
+}
+
+function createSettlementApVoucherEntry(file,uploadedAt){
+ var extension=(String(file.name||'').split('.').pop()||'').toLowerCase();
+ return {name:file.name,size:Number(file.size||0),type:file.type||extension.toUpperCase(),uploadedAt:uploadedAt,uploader:'王建国'};
+}
+
+function getSettlementVoucherPartyLabel(type){
+ return type==='ar'?'客户公司':'供应商';
+}
+
+function settlementVoucherRecord(){
+ if(!currentSettlementVoucher)return null;
+ var list=currentSettlementVoucher.type==='ar'?settlementArData:settlementApData;
+ return list.find(function(item){return item.id===currentSettlementVoucher.id;})||null;
+}
+
+function openSettlementVoucher(type,id){
+ currentSettlementVoucher={type:type,id:id};
+ var record=settlementVoucherRecord();
+ if(!record)return;
+ settlementApVoucherDraft=(record.paymentVouchers||[]).map(function(file){return Object.assign({},file);});
+ settlementApVoucherOriginalCount=settlementApVoucherDraft.length;
+ document.getElementById('settlement-ap-voucher-no').textContent=record.id;
+ document.getElementById('settlement-voucher-party-label').textContent=getSettlementVoucherPartyLabel(type);
+ document.getElementById('settlement-ap-voucher-supplier').textContent=type==='ar'?record.customer:record.supplier;
+ document.getElementById('settlement-ap-voucher-files').value='';
+ renderSettlementApVoucherList();
+ showModal('modal-settlement-ap-voucher');
+}
+
+function openSettlementArVoucher(id){
+ openSettlementVoucher('ar',id);
+}
+
+function openSettlementApVoucher(id){
+ openSettlementVoucher('ap',id);
+}
+
+function handleSettlementApVoucherFiles(files){
+ Array.prototype.forEach.call(files||[],function(file){
+ var error=validateSettlementApVoucherFile(file,settlementApVoucherDraft);
+ if(error){
+ showToast(error,'error');
+ return;
+ }
+ settlementApVoucherDraft.push(createSettlementApVoucherEntry(file,new Date().toLocaleString('zh-CN',{hour12:false})));
+ });
+ var input=document.getElementById('settlement-ap-voucher-files');
+ if(input)input.value='';
+ renderSettlementApVoucherList();
+}
+
+function renderSettlementApVoucherList(){
+ var list=document.getElementById('settlement-ap-voucher-list');
+ if(!list)return;
+ var count=document.getElementById('settlement-voucher-count');
+ if(count)count.textContent=settlementApVoucherDraft.length;
+ if(!settlementApVoucherDraft.length){
+ list.innerHTML='暂未上传付款凭证
';
+ return;
+ }
+ list.innerHTML=settlementApVoucherDraft.map(function(file,index){
+ return ''+escapeSettlementApHtml(file.name)+'
'+formatSettlementApVoucherSize(file.size)+' · '+escapeSettlementApHtml(file.type||'未知类型')+' · '+escapeSettlementApHtml(file.uploadedAt||'')+' · '+escapeSettlementApHtml(file.uploader||'')+'
';
+ }).join('');
+}
+
+function removeSettlementApVoucher(index){
+ settlementApVoucherDraft.splice(index,1);
+ renderSettlementApVoucherList();
+}
+
+function saveSettlementApVouchers(){
+ var record=settlementVoucherRecord();
+ if(!record)return;
+ if(!settlementApVoucherDraft.length&&!settlementApVoucherOriginalCount){
+ showToast('请先选择付款凭证','error');
+ return;
+ }
+ record.paymentVouchers=settlementApVoucherDraft.map(function(file){return Object.assign({},file);});
+ var isAr=currentSettlementVoucher.type==='ar';
+ closeSettlementApVoucher();
+ if(isAr)renderSettlementAr();else renderSettleAp();
+ if(document.getElementById('page-settlement-detail').classList.contains('active'))renderSettlementDetail();
+ showToast('付款凭证保存成功','success');
+}
+
+function closeSettlementApVoucher(){
+ hideModal('modal-settlement-ap-voucher');
+ currentSettlementVoucher=null;
+ settlementApVoucherDraft=[];
+ settlementApVoucherOriginalCount=0;
+}
+
+function openSettlementApApproval(id){
+ currentSettlementApApprovalId=id;
+ var record=settlementApData.find(function(item){return item.id===id;});
+ if(!record)return;
+ var symbol=record.currency==='USD'?'$':'¥';
+ var actionState=getSettlementApApprovalActionState(record.approveStatus);
+ document.getElementById('settlement-ap-approval-no').textContent=record.id;
+ document.getElementById('settlement-ap-approval-supplier').textContent=record.supplier;
+ document.getElementById('settlement-ap-approval-amount').textContent=symbol+record.apAmount.toLocaleString();
+ document.getElementById('settlement-ap-approval-pay-status').textContent=record.payStatus;
+ document.getElementById('settlement-ap-approval-status').textContent=record.approveStatus;
+ document.getElementById('settlement-ap-approval-remark').value=record.reviewRemark||'';
+ document.getElementById('settlement-ap-approval-reject-reason').value=record.rejectReason||'';
+ document.getElementById('settlement-ap-approval-remark').disabled=actionState.readonly;
+ document.getElementById('settlement-ap-approval-reject-reason').disabled=actionState.readonly;
+ var readonlyTip=document.getElementById('settlement-ap-approval-readonly');
+ readonlyTip.style.display=actionState.readonly?'block':'none';
+ readonlyTip.textContent=actionState.readonly?'该结算单已由 '+(record.reviewer||'审核人')+' 于 '+(record.reviewTime||'—')+' 审批通过,仅可查看审批结果。':'';
+ document.getElementById('settlement-ap-approval-actions').style.display=actionState.canSubmit?'inline-flex':'none';
+ showModal('modal-settlement-ap-approval');
+}
+
+function submitSettlementApApproval(action){
+ var record=settlementApData.find(function(item){return item.id===currentSettlementApApprovalId;});
+ if(!record)return;
+ var actionState=getSettlementApApprovalActionState(record.approveStatus);
+ if(!actionState.canSubmit){
+ showToast('该结算单已审批通过','info');
+ return;
+ }
+ var rejectReason=document.getElementById('settlement-ap-approval-reject-reason').value.trim();
+ if(action==='reject'&&!rejectReason){
+ showToast('驳回原因不能为空','error');
+ return;
+ }
+ var result=getSettlementApApprovalResult(action);
+ record.approveStatus=result.approveStatus;
+ record.status=result.status;
+ record.reviewer='王建国';
+ record.reviewTime=new Date().toLocaleString('zh-CN',{hour12:false});
+ record.reviewRemark=document.getElementById('settlement-ap-approval-remark').value.trim();
+ record.rejectReason=action==='reject'?rejectReason:'';
+ closeSettlementApApproval();
+ renderSettleAp();
+ if(document.getElementById('page-settlement-detail').classList.contains('active'))renderSettlementDetail();
+ showToast(action==='pass'?'审批通过':'已驳回,可重新审批','success');
+}
+
+function closeSettlementApApproval(){
+ hideModal('modal-settlement-ap-approval');
+ currentSettlementApApprovalId='';
+}
+
var currentSettlementDetail=null;
function settlementDetailRecord(){
@@ -10580,7 +13083,14 @@ function renderSettlementDetail(){
];
document.getElementById('settlement-detail-info').innerHTML=info.map(function(item){return ''+item[0]+''+item[1]+'
';}).join('');
var approved=record.approveStatus==='已审批';
- document.getElementById('settlement-detail-approval').innerHTML='✓结算单已创建'+record.creator+' · '+record.genDate+'
'+(approved?'✓':'…')+''+record.approveStatus+''+(record.reviewer||'等待审核人处理')+'
';
+ var rejected=record.approveStatus==='已驳回';
+ var approvalBg=approved?'#dcfce7':rejected?'#fef2f2':'#fef3c7';
+ var approvalColor=approved?'#16a34a':rejected?'#dc2626':'#d97706';
+ var approvalIcon=approved?'✓':rejected?'!':'…';
+ var approvalMeta=record.reviewer||'等待审核人处理';
+ if(record.reviewTime)approvalMeta+=' · '+record.reviewTime;
+ var rejectReason=rejected&&record.rejectReason?'驳回原因:'+escapeSettlementApHtml(record.rejectReason)+'
':'';
+ document.getElementById('settlement-detail-approval').innerHTML='✓结算单已创建'+record.creator+' · '+record.genDate+'
'+approvalIcon+''+record.approveStatus+''+approvalMeta+'
'+rejectReason+'
';
document.getElementById('settlement-detail-fee-done-label').textContent='已'+action+'金额';
document.getElementById('settlement-detail-fee-summary').textContent='共 1 项费用';
@@ -10917,6 +13427,262 @@ function saveSupplier(){
document.addEventListener('DOMContentLoaded',renderSupplier);
renderSupplier();
+// ===== 派送车队报价表 =====
+var deliveryFleetQuoteData=[
+ {id:'DFQ001',origin:'洛杉矶, CA',warehouse:'LAX9',miles:42,fleet:'SMART',selfPickup:155,fullDelivery:175,looseDelivery:115,status:'启用',updatedAt:'2026-08-14 10:20',remark:'工作日预约'},
+ {id:'DFQ002',origin:'洛杉矶, CA',warehouse:'ONT8',miles:68,fleet:'捷诚',selfPickup:180,fullDelivery:220,looseDelivery:140,status:'启用',updatedAt:'2026-08-13 16:45',remark:'可承接整车与散板'},
+ {id:'DFQ003',origin:'芝加哥, IL',warehouse:'MDW2',miles:37,fleet:'纽酷',selfPickup:170,fullDelivery:200,looseDelivery:140,status:'启用',updatedAt:'2026-08-12 09:30',remark:'需提前一天预约'},
+ {id:'DFQ004',origin:'芝加哥, IL',warehouse:'ORD2',miles:28,fleet:'隆盛',selfPickup:180,fullDelivery:230,looseDelivery:150,status:'启用',updatedAt:'2026-08-11 14:10',remark:''},
+ {id:'DFQ005',origin:'芝加哥, IL',warehouse:'IGQ2',miles:41,fleet:'RIGLL',selfPickup:null,fullDelivery:230,looseDelivery:140,status:'停用',updatedAt:'2026-08-09 11:00',remark:'渠道价格待更新'},
+ {id:'DFQ006',origin:'印第安纳波利斯, IN',warehouse:'IND9',miles:52,fleet:'SMART',selfPickup:160,fullDelivery:190,looseDelivery:110,status:'启用',updatedAt:'2026-08-08 15:25',remark:'夜间预约另计'},
+ {id:'DFQ007',origin:'达拉斯, TX',warehouse:'FTW1',miles:35,fleet:'Habr',selfPickup:150,fullDelivery:185,looseDelivery:125,status:'启用',updatedAt:'2026-08-07 13:40',remark:''},
+ {id:'DFQ008',origin:'纽约, NY',warehouse:'EWR9',miles:31,fleet:'蓝鲸',selfPickup:175,fullDelivery:215,looseDelivery:135,status:'启用',updatedAt:'2026-08-06 17:15',remark:'周末不派送'}
+];
+var deliveryFleetQuoteSeq=9;
+var deliveryFleetQuoteImportRows=[];
+
+function deliveryFleetQuoteNow(){
+ var date=new Date();
+ var pad=function(value){return String(value).padStart(2,'0');};
+ return date.getFullYear()+'-'+pad(date.getMonth()+1)+'-'+pad(date.getDate())+' '+pad(date.getHours())+':'+pad(date.getMinutes());
+}
+function deliveryFleetQuoteHasPrice(value){return value!==null&&value!==undefined&&value!=='';}
+function escapeDeliveryFleetQuoteHtml(value){
+ return String(value==null?'':value).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/\u0027/g,''');
+}
+function filterDeliveryFleetQuoteRows(records,filters){
+ filters=filters||{};
+ var origin=String(filters.origin||'').trim().toLowerCase();
+ var warehouse=String(filters.warehouse||'').trim().toLowerCase();
+ var fleet=String(filters.fleet||'').trim().toLowerCase();
+ var keyword=String(filters.keyword||'').trim().toLowerCase();
+ return records.filter(function(record){
+ var recordOrigin=String(record.origin||'').toLowerCase();
+ var recordWarehouse=String(record.warehouse||'').toLowerCase();
+ var recordFleet=String(record.fleet||'').toLowerCase();
+ if(origin&&recordOrigin.indexOf(origin)===-1)return false;
+ if(warehouse&&recordWarehouse.indexOf(warehouse)===-1)return false;
+ if(fleet&&recordFleet.indexOf(fleet)===-1)return false;
+ if(keyword&&(recordOrigin+' '+recordWarehouse+' '+recordFleet).indexOf(keyword)===-1)return false;
+ if(filters.method&&!deliveryFleetQuoteHasPrice(record[filters.method]))return false;
+ if(filters.status&&record.status!==filters.status)return false;
+ return true;
+ });
+}
+function validateDeliveryFleetQuoteDraft(data){
+ if(!String(data.origin||'').trim())return '请输入发货城市';
+ if(!String(data.warehouse||'').trim())return '请输入目的 FBA 仓点';
+ if(!String(data.fleet||'').trim())return '请输入车队渠道';
+ if(data.miles===null||!Number.isFinite(Number(data.miles))||Number(data.miles)<0)return '请输入有效的非负迈数';
+ var prices=[data.selfPickup,data.fullDelivery,data.looseDelivery];
+ if(prices.some(function(value){return deliveryFleetQuoteHasPrice(value)&&(!Number.isFinite(Number(value))||Number(value)<0);})){return '报价只能填写非负数字';}
+ if(!prices.some(deliveryFleetQuoteHasPrice))return '请至少填写一种提货方式报价';
+ return '';
+}
+function deliveryFleetQuoteKey(record){
+ var origin=String(record.origin==null?'':record.origin).trim().toLowerCase().replace(/\s*,\s*[a-z]{2}$/i,'');
+ return [origin,record.warehouse,Number(record.miles),record.fleet].map(function(value){return String(value==null?'':value).trim().toLowerCase();}).join('|');
+}
+function hasDuplicateDeliveryFleetQuote(records,draft,excludeId){
+ var key=deliveryFleetQuoteKey(draft);
+ return records.some(function(record){return record.id!==excludeId&&deliveryFleetQuoteKey(record)===key;});
+}
+function splitDeliveryFleetQuoteCsvLine(line){
+ var cells=[],value='',quoted=false;
+ for(var index=0;index=0?String(cells[index]||'').trim():'';};
+ var numberValue=function(key,emptyValue){var raw=read(key);if(raw==='')return emptyValue;var value=Number(raw);return Number.isFinite(value)?value:NaN;};
+ var data={origin:read('origin'),warehouse:read('warehouse').toUpperCase(),miles:numberValue('miles',null),fleet:read('fleet'),selfPickup:numberValue('selfPickup',null),fullDelivery:numberValue('fullDelivery',null),looseDelivery:numberValue('looseDelivery',null),status:read('status'),remark:read('remark')};
+ var errors=[];
+ var validationMessage=validateDeliveryFleetQuoteDraft(data);
+ if(validationMessage)errors.push(validationMessage);
+ if(data.status!=='启用'&&data.status!=='停用')errors.push('状态仅支持启用或停用');
+ if(!errors.length&&hasDuplicateDeliveryFleetQuote(knownRecords,data,''))errors.push('相同维度组合重复');
+ if(!errors.length)knownRecords.push(data);
+ return {row:rowIndex+2,data:data,valid:errors.length===0,error:errors.join(';')};
+ });
+}
+function formatDeliveryFleetQuotePrice(value){
+ return deliveryFleetQuoteHasPrice(value)?'$'+Number(value).toFixed(2):'—';
+}
+function renderDeliveryFleetQuotes(){
+ var tbody=document.getElementById('tbody-delivery-fleet-quote');
+ if(!tbody)return;
+ var rows=filterDeliveryFleetQuoteRows(deliveryFleetQuoteData,{
+ origin:document.getElementById('dfq-search-origin').value,
+ warehouse:document.getElementById('dfq-search-warehouse').value,
+ fleet:document.getElementById('dfq-search-fleet').value,
+ keyword:document.getElementById('dfq-search-keyword').value,
+ method:document.getElementById('dfq-search-method').value,
+ status:document.getElementById('dfq-search-status').value
+ });
+ tbody.innerHTML=rows.map(function(record){
+ return ''
+ +' | '
+ +''+escapeDeliveryFleetQuoteHtml(record.origin)+' | '
+ +''+escapeDeliveryFleetQuoteHtml(record.warehouse)+' | '
+ +''+Number(record.miles).toLocaleString()+' mi | '
+ +''+escapeDeliveryFleetQuoteHtml(record.fleet)+' | '
+ +''+formatDeliveryFleetQuotePrice(record.selfPickup)+' | '
+ +''+formatDeliveryFleetQuotePrice(record.fullDelivery)+' | '
+ +''+formatDeliveryFleetQuotePrice(record.looseDelivery)+' | '
+ +''+escapeDeliveryFleetQuoteHtml(record.status)+' | '
+ +''+escapeDeliveryFleetQuoteHtml(record.updatedAt)+' | '
+ +''+escapeDeliveryFleetQuoteHtml(record.remark||'—')+' | '
+ +'
';
+ }).join('')||'| 暂无符合条件的派送车队报价 |
';
+ document.getElementById('dfq-total').textContent='共 '+rows.length+' 条';
+}
+function resetDeliveryFleetQuoteSearch(){
+ ['dfq-search-origin','dfq-search-warehouse','dfq-search-fleet','dfq-search-keyword','dfq-search-method','dfq-search-status'].forEach(function(id){var element=document.getElementById(id);if(element)element.value='';});
+ renderDeliveryFleetQuotes();
+ showToast('筛选条件已重置','info');
+}
+function renderDeliveryFleetQuoteImportPreview(){
+ var tbody=document.getElementById('tbody-dfq-import-preview');
+ var summary=document.getElementById('dfq-import-summary');
+ var confirmButton=document.getElementById('dfq-import-confirm');
+ if(!tbody||!summary||!confirmButton)return;
+ var validCount=deliveryFleetQuoteImportRows.filter(function(item){return item.valid;}).length;
+ var invalidCount=deliveryFleetQuoteImportRows.length-validCount;
+ summary.innerHTML=deliveryFleetQuoteImportRows.length?'共读取 '+deliveryFleetQuoteImportRows.length+' 条,可导入 '+validCount+' 条,失败 '+invalidCount+' 条':'尚未选择文件';
+ tbody.innerHTML=deliveryFleetQuoteImportRows.slice(0,10).map(function(item){
+ var data=item.data;
+ var values=[data.origin,data.warehouse,deliveryFleetQuoteHasPrice(data.miles)?data.miles:'—',data.fleet,deliveryFleetQuoteHasPrice(data.selfPickup)?data.selfPickup:'—',deliveryFleetQuoteHasPrice(data.fullDelivery)?data.fullDelivery:'—',deliveryFleetQuoteHasPrice(data.looseDelivery)?data.looseDelivery:'—',data.status||'—',data.remark||'—'];
+ return '| '+(item.valid?'通过':escapeDeliveryFleetQuoteHtml(item.error))+' | '+values.map(function(value){return ''+escapeDeliveryFleetQuoteHtml(value)+' | ';}).join('')+'
';
+ }).join('')||'| 文件中没有可读取的数据 |
';
+ confirmButton.disabled=validCount===0;
+}
+function openDeliveryFleetQuoteImport(){
+ deliveryFleetQuoteImportRows=[];
+ var file=document.getElementById('dfq-import-file');
+ if(file)file.value='';
+ renderDeliveryFleetQuoteImportPreview();
+ document.getElementById('tbody-dfq-import-preview').innerHTML='| 选择文件后显示前 10 条数据 |
';
+ showModal('modal-delivery-fleet-quote-import');
+}
+function downloadDeliveryFleetQuoteImportTemplate(){
+ var headers=['发货城市','目的FBA仓点','迈数','车队渠道','整车自提','整车派送','散板派送','状态','备注'];
+ var sample=['洛杉矶, CA','LAX9','42','SMART','155','175','115','启用','工作日预约'];
+ var csv='\ufeff'+[headers,sample].map(function(row){return row.map(csvEscape).join(',');}).join('\r\n');
+ downloadCsvFile('派送车队报价导入模板.csv',csv);
+}
+function handleDeliveryFleetQuoteImportFile(input){
+ var file=input&&input.files&&input.files[0];
+ if(!file)return;
+ if(!/\.csv$/i.test(file.name)){
+ deliveryFleetQuoteImportRows=[];
+ renderDeliveryFleetQuoteImportPreview();
+ showToast('请选择 CSV 文件','error');
+ return;
+ }
+ var reader=new FileReader();
+ reader.onload=function(event){deliveryFleetQuoteImportRows=parseDeliveryFleetQuoteCsv(event.target.result,deliveryFleetQuoteData);renderDeliveryFleetQuoteImportPreview();};
+ reader.onerror=function(){deliveryFleetQuoteImportRows=[];renderDeliveryFleetQuoteImportPreview();showToast('文件读取失败,请重新选择','error');};
+ reader.readAsText(file,'utf-8');
+}
+function confirmDeliveryFleetQuoteImport(){
+ var successCount=0,failedCount=0;
+ deliveryFleetQuoteImportRows.forEach(function(item){
+ if(!item.valid||hasDuplicateDeliveryFleetQuote(deliveryFleetQuoteData,item.data,'')){failedCount++;return;}
+ deliveryFleetQuoteData.unshift(Object.assign({id:'DFQ'+String(deliveryFleetQuoteSeq++).padStart(3,'0'),updatedAt:deliveryFleetQuoteNow()},item.data));
+ successCount++;
+ });
+ renderDeliveryFleetQuotes();
+ hideModal('modal-delivery-fleet-quote-import');
+ showToast('导入完成:成功 '+successCount+' 条,失败 '+failedCount+' 条',successCount?'success':'error');
+}
+function openDeliveryFleetQuoteModal(id){
+ var record=id?deliveryFleetQuoteData.find(function(item){return item.id===id;}):null;
+ if(id&&!record){showToast('未找到派送车队报价','error');return;}
+ document.getElementById('dfq-modal-title').textContent=record?'编辑派送车队报价':'新增派送车队报价';
+ document.getElementById('dfq-edit-id').value=record?record.id:'';
+ document.getElementById('dfq-origin').value=record?record.origin:'';
+ document.getElementById('dfq-warehouse').value=record?record.warehouse:'';
+ document.getElementById('dfq-miles').value=record?record.miles:'';
+ document.getElementById('dfq-fleet').value=record?record.fleet:'';
+ document.getElementById('dfq-self-pickup').value=record&&deliveryFleetQuoteHasPrice(record.selfPickup)?record.selfPickup:'';
+ document.getElementById('dfq-full-delivery').value=record&&deliveryFleetQuoteHasPrice(record.fullDelivery)?record.fullDelivery:'';
+ document.getElementById('dfq-loose-delivery').value=record&&deliveryFleetQuoteHasPrice(record.looseDelivery)?record.looseDelivery:'';
+ document.getElementById('dfq-status').value=record?record.status:'启用';
+ document.getElementById('dfq-remark').value=record?record.remark:'';
+ showModal('modal-delivery-fleet-quote');
+}
+function deliveryFleetQuoteNumber(id){
+ var raw=(document.getElementById(id).value||'').trim();
+ if(raw==='')return null;
+ var value=Number(raw);
+ return Number.isFinite(value)&&value>=0?value:NaN;
+}
+function saveDeliveryFleetQuote(){
+ var id=document.getElementById('dfq-edit-id').value;
+ var origin=document.getElementById('dfq-origin').value.trim();
+ var warehouse=document.getElementById('dfq-warehouse').value.trim().toUpperCase();
+ var fleet=document.getElementById('dfq-fleet').value.trim();
+ var miles=deliveryFleetQuoteNumber('dfq-miles');
+ var selfPickup=deliveryFleetQuoteNumber('dfq-self-pickup');
+ var fullDelivery=deliveryFleetQuoteNumber('dfq-full-delivery');
+ var looseDelivery=deliveryFleetQuoteNumber('dfq-loose-delivery');
+ var data={origin:origin,warehouse:warehouse,miles:miles,fleet:fleet,selfPickup:selfPickup,fullDelivery:fullDelivery,looseDelivery:looseDelivery,status:document.getElementById('dfq-status').value,updatedAt:deliveryFleetQuoteNow(),remark:document.getElementById('dfq-remark').value.trim()};
+ var validationMessage=validateDeliveryFleetQuoteDraft(data);
+ if(validationMessage){showToast(validationMessage,'error');return;}
+ if(hasDuplicateDeliveryFleetQuote(deliveryFleetQuoteData,data,id)){showToast('相同发货城市、目的仓、迈数和车队渠道的报价已存在','error');return;}
+ if(id){
+ var record=deliveryFleetQuoteData.find(function(item){return item.id===id;});
+ if(record)Object.assign(record,data);
+ }else{
+ deliveryFleetQuoteData.unshift(Object.assign({id:'DFQ'+String(deliveryFleetQuoteSeq++).padStart(3,'0')},data));
+ }
+ hideModal('modal-delivery-fleet-quote');
+ renderDeliveryFleetQuotes();
+ showToast(id?'派送车队报价修改成功':'派送车队报价新增成功','success');
+}
+function toggleDeliveryFleetQuoteStatus(id){
+ var record=deliveryFleetQuoteData.find(function(item){return item.id===id;});
+ if(!record)return;
+ record.status=record.status==='启用'?'停用':'启用';
+ record.updatedAt=deliveryFleetQuoteNow();
+ renderDeliveryFleetQuotes();
+ showToast('报价已'+record.status,'success');
+}
+function deleteDeliveryFleetQuote(id){
+ var record=deliveryFleetQuoteData.find(function(item){return item.id===id;});
+ if(!record)return;
+ if(!confirm('确定删除“'+record.origin+' → '+record.warehouse+' / '+record.fleet+'”报价吗?'))return;
+ deliveryFleetQuoteData=deliveryFleetQuoteData.filter(function(item){return item.id!==id;});
+ renderDeliveryFleetQuotes();
+ showToast('派送车队报价已删除','success');
+}
+document.addEventListener('DOMContentLoaded',renderDeliveryFleetQuotes);
+renderDeliveryFleetQuotes();
+
// ===== 海外用户管理 =====
var overseasUserList=[
{uid:'U001',username:'john_smith',password:'******',regTime:'2025-03-15',status:'正常'},
@@ -10956,9 +13722,9 @@ function saveOverseasUserAdd(){
// ===== 国内采购订单(独立页面、数据与处理逻辑) =====
var domesticPurchaseList=[
- {no:'DPO20260801001',clientName:'宁波海拓贸易有限公司',purchaseWarehouse:'宁波采购仓',category:'办公用品',name:'热敏标签纸',spec:'100×150mm / 500张',link:'https://detail.1688.com/offer/DP001.html',qty:500,inboundQty:500,outboundQty:180,stockQty:320,price:26.5,total:13250,address:'浙江省宁波市北仑区柏悦仓',contact:'刘敏',phone:'138-0000-1024',cnCarrier:'顺丰速运',cnTracking:'SF1435092876102',overseasCarrier:'-',usTracking:'-',eta:'2026-08-06T15:30',status:'已确认',remark:'常规采购补货',inventoryTransactions:[{time:'2026-08-06 15:30',type:'采购入库',no:'RK202608060021',inQty:500,outQty:0,balance:500,remark:'采购订单入库'},{time:'2026-08-09 10:15',type:'销售出库',no:'CK202608090118',inQty:0,outQty:180,balance:320,remark:'国内客户领用'}]},
- {no:'DPO20260803002',clientName:'上海鼎盛供应链有限公司',purchaseWarehouse:'上海松江采购仓',category:'包装耗材',name:'加厚纸箱',spec:'60×40×40cm / 五层',link:'https://detail.1688.com/offer/DP002.html',qty:800,inboundQty:800,outboundQty:260,stockQty:540,price:8.2,total:6560,address:'上海市松江区柏悦仓',contact:'陈强',phone:'139-0000-2086',cnCarrier:'京东物流',cnTracking:'JDVA0038271954',overseasCarrier:'-',usTracking:'-',eta:'2026-08-08T09:00',status:'采购中',remark:'大件货物包装使用',inventoryTransactions:[{time:'2026-08-08 09:00',type:'采购入库',no:'RK202608080037',inQty:800,outQty:0,balance:800,remark:'整批入库'},{time:'2026-08-11 14:20',type:'领料出库',no:'CK202608110076',inQty:0,outQty:260,balance:540,remark:'包装作业领用'}]},
- {no:'DPO20260805003',clientName:'深圳优航跨境电商有限公司',purchaseWarehouse:'深圳盐田采购仓',category:'仓储设备',name:'塑料托盘',spec:'1200×1000mm / 川字型',link:'https://detail.1688.com/offer/DP003.html',qty:120,inboundQty:90,outboundQty:30,stockQty:60,price:118,total:14160,address:'广东省深圳市盐田区柏悦仓',contact:'王芳',phone:'136-0000-3391',cnCarrier:'德邦快递',cnTracking:'DPK202608051903',overseasCarrier:'-',usTracking:'-',eta:'2026-08-14T16:00',status:'采购中',remark:'剩余30托待到货',inventoryTransactions:[{time:'2026-08-10 11:05',type:'部分入库',no:'RK202608100063',inQty:90,outQty:0,balance:90,remark:'首批到仓'},{time:'2026-08-12 08:40',type:'调拨出库',no:'CK202608120009',inQty:0,outQty:30,balance:60,remark:'调拨至美西仓备货区'}]}
+ {no:'DPO20260801001',clientName:'宁波海拓贸易有限公司',purchaseWarehouse:'宁波采购仓',category:'办公用品',name:'热敏标签纸',spec:'100×150mm / 500张',link:'https://detail.1688.com/offer/DP001.html',qty:500,inboundQty:500,outboundQty:180,stockQty:320,price:26.5,total:13250,address:'浙江省宁波市北仑区柏悦仓',contact:'刘敏',phone:'138-0000-1024',cnCarrier:'顺丰速运',cnTracking:'SF1435092876102',overseasCarrier:'-',usTracking:'-',eta:'2026-08-06T15:30',status:'已确认',remark:'常规采购补货',operationRecords:[{time:'2026-08-01 09:20',action:'创建采购订单',operator:'王芳',result:'成功',remark:'订单已提交'},{time:'2026-08-06 15:30',action:'更新到货信息',operator:'刘敏',result:'已完成',remark:'采购货物已到仓'}]},
+ {no:'DPO20260803002',clientName:'上海鼎盛供应链有限公司',purchaseWarehouse:'上海松江采购仓',category:'包装耗材',name:'加厚纸箱',spec:'60×40×40cm / 五层',link:'https://detail.1688.com/offer/DP002.html',qty:800,inboundQty:800,outboundQty:260,stockQty:540,price:8.2,total:6560,address:'上海市松江区柏悦仓',contact:'陈强',phone:'139-0000-2086',cnCarrier:'京东物流',cnTracking:'JDVA0038271954',overseasCarrier:'-',usTracking:'-',eta:'2026-08-08T09:00',status:'采购中',remark:'大件货物包装使用',operationRecords:[{time:'2026-08-03 10:05',action:'创建采购订单',operator:'陈强',result:'成功',remark:'订单已提交'},{time:'2026-08-04 14:20',action:'确认采购进度',operator:'叶珊珊',result:'处理中',remark:'供应商正在备货'}]},
+ {no:'DPO20260805003',clientName:'深圳优航跨境电商有限公司',purchaseWarehouse:'深圳盐田采购仓',category:'仓储设备',name:'塑料托盘',spec:'1200×1000mm / 川字型',link:'https://detail.1688.com/offer/DP003.html',qty:120,inboundQty:90,outboundQty:30,stockQty:60,price:118,total:14160,address:'广东省深圳市盐田区柏悦仓',contact:'王芳',phone:'136-0000-3391',cnCarrier:'德邦快递',cnTracking:'DPK202608051903',overseasCarrier:'-',usTracking:'-',eta:'2026-08-14T16:00',status:'采购中',remark:'剩余30托待到货',operationRecords:[{time:'2026-08-05 11:40',action:'创建采购订单',operator:'王芳',result:'成功',remark:'订单已提交'},{time:'2026-08-10 11:05',action:'更新到货信息',operator:'王芳',result:'处理中',remark:'首批90托已到仓'}]}
];
var currentDomesticPurchaseIdx=-1;
function switchPurchaseOrderTab(type){
@@ -10995,14 +13761,14 @@ function showDomesticPurchaseDetail(i){
document.getElementById('domestic-detail-stock').innerHTML=fields([['入库量',r.inboundQty],['出库量',r.outboundQty],['库存量',r.stockQty],['库存状态',r.stockQty>0?'在库':'无库存']]);
document.getElementById('domestic-detail-order').innerHTML=fields([['订单编号',r.no],['采购数量',r.qty],['预算单价','¥'+Number(r.price).toFixed(2)],['预算总价','¥'+Number(r.total).toFixed(2)],['订单状态',r.status],['联系人',r.contact],['联系电话',r.phone],['收货地址',r.address],['订单备注',r.remark]]);
document.getElementById('domestic-detail-courier').innerHTML=fields([['国内承运商',r.cnCarrier],['国内运单号',r.cnTracking],['海外承运商',r.overseasCarrier],['海外运单号',r.usTracking],['预计到达时间',(r.eta||'-').replace('T',' ')]]);
- var ledger='| 时间 | 单据类型 | 关联单号 | 入库量 | 出库量 | 结存量 | 备注 |
'+r.inventoryTransactions.map(function(t){return '| '+t.time+' | '+t.type+' | '+t.no+' | '+t.inQty+' | '+t.outQty+' | '+t.balance+' | '+t.remark+' |
';}).join('')+'
';document.getElementById('domestic-detail-ledger').innerHTML=ledger;switchPage('domestic-purchase-detail');
+ var resultClass={成功:'tag-green','已完成':'tag-green','处理中':'tag-orange','待处理':'tag-blue','失败':'tag-red'};var records=Array.isArray(r.operationRecords)?r.operationRecords:[];var operationHtml='| 操作时间 | 操作内容 | 操作人 | 操作结果 | 备注 |
'+(records.length?records.map(function(log){return '| '+(log.time||'-')+' | '+(log.action||'-')+' | '+(log.operator||'-')+' | '+(log.result||'-')+' | '+(log.remark||'-')+' |
';}).join(''):'| 暂无操作记录 |
')+'
';document.getElementById('domestic-detail-operation-records').innerHTML=operationHtml;switchPage('domestic-purchase-detail');
}
// ===== 海外采购订单(独立页面、数据与处理逻辑) =====
var overseasPurchaseList=[
- {no:'OPO20260722001',clientName:'Pacific Home LLC',purchaseWarehouse:'洛杉矶采购仓',category:'家居用品',name:'棉麻抱枕套',spec:'45×45cm / 藏青 / 4只装',link:'https://www.amazon.com/dp/OP001',qty:360,inboundQty:360,outboundQty:140,stockQty:220,price:8.5,total:3060,address:'ONT8, Moreno Valley, CA',contact:'Olivia Wilson',phone:'+1 626-555-0188',cnCarrier:'圆通国际',cnTracking:'YT9876543210',overseasCarrier:'UPS',usTracking:'1Z999AA10123456784',eta:'2026-08-02T13:30',status:'已完成',remark:'美西仓常备库存',inventoryTransactions:[{time:'2026-08-02 13:30',type:'海外入库',no:'USRK202608020016',inQty:360,outQty:0,balance:360,remark:'采购入仓'},{time:'2026-08-07 16:10',type:'一件代发',no:'USCK202608070084',inQty:0,outQty:140,balance:220,remark:'关联尾程订单'}]},
- {no:'OPO20260728002',clientName:'New Jersey Digital Inc.',purchaseWarehouse:'新泽西采购仓',category:'3C配件',name:'Type-C数据线',spec:'1.5m / 黑色 / 编织线',link:'https://www.amazon.com/dp/OP002',qty:600,inboundQty:480,outboundQty:120,stockQty:360,price:2.8,total:1680,address:'ABE8, Florence, NJ',contact:'Maria Garcia',phone:'+1 347-555-0142',cnCarrier:'云途物流',cnTracking:'YT202607281962',overseasCarrier:'FedEx',usTracking:'780512345678',eta:'2026-08-15T10:00',status:'采购中',remark:'第二批120件运输中',inventoryTransactions:[{time:'2026-08-08 09:45',type:'部分入库',no:'USRK202608080025',inQty:480,outQty:0,balance:480,remark:'首批到仓'},{time:'2026-08-11 11:20',type:'FBA出库',no:'USCK202608110031',inQty:0,outQty:120,balance:360,remark:'发往FBA仓'}]},
- {no:'OPO20260802003',clientName:'West Coast Outdoor Ltd.',purchaseWarehouse:'美西采购仓',category:'户外用品',name:'折叠露营椅',spec:'承重150kg / 黑色',link:'https://www.amazon.com/dp/OP003',qty:200,inboundQty:200,outboundQty:60,stockQty:140,price:24.6,total:4920,address:'LGB8, Rialto, CA',contact:'John Smith',phone:'+1 310-555-0123',cnCarrier:'递四方',cnTracking:'4PX3009817265',overseasCarrier:'USPS',usTracking:'9400111899223856928499',eta:'2026-08-20T14:00',status:'已确认',remark:'旺季备货',inventoryTransactions:[{time:'2026-08-10 14:00',type:'海外入库',no:'USRK202608100042',inQty:200,outQty:0,balance:200,remark:'整批到仓'},{time:'2026-08-12 10:30',type:'转仓出库',no:'USCK202608120014',inQty:0,outQty:60,balance:140,remark:'转仓至美东仓'}]}
+ {no:'OPO20260722001',clientName:'Pacific Home LLC',purchaseWarehouse:'洛杉矶采购仓',category:'家居用品',name:'棉麻抱枕套',spec:'45×45cm / 藏青 / 4只装',link:'https://www.amazon.com/dp/OP001',qty:360,inboundQty:360,outboundQty:140,stockQty:220,price:8.5,total:3060,address:'ONT8, Moreno Valley, CA',contact:'Olivia Wilson',phone:'+1 626-555-0188',cnCarrier:'圆通国际',cnTracking:'YT9876543210',overseasCarrier:'UPS',usTracking:'1Z999AA10123456784',eta:'2026-08-02T13:30',status:'已完成',remark:'美西仓常备库存',operationRecords:[{time:'2026-07-22 09:10',action:'创建采购订单',operator:'叶珊珊',result:'成功',remark:'订单已提交'},{time:'2026-08-02 13:30',action:'确认订单完成',operator:'李娜',result:'已完成',remark:'采购货物已到海外仓'}]},
+ {no:'OPO20260728002',clientName:'New Jersey Digital Inc.',purchaseWarehouse:'新泽西采购仓',category:'3C配件',name:'Type-C数据线',spec:'1.5m / 黑色 / 编织线',link:'https://www.amazon.com/dp/OP002',qty:600,inboundQty:480,outboundQty:120,stockQty:360,price:2.8,total:1680,address:'ABE8, Florence, NJ',contact:'Maria Garcia',phone:'+1 347-555-0142',cnCarrier:'云途物流',cnTracking:'YT202607281962',overseasCarrier:'FedEx',usTracking:'780512345678',eta:'2026-08-15T10:00',status:'采购中',remark:'第二批120件运输中',operationRecords:[{time:'2026-07-28 10:15',action:'创建采购订单',operator:'李娜',result:'成功',remark:'订单已提交'},{time:'2026-08-08 09:45',action:'更新物流进度',operator:'李娜',result:'处理中',remark:'第二批120件运输中'}]},
+ {no:'OPO20260802003',clientName:'West Coast Outdoor Ltd.',purchaseWarehouse:'美西采购仓',category:'户外用品',name:'折叠露营椅',spec:'承重150kg / 黑色',link:'https://www.amazon.com/dp/OP003',qty:200,inboundQty:200,outboundQty:60,stockQty:140,price:24.6,total:4920,address:'LGB8, Rialto, CA',contact:'John Smith',phone:'+1 310-555-0123',cnCarrier:'递四方',cnTracking:'4PX3009817265',overseasCarrier:'USPS',usTracking:'9400111899223856928499',eta:'2026-08-20T14:00',status:'已确认',remark:'旺季备货',operationRecords:[{time:'2026-08-02 09:30',action:'创建采购订单',operator:'王芳',result:'成功',remark:'订单已提交'},{time:'2026-08-10 14:00',action:'更新预计到达时间',operator:'王芳',result:'处理中',remark:'预计2026-08-20到达'}]}
];
var currentOverseasPurchaseIdx=-1;
function renderOverseasPurchaseList(){
@@ -11013,7 +13779,7 @@ function resetOverseasPurchaseQuery(){document.getElementById('overseas-purchase
function editOverseasPurchase(i){currentOverseasPurchaseIdx=i;var r=overseasPurchaseList[i];if(!r)return;document.getElementById('overseas-edit-no').value=r.no;document.getElementById('overseas-edit-category').value=r.category;document.getElementById('overseas-edit-name').value=r.name;document.getElementById('overseas-edit-spec').value=r.spec;document.getElementById('overseas-edit-link').value=r.link||'';document.getElementById('overseas-edit-inbound').value=r.inboundQty;document.getElementById('overseas-edit-outbound').value=r.outboundQty;document.getElementById('overseas-edit-status').value=r.status;document.getElementById('overseas-edit-cnCarrier').value=r.cnCarrier||'';document.getElementById('overseas-edit-cnTracking').value=r.cnTracking||'';document.getElementById('overseas-edit-overseasCarrier').value=r.overseasCarrier||'';document.getElementById('overseas-edit-usTracking').value=r.usTracking||'';document.getElementById('overseas-edit-eta').value=r.eta||'';document.getElementById('overseas-edit-remark').value=r.remark||'';switchPage('overseas-purchase-edit');}
function saveOverseasPurchaseEdit(){var r=overseasPurchaseList[currentOverseasPurchaseIdx];if(!r)return;var inbound=Number(document.getElementById('overseas-edit-inbound').value);var outbound=Number(document.getElementById('overseas-edit-outbound').value);if(inbound<0||outbound<0){showToast('海外采购订单数量不能小于0','error');return;}if(outbound>inbound){showToast('海外采购订单出库量不能大于入库量','error');return;}r.category=document.getElementById('overseas-edit-category').value.trim()||'-';r.name=document.getElementById('overseas-edit-name').value.trim()||'-';r.spec=document.getElementById('overseas-edit-spec').value.trim()||'-';r.link=document.getElementById('overseas-edit-link').value.trim();r.inboundQty=inbound;r.outboundQty=outbound;r.stockQty=inbound-outbound;r.status=document.getElementById('overseas-edit-status').value;r.cnCarrier=document.getElementById('overseas-edit-cnCarrier').value.trim();r.cnTracking=document.getElementById('overseas-edit-cnTracking').value.trim();r.overseasCarrier=document.getElementById('overseas-edit-overseasCarrier').value.trim();r.usTracking=document.getElementById('overseas-edit-usTracking').value.trim();r.eta=document.getElementById('overseas-edit-eta').value;r.remark=document.getElementById('overseas-edit-remark').value.trim();switchPage('overseas-purchase');switchPurchaseOrderTab('overseas');showToast('海外采购订单已保存','success');}
function showOverseasPurchaseDetail(i){
- var r=overseasPurchaseList[i];if(!r)return;var fields=function(rows){return rows.map(function(p){return ''+p[0]+'
'+(p[1]===undefined||p[1]===''?'-':p[1])+'
';}).join('');};document.getElementById('overseas-detail-product').innerHTML=fields([['客户名称',r.clientName],['采购仓库',r.purchaseWarehouse],['采购品类',r.category],['商品名称',r.name],['商品规格',r.spec],['商品链接',r.link?'查看链接':'-']]);document.getElementById('overseas-detail-stock').innerHTML=fields([['入库量',r.inboundQty],['出库量',r.outboundQty],['库存量',r.stockQty],['库存状态',r.stockQty>0?'在库':'无库存']]);document.getElementById('overseas-detail-order').innerHTML=fields([['订单编号',r.no],['采购数量',r.qty],['预算单价','$'+Number(r.price).toFixed(2)],['预算总价','$'+Number(r.total).toFixed(2)],['订单状态',r.status],['联系人',r.contact],['联系电话',r.phone],['收货地址',r.address],['订单备注',r.remark]]);document.getElementById('overseas-detail-courier').innerHTML=fields([['国内承运商',r.cnCarrier],['国内运单号',r.cnTracking],['海外承运商',r.overseasCarrier],['海外运单号',r.usTracking],['预计到达时间',(r.eta||'-').replace('T',' ')]]);var ledger='| 时间 | 单据类型 | 关联单号 | 入库量 | 出库量 | 结存量 | 备注 |
'+r.inventoryTransactions.map(function(t){return '| '+t.time+' | '+t.type+' | '+t.no+' | '+t.inQty+' | '+t.outQty+' | '+t.balance+' | '+t.remark+' |
';}).join('')+'
';document.getElementById('overseas-detail-ledger').innerHTML=ledger;switchPage('overseas-purchase-detail');
+ var r=overseasPurchaseList[i];if(!r)return;var fields=function(rows){return rows.map(function(p){return ''+p[0]+'
'+(p[1]===undefined||p[1]===''?'-':p[1])+'
';}).join('');};document.getElementById('overseas-detail-product').innerHTML=fields([['客户名称',r.clientName],['采购仓库',r.purchaseWarehouse],['采购品类',r.category],['商品名称',r.name],['商品规格',r.spec],['商品链接',r.link?'查看链接':'-']]);document.getElementById('overseas-detail-stock').innerHTML=fields([['入库量',r.inboundQty],['出库量',r.outboundQty],['库存量',r.stockQty],['库存状态',r.stockQty>0?'在库':'无库存']]);document.getElementById('overseas-detail-order').innerHTML=fields([['订单编号',r.no],['采购数量',r.qty],['预算单价','$'+Number(r.price).toFixed(2)],['预算总价','$'+Number(r.total).toFixed(2)],['订单状态',r.status],['联系人',r.contact],['联系电话',r.phone],['收货地址',r.address],['订单备注',r.remark]]);document.getElementById('overseas-detail-courier').innerHTML=fields([['国内承运商',r.cnCarrier],['国内运单号',r.cnTracking],['海外承运商',r.overseasCarrier],['海外运单号',r.usTracking],['预计到达时间',(r.eta||'-').replace('T',' ')]]);var resultClass={成功:'tag-green','已完成':'tag-green','处理中':'tag-orange','待处理':'tag-blue','失败':'tag-red'};var records=Array.isArray(r.operationRecords)?r.operationRecords:[];var operationHtml='| 操作时间 | 操作内容 | 操作人 | 操作结果 | 备注 |
'+(records.length?records.map(function(log){return '| '+(log.time||'-')+' | '+(log.action||'-')+' | '+(log.operator||'-')+' | '+(log.result||'-')+' | '+(log.remark||'-')+' |
';}).join(''):'| 暂无操作记录 |
')+'
';document.getElementById('overseas-detail-operation-records').innerHTML=operationHtml;switchPage('overseas-purchase-detail');
}
// ===== 本土卡车订单 =====
@@ -11221,6 +13987,28 @@ var truckList=[
{dispatchNo:'BYSE2606075_3',company:'宁波速通物流',driver:'李伟',trailerNo:'浙B·3D7L2',store:'慈溪门店',payable:1800,receivable:2200,etdDate:'2026-07-19',status:'已完成'},
{dispatchNo:'BYSE2606061_7',company:'上海港通运输',driver:'赵敏',trailerNo:'沪C·5T9M1',store:'宁波市区店',payable:4500,receivable:5200,etdDate:'2026-07-18',status:'已派车'}
];
+var truckRegion='domestic';
+var truckAddRegion='domestic';
+var truckEditRegion='domestic';
+var overseasTruckList=[
+ {dispatchNo:'USDR2607012_1',company:'Pacific Drayage LLC',driver:'David Miller',trailerNo:'CA-8F2K9',store:'Los Angeles DC',payable:480,receivable:620,etdDate:'2026-07-20',status:'提柜中'},
+ {dispatchNo:'USDR2607008_2',company:'West Coast Haulage',driver:'Emily Brown',trailerNo:'CA-3D7L2',store:'Ontario DC',payable:360,receivable:500,etdDate:'2026-07-19',status:'已完成'},
+ {dispatchNo:'USDR2607001_3',company:'Global Port Transport',driver:'Michael Lee',trailerNo:'NJ-5T9M1',store:'New Jersey DC',payable:710,receivable:860,etdDate:'2026-07-18',status:'已派车'}
+];
+function getTruckList(region){return region==='overseas'?overseasTruckList:truckList;}
+function getActiveTruckList(){return getTruckList(truckRegion);}
+function getTruckCurrency(){return truckRegion==='overseas'?{symbol:'$',unit:'USD',label:'海外'}:{symbol:'¥',unit:'RMB',label:'国内'};}
+function updateTruckCurrencyLabels(){
+ var currency=getTruckCurrency();
+ var title=document.getElementById('truck-list-title');
+ if(title)title.textContent='拖车列表 - '+currency.label;
+ ['truck-payable-unit','truck-receivable-unit','et-payable-unit','et-receivable-unit'].forEach(function(id){var el=document.getElementById(id);if(el)el.textContent=currency.unit;});
+}
+function switchTruckRegion(region,el){
+ truckRegion=region==='overseas'?'overseas':'domestic';
+ document.querySelectorAll('#truck-region-tabs .tab-item').forEach(function(tab){tab.classList.toggle('active',tab.dataset.region===truckRegion);});
+ renderTruckList();
+}
var truckStatusStyle={
'待派车':'color:#fa8c16;background:#fff7e6;border:1px solid #ffd591',
'已派车':'color:#1890ff;background:#e6f7ff;border:1px solid #91d5ff',
@@ -11238,7 +14026,9 @@ function nextDispatchNo(){
function renderTruckList(){
var tb=document.getElementById('tbody-truck-list');
if(!tb) return;
- tb.innerHTML=truckList.map(function(t,i){
+ var list=getActiveTruckList();
+ var currency=getTruckCurrency();
+ tb.innerHTML=list.map(function(t,i){
var att=(t.attachments||[]).length;
return `
| ${t.dispatchNo} |
@@ -11246,8 +14036,8 @@ function renderTruckList(){
${t.driver} |
${t.trailerNo} |
${t.store} |
- ¥${Number(t.payable).toLocaleString()} |
- ¥${Number(t.receivable).toLocaleString()} |
+ ${currency.symbol}${Number(t.payable).toLocaleString()} |
+ ${currency.symbol}${Number(t.receivable).toLocaleString()} |
${t.etdDate} |
${truckStatusSelect(t,i)} |
📎 ${att} |
@@ -11256,7 +14046,8 @@ function renderTruckList(){
`;
}).join('');
var cnt=document.getElementById('truck-count');
- if(cnt) cnt.textContent='共 '+truckList.length+' 条';
+ if(cnt) cnt.textContent='共 '+list.length+' 条';
+ updateTruckCurrencyLabels();
}
function truckStatusSelect(t,i){
var opts=['待派车','已派车','提柜中','已完成','已取消'];
@@ -11267,18 +14058,20 @@ function truckStatusSelect(t,i){
return html;
}
function changeTruckStatus(i,val){
- if(!truckList[i]) return;
- truckList[i].status=val;
+ var list=getActiveTruckList();
+ if(!list[i]) return;
+ list[i].status=val;
renderTruckList();
showToast('状态已更新为:'+val,'success');
}
var truckAttachIndex=-1;
var truckAttachDraft=[];
function openTruckAttach(i){
+ var list=getActiveTruckList();
truckAttachIndex=i;
- truckAttachDraft=(truckList[i].attachments||[]).slice();
+ truckAttachDraft=(list[i].attachments||[]).slice();
var dn=document.getElementById('attach-dispatch-no');
- if(dn) dn.value=truckList[i].dispatchNo||'';
+ if(dn) dn.value=list[i].dispatchNo||'';
renderAttachList();
showModal('modal-truck-attach');
}
@@ -11310,14 +14103,16 @@ function removeTruckAttach(idx){
}
function saveTruckAttach(){
if(truckAttachIndex<0) return;
- if(!truckList[truckAttachIndex]) truckList[truckAttachIndex]={};
- truckList[truckAttachIndex].attachments=truckAttachDraft.slice();
+ var list=getActiveTruckList();
+ if(!list[truckAttachIndex]) list[truckAttachIndex]={};
+ list[truckAttachIndex].attachments=truckAttachDraft.slice();
renderTruckList();
hideModal('modal-truck-attach');
showToast('附件已保存','success');
}
function $v(id){var e=document.getElementById(id);return e?e.value.trim():'';}
function addTruck(){
+ var list=getTruckList(truckAddRegion);
var company=$v('truck-company');
if(!company){showToast('请选择运输公司','error');return;}
var obj={
@@ -11346,7 +14141,8 @@ function addTruck(){
transitH:$v('truck-transit-h'),transitM:$v('truck-transit-m'),
status:'待派车'
};
- truckList.unshift(obj);
+ truckRegion=truckAddRegion;
+ list.unshift(obj);
switchPage('truck-list');
showToast('拖车单新增成功,单号:'+obj.dispatchNo,'success');
// 清空表单
@@ -11355,7 +14151,7 @@ function addTruck(){
}
function delTruck(i){
if(!confirm('确定删除该拖车单?')) return;
- truckList.splice(i,1);
+ getActiveTruckList().splice(i,1);
renderTruckList();
showToast('已删除拖车单','info');
}
@@ -11363,7 +14159,8 @@ var truckEditIndex=-1;
function gv(id){var e=document.getElementById(id);return e?e.value:'';}
function editTruck(i){
truckEditIndex=i;
- var t=truckList[i];
+ truckEditRegion=truckRegion;
+ var t=getTruckList(truckEditRegion)[i];
if(!t) return;
function set(id,val){var e=document.getElementById(id);if(e)e.value=val==null?'':val;}
set('et-qty',t.qty);set('et-gw',t.gw);set('et-vol',t.vol);
@@ -11381,7 +14178,8 @@ function editTruck(i){
}
function saveTruckEdit(){
if(truckEditIndex<0) return;
- var t=truckList[truckEditIndex];
+ truckRegion=truckEditRegion;
+ var t=getTruckList(truckEditRegion)[truckEditIndex];
t.company=gv('et-company');t.driver=gv('et-driver');t.trailerNo=gv('et-trailer-no');
t.store=gv('et-store');t.payable=gv('et-payable')||'0';t.receivable=gv('et-receivable')||'0';
t.etdDate=gv('et-etd-date');
@@ -11402,6 +14200,7 @@ var releaseCurrentTd=null;
function openRelease(span){
var td=span.closest('td');
releaseCurrentTd=td;
+ document.getElementById('release-vessel').value='';
document.getElementById('release-voyage').value='';
document.getElementById('release-bl').value='';
showModal('modal-release');
@@ -11409,18 +14208,20 @@ function openRelease(span){
function confirmRelease(){
var td=releaseCurrentTd;
if(!td) return;
+ const vessel=document.getElementById('release-vessel').value.trim();
var v=document.getElementById('release-voyage').value.trim();
var bl=document.getElementById('release-bl').value.trim();
- if(!v||!bl){showToast('请填写航次和提单号','error');return;}
- if(!window.confirm('确认放舱?\n航次:'+v+'\n提单号:'+bl)){return;}
- td.innerHTML='是航次:'+v+'
提单号:'+bl+'
修改';
- td.dataset.v=v; td.dataset.bl=bl;
+ if(!vessel||!v||!bl){showToast('请填写船名、航次和提单号','error');return;}
+ if(!window.confirm('确认放舱?\n船名:'+vessel+'\n航次:'+v+'\n提单号:'+bl)){return;}
+ td.innerHTML='是船名:'+vessel+'
航次:'+v+'
提单号:'+bl+'
修改';
+ td.dataset.vessel=vessel; td.dataset.v=v; td.dataset.bl=bl;
hideModal('modal-release');
showToast('放舱信息已保存','success');
}
function editRelease(a){
var td=a.closest('td');
releaseCurrentTd=td;
+ document.getElementById('release-vessel').value=td.dataset.vessel||'';
document.getElementById('release-voyage').value=td.dataset.v||'';
document.getElementById('release-bl').value=td.dataset.bl||'';
showModal('modal-release');
@@ -11429,3 +14230,234 @@ function cancelRelease(){
releaseCurrentTd=null;
hideModal('modal-release');
}
+
+// ===== 海外仓报价 =====
+function escapeOverseasWarehouseQuoteHtml(value){
+ return String(value==null?'':value).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''');
+}
+function overseasWarehouseQuoteNow(){
+ var now=new Date();
+ var pad=function(value){return String(value).padStart(2,'0');};
+ return now.getFullYear()+'-'+pad(now.getMonth()+1)+'-'+pad(now.getDate())+' '+pad(now.getHours())+':'+pad(now.getMinutes());
+}
+function overseasWarehouseQuoteDefaultDraft(){
+ return {id:'',name:'',warehouse:'',provider:'',currency:'USD',effectiveStart:'',effectiveEnd:'',version:'V1.0',status:'启用',updatedAt:'',remark:'',warehouseFees:[{item:'入库卸货',unit:'托',price:'',minimumCharge:'',remark:''}],transitPrices:[{warehouse:'',fbaWarehouse:'',method:'整车派送',miles:'',price:'',minimumCharge:'',remark:''}]};
+}
+function overseasWarehouseQuoteInputValue(id,value){
+ var element=document.getElementById(id);
+ if(element)element.value=value==null?'':value;
+}
+function renderOverseasWarehouseQuotes(){
+ var tbody=document.getElementById('tbody-gen-overseas-quote');
+ if(!tbody)return;
+ var read=function(id){var element=document.getElementById(id);return element?String(element.value||'').trim():'';};
+ var keyword=read('goq-filter-keyword').toLowerCase();
+ var warehouse=read('goq-filter-warehouse');
+ var provider=read('goq-filter-provider').toLowerCase();
+ var currency=read('goq-filter-currency');
+ var status=read('goq-filter-status');
+ var rows=overseasWarehouseQuoteData.filter(function(record){
+ var searchable=[record.name,record.version,record.warehouse,record.provider].join(' ').toLowerCase();
+ return (!keyword||searchable.indexOf(keyword)>=0)&&(!warehouse||record.warehouse===warehouse)&&(!provider||String(record.provider).toLowerCase().indexOf(provider)>=0)&&(!currency||record.currency===currency)&&(!status||record.status===status);
+ });
+ tbody.innerHTML=rows.length?rows.map(function(record){
+ var statusClass=record.status==='启用'?'tag-green':'tag-gray';
+ return ''
+ +' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.name)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.warehouse)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.provider)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.currency)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.effectiveStart)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.effectiveEnd||'长期有效')+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.version)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.status)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.updatedAt)+' | '
+ +''+escapeOverseasWarehouseQuoteHtml(record.remark||'—')+' | '
+ +'
';
+ }).join(''):'| 暂无符合条件的海外仓报价 |
';
+ var total=document.getElementById('goq-total');
+ if(total)total.textContent='共 '+rows.length+' 条';
+}
+function resetOverseasWarehouseQuoteFilters(){
+ ['goq-filter-keyword','goq-filter-warehouse','goq-filter-provider','goq-filter-currency','goq-filter-status'].forEach(function(id){overseasWarehouseQuoteInputValue(id,'');});
+ renderOverseasWarehouseQuotes();
+}
+function renderOverseasWarehouseQuoteDetail(record){
+ var escape=escapeOverseasWarehouseQuoteHtml;
+ var display=function(value){return value===null||value===undefined||String(value).trim()===''?'—':String(value);};
+ var statusClass=record.status==='启用'?'tag-green':'tag-gray';
+ var summary=[
+ ['报价名称',record.name],
+ ['状态',''+escape(display(record.status))+'',true],
+ ['海外仓',record.warehouse],
+ ['服务商',record.provider],
+ ['币种',record.currency],
+ ['生效日期',record.effectiveStart],
+ ['失效日期',record.effectiveEnd||'长期有效'],
+ ['报价版本',record.version],
+ ['更新时间',record.updatedAt],
+ ['备注',record.remark]
+ ];
+ document.getElementById('goq-detail-summary').innerHTML=summary.map(function(item){
+ var value=item[2]?item[1]:escape(display(item[1]));
+ return ''+escape(item[0])+''+value+'
';
+ }).join('');
+ var feeRows=record.warehouseFees||[];
+ document.getElementById('tbody-goq-detail-fees').innerHTML=feeRows.length?feeRows.map(function(row){
+ return '| '+escape(display(row.item))+' | '+escape(display(row.unit))+' | '+escape(display(row.price))+' | '+escape(display(row.minimumCharge))+' | '+escape(display(row.remark))+' |
';
+ }).join(''):'| 暂无仓储作业费用 |
';
+ var transitRows=record.transitPrices||[];
+ document.getElementById('tbody-goq-detail-transit').innerHTML=transitRows.length?transitRows.map(function(row){
+ return '| '+escape(display(row.warehouse))+' | '+escape(display(row.fbaWarehouse))+' | '+escape(display(row.method))+' | '+escape(display(row.miles))+' | '+escape(display(row.price))+' | '+escape(display(row.minimumCharge))+' | '+escape(display(row.remark))+' |
';
+ }).join(''):'| 暂无中转派送价格 |
';
+}
+function openOverseasWarehouseQuoteDetail(id){
+ var record=overseasWarehouseQuoteData.find(function(item){return item.id===id;});
+ if(!record){showToast('未找到海外仓报价','error');return;}
+ renderOverseasWarehouseQuoteDetail(record);
+ document.getElementById('goq-detail-edit').onclick=function(){
+ hideModal('modal-gen-overseas-quote-detail');
+ openOverseasWarehouseQuoteModal(id);
+ };
+ showModal('modal-gen-overseas-quote-detail');
+}
+function renderOverseasWarehouseFeeRows(){
+ var tbody=document.getElementById('tbody-goq-warehouse-fees');
+ if(!tbody||!overseasWarehouseQuoteDraft)return;
+ var escape=escapeOverseasWarehouseQuoteHtml;
+ tbody.innerHTML=overseasWarehouseQuoteDraft.warehouseFees.map(function(row,index){
+ var items=['入库卸货','收货清点','上架','存储','出库操作','一件代发','换标','退件处理'];
+ var units=['箱','托','件','立方英尺/月','票'];
+ var options=function(values,current){return values.map(function(value){return '';}).join('');};
+ return ' | | | | | |
';
+ }).join('');
+}
+function renderOverseasTransitPriceRows(){
+ var tbody=document.getElementById('tbody-goq-transit-prices');
+ if(!tbody||!overseasWarehouseQuoteDraft)return;
+ var escape=escapeOverseasWarehouseQuoteHtml;
+ tbody.innerHTML=overseasWarehouseQuoteDraft.transitPrices.map(function(row,index){
+ var methods=['整车自提','整车派送','散板派送'];
+ return ' | | | | | | | |
';
+ }).join('');
+}
+function collectOverseasWarehouseQuoteDetails(){
+ if(!overseasWarehouseQuoteDraft)return;
+ var readRow=function(row,fields){var result={};fields.forEach(function(field){var element=row.querySelector('[data-field="'+field+'"]');result[field]=element?String(element.value||'').trim():'';});return result;};
+ overseasWarehouseQuoteDraft.warehouseFees=Array.from(document.querySelectorAll('#tbody-goq-warehouse-fees tr')).map(function(row){return readRow(row,['item','unit','price','minimumCharge','remark']);});
+ overseasWarehouseQuoteDraft.transitPrices=Array.from(document.querySelectorAll('#tbody-goq-transit-prices tr')).map(function(row){return readRow(row,['warehouse','fbaWarehouse','method','miles','price','minimumCharge','remark']);});
+}
+function addOverseasWarehouseFeeRow(){
+ collectOverseasWarehouseQuoteDetails();
+ overseasWarehouseQuoteDraft.warehouseFees.push({item:'入库卸货',unit:'托',price:'',minimumCharge:'',remark:''});
+ renderOverseasWarehouseFeeRows();
+}
+function removeOverseasWarehouseFeeRow(index){
+ collectOverseasWarehouseQuoteDetails();
+ overseasWarehouseQuoteDraft.warehouseFees.splice(index,1);
+ renderOverseasWarehouseFeeRows();
+}
+function addOverseasTransitPriceRow(){
+ collectOverseasWarehouseQuoteDetails();
+ overseasWarehouseQuoteDraft.transitPrices.push({warehouse:overseasWarehouseQuoteDraft.warehouse||'',fbaWarehouse:'',method:'整车派送',miles:'',price:'',minimumCharge:'',remark:''});
+ renderOverseasTransitPriceRows();
+}
+function removeOverseasTransitPriceRow(index){
+ collectOverseasWarehouseQuoteDetails();
+ overseasWarehouseQuoteDraft.transitPrices.splice(index,1);
+ renderOverseasTransitPriceRows();
+}
+function syncOverseasTransitWarehouse(warehouse){
+ if(!overseasWarehouseQuoteDraft)return;
+ collectOverseasWarehouseQuoteDetails();
+ overseasWarehouseQuoteDraft.warehouse=warehouse;
+ overseasWarehouseQuoteDraft.transitPrices.forEach(function(row){row.warehouse=warehouse;});
+ renderOverseasTransitPriceRows();
+}
+function openOverseasWarehouseQuoteModal(id){
+ var record=id?overseasWarehouseQuoteData.find(function(item){return item.id===id;}):null;
+ if(id&&!record){showToast('未找到海外仓报价','error');return;}
+ overseasWarehouseQuoteDraft=record?JSON.parse(JSON.stringify(record)):overseasWarehouseQuoteDefaultDraft();
+ document.getElementById('goq-modal-title').textContent=record?'编辑海外仓报价':'新增海外仓报价';
+ ['id','name','warehouse','provider','currency','effectiveStart','effectiveEnd','version','status','remark'].forEach(function(field){overseasWarehouseQuoteInputValue('goq-'+(field==='id'?'edit-id':field.replace(/[A-Z]/g,function(letter){return '-'+letter.toLowerCase();})),overseasWarehouseQuoteDraft[field]);});
+ renderOverseasWarehouseFeeRows();
+ renderOverseasTransitPriceRows();
+ showModal('modal-gen-overseas-quote');
+}
+function overseasWarehouseQuoteNumber(value,required){
+ var raw=String(value==null?'':value).trim();
+ if(raw==='')return required?null:'';
+ var number=Number(raw);
+ return Number.isFinite(number)&&number>=0?number:null;
+}
+function validateOverseasWarehouseQuote(draft){
+ if(!draft.name||!draft.warehouse||!draft.provider||!draft.currency||!draft.effectiveStart||!draft.version)return '请填写所有必填的基础信息';
+ if(draft.effectiveEnd&&draft.effectiveEnd
+ 示例收款二维码
+ 仅用于原型展示,不包含真实收款信息
+
+
+
+
+
+
+ 示例
+
diff --git a/悦/货代SAAS平台后台/prototype-src/manifest.json b/悦/货代SAAS平台后台/prototype-src/manifest.json
index 09a2fd0..8bf00fc 100644
--- a/悦/货代SAAS平台后台/prototype-src/manifest.json
+++ b/悦/货代SAAS平台后台/prototype-src/manifest.json
@@ -12,11 +12,15 @@
"outbound-dispatch",
"outbound-bol",
"outbound-selfpick",
+ "outbound-exception",
"gen-product",
"gen-fee",
+ "gen-exchange-rate",
"outbound-vehicle",
- "outbound-vehicle-edit",
+ "gen-owned-warehouse",
"gen-fba",
+ "gen-partner-warehouse",
+ "gen-overseas-quote",
"gen-download",
"gen-pallet",
"gen-location",
@@ -92,6 +96,7 @@
"customer-account-detail",
"finance-cost",
"customer-arap",
+ "finance-ar-detail-report",
"customer-arap-detail",
"customer-recon-stmt",
"settlement-ar",
@@ -116,6 +121,7 @@
"ct-list",
"ct-manifest",
"fba-stock-management",
+ "overseas-location",
"inventory-overview",
"warehouse-stock",
"overseas-stock",
@@ -124,6 +130,8 @@
"overseas-relabel",
"profit",
"vehicle",
+ "delivery-fleet-quote",
+ "vehicle-detail",
"fba-return-inbound",
"fba-return-relabel",
"fba-return-outbound",
@@ -147,11 +155,12 @@
"inventory-transactions",
"purchase-stock-detail",
"fba-return-stock",
- "overseas-location",
+ "domestic-location",
"domestic-stock-management",
"domestic-container-business",
"domestic-container-detail",
"pallet-manage",
+ "pallet-detail",
"ct-preload",
"ct-preload-detail",
"ct-board",
@@ -205,11 +214,12 @@
"wh-process",
"wh-transfer",
"wh-shelve",
- "overseas-location",
+ "domestic-location",
"domestic-stock-management",
"domestic-container-business",
"domestic-container-detail",
- "pallet-manage"
+ "pallet-manage",
+ "pallet-detail"
]
},
{
@@ -217,6 +227,7 @@
"title": "海外仓",
"pages": [
"fba-stock-management",
+ "overseas-location",
"inventory-overview",
"warehouse-stock",
"overseas-stock",
@@ -255,10 +266,16 @@
"outbound-bol",
"outbound-selfpick",
"outbound-vehicle",
- "outbound-vehicle-edit",
"outbound-vehicle-detail"
]
},
+ {
+ "file": "modules/04a-customer-service.html",
+ "title": "客户服务",
+ "pages": [
+ "outbound-exception"
+ ]
+ },
{
"file": "modules/05-suppliers.html",
"title": "供应商中心",
@@ -332,6 +349,7 @@
"customer-account-detail",
"finance-cost",
"customer-arap",
+ "finance-ar-detail-report",
"customer-arap-detail",
"customer-recon-stmt",
"settlement-ar",
@@ -356,13 +374,19 @@
"pages": [
"gen-product",
"gen-fee",
+ "gen-exchange-rate",
+ "gen-owned-warehouse",
"gen-fba",
+ "gen-partner-warehouse",
+ "gen-overseas-quote",
"gen-download",
"gen-pallet",
"gen-location",
"gen-route",
"gen-voyage",
- "vehicle"
+ "vehicle",
+ "delivery-fleet-quote",
+ "vehicle-detail"
]
},
{
diff --git a/悦/货代SAAS平台后台/prototype-src/modules/01-customers.html b/悦/货代SAAS平台后台/prototype-src/modules/01-customers.html
index 6d666cd..fe02cd2 100644
--- a/悦/货代SAAS平台后台/prototype-src/modules/01-customers.html
+++ b/悦/货代SAAS平台后台/prototype-src/modules/01-customers.html
@@ -56,32 +56,6 @@
-
-