feat(打包模块): 新增打包单据功能及相关组件
refactor(CoilSelector): 修改change事件返回参数包含完整钢卷信息 chore: 添加打包模块相关图标和API文件 test: 添加打包模块单元测试 docs: 更新打包模块API文档
This commit is contained in:
88
klp-ui/src/api/wms/packing.js
Normal file
88
klp-ui/src/api/wms/packing.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询打包单据列表
|
||||||
|
export function listPacking(query) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询打包单据详细
|
||||||
|
export function getPacking(packingId) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord/' + packingId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增打包单据
|
||||||
|
export function addPacking(data) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改打包单据
|
||||||
|
export function updatePacking(data) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除打包单据
|
||||||
|
export function delPacking(packingId) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord/' + packingId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询打包明细列表
|
||||||
|
export function listPackingDetail(query) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingDetail/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增打包明细
|
||||||
|
export function addPackingDetail(data) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingDetail',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改打包明细
|
||||||
|
export function updatePackingDetail(data) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingDetail',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除打包明细
|
||||||
|
export function delPackingDetail(detailId) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingDetail/' + detailId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建打包单据及明细
|
||||||
|
export function createPacking(data) {
|
||||||
|
return request({
|
||||||
|
url: '/wms/coilPackingRecord/execute',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
288
klp-ui/src/api/wms/packing.test.js
Normal file
288
klp-ui/src/api/wms/packing.test.js
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
/**
|
||||||
|
* 打包模块 API 测试用例
|
||||||
|
* 测试打包单据和明细表相关的 API 接口
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { expect, test, describe, beforeEach, afterEach, jest } from '@jest/globals';
|
||||||
|
|
||||||
|
// Mock request 模块
|
||||||
|
jest.mock('@/utils/request', () => ({
|
||||||
|
default: jest.fn(() => Promise.resolve({ code: 200, data: {} }))
|
||||||
|
}));
|
||||||
|
|
||||||
|
import {
|
||||||
|
listPacking,
|
||||||
|
getPacking,
|
||||||
|
addPacking,
|
||||||
|
updatePacking,
|
||||||
|
delPacking,
|
||||||
|
listPackingDetail,
|
||||||
|
listPackedCoil,
|
||||||
|
addPackingDetail,
|
||||||
|
updatePackingDetail,
|
||||||
|
delPackingDetail,
|
||||||
|
batchAddPackingDetail,
|
||||||
|
getPackingByNo,
|
||||||
|
submitPacking,
|
||||||
|
cancelSubmitPacking
|
||||||
|
} from './packing';
|
||||||
|
|
||||||
|
import request from '@/utils/request';
|
||||||
|
|
||||||
|
describe('Packing API Tests', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('打包单据主表 API', () => {
|
||||||
|
test('listPacking - 查询打包单据列表', () => {
|
||||||
|
const query = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: 'PK20260323001'
|
||||||
|
};
|
||||||
|
|
||||||
|
listPacking(query);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('getPacking - 查询单个打包单据详情', () => {
|
||||||
|
const packingId = '1';
|
||||||
|
|
||||||
|
getPacking(packingId);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/1',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('addPacking - 新增打包单据', () => {
|
||||||
|
const data = {
|
||||||
|
batchNo: 'BATCH001',
|
||||||
|
packingDate: '2026-03-23',
|
||||||
|
team: '甲',
|
||||||
|
operator: '张三',
|
||||||
|
remark: '测试备注'
|
||||||
|
};
|
||||||
|
|
||||||
|
addPacking(data);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('updatePacking - 修改打包单据', () => {
|
||||||
|
const data = {
|
||||||
|
packingId: '1',
|
||||||
|
batchNo: 'BATCH001',
|
||||||
|
packingDate: '2026-03-23',
|
||||||
|
team: '甲',
|
||||||
|
operator: '张三',
|
||||||
|
remark: '修改后的备注'
|
||||||
|
};
|
||||||
|
|
||||||
|
updatePacking(data);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('delPacking - 删除打包单据', () => {
|
||||||
|
const packingId = '1';
|
||||||
|
|
||||||
|
delPacking(packingId);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/1',
|
||||||
|
method: 'delete'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('getPackingByNo - 根据单据号查询打包单据', () => {
|
||||||
|
const packingNo = 'PK20260323001';
|
||||||
|
|
||||||
|
getPackingByNo(packingNo);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/no/PK20260323001',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('submitPacking - 提交打包单据', () => {
|
||||||
|
const packingId = '1';
|
||||||
|
|
||||||
|
submitPacking(packingId);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/submit/1',
|
||||||
|
method: 'post'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('cancelSubmitPacking - 取消提交打包单据', () => {
|
||||||
|
const packingId = '1';
|
||||||
|
|
||||||
|
cancelSubmitPacking(packingId);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/cancelSubmit/1',
|
||||||
|
method: 'post'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('打包明细表 API', () => {
|
||||||
|
test('listPackingDetail - 查询打包明细列表', () => {
|
||||||
|
const query = {
|
||||||
|
packingId: '1',
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20
|
||||||
|
};
|
||||||
|
|
||||||
|
listPackingDetail(query);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packingDetail/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('addPackingDetail - 新增打包明细', () => {
|
||||||
|
const data = {
|
||||||
|
packingId: '1',
|
||||||
|
coilId: '1001',
|
||||||
|
coilNo: '26L0312345',
|
||||||
|
itemName: '镀锌板',
|
||||||
|
specification: '1.0*1000*C',
|
||||||
|
material: 'DX51D+Z',
|
||||||
|
netWeight: 5.5,
|
||||||
|
beforePosition: 'A区01号位',
|
||||||
|
afterPosition: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
addPackingDetail(data);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packingDetail',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('updatePackingDetail - 修改打包明细', () => {
|
||||||
|
const data = {
|
||||||
|
detailId: '1',
|
||||||
|
packingId: '1',
|
||||||
|
afterPosition: 'B区02号位'
|
||||||
|
};
|
||||||
|
|
||||||
|
updatePackingDetail(data);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packingDetail',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('delPackingDetail - 删除打包明细', () => {
|
||||||
|
const detailId = '1';
|
||||||
|
|
||||||
|
delPackingDetail(detailId);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packingDetail/1',
|
||||||
|
method: 'delete'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('batchAddPackingDetail - 批量新增打包明细', () => {
|
||||||
|
const data = [
|
||||||
|
{
|
||||||
|
packingId: '1',
|
||||||
|
coilId: '1001',
|
||||||
|
coilNo: '26L0312345',
|
||||||
|
itemName: '镀锌板',
|
||||||
|
specification: '1.0*1000*C',
|
||||||
|
material: 'DX51D+Z',
|
||||||
|
netWeight: 5.5,
|
||||||
|
beforePosition: 'A区01号位',
|
||||||
|
afterPosition: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
packingId: '1',
|
||||||
|
coilId: '1002',
|
||||||
|
coilNo: '26L0312346',
|
||||||
|
itemName: '镀锌板',
|
||||||
|
specification: '1.0*1000*C',
|
||||||
|
material: 'DX51D+Z',
|
||||||
|
netWeight: 5.2,
|
||||||
|
beforePosition: 'A区02号位',
|
||||||
|
afterPosition: ''
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
batchAddPackingDetail(data);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packingDetail/batch',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('已打包钢卷查询 API', () => {
|
||||||
|
test('listPackedCoil - 查询已打包钢卷列表', () => {
|
||||||
|
const query = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: 'PK20260323001',
|
||||||
|
batchNo: 'BATCH001',
|
||||||
|
coilNo: '26L0312345',
|
||||||
|
team: '甲'
|
||||||
|
};
|
||||||
|
|
||||||
|
listPackedCoil(query);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/packedCoilList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('listPackedCoil - 带日期范围参数查询已打包钢卷', () => {
|
||||||
|
const query = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
params: {
|
||||||
|
beginPackingDate: '2026-03-01',
|
||||||
|
endPackingDate: '2026-03-31'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
listPackedCoil(query);
|
||||||
|
|
||||||
|
expect(request).toHaveBeenCalledWith({
|
||||||
|
url: '/wms/packing/packedCoilList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
1
klp-ui/src/assets/icons/svg/packing.svg
Normal file
1
klp-ui/src/assets/icons/svg/packing.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1774233338203" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5413" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M966.208 246.752L534.144 21.408a47.968 47.968 0 0 0-44.128-0.128L58.08 243.136A47.968 47.968 0 0 0 32 285.824V744.64c0 18.208 10.304 34.848 26.592 42.976l432 215.36a48 48 0 0 0 42.816 0l432-215.36A48 48 0 0 0 992 744.672V289.344c0-17.92-9.952-34.304-25.792-42.592zM508.384 463.68l-162.176-79.808 367.36-196.704 158.4 82.624-363.584 193.888z m3.488-381.696l132.992 69.376-369.312 197.76-144.896-71.328 381.216-195.808zM96 332.096l153.216 75.392v168.256a32 32 0 0 0 64 0v-136.736L480 521.024v405.184L96 734.752V332.096z m448 594.112V517.184l384-204.736v422.304l-384 191.456z" p-id="5414"></path></svg>
|
||||||
|
After Width: | Height: | Size: 932 B |
@@ -318,7 +318,7 @@ export default {
|
|||||||
// 同步到v-model
|
// 同步到v-model
|
||||||
if (this.useTrigger && val.coilId) {
|
if (this.useTrigger && val.coilId) {
|
||||||
this.$emit('input', val.coilId);
|
this.$emit('input', val.coilId);
|
||||||
this.$emit('change', val.coilId);
|
this.$emit('change', val.coilId, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -529,7 +529,7 @@ export default {
|
|||||||
// 触发器模式下,支持v-model双向绑定
|
// 触发器模式下,支持v-model双向绑定
|
||||||
if (this.useTrigger) {
|
if (this.useTrigger) {
|
||||||
this.$emit('input', row.coilId);
|
this.$emit('input', row.coilId);
|
||||||
this.$emit('change', row.coilId); // 兼容v-model的change事件
|
this.$emit('change', row.coilId, row); // 兼容v-model的change事件
|
||||||
}
|
}
|
||||||
// 选择后关闭对话框
|
// 选择后关闭对话框
|
||||||
this.handleClose();
|
this.handleClose();
|
||||||
@@ -540,7 +540,7 @@ export default {
|
|||||||
this.selectedCoil = null;
|
this.selectedCoil = null;
|
||||||
this.selectedCoils = []; // 清空多选数据
|
this.selectedCoils = []; // 清空多选数据
|
||||||
this.$emit('input', '');
|
this.$emit('input', '');
|
||||||
this.$emit('change', '');
|
this.$emit('change', '', null); // 兼容v-model的change事件
|
||||||
this.$emit('clear', true); // 触发清除事件
|
this.$emit('clear', true); // 触发清除事件
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ export default {
|
|||||||
qrcode: false,
|
qrcode: false,
|
||||||
querys: {
|
querys: {
|
||||||
dataType: 1,
|
dataType: 1,
|
||||||
materialType: '成品',
|
// materialType: '成品',
|
||||||
itemType: 'product',
|
// itemType: 'product',
|
||||||
status: 0
|
status: 0
|
||||||
},
|
},
|
||||||
labelType: '3',
|
labelType: '3',
|
||||||
|
|||||||
29
klp-ui/src/views/wms/packing/coil.vue
Normal file
29
klp-ui/src/views/wms/packing/coil.vue
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<BasePage :qrcode="qrcode" :querys="querys" :labelType="labelType" :hideType="hideType" :showAbnormal="showAbnormal" :showControl="showControl" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import BasePage from '@/views/wms/coil/panels/base.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
BasePage
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
querys: {
|
||||||
|
dataType: 1,
|
||||||
|
// orderByAbnormal: true,
|
||||||
|
warehouseId: '2035892198703349761'
|
||||||
|
// 筛选异常数量大于等于1的
|
||||||
|
// minAbnormalCount: 1
|
||||||
|
},
|
||||||
|
labelType: '2',
|
||||||
|
qrcode: false,
|
||||||
|
hideType: false,
|
||||||
|
showAbnormal: false,
|
||||||
|
showControl: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
389
klp-ui/src/views/wms/packing/packing.test.js
Normal file
389
klp-ui/src/views/wms/packing/packing.test.js
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
/**
|
||||||
|
* 打包模块页面测试用例
|
||||||
|
* 测试打包单据创建、查询和修正功能
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { expect, test, describe, beforeEach, afterEach, jest } from '@jest/globals';
|
||||||
|
|
||||||
|
// Mock Element UI 组件
|
||||||
|
jest.mock('element-ui', () => ({
|
||||||
|
Button: jest.fn(),
|
||||||
|
Form: jest.fn(),
|
||||||
|
FormItem: jest.fn(),
|
||||||
|
Input: jest.fn(),
|
||||||
|
Select: jest.fn(),
|
||||||
|
Option: jest.fn(),
|
||||||
|
DatePicker: jest.fn(),
|
||||||
|
Table: jest.fn(),
|
||||||
|
TableColumn: jest.fn(),
|
||||||
|
Dialog: jest.fn(),
|
||||||
|
Descriptions: jest.fn(),
|
||||||
|
DescriptionsItem: jest.fn(),
|
||||||
|
Tag: jest.fn(),
|
||||||
|
Message: {
|
||||||
|
success: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
error: jest.fn(),
|
||||||
|
info: jest.fn()
|
||||||
|
},
|
||||||
|
MessageBox: {
|
||||||
|
confirm: jest.fn(() => Promise.resolve())
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Mock Vue Router
|
||||||
|
jest.mock('vue-router', () => ({
|
||||||
|
useRouter: jest.fn(() => ({
|
||||||
|
push: jest.fn(),
|
||||||
|
query: {}
|
||||||
|
})),
|
||||||
|
useRoute: jest.fn(() => ({
|
||||||
|
query: {}
|
||||||
|
}))
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Mock API
|
||||||
|
jest.mock('@/api/wms/packing', () => ({
|
||||||
|
addPacking: jest.fn(() => Promise.resolve({ code: 200, data: { packingId: '1', packingNo: 'PK20260323001' } })),
|
||||||
|
updatePacking: jest.fn(() => Promise.resolve({ code: 200 })),
|
||||||
|
listPacking: jest.fn(() => Promise.resolve({ code: 200, rows: [], total: 0 })),
|
||||||
|
getPacking: jest.fn(() => Promise.resolve({ code: 200, data: {} })),
|
||||||
|
delPacking: jest.fn(() => Promise.resolve({ code: 200 })),
|
||||||
|
listPackingDetail: jest.fn(() => Promise.resolve({ code: 200, rows: [], total: 0 })),
|
||||||
|
updatePackingDetail: jest.fn(() => Promise.resolve({ code: 200 })),
|
||||||
|
delPackingDetail: jest.fn(() => Promise.resolve({ code: 200 })),
|
||||||
|
batchAddPackingDetail: jest.fn(() => Promise.resolve({ code: 200 }))
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Mock CoilSelector 组件
|
||||||
|
jest.mock('@/components/CoilSelector', () => ({
|
||||||
|
name: 'CoilSelector',
|
||||||
|
props: ['multiple', 'filters', 'disableO', 'dialogWidth', 'useTrigger'],
|
||||||
|
template: '<div class="coil-selector-mock"></div>'
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Mock CurrentCoilNo 组件
|
||||||
|
jest.mock('@/components/KLPService/Renderer/CurrentCoilNo', () => ({
|
||||||
|
name: 'CurrentCoilNo',
|
||||||
|
props: ['currentCoilNo'],
|
||||||
|
template: '<span>{{ currentCoilNo }}</span>'
|
||||||
|
}));
|
||||||
|
|
||||||
|
import { addPacking, updatePacking, listPacking, listPackingDetail, updatePackingDetail, delPackingDetail, batchAddPackingDetail } from '@/api/wms/packing';
|
||||||
|
|
||||||
|
describe('Packing Module Tests', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('创建打包单据 (packing.vue) 功能测试', () => {
|
||||||
|
test('初始化表单数据', () => {
|
||||||
|
// 测试表单初始数据结构
|
||||||
|
const initialForm = {
|
||||||
|
packingNo: '',
|
||||||
|
batchNo: '',
|
||||||
|
packingDate: expect.any(String),
|
||||||
|
team: '',
|
||||||
|
operator: '',
|
||||||
|
remark: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(initialForm).toHaveProperty('packingNo');
|
||||||
|
expect(initialForm).toHaveProperty('batchNo');
|
||||||
|
expect(initialForm).toHaveProperty('packingDate');
|
||||||
|
expect(initialForm).toHaveProperty('team');
|
||||||
|
expect(initialForm).toHaveProperty('operator');
|
||||||
|
expect(initialForm).toHaveProperty('remark');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('验证表单必填项', () => {
|
||||||
|
const rules = {
|
||||||
|
batchNo: [{ required: true, message: '批次号不能为空', trigger: 'blur' }],
|
||||||
|
packingDate: [{ required: true, message: '打包日期不能为空', trigger: 'change' }]
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(rules.batchNo).toHaveLength(1);
|
||||||
|
expect(rules.batchNo[0].required).toBe(true);
|
||||||
|
expect(rules.packingDate).toHaveLength(1);
|
||||||
|
expect(rules.packingDate[0].required).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('计算总重量', () => {
|
||||||
|
const detailList = [
|
||||||
|
{ netWeight: 5.5 },
|
||||||
|
{ netWeight: 5.2 },
|
||||||
|
{ netWeight: 4.8 }
|
||||||
|
];
|
||||||
|
|
||||||
|
const totalWeight = detailList.reduce((acc, item) => acc + Number(item.netWeight || 0), 0).toFixed(3);
|
||||||
|
|
||||||
|
expect(totalWeight).toBe('15.500');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('计算已填位置的明细数量', () => {
|
||||||
|
const detailList = [
|
||||||
|
{ afterPosition: 'A区01号位' },
|
||||||
|
{ afterPosition: '' },
|
||||||
|
{ afterPosition: 'B区02号位' }
|
||||||
|
];
|
||||||
|
|
||||||
|
const filledCount = detailList.filter(item => item.afterPosition).length;
|
||||||
|
|
||||||
|
expect(filledCount).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('批量添加钢卷数据转换', () => {
|
||||||
|
const coils = [
|
||||||
|
{
|
||||||
|
coilId: '1001',
|
||||||
|
currentCoilNo: '26L0312345',
|
||||||
|
itemName: '镀锌板',
|
||||||
|
itemSpecification: '1.0*1000*C',
|
||||||
|
itemMaterial: 'DX51D+Z',
|
||||||
|
netWeight: 5.5,
|
||||||
|
actualWarehouseName: 'A区01号位'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const packingId = '1';
|
||||||
|
const payload = coils.map(coil => ({
|
||||||
|
packingId: packingId,
|
||||||
|
coilId: coil.coilId,
|
||||||
|
coilNo: coil.currentCoilNo,
|
||||||
|
itemName: coil.itemName,
|
||||||
|
specification: coil.itemSpecification,
|
||||||
|
material: coil.itemMaterial,
|
||||||
|
netWeight: coil.netWeight,
|
||||||
|
beforePosition: coil.actualWarehouseName || '',
|
||||||
|
afterPosition: ''
|
||||||
|
}));
|
||||||
|
|
||||||
|
expect(payload[0]).toEqual({
|
||||||
|
packingId: '1',
|
||||||
|
coilId: '1001',
|
||||||
|
coilNo: '26L0312345',
|
||||||
|
itemName: '镀锌板',
|
||||||
|
specification: '1.0*1000*C',
|
||||||
|
material: 'DX51D+Z',
|
||||||
|
netWeight: 5.5,
|
||||||
|
beforePosition: 'A区01号位',
|
||||||
|
afterPosition: ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('格式化日期函数', () => {
|
||||||
|
const formatDate = (date) => {
|
||||||
|
const y = date.getFullYear();
|
||||||
|
const m = String(date.getMonth() + 1).padStart(2, '0');
|
||||||
|
const d = String(date.getDate()).padStart(2, '0');
|
||||||
|
return `${y}-${m}-${d}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const testDate = new Date('2026-03-23');
|
||||||
|
const formatted = formatDate(testDate);
|
||||||
|
|
||||||
|
expect(formatted).toBe('2026-03-23');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('重置表单数据', () => {
|
||||||
|
const formatDate = (date) => {
|
||||||
|
const y = date.getFullYear();
|
||||||
|
const m = String(date.getMonth() + 1).padStart(2, '0');
|
||||||
|
const d = String(date.getDate()).padStart(2, '0');
|
||||||
|
return `${y}-${m}-${d}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetForm = () => {
|
||||||
|
return {
|
||||||
|
packingNo: '',
|
||||||
|
batchNo: '',
|
||||||
|
packingDate: formatDate(new Date()),
|
||||||
|
team: '',
|
||||||
|
operator: '',
|
||||||
|
remark: ''
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetData = resetForm();
|
||||||
|
|
||||||
|
expect(resetData.packingNo).toBe('');
|
||||||
|
expect(resetData.batchNo).toBe('');
|
||||||
|
expect(resetData.team).toBe('');
|
||||||
|
expect(resetData.operator).toBe('');
|
||||||
|
expect(resetData.remark).toBe('');
|
||||||
|
expect(resetData.packingDate).toMatch(/^\d{4}-\d{2}-\d{2}$/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('查询已打包钢卷 (coil.vue) 功能测试', () => {
|
||||||
|
test('查询参数结构', () => {
|
||||||
|
const queryParams = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: 'PK20260323001',
|
||||||
|
batchNo: 'BATCH001',
|
||||||
|
coilNo: '26L0312345',
|
||||||
|
team: '甲',
|
||||||
|
itemName: '镀锌板'
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(queryParams).toHaveProperty('pageNum');
|
||||||
|
expect(queryParams).toHaveProperty('pageSize');
|
||||||
|
expect(queryParams.pageNum).toBe(1);
|
||||||
|
expect(queryParams.pageSize).toBe(20);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('日期范围查询参数处理', () => {
|
||||||
|
const dateRange = ['2026-03-01', '2026-03-31'];
|
||||||
|
const params = {};
|
||||||
|
|
||||||
|
if (dateRange && dateRange.length === 2) {
|
||||||
|
params.params = {
|
||||||
|
beginPackingDate: dateRange[0],
|
||||||
|
endPackingDate: dateRange[1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(params.params).toEqual({
|
||||||
|
beginPackingDate: '2026-03-01',
|
||||||
|
endPackingDate: '2026-03-31'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('计算列表总卷数', () => {
|
||||||
|
const total = 10;
|
||||||
|
const totalCoilCount = total;
|
||||||
|
|
||||||
|
expect(totalCoilCount).toBe(10);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('计算列表总重量', () => {
|
||||||
|
const coilList = [
|
||||||
|
{ netWeight: 5.5 },
|
||||||
|
{ netWeight: 5.2 },
|
||||||
|
{ netWeight: 4.8 }
|
||||||
|
];
|
||||||
|
|
||||||
|
const totalWeight = coilList.reduce((acc, item) => acc + Number(item.netWeight || 0), 0).toFixed(3);
|
||||||
|
|
||||||
|
expect(totalWeight).toBe('15.500');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('重置查询参数', () => {
|
||||||
|
const resetQuery = () => {
|
||||||
|
return {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: null,
|
||||||
|
batchNo: null,
|
||||||
|
coilNo: null,
|
||||||
|
team: null,
|
||||||
|
itemName: null
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetParams = resetQuery();
|
||||||
|
|
||||||
|
expect(resetParams.packingNo).toBeNull();
|
||||||
|
expect(resetParams.batchNo).toBeNull();
|
||||||
|
expect(resetParams.coilNo).toBeNull();
|
||||||
|
expect(resetParams.team).toBeNull();
|
||||||
|
expect(resetParams.itemName).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('查看和修正打包单据 (record.vue) 功能测试', () => {
|
||||||
|
test('修正模式切换', () => {
|
||||||
|
let isEditMode = false;
|
||||||
|
|
||||||
|
const handleStartEdit = () => {
|
||||||
|
isEditMode = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
handleStartEdit();
|
||||||
|
|
||||||
|
expect(isEditMode).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('对话框标题根据模式变化', () => {
|
||||||
|
const getDialogTitle = (isEditMode) => {
|
||||||
|
return isEditMode ? '修正打包单据' : '打包单据详情';
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getDialogTitle(false)).toBe('打包单据详情');
|
||||||
|
expect(getDialogTitle(true)).toBe('修正打包单据');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('全屏模式切换', () => {
|
||||||
|
let isFullscreen = false;
|
||||||
|
|
||||||
|
const toggleFullscreen = () => {
|
||||||
|
isFullscreen = !isFullscreen;
|
||||||
|
};
|
||||||
|
|
||||||
|
toggleFullscreen();
|
||||||
|
expect(isFullscreen).toBe(true);
|
||||||
|
|
||||||
|
toggleFullscreen();
|
||||||
|
expect(isFullscreen).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('编辑表单验证规则', () => {
|
||||||
|
const editRules = {
|
||||||
|
batchNo: [{ required: true, message: '批次号不能为空', trigger: 'blur' }],
|
||||||
|
packingDate: [{ required: true, message: '打包日期不能为空', trigger: 'change' }]
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(editRules.batchNo[0].required).toBe(true);
|
||||||
|
expect(editRules.packingDate[0].required).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('保存明细修改数据结构', () => {
|
||||||
|
const row = {
|
||||||
|
detailId: '1',
|
||||||
|
packingId: '1',
|
||||||
|
afterPosition: 'B区02号位'
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(row).toHaveProperty('detailId');
|
||||||
|
expect(row).toHaveProperty('packingId');
|
||||||
|
expect(row).toHaveProperty('afterPosition');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('钢卷选择器筛选参数', () => {
|
||||||
|
test('钢卷选择器筛选条件', () => {
|
||||||
|
const coilFilters = {
|
||||||
|
dataType: 1,
|
||||||
|
status: 0,
|
||||||
|
selectType: 'product'
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(coilFilters.dataType).toBe(1);
|
||||||
|
expect(coilFilters.status).toBe(0);
|
||||||
|
expect(coilFilters.selectType).toBe('product');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('分页功能', () => {
|
||||||
|
test('分页参数结构', () => {
|
||||||
|
const pagination = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(pagination.pageNum).toBe(1);
|
||||||
|
expect(pagination.pageSize).toBe(20);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('重置分页到第一页', () => {
|
||||||
|
const handleQuery = () => {
|
||||||
|
return { pageNum: 1, pageSize: 20 };
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = handleQuery();
|
||||||
|
|
||||||
|
expect(result.pageNum).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
441
klp-ui/src/views/wms/packing/packing.vue
Normal file
441
klp-ui/src/views/wms/packing/packing.vue
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<!-- 左侧:打包表单和明细 -->
|
||||||
|
<el-col :span="15">
|
||||||
|
<div class="section-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<h3 class="section-title">创建打包单据</h3>
|
||||||
|
<div class="header-actions">
|
||||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">保存单据</el-button>
|
||||||
|
<el-button @click="resetForm">重置</el-button>
|
||||||
|
<coil-selector dialog-width="1200px" :use-trigger="true" multiple :multiple="true" :filters="coilFilters"
|
||||||
|
:disableO="true" @confirm="handleBatchAddCoil">
|
||||||
|
<el-button type="primary" plain icon="el-icon-plus" size="small">批量添加钢卷</el-button>
|
||||||
|
</coil-selector>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="100px" style="margin-bottom: 20px;">
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="单据号" prop="packingNo">
|
||||||
|
<el-input v-model="form.packingNo" placeholder="系统自动生成" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="批次号" prop="batchNo">
|
||||||
|
<el-input v-model="form.batchNo" placeholder="请输入批次号" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="打包时间" prop="packingTime">
|
||||||
|
<el-date-picker v-model="form.packingTime" type="datetime" placeholder="选择打包时间"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="操作人" prop="packingBy">
|
||||||
|
<el-input v-model="form.packingBy" placeholder="请输入操作人" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="备注" prop="remark">
|
||||||
|
<el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<div class="section-header" style="margin-top: 20px;">
|
||||||
|
<h3 class="section-title">打包明细</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table v-loading="detailLoading" :data="detailList" border style="width: 100%" max-height="400">
|
||||||
|
<el-table-column label="序号" type="index" width="55" align="center" />
|
||||||
|
<el-table-column label="钢卷号" align="center" prop="coilNo" min-width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<current-coil-no :current-coil-no="scope.row.coilNo" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="产品类型" align="center" width="250">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<ProductInfo v-if="scope.row.itemType == 'product'" :product="scope.row.product" />
|
||||||
|
<RawMaterialInfo v-else-if="scope.row.itemType === 'raw_material'" :material="scope.row.rawMaterial" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<!-- <el-table-column label="品名" align="center" prop="itemName" min-width="100" />
|
||||||
|
<el-table-column label="规格" align="center" prop="specification" min-width="120" show-overflow-tooltip />
|
||||||
|
<el-table-column label="材质" align="center" prop="material" min-width="80" /> -->
|
||||||
|
<el-table-column label="重量" align="center" prop="coilNetWeight" width="80">
|
||||||
|
<template slot-scope="scope">{{ scope.row.coilNetWeight }}t</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="销售名称" align="center" prop="saleName" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input v-model="scope.row.saleName"></el-input>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="打包前位置" align="center" prop="fromWarehouseName" min-width="120"
|
||||||
|
show-overflow-tooltip />
|
||||||
|
<!-- <el-table-column label="打包后位置" align="center" prop="toWarehouseName" min-width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input v-if="scope.row.editing" v-model="scope.row.toWarehouseName" size="mini" placeholder="输入位置" />
|
||||||
|
<span v-else>{{ scope.row.toWarehouseName || '—' }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column> -->
|
||||||
|
<el-table-column label="操作" align="center" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<template v-if="scope.row.editing">
|
||||||
|
<el-button size="mini" type="text" @click="handleSaveDetail(scope.row)">保存</el-button>
|
||||||
|
<el-button size="mini" type="text" @click="scope.row.editing = false">取消</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<!-- <el-button size="mini" type="text" @click="handleEditDetail(scope.row)">修改</el-button> -->
|
||||||
|
<el-button size="mini" type="text" @click="handleDeleteDetail(scope.row)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<div v-if="detailList.length > 0" class="detail-summary">
|
||||||
|
<el-descriptions :column="3" size="small" border>
|
||||||
|
<el-descriptions-item label="总卷数">
|
||||||
|
{{ detailList.length }} 卷
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="总重量">
|
||||||
|
{{ totalWeight }} 吨
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<!-- 右侧:最近创建的打包单据 -->
|
||||||
|
<el-col :span="9">
|
||||||
|
<div class="section-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<h3 class="section-title">最近创建的单据</h3>
|
||||||
|
<el-button size="mini" icon="el-icon-refresh" @click="getRecentList">刷新</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table v-loading="recentLoading" :data="recentList" border style="width: 100%">
|
||||||
|
<el-table-column label="单据号" align="center" prop="packingNo" show-overflow-tooltip />
|
||||||
|
<el-table-column label="批次号" align="center" prop="batchNo" show-overflow-tooltip />
|
||||||
|
<el-table-column label="打包日期" align="center" prop="packingTime" />
|
||||||
|
<el-table-column label="卷数" align="center" prop="coilCount" width="60" />
|
||||||
|
<el-table-column label="总重" align="center" prop="totalNetWeight" width="80">
|
||||||
|
<template slot-scope="scope">{{ scope.row.totalNetWeight }}t</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { addPacking, updatePacking, listPacking, listPackingDetail, updatePackingDetail, delPackingDetail, batchAddPackingDetail, createPacking } from '@/api/wms/packing';
|
||||||
|
import CoilSelector from '@/components/CoilSelector';
|
||||||
|
import ProductInfo from "@/components/KLPService/Renderer/ProductInfo";
|
||||||
|
import RawMaterialInfo from "@/components/KLPService/Renderer/RawMaterialInfo";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'PackingCreate',
|
||||||
|
dicts: [],
|
||||||
|
components: {
|
||||||
|
CoilSelector,
|
||||||
|
ProductInfo,
|
||||||
|
RawMaterialInfo
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 表单参数
|
||||||
|
form: {
|
||||||
|
packingNo: '',
|
||||||
|
batchNo: '',
|
||||||
|
packingDate: '',
|
||||||
|
team: '',
|
||||||
|
packingBy: '',
|
||||||
|
remark: ''
|
||||||
|
},
|
||||||
|
// 当前正在编辑的打包单据ID
|
||||||
|
currentPackingId: null,
|
||||||
|
// 打包明细列表
|
||||||
|
detailList: [],
|
||||||
|
// 最近创建的单据列表
|
||||||
|
recentList: [],
|
||||||
|
// 按钮loading
|
||||||
|
buttonLoading: false,
|
||||||
|
// 明细loading
|
||||||
|
detailLoading: false,
|
||||||
|
// 最近列表loading
|
||||||
|
recentLoading: false,
|
||||||
|
// 表单校验
|
||||||
|
rules: {
|
||||||
|
batchNo: [
|
||||||
|
{ required: true, message: '批次号不能为空', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
packingDate: [
|
||||||
|
{ required: true, message: '打包日期不能为空', trigger: 'change' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// 钢卷选择器筛选参数
|
||||||
|
coilFilters: {
|
||||||
|
dataType: 1,
|
||||||
|
status: 0,
|
||||||
|
selectType: 'product',
|
||||||
|
excludePacked: true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
// 总重量
|
||||||
|
totalWeight() {
|
||||||
|
return this.detailList.reduce((acc, item) => acc + Number(item.coilNetWeight || 0), 0).toFixed(3);
|
||||||
|
},
|
||||||
|
// 已填位置的明细数量
|
||||||
|
filledPositionCount() {
|
||||||
|
return this.detailList.filter(item => item.afterPosition).length;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
// 默认设置为今天
|
||||||
|
this.form.packingDate = this.formatDate(new Date());
|
||||||
|
// 设置打包时间默认值为当前时间
|
||||||
|
const now = new Date();
|
||||||
|
const year = now.getFullYear();
|
||||||
|
const month = String(now.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(now.getDate()).padStart(2, '0');
|
||||||
|
const hour = String(now.getHours()).padStart(2, '0');
|
||||||
|
const minute = String(now.getMinutes()).padStart(2, '0');
|
||||||
|
const second = String(now.getSeconds()).padStart(2, '0');
|
||||||
|
this.form.packingTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
|
||||||
|
// 自动生成单据号和批次号,格式为yyyyMMddHHmm
|
||||||
|
const code = `${year}${month}${day}${hour}${minute}`;
|
||||||
|
this.form.packingNo = code;
|
||||||
|
this.form.batchNo = code;
|
||||||
|
// 设置操作人默认值为当前登录用户
|
||||||
|
this.form.packingBy = this.$store.getters.nickName;
|
||||||
|
this.getRecentList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 格式化日期 */
|
||||||
|
formatDate(date) {
|
||||||
|
const y = date.getFullYear();
|
||||||
|
const m = String(date.getMonth() + 1).padStart(2, '0');
|
||||||
|
const d = String(date.getDate()).padStart(2, '0');
|
||||||
|
return `${y}-${m}-${d}`;
|
||||||
|
},
|
||||||
|
/** 提交表单 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs['form'].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
if (this.detailList.length === 0) {
|
||||||
|
this.$modal.msgWarning('请添加打包明细');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.buttonLoading = true;
|
||||||
|
const data = {
|
||||||
|
...this.form,
|
||||||
|
totalNetWeight: this.totalWeight,
|
||||||
|
details: this.detailList
|
||||||
|
};
|
||||||
|
createPacking(data).then(response => {
|
||||||
|
this.$modal.msgSuccess('创建成功');
|
||||||
|
this.form.packingNo = response.data.packingNo;
|
||||||
|
this.getRecentList();
|
||||||
|
this.resetForm();
|
||||||
|
}).finally(() => {
|
||||||
|
this.buttonLoading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 重置表单 */
|
||||||
|
resetForm() {
|
||||||
|
// 自动生成新的单据号和批次号,格式为yyyyMMddHHmm
|
||||||
|
const now = new Date();
|
||||||
|
const year = now.getFullYear();
|
||||||
|
const month = String(now.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(now.getDate()).padStart(2, '0');
|
||||||
|
const hour = String(now.getHours()).padStart(2, '0');
|
||||||
|
const minute = String(now.getMinutes()).padStart(2, '0');
|
||||||
|
const second = String(now.getSeconds()).padStart(2, '0');
|
||||||
|
const code = `${year}${month}${day}${hour}${minute}`;
|
||||||
|
|
||||||
|
this.form = {
|
||||||
|
packingNo: code,
|
||||||
|
batchNo: code,
|
||||||
|
packingDate: this.formatDate(new Date()),
|
||||||
|
packingTime: `${year}-${month}-${day} ${hour}:${minute}:${second}`,
|
||||||
|
packingBy: this.$store.getters.nickName,
|
||||||
|
remark: ''
|
||||||
|
};
|
||||||
|
this.currentPackingId = null;
|
||||||
|
this.detailList = [];
|
||||||
|
this.$refs.form.resetFields();
|
||||||
|
},
|
||||||
|
/** 批量添加钢卷 */
|
||||||
|
handleBatchAddCoil(coils) {
|
||||||
|
const newCoils = coils.map(coil => ({
|
||||||
|
coilId: coil.coilId,
|
||||||
|
coilNo: coil.currentCoilNo,
|
||||||
|
itemName: coil.itemName,
|
||||||
|
specification: coil.specification,
|
||||||
|
material: coil.material,
|
||||||
|
coilNetWeight: coil.netWeight || '',
|
||||||
|
coilGrossWeight: coil.grossWeight || '0.000',
|
||||||
|
fromWarehouseId: coil.warehouseId || '',
|
||||||
|
fromWarehouseName: coil.warehouseName || '',
|
||||||
|
itemType: coil.itemType || '',
|
||||||
|
itemId: coil.itemId || '',
|
||||||
|
product: coil.product || {},
|
||||||
|
rawMaterial: coil.rawMaterial || {},
|
||||||
|
// beforePosition: coil.actualWarehouseName || '',
|
||||||
|
toWarehouseId: '2035892198703349761',
|
||||||
|
toWarehouseName: '打包待发货'
|
||||||
|
}));
|
||||||
|
this.detailList = [...this.detailList, ...newCoils];
|
||||||
|
this.$modal.msgSuccess('添加成功');
|
||||||
|
},
|
||||||
|
/** 获取明细列表 */
|
||||||
|
getDetailList() {
|
||||||
|
if (!this.currentPackingId) return;
|
||||||
|
this.detailLoading = true;
|
||||||
|
listPackingDetail({ packingId: this.currentPackingId }).then(response => {
|
||||||
|
this.detailList = response.rows || [];
|
||||||
|
}).finally(() => {
|
||||||
|
this.detailLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 编辑明细 */
|
||||||
|
handleEditDetail(row) {
|
||||||
|
this.$set(row, 'editing', true);
|
||||||
|
this.$set(row, 'afterPositionBackup', row.afterPosition);
|
||||||
|
},
|
||||||
|
/** 保存明细修改 */
|
||||||
|
handleSaveDetail(row) {
|
||||||
|
this.detailLoading = true;
|
||||||
|
updatePackingDetail(row).then(response => {
|
||||||
|
this.$modal.msgSuccess('保存成功');
|
||||||
|
row.editing = false;
|
||||||
|
this.getDetailList();
|
||||||
|
}).catch(() => {
|
||||||
|
this.detailLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 删除明细 */
|
||||||
|
handleDeleteDetail(row) {
|
||||||
|
// 前端删除,根据coilId删除所有相关明细
|
||||||
|
this.detailList = this.detailList.filter(item => item.coilId !== row.coilId);
|
||||||
|
// this.$modal.confirm('确认删除该钢卷明细吗?').then(() => {
|
||||||
|
// return delPackingDetail(row.detailId);
|
||||||
|
// }).then(() => {
|
||||||
|
// this.$modal.msgSuccess('删除成功');
|
||||||
|
// this.getDetailList();
|
||||||
|
// }).catch(() => { });
|
||||||
|
},
|
||||||
|
/** 获取最近创建的单据列表 */
|
||||||
|
getRecentList() {
|
||||||
|
this.recentLoading = true;
|
||||||
|
listPacking({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
orderByColumn: 'createTime',
|
||||||
|
isAsc: 'desc'
|
||||||
|
}).then(response => {
|
||||||
|
this.recentList = response.rows || [];
|
||||||
|
}).finally(() => {
|
||||||
|
this.recentLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 查看单据详情 */
|
||||||
|
handleViewDetail(row) {
|
||||||
|
this.$router.push({
|
||||||
|
path: '/wms/packing/record',
|
||||||
|
query: { packingId: row.packingId }
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 继续编辑单据 */
|
||||||
|
handleContinueEdit(row) {
|
||||||
|
this.currentPackingId = row.packingId;
|
||||||
|
this.form.packingNo = row.packingNo;
|
||||||
|
this.form.batchNo = row.batchNo;
|
||||||
|
this.form.packingDate = row.packingDate;
|
||||||
|
this.form.team = row.team;
|
||||||
|
this.form.operator = row.operator;
|
||||||
|
this.form.remark = row.remark;
|
||||||
|
this.getDetailList();
|
||||||
|
this.$message.success('已加载单据,请继续编辑');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.app-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-card {
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #e4e7ed;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
border-bottom: 2px solid #e4e7ed;
|
||||||
|
|
||||||
|
.section-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
|
||||||
|
.tip-text {
|
||||||
|
font-size: 13px;
|
||||||
|
color: #909399;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 12px;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-tips {
|
||||||
|
text-align: center;
|
||||||
|
padding: 60px 20px;
|
||||||
|
color: #909399;
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
display: block;
|
||||||
|
color: #e6a23c;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-summary {
|
||||||
|
margin-top: 16px;
|
||||||
|
padding: 12px;
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
458
klp-ui/src/views/wms/packing/record.vue
Normal file
458
klp-ui/src/views/wms/packing/record.vue
Normal file
@@ -0,0 +1,458 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<!-- 搜索区域 -->
|
||||||
|
<div class="search-card">
|
||||||
|
<el-form :model="queryParams" inline class="query-form">
|
||||||
|
<el-form-item label="单据号">
|
||||||
|
<el-input v-model="queryParams.packingNo" placeholder="请输入单据号" clearable style="width: 180px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="批次号">
|
||||||
|
<el-input v-model="queryParams.batchNo" placeholder="请输入批次号" clearable style="width: 180px" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="打包日期">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="dateRange"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
style="width: 260px"
|
||||||
|
/>
|
||||||
|
</el-form-item> -->
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
|
||||||
|
<el-button type="success" icon="el-icon-plus" size="small" @click="handleCreate">新建单据</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 打包单据列表 -->
|
||||||
|
<div class="table-card">
|
||||||
|
<el-table v-loading="loading" :data="packingList" border style="width: 100%" @row-click="handleRowClick"
|
||||||
|
:row-class-name="rowClassName">
|
||||||
|
<el-table-column type="index" label="序号" width="55" align="center" />
|
||||||
|
<el-table-column label="单据号" align="center" prop="packingNo">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-link type="primary">{{ scope.row.packingNo }}</el-link>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="批次号" align="center" prop="batchNo" />
|
||||||
|
<el-table-column label="打包日期" align="center" prop="packingTime" />
|
||||||
|
<el-table-column label="操作人" align="center" prop="packingBy" />
|
||||||
|
<el-table-column label="卷数" align="center" prop="coilCount" />
|
||||||
|
<el-table-column label="总重" align="center" prop="totalNetWeight">
|
||||||
|
<template slot-scope="scope">{{ scope.row.totalNetWeight }}t</template>
|
||||||
|
</el-table-column>
|
||||||
|
<!-- <el-table-column label="创建时间" align="center" prop="createTime" width="150" />
|
||||||
|
<el-table-column label="备注" align="center" prop="remark" min-width="150" show-overflow-tooltip /> -->
|
||||||
|
<el-table-column label="操作" align="center" width="200">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button size="mini" type="text" @click="handleViewDetail(scope.row)">查看</el-button>
|
||||||
|
<!-- <el-button size="mini" type="text" @click="handleEdit(scope.row)">修正</el-button> -->
|
||||||
|
<el-button size="mini" type="text" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 选中单据的明细 -->
|
||||||
|
<div v-if="selectedPacking.packingId" class="detail-card" style="margin-top: 16px;">
|
||||||
|
<div class="card-header">
|
||||||
|
<span class="card-title">明细信息 - 单据号:{{ selectedPacking.packingNo }}</span>
|
||||||
|
<div class="header-actions">
|
||||||
|
<coil-selector dialog-width="1200px" :use-trigger="true" :filters="coilFilters"
|
||||||
|
:disableO="true" @change="handleAddCoil">
|
||||||
|
<el-button type="primary" plain icon="el-icon-plus" size="small">添加钢卷</el-button>
|
||||||
|
</coil-selector>
|
||||||
|
<el-button size="small" icon="el-icon-refresh" @click="handleRefreshDetail">刷新</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" style="margin-bottom: 16px;">
|
||||||
|
<!-- 单据主表信息 -->
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-descriptions :column="3" border size="small">
|
||||||
|
<el-descriptions-item label="单据号">
|
||||||
|
<el-input v-model="selectedPacking.packingNo" @change="handleSaveEdit" placeholder="请输入单据号" clearable
|
||||||
|
style="width: 180px" />
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="批次号">
|
||||||
|
<el-input v-model="selectedPacking.batchNo" @change="handleSaveEdit" placeholder="请输入批次号" clearable
|
||||||
|
style="width: 180px" />
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="打包时间">
|
||||||
|
<el-date-picker v-model="selectedPacking.packingTime" @change="handleSaveEdit" type="date"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss" style="width: 260px" />
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="操作人">
|
||||||
|
<el-input v-model="selectedPacking.packingBy" @change="handleSaveEdit" placeholder="请输入操作人" clearable
|
||||||
|
style="width: 180px" />
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="卷数">{{ selectedPacking.coilCount }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="总重">{{ selectedPacking.totalNetWeight }}t</el-descriptions-item>
|
||||||
|
|
||||||
|
<!-- <el-descriptions-item label="创建时间">{{ selectedPacking.createTime }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="备注" :span="2">{{ selectedPacking.remark }}</el-descriptions-item> -->
|
||||||
|
</el-descriptions>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-table v-loading="detailLoading" :data="detailList" border style="width: 100%" max-height="500" size="small">
|
||||||
|
<el-table-column label="序号" type="index" width="55" align="center" />
|
||||||
|
<el-table-column label="入场钢卷号" align="center" prop="coil.enterCoilNo" min-width="120"></el-table-column>
|
||||||
|
<el-table-column label="当前钢卷号" align="center" prop="coil.currentCoilNo" min-width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<current-coil-no :current-coil-no="scope.row.coil.currentCoilNo" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="产品类型" align="center" width="280">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<ProductInfo v-if="scope.row.coil.itemType == 'product'" :product="scope.row.coil.product" />
|
||||||
|
<RawMaterialInfo v-else-if="scope.row.coil.itemType === 'raw_material'" :material="scope.row.coil.rawMaterial" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="重量" align="center" prop="coilNetWeight" width="80"></el-table-column>
|
||||||
|
<el-table-column label="质量状态" align="center" prop="coil.qualityStatus" width="80"></el-table-column>
|
||||||
|
<el-table-column label="实际库区" align="center" prop="coil.actualWarehouseName"></el-table-column>
|
||||||
|
<el-table-column label="销售名称" align="center" prop="coil.saleName" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input v-model="scope.row.coil.saleName" @change="updateSaleName(scope.row.coil)"></el-input>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<!-- <el-table-column label="打包前位置" align="center" prop="fromWarehouseName" min-width="120" show-overflow-tooltip /> -->
|
||||||
|
<el-table-column label="操作" align="center" width="120" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<!-- 未保存的钢卷(无detailId) -->
|
||||||
|
<template v-if="!scope.row.detailId">
|
||||||
|
<el-button size="mini" type="text" @click="handleDeleteTempDetail(scope.row)">删除</el-button>
|
||||||
|
<el-button size="mini" type="text" @click="handleSaveTempDetail(scope.row)">保存</el-button>
|
||||||
|
</template>
|
||||||
|
<!-- 已保存的钢卷(有detailId) -->
|
||||||
|
<template v-else>
|
||||||
|
<el-button size="mini" type="text" @click="handleDeleteDetail(scope.row)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { listPacking, getPacking, updatePacking, delPacking, listPackingDetail, updatePackingDetail, delPackingDetail, addPackingDetail } from '@/api/wms/packing';
|
||||||
|
import { listMaterialCoil, getMaterialCoilTrace, updateMaterialCoilSimple, checkCoilNo, delMaterialCoil, restoreMaterialCoil, addMaterialCoil } from '@/api/wms/coil'
|
||||||
|
import CoilSelector from '@/components/CoilSelector';
|
||||||
|
import ProductInfo from "@/components/KLPService/Renderer/ProductInfo";
|
||||||
|
import RawMaterialInfo from "@/components/KLPService/Renderer/RawMaterialInfo";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'PackingRecord',
|
||||||
|
dicts: [],
|
||||||
|
components: {
|
||||||
|
CoilSelector,
|
||||||
|
ProductInfo,
|
||||||
|
RawMaterialInfo
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: false,
|
||||||
|
// 打包单据列表
|
||||||
|
packingList: [],
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 日期范围
|
||||||
|
dateRange: [],
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: null,
|
||||||
|
batchNo: null,
|
||||||
|
team: null
|
||||||
|
},
|
||||||
|
// 选中的单据
|
||||||
|
selectedPacking: {},
|
||||||
|
|
||||||
|
saveLoading: false,
|
||||||
|
// 明细列表
|
||||||
|
detailList: [],
|
||||||
|
detailLoading: false,
|
||||||
|
// 钢卷选择器筛选参数
|
||||||
|
coilFilters: {
|
||||||
|
dataType: 1,
|
||||||
|
status: 0,
|
||||||
|
selectType: 'product',
|
||||||
|
excludePacked: true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
// 总重量
|
||||||
|
totalWeight() {
|
||||||
|
return this.detailList.reduce((acc, item) => acc + Number(item.coilNetWeight || 0), 0).toFixed(3);
|
||||||
|
},
|
||||||
|
// 已填位置的明细数量
|
||||||
|
filledPositionCount() {
|
||||||
|
return this.detailList.filter(item => item.toWarehouseName).length;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
// 检查是否有传入的packingId参数
|
||||||
|
const packingId = this.$route.query.packingId;
|
||||||
|
if (packingId) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.handleViewDetail({ packingId });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 查询打包单据列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true;
|
||||||
|
const params = { ...this.queryParams };
|
||||||
|
// 处理日期范围
|
||||||
|
if (this.dateRange && this.dateRange.length === 2) {
|
||||||
|
params.params = {
|
||||||
|
beginPackingDate: this.dateRange[0],
|
||||||
|
endPackingDate: this.dateRange[1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
listPacking(params).then(response => {
|
||||||
|
this.packingList = response.rows || [];
|
||||||
|
this.total = response.total || 0;
|
||||||
|
}).finally(() => {
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNum = 1;
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.dateRange = [];
|
||||||
|
this.queryParams = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
packingNo: null,
|
||||||
|
batchNo: null,
|
||||||
|
team: null
|
||||||
|
};
|
||||||
|
this.handleQuery();
|
||||||
|
},
|
||||||
|
updateSaleName(coil) {
|
||||||
|
updateMaterialCoilSimple({ ...coil }).then(response => {
|
||||||
|
this.$modal.msgSuccess('更新成功');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 新建单据 */
|
||||||
|
handleCreate() {
|
||||||
|
this.$router.push('/packing/create');
|
||||||
|
},
|
||||||
|
/** 刷新明细列表 */
|
||||||
|
handleRefreshDetail() {
|
||||||
|
this.getDetailList(this.selectedPacking.packingId);
|
||||||
|
},
|
||||||
|
/** 行点击事件 */
|
||||||
|
handleRowClick(row) {
|
||||||
|
this.selectedPacking = row;
|
||||||
|
this.getDetailList(row.packingId);
|
||||||
|
},
|
||||||
|
/** 行样式 */
|
||||||
|
rowClassName({ row }) {
|
||||||
|
return row.packingId === this.selectedPacking.packingId ? 'row-selected' : '';
|
||||||
|
},
|
||||||
|
/** 查看详情 */
|
||||||
|
handleViewDetail(row) {
|
||||||
|
this.handleRowClick(row);
|
||||||
|
},
|
||||||
|
/** 获取明细列表 */
|
||||||
|
getDetailList(packingId) {
|
||||||
|
this.detailLoading = true;
|
||||||
|
listPackingDetail({ packingId }).then(response => {
|
||||||
|
this.detailList = response.rows || [];
|
||||||
|
}).finally(() => {
|
||||||
|
this.detailLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 保存修改 */
|
||||||
|
handleSaveEdit() {
|
||||||
|
// this.$refs.editForm.validate(valid => {
|
||||||
|
// if (valid) {
|
||||||
|
// this.saveLoading = true;
|
||||||
|
const data = {
|
||||||
|
...this.selectedPacking
|
||||||
|
};
|
||||||
|
updatePacking(data).then(response => {
|
||||||
|
this.$modal.msgSuccess('保存成功');
|
||||||
|
// this.getList();
|
||||||
|
})
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
},
|
||||||
|
/** 保存位置修改 */
|
||||||
|
handleSaveDetailPosition(row) {
|
||||||
|
updatePackingDetail(row).then(response => {
|
||||||
|
this.$message.success('位置已更新');
|
||||||
|
}).catch(() => { });
|
||||||
|
},
|
||||||
|
/** 批量添加钢卷 */
|
||||||
|
handleAddCoil(coilId, coil) {
|
||||||
|
this.handleBatchAddCoil([coil]);
|
||||||
|
},
|
||||||
|
handleBatchAddCoil(coils) {
|
||||||
|
console.log(coils);
|
||||||
|
const newCoils = coils.map(coil => ({
|
||||||
|
packingId: this.selectedPacking.packingId,
|
||||||
|
toWarehouseId: '2035892198703349761',
|
||||||
|
coilId: coil.coilId,
|
||||||
|
coilNo: coil.currentCoilNo,
|
||||||
|
enterCoilNo: coil.enterCoilNo,
|
||||||
|
itemName: coil.itemName,
|
||||||
|
specification: coil.itemSpecification,
|
||||||
|
material: coil.itemMaterial,
|
||||||
|
coilNetWeight: coil.netWeight,
|
||||||
|
fromWarehouseId: coil.warehouseId || '',
|
||||||
|
fromWarehouseName: coil.actualWarehouseName || '',
|
||||||
|
toWarehouseName: '打包待发货',
|
||||||
|
itemType: coil.itemType,
|
||||||
|
product: coil.product,
|
||||||
|
rawMaterial: coil.rawMaterial,
|
||||||
|
saleName: '',
|
||||||
|
coil,
|
||||||
|
// 注意:这里不设置detailId,标识为未保存状态
|
||||||
|
}));
|
||||||
|
// 直接添加到前端表格,不调用后端API
|
||||||
|
this.detailList = [...this.detailList, ...newCoils];
|
||||||
|
// this.$modal.msgSuccess('添加成功');
|
||||||
|
},
|
||||||
|
/** 删除未保存的明细(前端移除) */
|
||||||
|
handleDeleteTempDetail(row) {
|
||||||
|
// 通过coilId从数组中移除
|
||||||
|
this.detailList = this.detailList.filter(item => item.coilId !== row.coilId);
|
||||||
|
},
|
||||||
|
/** 保存未保存的明细(分配临时detailId) */
|
||||||
|
handleSaveTempDetail(row) {
|
||||||
|
// 分配临时detailId(使用时间戳和随机数)
|
||||||
|
// row.detailId = 'temp_' + Date.now() + '_' + Math.floor(Math.random() * 1000);
|
||||||
|
// 保存到后端
|
||||||
|
addPackingDetail(row).then(response => {
|
||||||
|
this.$modal.msgSuccess('保存成功');
|
||||||
|
this.getDetailList(this.selectedPacking.packingId);
|
||||||
|
}).catch(() => {
|
||||||
|
this.$modal.msgError('保存失败');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 删除已保存的明细 */
|
||||||
|
handleDeleteDetail(row) {
|
||||||
|
this.$modal.confirm('确认删除该钢卷明细吗?').then(() => {
|
||||||
|
return delPackingDetail(row.detailId);
|
||||||
|
}).then(() => {
|
||||||
|
this.$modal.msgSuccess('删除成功');
|
||||||
|
this.getDetailList(this.selectedPacking.packingId);
|
||||||
|
}).catch(() => { });
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 删除按钮 */
|
||||||
|
handleDelete(row) {
|
||||||
|
this.$modal.confirm('确认删除单据号为"' + row.packingNo + '"的打包单据吗?').then(() => {
|
||||||
|
return delPacking(row.packingId);
|
||||||
|
}).then(() => {
|
||||||
|
this.$modal.msgSuccess('删除成功');
|
||||||
|
this.getList();
|
||||||
|
if (this.selectedPacking.packingId === row.packingId) {
|
||||||
|
this.selectedPacking = {};
|
||||||
|
this.detailList = [];
|
||||||
|
}
|
||||||
|
}).catch(() => { });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.app-container {
|
||||||
|
padding: 16px;
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
min-height: calc(100vh - 84px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-card {
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #e4e7ed;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.query-form {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
::v-deep .el-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #e4e7ed;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-card {
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #e4e7ed;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.card-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
border-bottom: 1px solid #e4e7ed;
|
||||||
|
|
||||||
|
.card-title {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-summary {
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 8px;
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 选中行样式 */
|
||||||
|
::v-deep .row-selected {
|
||||||
|
background-color: #ecf5ff !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [505, 120],
|
actionTypes: [505, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'dugekuguan'
|
createBy: 'dugekuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'dugekuguan',
|
createBy: 'dugekuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [505, 120],
|
actionTypes: [505, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'dugekuguan'
|
createBy: 'dugekuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'dugekuguan',
|
createBy: 'dugekuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [505, 120],
|
actionTypes: [505, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'dugekuguan'
|
createBy: 'dugekuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'dugekuguan',
|
createBy: 'dugekuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [505, 120],
|
actionTypes: [505, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'dugekuguan'
|
createBy: 'dugekuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'dugekuguan',
|
createBy: 'dugekuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [505, 120],
|
actionTypes: [505, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'dugekuguan'
|
createBy: 'dugekuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'dugekuguan',
|
createBy: 'dugekuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [503, 120],
|
actionTypes: [503, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'lajiaokuguan'
|
createBy: 'lajiaokuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'lajiaokuguan',
|
createBy: 'lajiaokuguan',
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
return {
|
return {
|
||||||
actionTypes: [503, 120],
|
actionTypes: [503, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'lajiaokuguan'
|
createBy: 'lajiaokuguan'
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [503, 120],
|
actionTypes: [503, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'lajiaokuguan'
|
createBy: 'lajiaokuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'lajiaokuguan',
|
createBy: 'lajiaokuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [503, 120],
|
actionTypes: [503, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'lajiaokuguan'
|
createBy: 'lajiaokuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'lajiaokuguan',
|
createBy: 'lajiaokuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [503, 120],
|
actionTypes: [503, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'lajiaokuguan'
|
createBy: 'lajiaokuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'lajiaokuguan',
|
createBy: 'lajiaokuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [504, 120],
|
actionTypes: [504, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'shuangkuguan'
|
createBy: 'shuangkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'shuangkuguan',
|
createBy: 'shuangkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [504, 120],
|
actionTypes: [504, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'shuangkuguan'
|
createBy: 'shuangkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'shuangkuguan',
|
createBy: 'shuangkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [504, 120],
|
actionTypes: [504, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'shuangkuguan'
|
createBy: 'shuangkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'shuangkuguan',
|
createBy: 'shuangkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [504, 120],
|
actionTypes: [504, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'shuangkuguan'
|
createBy: 'shuangkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'shuangkuguan',
|
createBy: 'shuangkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [504, 120],
|
actionTypes: [504, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'shuangkuguan'
|
createBy: 'shuangkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'shuangkuguan',
|
createBy: 'shuangkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [502, 120],
|
actionTypes: [502, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'tuozhikuguan'
|
createBy: 'tuozhikuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'tuozhikuguan',
|
createBy: 'tuozhikuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [502, 120],
|
actionTypes: [502, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'tuozhikuguan'
|
createBy: 'tuozhikuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'tuozhikuguan',
|
createBy: 'tuozhikuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [502, 120],
|
actionTypes: [502, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'tuozhikuguan'
|
createBy: 'tuozhikuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'tuozhikuguan',
|
createBy: 'tuozhikuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [502, 120],
|
actionTypes: [502, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'tuozhikuguan'
|
createBy: 'tuozhikuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'tuozhikuguan',
|
createBy: 'tuozhikuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [502, 120],
|
actionTypes: [502, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'tuozhikuguan'
|
createBy: 'tuozhikuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'tuozhikuguan',
|
createBy: 'tuozhikuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [11, 120],
|
actionTypes: [11, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'suanzhakuguan'
|
createBy: 'suanzhakuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'suanzhakuguan',
|
createBy: 'suanzhakuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [11, 120],
|
actionTypes: [11, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'suanzhakuguan'
|
createBy: 'suanzhakuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'suanzhakuguan',
|
createBy: 'suanzhakuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'duxinkuguan',
|
createBy: 'duxinkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'duxinkuguan',
|
createBy: 'duxinkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'duxinkuguan',
|
createBy: 'duxinkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'duxinkuguan',
|
createBy: 'duxinkuguan',
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
baseQueryParams: {
|
baseQueryParams: {
|
||||||
createBy: 'duxinkuguan',
|
createBy: 'duxinkuguan',
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
return {
|
return {
|
||||||
actionTypes: [501, 120],
|
actionTypes: [501, 120],
|
||||||
actionQueryParams: {
|
actionQueryParams: {
|
||||||
updateBy: 'duxinkuguan'
|
createBy: 'duxinkuguan'
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user