数通智联化工云平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

706 lines
20 KiB

<!--
@ 作者: 秦东
@ 时间: 2024-03-11 09:01:36
@ 备注: 自定义表单
-->
<script lang='ts' setup>
import { useDesignFormStore } from '@/store/DesignForm/designForm'
import { useRoute, useRouter } from 'vue-router'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { getRequest } from '@/api/DesignForm'
import { afterResponse, beforeRequest, onChange } from '@/api/DesignForm/utils'
import { ref, reactive, provide, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { useLayoutStore } from '@/store/DesignForm/layout'
import { FormData,formStruct,DrawerStruct, VideoMsg } from '@/api/DesignForm/types'
import { customerFormVersionCont } from '@/api/DesignForm/type'
import { saveProductionForm,getOneProductionForm,haveCustomerFormVersion,editCustomerFormInfo,saveAsNewVersion,enableVersion,judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import { submitAndCancelButton,cancelButton,submitButton } from "@/api/DesignForm/gromGround/data";
//引入页面
import DragControl from '@/components/DesignForm/dragControl.vue';
import DragControlNew from '@/components/DesignForm/dragControlNew.vue';
import HeadTools from '@/components/DesignForm/public/headTools.vue';
// import HeadTools from '@/components/DesignForm/public/headToolsNew.vue';
import FormDesign from '@/components/DesignForm/public/form/form.vue'
import VueFile from '@/components/DesignForm/vueFile.vue'
import AceDrawer from '@/components/DesignForm/aceDrawer.vue'
const props = defineProps({
formKey:{
type:String,
default:""
},
formVersion:{
type:String,
default:""
},
formconfigcont:{
type:Object,
default(){
return {}
}
},
state:{
type:Object,
default(){
return {}
}
}
});
const emits = defineEmits<{
(e: 'update:state', val: formStruct): void
(e: 'update:formKey', val: string): void
(e: 'update:formVersion', val: string): void
(e: 'judgeFormIsEdit', val: boolean): void
(e: 'runNextWindows', val: number): void
(e: 'closeFormPage'): void
(e: 'verTabsClick'): void
}>()
const state = computed({
get() {
return props.state
},
set(val: formStruct) {
emits('update:state', val)
}
});
const formKeyVal = computed({
get() {
return props.formKey
},
set(val: formStruct) {
emits('update:formKey', val)
}
});
// 当前表单设计类型,供各子组件调用以展示不同页面,统一方式不需要每个组件都从路由中取
provide('formDesignType', state.value.designType)
const vueFileEl = ref()
const formControlAttrEl = ref()
const drawer = reactive<DrawerStruct>({
visible: false,
type: '',
title: '',
codeType: '',
direction: undefined, //弹出方向rtl / ltr
callback: ''
})
const versionCont = ref<customerFormVersionCont[]>([]) //版本内容列表
const versionId = ref<string>("") //版本号
const store = useDesignFormStore()
const router = useRouter()
const route: any = useRoute().query || {}
// 搜索设计时左侧快速添加字段
const searchCheckField = (data: FormData) => {
state.value.formData.list.push(data)
}
// 选择模板
const selectTemplate = (data: FormData) => {
state.value.formData = stringToObj(objToStringify(data))
}
//编辑版本状态
const editversionstaus = (id:string) =>{
// console.log("编辑版本状态--1--》",id)
enableVersion({id:id.toString()})
.then(() =>{
haveCustomerFormVersion({id:state.value.formData.form.name})
.then(({data})=>{
// console.log("加载异常-------------->",data)
versionCont.value = data
if(data.length > 0){
data.forEach((item:any) => {
if(item.status == 1){
versionId.value = item.id.toString()
emits('update:formVersion', item.id.toString())
}
});
}
})
})
}
/**
@ 作者: 秦东
@ 时间: 2024-03-09 16:10:23
@ 功能: 按钮操作
*/
const headToolClick = (type: string) => {
switch (type) {
case 'del': //清空
state.value.formData.list = []
store.setActiveKey('')
store.setControlAttr({})
break
case 'eye': //预览
store.setActiveKey('')
store.setControlAttr({})
let stringPreview = objToStringify(state.value.formData) // 防止预览窗口数据修改影响
const formName = state.value.formData.form.name
const reg = new RegExp(`get${formName}ControlByName`, 'g')
stringPreview = stringPreview.replace(
reg,
`getPreview${formName}ControlByName`
)
state.value.formDataPreview = stringToObj(stringPreview)
state.value.formDataPreview.form.name = `Preview${formName}` // 修改下表单名
// console.log("预览数据",state.value.formDataPreview);
state.value.previewVisible = true
break
case 'json': // 生成脚本预览
openAceEditDrawer({
direction: 'rtl',
content: state.value.formData,
title: '可编辑修改或将已生成的脚本粘贴进来'
})
break
case 'save': //保存
// saveData();
if(formKeyVal.value != ""){
editSaveData();
}else{
saveDataNew();
}
break
case 'branch': //另存为新版
saveOtherData();
break
case 'vue':
vueFileEl.value.open(state.value.formData)
break
case 'close':
state.value.formData.list = []
store.setActiveKey('')
store.setControlAttr({})
emits('closeFormPage')
// if(state.value.formData.list.length > 0){
// ElMessageBox.confirm('表单已做设计或修改!请问是否保存?','温馨提示!',{
// confirmButtonText: '保存',
// cancelButtonText: '不保存',
// type: 'warning',
// draggable: true,
// })
// .then(() => {
// saveDataNew();
// })
// .catch(() => {
// state.value.formData.list = []
// store.setActiveKey('')
// store.setControlAttr({})
// // emits("update:draweropenclose", false);
// emits("closeDrawer");
// })
// }else{
// state.value.formData.list = []
// store.setActiveKey('')
// store.setControlAttr({})
// emits('closeFormPage')
// }
break
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-11 13:44:38
@ 功能: 另存为新版本
*/
const saveOtherData = () => {
let params: any = {
jsondata:JSON.stringify(state.value.formData),
data: objToStringify(state.value.formData),
source: state.value.formOtherData.source, // 数据源允许在表单属性设置里修改的
name: state.value.formOtherData.formName, // 表单名称,用于在显示所有已创建的表单列表里显示
type: 1, // 1表单 2列表
dict: json2string(state.value.formDict)
}
state.value.loading = true
saveAsNewVersion(params)
.then((res: any) => {
// console.log("数据保存", res)
if(res.code == 0){
emits('judgeFormIsEdit', false)
ElMessage({
message: res.message || '保存成功!',
type: 'success'
})
// emits("handlequery");
// emits("update:draweropenclose", false);
emits("runNextWindows",2);
versionId.value = res.data.id.toString()
emits('update:formVersion', res.data.id.toString())
// 清空右侧栏信息
store.setActiveKey('')
store.setControlAttr({})
getInitData()
}else{
ElMessage({
message: res.msg || '保存失败!',
type: 'error'
})
}
})
.finally(() => {
state.value.loading=false;
})
.catch((res: any) => {
ElMessage.error(res.message || '保存异常')
state.value.loading = false
})
}
//讲数据保存到服务端(新版)
const saveDataNew = () => {
let params: any = {
jsondata:JSON.stringify(state.value.formData),
data: objToStringify(state.value.formData),
source: state.value.formOtherData.source, // 数据源允许在表单属性设置里修改的
name: state.value.formOtherData.formName, // 表单名称,用于在显示所有已创建的表单列表里显示
type: 1, // 1表单 2列表
dict: json2string(state.value.formDict)
}
let apiKey = 'designSave'
if (route.id) {
// 编辑状态 当前记录id
Object.assign(params, { id: route.id })
apiKey = 'designEdit'
}
// 列表搜索模式下只有修改
if (state.value.designType === 'search') {
params = {
data: objToStringify(state.value.formData),
dict: json2string(state.value.formDict),
id: route.id
}
}
state.value.loading = true
saveProductionForm(params)
.then((res: any) => {
console.log("数据保存", res)
if(res.code == 0){
emits('judgeFormIsEdit', false)
ElMessage({
message: res.message || '保存成功!',
type: 'success'
})
emits('update:formKey', res.data.customerFormCont.id)
emits('update:formVersion', res.data.formVersion.id.toString())
versionId.value = res.data.formVersion.id.toString()
// emits("handlequery");
// emits("update:draweropenclose", false);
emits("runNextWindows",2);
// 清空右侧栏信息
store.setActiveKey('')
store.setControlAttr({})
getInitData()
}else{
ElMessage({
message: res.msg || '保存失败!',
type: 'error'
})
}
})
.finally(() => {
state.value.loading=false;
})
.catch((res: any) => {
ElMessage.error(res.message || '保存异常')
state.value.loading = false
})
}
//编辑自定义表单数据
const editSaveData = () =>{
let params: any = {
jsondata:JSON.stringify(state.value.formData),
data: objToStringify(state.value.formData),
source: state.value.formOtherData.source, // 数据源允许在表单属性设置里修改的
name: state.value.formOtherData.formName, // 表单名称,用于在显示所有已创建的表单列表里显示
type: 1, // 1表单 2列表
dict: json2string(state.value.formDict),
id:formKeyVal.value.toString(),
version:versionId.value.toString(),
}
state.value.loading = true
editCustomerFormInfo(params)
.then((res: any) => {
if(res.code == 0){
emits('judgeFormIsEdit', false)
ElMessage({
message: res.message || '保存成功!',
type: 'success'
})
// emits("handlequery");
// emits("update:draweropenclose", false);
emits("runNextWindows",2);
// 清空右侧栏信息
store.setActiveKey('')
store.setControlAttr({})
}else{
ElMessage({
message: res.msg || '保存失败!',
type: 'error'
})
}
})
.finally(() => {
state.value.loading=false;
})
.catch((res: any) => {
ElMessage.error(res.message || '保存异常')
state.value.loading = false
})
}
//打开脚本预览
const openAceEditDrawer = (params: any) => {
const { type, direction, codeType, title, callback, content } = params
drawer.direction = direction // 窗口位置ltr/rtl
drawer.type = type // 作为窗口唯一标识,在窗口关闭时可根据type作不同处理
drawer.codeType = codeType || '' // 显示代码类型
drawer.title = title ? `提示:${title}` : ''
drawer.visible = true
drawer.callback = callback
let editData =codeType === 'json'? json2string(content, true): objToStringify(content, true)
switch (type) {
case 'css':
editData = state.value.formData.config?.style || ''
break
case 'dict':
// 格式化一下
editData = json2string(state.value.formDict, true)
break
case 'beforeRequest':
case 'beforeSubmit':
case 'afterResponse':
case 'afterSubmit':
case 'change':
// eslint-disable-next-line no-case-declarations
const beforeData = state.value.formData.events || {}
if (beforeData[type]) {
editData = objToStringify(beforeData[type], true)
} else {
if (['afterResponse', 'afterSubmit'].includes(type)) {
editData = afterResponse
} else if (type === 'change') {
editData = onChange
} else {
editData = beforeRequest
}
}
break
// case 'afterResponse':
// case 'afterSubmit':
// const newData = state.formData.events || {}
// if (newData[type]) {
// editData = objToStringify(newData[type], true)
// } else {
// editData = afterResponse
// }
// break
case 'optionsParams':
if (!content) {
editData = beforeRequest
}
break
case 'optionsResult':
if (!content) {
editData = afterResponse
}
break
}
drawer.content = editData
}
//关闭脚本预览窗,并初始化脚本预览参数
const dialogCancel = () => {
drawer.visible = false
drawer.type = ''
drawer.title = ''
drawer.codeType = ''
drawer.callback = ''
drawer.content = ''
}
// 弹窗确认
const dialogConfirm = (editVal: string) => {
// 生成脚本预览和导入json,都是将编辑器内容更新至state.formData
try {
if (typeof drawer.callback === 'function') {
// callback
const newObj =
drawer.codeType === 'json'? string2json(editVal): stringToObj(editVal)
drawer.callback(newObj)
} else {
switch (drawer.type) {
case 'css':
// 表单属性-编辑表单样式
if (!state.value.formData.config) {
state.value.formData.config = {}
}
state.value.formData.config.style = editVal
break
case 'dict':
state.value.formDict = string2json(editVal)
break
case 'beforeRequest':
case 'beforeSubmit':
case 'afterResponse':
case 'afterSubmit':
case 'closeSubmit':
case 'change':
if (!state.value.formData.events) {
state.value.formData.events = {}
}
state.value.formData.events[drawer.type] = stringToObj(editVal)
break
default:
state.value.formData = stringToObj(editVal)
}
}
dialogCancel()
} catch (res) {
// console.log(res.message)
//ElMessage.error(res.message)
}
}
// 预览窗口提交测试
const previewForm = ref()
const previewSubmit = () => {
previewForm.value.validate((valid: boolean, fields: any) => {
if (valid) {
// alert('校验通过')
ElMessage.success('校验通过')
// console.log(fields)
} else {
// alert('校验不通过')
// console.log('error submit!', fields)
ElMessage.error('校验不通过')
return false
}
})
}
/**
@ 作者: 秦东
@ 时间: 2024-03-11 15:12:03
@ 功能: 获取表单内容
*/
const getInitData = () => {
if (formKeyVal.value) {
state.value.loading = true
getOneProductionForm({id: formKeyVal.value.toString()})
.then((res:any) => {
if(res.code == 0){
const result = res.data
console.log("初始设计搜索时--1--->",result)
// 初始设计搜索时res.data=''
if (result.mastesform) {
state.value.formData = stringToObj(result.mastesform)
}
console.log("初始设计搜索时",state.value.formData)
if(result.mastesformjson){
let kjdkjksd = string2json(result.mastesformjson)
console.log("初始设计搜索时-begin-->",state.value.formData.purview)
state.value.formData.purview=kjdkjksd.purview
console.log("初始设计搜索时--->",kjdkjksd)
}
state.value.formData.config.groupKey = result.groupKey
console.log("初始设计搜索时--end->",state.value.formData)
state.value.formDict = string2json(result.dict)
// 恢复表单名称
state.value.formOtherData.source = result.source
state.value.formOtherData.formName = result.name
state.value.formOtherData.formName = result.name
state.value.formData.form.name = result.tablekey
state.value.formData.form.formName = result.name
if (result.source && state.value.designType !== 'search') {
// 加载属性侧边栏的字段标识,搜索时不需要请求
formControlAttrEl.value.getFormFieldBySource(result.source)
}
if(result.flowIsOpen != 1){
emits('judgeFormIsEdit', false,false)
}else{
emits('judgeFormIsEdit', false,true)
}
}else{
ElMessage.error(res.msg || '加载异常')
}
state.value.loading = false
})
.finally(()=>{
haveCustomerFormVersion({id:state.value.formData.form.name})
.then(({data})=>{
versionCont.value = data
if(data.length > 0){
data.forEach((item:any) => {
if(item.status == 1){
versionId.value = item.id.toString()
emits('update:formVersion', item.id.toString())
}
});
}
})
})
.catch((res: any) => {
// console.log(res)
ElMessage.error(res.msg || '加载异常')
state.value.loading = false
})
}
}
onMounted(() => {
if (route.source) {
formControlAttrEl.value.getFormFieldBySource(route.source)
}
getInitData()
})
//监听版本变化
// watch(() =>versionId.value ,(val:string)=>{
// emits('update:formVersion', val)
<<<<<<< HEAD
// })
/**
@ 作者: 秦东
@ 时间: 2024-05-09 14:29:06
@ 功能: 根据启用版本进行加载页面
*/
const versionUpdateForm = (val:string) => {
console.log("加载异常-------111------->",val)
versionId.value = val
getInitData()
}
=======
// })
//liwenxuan 关联选项设置 修复bug:当字段标识改变时,关联选项设置的字段标识未同步更改 start
const formNameChanged = (param1: any)=>{
for(let i = 0; i < state.value.formData.list.length; i++){
if(state.value.formData.list[i].type=="radio"||state.value.formData.list[i].type=="select"||state.value.formData.list[i].type=="checkbox"){
if(state.value.formData.list[i].control.glxxsz!=undefined&&state.value.formData.list[i].control.glxxsz.length>0){
state.value.formData.list[i].control.glxxsz = []
state.value.formData.list[i].options.push({
label: '',
value: ''
})
state.value.formData.list[i].options.pop();
}
if(state.value.formData.list[i].control.glxxszForCheckBox!=undefined&&state.value.formData.list[i].control.glxxszForCheckBox.length>0){
state.value.formData.list[i].control.glxxszForCheckBox = []
}
}
}
ElMessage({
message: '因字段标识改变,本表单的所有单选、多选、下拉的关联选项设置已重置,请重新设置。',
type: 'warning',
})
}
//liwenxuan 关联选项设置 修复bug:当字段标识改变时,关联选项设置的字段标识未同步更改 end
let index = ref(0)
function refreshFunc(){
index.value = index.value+1
}
>>>>>>> lwx_v8
</script>
<template>
<div class="design_container">
<!-- <DragControl
v-model:versionid="versionId"
:formid="state.formOtherData.source"
:versioncont="versionCont"
@click-check="searchCheckField"
@click="selectTemplate"
@editversionstaus="editversionstaus"
/> -->
<DragControlNew
:table-key="state.formData.form.name"
@versionUpdateForm="versionUpdateForm"
/>
<div class="main-body">
<HeadTools v-loading="state.loading" :customerformid="formKeyVal" @click="headToolClick" />
<div v-loading="state.loading" class="main-form">
<div v-if="state.formData.list.length === 0" class="empty-tips">
从左侧拖拽来添加组件
</div>
<FormDesign
:type="5"
:form-data="state.formData"
:dict="state.formDict"
/>
</div>
</div>
<form-control-attr
ref="formControlAttrEl"
v-model:formOtherData="state.formOtherData"
:form-data="state.formData.form"
:form-config="state.formData.config"
:customerformid="formKeyVal"
:form-list="state.formData.list"
:form-info="state.formData"
@open-dialog="openAceEditDrawer"
@form-name-change="formNameChanged"
/>
<ace-drawer
v-model="drawer.visible"
:title="drawer.title"
:direction="drawer.direction"
:content="drawer.content"
:code-type="drawer.codeType"
@before-close="dialogCancel"
@confirm="dialogConfirm"
/>
<vue-file v-if="!['search'].includes(state.designType)" ref="vueFileEl" />
<el-drawer
v-model="state.previewVisible"
title="预览"
:append-to-body="true"
size="50%"
>
<form-design
v-if="state.previewVisible"
ref="previewForm"
:key="index"
:form-data="state.formDataPreview"
:dict="state.formDict"
:type="1"
@refresh="refreshFunc"
/>
<template #footer>
<div class="dialog-footer">
<el-button size="small" type="primary" @click="previewSubmit">
提交
</el-button>
<el-button size="small" @click="state.previewVisible = false">
取消
</el-button>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang='scss' scoped>
.design_container{
display: flex;
background-color: #FFFFFF;
}
</style>