diff --git a/client/lib/screens/stock_in/stock_in_form_screen.dart b/client/lib/screens/stock_in/stock_in_form_screen.dart index 57bf413..0f4977b 100644 --- a/client/lib/screens/stock_in/stock_in_form_screen.dart +++ b/client/lib/screens/stock_in/stock_in_form_screen.dart @@ -75,9 +75,26 @@ class _StockInFormScreenState extends ConsumerState { } else { _items.add(_ItemRow()); _initDefaults(); + _initWarehouseDefault(); } } + /// 新建单默认填充默认仓库(2026-07-14):仓库列表加载完成后, + /// `isDefault` 的仓 优先;无默认时仅剩 1 个仓才取它;否则保持 null。 + /// 编辑模式不受影响(`_loadEditOrder` 已从单据自身仓库回填)。 + Future _initWarehouseDefault() async { + try { + final warehouses = await ref.read(warehouseListProvider.future); + if (!mounted || _warehouseId != null) return; + final defaultWh = warehouses.where((w) => w.isDefault).firstOrNull; + final picked = defaultWh?.id ?? + (warehouses.length == 1 ? warehouses.first.id : null); + if (picked != null) { + setState(() => _warehouseId = picked); + } + } catch (_) {} + } + Future _initDefaults() async { try { final shop = await ref.read(shopInfoProvider.future); diff --git a/client/lib/screens/stock_out/stock_out_form_screen.dart b/client/lib/screens/stock_out/stock_out_form_screen.dart index b53bdf4..12f87da 100644 --- a/client/lib/screens/stock_out/stock_out_form_screen.dart +++ b/client/lib/screens/stock_out/stock_out_form_screen.dart @@ -173,8 +173,29 @@ class _StockOutFormScreenState extends ConsumerState { @override void initState() { super.initState(); - if (_isEdit) _loadEditOrder(); - // 新单起始为空,用户通过「从库存选择」添加明细 + if (_isEdit) { + _loadEditOrder(); + } else { + // 新单起始为空,用户通过「从库存选择」添加明细 + _initWarehouseDefault(); + } + } + + /// 新建单默认填充默认仓库(2026-07-14):仓库列表加载完成后, + /// `isDefault` 的仓 优先;无默认时仅剩 1 个仓才取它;否则保持 null。 + /// 编辑模式不受影响(`_loadEditOrder` 已从单据自身仓库回填)。 + Future _initWarehouseDefault() async { + try { + final warehouses = await ref.read(warehouseListProvider.future); + if (!mounted || _warehouseId != null) return; + final defaultWh = warehouses.where((w) => w.isDefault).firstOrNull; + final picked = defaultWh?.id ?? + (warehouses.length == 1 ? warehouses.first.id : null); + if (picked != null) { + setState(() => _warehouseId = picked); + await _loadInventory(picked); + } + } catch (_) {} } Future _loadEditOrder() async { diff --git a/client/test/golden/goldens/stock_in_form_a.png b/client/test/golden/goldens/stock_in_form_a.png index 1446d16..e7aed45 100644 Binary files a/client/test/golden/goldens/stock_in_form_a.png and b/client/test/golden/goldens/stock_in_form_a.png differ diff --git a/client/test/golden/goldens/stock_in_form_b.png b/client/test/golden/goldens/stock_in_form_b.png index a393fd1..90a0b1d 100644 Binary files a/client/test/golden/goldens/stock_in_form_b.png and b/client/test/golden/goldens/stock_in_form_b.png differ diff --git a/client/test/golden/goldens/stock_in_form_c.png b/client/test/golden/goldens/stock_in_form_c.png index ad2b2c9..47ebaf8 100644 Binary files a/client/test/golden/goldens/stock_in_form_c.png and b/client/test/golden/goldens/stock_in_form_c.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_a.png b/client/test/golden/goldens/stock_in_form_mobile_a.png index 840ec98..0b2e23b 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_a.png and b/client/test/golden/goldens/stock_in_form_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_b.png b/client/test/golden/goldens/stock_in_form_mobile_b.png index 20cef67..151d93b 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_b.png and b/client/test/golden/goldens/stock_in_form_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_c.png b/client/test/golden/goldens/stock_in_form_mobile_c.png index 1d25980..96d373d 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_c.png and b/client/test/golden/goldens/stock_in_form_mobile_c.png differ diff --git a/client/test/golden/goldens/stock_out_form_a.png b/client/test/golden/goldens/stock_out_form_a.png index 1455896..097f3e6 100644 Binary files a/client/test/golden/goldens/stock_out_form_a.png and b/client/test/golden/goldens/stock_out_form_a.png differ diff --git a/client/test/golden/goldens/stock_out_form_b.png b/client/test/golden/goldens/stock_out_form_b.png index d82979a..744e56e 100644 Binary files a/client/test/golden/goldens/stock_out_form_b.png and b/client/test/golden/goldens/stock_out_form_b.png differ diff --git a/client/test/golden/goldens/stock_out_form_c.png b/client/test/golden/goldens/stock_out_form_c.png index 78128d8..2fc5d2f 100644 Binary files a/client/test/golden/goldens/stock_out_form_c.png and b/client/test/golden/goldens/stock_out_form_c.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_a.png b/client/test/golden/goldens/stock_out_form_mobile_a.png index 6f7613f..8db0e17 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_a.png and b/client/test/golden/goldens/stock_out_form_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_b.png b/client/test/golden/goldens/stock_out_form_mobile_b.png index df4c82c..040a77d 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_b.png and b/client/test/golden/goldens/stock_out_form_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_c.png b/client/test/golden/goldens/stock_out_form_mobile_c.png index c69609e..3207392 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_c.png and b/client/test/golden/goldens/stock_out_form_mobile_c.png differ diff --git a/design/prototype/screens/stock-in.js b/design/prototype/screens/stock-in.js index f523443..165c918 100644 --- a/design/prototype/screens/stock-in.js +++ b/design/prototype/screens/stock-in.js @@ -41,7 +41,8 @@ const CUSTOMERS = [ ['c3','喜来登酒店','xilaidengjiudian','xldjd','KH003'],['c4','婚庆批发王','hunqingpifawang','hqpfw','KH004'], ['c5','社区团购站','shequtuangouzhan','sqtgz','KH005'], ].map(a=>({id:a[0],name:a[1],py:a[2],init:a[3],code:a[4]})); -const WAREHOUSES = [{id:'w1',name:'主仓'},{id:'w2',name:'二号仓'},{id:'w3',name:'冷藏库'}]; +// 2026-07-14:w1(主仓) 标记为默认仓(isDefault),新建单据仓库字段据此预填(真实端 Warehouse.isDefault)。 +const WAREHOUSES = [{id:'w1',name:'主仓',isDefault:true},{id:'w2',name:'二号仓'},{id:'w3',name:'冷藏库'}]; const ORIGINS=[['o1','贵州茅台镇'],['o2','四川宜宾'],['o3','四川泸州'],['o4','江苏宿迁'],['o5','山西汾阳'],['o6','安徽亳州']].map(a=>({id:a[0],name:a[1],py:'',init:''})); const SHELF=[['h1','长期'],['h2','36个月'],['h3','24个月'],['h4','18个月']].map(a=>({id:a[0],name:a[1],py:'',init:''})); const STORAGE=[['t1','常温避光'],['t2','阴凉干燥'],['t3','防潮防晒']].map(a=>({id:a[0],name:a[1],py:'',init:''})); @@ -77,7 +78,10 @@ function reqFields(mode){ return editFields(mode).filter(k=>COLDEF[k].req); } /* ---------------- 状态 ---------------- */ let mode='in', status='new'; -const state = { doc:{partner:null,warehouse:null,date:today(),remark:''}, rows:[], docErr:new Set() }; +// 新建单默认填充默认仓库(2026-07-14):isDefault 的仓 优先;无默认时仅剩 1 个仓才取它;否则留空。 +// 编辑模式不受影响(由单据自身仓库回填,此函数只用于「新建」场景的初值)。 +function defaultWarehouseId(){ const def=WAREHOUSES.find(w=>w.isDefault); if(def) return def.id; return WAREHOUSES.length===1?WAREHOUSES[0].id:null; } +const state = { doc:{partner:null,warehouse:defaultWarehouseId(),date:today(),remark:''}, rows:[], docErr:new Set() }; function today(){ const d=new Date(); return d.toISOString().slice(0,10); } function newRow(){ return {id:'r'+(++SEQ), name:null,series:null,spec:null,prodDate:'',batch:'',qty:'1',price:'',sale:'',avail:null,expanded:false,origin:null,shelfLife:null,storage:null,doc:null,_err:new Set()}; } @@ -438,7 +442,7 @@ function discardDraft(){ draftClear(); document.getElementById('noticeSlot').inn /* ---------------- 退出守卫 ---------------- */ function exitGuard(){ if(!isDirty()){ resetForm(); toast('已取消'); return; } openOv('未保存的内容', `
当前${MODES[mode].title}尚未提交。是否保存为草稿,以免内容丢失?
`, [['继续编辑','ghost','closeOv()'],['放弃','danger','discardAndReset()'],['保存草稿','primary','closeOv();doSubmit(true)']]); } function discardAndReset(){ closeOv(); draftClear(); resetForm(); toast('已放弃录入'); } -function resetForm(){ status='new'; state.doc={partner:null,warehouse:null,date:today(),remark:''}; state.docErr.clear(); state.rows=[newRow()]; setDateField(document.getElementById('orderDate'),state.doc.date); document.getElementById('remark').value=''; document.getElementById('noticeSlot').innerHTML=''; renderActions(); syncDocCombos(); syncDocLock(); refreshSummary(); renderDetail(); updateTotals(); } +function resetForm(){ status='new'; state.doc={partner:null,warehouse:defaultWarehouseId(),date:today(),remark:''}; state.docErr.clear(); state.rows=[newRow()]; setDateField(document.getElementById('orderDate'),state.doc.date); document.getElementById('remark').value=''; document.getElementById('noticeSlot').innerHTML=''; renderActions(); syncDocCombos(); syncDocLock(); refreshSummary(); renderDetail(); updateTotals(); } /* ---------------- 模式切换(入库 / 出库镜像)---------------- */ function switchMode(m){ if(m===mode) return; mode=m; status='new'; @@ -448,7 +452,7 @@ function switchMode(m){ if(m===mode) return; mode=m; status='new'; document.getElementById('handlerLabel').textContent=MODES[m].handler; document.querySelector('.dochead-grid .field:nth-child(2) label').innerHTML=(m==='in'?'入库仓库':'出库仓库')+' *'; document.getElementById('kbdHint').style.display = m==='in'?'':''; - state.doc={partner:null,warehouse:null,date:today(),remark:''}; state.docErr.clear(); state.rows=[newRow()]; + state.doc={partner:null,warehouse:defaultWarehouseId(),date:today(),remark:''}; state.docErr.clear(); state.rows=[newRow()]; setDateField(document.getElementById('orderDate'),state.doc.date); document.getElementById('remark').value=''; renderActions(); syncDocCombos(); syncDocLock(); refreshSummary(); renderDetail(); updateTotals(); maybeRestore(); }