Browse Source

添加编号组件

v4
超级管理员 2 years ago
parent
commit
981ae623e0
  1. 2
      package.json
  2. 8
      src/api/DesignForm/requestapi.ts
  3. 6
      src/api/DesignForm/types.ts
  4. 13
      src/components/DesignForm/assembly/index.ts
  5. 98
      src/components/DesignForm/formControlAttr.vue
  6. 12
      src/components/DesignForm/public/form/form.vue
  7. 14
      src/components/DesignForm/public/form/formGroup.vue
  8. 8
      src/main.ts
  9. 3
      src/views/sysworkflow/codepage/createform.vue
  10. 1
      src/views/taskplatform/taskmanagement/myrequest.vue
  11. 3
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue
  12. 8
      src/widget/index.ts
  13. 209
      src/widget/number/index.vue

2
package.json

@ -40,7 +40,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@element-plus/icons-vue": "^2.1.0", "@element-plus/icons-vue": "^2.3.1",
"@vitejs/plugin-vue": "^4.2.3", "@vitejs/plugin-vue": "^4.2.3",
"@vueuse/core": "^10.1.2", "@vueuse/core": "^10.1.2",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",

8
src/api/DesignForm/requestapi.ts

@ -261,3 +261,11 @@ export function gainEditFormFlowInfo(data?:enableVersionId){
data: data data: data
}); });
} }
//获取要修改的数据
export function gainNumber(data?:any){
return request({
url: '/systemapi/public/gainNumber',
method: 'post',
data: data
});
}

6
src/api/DesignForm/types.ts

@ -98,6 +98,12 @@ export interface formData{
config: any; config: any;
events?:any events?:any
} }
//表单基本信息
export interface formTableInfo{
size?: any;
name?:any,
formName?:any
}
//其他表单数据 //其他表单数据
export interface formOtherData{ export interface formOtherData{
source: any; source: any;

13
src/components/DesignForm/assembly/index.ts

@ -199,7 +199,18 @@ const selectOption: any = [
label: '保存' label: '保存'
}, },
config: {} config: {}
} },
{
type: 'serialNumber',
label: '编码',
icon: 'number',
iconFont: 'fa-sort-numeric-asc',
control: {
},
config: {
automatic:false
}
}
] ]
}, },
{ {

98
src/components/DesignForm/formControlAttr.vue

@ -66,7 +66,29 @@ const state = reactive({
"可参考UI组件表单校验,<a href='https://element-plus.gitee.io/zh-CN/component/form.html#%E8%A1%A8%E5%8D%95%E6%A0%A1%E9%AA%8C' target='_blank' style='color:red'>详情点击</a>", "可参考UI组件表单校验,<a href='https://element-plus.gitee.io/zh-CN/component/form.html#%E8%A1%A8%E5%8D%95%E6%A0%A1%E9%AA%8C' target='_blank' style='color:red'>详情点击</a>",
props: '可添加当前组件所有prop属性及事件方法' props: '可添加当前组件所有prop属性及事件方法'
}, },
tabsName: 'second' tabsName: 'second',
numberRulesList:[
{
type: 'time',
label: '时间',
msg:'请选择时间格式'
},
{
type: 'text',
label: '自定义字符',
msg:'请输入自定义字符'
},
{
type: 'serialnumber',
label: '流水序号',
msg:'流水号起始值'
},
{
type: 'randomnumber',
label: '随机数',
msg:'请输入随机数位数'
}
]
}) })
const formAttr = computed(() => { const formAttr = computed(() => {
@ -1049,6 +1071,23 @@ const delAddRules = (index: number) => {
controlData.value.customRules && controlData.value.customRules &&
controlData.value.customRules.splice(index, 1) controlData.value.customRules.splice(index, 1)
} }
//
const addNumRules = () => {
if (!controlData.value.config.customRules) {
controlData.value.config.customRules = []
}
controlData.value.config.customRules.push({
type:'time',
rule:"YYYYMMDD"
})
}
//
const delNumRules = (index: number) => {
controlData.value.config.customRules &&
controlData.value.config.customRules.splice(index, 1)
}
// //
const editFormStyle = (tooltip: string) => { const editFormStyle = (tooltip: string) => {
emits('openDialog', { emits('openDialog', {
@ -1100,7 +1139,7 @@ const getDataSource = () => {
} }
// //
const formAttrChange = (obj: any, val?: any) => { const formAttrChange = (obj: any, val?: any) => {
console.log("表单属性修改--->",obj,val,{ [obj.key]: obj.value }) // console.log("--->",obj,val,{ [obj.key]: obj.value })
if (obj.key === 'source') { if (obj.key === 'source') {
getFormFieldBySource(obj.value) // getFormFieldBySource(obj.value) //
// //
@ -1138,6 +1177,18 @@ const rulesSelectChange = (item: any, val: string) => {
item.message = filter[0].message item.message = filter[0].message
} }
} }
const rulesSelectNumChange = (item: any, val: string) => {
console.log("快速添加校验规则改变时",item,val)
const filter = state.numberRulesList.filter(item => item.type === val)
if (filter && filter.length) {
item.message = filter[0].msg
if(val == "time") {
item.rule = "YYYYMMDD"
}else{
item.rule = ""
}
}
}
// options // options
const optionsEvent = (type: string, tooltip?: string) => { const optionsEvent = (type: string, tooltip?: string) => {
openAttrDialog(type, tooltip) openAttrDialog(type, tooltip)
@ -1149,7 +1200,7 @@ getDataSource()
defineExpose({ getFormFieldBySource }) defineExpose({ getFormFieldBySource })
// //
const isNotWrite = (val:any) =>{ const isNotWrite = (val:any) =>{
console.log("判断输入框是否可写--->",val) // console.log("--->",val)
if(val.key === "name" && props.customerformid != ""){ if(val.key === "name" && props.customerformid != ""){
return true return true
} }
@ -1265,6 +1316,47 @@ const isNotWrite = (val:any) =>{
<el-button @click="addSelectOption('tabs')">增加标签</el-button> <el-button @click="addSelectOption('tabs')">增加标签</el-button>
</el-form-item> </el-form-item>
</template> </template>
<!--编号规则设置--->
<div
v-if="showHide(['serialNumber'],true)"
>
<div class="h3"><h3>编码规则配置</h3></div>
<el-form-item label="编码方式">
<el-switch v-model="controlData.config.automatic" inline-prompt active-text="自动编码" inactive-text="手动编码" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #E6A23C" />
</el-form-item>
<div v-if="controlData.config.automatic">
<el-form-item v-for="(item, index) in controlData.config.customRules" :key="index">
<el-input v-model="item.rule" :placeholder="item.message?item.message:'请输入自定义字符'">
<template #prepend>
<el-select
v-model="item.type"
style="width: 100px"
@change="rulesSelectNumChange(item, $event)"
>
<el-option
v-for="list in state.numberRulesList"
:key="list.type"
:label="list.label"
:value="list.type"
/>
</el-select>
</template>
<template #append>
<i
class="icon-del"
@click="delNumRules(index as number)"
></i>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-button @click="addNumRules">添加规则</el-button>
</el-form-item>
</div>
</div>
<div <div
v-if=" v-if="
showHide( showHide(

12
src/components/DesignForm/public/form/form.vue

@ -26,6 +26,7 @@ const props = withDefaults(
defineProps<{ defineProps<{
formData: FormData formData: FormData
type?: number // 123 4 5 type?: number // 123 4 5
numrun?: number //11
disabled?: boolean // disabled?: boolean //
requestUrl?: string // url requestUrl?: string // url
beforeRequest?: Function // beforeRequest?: Function //
@ -49,6 +50,7 @@ const props = withDefaults(
}>(), }>(),
{ {
type: 1, // 123 4 5 type: 1, // 123 4 5
numrun:2,
formData: () => { formData: () => {
return { return {
list: [], list: [],
@ -538,9 +540,9 @@ const submit = (params = {}) => {
// console.log("props.beforeSubmit--->",props.beforeSubmit) // console.log("props.beforeSubmit--->",props.beforeSubmit)
// loading.value = true // loading.value = true
// console.log("apiUrl--->",apiUrl) console.log("apiUrl--->",apiUrl)
// console.log("submitParams--->",submitParams) console.log("submitParams--->",submitParams)
// console.log("formatParams--->",formatParams) console.log("formatParams--->",formatParams)
// //
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams) currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => { .then((res: any) => {
@ -617,7 +619,7 @@ const resetFields = () => {
// setValue(Object.assign(model.value, obj || {})) // // setValue(Object.assign(model.value, obj || {})) //
} }
onMounted(() => { onMounted(() => {
console.log("数据处理结束--->",props.type) console.log("数据处理结束--->",props.formData)
getInitModel() getInitModel()
nextTick(() => { nextTick(() => {
appendRemoveStyle(true) appendRemoveStyle(true)
@ -1004,7 +1006,7 @@ defineExpose({
'detail-form': type === 3 || type === 4 'detail-form': type === 3 || type === 4
}" }"
> >
<FormGroup :data="formData.list" /> <FormGroup :tableinfo="formData.form" :numrun="numrun" :data="formData.list" />
<slot></slot> <slot></slot>
</el-form> </el-form>
</div> </div>

14
src/components/DesignForm/public/form/formGroup.vue

@ -11,7 +11,7 @@ import ChildTable from './childTable.vue'
import Tooltips from '@/components/DesignForm/tooltip.vue' import Tooltips from '@/components/DesignForm/tooltip.vue'
import FlexBox from './flexBox.vue' import FlexBox from './flexBox.vue'
import { useDesignFormStore } from '@/store/DesignForm/designForm' import { useDesignFormStore } from '@/store/DesignForm/designForm'
import { FormList } from '@/api/DesignForm/types' import { FormList,formTableInfo } from '@/api/DesignForm/types'
import { import {
constFormBtnEvent, constFormBtnEvent,
constFormProps constFormProps
@ -22,6 +22,8 @@ import { jsonParseStringify } from '@/utils/DesignForm'
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
data: FormList[] data: FormList[]
tableinfo:formTableInfo
numrun?:number
}>(), }>(),
{ {
data: () => { data: () => {
@ -251,6 +253,9 @@ onUnmounted(() => {
store.setActiveKey('') store.setActiveKey('')
store.setControlAttr({}) store.setControlAttr({})
}) })
onMounted(()=>{
console.log('formGroup onMounted',dataList,props.tableinfo)
})
</script> </script>
<template> <template>
<draggable <draggable
@ -267,6 +272,7 @@ onUnmounted(() => {
}" }"
@add="draggableAdd" @add="draggableAdd"
> >
<template #item="{ element, index }"> <template #item="{ element, index }">
<div <div
class="group" class="group"
@ -418,10 +424,10 @@ onUnmounted(() => {
{{ element.control?.label }} {{ element.control?.label }}
</el-button> </el-button>
</div> </div>
</template> </template>
<template v-else-if="element.type === 'inputSlot' && type !== 5">
<!-- 除设计外其他无需处理--> <SerialNumber v-else-if="element.type === 'serialNumber'" :data="element" :tablekey="props.tableinfo.name" :numrun="props.numrun" />
</template>
<!--其他组件--> <!--其他组件-->
<FormItem v-else :data="element" /> <FormItem v-else :data="element" />

8
src/main.ts

@ -24,7 +24,8 @@ import 'uno.css';
import '@/styles/workflowcss/override-element-ui.scss' import '@/styles/workflowcss/override-element-ui.scss'
import ComComponents from '@/components/DesignForm/index' import ComComponents from '@/components/DesignForm/index'
import ComWidget from '@/widget/index'
import AKDesign from '@/views/sysworkflow/codepage/index'
const app = createApp(App); const app = createApp(App);
// 全局注册 自定义指令(directive) // 全局注册 自定义指令(directive)
@ -32,9 +33,6 @@ setupDirective(app);
// 全局注册 状态管理(store) // 全局注册 状态管理(store)
setupStore(app); setupStore(app);
import * as ElementPlusIconsVue from '@element-plus/icons-vue' import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import AKDesign from '@/views/sysworkflow/codepage/index'
for (const [key, component] of Object.entries(ElementPlusIconsVue)) { for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component) app.component(key, component)
} }
@ -45,7 +43,7 @@ app.directive('focus', {
} }
}); });
app.use(router).use(i18n).use(ComComponents).use(ElementPlus, { app.use(router).use(i18n).use(ComComponents).use(ComWidget).use(ElementPlus, {
locale: zhCn locale: zhCn
}).use(AKDesign).mount('#app'); }).use(AKDesign).mount('#app');

3
src/views/sysworkflow/codepage/createform.vue

@ -282,6 +282,7 @@ const getInitData = () => {
state.previewVisible = true state.previewVisible = true
// eslint-disable-next-line no-case-declarations // eslint-disable-next-line no-case-declarations
let stringPreview = objToStringify(state.formData) // let stringPreview = objToStringify(state.formData) //
console.log("预览数据",stringPreview);
// eslint-disable-next-line no-case-declarations // eslint-disable-next-line no-case-declarations
const formName = state.formData.form.name const formName = state.formData.form.name
// eslint-disable-next-line no-case-declarations // eslint-disable-next-line no-case-declarations
@ -682,6 +683,8 @@ function writeDataForm(){
} }
const openAceEditDrawer = (params: any) => { const openAceEditDrawer = (params: any) => {
const { type, direction, codeType, title, callback, content } = params const { type, direction, codeType, title, callback, content } = params
drawer.direction = direction // ltr/rtl drawer.direction = direction // ltr/rtl
drawer.type = type // type drawer.type = type // type
drawer.codeType = codeType || '' // drawer.codeType = codeType || '' //

1
src/views/taskplatform/taskmanagement/myrequest.vue

@ -68,6 +68,7 @@ const editOpenOrClose = ref(false)
* types 记录类型; 1我的请求2待办事宜3已办事宜4草稿箱 * types 记录类型; 1我的请求2待办事宜3已办事宜4草稿箱
*/ */
const lookFlowInfo = (val:any,types:number) => { const lookFlowInfo = (val:any,types:number) => {
// debugger
operState.value = 1 operState.value = 1
drawerMyWith.value = myappbox.value?.clientWidth drawerMyWith.value = myappbox.value?.clientWidth
flowLogInfo.value = val flowLogInfo.value = val

3
src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

@ -434,7 +434,7 @@ const sendFlowInfo = ref<any>()
<ak-form <ak-form
ref="formEl" ref="formEl"
v-loading="formLoading" element-loading-text="Loading..." v-loading="formLoading" element-loading-text="Loading..."
:numrun="formType"
:form-data="state.formData" :form-data="state.formData"
:type="formType" :type="formType"
:dict="state.dict" :dict="state.dict"
@ -490,6 +490,7 @@ const sendFlowInfo = ref<any>()
ref="formEl" ref="formEl"
:form-data="state.formData" :form-data="state.formData"
:type="formType" :type="formType"
:numrun="formType"
:dict="state.dict" :dict="state.dict"
request-url="getFormContent" request-url="getFormContent"
add-url="saveFormContent" add-url="saveFormContent"

8
src/widget/index.ts

@ -0,0 +1,8 @@
/**
*
*/
import serialNumber from './number/index.vue'
export default (app: any) => {
app.component('SerialNumber', serialNumber)
}

209
src/widget/number/index.vue

@ -0,0 +1,209 @@
<!--
@ 作者: 秦东
@ 时间: 2023-12-05 09:40:32
@ 备注: 链接地址组件
-->
<script lang='ts' setup>
import {
formatNumber,
objectToArray,
constControlChange,
constSetFormOptions,
constFormProps,
constGetControlByName
} from '@/api/DesignForm/utils'
import { uploadUrl,getRequest } from '@/api/DesignForm'
import validate from '@/api/DesignForm/validate'
import { useRoute } from 'vue-router'
import { FormItem, FormList } from '@/api/DesignForm/types'
import { gainNumber } from '@/api/DesignForm/requestapi'
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', numVal: any): void
}>()
const route = useRoute()
const formProps = inject(constFormProps, {}) as any
const type = computed(() => {
return formProps.value.type
})
const config = computed(() => {
return props.data.config || {}
})
const control = computed(() => {
return props.data.control
// return props.data
})
const options = ref(props.data.options)
const changeEvent = inject(constControlChange, '') as any
// const numVal = ref(props.modelValue)
// watch(() => props.modelValue,() => {
// numVal.value = props.modelValue
// })
watch(() => props.tablekey,() => {
console.log("编码组件1---》",props.tablekey)
})
const editDisabled = ref(false); //
const value = computed({
get() {
if (props.tProp) {
//
return props.modelValue
} else {
return formProps.value.model[props.data.name]
}
},
set(newVal: any) {
if (props.tProp) {
emits('update:modelValue', newVal)
}
updateModel(newVal)
}
})
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
changeEvent &&
changeEvent({
key: props.data.name,
value: val,
data: props.data,
tProp: props.tProp,
type: props.data.type,
attribute: controlAttribute
})
}
onMounted(() => {
console.log("编码组件---》",props.data,props.data.control.config)
if(props.numrun == 1){
getNumber()
}
})
//
const getNumber = () => {
let sendData = {
table:props.tablekey,
automatic:props.data.config.automatic,
customRules:props.data.config.customRules
}
editDisabled.value = props.data.config.automatic
gainNumber(sendData)
.then((data:any) =>{
console.log("编码组件2---》",data,sendData)
value.value = data.data
})
}
// toRefs
const getControlByName = inject(constGetControlByName) as any
const sourceFunKey = computed(() => {
const iReg = new RegExp('(?<=\\${)(.*?)(?=})', 'g')
//const iReg = new RegExp('\\${.*?}', 'g') // =>${name}
const apiUrl = config.value.optionsFun
const replace = apiUrl?.match(iReg)
return replace && replace[0]
})
const getLabel = (ele: FormItem) => {
const showColon = formProps.value.showColon ? ':' : ''
if (ele) {
return ele.showLabel ? '' : ele.label + showColon
} else {
return ''
}
}
// item
const itemRules = computed(() => {
let temp
const itemR: any = props.data.item?.rules || []
const customR = formatCustomRules()
// undefined
if (itemR?.length || customR?.length) {
temp = [...customR, ...itemR]
}
return temp
})
// customRulesrules
const formatCustomRules = () => {
const rulesReg: any = {}
validate &&
validate.forEach(item => {
rulesReg[item.type] = item.regExp
})
// 使provide
const temp: any = []
props.data.customRules?.forEach((item: any) => {
if (!item.message && item.type !== 'methods') {
return //
}
let obj = {}
if (item.type === 'required') {
obj = { required: true }
} else if (item.type === 'rules') {
//
obj = { pattern: item.rules }
} else if (item.type === 'methods') {
//
const methods: any = item.methods
if (methods) {
obj = { validator: inject(methods, {}) }
}
} else if (item.type) {
obj = { pattern: rulesReg[item.type as string] }
}
// push
let message: any = { message: item.message }
if (!item.message) {
// 使validatormessage使 callback(new Error('x'));
message = {}
}
temp.push(
Object.assign(
{
trigger: item.trigger || 'blur'
},
obj,
message
)
)
})
return temp
}
</script>
<template>
<el-form-item
v-bind="data.item"
:prop="tProp || data.name"
:class="config.className"
:rules="itemRules as any"
:label="getLabel(data.item as FormItem)"
>
<el-input v-model="value" :disabled="editDisabled" placeholder="请输入编码">
<template #prefix>NO.</template>
</el-input>
</el-form-item>
</template>
<style lang='scss' scoped>
</style>
Loading…
Cancel
Save