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. 16
      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": {
"@element-plus/icons-vue": "^2.1.0",
"@element-plus/icons-vue": "^2.3.1",
"@vitejs/plugin-vue": "^4.2.3",
"@vueuse/core": "^10.1.2",
"@wangeditor/editor": "^5.1.23",

8
src/api/DesignForm/requestapi.ts

@ -261,3 +261,11 @@ export function gainEditFormFlowInfo(data?:enableVersionId){
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;
events?:any
}
//表单基本信息
export interface formTableInfo{
size?: any;
name?:any,
formName?:any
}
//其他表单数据
export interface formOtherData{
source: any;

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

@ -199,7 +199,18 @@ const selectOption: any = [
label: '保存'
},
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>",
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(() => {
@ -1049,6 +1071,23 @@ const delAddRules = (index: number) => {
controlData.value.customRules &&
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) => {
emits('openDialog', {
@ -1100,7 +1139,7 @@ const getDataSource = () => {
}
//
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') {
getFormFieldBySource(obj.value) //
//
@ -1138,6 +1177,18 @@ const rulesSelectChange = (item: any, val: string) => {
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
const optionsEvent = (type: string, tooltip?: string) => {
openAttrDialog(type, tooltip)
@ -1149,7 +1200,7 @@ getDataSource()
defineExpose({ getFormFieldBySource })
//
const isNotWrite = (val:any) =>{
console.log("判断输入框是否可写--->",val)
// console.log("--->",val)
if(val.key === "name" && props.customerformid != ""){
return true
}
@ -1265,6 +1316,47 @@ const isNotWrite = (val:any) =>{
<el-button @click="addSelectOption('tabs')">增加标签</el-button>
</el-form-item>
</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
v-if="
showHide(

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

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

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

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

8
src/main.ts

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

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

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

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

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

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

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