!365 fix(workspace): resolve type issues blocking pre-commit
Merge pull request !365 from XuZhiqiang/fix-pre-commitpull/366/MERGE
commit
1495be795c
|
|
@ -12,6 +12,7 @@ export namespace CrmReceivableApi {
|
|||
customerId?: number;
|
||||
customerName?: string;
|
||||
contractId?: number;
|
||||
contractNo?: string;
|
||||
contract?: Contract;
|
||||
auditStatus: number;
|
||||
processInstanceId: number;
|
||||
|
|
@ -34,6 +35,11 @@ export namespace CrmReceivableApi {
|
|||
no: string;
|
||||
totalPrice: number;
|
||||
}
|
||||
|
||||
export interface ReceivablePageParam extends PageParam {
|
||||
contractId?: number;
|
||||
customerId?: number;
|
||||
}
|
||||
}
|
||||
|
||||
/** 查询回款列表 */
|
||||
|
|
@ -45,7 +51,9 @@ export function getReceivablePage(params: PageParam) {
|
|||
}
|
||||
|
||||
/** 查询回款列表,基于指定客户 */
|
||||
export function getReceivablePageByCustomer(params: PageParam) {
|
||||
export function getReceivablePageByCustomer(
|
||||
params: CrmReceivableApi.ReceivablePageParam,
|
||||
) {
|
||||
return requestClient.get<PageResult<CrmReceivableApi.Receivable>>(
|
||||
'/crm/receivable/page-by-customer',
|
||||
{ params },
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ export namespace ErpPurchaseInApi {
|
|||
export interface PurchaseInItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ export namespace ErpPurchaseOrderApi {
|
|||
/** 采购订单项信息 */
|
||||
export interface PurchaseOrderItem {
|
||||
id?: number; // 订单项编号
|
||||
seq?: number; // 前端行号
|
||||
orderId?: number; // 采购订单编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ export namespace ErpPurchaseReturnApi {
|
|||
returnTime?: Date; // 退货时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice: number; // 合计金额,单位:元
|
||||
refundPrice?: number; // 已退款金额,单位:元
|
||||
discountPercent?: number; // 折扣百分比
|
||||
discountPrice?: number; // 折扣金额
|
||||
status?: number; // 状态
|
||||
|
|
@ -24,6 +25,7 @@ export namespace ErpPurchaseReturnApi {
|
|||
export interface PurchaseReturnItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ export namespace ErpSaleOrderApi {
|
|||
/** 销售订单项 */
|
||||
export interface SaleOrderItem {
|
||||
id?: number; // 订单项编号
|
||||
seq?: number; // 前端行号
|
||||
orderId?: number; // 采购订单编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ export namespace ErpSaleOutApi {
|
|||
outTime?: Date; // 出库时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice?: number; // 合计金额,单位:元
|
||||
receiptPrice?: number; // 已收款金额,单位:元
|
||||
status?: number; // 状态
|
||||
remark?: string; // 备注
|
||||
discountPercent?: number; // 折扣百分比
|
||||
|
|
@ -28,6 +29,7 @@ export namespace ErpSaleOutApi {
|
|||
export interface SaleOutItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ export namespace ErpSaleReturnApi {
|
|||
returnTime?: Date; // 退货时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice?: number; // 合计金额,单位:元
|
||||
refundPrice?: number; // 已退款金额,单位:元
|
||||
status?: number; // 状态
|
||||
remark?: string; // 备注
|
||||
discountPercent?: number; // 折扣百分比
|
||||
|
|
@ -27,6 +28,7 @@ export namespace ErpSaleReturnApi {
|
|||
export interface SaleReturnItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ export namespace ErpStockCheckApi {
|
|||
/** 库存盘点项 */
|
||||
export interface StockCheckItem {
|
||||
id?: number; // 编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -23,15 +23,16 @@ export namespace ErpStockInApi {
|
|||
/** 其它入库单产品信息 */
|
||||
export interface StockInItem {
|
||||
id?: number; // 编号
|
||||
warehouseId: number; // 仓库编号
|
||||
productId: number; // 产品编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
productUnitId?: number; // 产品单位编号
|
||||
productUnitName?: string; // 产品单位名称
|
||||
productBarCode?: string; // 产品条码
|
||||
count: number; // 数量
|
||||
productPrice: number; // 产品单价
|
||||
totalPrice: number; // 总价
|
||||
count?: number; // 数量
|
||||
productPrice?: number; // 产品单价
|
||||
totalPrice?: number; // 总价
|
||||
stockCount?: number; // 库存数量
|
||||
remark?: string; // 备注
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ export namespace ErpStockMoveApi {
|
|||
count: number; // 数量
|
||||
fromWarehouseId?: number; // 来源仓库ID
|
||||
id?: number; // ID
|
||||
seq?: number; // 前端行号
|
||||
productBarCode: string; // 产品条形码
|
||||
productId?: number; // 产品ID
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ export namespace ErpStockOutApi {
|
|||
/** 其它出库单产品信息 */
|
||||
export interface StockOutItem {
|
||||
id?: number; // 编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -3,6 +3,19 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace MpFreePublishApi {
|
||||
/** 图文文章内容 */
|
||||
export interface FreePublishArticle {
|
||||
title?: string;
|
||||
thumbUrl?: string;
|
||||
picUrl?: string;
|
||||
url?: string;
|
||||
}
|
||||
|
||||
/** 图文内容 */
|
||||
export interface FreePublishContent {
|
||||
newsItem?: FreePublishArticle[];
|
||||
}
|
||||
|
||||
/** 自由发布文章信息 */
|
||||
export interface FreePublish {
|
||||
id?: number;
|
||||
|
|
@ -12,7 +25,7 @@ export namespace MpFreePublishApi {
|
|||
title: string;
|
||||
author: string;
|
||||
digest: string;
|
||||
content: string;
|
||||
content?: FreePublishContent;
|
||||
thumbUrl: string;
|
||||
status: number;
|
||||
publishTime?: Date;
|
||||
|
|
|
|||
|
|
@ -136,9 +136,13 @@ function autoSearch(queryValue: string) {
|
|||
}
|
||||
|
||||
/** 处理地址选择 */
|
||||
function handleAddressSelect(value: string) {
|
||||
if (value) {
|
||||
regeoCode(value);
|
||||
function handleAddressSelect(value: unknown) {
|
||||
const selectedValue =
|
||||
typeof value === 'object' && value !== null && 'value' in value
|
||||
? (value as { value?: number | string }).value
|
||||
: value;
|
||||
if (selectedValue !== undefined && selectedValue !== null) {
|
||||
regeoCode(String(selectedValue));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ const document = ref<null | {
|
|||
}[];
|
||||
title: string;
|
||||
}>(null); // 知识库文档列表
|
||||
const dialogVisible = ref(false); // 知识引用详情弹窗
|
||||
const documentRef = ref<HTMLElement>(); // 知识引用详情弹窗 Ref
|
||||
|
||||
/** 按照 document 聚合 segments */
|
||||
const documentList = computed(() => {
|
||||
|
|
@ -49,7 +47,6 @@ const documentList = computed(() => {
|
|||
/** 点击 document 处理 */
|
||||
function handleClick(doc: any) {
|
||||
document.value = doc;
|
||||
dialogVisible.value = true;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
@ -79,7 +76,7 @@ function handleClick(doc: any) {
|
|||
</div>
|
||||
</div>
|
||||
<Tooltip placement="topLeft" trigger="click">
|
||||
<div ref="documentRef"></div>
|
||||
<div></div>
|
||||
<template #title>
|
||||
<div class="mb-3 text-base font-bold">{{ document?.title }}</div>
|
||||
<div class="max-h-[60vh] overflow-y-auto">
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@ const props = defineProps({
|
|||
});
|
||||
const emits = defineEmits(['onBtnClick', 'onMjBtnClick']);
|
||||
|
||||
const cardImageRef = ref<any>(); // 卡片 image ref
|
||||
|
||||
/** 处理点击事件 */
|
||||
async function handleButtonClick(type: string, detail: AiImageApi.Image) {
|
||||
emits('onBtnClick', type, detail);
|
||||
|
|
@ -110,7 +108,7 @@ onMounted(async () => {
|
|||
</div>
|
||||
|
||||
<!-- 图片展示区域 -->
|
||||
<div class="mt-5 h-72 flex-1 overflow-hidden" ref="cardImageRef">
|
||||
<div class="mt-5 h-72 flex-1 overflow-hidden">
|
||||
<Image class="w-full rounded-lg" :src="detail?.picUrl" />
|
||||
<div v-if="detail?.status === AiImageStatusEnum.FAIL">
|
||||
{{ detail?.errorMessage }}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ const queryParams = reactive({
|
|||
}); // 图片分页相关的参数
|
||||
const pageTotal = ref<number>(0); // page size
|
||||
const imageList = ref<AiImageApi.Image[]>([]); // image 列表
|
||||
const imageListRef = ref<any>(); // ref
|
||||
|
||||
const inProgressImageMap = ref<{}>({}); // 监听的 image 映射,一般是生成中(需要轮询),key 为 image 编号,value 为 image
|
||||
const inProgressTimer = ref<any>(); // 生成中的 image 定时器,轮询生成进展
|
||||
|
|
@ -190,7 +189,6 @@ onUnmounted(async () => {
|
|||
|
||||
<div
|
||||
class="flex flex-1 flex-wrap content-start overflow-y-auto p-3 pb-28 pt-5"
|
||||
ref="imageListRef"
|
||||
>
|
||||
<ImageCard
|
||||
v-for="image in imageList"
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ const currentFile = ref<any>(null); // 当前选中的文件
|
|||
const submitLoading = ref(false); // 提交按钮加载状态
|
||||
|
||||
/** 选择文件 */
|
||||
async function selectFile(index: number) {
|
||||
currentFile.value = modelData.value.list[index];
|
||||
async function selectFile(index: number | string) {
|
||||
currentFile.value = modelData.value.list[Number(index)];
|
||||
await splitContentFile(currentFile.value);
|
||||
}
|
||||
|
||||
|
|
@ -256,7 +256,8 @@ onMounted(async () => {
|
|||
class="mb-2.5"
|
||||
>
|
||||
<div class="mb-1 text-sm text-gray-500">
|
||||
分片-{{ index + 1 }} · {{ segment.contentLength || 0 }} 字符数 ·
|
||||
分片-{{ Number(index) + 1 }} ·
|
||||
{{ segment.contentLength || 0 }} 字符数 ·
|
||||
{{ segment.tokens || 0 }} Token
|
||||
</div>
|
||||
<div class="rounded-md bg-card p-2">
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ const props = defineProps({
|
|||
});
|
||||
|
||||
const emit = defineEmits(['update:modelValue']);
|
||||
const formRef = ref(); // 表单引用
|
||||
const uploadRef = ref(); // 上传组件引用
|
||||
const parent = inject('parent', null); // 获取父组件实例
|
||||
const { uploadUrl, httpRequest } = useUpload(); // 使用上传组件的钩子
|
||||
const fileList = ref<UploadProps['fileList']>([]); // 文件列表
|
||||
|
|
@ -148,10 +146,10 @@ async function customRequest(info: UploadRequestOption) {
|
|||
*
|
||||
* @param index 要移除的文件索引
|
||||
*/
|
||||
function removeFile(index: number) {
|
||||
function removeFile(index: number | string) {
|
||||
// 从列表中移除文件
|
||||
const newList = [...props.modelValue.list];
|
||||
newList.splice(index, 1);
|
||||
newList.splice(Number(index), 1);
|
||||
// 更新表单数据
|
||||
emit('update:modelValue', {
|
||||
...props.modelValue,
|
||||
|
|
@ -186,14 +184,13 @@ onMounted(() => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<Form ref="formRef" :model="modelData" label-width="0" class="mt-5">
|
||||
<Form :model="modelData" label-width="0" class="mt-5">
|
||||
<Form.Item class="mb-5">
|
||||
<div class="w-full">
|
||||
<div
|
||||
class="w-full rounded-md border-2 border-dashed border-gray-200 p-5 text-center hover:border-blue-500"
|
||||
>
|
||||
<UploadDragger
|
||||
ref="uploadRef"
|
||||
class="upload-demo"
|
||||
:action="uploadUrl"
|
||||
v-model:file-list="fileList"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
<!-- eslint-disable no-unused-vars -->
|
||||
<script lang="ts" setup>
|
||||
import { computed, inject, nextTick, onMounted, ref, toRaw, watch } from 'vue';
|
||||
|
||||
|
|
@ -24,26 +23,7 @@ const prefix = inject('prefix');
|
|||
|
||||
const formKey = ref<number | string | undefined>(undefined);
|
||||
const businessKey = ref('');
|
||||
const optionModelTitle = ref('');
|
||||
const fieldList = ref<any[]>([]);
|
||||
const formFieldForm = ref<any>({});
|
||||
const fieldType = ref({
|
||||
long: '长整型',
|
||||
string: '字符串',
|
||||
boolean: '布尔类',
|
||||
date: '日期类',
|
||||
enum: '枚举类',
|
||||
custom: '自定义类型',
|
||||
});
|
||||
const formFieldIndex = ref(-1); // 编辑中的字段, -1 为新增
|
||||
const formFieldOptionIndex = ref(-1); // 编辑中的字段配置项, -1 为新增
|
||||
const fieldModelVisible = ref(false);
|
||||
const fieldOptionModelVisible = ref(false);
|
||||
const fieldOptionForm = ref<any>({}); // 当前激活的字段配置项数据
|
||||
const fieldOptionType = ref(''); // 当前激活的字段配置项弹窗 类型
|
||||
const fieldEnumList = ref<any[]>([]); // 枚举值列表
|
||||
const fieldConstraintsList = ref<any[]>([]); // 约束条件列表
|
||||
const fieldPropertiesList = ref<any[]>([]); // 绑定属性列表
|
||||
const bpmnELement = ref();
|
||||
const elExtensionElements = ref();
|
||||
const formData = ref();
|
||||
|
|
@ -94,173 +74,6 @@ const _updateElementBusinessKey = () => {
|
|||
},
|
||||
);
|
||||
};
|
||||
// 根据类型调整字段type
|
||||
const _changeFieldTypeType = (type: any) => {
|
||||
formFieldForm.value.type = type === 'custom' ? '' : type;
|
||||
};
|
||||
|
||||
// 打开字段详情侧边栏
|
||||
const _openFieldForm = (field: any, index: any) => {
|
||||
formFieldIndex.value = index;
|
||||
if (index === -1) {
|
||||
formFieldForm.value = {};
|
||||
// 初始化枚举值列表
|
||||
fieldEnumList.value = [];
|
||||
// 初始化约束条件列表
|
||||
fieldConstraintsList.value = [];
|
||||
// 初始化自定义属性列表
|
||||
fieldPropertiesList.value = [];
|
||||
} else {
|
||||
const FieldObject = formData.value.fields[index];
|
||||
formFieldForm.value = cloneDeep(field);
|
||||
// 设置自定义类型
|
||||
// this.$set(this.formFieldForm, "typeType", !this.fieldType[field.type] ? "custom" : field.type);
|
||||
formFieldForm.value.typeType = fieldType.value[
|
||||
field.type as keyof typeof fieldType.value
|
||||
]
|
||||
? field.type
|
||||
: 'custom';
|
||||
// 初始化枚举值列表
|
||||
field.type === 'enum' &&
|
||||
(fieldEnumList.value = cloneDeep(FieldObject?.values || []));
|
||||
// 初始化约束条件列表
|
||||
fieldConstraintsList.value = cloneDeep(
|
||||
FieldObject?.validation?.constraints || [],
|
||||
);
|
||||
// 初始化自定义属性列表
|
||||
fieldPropertiesList.value = cloneDeep(
|
||||
FieldObject?.properties?.values || [],
|
||||
);
|
||||
}
|
||||
fieldModelVisible.value = true;
|
||||
};
|
||||
// 打开字段 某个 配置项 弹窗
|
||||
const _openFieldOptionForm = (option: any, index: any, type: any) => {
|
||||
fieldOptionModelVisible.value = true;
|
||||
fieldOptionType.value = type;
|
||||
formFieldOptionIndex.value = index;
|
||||
if (type === 'property') {
|
||||
fieldOptionForm.value = option ? cloneDeep(option) : {};
|
||||
return (optionModelTitle.value = '属性配置');
|
||||
}
|
||||
if (type === 'enum') {
|
||||
fieldOptionForm.value = option ? cloneDeep(option) : {};
|
||||
return (optionModelTitle.value = '枚举值配置');
|
||||
}
|
||||
fieldOptionForm.value = option ? cloneDeep(option) : {};
|
||||
return (optionModelTitle.value = '约束条件配置');
|
||||
};
|
||||
|
||||
// 保存字段 某个 配置项
|
||||
const _saveFieldOption = () => {
|
||||
if (formFieldOptionIndex.value === -1) {
|
||||
if (fieldOptionType.value === 'property') {
|
||||
fieldPropertiesList.value.push(fieldOptionForm.value);
|
||||
}
|
||||
if (fieldOptionType.value === 'constraint') {
|
||||
fieldConstraintsList.value.push(fieldOptionForm.value);
|
||||
}
|
||||
if (fieldOptionType.value === 'enum') {
|
||||
fieldEnumList.value.push(fieldOptionForm.value);
|
||||
}
|
||||
} else {
|
||||
fieldOptionType.value === 'property' &&
|
||||
fieldPropertiesList.value.splice(
|
||||
formFieldOptionIndex.value,
|
||||
1,
|
||||
fieldOptionForm.value,
|
||||
);
|
||||
fieldOptionType.value === 'constraint' &&
|
||||
fieldConstraintsList.value.splice(
|
||||
formFieldOptionIndex.value,
|
||||
1,
|
||||
fieldOptionForm.value,
|
||||
);
|
||||
fieldOptionType.value === 'enum' &&
|
||||
fieldEnumList.value.splice(
|
||||
formFieldOptionIndex.value,
|
||||
1,
|
||||
fieldOptionForm.value,
|
||||
);
|
||||
}
|
||||
fieldOptionModelVisible.value = false;
|
||||
fieldOptionForm.value = {};
|
||||
};
|
||||
// 保存字段配置
|
||||
const _saveField = () => {
|
||||
const { id, type, label, defaultValue, datePattern } = formFieldForm.value;
|
||||
const Field = bpmnInstances().moddle.create(`${prefix}:FormField`, {
|
||||
id,
|
||||
type,
|
||||
label,
|
||||
});
|
||||
defaultValue && (Field.defaultValue = defaultValue);
|
||||
datePattern && (Field.datePattern = datePattern);
|
||||
// 构建属性
|
||||
if (fieldPropertiesList.value && fieldPropertiesList.value.length > 0) {
|
||||
const fieldPropertyList = fieldPropertiesList.value.map((fp: any) => {
|
||||
return bpmnInstances().moddle.create(`${prefix}:Property`, {
|
||||
id: fp.id,
|
||||
value: fp.value,
|
||||
});
|
||||
});
|
||||
Field.properties = bpmnInstances().moddle.create(`${prefix}:Properties`, {
|
||||
values: fieldPropertyList,
|
||||
});
|
||||
}
|
||||
// 构建校验规则
|
||||
if (fieldConstraintsList.value && fieldConstraintsList.value.length > 0) {
|
||||
const fieldConstraintList = fieldConstraintsList.value.map((fc: any) => {
|
||||
return bpmnInstances().moddle.create(`${prefix}:Constraint`, {
|
||||
name: fc.name,
|
||||
config: fc.config,
|
||||
});
|
||||
});
|
||||
Field.validation = bpmnInstances().moddle.create(`${prefix}:Validation`, {
|
||||
constraints: fieldConstraintList,
|
||||
});
|
||||
}
|
||||
// 构建枚举值
|
||||
if (fieldEnumList.value && fieldEnumList.value.length > 0) {
|
||||
Field.values = fieldEnumList.value.map((fe: any) => {
|
||||
return bpmnInstances().moddle.create(`${prefix}:Value`, {
|
||||
name: fe.name,
|
||||
id: fe.id,
|
||||
});
|
||||
});
|
||||
}
|
||||
// 更新数组 与 表单配置实例
|
||||
if (formFieldIndex.value === -1) {
|
||||
fieldList.value.push(formFieldForm.value);
|
||||
formData.value.fields.push(Field);
|
||||
} else {
|
||||
fieldList.value.splice(formFieldIndex.value, 1, formFieldForm.value);
|
||||
formData.value.fields.splice(formFieldIndex.value, 1, Field);
|
||||
}
|
||||
updateElementExtensions();
|
||||
fieldModelVisible.value = false;
|
||||
};
|
||||
|
||||
// 移除某个 字段的 配置项
|
||||
const _removeFieldOptionItem = (_option: any, index: any, type: any) => {
|
||||
// console.log(option, 'option')
|
||||
if (type === 'property') {
|
||||
fieldPropertiesList.value.splice(index, 1);
|
||||
return;
|
||||
}
|
||||
if (type === 'enum') {
|
||||
fieldEnumList.value.splice(index, 1);
|
||||
return;
|
||||
}
|
||||
fieldConstraintsList.value.splice(index, 1);
|
||||
};
|
||||
// 移除 字段
|
||||
const _removeField = (field: any, index: any) => {
|
||||
console.warn(field, 'field');
|
||||
fieldList.value.splice(index, 1);
|
||||
formData.value.fields.splice(index, 1);
|
||||
updateElementExtensions();
|
||||
};
|
||||
|
||||
const updateElementExtensions = () => {
|
||||
// 更新回扩展元素
|
||||
|
|
@ -329,211 +142,5 @@ watch(
|
|||
</Select>
|
||||
</FormItem>
|
||||
</Form>
|
||||
|
||||
<!--字段列表-->
|
||||
<!-- <div class="element-property list-property">-->
|
||||
<!-- <Divider><Icon icon="ep:coin" /> 表单字段</Divider>-->
|
||||
<!-- <Table :data-source="fieldList" :scroll="{ y: 240 }" bordered>-->
|
||||
<!-- <TableColumn title="序号" type="index" width="50px" />-->
|
||||
<!-- <TableColumn title="字段名称" dataIndex="label" width="80px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn-->
|
||||
<!-- title="字段类型"-->
|
||||
<!-- dataIndex="type"-->
|
||||
<!-- width="80px"-->
|
||||
<!-- :customRender="({ text }) => fieldType[text] || text"-->
|
||||
<!-- :ellipsis="true"-->
|
||||
<!-- />-->
|
||||
<!-- <TableColumn-->
|
||||
<!-- title="默认值"-->
|
||||
<!-- dataIndex="defaultValue"-->
|
||||
<!-- width="80px"-->
|
||||
<!-- :ellipsis="true"-->
|
||||
<!-- />-->
|
||||
<!-- <TableColumn title="操作" width="90px">-->
|
||||
<!-- <template #default="scope">-->
|
||||
<!-- <Button type="link" @click="openFieldForm(scope, scope.$index)">-->
|
||||
<!-- 编辑-->
|
||||
<!-- </Button>-->
|
||||
<!-- <Divider type="vertical" />-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- danger-->
|
||||
<!-- @click="removeField(scope, scope.$index)"-->
|
||||
<!-- >-->
|
||||
<!-- 移除-->
|
||||
<!-- </Button>-->
|
||||
<!-- </template>-->
|
||||
<!-- </TableColumn>-->
|
||||
<!-- </Table>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div class="element-drawer__button">-->
|
||||
<!-- <Button type="primary" @click="openFieldForm(null, -1)">添加字段</Button>-->
|
||||
<!-- </div>-->
|
||||
|
||||
<!--字段配置侧边栏-->
|
||||
<!-- <Drawer-->
|
||||
<!-- v-model:open="fieldModelVisible"-->
|
||||
<!-- title="字段配置"-->
|
||||
<!-- :width="`${width}px`"-->
|
||||
<!-- destroyOnClose-->
|
||||
<!-- >-->
|
||||
<!-- <Form :model="formFieldForm" :label-col="{ style: { width: '90px' } }">-->
|
||||
<!-- <FormItem label="字段ID">-->
|
||||
<!-- <Input v-model:value="formFieldForm.id" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="类型">-->
|
||||
<!-- <Select-->
|
||||
<!-- v-model:value="formFieldForm.typeType"-->
|
||||
<!-- placeholder="请选择字段类型"-->
|
||||
<!-- allowClear-->
|
||||
<!-- @change="changeFieldTypeType"-->
|
||||
<!-- >-->
|
||||
<!-- <SelectOption v-for="(value, key) of fieldType" :key="key" :value="key">{{ value }}</SelectOption>-->
|
||||
<!-- </Select>-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="类型名称" v-if="formFieldForm.typeType === 'custom'">-->
|
||||
<!-- <Input v-model:value="formFieldForm.type" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="名称">-->
|
||||
<!-- <Input v-model:value="formFieldForm.label" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="时间格式" v-if="formFieldForm.typeType === 'date'">-->
|
||||
<!-- <Input v-model:value="formFieldForm.datePattern" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="默认值">-->
|
||||
<!-- <Input v-model:value="formFieldForm.defaultValue" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- </Form>-->
|
||||
|
||||
<!-- <!– 枚举值设置 –>-->
|
||||
<!-- <template v-if="formFieldForm.type === 'enum'">-->
|
||||
<!-- <Divider key="enum-divider" />-->
|
||||
<!-- <p class="listener-filed__title" key="enum-title">-->
|
||||
<!-- <span><Icon icon="ep:menu" />枚举值列表:</span>-->
|
||||
<!-- <Button type="primary" @click="openFieldOptionForm(null, -1, 'enum')"-->
|
||||
<!-- >添加枚举值</Button-->
|
||||
<!-- >-->
|
||||
<!-- </p>-->
|
||||
<!-- <Table :data-source="fieldEnumList" key="enum-table" :scroll="{ y: 240 }" bordered>-->
|
||||
<!-- <TableColumn title="序号" width="50px" type="index" />-->
|
||||
<!-- <TableColumn title="枚举值编号" dataIndex="id" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="枚举值名称" dataIndex="name" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="操作" width="90px">-->
|
||||
<!-- <template #default="scope">-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- @click="openFieldOptionForm(scope, scope.$index, 'enum')"-->
|
||||
<!-- >-->
|
||||
<!-- 编辑-->
|
||||
<!-- </Button>-->
|
||||
<!-- <Divider type="vertical" />-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- danger-->
|
||||
<!-- @click="removeFieldOptionItem(scope, scope.$index, 'enum')"-->
|
||||
<!-- >-->
|
||||
<!-- 移除-->
|
||||
<!-- </Button>-->
|
||||
<!-- </template>-->
|
||||
<!-- </TableColumn>-->
|
||||
<!-- </Table>-->
|
||||
<!-- </template>-->
|
||||
|
||||
<!-- <!– 校验规则 –>-->
|
||||
<!-- <Divider key="validation-divider" />-->
|
||||
<!-- <p class="listener-filed__title" key="validation-title">-->
|
||||
<!-- <span><Icon icon="ep:menu" />约束条件列表:</span>-->
|
||||
<!-- <Button type="primary" @click="openFieldOptionForm(null, -1, 'constraint')"-->
|
||||
<!-- >添加约束</Button-->
|
||||
<!-- >-->
|
||||
<!-- </p>-->
|
||||
<!-- <Table :data-source="fieldConstraintsList" key="validation-table" :scroll="{ y: 240 }" bordered>-->
|
||||
<!-- <TableColumn title="序号" width="50px" type="index" />-->
|
||||
<!-- <TableColumn title="约束名称" dataIndex="name" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="约束配置" dataIndex="config" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="操作" width="90px">-->
|
||||
<!-- <template #default="scope">-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- @click="openFieldOptionForm(scope, scope.$index, 'constraint')"-->
|
||||
<!-- >-->
|
||||
<!-- 编辑-->
|
||||
<!-- </Button>-->
|
||||
<!-- <Divider type="vertical" />-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- danger-->
|
||||
<!-- @click="removeFieldOptionItem(scope, scope.$index, 'constraint')"-->
|
||||
<!-- >-->
|
||||
<!-- 移除-->
|
||||
<!-- </Button>-->
|
||||
<!-- </template>-->
|
||||
<!-- </TableColumn>-->
|
||||
<!-- </Table>-->
|
||||
|
||||
<!-- <!– 表单属性 –>-->
|
||||
<!-- <Divider key="property-divider" />-->
|
||||
<!-- <p class="listener-filed__title" key="property-title">-->
|
||||
<!-- <span><Icon icon="ep:menu" />字段属性列表:</span>-->
|
||||
<!-- <Button type="primary" @click="openFieldOptionForm(null, -1, 'property')"-->
|
||||
<!-- >添加属性</Button-->
|
||||
<!-- >-->
|
||||
<!-- </p>-->
|
||||
<!-- <Table :data-source="fieldPropertiesList" key="property-table" :scroll="{ y: 240 }" bordered>-->
|
||||
<!-- <TableColumn title="序号" width="50px" type="index" />-->
|
||||
<!-- <TableColumn title="属性编号" dataIndex="id" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="属性值" dataIndex="value" width="100px" :ellipsis="true" />-->
|
||||
<!-- <TableColumn title="操作" width="90px">-->
|
||||
<!-- <template #default="scope">-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- @click="openFieldOptionForm(scope, scope.$index, 'property')"-->
|
||||
<!-- >-->
|
||||
<!-- 编辑-->
|
||||
<!-- </Button>-->
|
||||
<!-- <Divider type="vertical" />-->
|
||||
<!-- <Button-->
|
||||
<!-- type="link"-->
|
||||
<!-- danger-->
|
||||
<!-- @click="removeFieldOptionItem(scope, scope.$index, 'property')"-->
|
||||
<!-- >-->
|
||||
<!-- 移除-->
|
||||
<!-- </Button>-->
|
||||
<!-- </template>-->
|
||||
<!-- </TableColumn>-->
|
||||
<!-- </Table>-->
|
||||
|
||||
<!-- <!– 底部按钮 –>-->
|
||||
<!-- <div class="element-drawer__button">-->
|
||||
<!-- <Button>取 消</Button>-->
|
||||
<!-- <Button type="primary" @click="saveField">保 存</Button>-->
|
||||
<!-- </div>-->
|
||||
<!-- </Drawer>-->
|
||||
|
||||
<!-- <Modal-->
|
||||
<!-- v-model:open="fieldOptionModelVisible"-->
|
||||
<!-- :title="optionModelTitle"-->
|
||||
<!-- width="600px"-->
|
||||
<!-- destroyOnClose-->
|
||||
<!-- >-->
|
||||
<!-- <Form :model="fieldOptionForm" :label-col="{ style: { width: '96px' } }">-->
|
||||
<!-- <FormItem label="编号/ID" v-if="fieldOptionType !== 'constraint'" key="option-id">-->
|
||||
<!-- <Input v-model:value="fieldOptionForm.id" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="名称" v-if="fieldOptionType !== 'property'" key="option-name">-->
|
||||
<!-- <Input v-model:value="fieldOptionForm.name" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="配置" v-if="fieldOptionType === 'constraint'" key="option-config">-->
|
||||
<!-- <Input v-model:value="fieldOptionForm.config" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- <FormItem label="值" v-if="fieldOptionType === 'property'" key="option-value">-->
|
||||
<!-- <Input v-model:value="fieldOptionForm.value" allowClear />-->
|
||||
<!-- </FormItem>-->
|
||||
<!-- </Form>-->
|
||||
<!-- <template #footer>-->
|
||||
<!-- <Button @click="fieldOptionModelVisible = false">取 消</Button>-->
|
||||
<!-- <Button type="primary" @click="saveFieldOption">确 定</Button>-->
|
||||
<!-- </template>-->
|
||||
<!-- </Modal>-->
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ const props = defineProps({
|
|||
default: '',
|
||||
},
|
||||
});
|
||||
const prefix = inject('prefix');
|
||||
const prefix = inject<string>('prefix', 'flowable'); // 增加默认值flowable
|
||||
const elementListenersList = ref<any[]>([]); // 监听器列表
|
||||
const listenerForm = ref<any>({}); // 监听器详情表单
|
||||
const fieldsListOfListener = ref<any[]>([]);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ interface Props {
|
|||
type?: string;
|
||||
}
|
||||
|
||||
const prefix = inject<string>('prefix');
|
||||
const prefix = inject<string>('prefix', 'flowable');
|
||||
|
||||
const elementListenersList = ref<any[]>([]);
|
||||
const listenerEventTypeObject = ref(eventType);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
|
||||
import { inject, nextTick, ref, watch } from 'vue';
|
||||
|
||||
import { confirm, useVbenModal } from '@vben/common-ui';
|
||||
|
|
@ -151,7 +153,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
pagerConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<{ name: string; value: string }>,
|
||||
});
|
||||
|
||||
const [FieldModal, fieldModalApi] = useVbenModal({
|
||||
|
|
|
|||
|
|
@ -1,7 +1,35 @@
|
|||
const bpmnInstances = () => (window as any)?.bpmnInstances;
|
||||
|
||||
interface ListenerFieldOptions {
|
||||
expression?: string;
|
||||
fieldType: string;
|
||||
name: string;
|
||||
string?: string;
|
||||
}
|
||||
|
||||
interface ListenerOptions {
|
||||
class?: string;
|
||||
delegateExpression?: string;
|
||||
event?: string;
|
||||
eventDefinitionType?: string;
|
||||
eventTimeDefinitions?: string;
|
||||
expression?: string;
|
||||
fields?: ListenerFieldOptions[];
|
||||
id?: string;
|
||||
listenerType?: string;
|
||||
resource?: string;
|
||||
scriptFormat?: string;
|
||||
scriptType?: string;
|
||||
value?: string;
|
||||
}
|
||||
|
||||
// 创建监听器实例
|
||||
export function createListenerObject(options, isTask, prefix) {
|
||||
const listenerObj = Object.create(null);
|
||||
export function createListenerObject(
|
||||
options: ListenerOptions,
|
||||
isTask: boolean,
|
||||
prefix: string,
|
||||
) {
|
||||
const listenerObj: Record<string, any> = Object.create(null);
|
||||
listenerObj.event = options.event;
|
||||
isTask && (listenerObj.id = options.id); // 任务监听器特有的 id 字段
|
||||
switch (options.listenerType) {
|
||||
|
|
@ -52,7 +80,10 @@ export function createListenerObject(options, isTask, prefix) {
|
|||
}
|
||||
|
||||
// 创建 监听器的注入字段 实例
|
||||
export function createFieldObject(option, prefix) {
|
||||
export function createFieldObject(
|
||||
option: ListenerFieldOptions,
|
||||
prefix: string,
|
||||
) {
|
||||
const { name, fieldType, string, expression } = option;
|
||||
const fieldConfig =
|
||||
fieldType === 'string' ? { name, string } : { name, expression };
|
||||
|
|
@ -60,7 +91,7 @@ export function createFieldObject(option, prefix) {
|
|||
}
|
||||
|
||||
// 创建脚本实例
|
||||
export function createScriptObject(options, prefix) {
|
||||
export function createScriptObject(options: ListenerOptions, prefix: string) {
|
||||
const { scriptType, scriptFormat, value, resource } = options;
|
||||
const scriptConfig =
|
||||
scriptType === 'inlineScript'
|
||||
|
|
@ -70,7 +101,7 @@ export function createScriptObject(options, prefix) {
|
|||
}
|
||||
|
||||
// 更新元素扩展属性
|
||||
export function updateElementExtensions(element, extensionList) {
|
||||
export function updateElementExtensions(element: any, extensionList: any[]) {
|
||||
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
||||
values: extensionList,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -66,6 +66,9 @@ const currentNode = useWatchNode(props);
|
|||
/** 节点名称配置 */
|
||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||
useNodeName(BpmNodeTypeEnum.CHILD_PROCESS_NODE);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
// 激活的 Tab 标签页
|
||||
const activeTabName = ref('child');
|
||||
// 子流程表单配置
|
||||
|
|
@ -391,7 +394,7 @@ onMounted(async () => {
|
|||
<div class="config-header">
|
||||
<Input
|
||||
v-if="showInput"
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
type="text"
|
||||
class="focus:border-blue-500 focus:shadow-[0_0_0_2px_rgba(24,144,255,0.2)] focus:outline-none"
|
||||
@blur="changeNodeName()"
|
||||
|
|
|
|||
|
|
@ -76,6 +76,9 @@ const currentNode = useWatchNode(props);
|
|||
// 节点名称
|
||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||
useNodeName(BpmNodeTypeEnum.COPY_TASK_NODE);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
|
||||
// 激活的 Tab 标签页
|
||||
const activeTabName = ref('user');
|
||||
|
|
@ -211,7 +214,7 @@ defineExpose({ showCopyTaskNodeConfig }); // 暴露方法给父组件
|
|||
<div class="config-header">
|
||||
<Input
|
||||
v-if="showInput"
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
type="text"
|
||||
class="focus:border-blue-500 focus:shadow-[0_0_0_2px_rgba(24,144,255,0.2)] focus:outline-none"
|
||||
@blur="changeNodeName()"
|
||||
|
|
|
|||
|
|
@ -46,6 +46,9 @@ const currentNode = useWatchNode(props);
|
|||
// 节点名称
|
||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||
useNodeName(BpmNodeTypeEnum.DELAY_TIMER_NODE);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
// 抄送人表单配置
|
||||
const formRef = ref(); // 表单 Ref
|
||||
|
||||
|
|
@ -156,7 +159,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
<div class="flex items-center">
|
||||
<Input
|
||||
v-if="showInput"
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
type="text"
|
||||
class="mr-2 w-48"
|
||||
@blur="changeNodeName()"
|
||||
|
|
|
|||
|
|
@ -97,21 +97,21 @@ function changeConditionType() {
|
|||
}
|
||||
}
|
||||
|
||||
function deleteConditionGroup(conditions: any, index: number) {
|
||||
conditions.splice(index, 1);
|
||||
function deleteConditionGroup(conditions: any, index: number | string) {
|
||||
conditions.splice(Number(index), 1);
|
||||
}
|
||||
|
||||
function deleteConditionRule(condition: any, index: number) {
|
||||
condition.rules.splice(index, 1);
|
||||
function deleteConditionRule(condition: any, index: number | string) {
|
||||
condition.rules.splice(Number(index), 1);
|
||||
}
|
||||
|
||||
function addConditionRule(condition: any, index: number) {
|
||||
function addConditionRule(condition: any, index: number | string) {
|
||||
const rule = {
|
||||
opCode: '==',
|
||||
leftSide: undefined,
|
||||
rightSide: '',
|
||||
};
|
||||
condition.rules.splice(index + 1, 0, rule);
|
||||
condition.rules.splice(Number(index) + 1, 0, rule);
|
||||
}
|
||||
|
||||
function addConditionGroup(conditions: any) {
|
||||
|
|
|
|||
|
|
@ -59,9 +59,9 @@ function addHttpResponseSetting(responseSetting: Record<string, string>[]) {
|
|||
/** 删除 HTTP 请求返回值设置项 */
|
||||
function deleteHttpResponseSetting(
|
||||
responseSetting: Record<string, string>[],
|
||||
index: number,
|
||||
index: number | string,
|
||||
) {
|
||||
responseSetting.splice(index, 1);
|
||||
responseSetting.splice(Number(index), 1);
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ const currentNode = useWatchNode(props);
|
|||
/** 节点名称 */
|
||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||
useNodeName(BpmNodeTypeEnum.ROUTER_BRANCH_NODE);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
const routerGroups = ref<RouterSetting[]>([]);
|
||||
const nodeOptions = ref<any[]>([]);
|
||||
const conditionRef = ref<any[]>([]);
|
||||
|
|
@ -203,7 +206,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
|
|||
<template #title>
|
||||
<div class="flex items-center">
|
||||
<Input
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
v-if="showInput"
|
||||
type="text"
|
||||
class="mr-2 w-48"
|
||||
|
|
|
|||
|
|
@ -53,6 +53,9 @@ const currentNode = useWatchNode(props);
|
|||
// 节点名称
|
||||
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
|
||||
useNodeName(BpmNodeTypeEnum.START_USER_NODE);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
// 激活的 Tab 标签页
|
||||
const activeTabName = ref('user');
|
||||
|
||||
|
|
@ -144,7 +147,7 @@ defineExpose({ showStartUserNodeConfig });
|
|||
<template #title>
|
||||
<div class="config-header">
|
||||
<Input
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
v-if="showInput"
|
||||
type="text"
|
||||
class="focus:border-blue-500 focus:shadow-[0_0_0_2px_rgba(24,144,255,0.2)] focus:outline-none"
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@ const { showInput, changeNodeName, clickTitle, inputRef } = useNodeName2(
|
|||
currentNode,
|
||||
BpmNodeTypeEnum.TRIGGER_NODE,
|
||||
);
|
||||
function setInputRef(el: unknown) {
|
||||
inputRef.value = el as HTMLInputElement | null;
|
||||
}
|
||||
|
||||
const nodeSetting = ref();
|
||||
// 打开节点配置
|
||||
|
|
@ -68,7 +71,7 @@ function deleteNode() {
|
|||
<span class="iconfont icon-trigger"></span>
|
||||
</div>
|
||||
<Input
|
||||
ref="inputRef"
|
||||
:ref="setInputRef"
|
||||
v-if="!readonly && showInput"
|
||||
type="text"
|
||||
class="editable-title-input"
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessExpressionApi.ProcessExpression>,
|
||||
});
|
||||
|
||||
// 配置 Modal
|
||||
|
|
@ -88,7 +88,7 @@ function useGridFormSchema(): VbenFormSchema[] {
|
|||
},
|
||||
];
|
||||
}
|
||||
function useGridColumns(): VxeTableGridOptions['columns'] {
|
||||
function useGridColumns(): VxeTableGridOptions<BpmProcessExpressionApi.ProcessExpression>['columns'] {
|
||||
return [
|
||||
{ field: 'name', title: '名字', minWidth: 160 },
|
||||
{ field: 'expression', title: '表达式', minWidth: 260 },
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ const tempStartUserSelectAssignees = ref<Record<string, string[]>>({});
|
|||
const bpmnXML = ref<string | undefined>(undefined);
|
||||
const simpleJson = ref<string | undefined>(undefined);
|
||||
|
||||
const timelineRef = ref<any>();
|
||||
const activeTab = ref('form');
|
||||
const activityNodes = ref<BpmProcessInstanceApi.ApprovalNodeInfo[]>([]);
|
||||
const processInstanceStartLoading = ref(false);
|
||||
|
|
@ -303,7 +302,6 @@ defineExpose({ initProcessInfo });
|
|||
</Col>
|
||||
<Col :xs="24" :sm="24" :md="6" :lg="6" :xl="6">
|
||||
<ProcessInstanceTimeline
|
||||
ref="timelineRef"
|
||||
:activity-nodes="activityNodes"
|
||||
:show-status-icon="false"
|
||||
@select-user-confirm="selectUserConfirm"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeGridPropTypes } from '#/adapter/vxe-table';
|
||||
import type {
|
||||
VxeGridPropTypes,
|
||||
VxeTableGridOptions,
|
||||
} from '#/adapter/vxe-table';
|
||||
import type { BpmProcessListenerApi } from '#/api/bpm/processListener';
|
||||
|
||||
import { ref } from 'vue';
|
||||
|
|
@ -47,7 +50,7 @@ const [Grid] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<BpmProcessListenerApi.ProcessListener>,
|
||||
});
|
||||
|
||||
// 配置 Modal
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:total-price',
|
||||
'update:payment-price',
|
||||
'update:totalPrice',
|
||||
'update:paymentPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpFinancePaymentApi.FinancePaymentItem[]>([]); // 表格数据
|
||||
|
|
@ -110,8 +110,8 @@ watch(
|
|||
);
|
||||
const finalPaymentPrice = paymentPrice - (props.discountPrice || 0);
|
||||
// 通知父组件更新
|
||||
emit('update:total-price', totalPrice);
|
||||
emit('update:payment-price', finalPaymentPrice);
|
||||
emit('update:totalPrice', totalPrice);
|
||||
emit('update:paymentPrice', finalPaymentPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
@ -128,13 +128,15 @@ const handleOpenPurchaseIn = () => {
|
|||
|
||||
const handleAddPurchaseIn = (rows: ErpPurchaseInApi.PurchaseIn[]) => {
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const paidPrice = row.paymentPrice ?? 0;
|
||||
const newItem: ErpFinancePaymentApi.FinancePaymentItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.PURCHASE_IN,
|
||||
bizNo: row.no,
|
||||
totalPrice: row.totalPrice,
|
||||
paidPrice: row.paymentPrice,
|
||||
paymentPrice: row.totalPrice - row.paymentPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice,
|
||||
paidPrice,
|
||||
paymentPrice: totalPrice - paidPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -154,13 +156,15 @@ const handleOpenSaleReturn = () => {
|
|||
|
||||
const handleAddSaleReturn = (rows: ErpPurchaseReturnApi.PurchaseReturn[]) => {
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const refundPrice = row.refundPrice ?? 0;
|
||||
const newItem: ErpFinancePaymentApi.FinancePaymentItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.PURCHASE_RETURN,
|
||||
bizNo: row.no,
|
||||
totalPrice: -row.totalPrice,
|
||||
paidPrice: -row.refundPrice,
|
||||
paymentPrice: -row.totalPrice + row.refundPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice: -totalPrice,
|
||||
paidPrice: -refundPrice,
|
||||
paymentPrice: -totalPrice + refundPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -202,7 +206,7 @@ const validate = () => {
|
|||
// 检查每行的付款金额
|
||||
for (let i = 0; i < tableData.value.length; i++) {
|
||||
const item = tableData.value[i];
|
||||
if (!item.paymentPrice || item.paymentPrice <= 0) {
|
||||
if (!item?.paymentPrice || item.paymentPrice <= 0) {
|
||||
throw new Error(`第 ${i + 1} 行:本次付款必须大于0`);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:total-price',
|
||||
'update:receipt-price',
|
||||
'update:totalPrice',
|
||||
'update:receiptPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpFinanceReceiptApi.FinanceReceiptItem[]>([]); // 表格数据
|
||||
|
|
@ -110,8 +110,8 @@ watch(
|
|||
);
|
||||
const finalReceiptPrice = receiptPrice - (props.discountPrice || 0);
|
||||
// 通知父组件更新
|
||||
emit('update:total-price', totalPrice);
|
||||
emit('update:receipt-price', finalReceiptPrice);
|
||||
emit('update:totalPrice', totalPrice);
|
||||
emit('update:receiptPrice', finalReceiptPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
@ -128,14 +128,15 @@ function handleOpenSaleOut() {
|
|||
|
||||
function handleAddSaleOut(rows: ErpSaleOutApi.SaleOut[]) {
|
||||
rows.forEach((row) => {
|
||||
// TODO 芋艿
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const receiptedPrice = row.receiptPrice ?? 0;
|
||||
const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.SALE_OUT,
|
||||
bizNo: row.no,
|
||||
totalPrice: row.totalPrice,
|
||||
receiptedPrice: row.receiptPrice,
|
||||
receiptPrice: row.totalPrice - row.receiptPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice,
|
||||
receiptedPrice,
|
||||
receiptPrice: totalPrice - receiptedPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -154,15 +155,16 @@ function handleOpenSaleReturn() {
|
|||
}
|
||||
|
||||
function handleAddSaleReturn(rows: ErpSaleReturnApi.SaleReturn[]) {
|
||||
// TODO 芋艿
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const refundPrice = row.refundPrice ?? 0;
|
||||
const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.SALE_RETURN,
|
||||
bizNo: row.no,
|
||||
totalPrice: -row.totalPrice,
|
||||
receiptedPrice: -row.refundPrice,
|
||||
receiptPrice: -row.totalPrice + row.refundPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice: -totalPrice,
|
||||
receiptedPrice: -refundPrice,
|
||||
receiptPrice: -totalPrice + refundPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -204,7 +206,7 @@ function validate() {
|
|||
// 检查每行的收款金额
|
||||
for (let i = 0; i < tableData.value.length; i++) {
|
||||
const item = tableData.value[i];
|
||||
if (!item.receiptPrice || item.receiptPrice <= 0) {
|
||||
if (!item?.receiptPrice || item.receiptPrice <= 0) {
|
||||
throw new Error(`第 ${i + 1} 行:本次收款必须大于0`);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,10 +12,6 @@ import TimeSummaryChart from './modules/time-summary-chart.vue';
|
|||
defineOptions({ name: 'ErpHome' });
|
||||
|
||||
const loading = ref(false); // 加载中
|
||||
|
||||
/** 图表组件引用 */
|
||||
const saleChartRef = ref();
|
||||
const purchaseChartRef = ref();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -36,15 +32,11 @@ const purchaseChartRef = ref();
|
|||
<Row :gutter="16">
|
||||
<!-- 销售统计 -->
|
||||
<Col :md="12" :sm="12" :xs="24">
|
||||
<TimeSummaryChart ref="saleChartRef" title="销售统计" type="sale" />
|
||||
<TimeSummaryChart title="销售统计" type="sale" />
|
||||
</Col>
|
||||
<!-- 采购统计 -->
|
||||
<Col :md="12" :sm="12" :xs="24">
|
||||
<TimeSummaryChart
|
||||
ref="purchaseChartRef"
|
||||
title="采购统计"
|
||||
type="purchase"
|
||||
/>
|
||||
<TimeSummaryChart title="采购统计" type="purchase" />
|
||||
</Col>
|
||||
</Row>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { EchartsUIType } from '@vben/plugins/echarts';
|
||||
import type { EChartsOption, EchartsUIType } from '@vben/plugins/echarts';
|
||||
|
||||
import type { ErpPurchaseStatisticsApi } from '#/api/erp/statistics/purchase';
|
||||
import type { ErpSaleStatisticsApi } from '#/api/erp/statistics/sale';
|
||||
|
|
@ -49,7 +49,7 @@ const chartRef = ref<EchartsUIType>();
|
|||
const { renderEcharts } = useEcharts(chartRef);
|
||||
|
||||
/** 折线图配置 */
|
||||
const lineChartOptions: echarts.EChartsOption = {
|
||||
const lineChartOptions: EChartsOption = {
|
||||
grid: {
|
||||
left: 20,
|
||||
right: 20,
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseInApi.PurchaseInItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseOrderApi.PurchaseOrderItem[]>([]); // 表格数据
|
||||
|
|
@ -113,8 +113,8 @@ watch(
|
|||
: erpPriceMultiply(totalPrice, props.discountPercent / 100);
|
||||
const finalTotalPrice = totalPrice - discountPrice!;
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseReturnApi.PurchaseReturnItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleOrderApi.SaleOrderItem[]>([]); // 表格数据
|
||||
|
|
@ -113,8 +113,8 @@ watch(
|
|||
: erpPriceMultiply(totalPrice, props.discountPercent / 100);
|
||||
const finalTotalPrice = totalPrice - discountPrice!;
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleOutApi.SaleOutItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleReturnApi.SaleReturnItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ watch(
|
|||
|
||||
/** 提供获取表格数据的方法供父组件调用 */
|
||||
defineExpose({
|
||||
getData: (): InfraCodegenApi.CodegenColumn[] => gridApi.grid.getData(),
|
||||
getData: (): InfraCodegenApi.CodegenColumn[] =>
|
||||
gridApi.grid.getData() as InfraCodegenApi.CodegenColumn[],
|
||||
});
|
||||
|
||||
/** 初始化 */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { Demo03StudentApi } from '#/api/infra/demo/demo03/inner';
|
||||
|
||||
import { nextTick, watch } from 'vue';
|
||||
|
|
@ -34,7 +35,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<Demo03StudentApi.Demo03Course>,
|
||||
});
|
||||
|
||||
/** 添加学生课程 */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { Demo03StudentApi } from '#/api/infra/demo/demo03/normal';
|
||||
|
||||
import { nextTick, watch } from 'vue';
|
||||
|
|
@ -33,7 +34,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<Demo03StudentApi.Demo03Course>,
|
||||
});
|
||||
|
||||
/** 添加学生课程 */
|
||||
|
|
|
|||
|
|
@ -153,6 +153,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -213,7 +219,7 @@ onMounted(() => {
|
|||
<ContentWrap title="示例联系人">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -249,7 +255,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -119,6 +119,12 @@ function toggleExpand() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -169,7 +175,7 @@ onMounted(() => {
|
|||
<ContentWrap title="示例分类">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button @click="toggleExpand" class="mr-2">
|
||||
|
|
@ -197,7 +203,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
:tree-config="{
|
||||
parentField: 'parentId',
|
||||
|
|
|
|||
|
|
@ -164,6 +164,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -224,7 +230,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -260,7 +266,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
@cell-click="onCellClick"
|
||||
:row-config="{
|
||||
|
|
|
|||
|
|
@ -155,6 +155,12 @@ watch(
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -213,7 +219,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -239,7 +245,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -155,6 +155,12 @@ watch(
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -213,7 +219,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -239,7 +245,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -157,6 +157,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -217,7 +223,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -253,7 +259,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -154,6 +154,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -214,7 +220,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -250,7 +256,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ function getMultipleSelectedRows() {
|
|||
] as MesDvCheckPlanApi.CheckPlan[];
|
||||
records.forEach((row) => {
|
||||
const rowId = row.id;
|
||||
if (rowId !== null) {
|
||||
if (rowId !== undefined && rowId !== null) {
|
||||
selectedMap.set(rowId, row);
|
||||
}
|
||||
});
|
||||
|
|
@ -87,7 +87,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ function getMultipleSelectedRows() {
|
|||
] as MesDvMachineryApi.Machinery[];
|
||||
records.forEach((row) => {
|
||||
const rowId = row.id;
|
||||
if (rowId !== null) {
|
||||
if (rowId !== undefined && rowId !== null) {
|
||||
selectedMap.set(rowId, row);
|
||||
}
|
||||
});
|
||||
|
|
@ -97,7 +97,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -83,7 +83,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -44,12 +44,18 @@ const showClear = computed(
|
|||
props.allowClear &&
|
||||
!props.disabled &&
|
||||
hovering.value &&
|
||||
props.modelValue !== undefined &&
|
||||
props.modelValue !== null,
|
||||
);
|
||||
|
||||
/** 根据 BOM 子物料编号回显选择器 */
|
||||
async function resolveBomById(bomItemId: number | undefined) {
|
||||
if (bomItemId === null || props.itemId === null) {
|
||||
if (
|
||||
bomItemId === undefined ||
|
||||
bomItemId === null ||
|
||||
props.itemId === undefined ||
|
||||
props.itemId === null
|
||||
) {
|
||||
selectedBom.value = undefined;
|
||||
return;
|
||||
}
|
||||
|
|
@ -86,7 +92,7 @@ function clearSelected() {
|
|||
|
||||
/** 打开 BOM 物料选择弹窗 */
|
||||
function handleClick(event: MouseEvent) {
|
||||
if (props.disabled || props.itemId === null) {
|
||||
if (props.disabled || props.itemId === undefined || props.itemId === null) {
|
||||
return;
|
||||
}
|
||||
const target = event.target as HTMLElement;
|
||||
|
|
|
|||
|
|
@ -90,7 +90,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -83,7 +83,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -71,7 +71,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesProCardApi.Card[];
|
||||
for (const row of rows) {
|
||||
if (row.id === undefined || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -95,7 +95,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesProTaskApi.Task[];
|
||||
for (const row of rows) {
|
||||
if (row.id === undefined || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -98,7 +98,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesProWorkOrderApi.WorkOrder[];
|
||||
for (const row of rows) {
|
||||
if (row.id === undefined || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ function getMultipleSelectedRows() {
|
|||
...(gridApi.grid.getCheckboxRecords?.() ?? []),
|
||||
] as MesQcIndicatorApi.Indicator[];
|
||||
records.forEach((row) => {
|
||||
if (!row.id) {
|
||||
selectedMap.set(row.id as number, row);
|
||||
if (row.id !== undefined && row.id !== null) {
|
||||
selectedMap.set(row.id, row);
|
||||
}
|
||||
});
|
||||
return [...selectedMap.values()];
|
||||
|
|
@ -74,7 +74,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesQcIndicatorApi.Indicator[];
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -78,7 +78,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = getTableRows();
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -92,7 +92,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesWmBatchApi.Batch[];
|
||||
for (const row of rows) {
|
||||
if (row.id === undefined || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -118,7 +118,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesWmMaterialStockApi.MaterialStock[];
|
||||
for (const row of rows) {
|
||||
if (row.id === undefined || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ function getMultipleSelectedRows() {
|
|||
...(gridApi.grid.getCheckboxRecords?.() ?? []),
|
||||
] as MesWmPackageApi.Package[];
|
||||
records.forEach((row) => {
|
||||
if (!row.id) {
|
||||
selectedMap.set(row.id as number, row);
|
||||
if (row.id !== undefined && row.id !== null) {
|
||||
selectedMap.set(row.id, row);
|
||||
}
|
||||
});
|
||||
return [...selectedMap.values()];
|
||||
|
|
@ -83,7 +83,11 @@ async function applyPreSelection() {
|
|||
}
|
||||
const rows = gridApi.grid.getData() as MesWmPackageApi.Package[];
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id as number)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ function getMultipleSelectedRows() {
|
|||
...(gridApi.grid.getCheckboxRecords?.() ?? []),
|
||||
] as MesWmStockTakingPlanApi.StockTakingPlan[];
|
||||
records.forEach((row) => {
|
||||
if (!row.id) {
|
||||
if (row.id !== undefined && row.id !== null) {
|
||||
selectedMap.set(row.id, row);
|
||||
}
|
||||
});
|
||||
|
|
@ -80,7 +80,11 @@ async function applyPreSelection() {
|
|||
const rows =
|
||||
gridApi.grid.getData() as MesWmStockTakingPlanApi.StockTakingPlan[];
|
||||
for (const row of rows) {
|
||||
if (row.id === null || !preSelectedIds.value.includes(row.id)) {
|
||||
if (
|
||||
row.id === undefined ||
|
||||
row.id === null ||
|
||||
!preSelectedIds.value.includes(row.id)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (multiple.value) {
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
refresh: true,
|
||||
search: true,
|
||||
},
|
||||
} as VxeTableGridOptions<FreePublish.FreePublish>,
|
||||
} as VxeTableGridOptions<MpFreePublishApi.FreePublish>,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ export namespace ErpPurchaseInApi {
|
|||
export interface PurchaseInItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ export namespace ErpPurchaseOrderApi {
|
|||
/** 采购订单项信息 */
|
||||
export interface PurchaseOrderItem {
|
||||
id?: number; // 订单项编号
|
||||
seq?: number; // 前端行号
|
||||
orderId?: number; // 采购订单编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ export namespace ErpPurchaseReturnApi {
|
|||
returnTime?: Date; // 退货时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice: number; // 合计金额,单位:元
|
||||
refundPrice?: number; // 已退款金额,单位:元
|
||||
discountPercent?: number; // 折扣百分比
|
||||
discountPrice?: number; // 折扣金额
|
||||
status?: number; // 状态
|
||||
|
|
@ -24,6 +25,7 @@ export namespace ErpPurchaseReturnApi {
|
|||
export interface PurchaseReturnItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ export namespace ErpSaleOrderApi {
|
|||
/** 销售订单项 */
|
||||
export interface SaleOrderItem {
|
||||
id?: number; // 订单项编号
|
||||
seq?: number; // 前端行号
|
||||
orderId?: number; // 采购订单编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ export namespace ErpSaleOutApi {
|
|||
outTime?: Date; // 出库时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice?: number; // 合计金额,单位:元
|
||||
receiptPrice?: number; // 已收款金额,单位:元
|
||||
status?: number; // 状态
|
||||
remark?: string; // 备注
|
||||
discountPercent?: number; // 折扣百分比
|
||||
|
|
@ -28,6 +29,7 @@ export namespace ErpSaleOutApi {
|
|||
export interface SaleOutItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ export namespace ErpSaleReturnApi {
|
|||
returnTime?: Date; // 退货时间
|
||||
totalCount?: number; // 合计数量
|
||||
totalPrice?: number; // 合计金额,单位:元
|
||||
refundPrice?: number; // 已退款金额,单位:元
|
||||
status?: number; // 状态
|
||||
remark?: string; // 备注
|
||||
discountPercent?: number; // 折扣百分比
|
||||
|
|
@ -27,6 +28,7 @@ export namespace ErpSaleReturnApi {
|
|||
export interface SaleReturnItem {
|
||||
count?: number;
|
||||
id?: number;
|
||||
seq?: number; // 前端行号
|
||||
orderItemId?: number;
|
||||
productBarCode?: string;
|
||||
productId?: number;
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ export namespace ErpStockCheckApi {
|
|||
/** 库存盘点项 */
|
||||
export interface StockCheckItem {
|
||||
id?: number; // 编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -23,15 +23,16 @@ export namespace ErpStockInApi {
|
|||
/** 其它入库单产品信息 */
|
||||
export interface StockInItem {
|
||||
id?: number; // 编号
|
||||
warehouseId: number; // 仓库编号
|
||||
productId: number; // 产品编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
productUnitId?: number; // 产品单位编号
|
||||
productUnitName?: string; // 产品单位名称
|
||||
productBarCode?: string; // 产品条码
|
||||
count: number; // 数量
|
||||
productPrice: number; // 产品单价
|
||||
totalPrice: number; // 总价
|
||||
count?: number; // 数量
|
||||
productPrice?: number; // 产品单价
|
||||
totalPrice?: number; // 总价
|
||||
stockCount?: number; // 库存数量
|
||||
remark?: string; // 备注
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ export namespace ErpStockMoveApi {
|
|||
count: number; // 数量
|
||||
fromWarehouseId?: number; // 来源仓库ID
|
||||
id?: number; // ID
|
||||
seq?: number; // 前端行号
|
||||
productBarCode: string; // 产品条形码
|
||||
productId?: number; // 产品ID
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ export namespace ErpStockOutApi {
|
|||
/** 其它出库单产品信息 */
|
||||
export interface StockOutItem {
|
||||
id?: number; // 编号
|
||||
seq?: number; // 前端行号
|
||||
warehouseId?: number; // 仓库编号
|
||||
productId?: number; // 产品编号
|
||||
productName?: string; // 产品名称
|
||||
|
|
|
|||
|
|
@ -3,6 +3,19 @@ import type { PageParam, PageResult } from '@vben/request';
|
|||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace MpFreePublishApi {
|
||||
/** 图文文章内容 */
|
||||
export interface FreePublishArticle {
|
||||
title?: string;
|
||||
thumbUrl?: string;
|
||||
picUrl?: string;
|
||||
url?: string;
|
||||
}
|
||||
|
||||
/** 图文内容 */
|
||||
export interface FreePublishContent {
|
||||
newsItem?: FreePublishArticle[];
|
||||
}
|
||||
|
||||
/** 自由发布文章信息 */
|
||||
export interface FreePublish {
|
||||
id?: number;
|
||||
|
|
@ -12,7 +25,7 @@ export namespace MpFreePublishApi {
|
|||
title: string;
|
||||
author: string;
|
||||
digest: string;
|
||||
content: string;
|
||||
content?: FreePublishContent;
|
||||
thumbUrl: string;
|
||||
status: number;
|
||||
publishTime?: Date;
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:total-price',
|
||||
'update:payment-price',
|
||||
'update:totalPrice',
|
||||
'update:paymentPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpFinancePaymentApi.FinancePaymentItem[]>([]); // 表格数据
|
||||
|
|
@ -110,8 +110,8 @@ watch(
|
|||
);
|
||||
const finalPaymentPrice = paymentPrice - (props.discountPrice || 0);
|
||||
// 通知父组件更新
|
||||
emit('update:total-price', totalPrice);
|
||||
emit('update:payment-price', finalPaymentPrice);
|
||||
emit('update:totalPrice', totalPrice);
|
||||
emit('update:paymentPrice', finalPaymentPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
@ -128,13 +128,15 @@ const handleOpenPurchaseIn = () => {
|
|||
|
||||
const handleAddPurchaseIn = (rows: ErpPurchaseInApi.PurchaseIn[]) => {
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const paidPrice = row.paymentPrice ?? 0;
|
||||
const newItem: ErpFinancePaymentApi.FinancePaymentItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.PURCHASE_IN,
|
||||
bizNo: row.no,
|
||||
totalPrice: row.totalPrice,
|
||||
paidPrice: row.paymentPrice,
|
||||
paymentPrice: row.totalPrice - row.paymentPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice,
|
||||
paidPrice,
|
||||
paymentPrice: totalPrice - paidPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -154,13 +156,15 @@ const handleOpenSaleReturn = () => {
|
|||
|
||||
const handleAddSaleReturn = (rows: ErpPurchaseReturnApi.PurchaseReturn[]) => {
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const refundPrice = row.refundPrice ?? 0;
|
||||
const newItem: ErpFinancePaymentApi.FinancePaymentItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.PURCHASE_RETURN,
|
||||
bizNo: row.no,
|
||||
totalPrice: -row.totalPrice,
|
||||
paidPrice: -row.refundPrice,
|
||||
paymentPrice: -row.totalPrice + row.refundPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice: -totalPrice,
|
||||
paidPrice: -refundPrice,
|
||||
paymentPrice: -totalPrice + refundPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -202,7 +206,7 @@ const validate = () => {
|
|||
// 检查每行的付款金额
|
||||
for (let i = 0; i < tableData.value.length; i++) {
|
||||
const item = tableData.value[i];
|
||||
if (!item.paymentPrice || item.paymentPrice <= 0) {
|
||||
if (!item?.paymentPrice || item.paymentPrice <= 0) {
|
||||
throw new Error(`第 ${i + 1} 行:本次付款必须大于0`);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:total-price',
|
||||
'update:receipt-price',
|
||||
'update:totalPrice',
|
||||
'update:receiptPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpFinanceReceiptApi.FinanceReceiptItem[]>([]); // 表格数据
|
||||
|
|
@ -110,8 +110,8 @@ watch(
|
|||
);
|
||||
const finalReceiptPrice = receiptPrice - (props.discountPrice || 0);
|
||||
// 通知父组件更新
|
||||
emit('update:total-price', totalPrice);
|
||||
emit('update:receipt-price', finalReceiptPrice);
|
||||
emit('update:totalPrice', totalPrice);
|
||||
emit('update:receiptPrice', finalReceiptPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
@ -128,14 +128,15 @@ function handleOpenSaleOut() {
|
|||
|
||||
function handleAddSaleOut(rows: ErpSaleOutApi.SaleOut[]) {
|
||||
rows.forEach((row) => {
|
||||
// TODO 芋艿
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const receiptedPrice = row.receiptPrice ?? 0;
|
||||
const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.SALE_OUT,
|
||||
bizNo: row.no,
|
||||
totalPrice: row.totalPrice,
|
||||
receiptedPrice: row.receiptPrice,
|
||||
receiptPrice: row.totalPrice - row.receiptPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice,
|
||||
receiptedPrice,
|
||||
receiptPrice: totalPrice - receiptedPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -154,15 +155,16 @@ function handleOpenSaleReturn() {
|
|||
}
|
||||
|
||||
function handleAddSaleReturn(rows: ErpSaleReturnApi.SaleReturn[]) {
|
||||
// TODO 芋艿
|
||||
rows.forEach((row) => {
|
||||
const totalPrice = row.totalPrice ?? 0;
|
||||
const refundPrice = row.refundPrice ?? 0;
|
||||
const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = {
|
||||
bizId: row.id,
|
||||
bizId: row.id ?? 0,
|
||||
bizType: ErpBizType.SALE_RETURN,
|
||||
bizNo: row.no,
|
||||
totalPrice: -row.totalPrice,
|
||||
receiptedPrice: -row.refundPrice,
|
||||
receiptPrice: -row.totalPrice + row.refundPrice,
|
||||
bizNo: row.no ?? '',
|
||||
totalPrice: -totalPrice,
|
||||
receiptedPrice: -refundPrice,
|
||||
receiptPrice: -totalPrice + refundPrice,
|
||||
remark: undefined,
|
||||
};
|
||||
tableData.value.push(newItem);
|
||||
|
|
@ -204,7 +206,7 @@ function validate() {
|
|||
// 检查每行的收款金额
|
||||
for (let i = 0; i < tableData.value.length; i++) {
|
||||
const item = tableData.value[i];
|
||||
if (!item.receiptPrice || item.receiptPrice <= 0) {
|
||||
if (!item?.receiptPrice || item.receiptPrice <= 0) {
|
||||
throw new Error(`第 ${i + 1} 行:本次收款必须大于0`);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,10 +12,6 @@ import TimeSummaryChart from './modules/time-summary-chart.vue';
|
|||
defineOptions({ name: 'ErpHome' });
|
||||
|
||||
const loading = ref(false); // 加载中
|
||||
|
||||
/** 图表组件引用 */
|
||||
const saleChartRef = ref();
|
||||
const purchaseChartRef = ref();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -36,15 +32,11 @@ const purchaseChartRef = ref();
|
|||
<Row :gutter="16">
|
||||
<!-- 销售统计 -->
|
||||
<Col :md="12" :sm="12" :xs="24">
|
||||
<TimeSummaryChart ref="saleChartRef" title="销售统计" type="sale" />
|
||||
<TimeSummaryChart title="销售统计" type="sale" />
|
||||
</Col>
|
||||
<!-- 采购统计 -->
|
||||
<Col :md="12" :sm="12" :xs="24">
|
||||
<TimeSummaryChart
|
||||
ref="purchaseChartRef"
|
||||
title="采购统计"
|
||||
type="purchase"
|
||||
/>
|
||||
<TimeSummaryChart title="采购统计" type="purchase" />
|
||||
</Col>
|
||||
</Row>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { EchartsUIType } from '@vben/plugins/echarts';
|
||||
import type { EChartsOption, EchartsUIType } from '@vben/plugins/echarts';
|
||||
|
||||
import type { ErpPurchaseStatisticsApi } from '#/api/erp/statistics/purchase';
|
||||
import type { ErpSaleStatisticsApi } from '#/api/erp/statistics/sale';
|
||||
|
|
@ -49,7 +49,7 @@ const chartRef = ref<EchartsUIType>();
|
|||
const { renderEcharts } = useEcharts(chartRef);
|
||||
|
||||
/** 折线图配置 */
|
||||
const lineChartOptions: echarts.EChartsOption = {
|
||||
const lineChartOptions: EChartsOption = {
|
||||
grid: {
|
||||
left: 20,
|
||||
right: 20,
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseInApi.PurchaseInItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseOrderApi.PurchaseOrderItem[]>([]); // 表格数据
|
||||
|
|
@ -113,8 +113,8 @@ watch(
|
|||
: erpPriceMultiply(totalPrice, props.discountPercent / 100);
|
||||
const finalTotalPrice = totalPrice - discountPrice!;
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpPurchaseReturnApi.PurchaseReturnItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleOrderApi.SaleOrderItem[]>([]); // 表格数据
|
||||
|
|
@ -113,8 +113,8 @@ watch(
|
|||
: erpPriceMultiply(totalPrice, props.discountPercent / 100);
|
||||
const finalTotalPrice = totalPrice - discountPrice!;
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleOutApi.SaleOutItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const emit = defineEmits([
|
||||
'update:items',
|
||||
'update:discount-price',
|
||||
'update:other-price',
|
||||
'update:total-price',
|
||||
'update:discountPrice',
|
||||
'update:otherPrice',
|
||||
'update:totalPrice',
|
||||
]);
|
||||
|
||||
const tableData = ref<ErpSaleReturnApi.SaleReturnItem[]>([]); // 表格数据
|
||||
|
|
@ -122,9 +122,9 @@ watch(
|
|||
const finalTotalPrice = discountedPrice + (props.otherPrice || 0);
|
||||
|
||||
// 通知父组件更新
|
||||
emit('update:discount-price', discountPrice);
|
||||
emit('update:other-price', props.otherPrice || 0);
|
||||
emit('update:total-price', finalTotalPrice);
|
||||
emit('update:discountPrice', discountPrice);
|
||||
emit('update:otherPrice', props.otherPrice || 0);
|
||||
emit('update:totalPrice', finalTotalPrice);
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ watch(
|
|||
|
||||
/** 提供获取表格数据的方法供父组件调用 */
|
||||
defineExpose({
|
||||
getData: (): InfraCodegenApi.CodegenColumn[] => gridApi.grid.getData(),
|
||||
getData: (): InfraCodegenApi.CodegenColumn[] =>
|
||||
gridApi.grid.getData() as InfraCodegenApi.CodegenColumn[],
|
||||
});
|
||||
|
||||
/** 初始化 */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { Demo03StudentApi } from '#/api/infra/demo/demo03/inner';
|
||||
|
||||
import { nextTick, watch } from 'vue';
|
||||
|
|
@ -34,7 +35,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<Demo03StudentApi.Demo03Course>,
|
||||
});
|
||||
|
||||
/** 添加学生课程 */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<script lang="ts" setup>
|
||||
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
|
||||
import type { Demo03StudentApi } from '#/api/infra/demo/demo03/normal';
|
||||
|
||||
import { nextTick, watch } from 'vue';
|
||||
|
|
@ -33,7 +34,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
|
|||
toolbarConfig: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
} as VxeTableGridOptions<Demo03StudentApi.Demo03Course>,
|
||||
});
|
||||
|
||||
/** 添加学生课程 */
|
||||
|
|
|
|||
|
|
@ -154,6 +154,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -208,7 +214,7 @@ onMounted(() => {
|
|||
<ContentWrap title="示例联系人">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -244,7 +250,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -126,6 +126,12 @@ function toggleExpand() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -176,7 +182,7 @@ onMounted(() => {
|
|||
<ContentWrap title="示例分类">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button @click="toggleExpand" class="mr-2">
|
||||
|
|
@ -204,7 +210,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
:tree-config="{
|
||||
parentField: 'parentId',
|
||||
|
|
|
|||
|
|
@ -165,6 +165,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -219,7 +225,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -255,7 +261,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
@cell-click="onCellClick"
|
||||
:row-config="{
|
||||
|
|
|
|||
|
|
@ -156,6 +156,12 @@ watch(
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -214,7 +220,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -240,7 +246,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -156,6 +156,12 @@ watch(
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -214,7 +220,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -240,7 +246,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -158,6 +158,12 @@ async function handleExport() {
|
|||
|
||||
/** 初始化 */
|
||||
const { hiddenSearchBar, tableToolbarRef, tableRef } = useTableToolbar();
|
||||
function setTableToolbarRef(el: any) {
|
||||
tableToolbarRef.value = el;
|
||||
}
|
||||
function setTableRef(el: any) {
|
||||
tableRef.value = el;
|
||||
}
|
||||
onMounted(() => {
|
||||
getList();
|
||||
});
|
||||
|
|
@ -212,7 +218,7 @@ onMounted(() => {
|
|||
<ContentWrap title="学生">
|
||||
<template #extra>
|
||||
<VbenVxeTableToolbar
|
||||
ref="tableToolbarRef"
|
||||
:ref="setTableToolbarRef"
|
||||
v-model:hidden-search="hiddenSearchBar"
|
||||
>
|
||||
<Button
|
||||
|
|
@ -248,7 +254,7 @@ onMounted(() => {
|
|||
</VbenVxeTableToolbar>
|
||||
</template>
|
||||
<VxeTable
|
||||
ref="tableRef"
|
||||
:ref="setTableRef"
|
||||
:data="list"
|
||||
show-overflow
|
||||
:loading="loading"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue