diff --git a/apps/web-antd/src/components/Tinyflow/index.ts b/apps/web-antd/src/components/Tinyflow/index.ts index e014e38cc..9dd61d2a9 100644 --- a/apps/web-antd/src/components/Tinyflow/index.ts +++ b/apps/web-antd/src/components/Tinyflow/index.ts @@ -1,2 +1,3 @@ -export { default as Tinyflow } from './Tinyflow.vue'; +export { default as Tinyflow } from './tinyflow.vue'; + export * from './ui/typing'; diff --git a/apps/web-antd/src/utils/formCreate.ts b/apps/web-antd/src/utils/formCreate.ts index a653a44bb..070b394ad 100644 --- a/apps/web-antd/src/utils/formCreate.ts +++ b/apps/web-antd/src/utils/formCreate.ts @@ -4,6 +4,7 @@ // TODO @芋艿:后续这些 form-create 的优化;另外需要使用 form-create-helper 会好点 import { isRef } from 'vue'; +import formCreate from '@form-create/ant-design-vue'; // 编码表单 Conf export const encodeConf = (designerRef: any) => { return JSON.stringify(designerRef.value.getOption()); @@ -23,7 +24,7 @@ export const encodeFields = (designerRef: any) => { export const decodeFields = (fields: string[]) => { const rule: object[] = []; fields.forEach((item) => { - rule.push(JSON.parse(item)); + rule.push(formCreate.parseJson(item)); }); return rule; }; @@ -34,7 +35,7 @@ export const setConfAndFields = ( conf: string, fields: string | string[], ) => { - designerRef.value.setOption(JSON.parse(conf)); + designerRef.value.setOption(formCreate.parseJson(conf)); // 处理 fields 参数类型,确保传入 decodeFields 的是 string[] 类型 const fieldsArray = Array.isArray(fields) ? fields : [fields]; designerRef.value.setRule(decodeFields(fieldsArray)); @@ -50,7 +51,7 @@ export const setConfAndFields2 = ( if (isRef(detailPreview)) { detailPreview = detailPreview.value; } - detailPreview.option = JSON.parse(conf); + detailPreview.option = formCreate.parseJson(conf); detailPreview.rule = decodeFields(fields); if (value) { detailPreview.value = value; diff --git a/apps/web-antd/src/views/ai/workflow/form/modules/workflow-design.vue b/apps/web-antd/src/views/ai/workflow/form/modules/workflow-design.vue index fb4ec8cf2..6659b80be 100644 --- a/apps/web-antd/src/views/ai/workflow/form/modules/workflow-design.vue +++ b/apps/web-antd/src/views/ai/workflow/form/modules/workflow-design.vue @@ -10,7 +10,7 @@ import { isNumber } from '@vben/utils'; import { Button, Input, Select } from 'ant-design-vue'; import { testWorkflow } from '#/api/ai/workflow'; -import { Tinyflow } from '#/components/Tinyflow'; +import { Tinyflow } from '#/components/tinyflow'; defineProps<{ provider: any; diff --git a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue index 4f1ca6800..43a331aca 100644 --- a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue +++ b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue @@ -7,6 +7,7 @@ import { computed, nextTick, ref, watch } from 'vue'; import { useTabs } from '@vben/hooks'; import { IconifyIcon } from '@vben/icons'; +import formCreate from '@form-create/ant-design-vue'; import { Button, Card, Col, message, Row, Space, Tabs } from 'ant-design-vue'; import { getProcessDefinition } from '#/api/bpm/definition'; @@ -51,7 +52,7 @@ const props = defineProps({ const emit = defineEmits(['cancel']); // 增加表单就绪状态变量 表单就绪后再渲染form-create -const isFormReady = ref(false) +const isFormReady = ref(false); const { closeCurrentTab } = useTabs(); @@ -129,18 +130,17 @@ async function initProcessInfo(row: any, formVariables?: any) { // 注意:需要从 formVariables 中,移除不在 row.formFields 的值。 // 原因是:后端返回的 formVariables 里面,会有一些非表单的信息。例如说,某个流程节点的审批人。 // 这样,就可能导致一个流程被审批不通过后,重新发起时,会直接后端报错!!! - const allowedFields = new Set( - decodeFields(row.formFields).map((fieldObj: any) => fieldObj.field), - ); + const formApi = formCreate.create(decodeFields(row.formFields)); + const allowedFields = formApi.fields(); for (const key in formVariables) { - if (!allowedFields.has(key)) { + if (!allowedFields.includes(key)) { delete formVariables[key]; } } setConfAndFields2(detailForm, row.formConf, row.formFields, formVariables); // 设置表单就绪状态 - isFormReady.value = true + isFormReady.value = true; await nextTick(); fApi.value?.btn.show(false); // 隐藏提交按钮 diff --git a/apps/web-ele/src/views/mall/product/spu/components/sku-list.vue b/apps/web-ele/src/views/mall/product/spu/components/sku-list.vue index 8d9d377e4..49f788027 100644 --- a/apps/web-ele/src/views/mall/product/spu/components/sku-list.vue +++ b/apps/web-ele/src/views/mall/product/spu/components/sku-list.vue @@ -45,7 +45,8 @@ const props = defineProps({ const emit = defineEmits<{ (e: 'selectionChange', value: MallSpuApi.Sku[]): void; -}>(); const formData = ref(); // 表单数据 +}>(); +const formData = ref(); // 表单数据 const skuList = ref([ { price: 0, // 商品价格 @@ -88,7 +89,7 @@ const deleteSku = (row: MallSpuApi.Sku) => { ); formData.value!.skus!.splice(index, 1); }; -const tableHeaders = ref<{ label: string; prop: string; }[]>([]); // 多属性表头 +const tableHeaders = ref<{ label: string; prop: string }[]>([]); // 多属性表头 /** * 保存时,每个商品规格的表单要校验下。例如说,销售金额最低是 0.01 这种。 */ @@ -204,7 +205,7 @@ const validateData = (propertyList: any[]) => { sku.properties ?.map((property: any) => property.propertyId) ?.forEach((propertyId: number) => { - if (!skuPropertyIds.indexOf(propertyId!) === -1) { + if (!skuPropertyIds.includes(propertyId!)) { skuPropertyIds.push(propertyId!); } }), @@ -463,333 +464,9 @@ defineExpose({ generateTableData, validateSku, getSkuTableRef }); size="small" type="primary" @click="deleteSku(row)" - > -删除 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.includes(propertyId!)) { - skuPropertyIds.push(propertyId!); - } - }), - ); - const propertyIds = propertyList.map((item) => item.id); - return skuPropertyIds.length === propertyIds.length; -}; - -/** 构建所有排列组合 */ -const build = ( - propertyValuesList: MallSpuApi.Property[][], -): MallSpuApi.Property[] | MallSpuApi.Property[][] => { - if (!propertyValuesList || propertyValuesList.length === 0) { - return []; - } else if (propertyValuesList.length === 1) { - return propertyValuesList[0] || []; - } else { - const result: MallSpuApi.Property[][] = []; - const rest = build(propertyValuesList.slice(1)); - if (propertyValuesList[0] && Array.isArray(rest)) { - for (let i = 0; i < propertyValuesList[0].length; i++) { - for (const restItem of rest) { - const currentItem = propertyValuesList[0][i]; - // 第一次不是数组结构,后面的都是数组结构 - if (Array.isArray(restItem)) { - result.push([currentItem!, ...restItem]); - } else if (restItem) { - // 确保restItem不是undefined,并进行类型断言 - result.push([currentItem!, restItem as MallSpuApi.Property]); - } - } - } - } - return result; - } -}; - -/** 监听属性列表,生成相关参数和表头 */ -watch( - () => props.propertyList, - (propertyList: PropertyAndValues[]) => { - // 如果不是多规格则结束 - if (!formData.value!.specType) { - return; - } - // 如果当前组件作为批量添加数据使用,则重置表数据 - if (props.isBatch) { - skuList.value = [ - { - price: 0, - marketPrice: 0, - costPrice: 0, - barCode: '', - picUrl: '', - stock: 0, - weight: 0, - volume: 0, - firstBrokeragePrice: 0, - secondBrokeragePrice: 0, - }, - ]; - } - - // 判断代理对象是否为空 - if (JSON.stringify(propertyList) === '[]') { - return; - } - // 重置表头 - tableHeaders.value = []; - // 生成表头 - propertyList.forEach((item, index) => { - // name加属性项index区分属性值 - tableHeaders.value.push({ prop: `name${index}`, label: item.name }); - }); - // 如果回显的 sku 属性和添加的属性一致则不处理 - if (validateData(propertyList)) { - return; - } - // 添加新属性没有属性值也不做处理 - if (propertyList.some((item) => !item.values || isEmpty(item.values))) { - return; - } - // 生成 table 数据,即 sku 列表 - generateTableData(propertyList); - }, - { - deep: true, - immediate: true, - }, -); -const activitySkuListRef = ref>(); - -const getSkuTableRef = () => { - return activitySkuListRef.value; -}; -// 暴露出生成 sku 方法,给添加属性成功时调用 -defineExpose({ generateTableData, validateSku, getSkuTableRef }); - -