优化
This commit is contained in:
@@ -6,7 +6,7 @@ const source = readFileSync(new URL('../src/pages/warehouse-transfer/warehouse-t
|
||||
const script = source.match(/<script>([\s\S]*?)<\/script>/)[1].replace(/^import .+$/gm,'').replace('export default','page =')
|
||||
function setup() {
|
||||
const storage = new Map()
|
||||
const scope = { CartonCountFields:{},PortalHeader:{},ScanTargetInput:{},session:{apiBase:'LOCAL',currentUser:{id:'OP',warehouseId:'WH'}},uni:{getStorageSync:key=>storage.get(key),setStorageSync:(key,value)=>storage.set(key,JSON.parse(JSON.stringify(value))),removeStorageSync:key=>storage.delete(key)} }
|
||||
const scope = { CartonCountFields:{},PortalHeader:{},ScanTargetInput:{},session:{apiBase:'LOCAL',currentUser:{id:'OP',warehouseId:'WH'}},uni:{showModal: options=>options.success({confirm:true}),getStorageSync:key=>storage.get(key),setStorageSync:(key,value)=>storage.set(key,JSON.parse(JSON.stringify(value))),removeStorageSync:key=>storage.delete(key)} }
|
||||
runInNewContext(script,scope)
|
||||
const value = scope.page.data()
|
||||
for(const [key,method] of Object.entries(scope.page.methods)) value[key]=method.bind(value)
|
||||
@@ -15,6 +15,44 @@ function setup() {
|
||||
value.pallets=[{key:'P1',draftId:'P1',palletNo:'PALLET1',generated:true,bound:false}];value.restoreCartons();Object.assign(value.cartonBoxes[0],{length:10,width:20,height:30,weight:2});value.cartonBoxes[0].items[0].quantity=4
|
||||
return {scope,value,storage}
|
||||
}
|
||||
test('deletion needs confirmation and cancel preserves box and measurements',async()=>{
|
||||
const {value,scope}=setup(); let warning;
|
||||
scope.uni.showModal=options=>{warning=options;options.success({confirm:false})};
|
||||
await value.removeCarton(0);
|
||||
assert.equal(value.cartonBoxes.length,1);assert.equal(value.cartonBoxes[0].weight,2);
|
||||
assert.match(warning.content,/不计入本次实收/);assert.equal(warning.confirmText,'确认删除');
|
||||
assert.equal(value.restorableCartons.length,0);assert.equal(value.deletingCarton,false);
|
||||
})
|
||||
|
||||
test('deleted box survives reload and restores original identity, SKU, measurements and pallet',async()=>{
|
||||
const {value}=setup(); await value.removeCarton(0);
|
||||
assert.equal(value.cartonBoxes.length,0);assert.equal(value.restorableCartons.length,1);
|
||||
value.restoreCartons();await value.restoreDeletedCarton();
|
||||
const box=value.cartonBoxes[0];
|
||||
assert.equal(box.cartonMark,'BOX1');assert.equal(box.weight,2);assert.equal(box.items[0].quantity,4);
|
||||
assert.equal(box.transferPalletId,'P1');assert.equal(value.restorableCartons.length,0);
|
||||
assert.equal(value.selected.packageCount,1);assert.equal(value.cartonConfirmed(box),false);
|
||||
})
|
||||
|
||||
test('saved missing box can be restored after reopening count without increasing forecast',async()=>{
|
||||
const {value,scope}=setup();
|
||||
value.selected.cartons[0].status='NOT_RECEIVED';value.selected.cartons[0].countedAt='2026-10-16';
|
||||
value.restoreCartons();assert.equal(value.cartonBoxes.length,0);
|
||||
scope.reopenWarehouseTransferMeasurement=async()=>({...value.selected,cartons:value.selected.cartons.map(box=>({...box,countedAt:null}))});
|
||||
await value.restoreDeletedCarton();
|
||||
assert.equal(value.cartonsCounted,false);assert.equal(value.cartonBoxes[0].cartonMark,'BOX1');
|
||||
assert.equal(value.selected.packageCount,1);assert.equal(value.restorableCartons.length,0);
|
||||
value.cartonBoxes[0].weight=9;value.saveCartonDraft();value.restoreCartons();
|
||||
assert.equal(value.cartonBoxes[0].cartonMark,'BOX1');assert.equal(value.cartonBoxes[0].weight,9);
|
||||
})
|
||||
|
||||
test('previously deleted forecast box without an archive can still be restored',async()=>{
|
||||
const {value}=setup();value.cartonBoxes=[];value.saveCartonDraft();value.restoreCartons();
|
||||
assert.equal(value.restorableCartons.length,1);
|
||||
await value.restoreDeletedCarton();
|
||||
assert.equal(value.cartonBoxes[0].cartonMark,'BOX1');assert.equal(value.selected.packageCount,1);
|
||||
})
|
||||
|
||||
test('summary toggle preserves measurements and volume uses three decimals',()=>{
|
||||
const {value}=setup()
|
||||
assert.equal(value.summaryCollapsed,false)
|
||||
@@ -240,11 +278,11 @@ test('SKU differences compare each SKU and ignore carton count',()=>{
|
||||
})
|
||||
|
||||
// 客户补箱后,新增预报箱进入PDA,原本机草稿和删除标记不丢失。
|
||||
test('forecast additions merge into existing draft without losing edited boxes',()=>{
|
||||
test('forecast additions merge into existing draft without losing edited boxes',async()=>{
|
||||
const {value}=setup();value.cartonBoxes[0].weight=7;value.saveCartonDraft()
|
||||
value.selected.packageCount=2;value.selected.cartons.push({cartonMark:'BOX2',transferItemId:'I1',status:'EXPECTED'})
|
||||
value.restoreCartons();assert.equal(value.cartonBoxes.length,2);assert.equal(value.cartonBoxes[0].weight,7);assert.equal(value.cartonBoxes[1].cartonMark,'BOX2')
|
||||
value.removeCarton(0);value.restoreCartons();assert.equal(value.cartonBoxes.length,1);assert.equal(value.cartonBoxes[0].cartonMark,'BOX2')
|
||||
await value.removeCarton(0);value.restoreCartons();assert.equal(value.cartonBoxes.length,1);assert.equal(value.cartonBoxes[0].cartonMark,'BOX2')
|
||||
})
|
||||
test('count payload carries forecast version for stale snapshot rejection',async()=>{
|
||||
const {value,scope}=setup();let payload
|
||||
|
||||
@@ -4,7 +4,7 @@ import { readFile } from 'node:fs/promises'
|
||||
|
||||
const source = await readFile(new URL('../src/pages/warehouse-transfer/warehouse-transfer.vue', import.meta.url), 'utf8')
|
||||
const script = source.match(/<script>([\s\S]*?)<\/script>/)[1].replace(/^import .+$/gm, '').replace('export default', 'return')
|
||||
const page = new Function('CartonCountFields', 'PortalHeader', 'ScanTargetInput', 'session', script)({}, {}, {}, { currentUser: null })
|
||||
const page = new Function('CartonCountFields', 'PortalHeader', 'ScanTargetInput', 'session', 'uni', script)({}, {}, {}, { currentUser: null }, { showModal: options => options.success({confirm:true}), getStorageSync: key => globalThis.uni?.getStorageSync(key) })
|
||||
function context() {
|
||||
const ctx = { ...page.data(), selected: { transferNo: 'WT1', packageCount: 2, items: [{ id: '1', skuCode: 'A' }, { id: '2', skuCode: 'B' }], cartons: [] }, saveCartonDraft() {} }
|
||||
for (const [name, method] of Object.entries(page.methods)) ctx[name] = method.bind(ctx)
|
||||
@@ -41,10 +41,10 @@ test('single SKU batch changes never overwrite mixed carton contents', () => {
|
||||
assert.equal(ctx.cartonQuantity, 13)
|
||||
})
|
||||
|
||||
test('delete only changes actual draft and preserves forecast; additions keep their own SKU rows', () => {
|
||||
test('delete only changes actual draft and preserves forecast; additions keep their own SKU rows', async () => {
|
||||
const ctx = context()
|
||||
ctx.cartonBoxes = [box(), box('B')]; ctx.batchSelectedIndexes = [1]
|
||||
ctx.removeCarton(0)
|
||||
await ctx.removeCarton(0)
|
||||
assert.equal(ctx.cartonBoxes.length, 1)
|
||||
assert.equal(ctx.selected.packageCount, 2)
|
||||
assert.deepEqual(ctx.batchSelectedIndexes, [])
|
||||
|
||||
Reference in New Issue
Block a user