diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index fcc64770..a74ce8d0 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -1,6 +1,6 @@ { "name": "@vben/web-antd", - "version": "5.5.7", + "version": "5.5.8", "homepage": "https://vben.pro", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "repository": { diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index 2e8fb5bc..e28a6ae1 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -7,12 +7,14 @@ import { IconifyIcon } from '@vben/icons'; import { $te } from '@vben/locales'; import { AsyncComponents, + createRequiredValidation, setupVbenVxeTable, useVbenVxeGrid, } from '@vben/plugins/vxe-table'; import { erpCountInputFormatter, erpNumberFormatter, + fenToYuan, formatPast2, isFunction, isString, @@ -343,11 +345,17 @@ setupVbenVxeTable({ return `${erpNumberFormatter(cellValue, digits)}元`; }, }); + + vxeUI.formats.add('formatFenToYuanAmount', { + tableCellFormatMethod({ cellValue }, digits = 2) { + return `${erpNumberFormatter(fenToYuan(cellValue), digits)}元`; + }, + }); }, useVbenForm, }); -export { useVbenVxeGrid }; +export { createRequiredValidation, useVbenVxeGrid }; const [VxeTable, VxeColumn, VxeToolbar] = AsyncComponents; export { VxeColumn, VxeTable, VxeToolbar }; diff --git a/apps/web-antd/src/api/bpm/processInstance/index.ts b/apps/web-antd/src/api/bpm/processInstance/index.ts index 49c623b7..cc1683f6 100644 --- a/apps/web-antd/src/api/bpm/processInstance/index.ts +++ b/apps/web-antd/src/api/bpm/processInstance/index.ts @@ -40,6 +40,7 @@ export namespace BpmProcessInstanceApi { nodeType: BpmNodeTypeEnum; startTime?: Date; status: number; + processInstanceId?: string; tasks: ApprovalTaskInfo[]; } diff --git a/apps/web-antd/src/api/bpm/task/index.ts b/apps/web-antd/src/api/bpm/task/index.ts index 510ea174..7d9f2509 100644 --- a/apps/web-antd/src/api/bpm/task/index.ts +++ b/apps/web-antd/src/api/bpm/task/index.ts @@ -130,3 +130,8 @@ export const getChildrenTaskList = async (id: string) => { `/bpm/task/list-by-parent-task-id?parentTaskId=${id}`, ); }; + +// 撤回任务 +export const withdrawTask = async (taskId: string) => { + return await requestClient.put('/bpm/task/withdraw', null, { params: { taskId } }); +}; diff --git a/apps/web-antd/src/api/erp/finance/account/index.ts b/apps/web-antd/src/api/erp/finance/account/index.ts new file mode 100644 index 00000000..e180af65 --- /dev/null +++ b/apps/web-antd/src/api/erp/finance/account/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpAccountApi { + /** ERP 结算账户信息 */ + export interface Account { + id?: number; // 结算账户编号 + no: string; // 账户编码 + remark: string; // 备注 + status: number; // 开启状态 + sort: number; // 排序 + defaultStatus: boolean; // 是否默认 + name: string; // 账户名称 + } + + /** 结算账户分页查询参数 */ + export interface AccountPageParam extends PageParam { + name?: string; + no?: string; + status?: number; + } +} + +/** 查询结算账户分页 */ +export function getAccountPage(params: ErpAccountApi.AccountPageParam) { + return requestClient.get>( + '/erp/account/page', + { params }, + ); +} + +/** 查询结算账户精简列表 */ +export function getAccountSimpleList() { + return requestClient.get('/erp/account/simple-list'); +} + +/** 查询结算账户详情 */ +export function getAccount(id: number) { + return requestClient.get(`/erp/account/get?id=${id}`); +} + +/** 新增结算账户 */ +export function createAccount(data: ErpAccountApi.Account) { + return requestClient.post('/erp/account/create', data); +} + +/** 修改结算账户 */ +export function updateAccount(data: ErpAccountApi.Account) { + return requestClient.put('/erp/account/update', data); +} + +/** 修改结算账户默认状态 */ +export function updateAccountDefaultStatus(id: number, defaultStatus: boolean) { + return requestClient.put('/erp/account/update-default-status', null, { + params: { id, defaultStatus }, + }); +} + +/** 删除结算账户 */ +export function deleteAccount(id: number) { + return requestClient.delete(`/erp/account/delete?id=${id}`); +} + +/** 导出结算账户 Excel */ +export function exportAccount(params: any) { + return requestClient.download('/erp/account/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/finance/payment/index.ts b/apps/web-antd/src/api/erp/finance/payment/index.ts new file mode 100644 index 00000000..e9dc1847 --- /dev/null +++ b/apps/web-antd/src/api/erp/finance/payment/index.ts @@ -0,0 +1,103 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpFinancePaymentApi { + /** 付款单信息 */ + export interface FinancePayment { + id?: number; // 付款单编号 + no: string; // 付款单号 + supplierId: number; // 供应商编号 + paymentTime: Date; // 付款时间 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 付款单分页查询参数 */ + export interface FinancePaymentPageParams extends PageParam { + no?: string; + supplierId?: number; + status?: number; + } + + /** 付款单状态更新参数 */ + export interface FinancePaymentStatusParams { + id: number; + status: number; + } +} + +/** + * 查询付款单分页 + */ +export function getFinancePaymentPage( + params: ErpFinancePaymentApi.FinancePaymentPageParams, +) { + return requestClient.get>( + '/erp/finance-payment/page', + { + params, + }, + ); +} + +/** + * 查询付款单详情 + */ +export function getFinancePayment(id: number) { + return requestClient.get( + `/erp/finance-payment/get?id=${id}`, + ); +} + +/** + * 新增付款单 + */ +export function createFinancePayment( + data: ErpFinancePaymentApi.FinancePayment, +) { + return requestClient.post('/erp/finance-payment/create', data); +} + +/** + * 修改付款单 + */ +export function updateFinancePayment( + data: ErpFinancePaymentApi.FinancePayment, +) { + return requestClient.put('/erp/finance-payment/update', data); +} + +/** + * 更新付款单的状态 + */ +export function updateFinancePaymentStatus( + params: ErpFinancePaymentApi.FinancePaymentStatusParams, +) { + return requestClient.put('/erp/finance-payment/update-status', null, { + params, + }); +} + +/** + * 删除付款单 + */ +export function deleteFinancePayment(ids: number[]) { + return requestClient.delete('/erp/finance-payment/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出付款单 Excel + */ +export function exportFinancePayment( + params: ErpFinancePaymentApi.FinancePaymentPageParams, +) { + return requestClient.download('/erp/finance-payment/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/finance/receipt/index.ts b/apps/web-antd/src/api/erp/finance/receipt/index.ts new file mode 100644 index 00000000..37b70e76 --- /dev/null +++ b/apps/web-antd/src/api/erp/finance/receipt/index.ts @@ -0,0 +1,103 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpFinanceReceiptApi { + /** 收款单信息 */ + export interface FinanceReceipt { + id?: number; // 收款单编号 + no: string; // 收款单号 + customerId: number; // 客户编号 + receiptTime: Date; // 收款时间 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 收款单分页查询参数 */ + export interface FinanceReceiptPageParams extends PageParam { + no?: string; + customerId?: number; + status?: number; + } + + /** 收款单状态更新参数 */ + export interface FinanceReceiptStatusParams { + id: number; + status: number; + } +} + +/** + * 查询收款单分页 + */ +export function getFinanceReceiptPage( + params: ErpFinanceReceiptApi.FinanceReceiptPageParams, +) { + return requestClient.get>( + '/erp/finance-receipt/page', + { + params, + }, + ); +} + +/** + * 查询收款单详情 + */ +export function getFinanceReceipt(id: number) { + return requestClient.get( + `/erp/finance-receipt/get?id=${id}`, + ); +} + +/** + * 新增收款单 + */ +export function createFinanceReceipt( + data: ErpFinanceReceiptApi.FinanceReceipt, +) { + return requestClient.post('/erp/finance-receipt/create', data); +} + +/** + * 修改收款单 + */ +export function updateFinanceReceipt( + data: ErpFinanceReceiptApi.FinanceReceipt, +) { + return requestClient.put('/erp/finance-receipt/update', data); +} + +/** + * 更新收款单的状态 + */ +export function updateFinanceReceiptStatus( + params: ErpFinanceReceiptApi.FinanceReceiptStatusParams, +) { + return requestClient.put('/erp/finance-receipt/update-status', null, { + params, + }); +} + +/** + * 删除收款单 + */ +export function deleteFinanceReceipt(ids: number[]) { + return requestClient.delete('/erp/finance-receipt/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出收款单 Excel + */ +export function exportFinanceReceipt( + params: ErpFinanceReceiptApi.FinanceReceiptPageParams, +) { + return requestClient.download('/erp/finance-receipt/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/product/category/index.ts b/apps/web-antd/src/api/erp/product/category/index.ts new file mode 100644 index 00000000..b16a91e3 --- /dev/null +++ b/apps/web-antd/src/api/erp/product/category/index.ts @@ -0,0 +1,60 @@ +import { requestClient } from '#/api/request'; + +export namespace ErpProductCategoryApi { + /** ERP 产品分类信息 */ + export interface ProductCategory { + id?: number; // 分类编号 + parentId: number; // 父分类编号 + name: string; // 分类名称 + code: string; // 分类编码 + sort: number; // 分类排序 + status: number; // 开启状态 + } +} + +/** 查询产品分类列表 */ +export function getProductCategoryList() { + return requestClient.get( + '/erp/product-category/list', + ); +} + +/** 查询产品分类精简列表 */ +export function getProductCategorySimpleList() { + return requestClient.get( + '/erp/product-category/simple-list', + ); +} + +/** 查询产品分类详情 */ +export function getProductCategory(id: number) { + return requestClient.get( + `/erp/product-category/get?id=${id}`, + ); +} + +/** 新增产品分类 */ +export function createProductCategory( + data: ErpProductCategoryApi.ProductCategory, +) { + return requestClient.post('/erp/product-category/create', data); +} + +/** 修改产品分类 */ +export function updateProductCategory( + data: ErpProductCategoryApi.ProductCategory, +) { + return requestClient.put('/erp/product-category/update', data); +} + +/** 删除产品分类 */ +export function deleteProductCategory(id: number) { + return requestClient.delete(`/erp/product-category/delete?id=${id}`); +} + +/** 导出产品分类 Excel */ +export function exportProductCategory(params: any) { + return requestClient.download('/erp/product-category/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/product/product/index.ts b/apps/web-antd/src/api/erp/product/product/index.ts new file mode 100644 index 00000000..157827ff --- /dev/null +++ b/apps/web-antd/src/api/erp/product/product/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpProductApi { + /** ERP 产品信息 */ + export interface Product { + id?: number; // 产品编号 + name: string; // 产品名称 + barCode: string; // 产品条码 + categoryId: number; // 产品类型编号 + unitId: number; // 单位编号 + unitName?: string; // 单位名字 + status: number; // 产品状态 + standard: string; // 产品规格 + remark: string; // 产品备注 + expiryDay: number; // 保质期天数 + weight: number; // 重量(kg) + purchasePrice: number; // 采购价格,单位:元 + salePrice: number; // 销售价格,单位:元 + minPrice: number; // 最低价格,单位:元 + } +} + +/** 查询产品分页 */ +export function getProductPage(params: PageParam) { + return requestClient.get>( + '/erp/product/page', + { params }, + ); +} + +/** 查询产品精简列表 */ +export function getProductSimpleList() { + return requestClient.get('/erp/product/simple-list'); +} + +/** 查询产品详情 */ +export function getProduct(id: number) { + return requestClient.get(`/erp/product/get?id=${id}`); +} + +/** 新增产品 */ +export function createProduct(data: ErpProductApi.Product) { + return requestClient.post('/erp/product/create', data); +} + +/** 修改产品 */ +export function updateProduct(data: ErpProductApi.Product) { + return requestClient.put('/erp/product/update', data); +} + +/** 删除产品 */ +export function deleteProduct(id: number) { + return requestClient.delete(`/erp/product/delete?id=${id}`); +} + +/** 导出产品 Excel */ +export function exportProduct(params: any) { + return requestClient.download('/erp/product/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/product/unit/index.ts b/apps/web-antd/src/api/erp/product/unit/index.ts new file mode 100644 index 00000000..317c09c8 --- /dev/null +++ b/apps/web-antd/src/api/erp/product/unit/index.ts @@ -0,0 +1,62 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpProductUnitApi { + /** ERP 产品单位信息 */ + export interface ProductUnit { + id?: number; // 单位编号 + name: string; // 单位名字 + status: number; // 单位状态 + } + + /** 产品单位分页查询参数 */ + export interface ProductUnitPageParam extends PageParam { + name?: string; + status?: number; + } +} + +/** 查询产品单位分页 */ +export function getProductUnitPage( + params: ErpProductUnitApi.ProductUnitPageParam, +) { + return requestClient.get>( + '/erp/product-unit/page', + { params }, + ); +} + +/** 查询产品单位精简列表 */ +export function getProductUnitSimpleList() { + return requestClient.get( + '/erp/product-unit/simple-list', + ); +} + +/** 查询产品单位详情 */ +export function getProductUnit(id: number) { + return requestClient.get( + `/erp/product-unit/get?id=${id}`, + ); +} + +/** 新增产品单位 */ +export function createProductUnit(data: ErpProductUnitApi.ProductUnit) { + return requestClient.post('/erp/product-unit/create', data); +} + +/** 修改产品单位 */ +export function updateProductUnit(data: ErpProductUnitApi.ProductUnit) { + return requestClient.put('/erp/product-unit/update', data); +} + +/** 删除产品单位 */ +export function deleteProductUnit(id: number) { + return requestClient.delete(`/erp/product-unit/delete?id=${id}`); +} + +/** 导出产品单位 Excel */ +export function exportProductUnit(params: any) { + return requestClient.download('/erp/product-unit/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/purchase/in/index.ts b/apps/web-antd/src/api/erp/purchase/in/index.ts new file mode 100644 index 00000000..fde2c0fb --- /dev/null +++ b/apps/web-antd/src/api/erp/purchase/in/index.ts @@ -0,0 +1,102 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpPurchaseInApi { + /** 采购入库信息 */ + export interface PurchaseIn { + id?: number; // 入库工单编号 + no: string; // 采购入库号 + supplierId: number; // 供应商编号 + inTime: Date; // 入库时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + outCount: number; // 采购出库数量 + returnCount: number; // 采购退货数量 + } + + /** 采购入库分页查询参数 */ + export interface PurchaseInPageParams extends PageParam { + no?: string; + supplierId?: number; + status?: number; + } + + /** 采购入库状态更新参数 */ + export interface PurchaseInStatusParams { + id: number; + status: number; + } +} + +/** + * 查询采购入库分页 + */ +export function getPurchaseInPage( + params: ErpPurchaseInApi.PurchaseInPageParams, +) { + return requestClient.get>( + '/erp/purchase-in/page', + { + params, + }, + ); +} + +/** + * 查询采购入库详情 + */ +export function getPurchaseIn(id: number) { + return requestClient.get( + `/erp/purchase-in/get?id=${id}`, + ); +} + +/** + * 新增采购入库 + */ +export function createPurchaseIn(data: ErpPurchaseInApi.PurchaseIn) { + return requestClient.post('/erp/purchase-in/create', data); +} + +/** + * 修改采购入库 + */ +export function updatePurchaseIn(data: ErpPurchaseInApi.PurchaseIn) { + return requestClient.put('/erp/purchase-in/update', data); +} + +/** + * 更新采购入库的状态 + */ +export function updatePurchaseInStatus( + params: ErpPurchaseInApi.PurchaseInStatusParams, +) { + return requestClient.put('/erp/purchase-in/update-status', null, { + params, + }); +} + +/** + * 删除采购入库 + */ +export function deletePurchaseIn(ids: number[]) { + return requestClient.delete('/erp/purchase-in/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出采购入库 Excel + */ +export function exportPurchaseIn( + params: ErpPurchaseInApi.PurchaseInPageParams, +) { + return requestClient.download('/erp/purchase-in/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/purchase/order/index.ts b/apps/web-antd/src/api/erp/purchase/order/index.ts new file mode 100644 index 00000000..ae84c243 --- /dev/null +++ b/apps/web-antd/src/api/erp/purchase/order/index.ts @@ -0,0 +1,116 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpPurchaseOrderApi { + /** ERP 采购订单项信息 */ + export interface PurchaseOrderItem { + id?: number; // 订单项编号 + orderId?: number; // 采购订单编号 + productId?: number; // 产品编号 + productName?: string; // 产品名称 + productBarCode?: string; // 产品条码 + productUnitId?: number; // 产品单位编号 + productUnitName?: string; // 产品单位名称 + productPrice?: number; // 产品单价,单位:元 + totalProductPrice?: number; // 产品总价,单位:元 + count?: number; // 数量 + totalPrice?: number; // 总价,单位:元 + taxPercent?: number; // 税率,百分比 + taxPrice?: number; // 税额,单位:元 + totalTaxPrice?: number; // 含税总价,单位:元 + remark?: string; // 备注 + stockCount?: number; // 库存数量(显示字段) + } + + /** ERP 采购订单信息 */ + export interface PurchaseOrder { + id?: number; // 订单工单编号 + no?: string; // 采购订单号 + supplierId?: number; // 供应商编号 + supplierName?: string; // 供应商名称 + orderTime?: Date | string; // 订单时间 + totalCount?: number; // 合计数量 + totalPrice?: number; // 合计金额,单位:元 + totalProductPrice?: number; // 产品金额,单位:元 + discountPercent?: number; // 优惠率,百分比 + discountPrice?: number; // 优惠金额,单位:元 + depositPrice?: number; // 定金金额,单位:元 + accountId?: number; // 结算账户编号 + status?: number; // 状态 + remark?: string; // 备注 + fileUrl?: string; // 附件地址 + inCount?: number; // 采购入库数量 + returnCount?: number; // 采购退货数量 + inStatus?: number; // 入库状态 + returnStatus?: number; // 退货状态 + productNames?: string; // 产品名称列表 + creatorName?: string; // 创建人名称 + createTime?: Date; // 创建时间 + items?: PurchaseOrderItem[]; // 订单项列表 + } + + /** 采购订单分页查询参数 */ + export interface PurchaseOrderPageParam extends PageParam { + no?: string; + supplierId?: number; + productId?: number; + orderTime?: string[]; + status?: number; + remark?: string; + creator?: string; + inStatus?: number; + returnStatus?: number; + } +} + +/** 查询采购订单分页 */ +export function getPurchaseOrderPage( + params: ErpPurchaseOrderApi.PurchaseOrderPageParam, +) { + return requestClient.get>( + '/erp/purchase-order/page', + { params }, + ); +} + +/** 查询采购订单详情 */ +export function getPurchaseOrder(id: number) { + return requestClient.get( + `/erp/purchase-order/get?id=${id}`, + ); +} + +/** 新增采购订单 */ +export function createPurchaseOrder(data: ErpPurchaseOrderApi.PurchaseOrder) { + return requestClient.post('/erp/purchase-order/create', data); +} + +/** 修改采购订单 */ +export function updatePurchaseOrder(data: ErpPurchaseOrderApi.PurchaseOrder) { + return requestClient.put('/erp/purchase-order/update', data); +} + +/** 更新采购订单的状态 */ +export function updatePurchaseOrderStatus(id: number, status: number) { + return requestClient.put('/erp/purchase-order/update-status', null, { + params: { id, status }, + }); +} + +/** 删除采购订单 */ +export function deletePurchaseOrder(id: number) { + return requestClient.delete(`/erp/purchase-order/delete?id=${id}`); +} + +/** 批量删除采购订单 */ +export function deletePurchaseOrderList(ids: number[]) { + return requestClient.delete('/erp/purchase-order/delete', { + params: { ids: ids.join(',') }, + }); +} + +/** 导出采购订单 Excel */ +export function exportPurchaseOrder(params: any) { + return requestClient.download('/erp/purchase-order/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/purchase/return/index.ts b/apps/web-antd/src/api/erp/purchase/return/index.ts new file mode 100644 index 00000000..461a76f7 --- /dev/null +++ b/apps/web-antd/src/api/erp/purchase/return/index.ts @@ -0,0 +1,104 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpPurchaseReturnApi { + /** 采购退货信息 */ + export interface PurchaseReturn { + id?: number; // 采购退货编号 + no: string; // 采购退货号 + supplierId: number; // 供应商编号 + returnTime: Date; // 退货时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 采购退货分页查询参数 */ + export interface PurchaseReturnPageParams extends PageParam { + no?: string; + supplierId?: number; + status?: number; + } + + /** 采购退货状态更新参数 */ + export interface PurchaseReturnStatusParams { + id: number; + status: number; + } +} + +/** + * 查询采购退货分页 + */ +export function getPurchaseReturnPage( + params: ErpPurchaseReturnApi.PurchaseReturnPageParams, +) { + return requestClient.get>( + '/erp/purchase-return/page', + { + params, + }, + ); +} + +/** + * 查询采购退货详情 + */ +export function getPurchaseReturn(id: number) { + return requestClient.get( + `/erp/purchase-return/get?id=${id}`, + ); +} + +/** + * 新增采购退货 + */ +export function createPurchaseReturn( + data: ErpPurchaseReturnApi.PurchaseReturn, +) { + return requestClient.post('/erp/purchase-return/create', data); +} + +/** + * 修改采购退货 + */ +export function updatePurchaseReturn( + data: ErpPurchaseReturnApi.PurchaseReturn, +) { + return requestClient.put('/erp/purchase-return/update', data); +} + +/** + * 更新采购退货的状态 + */ +export function updatePurchaseReturnStatus( + params: ErpPurchaseReturnApi.PurchaseReturnStatusParams, +) { + return requestClient.put('/erp/purchase-return/update-status', null, { + params, + }); +} + +/** + * 删除采购退货 + */ +export function deletePurchaseReturn(ids: number[]) { + return requestClient.delete('/erp/purchase-return/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出采购退货 Excel + */ +export function exportPurchaseReturn( + params: ErpPurchaseReturnApi.PurchaseReturnPageParams, +) { + return requestClient.download('/erp/purchase-return/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/purchase/supplier/index.ts b/apps/web-antd/src/api/erp/purchase/supplier/index.ts new file mode 100644 index 00000000..fb74b9f3 --- /dev/null +++ b/apps/web-antd/src/api/erp/purchase/supplier/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpSupplierApi { + /** ERP 供应商信息 */ + export interface Supplier { + id?: number; // 供应商编号 + name: string; // 供应商名称 + contact: string; // 联系人 + mobile: string; // 手机号码 + telephone: string; // 联系电话 + email: string; // 电子邮箱 + fax: string; // 传真 + remark: string; // 备注 + status: number; // 开启状态 + sort: number; // 排序 + taxNo: string; // 纳税人识别号 + taxPercent: number; // 税率 + bankName: string; // 开户行 + bankAccount: string; // 开户账号 + bankAddress: string; // 开户地址 + } + + /** 供应商分页查询参数 */ + export interface SupplierPageParam extends PageParam { + name?: string; + mobile?: string; + status?: number; + } +} + +/** 查询供应商分页 */ +export function getSupplierPage(params: ErpSupplierApi.SupplierPageParam) { + return requestClient.get>( + '/erp/supplier/page', + { params }, + ); +} + +/** 获得供应商精简列表 */ +export function getSupplierSimpleList() { + return requestClient.get( + '/erp/supplier/simple-list', + ); +} + +/** 查询供应商详情 */ +export function getSupplier(id: number) { + return requestClient.get( + `/erp/supplier/get?id=${id}`, + ); +} + +/** 新增供应商 */ +export function createSupplier(data: ErpSupplierApi.Supplier) { + return requestClient.post('/erp/supplier/create', data); +} + +/** 修改供应商 */ +export function updateSupplier(data: ErpSupplierApi.Supplier) { + return requestClient.put('/erp/supplier/update', data); +} + +/** 删除供应商 */ +export function deleteSupplier(id: number) { + return requestClient.delete(`/erp/supplier/delete?id=${id}`); +} + +/** 导出供应商 Excel */ +export function exportSupplier(params: any) { + return requestClient.download('/erp/supplier/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/sale/customer/index.ts b/apps/web-antd/src/api/erp/sale/customer/index.ts new file mode 100644 index 00000000..6cebd018 --- /dev/null +++ b/apps/web-antd/src/api/erp/sale/customer/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpCustomerApi { + /** ERP 客户信息 */ + export interface Customer { + id?: number; // 客户编号 + name: string; // 客户名称 + contact: string; // 联系人 + mobile: string; // 手机号码 + telephone: string; // 联系电话 + email: string; // 电子邮箱 + fax: string; // 传真 + remark: string; // 备注 + status: number; // 开启状态 + sort: number; // 排序 + taxNo: string; // 纳税人识别号 + taxPercent: number; // 税率 + bankName: string; // 开户行 + bankAccount: string; // 开户账号 + bankAddress: string; // 开户地址 + } + + /** 客户分页查询参数 */ + export interface CustomerPageParam extends PageParam { + name?: string; + mobile?: string; + status?: number; + } +} + +/** 查询客户分页 */ +export function getCustomerPage(params: ErpCustomerApi.CustomerPageParam) { + return requestClient.get>( + '/erp/customer/page', + { params }, + ); +} + +/** 查询客户精简列表 */ +export function getCustomerSimpleList() { + return requestClient.get( + '/erp/customer/simple-list', + ); +} + +/** 查询客户详情 */ +export function getCustomer(id: number) { + return requestClient.get( + `/erp/customer/get?id=${id}`, + ); +} + +/** 新增客户 */ +export function createCustomer(data: ErpCustomerApi.Customer) { + return requestClient.post('/erp/customer/create', data); +} + +/** 修改客户 */ +export function updateCustomer(data: ErpCustomerApi.Customer) { + return requestClient.put('/erp/customer/update', data); +} + +/** 删除客户 */ +export function deleteCustomer(id: number) { + return requestClient.delete(`/erp/customer/delete?id=${id}`); +} + +/** 导出客户 Excel */ +export function exportCustomer(params: any) { + return requestClient.download('/erp/customer/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/sale/order/index.ts b/apps/web-antd/src/api/erp/sale/order/index.ts new file mode 100644 index 00000000..211a28e2 --- /dev/null +++ b/apps/web-antd/src/api/erp/sale/order/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpSaleOrderApi { + /** ERP 销售订单信息 */ + export interface SaleOrder { + id?: number; // 订单工单编号 + no: string; // 销售订单号 + customerId: number; // 客户编号 + orderTime: Date; // 订单时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + outCount: number; // 销售出库数量 + returnCount: number; // 销售退货数量 + } + + /** 销售订单分页查询参数 */ + export interface SaleOrderPageParam extends PageParam { + no?: string; + customerId?: number; + status?: number; + } +} + +/** 查询销售订单分页 */ +export function getSaleOrderPage(params: ErpSaleOrderApi.SaleOrderPageParam) { + return requestClient.get>( + '/erp/sale-order/page', + { params }, + ); +} + +/** 查询销售订单详情 */ +export function getSaleOrder(id: number) { + return requestClient.get( + `/erp/sale-order/get?id=${id}`, + ); +} + +/** 新增销售订单 */ +export function createSaleOrder(data: ErpSaleOrderApi.SaleOrder) { + return requestClient.post('/erp/sale-order/create', data); +} + +/** 修改销售订单 */ +export function updateSaleOrder(data: ErpSaleOrderApi.SaleOrder) { + return requestClient.put('/erp/sale-order/update', data); +} + +/** 更新销售订单的状态 */ +export function updateSaleOrderStatus(id: number, status: number) { + return requestClient.put('/erp/sale-order/update-status', null, { + params: { id, status }, + }); +} + +/** 删除销售订单 */ +export function deleteSaleOrder(ids: number[]) { + return requestClient.delete('/erp/sale-order/delete', { + params: { ids: ids.join(',') }, + }); +} + +/** 导出销售订单 Excel */ +export function exportSaleOrder(params: any) { + return requestClient.download('/erp/sale-order/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/sale/out/index.ts b/apps/web-antd/src/api/erp/sale/out/index.ts new file mode 100644 index 00000000..62045216 --- /dev/null +++ b/apps/web-antd/src/api/erp/sale/out/index.ts @@ -0,0 +1,92 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpSaleOutApi { + /** 销售出库信息 */ + export interface SaleOut { + id?: number; // 销售出库编号 + no: string; // 销售出库号 + customerId: number; // 客户编号 + outTime: Date; // 出库时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 销售出库分页查询参数 */ + export interface SaleOutPageParams extends PageParam { + no?: string; + customerId?: number; + status?: number; + } + + /** 销售出库状态更新参数 */ + export interface SaleOutStatusParams { + id: number; + status: number; + } +} + +/** + * 查询销售出库分页 + */ +export function getSaleOutPage(params: ErpSaleOutApi.SaleOutPageParams) { + return requestClient.get>( + '/erp/sale-out/page', + { + params, + }, + ); +} + +/** + * 查询销售出库详情 + */ +export function getSaleOut(id: number) { + return requestClient.get(`/erp/sale-out/get?id=${id}`); +} + +/** + * 新增销售出库 + */ +export function createSaleOut(data: ErpSaleOutApi.SaleOut) { + return requestClient.post('/erp/sale-out/create', data); +} + +/** + * 修改销售出库 + */ +export function updateSaleOut(data: ErpSaleOutApi.SaleOut) { + return requestClient.put('/erp/sale-out/update', data); +} + +/** + * 更新销售出库的状态 + */ +export function updateSaleOutStatus(params: ErpSaleOutApi.SaleOutStatusParams) { + return requestClient.put('/erp/sale-out/update-status', null, { + params, + }); +} + +/** + * 删除销售出库 + */ +export function deleteSaleOut(ids: number[]) { + return requestClient.delete('/erp/sale-out/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出销售出库 Excel + */ +export function exportSaleOut(params: ErpSaleOutApi.SaleOutPageParams) { + return requestClient.download('/erp/sale-out/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/sale/return/index.ts b/apps/web-antd/src/api/erp/sale/return/index.ts new file mode 100644 index 00000000..0ebcfc75 --- /dev/null +++ b/apps/web-antd/src/api/erp/sale/return/index.ts @@ -0,0 +1,100 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpSaleReturnApi { + /** 销售退货信息 */ + export interface SaleReturn { + id?: number; // 销售退货编号 + no: string; // 销售退货号 + customerId: number; // 客户编号 + returnTime: Date; // 退货时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 销售退货分页查询参数 */ + export interface SaleReturnPageParams extends PageParam { + no?: string; + customerId?: number; + status?: number; + } + + /** 销售退货状态更新参数 */ + export interface SaleReturnStatusParams { + id: number; + status: number; + } +} + +/** + * 查询销售退货分页 + */ +export function getSaleReturnPage( + params: ErpSaleReturnApi.SaleReturnPageParams, +) { + return requestClient.get>( + '/erp/sale-return/page', + { + params, + }, + ); +} + +/** + * 查询销售退货详情 + */ +export function getSaleReturn(id: number) { + return requestClient.get( + `/erp/sale-return/get?id=${id}`, + ); +} + +/** + * 新增销售退货 + */ +export function createSaleReturn(data: ErpSaleReturnApi.SaleReturn) { + return requestClient.post('/erp/sale-return/create', data); +} + +/** + * 修改销售退货 + */ +export function updateSaleReturn(data: ErpSaleReturnApi.SaleReturn) { + return requestClient.put('/erp/sale-return/update', data); +} + +/** + * 更新销售退货的状态 + */ +export function updateSaleReturnStatus( + params: ErpSaleReturnApi.SaleReturnStatusParams, +) { + return requestClient.put('/erp/sale-return/update-status', null, { + params, + }); +} + +/** + * 删除销售退货 + */ +export function deleteSaleReturn(ids: number[]) { + return requestClient.delete('/erp/sale-return/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出销售退货 Excel + */ +export function exportSaleReturn( + params: ErpSaleReturnApi.SaleReturnPageParams, +) { + return requestClient.download('/erp/sale-return/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/statistics/purchase/index.ts b/apps/web-antd/src/api/erp/statistics/purchase/index.ts new file mode 100644 index 00000000..170b9c11 --- /dev/null +++ b/apps/web-antd/src/api/erp/statistics/purchase/index.ts @@ -0,0 +1,31 @@ +import { requestClient } from '#/api/request'; + +export namespace ErpPurchaseStatisticsApi { + /** ERP 采购全局统计 */ + export interface PurchaseSummary { + todayPrice: number; // 今日采购金额 + yesterdayPrice: number; // 昨日采购金额 + monthPrice: number; // 本月采购金额 + yearPrice: number; // 今年采购金额 + } + + /** ERP 采购时间段统计 */ + export interface PurchaseTimeSummary { + time: string; // 时间 + price: number; // 采购金额 + } +} + +/** 获得采购统计 */ +export function getPurchaseSummary() { + return requestClient.get( + '/erp/purchase-statistics/summary', + ); +} + +/** 获得采购时间段统计 */ +export function getPurchaseTimeSummary() { + return requestClient.get( + '/erp/purchase-statistics/time-summary', + ); +} diff --git a/apps/web-antd/src/api/erp/statistics/sale/index.ts b/apps/web-antd/src/api/erp/statistics/sale/index.ts new file mode 100644 index 00000000..c4c7986a --- /dev/null +++ b/apps/web-antd/src/api/erp/statistics/sale/index.ts @@ -0,0 +1,31 @@ +import { requestClient } from '#/api/request'; + +export namespace ErpSaleStatisticsApi { + /** ERP 销售全局统计 */ + export interface SaleSummary { + todayPrice: number; // 今日销售金额 + yesterdayPrice: number; // 昨日销售金额 + monthPrice: number; // 本月销售金额 + yearPrice: number; // 今年销售金额 + } + + /** ERP 销售时间段统计 */ + export interface SaleTimeSummary { + time: string; // 时间 + price: number; // 销售金额 + } +} + +/** 获得销售统计 */ +export function getSaleSummary() { + return requestClient.get( + '/erp/sale-statistics/summary', + ); +} + +/** 获得销售时间段统计 */ +export function getSaleTimeSummary() { + return requestClient.get( + '/erp/sale-statistics/time-summary', + ); +} diff --git a/apps/web-antd/src/api/erp/stock/check/index.ts b/apps/web-antd/src/api/erp/stock/check/index.ts new file mode 100644 index 00000000..090d8786 --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/check/index.ts @@ -0,0 +1,98 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpStockCheckApi { + /** 库存盘点单信息 */ + export interface StockCheck { + id?: number; // 盘点编号 + no: string; // 盘点单号 + checkTime: Date; // 盘点时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 库存盘点单分页查询参数 */ + export interface StockCheckPageParams extends PageParam { + no?: string; + status?: number; + } + + /** 库存盘点单状态更新参数 */ + export interface StockCheckStatusParams { + id: number; + status: number; + } +} + +/** + * 查询库存盘点单分页 + */ +export function getStockCheckPage( + params: ErpStockCheckApi.StockCheckPageParams, +) { + return requestClient.get>( + '/erp/stock-check/page', + { + params, + }, + ); +} + +/** + * 查询库存盘点单详情 + */ +export function getStockCheck(id: number) { + return requestClient.get( + `/erp/stock-check/get?id=${id}`, + ); +} + +/** + * 新增库存盘点单 + */ +export function createStockCheck(data: ErpStockCheckApi.StockCheck) { + return requestClient.post('/erp/stock-check/create', data); +} + +/** + * 修改库存盘点单 + */ +export function updateStockCheck(data: ErpStockCheckApi.StockCheck) { + return requestClient.put('/erp/stock-check/update', data); +} + +/** + * 更新库存盘点单的状态 + */ +export function updateStockCheckStatus( + params: ErpStockCheckApi.StockCheckStatusParams, +) { + return requestClient.put('/erp/stock-check/update-status', null, { + params, + }); +} + +/** + * 删除库存盘点单 + */ +export function deleteStockCheck(ids: number[]) { + return requestClient.delete('/erp/stock-check/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出库存盘点单 Excel + */ +export function exportStockCheck( + params: ErpStockCheckApi.StockCheckPageParams, +) { + return requestClient.download('/erp/stock-check/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/stock/in/index.ts b/apps/web-antd/src/api/erp/stock/in/index.ts new file mode 100644 index 00000000..8fe9bafd --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/in/index.ts @@ -0,0 +1,113 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpStockInApi { + /** 其它入库单信息 */ + export interface StockIn { + id?: number; // 入库编号 + no: string; // 入库单号 + supplierId: number; // 供应商编号 + supplierName?: string; // 供应商名称 + inTime: Date; // 入库时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + fileUrl?: string; // 附件 + productNames?: string; // 产品信息 + creatorName?: string; // 创建人 + items?: StockInItem[]; // 入库产品清单 + } + + /** 其它入库单产品信息 */ + export interface StockInItem { + id?: number; // 编号 + warehouseId: number; // 仓库编号 + productId: number; // 产品编号 + productName?: string; // 产品名称 + productUnitId?: number; // 产品单位编号 + productUnitName?: string; // 产品单位名称 + productBarCode?: string; // 产品条码 + count: number; // 数量 + productPrice: number; // 产品单价 + totalPrice: number; // 总价 + stockCount?: number; // 库存数量 + remark?: string; // 备注 + } + + /** 其它入库单分页查询参数 */ + export interface StockInPageParams extends PageParam { + no?: string; + supplierId?: number; + status?: number; + } + + /** 其它入库单状态更新参数 */ + export interface StockInStatusParams { + id: number; + status: number; + } +} + +/** + * 查询其它入库单分页 + */ +export function getStockInPage(params: ErpStockInApi.StockInPageParams) { + return requestClient.get>( + '/erp/stock-in/page', + { + params, + }, + ); +} + +/** + * 查询其它入库单详情 + */ +export function getStockIn(id: number) { + return requestClient.get(`/erp/stock-in/get?id=${id}`); +} + +/** + * 新增其它入库单 + */ +export function createStockIn(data: ErpStockInApi.StockIn) { + return requestClient.post('/erp/stock-in/create', data); +} + +/** + * 修改其它入库单 + */ +export function updateStockIn(data: ErpStockInApi.StockIn) { + return requestClient.put('/erp/stock-in/update', data); +} + +/** + * 更新其它入库单的状态 + */ +export function updateStockInStatus(params: ErpStockInApi.StockInStatusParams) { + return requestClient.put('/erp/stock-in/update-status', null, { + params, + }); +} + +/** + * 删除其它入库单 + */ +export function deleteStockIn(ids: number[]) { + return requestClient.delete('/erp/stock-in/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出其它入库单 Excel + */ +export function exportStockIn(params: ErpStockInApi.StockInPageParams) { + return requestClient.download('/erp/stock-in/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/stock/move/index.ts b/apps/web-antd/src/api/erp/stock/move/index.ts new file mode 100644 index 00000000..765d27eb --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/move/index.ts @@ -0,0 +1,94 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpStockMoveApi { + /** 库存调拨单信息 */ + export interface StockMove { + id?: number; // 调拨编号 + no: string; // 调拨单号 + outTime: Date; // 调拨时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 库存调拨单分页查询参数 */ + export interface StockMovePageParams extends PageParam { + no?: string; + status?: number; + } + + /** 库存调拨单状态更新参数 */ + export interface StockMoveStatusParams { + id: number; + status: number; + } +} + +/** + * 查询库存调拨单分页 + */ +export function getStockMovePage(params: ErpStockMoveApi.StockMovePageParams) { + return requestClient.get>( + '/erp/stock-move/page', + { + params, + }, + ); +} + +/** + * 查询库存调拨单详情 + */ +export function getStockMove(id: number) { + return requestClient.get( + `/erp/stock-move/get?id=${id}`, + ); +} + +/** + * 新增库存调拨单 + */ +export function createStockMove(data: ErpStockMoveApi.StockMove) { + return requestClient.post('/erp/stock-move/create', data); +} + +/** + * 修改库存调拨单 + */ +export function updateStockMove(data: ErpStockMoveApi.StockMove) { + return requestClient.put('/erp/stock-move/update', data); +} + +/** + * 更新库存调拨单的状态 + */ +export function updateStockMoveStatus( + params: ErpStockMoveApi.StockMoveStatusParams, +) { + return requestClient.put('/erp/stock-move/update-status', null, { + params, + }); +} + +/** + * 删除库存调拨单 + */ +export function deleteStockMove(ids: number[]) { + return requestClient.delete('/erp/stock-move/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出库存调拨单 Excel + */ +export function exportStockMove(params: ErpStockMoveApi.StockMovePageParams) { + return requestClient.download('/erp/stock-move/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/stock/out/index.ts b/apps/web-antd/src/api/erp/stock/out/index.ts new file mode 100644 index 00000000..2224e2dd --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/out/index.ts @@ -0,0 +1,96 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +namespace ErpStockOutApi { + /** 其它出库单信息 */ + export interface StockOut { + id?: number; // 出库编号 + no: string; // 出库单号 + customerId: number; // 客户编号 + outTime: Date; // 出库时间 + totalCount: number; // 合计数量 + totalPrice: number; // 合计金额,单位:元 + status: number; // 状态 + remark: string; // 备注 + } + + /** 其它出库单分页查询参数 */ + export interface StockOutPageParams extends PageParam { + no?: string; + customerId?: number; + status?: number; + } + + /** 其它出库单状态更新参数 */ + export interface StockOutStatusParams { + id: number; + status: number; + } +} + +/** + * 查询其它出库单分页 + */ +export function getStockOutPage(params: ErpStockOutApi.StockOutPageParams) { + return requestClient.get>( + '/erp/stock-out/page', + { + params, + }, + ); +} + +/** + * 查询其它出库单详情 + */ +export function getStockOut(id: number) { + return requestClient.get( + `/erp/stock-out/get?id=${id}`, + ); +} + +/** + * 新增其它出库单 + */ +export function createStockOut(data: ErpStockOutApi.StockOut) { + return requestClient.post('/erp/stock-out/create', data); +} + +/** + * 修改其它出库单 + */ +export function updateStockOut(data: ErpStockOutApi.StockOut) { + return requestClient.put('/erp/stock-out/update', data); +} + +/** + * 更新其它出库单的状态 + */ +export function updateStockOutStatus( + params: ErpStockOutApi.StockOutStatusParams, +) { + return requestClient.put('/erp/stock-out/update-status', null, { + params, + }); +} + +/** + * 删除其它出库单 + */ +export function deleteStockOut(ids: number[]) { + return requestClient.delete('/erp/stock-out/delete', { + params: { + ids: ids.join(','), + }, + }); +} + +/** + * 导出其它出库单 Excel + */ +export function exportStockOut(params: ErpStockOutApi.StockOutPageParams) { + return requestClient.download('/erp/stock-out/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/stock/record/index.ts b/apps/web-antd/src/api/erp/stock/record/index.ts new file mode 100644 index 00000000..364091bf --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/record/index.ts @@ -0,0 +1,47 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpStockRecordApi { + /** ERP 产品库存明细 */ + export interface StockRecord { + id?: number; // 编号 + productId: number; // 产品编号 + warehouseId: number; // 仓库编号 + count: number; // 出入库数量 + totalCount: number; // 总库存量 + bizType: number; // 业务类型 + bizId: number; // 业务编号 + bizItemId: number; // 业务项编号 + bizNo: string; // 业务单号 + } + + /** 库存记录分页查询参数 */ + export interface StockRecordPageParam extends PageParam { + productId?: number; + warehouseId?: number; + bizType?: number; + } +} + +/** 查询产品库存明细分页 */ +export function getStockRecordPage( + params: ErpStockRecordApi.StockRecordPageParam, +) { + return requestClient.get>( + '/erp/stock-record/page', + { params }, + ); +} + +/** 查询产品库存明细详情 */ +export function getStockRecord(id: number) { + return requestClient.get( + `/erp/stock-record/get?id=${id}`, + ); +} + +/** 导出产品库存明细 Excel */ +export function exportStockRecord(params: any) { + return requestClient.download('/erp/stock-record/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/erp/stock/stock/index.ts b/apps/web-antd/src/api/erp/stock/stock/index.ts new file mode 100644 index 00000000..3ef12dff --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/stock/index.ts @@ -0,0 +1,74 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpStockApi { + /** 产品库存信息 */ + export interface Stock { + id?: number; // 编号 + productId: number; // 产品编号 + warehouseId: number; // 仓库编号 + count: number; // 库存数量 + } + + /** 产品库存分页查询参数 */ + export interface StockPageParams extends PageParam { + productId?: number; + warehouseId?: number; + } + + /** 产品库存查询参数 */ + export interface StockQueryParams { + productId: number; + warehouseId: number; + } +} + +/** + * 查询产品库存分页 + */ +export function getStockPage(params: ErpStockApi.StockPageParams) { + return requestClient.get>('/erp/stock/page', { + params, + }); +} + +/** + * 查询产品库存详情 + */ +export function getStock(id: number) { + return requestClient.get(`/erp/stock/get?id=${id}`); +} + +/** + * 根据产品和仓库查询库存详情 + */ +export function getStockByProductAndWarehouse( + params: ErpStockApi.StockQueryParams, +) { + return requestClient.get('/erp/stock/get', { + params, + }); +} + +/** + * 获得产品库存数量 + */ +export function getStockCount(productId: number, warehouseId?: number) { + const params: any = { productId }; + if (warehouseId !== undefined) { + params.warehouseId = warehouseId; + } + return requestClient.get('/erp/stock/get-count', { + params, + }); +} + +/** + * 导出产品库存 Excel + */ +export function exportStock(params: ErpStockApi.StockPageParams) { + return requestClient.download('/erp/stock/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/erp/stock/warehouse/index.ts b/apps/web-antd/src/api/erp/stock/warehouse/index.ts new file mode 100644 index 00000000..a1cac8ea --- /dev/null +++ b/apps/web-antd/src/api/erp/stock/warehouse/index.ts @@ -0,0 +1,77 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ErpWarehouseApi { + /** ERP 仓库信息 */ + export interface Warehouse { + id?: number; // 仓库编号 + name: string; // 仓库名称 + address: string; // 仓库地址 + sort: number; // 排序 + remark: string; // 备注 + principal: string; // 负责人 + warehousePrice: number; // 仓储费,单位:元 + truckagePrice: number; // 搬运费,单位:元 + status: number; // 开启状态 + defaultStatus: boolean; // 是否默认 + } + + /** 仓库分页查询参数 */ + export interface WarehousePageParam extends PageParam { + name?: string; + status?: number; + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: ErpWarehouseApi.WarehousePageParam) { + return requestClient.get>( + '/erp/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/erp/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/erp/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: ErpWarehouseApi.Warehouse) { + return requestClient.post('/erp/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: ErpWarehouseApi.Warehouse) { + return requestClient.put('/erp/warehouse/update', data); +} + +/** 修改仓库默认状态 */ +export function updateWarehouseDefaultStatus( + id: number, + defaultStatus: boolean, +) { + return requestClient.put('/erp/warehouse/update-default-status', null, { + params: { id, defaultStatus }, + }); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/erp/warehouse/delete?id=${id}`); +} + +/** 导出仓库 Excel */ +export function exportWarehouse(params: any) { + return requestClient.download('/erp/warehouse/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/system/mail/log/index.ts b/apps/web-antd/src/api/system/mail/log/index.ts index 52c9947c..c32b790e 100644 --- a/apps/web-antd/src/api/system/mail/log/index.ts +++ b/apps/web-antd/src/api/system/mail/log/index.ts @@ -8,7 +8,9 @@ export namespace SystemMailLogApi { id: number; userId: number; userType: number; - toMail: string; + toMails: string[]; + ccMails?: string[]; + bccMails?: string[]; accountId: number; fromMail: string; templateId: number; @@ -32,15 +34,3 @@ export function getMailLogPage(params: PageParam) { { params }, ); } - -/** 查询邮件日志详情 */ -export function getMailLog(id: number) { - return requestClient.get( - `/system/mail-log/get?id=${id}`, - ); -} - -/** 重新发送邮件 */ -export function resendMail(id: number) { - return requestClient.put(`/system/mail-log/resend?id=${id}`); -} diff --git a/apps/web-antd/src/api/system/mail/template/index.ts b/apps/web-antd/src/api/system/mail/template/index.ts index d1bd075f..5f7e7525 100644 --- a/apps/web-antd/src/api/system/mail/template/index.ts +++ b/apps/web-antd/src/api/system/mail/template/index.ts @@ -20,7 +20,9 @@ export namespace SystemMailTemplateApi { /** 邮件发送信息 */ export interface MailSendReq { - mail: string; + toMails: string[]; + ccMails?: string[]; + bccMails?: string[]; templateCode: string; templateParams: Record; } diff --git a/apps/web-antd/src/components/Tinyflow/ui/index.css b/apps/web-antd/src/components/Tinyflow/ui/index.css index 1e126fa7..f5a473a1 100644 --- a/apps/web-antd/src/components/Tinyflow/ui/index.css +++ b/apps/web-antd/src/components/Tinyflow/ui/index.css @@ -1,13 +1,12 @@ .svelte-flow { - direction: ltr; --xy-edge-stroke-default: #b1b1b7; --xy-edge-stroke-width-default: 1; --xy-edge-stroke-selected-default: #555; --xy-connectionline-stroke-default: #b1b1b7; --xy-connectionline-stroke-width-default: 1; - --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5); + --xy-attribution-background-color-default: rgb(255 255 255 / 50%); --xy-minimap-background-color-default: #fff; - --xy-minimap-mask-background-color-default: rgb(240, 240, 240, 0.6); + --xy-minimap-mask-background-color-default: rgb(240 240 240 / 60%); --xy-minimap-mask-stroke-color-default: transparent; --xy-minimap-mask-stroke-width-default: 1; --xy-minimap-node-background-color-default: #e2e2e2; @@ -17,40 +16,43 @@ --xy-background-pattern-dots-color-default: #91919a; --xy-background-pattern-lines-color-default: #eee; --xy-background-pattern-cross-color-default: #e2e2e2; - background-color: var( - --xy-background-color, - var(--xy-background-color-default) - ); --xy-node-color-default: inherit; --xy-node-border-default: 1px solid #1a192b; --xy-node-background-color-default: #fff; - --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25); - --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08); + --xy-node-group-background-color-default: rgb(240 240 240 / 25%); + --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgb(0 0 0 / 8%); --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b; --xy-node-border-radius-default: 3px; --xy-handle-background-color-default: #1a192b; --xy-handle-border-color-default: #fff; - --xy-selection-background-color-default: rgba(0, 89, 220, 0.08); - --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8); + --xy-selection-background-color-default: rgb(0 89 220 / 8%); + --xy-selection-border-default: 1px dotted rgb(0 89 220 / 80%); --xy-controls-button-background-color-default: #fefefe; --xy-controls-button-background-color-hover-default: #f4f4f4; --xy-controls-button-color-default: inherit; --xy-controls-button-color-hover-default: inherit; --xy-controls-button-border-color-default: #eee; - --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); - --xy-edge-label-background-color-default: #ffffff; + --xy-controls-box-shadow-default: 0 0 2px 1px rgb(0 0 0 / 8%); + --xy-edge-label-background-color-default: #fff; --xy-edge-label-color-default: inherit; --xy-resize-background-color-default: #3367d9; + + direction: ltr; + background-color: var( + --xy-background-color, + var(--xy-background-color-default) + ); } + .svelte-flow.dark { --xy-edge-stroke-default: #3e3e3e; --xy-edge-stroke-width-default: 1; --xy-edge-stroke-selected-default: #727272; --xy-connectionline-stroke-default: #b1b1b7; --xy-connectionline-stroke-width-default: 1; - --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25); + --xy-attribution-background-color-default: rgb(150 150 150 / 25%); --xy-minimap-background-color-default: #141414; - --xy-minimap-mask-background-color-default: rgb(60, 60, 60, 0.6); + --xy-minimap-mask-background-color-default: rgb(60 60 60 / 60%); --xy-minimap-mask-stroke-color-default: transparent; --xy-minimap-mask-stroke-width-default: 1; --xy-minimap-node-background-color-default: #2b2b2b; @@ -63,73 +65,86 @@ --xy-node-color-default: #f8f8f8; --xy-node-border-default: 1px solid #3c3c3c; --xy-node-background-color-default: #1e1e1e; - --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25); - --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08); + --xy-node-group-background-color-default: rgb(240 240 240 / 25%); + --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgb(255 255 255 / 8%); --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999; --xy-handle-background-color-default: #bebebe; --xy-handle-border-color-default: #1e1e1e; - --xy-selection-background-color-default: rgba(200, 200, 220, 0.08); - --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8); + --xy-selection-background-color-default: rgb(200 200 220 / 8%); + --xy-selection-border-default: 1px dotted rgb(200 200 220 / 80%); --xy-controls-button-background-color-default: #2b2b2b; --xy-controls-button-background-color-hover-default: #3e3e3e; --xy-controls-button-color-default: #f8f8f8; --xy-controls-button-color-hover-default: #fff; --xy-controls-button-border-color-default: #5b5b5b; - --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); + --xy-controls-box-shadow-default: 0 0 2px 1px rgb(0 0 0 / 8%); --xy-edge-label-background-color-default: #141414; --xy-edge-label-color-default: #f8f8f8; } + .svelte-flow__background { + z-index: -1; + pointer-events: none; background-color: var( --xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)) ); - pointer-events: none; - z-index: -1; } + .svelte-flow__container { position: absolute; - width: 100%; - height: 100%; top: 0; left: 0; + width: 100%; + height: 100%; } + .svelte-flow__pane { z-index: 1; } + .svelte-flow__pane.draggable { cursor: grab; } + .svelte-flow__pane.dragging { cursor: grabbing; } + .svelte-flow__pane.selection { cursor: pointer; } + .svelte-flow__viewport { - transform-origin: 0 0; z-index: 2; pointer-events: none; + transform-origin: 0 0; } + .svelte-flow__renderer { z-index: 4; } + .svelte-flow__selection { z-index: 6; } + .svelte-flow__nodesselection-rect:focus, .svelte-flow__nodesselection-rect:focus-visible { outline: none; } + .svelte-flow__edge-path { + fill: none; stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default)); stroke-width: var( --xy-edge-stroke-width, var(--xy-edge-stroke-width-default) ); - fill: none; } + .svelte-flow__connection-path { + fill: none; stroke: var( --xy-connectionline-stroke, var(--xy-connectionline-stroke-default) @@ -138,38 +153,46 @@ --xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default) ); - fill: none; } + .svelte-flow .svelte-flow__edges { position: absolute; } + .svelte-flow .svelte-flow__edges svg { - overflow: visible; position: absolute; + overflow: visible; pointer-events: none; } + .svelte-flow__edge { - pointer-events: visibleStroke; + pointer-events: visiblestroke; } + .svelte-flow__edge.selectable { cursor: pointer; } + .svelte-flow__edge.animated path { stroke-dasharray: 5; animation: dashdraw 0.5s linear infinite; } + .svelte-flow__edge.animated path.svelte-flow__edge-interaction { stroke-dasharray: none; animation: none; } + .svelte-flow__edge.inactive { pointer-events: none; } + .svelte-flow__edge.selected, .svelte-flow__edge:focus, .svelte-flow__edge:focus-visible { outline: none; } + .svelte-flow__edge.selected .svelte-flow__edge-path, .svelte-flow__edge.selectable:focus .svelte-flow__edge-path, .svelte-flow__edge.selectable:focus-visible .svelte-flow__edge-path { @@ -178,68 +201,77 @@ var(--xy-edge-stroke-selected-default) ); } + .svelte-flow__edge-textwrapper { pointer-events: all; } + .svelte-flow__edge .svelte-flow__edge-text { pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; user-select: none; } + .svelte-flow__connection { pointer-events: none; } + .svelte-flow__connection .animated { stroke-dasharray: 5; animation: dashdraw 0.5s linear infinite; } + svg.svelte-flow__connectionline { + position: absolute; z-index: 1001; overflow: visible; - position: absolute; } + .svelte-flow__nodes { pointer-events: none; transform-origin: 0 0; } + .svelte-flow__node { position: absolute; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - pointer-events: all; - transform-origin: 0 0; box-sizing: border-box; + pointer-events: all; cursor: default; + user-select: none; + transform-origin: 0 0; } + .svelte-flow__node.selectable { cursor: pointer; } + .svelte-flow__node.draggable { - cursor: grab; pointer-events: all; + cursor: grab; } + .svelte-flow__node.draggable.dragging { cursor: grabbing; } + .svelte-flow__nodesselection { z-index: 3; - transform-origin: left top; pointer-events: none; + transform-origin: left top; } + .svelte-flow__nodesselection-rect { position: absolute; pointer-events: all; cursor: grab; } + .svelte-flow__handle { position: absolute; - pointer-events: none; - min-width: 5px; - min-height: 5px; width: 6px; + min-width: 5px; height: 6px; + min-height: 5px; + pointer-events: none; background-color: var( --xy-handle-background-color, var(--xy-handle-background-color-default) @@ -248,98 +280,113 @@ svg.svelte-flow__connectionline { var(--xy-handle-border-color, var(--xy-handle-border-color-default)); border-radius: 100%; } + .svelte-flow__handle.connectingfrom { pointer-events: all; } + .svelte-flow__handle.connectionindicator { pointer-events: all; cursor: crosshair; } + .svelte-flow__handle-bottom { top: auto; - left: 50%; bottom: 0; + left: 50%; transform: translate(-50%, 50%); } + .svelte-flow__handle-top { top: 0; left: 50%; transform: translate(-50%, -50%); } + .svelte-flow__handle-left { top: 50%; left: 0; transform: translate(-50%, -50%); } + .svelte-flow__handle-right { top: 50%; right: 0; transform: translate(50%, -50%); } + .svelte-flow__edgeupdater { - cursor: move; pointer-events: all; + cursor: move; } + .svelte-flow__panel { position: absolute; z-index: 5; margin: 15px; } + .svelte-flow__panel.top { top: 0; } + .svelte-flow__panel.bottom { bottom: 0; } + .svelte-flow__panel.left { left: 0; } + .svelte-flow__panel.right { right: 0; } + .svelte-flow__panel.center { left: 50%; transform: translate(-50%); } + .svelte-flow__attribution { + padding: 2px 3px; + margin: 0; font-size: 10px; background: var( --xy-attribution-background-color, var(--xy-attribution-background-color-default) ); - padding: 2px 3px; - margin: 0; } + .svelte-flow__attribution a { - text-decoration: none; color: #999; + text-decoration: none; } + @keyframes dashdraw { 0% { stroke-dashoffset: 10; } } + .svelte-flow__edgelabel-renderer { position: absolute; + top: 0; + left: 0; width: 100%; height: 100%; pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; user-select: none; - left: 0; - top: 0; } + .svelte-flow__viewport-portal { position: absolute; + top: 0; + left: 0; width: 100%; height: 100%; - left: 0; - top: 0; - -webkit-user-select: none; - -moz-user-select: none; user-select: none; } + .svelte-flow__minimap { background: var( --xy-minimap-background-color-props, @@ -349,9 +396,11 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__minimap-svg { display: block; } + .svelte-flow__minimap-mask { fill: var( --xy-minimap-mask-background-color-props, @@ -375,6 +424,7 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__minimap-node { fill: var( --xy-minimap-node-background-color-props, @@ -398,6 +448,7 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__background-pattern.dots { fill: var( --xy-background-pattern-color-props, @@ -407,6 +458,7 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__background-pattern.lines { stroke: var( --xy-background-pattern-color-props, @@ -416,6 +468,7 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__background-pattern.cross { stroke: var( --xy-background-pattern-color-props, @@ -425,6 +478,7 @@ svg.svelte-flow__connectionline { ) ); } + .svelte-flow__controls { display: flex; flex-direction: column; @@ -433,21 +487,29 @@ svg.svelte-flow__connectionline { var(--xy-controls-box-shadow-default) ); } + .svelte-flow__controls.horizontal { flex-direction: row; } + .svelte-flow__controls-button { display: flex; - justify-content: center; align-items: center; - height: 26px; + justify-content: center; width: 26px; + height: 26px; padding: 4px; - border: none; + color: var( + --xy-controls-button-color-props, + var(--xy-controls-button-color, var(--xy-controls-button-color-default)) + ); + cursor: pointer; + user-select: none; background: var( --xy-controls-button-background-color, var(--xy-controls-button-background-color-default) ); + border: none; border-bottom: 1px solid var( --xy-controls-button-border-color-props, @@ -456,50 +518,48 @@ svg.svelte-flow__connectionline { var(--xy-controls-button-border-color-default) ) ); - color: var( - --xy-controls-button-color-props, - var(--xy-controls-button-color, var(--xy-controls-button-color-default)) - ); - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; } + .svelte-flow__controls-button svg { width: 100%; max-width: 12px; max-height: 12px; - fill: currentColor; + fill: currentcolor; } + .svelte-flow__edge.updating .svelte-flow__edge-path { stroke: #777; } + .svelte-flow__edge-text { font-size: 10px; } + .svelte-flow__node.selectable:focus, .svelte-flow__node.selectable:focus-visible { outline: none; } + .svelte-flow__node-input, .svelte-flow__node-default, .svelte-flow__node-output, .svelte-flow__node-group { - padding: 10px; - border-radius: var( - --xy-node-border-radius, - var(--xy-node-border-radius-default) - ); width: 150px; + padding: 10px; font-size: 12px; color: var(--xy-node-color, var(--xy-node-color-default)); text-align: center; - border: var(--xy-node-border, var(--xy-node-border-default)); background-color: var( --xy-node-background-color, var(--xy-node-background-color-default) ); + border: var(--xy-node-border, var(--xy-node-border-default)); + border-radius: var( + --xy-node-border-radius, + var(--xy-node-border-radius-default) + ); } + .svelte-flow__node-input.selectable:hover, .svelte-flow__node-default.selectable:hover, .svelte-flow__node-output.selectable:hover, @@ -509,6 +569,7 @@ svg.svelte-flow__connectionline { var(--xy-node-boxshadow-hover-default) ); } + .svelte-flow__node-input.selectable.selected, .svelte-flow__node-input.selectable:focus, .svelte-flow__node-input.selectable:focus-visible, @@ -526,12 +587,14 @@ svg.svelte-flow__connectionline { var(--xy-node-boxshadow-selected-default) ); } + .svelte-flow__node-group { background-color: var( --xy-node-group-background-color, var(--xy-node-group-background-color-default) ); } + .svelte-flow__nodesselection-rect, .svelte-flow__selection { background: var( @@ -540,20 +603,15 @@ svg.svelte-flow__connectionline { ); border: var(--xy-selection-border, var(--xy-selection-border-default)); } + .svelte-flow__nodesselection-rect:focus, .svelte-flow__nodesselection-rect:focus-visible, .svelte-flow__selection:focus, .svelte-flow__selection:focus-visible { outline: none; } + .svelte-flow__controls-button:hover { - background: var( - --xy-controls-button-background-color-hover-props, - var( - --xy-controls-button-background-color-hover, - var(--xy-controls-button-background-color-hover-default) - ) - ); color: var( --xy-controls-button-color-hover-props, var( @@ -561,413 +619,490 @@ svg.svelte-flow__connectionline { var(--xy-controls-button-color-hover-default) ) ); + background: var( + --xy-controls-button-background-color-hover-props, + var( + --xy-controls-button-background-color-hover, + var(--xy-controls-button-background-color-hover-default) + ) + ); } + .svelte-flow__controls-button:disabled { pointer-events: none; } + .svelte-flow__controls-button:disabled svg { fill-opacity: 0.4; } + .svelte-flow__controls-button:last-child { border-bottom: none; } + .svelte-flow__resize-control { position: absolute; } + .svelte-flow__resize-control.left, .svelte-flow__resize-control.right { cursor: ew-resize; } + .svelte-flow__resize-control.top, .svelte-flow__resize-control.bottom { cursor: ns-resize; } + .svelte-flow__resize-control.top.left, .svelte-flow__resize-control.bottom.right { cursor: nwse-resize; } + .svelte-flow__resize-control.bottom.left, .svelte-flow__resize-control.top.right { cursor: nesw-resize; } + .svelte-flow__resize-control.handle { width: 4px; height: 4px; - border: 1px solid #fff; - border-radius: 1px; background-color: var( --xy-resize-background-color, var(--xy-resize-background-color-default) ); + border: 1px solid #fff; + border-radius: 1px; transform: translate(-50%, -50%); } + .svelte-flow__resize-control.handle.left { + top: 50%; left: 0; - top: 50%; } + .svelte-flow__resize-control.handle.right { - left: 100%; top: 50%; + left: 100%; } + .svelte-flow__resize-control.handle.top { - left: 50%; top: 0; -} -.svelte-flow__resize-control.handle.bottom { left: 50%; - top: 100%; } + +.svelte-flow__resize-control.handle.bottom { + top: 100%; + left: 50%; +} + .svelte-flow__resize-control.handle.top.left, .svelte-flow__resize-control.handle.bottom.left { left: 0; } + .svelte-flow__resize-control.handle.top.right, .svelte-flow__resize-control.handle.bottom.right { left: 100%; } + .svelte-flow__resize-control.line { border-color: var( --xy-resize-background-color, var(--xy-resize-background-color-default) ); - border-width: 0; border-style: solid; + border-width: 0; } + .svelte-flow__resize-control.line.left, .svelte-flow__resize-control.line.right { - width: 1px; - transform: translate(-50%); top: 0; + width: 1px; height: 100%; + transform: translate(-50%); } + .svelte-flow__resize-control.line.left { left: 0; border-left-width: 1px; } + .svelte-flow__resize-control.line.right { left: 100%; border-right-width: 1px; } + .svelte-flow__resize-control.line.top, .svelte-flow__resize-control.line.bottom { - height: 1px; - transform: translateY(-50%); left: 0; width: 100%; + height: 1px; + transform: translateY(-50%); } + .svelte-flow__resize-control.line.top { top: 0; border-top-width: 1px; } + .svelte-flow__resize-control.line.bottom { - border-bottom-width: 1px; top: 100%; + border-bottom-width: 1px; } + .svelte-flow__edge-label { - text-align: center; position: absolute; padding: 2px; font-size: 10px; - cursor: pointer; color: var(--xy-edge-label-color, var(--xy-edge-label-color-default)); + text-align: center; + cursor: pointer; background: var( --xy-edge-label-background-color, var(--xy-edge-label-background-color-default) ); } + .svelte-flow__nodes, .svelte-flow__edgelabel-renderer { z-index: 0; } + :root, :root .tf-theme-light { --tf-primary-color: #2563eb; --xy-node-boxshadow-selected: 0 0 0 1px var(--tf-primary-color); --xy-handle-background-color: var(--tf-primary-color); } + .tf-btn { display: flex; + gap: 2px; align-items: center; justify-content: center; - gap: 2px; - background: #fff; - border: 1px solid #ccc; - cursor: pointer; - border-radius: 5px; + width: fit-content; + height: fit-content; padding: 5px; margin: 0; - height: fit-content; - width: fit-content; + cursor: pointer; + background: #fff; + border: 1px solid #ccc; + border-radius: 5px; } + .tf-btn svg { - fill: currentColor; width: 16px; height: 16px; + fill: currentcolor; } + .tf-btn:hover { border: 1px solid var(--tf-primary-color); } + .tf-input, .tf-textarea { - display: flex; - border-radius: 5px; - border: 1px solid #ccc; - padding: 5px 10px; box-sizing: border-box; + display: flex; + padding: 5px 10px; resize: vertical; outline: none; + border: 1px solid #ccc; + border-radius: 5px; } + .tf-input::placeholder, .tf-textarea::placeholder { color: #ccc; } + .tf-input:focus, .tf-textarea:focus { border-color: var(--tf-primary-color); box-shadow: 0 0 5px #51cbee33; } + .tf-input[disabled], .tf-textarea[disabled] { - background-color: #f0f0f0; - cursor: not-allowed; color: #aaa; + cursor: not-allowed; + background-color: #f0f0f0; } + .tf-select-input { display: flex; - border: 1px solid #ccc; - padding: 3px 10px; - border-radius: 5px; - font-size: 14px; - justify-content: space-between; align-items: center; + justify-content: space-between; + height: 27px; + padding: 3px 10px; + font-size: 14px; cursor: pointer; background: #fff; - height: 27px; + border: 1px solid #ccc; + border-radius: 5px; } + .tf-select-input:focus { border-color: var(--tf-primary-color); box-shadow: 0 0 5px #51cbee33; } + .tf-select-input-value { - height: 21px; - min-width: 10px; - font-size: 12px; display: flex; align-items: center; + min-width: 10px; + height: 21px; + font-size: 12px; } + .tf-select-input-arrow { display: block; width: 16px; height: 16px; color: #666; } + .tf-select-input-placeholder { color: #ccc; } + .tf-select-content { - display: flex; - flex-direction: column; - background: #fff; - margin-top: 5px; - border: 1px solid #ccc; - border-radius: 5px; - padding: 5px; - width: max-content; - min-width: 100%; z-index: 9999; box-sizing: border-box; + display: flex; + flex-direction: column; + width: max-content; + min-width: 100%; + padding: 5px; + margin-top: 5px; + background: #fff; + border: 1px solid #ccc; + border-radius: 5px; } + .tf-select-content-item { display: flex; + gap: 2px; align-items: center; padding: 5px 10px; - border: none; - background: #fff; - border-radius: 5px; - cursor: pointer; line-height: 100%; - gap: 2px; + cursor: pointer; + background: #fff; + border: none; + border-radius: 5px; } + .tf-select-content-item span { - width: 16px; display: flex; + width: 16px; } + .tf-select-content-item svg { width: 16px; height: 16px; margin: auto; } + .tf-select-content-item:hover { background: #f0f0f0; } + .tf-select-content-children { padding-left: 14px; } + .tf-checkbox { width: 14px; height: 14px; } + .tf-tabs { display: flex; - align-items: center; - justify-content: center; gap: 5px; - padding: 5px; - border-radius: 5px; - border: none; - background: #f4f4f5; -} -.tf-tabs .tf-tabs-item { - flex-grow: 1; - padding: 5px 10px; - cursor: pointer; - border-radius: 5px; - display: flex; align-items: center; justify-content: center; + padding: 5px; + background: #f4f4f5; + border: none; + border-radius: 5px; +} + +.tf-tabs .tf-tabs-item { + display: flex; + flex-grow: 1; + align-items: center; + justify-content: center; + padding: 5px 10px; font-size: 14px; color: #808088; + cursor: pointer; + border-radius: 5px; } + .tf-tabs .tf-tabs-item.active { - background: #fff; - color: #333; font-weight: 500; + color: #333; + background: #fff; box-shadow: 0 0 5px #00000026; } + h3.tf-heading { - font-weight: 700; - font-size: 14px; margin-top: 2px; margin-bottom: 3px; + font-size: 14px; + font-weight: 700; color: #333; } + .tf-collapse { border: none; border-radius: 5px; } + .tf-collapse-item-title { display: flex; align-items: center; - cursor: pointer; font-size: 14px; + cursor: pointer; } + .tf-collapse-item-title-icon { display: flex; + align-items: center; + justify-content: center; width: 26px; height: 26px; + padding: 3px; + margin-right: 10px; color: #2563eb; background: #cedafb; border-radius: 5px; - padding: 3px; - justify-content: center; - align-items: center; - margin-right: 10px; } + .tf-collapse-item-title-icon svg { width: 22px; height: 22px; color: #3474ff; } + .tf-collapse-item-title-arrow { display: block; width: 16px; height: 16px; margin-left: auto; } + .tf-collapse-item-description { - font-size: 12px; margin: 10px 0; + font-size: 12px; color: #999; } + .svelte-flow__nodes .svelte-flow__node { + box-sizing: border-box; border: 3px solid transparent; border-radius: 5px; - box-sizing: border-box; } + .svelte-flow__nodes .svelte-flow__node .svelte-flow__handle { + display: flex; + align-items: center; + justify-content: center; width: 16px; height: 16px; background: transparent; - display: flex; - justify-content: center; - align-items: center; border: none; } -.svelte-flow__nodes .svelte-flow__node .svelte-flow__handle:after { - content: ' '; - background: #2563eb; + +.svelte-flow__nodes .svelte-flow__node .svelte-flow__handle::after { width: 8px; height: 8px; + content: ' '; + background: #2563eb; border-radius: 100%; transition: width 0.1s, height 0.1s; } -.svelte-flow__nodes .svelte-flow__node .svelte-flow__handle:hover:after { + +.svelte-flow__nodes .svelte-flow__node .svelte-flow__handle:hover::after { width: 16px; height: 16px; } -.svelte-flow__nodes .svelte-flow__node div.loop_handle_wrapper:after { + +.svelte-flow__nodes .svelte-flow__node div.loop_handle_wrapper::after { + display: flex; + align-items: center; + justify-content: center; + width: 100px; + height: 20px; + color: #fff; content: '循环体'; background: #2563eb; - width: 100px; - height: 20px; border-radius: 0; - display: flex; - color: #fff; - justify-content: center; - align-items: center; } -.svelte-flow__nodes .svelte-flow__node div.loop_handle_wrapper:hover:after { + +.svelte-flow__nodes .svelte-flow__node div.loop_handle_wrapper:hover::after { width: 100px; height: 20px; } -.svelte-flow__nodes .svelte-flow__node:after { - content: ' '; + +.svelte-flow__nodes .svelte-flow__node::after { position: absolute; - border-radius: 5px; top: -2px; left: -2px; - border: 1px solid #ccc; - height: calc(100% + 2px); width: calc(100% + 2px); + height: calc(100% + 2px); + content: ' '; + border: 1px solid #ccc; + border-radius: 5px; } + .svelte-flow__nodes .svelte-flow__node:hover { border: 3px solid #bacaef7d; } + .svelte-flow__nodes .svelte-flow__node.selectable.selected { border: 3px solid #bacaef7d; box-shadow: var(--xy-node-boxshadow-selected); } -.svelte-flow__nodes .svelte-flow__node:hover:after { + +.svelte-flow__nodes .svelte-flow__node:hover::after { display: none; } -.svelte-flow__nodes .svelte-flow__node.selectable.selected:after { + +.svelte-flow__nodes .svelte-flow__node.selectable.selected::after { display: none; } + .tf-node-wrapper { - border-radius: 5px; min-width: 300px; background: #fff; + border-radius: 5px; } + .tf-node-wrapper-title { - height: 30px; - background: #eff1f5; - color: #bcbcbc; - font-size: 12px; display: flex; align-items: center; + height: 30px; padding-left: 5px; - border-bottom: 1px solid #ccc; + font-size: 12px; font-weight: 300; + color: #bcbcbc; letter-spacing: 1px; + background: #eff1f5; + border-bottom: 1px solid #ccc; } + .tf-node-wrapper-body { padding: 10px; } + .svelte-flow__attribution a { display: none; } + .tf-toolbar { position: absolute; top: 10px; @@ -975,69 +1110,78 @@ h3.tf-heading { z-index: 9999; display: flex; gap: 5px; + transform: translate(-220px); transition: transform 0.5s ease, opacity 0.5s ease; - transform: translate(-220px); } + .tf-toolbar.show { transform: translate(0); } + .tf-toolbar-container { + width: 180px; + padding: 10px; background: #fff; border: 1px solid #eee; border-radius: 5px; box-shadow: 0 0 5px #0000001a; - padding: 10px; - width: 180px; } + .tf-toolbar-container-header { display: flex; } + .tf-toolbar-container-body { display: flex; margin-top: 20px; } + .tf-toolbar-container-body .tf-toolbar-container-base, .tf-toolbar-container-body .tf-toolbar-container-tools { display: flex; + flex-grow: 1; flex-direction: column; gap: 4px; - flex-grow: 1; } + .tf-toolbar-container-body .tf-toolbar-container-base .tf-btn, .tf-toolbar-container-body .tf-toolbar-container-tools .tf-btn { - border: none; - width: 100%; - justify-content: flex-start; - height: 40px; gap: 10px; + justify-content: flex-start; + width: 100%; + height: 40px; cursor: grabbing; + border: none; border-radius: 5px; } + .tf-toolbar-container-body .tf-toolbar-container-base .tf-btn svg, .tf-toolbar-container-body .tf-toolbar-container-tools .tf-btn svg { width: 20px; height: 20px; fill: #2563eb; } + .tf-toolbar-container-body .tf-toolbar-container-base .tf-btn:hover, .tf-toolbar-container-body .tf-toolbar-container-tools .tf-btn:hover { background: #f1f1f1; } -.tinyflow-logo:after { - content: 'Tinyflow.ai'; - font-size: 145px; + +.tinyflow-logo::after { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; + font-size: 145px; font-weight: 800; color: #03153b54; text-shadow: 1px 3px 6px #cedafb, 0 0 0 #000, 1px 3px 6px #fff; + content: 'Tinyflow.ai'; opacity: 0.1; } diff --git a/apps/web-antd/src/components/table-action/table-action.vue b/apps/web-antd/src/components/table-action/table-action.vue index 96d2f540..c8a48a73 100644 --- a/apps/web-antd/src/components/table-action/table-action.vue +++ b/apps/web-antd/src/components/table-action/table-action.vue @@ -4,7 +4,7 @@ import type { PropType } from 'vue'; import type { ActionItem, PopConfirm } from './typing'; -import { computed, unref } from 'vue'; +import { computed, unref, watch } from 'vue'; import { useAccess } from '@vben/access'; import { IconifyIcon } from '@vben/icons'; @@ -60,21 +60,20 @@ function isIfShow(action: ActionItem): boolean { /** 处理按钮 actions */ const getActions = computed(() => { - return (props.actions || []).filter((action: ActionItem) => isIfShow(action)); + const actions = props.actions || []; + return actions.filter((action: ActionItem) => isIfShow(action)); }); /** 处理下拉菜单 actions */ const getDropdownList = computed(() => { - return (props.dropDownActions || []).filter((action: ActionItem) => - isIfShow(action), - ); + const dropDownActions = props.dropDownActions || []; + return dropDownActions.filter((action: ActionItem) => isIfShow(action)); }); /** Space 组件的 size */ const spaceSize = computed(() => { - return unref(getActions)?.some((item: ActionItem) => item.type === 'link') - ? 0 - : 8; + const actions = unref(getActions); + return actions?.some((item: ActionItem) => item.type === 'link') ? 0 : 8; }); /** 获取 PopConfirm 属性 */ @@ -137,6 +136,15 @@ function handleButtonClick(action: ActionItem) { action.onClick(); } } + +/** 监听props变化,强制重新计算 */ +watch( + () => [props.actions, props.dropDownActions], + () => { + // 这里不需要额外处理,computed会自动重新计算 + }, + { deep: true }, +);