feat(biz): 添加生产订单管理功能

This commit is contained in:
zxy 2026-05-15 17:57:42 +08:00
parent 70b9038a1e
commit c6adab5443
6 changed files with 332 additions and 114 deletions

View File

@ -59,3 +59,4 @@ env/
.venv/ .venv/
/pytest.ini /pytest.ini
/pnpm-lock.yaml /pnpm-lock.yaml
/requirements-test.txt

View File

@ -1,72 +0,0 @@
import request from '@/config/axios'
export interface StockOutVO {
id: number
stockOutNo: string
stockOutDate: string
warehouseId: number
warehouseName: string
storeAreaId: number
storeAreaName: string
customerId: number
customerName: string
contact: string
contactPhone: string
deliveryAddress: string
deliveryMethod: string
transportNo: string
carrier: string
stockOutType: string
stockOutStatus: number
billStatus: number
totalQty: number
totalAmount: number
remark: string
items?: StockOutItemVO[]
}
export interface StockOutItemVO {
id?: number
materialId?: number
materialCode?: string
materialName?: string
spec?: string
unit?: string
stockQty?: number
outQty?: number
price?: number
amount?: number
remark?: string
}
export const getStockOutPage = async (params) => {
return await request.get({ url: `/biz/stock-out/page`, params })
}
export const getStockOut = async (id: number) => {
return await request.get({ url: `/biz/stock-out/get?id=` + id })
}
export const createStockOut = async (data: StockOutVO) => {
return await request.post({ url: `/biz/stock-out/create`, data })
}
export const updateStockOut = async (data: StockOutVO) => {
return await request.put({ url: `/biz/stock-out/update`, data })
}
export const deleteStockOut = async (id: number) => {
return await request.delete({ url: `/biz/stock-out/delete?id=` + id })
}
export const exportStockOut = async (params) => {
return await request.download({ url: `/biz/stock-out/export-excel`, params })
}
export const submitStockOut = async (id: number) => {
return await request.put({ url: `/biz/stock-out/submit?id=` + id })
}
export const auditStockOut = async (id: number) => {
return await request.put({ url: `/biz/stock-out/audit?id=` + id })
}

View File

@ -0,0 +1,204 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
declare module 'vue' {
export interface GlobalComponents {
__init__: typeof import('./../../tests/pages/__init__.py')['default']
'__init__.cpython314': typeof import('./../../tests/pages/__pycache__/__init__.cpython-314.pyc')['default']
'.gitignore': typeof import('./../../.pytest_cache/.gitignore')['default']
AddForm: typeof import('./../../screenshots/add-form.png')['default']
AddFormFilled: typeof import('./../../screenshots/add-form-filled.png')['default']
AfterSave: typeof import('./../../screenshots/after-save.png')['default']
AppLinkInput: typeof import('./../components/AppLinkInput/index.vue')['default']
AppLinkSelectDialog: typeof import('./../components/AppLinkInput/AppLinkSelectDialog.vue')['default']
Backtop: typeof import('./../components/Backtop/src/Backtop.vue')['default']
Base: typeof import('./../../tests/pages/base.py')['default']
'Base.cpython314': typeof import('./../../tests/pages/__pycache__/base.cpython-314.pyc')['default']
CACHEDIR: typeof import('./../../.pytest_cache/CACHEDIR.TAG')['default']
CardTitle: typeof import('./../components/Card/src/CardTitle.vue')['default']
ColorInput: typeof import('./../components/ColorInput/index.vue')['default']
ComponentContainer: typeof import('./../components/DiyEditor/components/ComponentContainer.vue')['default']
ComponentContainerProperty: typeof import('./../components/DiyEditor/components/ComponentContainerProperty.vue')['default']
ComponentLibrary: typeof import('./../components/DiyEditor/components/ComponentLibrary.vue')['default']
Config: typeof import('./../../tests/config.json')['default']
ConfigGlobal: typeof import('./../components/ConfigGlobal/src/ConfigGlobal.vue')['default']
Conftest: typeof import('./../../tests/conftest.py')['default']
'Conftest.cpython314Pytest9.0.3': typeof import('./../../tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc')['default']
'Conftest.cpython314Pytest9.0.3.pyc': typeof import('./../../tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc.38960')['default']
ContentDetailWrap: typeof import('./../components/ContentDetailWrap/src/ContentDetailWrap.vue')['default']
ContentWrap: typeof import('./../components/ContentWrap/src/ContentWrap.vue')['default']
CopperModal: typeof import('./../components/Cropper/src/CopperModal.vue')['default']
CountTo: typeof import('./../components/CountTo/src/CountTo.vue')['default']
Crontab: typeof import('./../components/Crontab/src/Crontab.vue')['default']
Cropper: typeof import('./../components/Cropper/src/Cropper.vue')['default']
CropperAvatar: typeof import('./../components/Cropper/src/CropperAvatar.vue')['default']
Descriptions: typeof import('./../components/Descriptions/src/Descriptions.vue')['default']
DescriptionsItemLabel: typeof import('./../components/Descriptions/src/DescriptionsItemLabel.vue')['default']
Dialog: typeof import('./../components/Dialog/src/Dialog.vue')['default']
DictTag: typeof import('./../components/DictTag/src/DictTag.vue')['default']
DiyEditor: typeof import('./../components/DiyEditor/index.vue')['default']
DocAlert: typeof import('./../components/DocAlert/index.vue')['default']
Echart: typeof import('./../components/Echart/src/Echart.vue')['default']
Editor: typeof import('./../components/Editor/src/Editor.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDrawer: typeof import('element-plus/es')['ElDrawer']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElementBaseInfo: typeof import('./../components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue')['default']
ElementForm: typeof import('./../components/bpmnProcessDesigner/package/penal/form/ElementForm.vue')['default']
ElementListeners: typeof import('./../components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue')['default']
ElementMultiInstance: typeof import('./../components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue')['default']
ElementOtherConfig: typeof import('./../components/bpmnProcessDesigner/package/penal/other/ElementOtherConfig.vue')['default']
ElementProperties: typeof import('./../components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue')['default']
ElementTask: typeof import('./../components/bpmnProcessDesigner/package/penal/task/ElementTask.vue')['default']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
Error: typeof import('./../components/Error/src/Error.vue')['default']
ErrorScreenshot: typeof import('./../../error-screenshot.png')['default']
FlowCondition: typeof import('./../components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue')['default']
Form: typeof import('./../components/Form/src/Form.vue')['default']
Form_components: typeof import('./../../tests/components/form_components.py')['default']
'Form_components.cpython314': typeof import('./../../tests/components/__pycache__/form_components.cpython-314.pyc')['default']
Highlight: typeof import('./../components/Highlight/src/Highlight.vue')['default']
Icon: typeof import('./../components/Icon/src/Icon.vue')['default']
IconSelect: typeof import('./../components/Icon/src/IconSelect.vue')['default']
IFrame: typeof import('./../components/IFrame/src/IFrame.vue')['default']
ImageViewer: typeof import('./../components/ImageViewer/src/ImageViewer.vue')['default']
Infotip: typeof import('./../components/Infotip/src/Infotip.vue')['default']
InputPassword: typeof import('./../components/InputPassword/src/InputPassword.vue')['default']
InputWithColor: typeof import('./../components/InputWithColor/index.vue')['default']
Lastfailed: typeof import('./../../.pytest_cache/v/cache/lastfailed')['default']
Login_page: typeof import('./../../tests/pages/login_page.py')['default']
'Login_page.cpython314': typeof import('./../../tests/pages/__pycache__/login_page.cpython-314.pyc')['default']
'Login_page.cpython314.pyc': typeof import('./../../tests/pages/__pycache__/login_page.cpython-314.pyc.2012673802768')['default']
LoginPage: typeof import('./../../login-page.png')['default']
MagicCubeEditor: typeof import('./../components/MagicCubeEditor/index.vue')['default']
MoneyInput: typeof import('./../views/biz/components/MoneyInput.vue')['default']
Nodeids: typeof import('./../../.pytest_cache/v/cache/nodeids')['default']
Order_test_data: typeof import('./../../tests/data/order_test_data.json')['default']
Pagination: typeof import('./../components/Pagination/index.vue')['default']
PlaywrightTest: typeof import('./../../tests/playwright-test.py')['default']
ProcessDesigner: typeof import('./../components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue')['default']
ProcessPalette: typeof import('./../components/bpmnProcessDesigner/package/palette/ProcessPalette.vue')['default']
ProcessViewer: typeof import('./../components/bpmnProcessDesigner/package/designer/ProcessViewer.vue')['default']
PropertiesPanel: typeof import('./../components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue')['default']
Prostorage: typeof import('./../api/biz/prostorage/index.ts')['default']
ProStorageInventorySelectDialog: typeof import('./../views/biz/prostorageinventory/ProStorageInventorySelectDialog.vue')['default']
Prostoragelog: typeof import('./../api/biz/prostoragelog/index.ts')['default']
Prostoragemat: typeof import('./../api/biz/prostoragemat/index.ts')['default']
Pytest: typeof import('./../../pytest.ini')['default']
Qrcode: typeof import('./../components/Qrcode/src/Qrcode.vue')['default']
README: typeof import('./../../.pytest_cache/README.md')['default']
ReceiveTask: typeof import('./../components/bpmnProcessDesigner/package/penal/task/task-components/ReceiveTask.vue')['default']
RequirementsTest: typeof import('./../../requirements-test.txt')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterSearch: typeof import('./../components/RouterSearch/index.vue')['default']
RouterView: typeof import('vue-router')['RouterView']
Sale_order_page: typeof import('./../../tests/pages/sale_order_page.py')['default']
'Sale_order_page.cpython314': typeof import('./../../tests/pages/__pycache__/sale_order_page.cpython-314.pyc')['default']
'Sale_order_page.cpython314.pyc': typeof import('./../../tests/pages/__pycache__/sale_order_page.cpython-314.pyc.1680447423472')['default']
ScriptTask: typeof import('./../components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue')['default']
Search: typeof import('./../components/Search/src/Search.vue')['default']
ShortcutDateRangePicker: typeof import('./../components/ShortcutDateRangePicker/index.vue')['default']
SignalAndMessage: typeof import('./../components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue')['default']
Sticky: typeof import('./../components/Sticky/src/Sticky.vue')['default']
SummaryCard: typeof import('./../components/SummaryCard/index.vue')['default']
Table: typeof import('./../components/Table/src/Table.vue')['default']
Test_sale_order: typeof import('./../../tests/test_sale_order.py')['default']
'Test_sale_order.cpython314Pytest9.0.3': typeof import('./../../tests/__pycache__/test_sale_order.cpython-314-pytest-9.0.3.pyc')['default']
'Test_sale_order.cpython314Pytest9.0.3.pyc': typeof import('./../../tests/__pycache__/test_sale_order.cpython-314-pytest-9.0.3.pyc.16136')['default']
TestAfterLogin: typeof import('./../../test-after-login.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_basic_150308': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_basic_150308.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_basic_150541': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_basic_150541.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_150346': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_150346.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_150618': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_150618.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_151150': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_151150.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_151240': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_cancel_151240.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_dialog_opens_151141': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_dialog_opens_151141.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_dialog_opens_151231': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_dialog_opens_151231.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_partial_fill_154225': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_partial_fill_154225.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_partial_fill_154326': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_partial_fill_154326.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_151545': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_151545.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152057': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152057.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152324': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152324.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152412': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_152412.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153127': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153127.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153158': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153158.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153341': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153341.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153433': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153433.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153706': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153706.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153802': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_success_153802.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154052': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154052.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154215': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154215.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154314': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_validation_154314.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_with_all_fields_150342': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_with_all_fields_150342.png')['default']
'Tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_with_all_fields_150615': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderCRUD_test_add_order_with_all_fields_150615.png')['default']
'Tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case0]_150350': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case0]_150350.png')['default']
'Tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case0]_150622': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case0]_150622.png')['default']
'Tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case1]_150353': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case1]_150353.png')['default']
'Tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case1]_150625': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderDataDriven_test_add_order_parametrized[test_case1]_150625.png')['default']
'Tests_test_sale_order.py_TestSaleOrderLogin_test_login_success_145839': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderLogin_test_login_success_145839.png')['default']
'Tests_test_sale_order.py_TestSaleOrderLogin_test_login_success_145911': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderLogin_test_login_success_145911.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_reset_search_150305': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_reset_search_150305.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_reset_search_150538': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_reset_search_150538.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_date_range_150232': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_date_range_150232.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_date_range_150505': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_date_range_150505.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_order_no_150159': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_order_no_150159.png')['default']
'Tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_order_no_150432': typeof import('./../../tests/screenshots/tests_test_sale_order.py_TestSaleOrderSearch_test_search_by_order_no_150432.png')['default']
TestScreenshot: typeof import('./../../test-screenshot.png')['default']
Tooltip: typeof import('./../components/Tooltip/src/Tooltip.vue')['default']
UploadFile: typeof import('./../components/UploadFile/src/UploadFile.vue')['default']
UploadFileBatch: typeof import('./../components/UploadFile/src/UploadFileBatch.vue')['default']
UploadImg: typeof import('./../components/UploadFile/src/UploadImg.vue')['default']
UploadImgs: typeof import('./../components/UploadFile/src/UploadImgs.vue')['default']
UserTask: typeof import('./../components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue')['default']
UserTaskListeners: typeof import('./../components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue')['default']
Verify: typeof import('./../components/Verifition/src/Verify.vue')['default']
VerifyPoints: typeof import('./../components/Verifition/src/Verify/VerifyPoints.vue')['default']
VerifySlide: typeof import('./../components/Verifition/src/Verify/VerifySlide.vue')['default']
VerticalButtonGroup: typeof import('./../components/VerticalButtonGroup/index.vue')['default']
'Workspace.xml': typeof import('./../../.idea/workspace.xml.tmp')['default']
XButton: typeof import('./../components/XButton/src/XButton.vue')['default']
XTextButton: typeof import('./../components/XButton/src/XTextButton.vue')['default']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}

View File

@ -0,0 +1,81 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
const DICT_TYPE: typeof import('@/utils/dict')['DICT_TYPE']
const EffectScope: typeof import('vue')['EffectScope']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const effectScope: typeof import('vue')['effectScope']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const required: typeof import('@/utils/formRules')['required']
const resolveComponent: typeof import('vue')['resolveComponent']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCrudSchemas: typeof import('@/hooks/web/useCrudSchemas')['useCrudSchemas']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useI18n: typeof import('@/hooks/web/useI18n')['useI18n']
const useId: typeof import('vue')['useId']
const useLink: typeof import('vue-router')['useLink']
const useMessage: typeof import('@/hooks/web/useMessage')['useMessage']
const useModel: typeof import('vue')['useModel']
const useRoute: typeof import('vue-router')['useRoute']
const useRouter: typeof import('vue-router')['useRouter']
const useSlots: typeof import('vue')['useSlots']
const useTable: typeof import('@/hooks/web/useTable')['useTable']
const useTemplateRef: typeof import('vue')['useTemplateRef']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}

View File

@ -23,9 +23,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="单据日期" prop="ordDate"> <el-form-item label="单据日期" prop="deliveryDate">
<el-date-picker <el-date-picker
v-model="formData.ordDate" v-model="formData.deliveryDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
format="YYYY-MM-DD" format="YYYY-MM-DD"
@ -85,10 +85,10 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="发货数量" prop="deliveriedQty"> <el-form-item label="发货数量" prop="deliveriedQty">
<MoneyInput <MoneyInput
v-model="formData.deliveriedQty" v-model="formData.deliveriedQty"
:decimal-places="0" :decimal-places="0"
:allow-negative="false" :allow-negative="false"
:show-prefix="false" :show-prefix="false"
/> />
</el-form-item> </el-form-item>
@ -254,7 +254,6 @@ const formData = reactive({
deliveryDate: getToday(), deliveryDate: getToday(),
deliveryStatus: '1', deliveryStatus: '1',
deliveryType: undefined, deliveryType: undefined,
ordDate: undefined,
custId: undefined, custId: undefined,
custName: undefined, custName: undefined,
contact: undefined, contact: undefined,
@ -291,7 +290,7 @@ const totalQty = computed(() => {
const getSummary = (param: any) => { const getSummary = (param: any) => {
const { columns, data } = param const { columns, data } = param
const sums: any[] = [] const sums: any[] = []
// //
if (!Array.isArray(data) || data.length === 0) { if (!Array.isArray(data) || data.length === 0) {
columns.forEach((column: any, index: number) => { columns.forEach((column: any, index: number) => {
@ -299,13 +298,13 @@ const getSummary = (param: any) => {
}) })
return sums return sums
} }
// //
const totalDeliveriedBag = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedBag) || 0), 0) const totalDeliveriedBag = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedBag) || 0), 0)
// //
const totalDeliveriedQty = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedQty) || 0), 0) const totalDeliveriedQty = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedQty) || 0), 0)
// 使 // 使
// 0-, 1-, 2-, 3-, 4-, 5-, 6-, 7-, 8-, 9-, 10- // 0-, 1-, 2-, 3-, 4-, 5-, 6-, 7-, 8-, 9-, 10-
columns.forEach((column: any, index: number) => { columns.forEach((column: any, index: number) => {
@ -345,15 +344,15 @@ const formRules = reactive({
deliveryStatus: [{ required: true, message: '单据状态不能为空', trigger: 'change' }], deliveryStatus: [{ required: true, message: '单据状态不能为空', trigger: 'change' }],
deliveriedQty: [ deliveriedQty: [
{ required: true, message: '发货数量不能为空', trigger: 'change' }, { required: true, message: '发货数量不能为空', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (value && formData.remaimQty !== undefined && Number(value) > Number(formData.remaimQty)) { if (value && formData.remaimQty !== undefined && Number(value) > Number(formData.remaimQty)) {
callback(new Error(`发货数量不能大于剩余数量(${formData.remaimQty})`)) callback(new Error(`发货数量不能大于剩余数量(${formData.remaimQty})`))
} else { } else {
callback() callback()
} }
}, },
trigger: ['change', 'blur'] trigger: ['change', 'blur']
} }
], ],
custName: [{ required: true, message: '客户名称不能为空', trigger: 'change' }], custName: [{ required: true, message: '客户名称不能为空', trigger: 'change' }],
@ -374,22 +373,28 @@ const open = async (type: string, id?: number) => {
formType.value = type formType.value = type
resetForm() resetForm()
//
await loadSaleOrderOptions()
// //
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
const data = await SaleDeliveryApi.getSaleDelivery(id) const data = await SaleDeliveryApi.getSaleDelivery(id)
Object.assign(formData, data) Object.assign(formData, data)
// // -
if (data.items) { if (data.items && data.items.length > 0) {
productList.value = data.items productList.value = data.items
} else if (data.detailList && data.detailList.length > 0) {
productList.value = data.detailList
} else if (data.products && data.products.length > 0) {
productList.value = data.products
} else {
productList.value = []
} }
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
} else {
//
await loadSaleOrderOptions()
} }
} }
defineExpose({ open }) defineExpose({ open })
@ -456,18 +461,18 @@ const handleOrderSelect = async (data: any) => {
formData.remaimQty = data.remaimQty formData.remaimQty = data.remaimQty
formData.deliveriedQty = data.remaimQty formData.deliveriedQty = data.remaimQty
formData.unit = data.unit formData.unit = data.unit
// //
if (data.ordDate) { if (data.ordDate) {
// YYYY-MM-DD // YYYY-MM-DD
const ordDateStr = String(data.ordDate).trim() const ordDateStr = String(data.ordDate).trim()
if (/^\d{4}-\d{2}-\d{2}$/.test(ordDateStr)) { if (/^\d{4}-\d{2}-\d{2}$/.test(ordDateStr)) {
formData.ordDate = ordDateStr formData.deliveryDate = ordDateStr
} else { } else {
try { try {
const date = new Date(data.ordDate) const date = new Date(data.ordDate)
if (!isNaN(date.getTime())) { if (!isNaN(date.getTime())) {
formData.ordDate = date.toISOString().split('T')[0] formData.deliveryDate = date.toISOString().split('T')[0]
} }
} catch (e) { } catch (e) {
console.warn('日期转换失败:', e) console.warn('日期转换失败:', e)
@ -475,7 +480,7 @@ const handleOrderSelect = async (data: any) => {
} }
} else { } else {
// //
formData.ordDate = null formData.deliveryDate = null
} }
console.log('formData after set:', formData) console.log('formData after set:', formData)
@ -493,8 +498,8 @@ const handleOrderSelect = async (data: any) => {
}) })
} }
// ID //
if (data.custId) { if (data.custId && formType.value === 'create') {
await loadCustomerContact(data.custId) await loadCustomerContact(data.custId)
} }
} }
@ -520,10 +525,10 @@ const addProductItem = () => {
const selectedIds = productList.value const selectedIds = productList.value
.filter(item => item.inventoryId) .filter(item => item.inventoryId)
.map(item => item.inventoryId) .map(item => item.inventoryId)
// ID便 // ID便
inventorySelectRef.value.setSelectedIds(selectedIds) inventorySelectRef.value.setSelectedIds(selectedIds)
// //
inventorySelectRef.value.open() inventorySelectRef.value.open()
} }
@ -532,11 +537,11 @@ const addProductItem = () => {
const handleInventorySelect = (data: any[]) => { const handleInventorySelect = (data: any[]) => {
// data // data
if (!data || data.length === 0) return if (!data || data.length === 0) return
// id // id
data.forEach(inventory => { data.forEach(inventory => {
const exists = productList.value.find(item => item.inventoryId === inventory.id) const exists = productList.value.find(item => item.inventoryId === inventory.id)
if (!exists) { if (!exists) {
// //
productList.value.push({ productList.value.push({
@ -572,7 +577,7 @@ const emit = defineEmits(['success', 'close'])
const validateDeliveryQty = () => { const validateDeliveryQty = () => {
const remaimQty = parseInt(formData.remaimQty) || 0 const remaimQty = parseInt(formData.remaimQty) || 0
const totalDeliveriedQty = totalQty.value const totalDeliveriedQty = totalQty.value
if (totalDeliveriedQty > remaimQty) { if (totalDeliveriedQty > remaimQty) {
message.warning(`发货总数量(${totalDeliveriedQty})不能超过剩余数量(${remaimQty})`) message.warning(`发货总数量(${totalDeliveriedQty})不能超过剩余数量(${remaimQty})`)
return false return false
@ -585,7 +590,7 @@ const submitForm = async () => {
if (!validateDeliveryQty()) { if (!validateDeliveryQty()) {
return return
} }
// //
await formRef.value.validate() await formRef.value.validate()
@ -608,7 +613,7 @@ const submitForm = async () => {
deliveriedQty: item.deliveriedQty, deliveriedQty: item.deliveriedQty,
remark: item.remark, remark: item.remark,
})) }))
const data = { const data = {
...formData, ...formData,
detailList, detailList,
@ -634,7 +639,7 @@ const submitAudit = async () => {
if (!validateDeliveryQty()) { if (!validateDeliveryQty()) {
return return
} }
// //
await formRef.value.validate() await formRef.value.validate()
@ -657,7 +662,7 @@ const submitAudit = async () => {
deliveriedQty: item.deliveriedQty, deliveriedQty: item.deliveriedQty,
remark: item.remark, remark: item.remark,
})) }))
const data = { const data = {
...formData, ...formData,
deliveryStatus: '2', // deliveryStatus: '2', //
@ -704,7 +709,6 @@ const resetForm = () => {
ordQty: undefined, ordQty: undefined,
remaimQty: undefined, remaimQty: undefined,
deliveriedQty: undefined, deliveriedQty: undefined,
ordDate: null,
}) })
productList.value = [] productList.value = []

View File

@ -143,15 +143,15 @@
</div> </div>
<!-- 明细表格 --> <!-- 明细表格 -->
<div style="flex: 1; min-height: 0;"> <div style="flex: 1; min-height: 0;" >
<div style="font-weight: bold; margin-bottom: 8px;">出库单明细</div> <div style="font-weight: bold; margin-bottom: 8px;">出库单明细</div>
<el-table v-loading="detailLoading" :data="detailList" :stripe="true" :show-overflow-tooltip="true" border :summary-method="getDetailSummary" show-summary> <el-table v-loading="detailLoading" :data="detailList" :stripe="true" :show-overflow-tooltip="true" border :summary-method="getDetailSummary" show-summary style="width: 50%">
<el-table-column label="序号" align="center" type="index" width="60px"/> <el-table-column label="序号" align="center" type="index" width="60px"/>
<el-table-column label="库区" align="center" prop="warehouseArea" width="100px" /> <el-table-column label="库区" align="center" prop="warehouseArea" width="120px" />
<el-table-column label="库位" align="center" prop="warehouseLoc" width="100px" /> <el-table-column label="库位" align="center" prop="warehouseLoc" width="120px" />
<el-table-column label="批次号" align="center" prop="batchNo" width="120px" /> <el-table-column label="批次号" align="center" prop="batchNo" width="120px" />
<el-table-column label="发货数量" align="center" prop="deliveriedQty" width="100px" /> <el-table-column label="发货数量" align="center" prop="deliveriedQty" width="120px" />
<el-table-column label="发货袋数" align="center" prop="deliveriedBag" width="100px" /> <el-table-column label="发货袋数" align="center" prop="deliveriedBag" width="120px" />
<el-table-column label="单据规格" align="center" prop="spec" width="120px" /> <el-table-column label="单据规格" align="center" prop="spec" width="120px" />
<el-table-column label="单位" align="center" prop="unit" width="80px" /> <el-table-column label="单位" align="center" prop="unit" width="80px" />
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
@ -161,7 +161,7 @@
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<SaleDeliveryForm ref="formRef" @success="getList" @close="handleQuery"/> <SaleDeliveryForm ref="formRef" @success="getList"/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">