diff --git a/apps/web-antd/src/api/erp/stock/out/index.ts b/apps/web-antd/src/api/erp/stock/out/index.ts
index 2224e2ddbfe4ee7c9db5c7199c41bc299047e975..a3873f94841c62ec7b3b5a9f38db035a7beb6656 100644
--- a/apps/web-antd/src/api/erp/stock/out/index.ts
+++ b/apps/web-antd/src/api/erp/stock/out/index.ts
@@ -2,7 +2,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
-namespace ErpStockOutApi {
+export namespace ErpStockOutApi {
/** 其它出库单信息 */
export interface StockOut {
id?: number; // 出库编号
@@ -13,6 +13,24 @@ namespace ErpStockOutApi {
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
+ fileUrl?: string; // 附件
+ items?: StockOutItem[]; // 出库产品清单
+ }
+
+ /** 其它出库单产品信息 */
+ export interface StockOutItem {
+ id?: number; // 编号
+ warehouseId?: number; // 仓库编号
+ productId?: number; // 产品编号
+ productName?: string; // 产品名称
+ productUnitId?: number; // 产品单位编号
+ productUnitName?: string; // 产品单位名称
+ productBarCode?: string; // 产品条码
+ count: number; // 数量
+ productPrice: number; // 产品单价
+ totalPrice: number; // 总价
+ stockCount?: number; // 库存数量
+ remark?: string; // 备注
}
/** 其它出库单分页查询参数 */
diff --git a/apps/web-antd/src/views/erp/stock/in/modules/form.vue b/apps/web-antd/src/views/erp/stock/in/modules/form.vue
index fffca0978d272ec564a3177eed6ab07a93f5e74e..a18f6c1ce918f224226c71db2733f62fa9fd0896 100644
--- a/apps/web-antd/src/views/erp/stock/in/modules/form.vue
+++ b/apps/web-antd/src/views/erp/stock/in/modules/form.vue
@@ -88,7 +88,10 @@ const [Modal, modalApi] = useVbenModal({
modalApi.lock();
// 提交表单
const data = (await formApi.getValues()) as ErpStockInApi.StockIn;
- data.items = formData.value?.items;
+ data.items = formData.value?.items?.map((item) => ({
+ ...item,
+ id: undefined,
+ }));
// 将文件数组转换为字符串
if (data.fileUrl && Array.isArray(data.fileUrl)) {
data.fileUrl = data.fileUrl.length > 0 ? data.fileUrl[0] : '';
diff --git a/apps/web-antd/src/views/erp/stock/out/data.ts b/apps/web-antd/src/views/erp/stock/out/data.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ca2095c34ca2595f0d42c0af596e45d795977eaa
--- /dev/null
+++ b/apps/web-antd/src/views/erp/stock/out/data.ts
@@ -0,0 +1,329 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { createRequiredValidation } from '#/adapter/vxe-table';
+import { getProductSimpleList } from '#/api/erp/product/product';
+import { getCustomerSimpleList } from '#/api/erp/sale/customer';
+import { getSimpleUserList } from '#/api/system/user';
+import { DICT_TYPE, getDictOptions } from '#/utils';
+
+/** 表单的配置项 */
+export function useFormSchema(formType: string): VbenFormSchema[] {
+ return [
+ {
+ component: 'Input',
+ componentProps: {
+ style: { display: 'none' },
+ },
+ fieldName: 'id',
+ label: 'ID',
+ hideLabel: true,
+ formItemClass: 'hidden',
+ },
+ {
+ component: 'Input',
+ componentProps: {
+ placeholder: '系统自动生成',
+ disabled: true,
+ },
+ fieldName: 'no',
+ label: '出库单号',
+ disabled: formType === 'detail',
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ placeholder: '选择出库时间',
+ showTime: true,
+ format: 'YYYY-MM-DD HH:mm:ss',
+ valueFormat: 'x',
+ style: { width: '100%' },
+ },
+ disabled: formType === 'detail',
+ fieldName: 'outTime',
+ label: '出库时间',
+ rules: 'required',
+ },
+ {
+ component: 'ApiSelect',
+ componentProps: {
+ placeholder: '请选择客户',
+ allowClear: true,
+ showSearch: true,
+ api: getCustomerSimpleList,
+ fieldNames: {
+ label: 'name',
+ value: 'id',
+ },
+ },
+ disabled: formType === 'detail',
+ fieldName: 'customerId',
+ label: '客户',
+ },
+
+ {
+ component: 'Textarea',
+ componentProps: {
+ placeholder: '请输入备注',
+ autoSize: { minRows: 2, maxRows: 4 },
+ class: 'w-full',
+ },
+ disabled: formType === 'detail',
+ fieldName: 'remark',
+ label: '备注',
+ formItemClass: 'col-span-3',
+ },
+ {
+ component: 'FileUpload',
+ disabled: formType === 'detail',
+ componentProps: {
+ maxNumber: 1,
+ maxSize: 10,
+ accept: [
+ 'pdf',
+ 'doc',
+ 'docx',
+ 'xls',
+ 'xlsx',
+ 'txt',
+ 'jpg',
+ 'jpeg',
+ 'png',
+ ],
+ showDescription: true,
+ },
+ fieldName: 'fileUrl',
+ label: '附件',
+ formItemClass: 'col-span-3',
+ },
+ {
+ fieldName: 'product',
+ disabled: formType === 'detail',
+ label: '产品清单',
+ component: 'Input',
+ formItemClass: 'col-span-3',
+ },
+ ];
+}
+
+/** 出库产品清单表格列定义 */
+export function useStockInItemTableColumns(
+ isValidating?: any,
+): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'seq', title: '序号', minWidth: 50, fixed: 'left' },
+ {
+ field: 'warehouseId',
+ title: '仓库名称',
+ minWidth: 150,
+ slots: { default: 'warehouseId' },
+ className: createRequiredValidation(isValidating, 'warehouseId'),
+ },
+ {
+ field: 'productId',
+ title: '产品名称',
+ minWidth: 200,
+ slots: { default: 'productId' },
+ className: createRequiredValidation(isValidating, 'productId'),
+ },
+ {
+ field: 'stockCount',
+ title: '库存',
+ minWidth: 100,
+ },
+ {
+ field: 'productBarCode',
+ title: '条码',
+ minWidth: 120,
+ },
+ {
+ field: 'productUnitName',
+ title: '单位',
+ minWidth: 80,
+ },
+ {
+ field: 'count',
+ title: '数量',
+ minWidth: 120,
+ slots: { default: 'count' },
+ className: createRequiredValidation(isValidating, 'count'),
+ },
+ {
+ field: 'productPrice',
+ title: '产品单价',
+ minWidth: 120,
+ slots: { default: 'productPrice' },
+ },
+ {
+ field: 'totalPrice',
+ title: '金额',
+ minWidth: 120,
+ formatter: 'formatAmount2',
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 150,
+ slots: { default: 'remark' },
+ },
+ {
+ title: '操作',
+ width: 50,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'no',
+ label: '出库单号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入出库单号',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'productId',
+ label: '产品',
+ component: 'ApiSelect',
+ componentProps: {
+ placeholder: '请选择产品',
+ allowClear: true,
+ showSearch: true,
+ api: getProductSimpleList,
+ labelField: 'name',
+ valueField: 'id',
+ filterOption: false,
+ },
+ },
+ {
+ fieldName: 'outTime',
+ label: '出库时间',
+ component: 'RangePicker',
+ componentProps: {
+ placeholder: ['开始日期', '结束日期'],
+ showTime: true,
+ format: 'YYYY-MM-DD HH:mm:ss',
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ },
+ },
+ {
+ fieldName: 'customerId',
+ label: '客户',
+ component: 'ApiSelect',
+ componentProps: {
+ placeholder: '请选择客户',
+ allowClear: true,
+ showSearch: true,
+ api: getCustomerSimpleList,
+ labelField: 'name',
+ valueField: 'id',
+ filterOption: false,
+ },
+ },
+ {
+ fieldName: 'status',
+ label: '状态',
+ component: 'Select',
+ componentProps: {
+ placeholder: '请选择状态',
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.ERP_AUDIT_STATUS, 'number'),
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'creator',
+ label: '创建人',
+ component: 'ApiSelect',
+ componentProps: {
+ placeholder: '请选择创建人',
+ allowClear: true,
+ showSearch: true,
+ api: getSimpleUserList,
+ labelField: 'nickname',
+ valueField: 'id',
+ filterOption: false,
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ type: 'checkbox',
+ width: 50,
+ fixed: 'left',
+ },
+ {
+ field: 'no',
+ title: '出库单号',
+ minWidth: 180,
+ },
+ {
+ field: 'productNames',
+ title: '产品信息',
+ minWidth: 200,
+ showOverflow: 'tooltip',
+ },
+ {
+ field: 'customerName',
+ title: '客户',
+ minWidth: 120,
+ },
+ {
+ field: 'outTime',
+ title: '出库时间',
+ minWidth: 180,
+ cellRender: {
+ name: 'CellDateTime',
+ },
+ },
+ {
+ field: 'creatorName',
+ title: '创建人',
+ minWidth: 100,
+ },
+ {
+ field: 'totalCount',
+ title: '数量',
+ minWidth: 100,
+ },
+ {
+ field: 'totalPrice',
+ title: '价格',
+ minWidth: 100,
+ },
+ {
+ field: 'status',
+ title: '状态',
+ minWidth: 90,
+ fixed: 'right',
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.ERP_AUDIT_STATUS },
+ },
+ },
+ {
+ title: '操作',
+ width: 300,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
diff --git a/apps/web-antd/src/views/erp/stock/out/index.vue b/apps/web-antd/src/views/erp/stock/out/index.vue
index afbf0c8a5141ff552f8cfc2d63abecf23c6c7f47..b42896b3735dfac98f5c9d9a431193877d629e5a 100644
--- a/apps/web-antd/src/views/erp/stock/out/index.vue
+++ b/apps/web-antd/src/views/erp/stock/out/index.vue
@@ -1,34 +1,219 @@
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/erp/stock/out/modules/form.vue b/apps/web-antd/src/views/erp/stock/out/modules/form.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7e8a840318dc721f2006b3200b690c3cedb82825
--- /dev/null
+++ b/apps/web-antd/src/views/erp/stock/out/modules/form.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/erp/stock/out/modules/stock-out-item-form.vue b/apps/web-antd/src/views/erp/stock/out/modules/stock-out-item-form.vue
new file mode 100644
index 0000000000000000000000000000000000000000..14ff4fe1389e8e5db3552c0cc04ddde3efe7600b
--- /dev/null
+++ b/apps/web-antd/src/views/erp/stock/out/modules/stock-out-item-form.vue
@@ -0,0 +1,367 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ handlePriceChange(row)"
+ class="w-full"
+ />
+
+
+
+ handlePriceChange(row)"
+ class="w-full"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+