Browse Source

Merge branch 'v7_master'

lwx_v7
超级管理员 2 years ago
parent
commit
9dcceddf5d
  1. 16
      node_modules/.package-lock.json
  2. 4
      node_modules/sortablejs/README.md
  3. 939
      node_modules/sortablejs/Sortable.js
  4. 4
      node_modules/sortablejs/Sortable.min.js
  5. 967
      node_modules/sortablejs/modular/sortable.complete.esm.js
  6. 968
      node_modules/sortablejs/modular/sortable.core.esm.js
  7. 967
      node_modules/sortablejs/modular/sortable.esm.js
  8. 4
      node_modules/sortablejs/package.json
  9. 17
      package-lock.json
  10. 1
      package.json
  11. 6
      src/api/DesignForm/fieldUnit.ts
  12. 30
      src/api/DesignForm/requestapi.ts
  13. 210
      src/api/DesignForm/tableButton.ts
  14. 20
      src/api/DesignForm/type.ts
  15. 2
      src/api/DesignForm/types.ts
  16. 75
      src/api/taskapi/management.ts
  17. 8
      src/assets/scss/form.css
  18. 2
      src/assets/scss/form.min.css
  19. 4
      src/assets/scss/form.scss
  20. 46
      src/components/DesignForm/public/form/form.vue
  21. 374
      src/components/DesignForm/tableListPage/formPageCont.vue
  22. 800
      src/components/DesignForm/tableListPage/index.vue
  23. 13
      src/store/DesignForm/designForm.ts
  24. 2
      src/types/components.d.ts
  25. 256
      src/utils/DesignForm/design.ts
  26. 2
      src/utils/workflow/const.ts
  27. 2
      src/views/sysworkflow/codepage/index.ts
  28. 110
      src/views/sysworkflow/lowcodepage/appFormList.vue
  29. 10
      src/views/sysworkflow/lowcodepage/index.vue
  30. 1
      src/views/sysworkflow/lowcodepage/lowCodeFormPage.vue
  31. 470
      src/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue
  32. 876
      src/views/sysworkflow/lowcodepage/pageList.vue
  33. 16
      src/views/sysworkflow/lowcodepage/pageListHeadTools.vue
  34. 52
      src/views/sysworkflow/lowcodepage/pageSetUpDialog/codePage.vue
  35. 117
      src/views/sysworkflow/lowcodepage/pageSetUpDialog/controlSetup.vue
  36. 77
      src/views/sysworkflow/lowcodepage/pageSetUpDialog/fieldSetUp.vue
  37. 14
      src/views/sysworkflow/lowcodepage/pageSetUpDialog/previewPage.vue
  38. 225
      src/views/sysworkflow/lowcodepage/pageSetUpDialog/searchField.vue
  39. 16
      src/views/taskplatform/taskmanagement/flowStep.vue
  40. 7
      src/views/taskplatform/taskmanagement/runFlowStep.vue
  41. 248
      src/views/taskplatform/taskmanagement/runFlowStep_20240411.vue
  42. 19
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

16
node_modules/.package-lock.json

@ -8156,9 +8156,9 @@
}
},
"node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
"version": "1.15.2",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz",
"integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA=="
},
"node_modules/source-map": {
"version": "0.6.1",
@ -10185,6 +10185,16 @@
"vue": "^3.2.31"
}
},
"node_modules/vuedraggable-es/node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/vuedraggable/node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",

4
node_modules/sortablejs/README.md

@ -54,12 +54,12 @@ Demo: http://sortablejs.github.io/Sortable/
Install with NPM:
```bash
$ npm install sortablejs --save
npm install sortablejs --save
```
Install with Bower:
```bash
$ bower install --save sortablejs
bower install --save sortablejs
```
Import into your project:

939
node_modules/sortablejs/Sortable.js

File diff suppressed because it is too large

4
node_modules/sortablejs/Sortable.min.js

File diff suppressed because one or more lines are too long

967
node_modules/sortablejs/modular/sortable.complete.esm.js

File diff suppressed because it is too large

968
node_modules/sortablejs/modular/sortable.core.esm.js

File diff suppressed because it is too large

967
node_modules/sortablejs/modular/sortable.esm.js

File diff suppressed because it is too large

4
node_modules/sortablejs/package.json

@ -1,7 +1,7 @@
{
"name": "sortablejs",
"exportName": "Sortable",
"version": "1.14.0",
"version": "1.15.2",
"devDependencies": {
"@babel/core": "^7.4.4",
"@babel/plugin-transform-object-assign": "^7.2.0",
@ -19,7 +19,7 @@
"main": "./Sortable.min.js",
"module": "modular/sortable.esm.js",
"scripts": {
"build:umd": "NODE_ENV=umd rollup -c ./scripts/umd-build.js",
"build:umd": "set NODE_ENV=umd&& rollup -c ./scripts/umd-build.js",
"build:umd:watch": "set NODE_ENV=umd&& rollup -w -c ./scripts/umd-build.js",
"build:es": "set NODE_ENV=es&& rollup -c ./scripts/esm-build.js",
"build:es:watch": "set NODE_ENV=es&& rollup -w -c ./scripts/esm-build.js",

17
package-lock.json

@ -30,6 +30,7 @@
"path-to-regexp": "^6.2.0",
"pinia": "^2.1.6",
"screenfull": "^6.0.0",
"sortablejs": "^1.15.2",
"spark-md5": "^3.0.2",
"tinymce": "^6.8.1",
"ts-md5": "^1.3.1",
@ -8565,9 +8566,9 @@
}
},
"node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
"version": "1.15.2",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz",
"integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA=="
},
"node_modules/source-map": {
"version": "0.6.1",
@ -10594,6 +10595,16 @@
"vue": "^3.2.31"
}
},
"node_modules/vuedraggable-es/node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/vuedraggable/node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",

1
package.json

@ -61,6 +61,7 @@
"path-to-regexp": "^6.2.0",
"pinia": "^2.1.6",
"screenfull": "^6.0.0",
"sortablejs": "^1.15.2",
"spark-md5": "^3.0.2",
"tinymce": "^6.8.1",
"ts-md5": "^1.3.1",

6
src/api/DesignForm/fieldUnit.ts

@ -0,0 +1,6 @@
export const inputUnit = ["input","varchar"]
export const timeUnit = ["time"]
export const orgUnit = ["org"]
export const choiceUnit = ["radio"]
export const switchUnit = ["switch"]
export const checkboxUnit = ["checkbox"]

30
src/api/DesignForm/requestapi.ts

@ -191,7 +191,8 @@ export function gainFlowPeople(data?: string[]){
//发起工作流
export function startRunFlow(data?:any){
return request({
url: '/systemapi/task_flow/startRunFlow',
url: '/systemapi/task_management/startRunWorkFlow',
// url: '/systemapi/task_flow/startRunFlow',
method: 'post',
data: data
});
@ -207,7 +208,8 @@ export function taskFlowList(data?:taskflowquery){
//获取正在执行得任务流程
export function gainRunTaskFlow(data?:customerFormLogo){
return request({
url: '/systemapi/task_flow/gainRunTaskFlow',
// url: '/systemapi/task_flow/gainRunTaskFlow',
url: '/systemapi/task_management/gainRunTaskWorkflow',
method: 'post',
data: data
});
@ -317,3 +319,27 @@ export function gainFormTableField(data?:any){
data: data
});
}
//编辑自定义表单列表数据
export function editCustomerFormList(data: any) {
return request({
url: '/systemapi/customer_form/editCustomerFormList',
method: 'post',
data: data
});
}
//获取表单列表数据
export function gainFormListCont(data: getContForId) {
return request({
url: '/systemapi/customer_form/gainFormListCont',
method: 'post',
data: data
});
}
//获取表单列表数据
export function gainFormPageListCont(data: any) {
return request({
url: '/systemapi/customer_form/gainFormPageListCont',
method: 'post',
data: data
});
}

210
src/api/DesignForm/tableButton.ts

@ -0,0 +1,210 @@
export interface tableButton {
id?: string;
name?: string;
field?: string;
type?: string;
attribute:string;
pattern?: string;
fieldClass?: string;
activeValue?: string;
inactiveValue?: string;
options?: optionsInfo[];
config?:any;
label?: string;
}
export interface optionsInfo {
label: string;
value: string;
}
export interface attrButton {
label: string;
key: string;
type: string;
size: string;
icon: string;
}
//表头操作
export const tableButtonList :attrButton[] = [
{
label: "新增",
key:"newAdd",
type:"primary",
size: "small",
icon: "editPen"
},
{
label: "批量删除",
key: "del",
type: "danger",
size: "small",
icon: "delete"
}
]
//记录操作
export const tableLogButtonList :attrButton[] = [
{
label: "查看",
key: "look",
type: "success",
size: "small",
icon: "view"
},
{
label: "编辑",
key: "edit",
type: "warning",
size: "small",
icon: "delete"
},
{
label: "删除",
key: "del",
type: "danger",
size: "small",
icon: "delete"
}
];
//记录操作
export const tableAttrLogButtonList :tableButton[] = [
{
// label: "多选",
// attribute:"checkbox"
id: "checkbox",
label: "多选",
field: "checkbox",
type: "selection",
attribute:"-",
pattern: "bigint",
fieldClass: "-",
activeValue: "",
inactiveValue: "",
options: []
},
{
id: "serialNumber",
label: "序号",
field: "index",
type: "index",
attribute:"-",
pattern: "bigint",
fieldClass: "-",
activeValue: "",
inactiveValue: "",
options: []
},
{
id: "operate",
label: "操作",
field: "operate",
type: "",
attribute:"-",
pattern: "bigint",
fieldClass: "__control",
activeValue: "",
inactiveValue: "",
options: []
}
];
//新增和编辑页面展开方式
export const diaOrDrawer = [
{
label:"抽屉",
value:"drawer"
},
{
label:"弹窗",
value:"dialog"
}
]
//表单结构
export interface FormPageList {
columns: tableButton[],
config: any,
controlBtn:tableButton[],
operateBtn:tableButton[]
}
export interface FormPageConfig{
pageSize:number,
searchIsShow:boolean,
searchFormIsShow:boolean,
openPageMode:string
}
export const submitButtonEs = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
textAlign: "center"
}
}
]
}
export const cancelButton = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
textAlign: "center"
}
}
]
}
export const submitAndCancelButton = {
type: "div",
control:{},
config:{
span: 24,
textAlign: "center"
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
span: 0
}
},
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
span: 0
}
}
]
};

20
src/api/DesignForm/type.ts

@ -199,6 +199,24 @@ export interface editFlowFormStatus{
//自定义列表字段
export interface formTableField{
masterTable:formTabelStruct[];
masterTable:tableButtonEs[];
sunTable?:any;
}
export interface tableButtonEs {
id?: string;
name?: string;
field?: string;
types?: string;
attribute:string;
pattern?: string;
fieldClass?: string;
activeValue?: string;
inactiveValue?: string;
options?: optionsInfo[];
config?:any;
}
export interface optionsInfo {
label: string;
value: string;
}

2
src/api/DesignForm/types.ts

@ -199,3 +199,5 @@ export interface CarsuselConfig {
imgUrl:string,
link:string
}

75
src/api/taskapi/management.ts

@ -74,3 +74,78 @@ export function generateFlow(data: nodeFlow):any{
data: data
});
}
//获取任务表单内容
export function gainTaskFormInfo(data: customerFormLogo):AxiosPromise<customerFormVersionCont> {
return request({
url: '/systemapi/task_management/gainTaskFormInfo',
method: 'post',
data: data
});
}
//获取工作流步进节点
export function softDeletion(data: any):any{
return request({
url: '/systemapi/task_management/softDeletion',
method: 'post',
data: data
});
}
//获取修改记录
export function gainEditDataLog(data: any):any{
return request({
url: '/systemapi/task_management/gainEditDataLog',
method: 'post',
data: data
});
}
//添加任务是回显表单数据,若有流程回显流程
export function echoTableFormPage(data: any):any{
return request({
url: '/systemapi/task_management/echoTableFormPage',
method: 'post',
data: data
});
}
//根据表单数据实时更新流程
export function realTimeUpdateFlow(data: any):any{
return request({
url: '/systemapi/task_management/realTimeUpdateFlow',
method: 'post',
data: data
});
}
//根据表单数据实时更新流程
export function draftsInitiateApproval(data?:any){
return request({
url: '/systemapi/task_management/draftsInitiateApproval',
method: 'post',
data: data
});
}
//根据表单数据实时更新流程
export function retractRunWorkFlow(data?:any){
return request({
url: '/systemapi/task_management/retractRunWorkFlow',
method: 'post',
data: data
});
}
//重新发起流程
export function afreshRunWorkflow(data?:any){
return request({
url: '/systemapi/task_management/afreshRunWorkflow',
method: 'post',
data: data
});
}
//提交审批结果
export function authorizeWorkflow(data?:any){
return request({
url: '/systemapi/task_management/authorizeWorkflow',
method: 'post',
data: data
});
}

8
src/assets/scss/form.css

@ -572,18 +572,10 @@
width: 23%;
}
.detail-form {
min-height: calc(100vh - 170px);
}
.detail-form > div {
height: 100%;
}
.detail-form > .drag {
min-height: calc(100vh - 170px) !important;
}
.detail-form .ghost {
background: #F56C6C;
border: 2px solid #F56C6C;

2
src/assets/scss/form.min.css

File diff suppressed because one or more lines are too long

4
src/assets/scss/form.scss

@ -194,9 +194,9 @@ $mainColor: #66b1ff;
.group {width: 23%}
}
}
.detail-form {min-height: calc(100vh - 170px);
.detail-form {
> div {height: 100%}
> .drag {min-height: calc(100vh - 170px) !important;}
// > .drag {min-height: calc(100vh - 170px) !important;}
.ghost {
background: #F56C6C;
border: 2px solid #F56C6C;

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

@ -325,7 +325,7 @@ const ruleForm = ref()
const validate = (callback: any) => {
ruleForm.value.validate((valid: boolean, fields: any) => {
console.log("ruleForm.value--->filter-->",ruleForm.value)
// console.log("ruleForm.value--->filter-->",ruleForm.value)
// console.log("getValue--->fields-->",fields)
// console.log("getValue--->valid-->",valid)
@ -412,9 +412,11 @@ provide(constFormBtnEvent, (obj: any) => {
break
case 'saveDraft': //稿
saveDraft() // 稿
// console.log("稿--------->saveDraft")
break
case "saveEditDraft": //稿
saveEditDraft()
// console.log("稿--------->saveEditDraft")
break
case 'afreshSubmit': //
afreshSubmit() //
@ -506,10 +508,12 @@ const getData = (params = {}) => {
requestUrl ="/systemapi/task_management/add_form_data"
break;
case "editFormContent":
requestUrl ="/systemapi/task_management/newcust_form_editdata"
// requestUrl ="/systemapi/task_management/newcust_form_editdata"
requestUrl ="/systemapi/task_management/add_customer_form"
break;
default:
}
loading.value = true
const newParams: any = params
// 使propsevents使使
@ -572,6 +576,8 @@ const submit = (params = {}) => {
let addUrl = props.formData.config?.addUrl || props.addUrl
let editUrl = props.formData.config?.editUrl || props.editUrl
let apiUrl = props.type === 1 ? addUrl : editUrl
console.log("新增、查看、保存数据",props.type,props.addUrl,props.editUrl)
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -588,14 +594,14 @@ const submit = (params = {}) => {
case "saveFormContent":
// apiUrl ="/systemapi/task_management/customer_form_adddata"
// apiUrl ="/systemapi/task_management/add_form_data"
apiUrl ="/systemapi/task_management/add_form_newdata"
// apiUrl ="/systemapi/task_management/add_form_newdata"
apiUrl ="/systemapi/task_management/add_customer_form"
break;
case "editFormContent":
apiUrl ="/systemapi/task_management/newcust_form_editdata"
apiUrl ="/systemapi/task_management/editCustomerTable"
break;
default:
}
validate((valid: boolean, fields: any) => {
if (valid) {
@ -622,19 +628,20 @@ const submit = (params = {}) => {
if (submitParams === false) {
return
}
console.log("beforeSubmit--->",beforeSubmit)
console.log("props.beforeSubmit--->",props.beforeSubmit)
// console.log("beforeSubmit--->",beforeSubmit)
// console.log("props.beforeSubmit--->",props.beforeSubmit)
// 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)
debugger
// debugger
//
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => {
console.log("formatParams--111->",res)
afterSubmit('success', res)
})
.catch(res => {
@ -724,7 +731,8 @@ onUnmounted(() => {
//
const afreshSubmit = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
let apiUrl ="/systemapi/task_management/editCustomerTable"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -793,7 +801,8 @@ const anewSubmit = (type: string, res: any) => {
//稿
const saveDraft = (params = {}) => {
let apiUrl ="/systemapi/task_management/add_form_newdata"
// let apiUrl ="/systemapi/task_management/add_form_newdata"
let apiUrl ="/systemapi/task_management/add_customer_form"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -860,7 +869,9 @@ const saveDraftPage = (type: string, res: any) => {
}
//稿
const saveEditDraft = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl ="/systemapi/task_management/add_customer_form"
let apiUrl ="/systemapi/task_management/editCustomerTable"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -929,7 +940,8 @@ const saveEditFormInfo = (type: string, res: any) => {
* 草稿提交审批
*/
const draftSubmit = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
let apiUrl ="/systemapi/task_management/editCustomerTable"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -999,7 +1011,8 @@ const sendDraftSubmit = (type: string, res: any) => {
* 申请修改
*/
const submitEditButton = (params = {}) => {
let apiUrl = "/systemapi/task_flow/editFormLogData"
// let apiUrl = "/systemapi/task_flow/editFormLogData"
let apiUrl = "/systemapi/task_management/applyForTableFormData"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -1100,6 +1113,7 @@ defineExpose({
<slot></slot>
</el-form>
</div>
</template>
<style lang='scss' scoped>

374
src/components/DesignForm/tableListPage/formPageCont.vue

@ -0,0 +1,374 @@
<!--
@ 作者: 秦东
@ 时间: 2024-04-03 13:39:16
@ 备注: 列表内容展示
-->
<script lang='ts' setup>
import { submitButton, afreshSubmitButton,editFormCont,draftSubmitButton,editLookFormCont } from "@/utils/workflow/const";
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { gainTaskFormInfo,generateFlow,gainEditDataLog,draftsInitiateApproval,afreshRunWorkflow } from '@/api/taskapi/management'
import { Close } from '@element-plus/icons-vue'
import { judgeSubmitCancel,startRunFlow } from '@/api/DesignForm/requestapi'
import { submitButtonEs } from '@/api/DesignForm/tableButton'
import RunFlowStep from '@/views/taskplatform/taskmanagement/runFlowStep.vue'
const props = defineProps({
isShow:{
type:Boolean,
default:false,
},
drawerWith:{
type:Number,
default:0
},
tablePageClass:{
type:Number,
default:1
},
operState:{
type:Number,
default:1
},
pageInfo:{
type:Object,
default(){
return {}
}
}
});
const formEl = ref<any>();
const emits = defineEmits(["update:isShow","getPageData"]);
const formLoading = ref(false);
const flowAry = ref<any[]>(); //
const currentProgress = ref<number>(1); //
const runstep = ref(null)
//ID
const openOfClose = computed({
get() {
return props.isShow
},
set(val: boolean) {
emits('update:isShow', val)
}
});
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:09:24
@ 功能: 监听状态变化处理数据
*/
watch(()=>props.isShow,(val:bool)=>{
if(val){
formLoading.value = true;
getCustomrrFormInfo();
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:25:15
@ 功能: 关闭抽屉
*/
const closeDrawer = () => {
emits('update:isShow', false)
}
//
const formState = reactive({
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: props.pageInfo.id,
id: 1,
loading: true
})
const pageLog = ref<any[]>([])
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:33:15
@ 功能: 获取自定义表单内容
*/
const getCustomrrFormInfo = () => {
gainTaskFormInfo({id:props.pageInfo.masters_key})
.then(({data})=>{
// console.log("",data,data.structure)
formState.formData = stringToObj(data.structure.mastesform)
// console.log("--->",formState)
formState.dict = string2json(data.structure.dict)
// formState.formData.list.push(editLookFormCont)
if(props.tablePageClass != 4){
judgeSubmitCancel({"name":data.structure.mastesformjson})
.then((data:any) =>{
if(data.code == 0){
if (data.data == 3 || data.data == 4){
// formState.formData.list.push(submitButtonEs)
if(props.operState == 2){
formState.formData.list.push(afreshSubmitButton)
}else if(props.operState == 3){
formState.formData.list.push(editFormCont)
}else if(props.operState == 4){
formState.formData.list.push(draftSubmitButton)
}else if(props.operState == 5){
formState.formData.list.push(submitButtonEs)
}
}
}
})
}
nextTick(()=>{
// console.log("-1111-->",data.tableData)
formEl.value.setValue(data.tableData)
})
})
.finally(()=>{
formLoading.value = false;
gainEditDataLog({id:props.pageInfo.masters_key})
.then(({data})=>{
console.log("获取修改记录-1111-->",data)
pageLog.value = data.logAry
});
})
}
/**
@ 作者: 秦东
@ 时间: 2024-04-07 10:55:34
@ 功能: 表单动作回调
*/
const afterSubmit = (type: string) => {
console.log("表单提交成功")
if (type === 'success') {
// router.go(-1)
// console.log("")
emits("getPageData");
closeDrawer();
}
}
const closeAppSubmit = () => {
closeDrawer()
}
//
const drawerBeforeClose = () => {
console.log("监听打开关闭",false)
// emits("getmytodolist")
// emits("update:isshow", false);
}
//
const sendDraftSubmit = (type: string,val?:any) => {
// console.log("",type,val)
// emits("getmytodolist")
if (type === 'success') {
if(props.pageInfo.flowIsOpen == 1){
let sendInfo ={
id:val.data.masterKey,
flowList:flowAry.value,
state:3
}
console.log("草稿提交审批--1-<",sendInfo)
draftsInitiateApproval(sendInfo)
.then((data:any) =>{
console.log("草稿提交审批---<",sendInfo,data)
if(data.code == 0){
ElMessage.success(data.msg || '提交成功!')
if(runstep.value){
runstep.value.gainRunFlowTask()
}
emits("getPageData");
closeDrawer()
}
})
}
}
}
//稿()
const saveEditFormInfo = (type: string,val?:any) => {
console.log("草稿提交审批--1-<",type,val)
if(type == "success"){
runstep.value.gainRunFlowTask()
emits("getPageData");
closeDrawer()
}
}
//
const anewSubmit = (type: string,val?:any) => {
if(type == "success"){
afreshRunWorkflow({id:val.data.flowkeys})
.then((data:any) => {
console.log("重新提交数据---<",data,runstep.value)
runstep.value.gainRunFlowTask()
})
.finally(() => {
emits("getPageData");
closeDrawer()
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-11 11:35:24
@ 功能: 申请修改
*/
//
const submitEdit = (type: string,val?:any) => {
// console("----->",type,val)
if(type == "success"){
runstep.value.gainRunFlowTask()
emits("getPageData");
closeDrawer()
}
}
</script>
<template>
<el-drawer
v-model="openOfClose"
title="查看表单内容"
:size="drawerWith"
:with-header="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
>
<div v-if="props.pageInfo.flowIsOpen==1" class="common-layout">
<el-container>
<el-main>
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="formState.formData"
:type="props.tablePageClass"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:close-app-submit="closeDrawer"
:change-key-val="changeKeyVal"
:anew-submit = "anewSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit= "sendDraftSubmit"
:after-submit="afterSubmit"
:submit-edit="submitEdit"
/>
<el-divider v-if="pageLog&&pageLog.length > 0" content-position="left">历史记录</el-divider>
<el-timeline style="width: 100%">
<el-timeline-item v-for="(item,index) in pageLog" :key="index" :timestamp="item.time+' 操作人:'+item.creater" placement="top">
<el-card>
<el-descriptions border>
<el-descriptions-item v-for="(mastItem,mastIndex) in item.masterdata" :key="mastIndex" :label="mastIndex">
{{mastItem}}
</el-descriptions-item>
</el-descriptions>
<el-tabs v-if="item.sunList" type="border-card" style="margin-top:20px;">
<el-tab-pane v-for="(sonItem,sonIndex) in item.sunList" :label="sonIndex" :key="sonIndex">
<el-descriptions v-for="(sonVal,sonIndex) in sonItem" :key="sonIndex" border>
<el-descriptions-item v-for="(sonCentor,sonKey) in sonVal" :key="sonKey" :label="sonKey"> {{sonCentor}}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</el-card>
</el-timeline-item>
</el-timeline>
</el-main>
<el-aside width="350px" class="flowBox">
<el-header height="30px">
<div class="workFlowHead">
<el-text>审批流程</el-text>
<el-icon @click="closeDrawer"><Close /></el-icon>
</div>
</el-header>
<el-scrollbar class="scorllbarBox">
<RunFlowStep ref="runstep" v-model:flowary="flowAry" :flow-key="props.pageInfo.masters_key" :current-progress="currentProgress" @updatelist="drawerBeforeClose" />
</el-scrollbar>
</el-aside>
</el-container>
</div>
<div v-else class="common-layout">
<el-header height="30px">
<el-icon @click="closeDrawer"><Close /></el-icon>
</el-header>
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="formState.formData"
:type="props.tablePageClass"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:close-app-submit="closeDrawer"
:change-key-val="changeKeyVal"
:anew-submit = "anewSubmit"
:after-submit="afterSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit= "sendDraftSubmit"
:submit-edit="submitEdit"
/>
<el-divider v-if="pageLog&&pageLog.length > 0" content-position="left">历史记录</el-divider>
<el-timeline style="width: 100%">
<el-timeline-item v-for="(item,index) in pageLog" :key="index" :timestamp="item.time+' 操作人:'+item.creater" placement="top">
<el-card>
<el-descriptions border>
<el-descriptions-item v-for="(mastItem,mastIndex) in item.masterdata" :key="mastIndex" :label="mastIndex">
{{mastItem}}
</el-descriptions-item>
</el-descriptions>
<el-tabs v-if="item.sunList" type="border-card" style="margin-top:20px;">
<el-tab-pane v-for="(sonItem,sonIndex) in item.sunList" :label="sonIndex" :key="sonIndex">
<el-descriptions v-for="(sonVal,sonIndex) in sonItem" :key="sonIndex" border>
<el-descriptions-item v-for="(sonCentor,sonKey) in sonVal" :key="sonKey" :label="sonKey"> {{sonCentor}}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.common-layout{
height: 100vh;
padding: 0 15px;
.el-main{
height: 100vh;
padding:0;
}
.flowBox{
height: 100vh;
border-left: 1px solid #ccc;
.scorllbarBox{
height: calc(100vh - 35px)
}
.workFlowHead{
display: flex;
align-items: center;
justify-content: space-between;
}
}
.el-header{
padding:0 10px;
line-height:30px;
text-align:right;
font-size:20px;
i{
cursor:pointer;
}
}
}
</style>

800
src/components/DesignForm/tableListPage/index.vue

@ -0,0 +1,800 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-29 14:21:27
@ 备注: 自定义表单通用列表
-->
<script lang='ts' setup>
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'
import { useDesignFormStore } from '@/store/DesignForm/designForm'
import { attrButton,FormPageList,FormPageConfig } from '@/api/DesignForm/tableButton'
import { inputUnit,timeUnit,choiceUnit,switchUnit,orgUnit,checkboxUnit } from '@/api/DesignForm/fieldUnit'
import type { FormInstance, FormRules,ElNotification } from 'element-plus'
import { gainFormPageListCont } from '@/api/DesignForm/requestapi'
import { Picture,InfoFilled,QuestionFilled } from '@element-plus/icons-vue'
import { softDeletion,retractRunWorkFlow } from '@/api/taskapi/management'
//
import FormPageCont from '@/components/DesignForm/tableListPage/formPageCont.vue'
const props = withDefaults(
defineProps<{
data: FormPageList
searchData?: attrButton[]
config:FormPageConfig
formId?:string
beforeRequest?: (params: any, rout: any) => any
afterResponse?: (result: any) => any | string
beforeDelete?: (params: any, route: any) => any
showPage?: boolean
requestUrl?: string // api
deleteUrl?: string // api
dict?: { [key: string | number]: string | number }
fixedBottomScroll?: boolean
query?: { [key: string]: any } //
autoLoad?: boolean //
delKey?: string //
lookPageIsShow?:boolean
}>(),
{
showPage: true,
data: () => {
return { columns: [],controlBtn:[],operateBtn:[],config:{} }
},
searchData: () => {
return []
},
config:() =>{
return {}
},
dict: () => {
return {}
},
formId:() =>{
return ""
},
fixedBottomScroll: true,
autoLoad: true,
delKey: 'id',
query: () => {
return {}
},
lookPageIsShow:() => {
return false
}
}
)
const emits = defineEmits<{
(e: 'selectionChange', row: any): void
(e: 'btnClick', btn: any, row?: any): void //
}>()
const operState = ref<number>(1) // 1234;5:
const idList = ref<string[]>([])
const designStore = useDesignFormStore()
const route = useRoute()
const router = useRouter()
const tableDataList = ref([]) //
const state = reactive({
loading: false,
currentPage: 1,
pageSize: props.config?.pageSize || 2,
total: 0,
selectionChecked: [],
dict: {}, //
searchFormDown: false,
treeValue: {}, //
tableScrollMargin: 0,
columnsCheck: designStore.getColumnsCheck(route.path),
currentNodeKey: ''
})
/**
@ 作者: 秦东
@ 时间: 2024-03-28 16:03:12
@ 功能: 判断类型
*/
const unitIsShow = (val:tableButton,unitName:string) => {
// val.pattern
switch (val.fieldClass) {
case "id": //
return inputUnit.includes(unitName);
break;
case "masters_key": //
return inputUnit.includes(unitName);
break;
case "creater": //
return inputUnit.includes(unitName);
break;
case "creater_time": //
return timeUnit.includes(unitName);
break;
case "edit_time": //
return timeUnit.includes(unitName);
break;
case "flow_id": //
return inputUnit.includes(unitName);
break;
case "baidumap": //
return inputUnit.includes(unitName);
break;
case "input": //
return inputUnit.includes(unitName);
break;
case "radio": //
return choiceUnit.includes(unitName);
break;
case "switch": //
return switchUnit.includes(unitName);
break;
case "orgCentent": //
return orgUnit.includes(unitName);
break;
case "varchar": //
return inputUnit.includes(unitName);
break;
case "checkbox":
return checkboxUnit.includes(unitName);
break;
default:
return inputUnit.includes(unitName);
break;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-28 13:17:46
@ 功能: 重置表单
*/
const ruleSearchForm = ref()
const resetFields = (formEl: FormInstance | undefined) => {
// formEl.resetFields()
// console.log("formEl",formEl,formEl.resetFields())
// if (!formEl) return
// formEl.resetFields()
if(props.searchData && props.searchData.length > 0){
props.searchData.forEach((item:any)=>{
item.value="";
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-01 11:36:07
@ 功能: 功能按钮动作
*/
const setUpClick = (val:string,id:string) =>{
console.log("功能按钮动作",val)
}
/**
@ 作者: 秦东
@ 时间: 2024-04-01 13:30:06
@ 功能: 表格选择操作
*/
const selectionChange = (row: any) => {
state.selectionChecked = row
emits('selectionChange', row)
}
/**
@ 作者: 秦东
@ 时间: 2024-04-01 13:31:37
@ 功能: 获取表格头内容
*/
const columnsFilter = computed(() => {
if (!state.columnsCheck?.length) {
return props.data.columns
} else {
return props.data.columns.filter((item: any) => {
return state.columnsCheck.includes(item.prop || item.type)
})
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-01 14:14:36
@ 功能: 翻页操作
*/
const handleSizeChange = (page: number) => {
console.log("翻页操作",page)
state.pageSize = page
getListData(1)
}
const handleCurrentChange = (page: number) => {
getListData(page)
}
/**
@ 作者: 秦东
@ 时间: 2024-04-01 14:15:16
@ 功能: 获取数据
*/
//
const getListData = (page?: number) => {
if (page) {
state.currentPage = page
}
getPageData()
}
watch(()=>props.lookPageIsShow,(val:boolean)=>{
if(val && props.formId != ""){
getPageData()
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-01 15:51:32
@ 功能: 获取数据
*/
const getPageData = () => {
state.loading = true;
let sendData = {
formId:props.formId,
page:state.currentPage,
pagesize:state.pageSize,
searchData:json2string(props.searchData)
}
console.log("获取列表详细信息",sendData)
gainFormPageListCont(sendData)
.then((data)=>{
console.log("获取列表详细信息----------------->",data)
tableDataList.value = data.data.list
state.total = data.data.total
state.loading = false;
})
}
onMounted(()=>{
getPageData()
})
/**
@ 作者: 秦东
@ 时间: 2024-04-02 13:59:21
@ 功能: 判断单选值
*/
const judjeRadio = (val: any, options: any[]) => {
// console.log("",val, options)
if(options.length > 0){
options.forEach((item)=>{
if(item.value == val){
console.log("判断单选值",val, item.value,item.label)
val = item.label
}
})
}
if(val == 0 || val == "0"){
val = ""
}
return val
}
/**
@ 作者: 秦东
@ 时间: 2024-04-02 14:49:40
@ 功能: 判断开关类型
*/
const judjeSwitch = (val:any,yesVal:any) => {
if(val == yesVal) return true;
return false;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-03 13:13:56
@ 功能: 列表信息删除信息
*/
const confirmEvent = (val:any) => {
let sendData = {
id:[val.masters_key],
isTrue:2
}
softDeletion(sendData)
.then((data)=>{
console.log('cancel!',data)
ElNotification({
title: '温馨提示!',
message: data.mag,
type: 'success',
})
getPageData()
})
}
const cancelEvent = (val:any) => {
console.log('cancel!',val)
}
const container = ref() //
const drawerWith = ref(); //
/**
@ 作者: 秦东
@ 时间: 2024-04-03 13:24:06
@ 功能: 查看详细内容
*/
const tablePageClass = ref(1)
const lookPageInfoIsShow = ref(false)
const pageInfoCont = ref<any>()
const lookPageInfo = (val:any) => {
tablePageClass.value = 4;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-05 11:29:50
@ 功能: 编辑表单内容
*/
const editInfo = (val:any) => {
console.log('修改数据!',val)
operState.value = 5;
tablePageClass.value = 2;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-10 15:32:55
@ 功能: 提交审批
*/
const submitApproval = (val:any) => {
operState.value = 4
tablePageClass.value = 2;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-11 09:36:59
@ 功能: 撤回申请
*/
const withdrawApplication = (val:any) => {
// console.log("", val);
let sendInfo = {
id: val.masters_key,
}
retractRunWorkFlow(sendInfo)
.then((data)=>{
ElMessage({
message: '撤回成功!',
type: 'success'
})
getPageData()
})
}
/**
@ 作者: 秦东
@ 时间: 2024-04-11 11:17:42
@ 功能: 重新提交申请
*/
const afreshSendFlow = (val:any) => {
operState.value = 2
tablePageClass.value = 2;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-11 11:19:21
@ 功能: 申请修改数据
*/
const editFormSendFlow = (val:any) => {
operState.value = 3
tablePageClass.value = 2;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
</script>
<template>
<div ref="container" v-loading="state.loading" class="table-list-comm">
<el-row class="rowBox">
<el-col :span="24">
<el-form v-if="config.searchIsShow" ref="ruleSearchForm" class="seacherForm">
<template v-for="(item, index) in searchData" :key="index">
<div class="group group-input">
<el-form-item :label="item.label" class="form_cont">
<el-input
v-model="item.value"
:placeholder="'请输入'+item.label"
clearable
v-if="unitIsShow(item,'input')"
/>
<el-date-picker
v-model="item.value"
type="datetime"
:placeholder="'请选择'+item.label"
:shortcuts="shortcuts"
v-if="unitIsShow(item,'time')"
/>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'radio')"
>
<el-option
v-for="itemOpt in item.options"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'switch')"
>
<el-option
:key="item.activeValue"
label="是"
:value="item.activeValue"
/>
<el-option
:key="item.inactiveValue"
label="否"
:value="item.inactiveValue"
/>
</el-select>
<el-select
v-model="item.value"
multiple
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'checkbox')"
>
<el-option
v-for="itemOpt in item.options"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'org')"
>
</el-select>
</el-form-item>
</div>
</template>
<div class="group group-btn" v-if="searchData.length">
<el-button type="primary" @click="getPageData"><el-icon><Search /></el-icon></el-button>
<el-button @click="resetFields(ruleSearchForm)"><el-icon><Refresh /></el-icon></el-button>
</div>
</el-form>
</el-col>
<el-col :span="24">
<div class="operateButArea">
<div class="operatLeft">
<el-text v-if="data.controlBtn.length === 0" class="mx-1 tipBox" type="info">操作按钮区域</el-text>
<el-button
v-for="item in data.controlBtn"
v-bind="item"
:key="item.type"
@click="setUpClick(item)"
>
{{ item.label }}
</el-button>
</div>
<div>
<el-tooltip
v-if="config.searchFormIsShow"
class="box-item"
effect="dark"
content="折叠查询表单"
placement="bottom"
>
<el-icon @click="config.searchIsShow=!config.searchIsShow"><Search /></el-icon>
</el-tooltip>
</div>
</div>
</el-col>
<el-col :span="24">
<el-table
v-bind="data.tableProps"
ref="table"
:data="tableDataList"
@selection-change="selectionChange"
table-layout="fixed"
>
<template
v-for="item in columnsFilter"
:key="item.id || item.label"
>
<el-table-column v-if="['-'].includes(item.fieldClass)" :type="item.type" :prop="item.field" :label="item.label" config="" width="60">
<template v-if="item.help" #header="scope">
{{ scope.column.label }}
<tooltip :content="item.help" />
</template>
</el-table-column>
<el-table-column v-else-if="item.fieldClass=='__control'" :prop="item.field" :label="item.label" config="">
<template #default="scope">
<el-button-group>
<el-tooltip
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==1"
class="box-item"
effect="dark"
content="提交审批"
placement="top-end"
>
<el-button type="success" size="small" class="fa fa-send-o" @click="submitApproval(scope.row)" />
</el-tooltip>
<el-tooltip
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==2"
class="box-item"
effect="dark"
content="重新申请"
placement="top-end"
>
<el-button type="warning" size="small" class="fa fa-retweet" @click="afreshSendFlow(scope.row)" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="查看详情"
placement="top-end"
>
<el-button @click="lookPageInfo(scope.row)" type="primary" size="small" class="fa fa-eye" />
</el-tooltip>
<el-popconfirm
v-if="scope.row.flowIsOpen==1&&scope.row.isRetract"
confirm-button-text="确定"
cancel-button-text="取消"
:icon="QuestionFilled"
icon-color="#F56C6C"
title="您确定要撤回此次申请?一经撤回!需要此流程重新提交申请!"
@confirm="withdrawApplication (scope.row)"
@cancel="cancelEvent(scope.row)"
>
<template #reference>
<el-button size="small" class="fa fa-reply-all" />
</template>
</el-popconfirm>
<el-tooltip
v-if="scope.row.flowIsOpen==2"
class="box-item"
effect="dark"
content="编辑"
placement="top-end"
>
<el-button @click="editInfo(scope.row)" type="info" size="small" class="fa fa-edit" />
</el-tooltip>
<el-popconfirm
v-if="scope.row.taskStatus==2||scope.row.taskStatus==1"
confirm-button-text="确定"
cancel-button-text="取消"
:icon="QuestionFilled"
icon-color="#F56C6C"
title="您确定要删除此条记录?一经删除!数据将不可恢复!"
@confirm="confirmEvent(scope.row)"
@cancel="cancelEvent(scope.row)"
>
<template #reference>
<el-button type="danger" size="small" class="fa fa-trash-o" />
</template>
</el-popconfirm>
<el-tooltip
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==4"
class="box-item"
effect="dark"
content="申请修改"
placement="top-end"
>
<el-button type="info" size="small" class="fa fa-edit" @click="editFormSendFlow(scope.row)" />
</el-tooltip>
</el-button-group>
</template>
</el-table-column>
<el-table-column v-else :prop="item.field" :label="item.label" config="">
<template v-if="item.help" #header="scope">
{{ scope.column.label }}
<tooltip :content="item.help" />
</template>
<template v-if="item.fieldClass=='radio'" #default="scope">
<!-- {{scope.row[scope.column.property]}}{{item}} -->
{{ judjeRadio(scope.row[scope.column.property],item.options) }}
</template>
<template v-if="item.fieldClass=='upload'" #default="scope" >
<div class="demo-image__error">
<el-image
style="width: 50px; height: 50px"
:src="scope.row[scope.column.property]"
>
<template #error>
<div class="image-slot">
<el-icon><Picture /></el-icon>
</div>
</template>
</el-image>
</div>
</template>
<template v-if="item.fieldClass=='switch'" #default="scope">
<el-tag
v-if="judjeSwitch(scope.row[scope.column.property],item.activeValue)"
type="success"
effect="light"
>
启用
</el-tag>
<el-tag
v-else
type="danger"
effect="light"
>
禁用
</el-tag>
</template>
<template v-if="item.fieldClass=='baidumap'" #default="scope">
{{scope.row[scope.column.property]}}
</template>
</el-table-column>
</template>
</el-table>
</el-col>
<el-col v-if="state.total > 0" :span="24">
<div class="pageBox">
<el-pagination
v-model:currentPage="state.currentPage"
v-model:page-size="state.pageSize"
:page-sizes="[20, 30, 40, 50] as any"
:total="state.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</el-col>
<el-col :span="24" style="display:none">
{{ tableDataList}}
</el-col>
<el-col :span="24" style="display:none">
<el-button-group>
<el-tooltip
class="box-item"
effect="dark"
content="提交审批"
placement="top-end"
>
<el-button type="success" size="small" class="fa fa-send-o" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="重新申请"
placement="top-end"
>
<el-button type="warning" size="small" class="fa fa-retweet" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="查看详情"
placement="top-end"
>
<el-button type="primary" size="small" class="fa fa-eye" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="撤回"
placement="top-end"
>
<el-button size="small" class="fa fa-reply-all" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="删除"
placement="top-end"
>
<el-button type="danger" size="small" class="fa fa-trash-o" />
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="申请修改"
placement="top-end"
>
<el-button type="info" size="small" class="fa fa-edit" />
</el-tooltip>
</el-button-group>
</el-col>
</el-row>
<FormPageCont v-model:is-show="lookPageInfoIsShow" :drawer-with="drawerWith" :page-info="pageInfoCont" :table-page-class="tablePageClass" :oper-state="operState" @getPageData="getPageData" />
</div>
</template>
<style lang='scss' scoped>
.rowBox{
width:100%;
}
.table-list-comm{
padding:0px 15px 15px 15px;
}
.seacherForm{
min-height: auto;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
}
.pageBox{
width:100%;
margin-top:20px;
text-align: center;
display: flex;
justify-content: center;
}
.operateButArea{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top:15px;
.operatLeft{
padding-bottom: 2px;
}
}
.group{
width: auto;
margin-right: 10px;
}
.demo-image__error .block {
padding: 0px 0;
text-align: center;
border-right: solid 1px var(--el-border-color);
display: inline-block;
width: 100%;
box-sizing: border-box;
vertical-align: top;
}
.demo-image__error .demonstration {
display: block;
color: var(--el-text-color-secondary);
font-size: 14px;
margin-bottom: 20px;
}
.demo-image__error .el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.demo-image__error .image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
.demo-image__error .image-slot .el-icon {
font-size: 30px;
}
</style>

13
src/store/DesignForm/designForm.ts

@ -1,10 +1,12 @@
import { defineStore } from 'pinia'
import { getStorage, setStorage } from '@/utils/lowCodeForm'
export const useDesignFormStore = defineStore('designForm', {
state: () => {
return {
controlAttr: {},
activeKey: ''
activeKey: '',
columnsCheck: getStorage('tableColumns', true) || [], // 表格勾选的列
//type: 1, //当前表单状态 1新增;2查看(表单模式) ;3查看; 4设计
//isEdit: false, //编辑状态,type=1新增模式下有编辑状态,主要用于控制编辑模式下某些字段的禁用状态,即可新增但不能修改
//model: {}, // 给form-group提供联动条件设置
@ -17,6 +19,13 @@ export const useDesignFormStore = defineStore('designForm', {
},
setActiveKey(key: string) {
this.activeKey = key
}
},
setColumnsCheck(path: string, data: string[]) {
this.columnsCheck[path] = data
setStorage('tableColumns', this.columnsCheck, 0)
},
getColumnsCheck(path: string) {
return this.columnsCheck[path] || []
},
}
})

2
src/types/components.d.ts

@ -100,6 +100,7 @@ declare module '@vue/runtime-core' {
FormGroup: typeof import('./../components/DesignForm/public/form/formGroup.vue')['default']
FormGroup1: typeof import('./../components/DesignForm/public/form/formGroup1.vue')['default']
FormItem: typeof import('./../components/DesignForm/public/form/formItem.vue')['default']
FormPageCont: typeof import('./../components/DesignForm/tableListPage/formPageCont.vue')['default']
FormWord: typeof import('./../components/workflow/dialog/formWord.vue')['default']
GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
@ -133,6 +134,7 @@ declare module '@vue/runtime-core' {
SingleUpload: typeof import('./../components/Upload/SingleUpload.vue')['default']
SizeSelect: typeof import('./../components/SizeSelect/index.vue')['default']
SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
TableListPage: typeof import('./../components/DesignForm/tableListPage/index.vue')['default']
Template: typeof import('./../components/DesignForm/template.vue')['default']
TextPage: typeof import('./../components/DesignForm/designLayout/textPage.vue')['default']
Tinymce: typeof import('./../components/DesignForm/public/form/tinymce.vue')['default']

256
src/utils/DesignForm/design.ts

@ -0,0 +1,256 @@
import jsBeautify from 'js-beautify'
import SparkMD5 from 'spark-md5'
export const EDITTYPE: string = 'javascript' // 弹出编辑器可输入类型 json/javascript
/**
* Function
* @param fn
*/
function evil(fn: any) {
return new Function('return ' + fn)()
}
/**
*
* @param o
*/
function obj2string(o: any) {
let r: any = []
if (o === null) {
// 这里有个问题 因typeOf null=object,下面判断会报错
return null
}
if (typeof o === 'string') {
return (
'"' +
o
.replace(/([\\'\\"\\])/g, '\\$1')
.replace(/(\n)/g, '\\n')
.replace(/(\r)/g, '\\r')
.replace(/(\t)/g, '\\t') +
'"'
)
}
if (typeof o === 'object') {
if (!o.sort) {
for (const i in o) {
let iii: string = i
if (i.indexOf('-') !== -1) {
iii = `"${i}"`
}
//r.push(iii + ':' + obj2string(o[i]))
r.push(`${iii}:${obj2string(o[i])}`)
}
if (
!!document.all &&
!/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(
o.toString
)
) {
//r.push('toString:' + o.toString.toString())
r.push(`toString:${o.toString.toString()}`)
}
// r = '{' + r.join() + '}'
r = `{${r.join()}}`
} else {
for (let i: number = 0; i < o.length; i++) {
r.push(obj2string(o[i]))
}
// r = '[' + r.join() + ']'
r = `[${r.join()}]`
}
return r
}
return o && o.toString()
}
/**
*
* @param obj
* @param isBeautify
*/
export function objToStringify(obj: any, isBeautify?: boolean) {
if (EDITTYPE === 'javascript') {
if (isBeautify) {
return jsBeautify('opt=' + obj2string(obj), {
indent_size: 2,
brace_style: 'expand'
})
} else {
return obj2string(obj)
}
} else {
return isBeautify ? JSON.stringify(obj, null, 2) : JSON.stringify(obj)
}
}
/**
*
* @param string
*/
export function stringToObj(string: string) {
if (EDITTYPE === 'javascript') {
return evil(string)
} else {
return JSON.parse(string)
}
}
export function string2json(string: string) {
return JSON.parse(string || '{}')
}
export function json2string(obj: any, isBeautify?: boolean) {
return isBeautify ? JSON.stringify(obj, null, 2) : JSON.stringify(obj)
}
// ace编辑器相关
/**
* aceEdit编辑器相关配置
* @param data
* @param id
* @param type
*/
export const aceEdit = (data: any, id?: string, type?: string) => {
type = type ? type : 'javascript'
id = id ? id : 'editJson'
// @ts-ignore
const editor = ace.edit(id)
editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true
})
editor.setFontSize(14)
editor.setShowPrintMargin(false)
editor.session.setMode('ace/mode/' + type)
editor.setTheme('ace/theme/tomorrow_night')
editor.setValue(data)
return editor
}
/**
*
* @param val
*/
export const formatNumber = (val: any): number | undefined => {
// 将字符类数字转为数值类
if (typeof val === 'string' && /^\d+(\.\d+)?$/.test(val.toString())) {
// 为数字
return Number(val)
} else {
return val
}
}
/**
*
* @param val
*/
export const formatToString = (val: any): string | undefined => {
if (val !== undefined) {
return val.toString()
} else {
return val
}
}
/**
* {key:value}[{label:'key',value:'value'}]
* @param obj
*/
export const objectToArray = (obj: any): { [key: string]: any } => {
if (Object.prototype.toString.call(obj) === '[object Object]') {
const temp: any = []
for (const key in obj) {
temp.push({
label: obj[key],
value: key
})
}
return temp
}
return obj
}
/****
* css
* @param id id
* @param cssContent css内容
* @param append true插入false移除
*/
export const appendOrRemoveStyle = (
id: string,
cssContent: string,
append?: boolean
): void => {
const styleId: any = document.getElementById(id)
if (styleId && append) {
// 存在时直接修改,不用多次插入
styleId.innerText = cssContent
return
}
if (cssContent && append) {
const styleEl = document.createElement('style')
styleEl.id = id
styleEl.type = 'text/css'
styleEl.appendChild(document.createTextNode(cssContent))
document.head.appendChild(styleEl)
}
if (!append || !cssContent) {
// 移除
styleId && styleId.parentNode.removeChild(styleId)
}
}
/**
*
* @param item
* @param index //type=grid下初始时item都是一样的
*/
export const getGroupName = (item: any, index?: number): string => {
if (item.name) {
return item.name
} else {
const spark = new SparkMD5()
spark.append(JSON.stringify(item) + index)
return spark.end()
}
}
/**
*
*/
export const jsonParseStringify = (val: any) => {
if (typeof val === 'object') {
return JSON.parse(JSON.stringify(val))
} else {
return val
}
}
/**
*
*/
export const beforeRequest: string =
'opt=(data, route) => {\n' +
' // data经过处理后返回\n' +
" console.log('beforeRequest',data)\n" +
' return data\n' +
'}'
export const afterResponse: string =
'opt=(res) => {\n' +
' // res返回数据\n' +
" console.log('afterResponse',res)\n" +
' return res\n' +
'}'
export const onChange: string =
'opt=(key,model) => {\n' +
' // name当前改变组件的值,model表单的值\n' +
" console.log('onChange',key)\n" +
' return model\n' +
'}'
// provide 方法定义的key
const prefix: string = 'AK'
export const constControlChange: string = prefix + 'ControlChange' // 表单组件改变事件
export const constSetFormOptions: string = prefix + 'SetFormOptions' // 使用setOptions设置下拉值
export const constGetControlByName: string = prefix + 'GetControlByName' // 根据name从formData.list查找数据
export const constFormBtnEvent: string = prefix + 'FormBtnEvent' // 按钮组件事件
export const constFormProps: string = prefix + 'FormProps' // 按钮组件事件

2
src/utils/workflow/const.ts

@ -314,7 +314,7 @@ export let draftSubmitButton = {
type: "button",
iconFont: "fa-square-o",
control:{
label: "确认提交2",
label: "确认提交",
type: "primary",
key: "draftSubmit"
},

2
src/views/sysworkflow/codepage/index.ts

@ -2,10 +2,12 @@ import formDesign from '@/components/DesignForm/public/form/form.vue'
import tableList from '@/components/DesignForm/public/form/components/list.vue'
import flow from '@/components/DesignForm/public/form/components/flow.vue'
import Screen from '@/components/DesignForm/public/form/components/screen.vue'
import akPageList from '@/components/DesignForm/tableListPage/index.vue'
export default (app: any) => {
app.component('AkForm', formDesign)
app.component('AkList', tableList)
app.component('AkFlow', flow)
app.component('AkScreen', Screen)
app.component('AkPageList', akPageList)
}

110
src/views/sysworkflow/lowcodepage/appFormList.vue

@ -7,10 +7,11 @@
import { customerFormCont } from "@/api/DesignForm/type";
import { getCustomerFormList,editProductionFormStatus } from '@/api/DesignForm/requestapi'
import {Delete,Edit,View,MoreFilled} from '@element-plus/icons-vue'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
//
import LowCodeFormPage from "@/views/sysworkflow/lowcodepage/lowCodeFormPage.vue"
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerformnew.vue'
import TableFlow from '@/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue'
const props = defineProps({
groupId:{
@ -27,7 +28,7 @@ const props = defineProps({
}
});
const emits = defineEmits(["update:formKey"]);
const emits = defineEmits(["update:formKey","getRongQiAttr"]);
//ID
const formKeyStr = computed({
@ -49,6 +50,8 @@ const pageApp = ref<number>(1) //页码
const pageAppSize = ref<number>(12) //
const pageAppTotal = ref<number>(0) //
const contList = ref<customerFormCont[]>()
const lookPageIsShow = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-03-21 10:54:23
@ -74,6 +77,7 @@ const getFormAppList = () => {
@ 功能: 创建表单任务
*/
const startUsing = (id:string,title:string) => {
emits('getRongQiAttr')
versionId.value = id
versionTitle.value = title
openTaskDrawer.value = true
@ -84,6 +88,7 @@ const startUsing = (id:string,title:string) => {
@ 功能: 编辑表单
*/
const editFormApp = (id:string) => {
emits('getRongQiAttr')
formId.value = id.toString()
addFormIsShow.value= true
console.log("编辑表单",id,"-",formId.value,"-",addFormIsShow.value)
@ -127,6 +132,71 @@ const refreshPage = (pageType:string) =>{
onMounted(()=>{
getFormAppList()
})
/**
@ 作者: 秦东
@ 时间: 2024-04-01 14:32:18
@ 功能: 查看表单列表
*/
const lookFormList = (val:any) => {
emits('getRongQiAttr')
console.log("查看表单列表", val)
lookPageIsShow.value = true
state.formId = val.idStr
let stateData = string2json(val.listjson)
console.log("查看表单列表---->",stateData)
state.tableData = stateData.tableData
state.searchData = stateData.searchData
state.loading = stateData.loading
state.attrObj = stateData.attrObj
state.config = stateData.config
state.tagList = stateData.tagList
state.formList = stateData.formList
state.name = stateData.name
state.treeData = stateData.treeData
state.previewVisible = stateData.previewVisible
state.formFieldList = stateData.formFieldList
state.formApi = stateData.formApi
state.dict = stateData.dict
state.refreshTable = stateData.refreshTable
}
const state = reactive({
tableData: {
// tableProps: {}, //
columns: [],
config: {},
controlBtn:[],
operateBtn:[]
},
searchData: [],
loading: false,
attrObj: {},
config: {
pageSize:10,
searchIsShow:true,
searchFormIsShow:true,
openPageMode:"drawer"
},
tagList: {},
formId: props.formKey || '',
formList: [], //
name: '',
treeData: {}, //
previewVisible: false,
tabsName: 'second',
formFieldList: [], //
formApi:{
type:"1",
addApiUrl:"",
editApiUrl:"",
delApiUrl:"",
lookApiUrl:""
},
dict: {},
refreshTable: true
})
</script>
<template>
<div>
@ -136,23 +206,23 @@ onMounted(()=>{
<img
v-if="item.icon==''"
:src="squareUrl"
title="示例图片"
:title="item.name"
class="picture"
@click.top="startUsing(item.id,item.name)"
@click.top="startUsing(item.versionId,item.name)"
/>
<img
v-else
:src="item.icon"
title="示例图片"
:title="item.name"
class="picture"
@click.top="startUsing(item.id,item.name)"
@click.top="startUsing(item.versionId,item.name)"
/>
<div class="cardhead">
<el-text class="w-150px mb-2" truncated :title="item.name" @click.top="startUsing(item.id,item.name)">{{item.id}}{{item.name}}</el-text>
<el-text class="w-150px mb-2" truncated :title="item.name" @click.top="startUsing(item.versionId,item.name)">{{item.name}}</el-text>
</div>
<el-row>
<el-col :span="8" class="but_centent">
<el-button size="small" circle class="button" :icon="View"></el-button>
<el-button size="small" circle class="button" :icon="View" @click="lookFormList(item)"></el-button>
</el-col>
<el-col :span="8" class="but_centent">
<el-button size="small" circle class="button" :icon="Edit" @click="editFormApp(item.idStr)"></el-button>
@ -167,8 +237,28 @@ onMounted(()=>{
<div class="formGroupPage">
<el-pagination layout="prev, pager, next" v-model:current-page="pageApp" :page-size="pageAppSize" :total="pageAppTotal" />
</div>
<TaskCustomerForm v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="props.drawerWith" @searchquery="getFormAppList" />
<TableFlow v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="props.drawerWith" @searchquery="getFormAppList" />
<LowCodeFormPage v-if="addFormIsShow" :drawer-with="props.drawerWith" v-model:form-key="formId" @refreshPage="refreshPage" />
<el-drawer
v-model="lookPageIsShow"
title="列表预览"
direction="rtl"
:before-close="handlePreviewClose"
:size="props.drawerWith"
>
<ak-page-list
:data="state.tableData"
:search-data="state.searchData"
:config="state.config"
:form-id="state.formId"
v-model:look-page-is-show="lookPageIsShow"
/>
</el-drawer>
</div>
</template>
<style lang='scss' scoped>

10
src/views/sysworkflow/lowcodepage/index.vue

@ -129,6 +129,14 @@ onMounted(()=>{
drawerWith.value = contbody.value?.clientWidth
gainFormGroup()
})
/**
@ 作者: 秦东
@ 时间: 2024-04-01 14:27:51
@ 功能: 获取容器宽度
*/
const getRongQiAttr = () => {
drawerWith.value = contbody.value?.clientWidth
}
</script>
<template>
<div ref="contbody" class="box_content">
@ -170,7 +178,7 @@ onMounted(()=>{
</el-dropdown>
</div>
</template>
<AppFormList v-model:form-key="formKey" :group-id="item.idStr" :drawer-with="drawerWith" />
<AppFormList v-model:form-key="formKey" :group-id="item.idStr" :drawer-with="drawerWith" @getRongQiAttr="getRongQiAttr" />
</el-card>

1
src/views/sysworkflow/lowcodepage/lowCodeFormPage.vue

@ -12,6 +12,7 @@ import { getProductionMarkForm } from '@/api/DesignForm/requestapi'
import PageDesignEs from "@/views/sysworkflow/lowcodepage/pageDesignes.vue"
import WorkFlow from "@/views/sysworkflow/lowcodepage/workFlow.vue"
import PageList from "@/views/sysworkflow/lowcodepage/pageList.vue"
import PageLists from "@/views/sysworkflow/lowcodepage/pageshiyan/pageLists.vue"

470
src/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue

@ -0,0 +1,470 @@
<!--
@ 作者: 秦东
@ 时间: 2024-04-08 15:21:19
@ 备注: 表单有无流程处理
-->
<script lang='ts' setup>
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow,echoTableFormPage,realTimeUpdateFlow } from '@/api/taskapi/management'
import { string2json,stringToObj } from '@/utils/DesignForm/form'
import { judgeSubmitCancel,startRunFlow } from '@/api/DesignForm/requestapi'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation,submitButton, afreshSubmitButton } from '@/utils/workflow/const'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({
isopen:{
type:Boolean,
default:true
},
versionid:{
type:String,
default:""
},
versiontitle:{
type:String,
default:""
},
drawerwith:{
type:Number,
default:0
}
})
const formLoading = ref(false) //loading
const flowLoading = ref(false) //loading
const flowFactor = reactive<conditionInfo[]>([]) //
const flowMap = ref<any[]>(); //
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
//
const gainFlowChart = reactive<nodeFlow>({
id:"0"
})
const nodelUserList = reactive<nodelPeoples[]>([])
/**
@ 作者: 秦东
@ 时间: 2024-04-08 15:35:54
@ 功能: 表单基本数据结构
*/
const state = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {},
powerstr:{}
},
dict: {},
formId: props.versionid,
id: 0,
loading: true
})
const emits = defineEmits(["update:isopen","searchquery"]);
const drawerOpenOrClose = computed({
get: () => props.isopen,
set: (val) => {
emits("update:isopen", val);
},
});
const isFlowTable = ref(false) //
//
const getTaskFormData = () =>{
formLoading.value = true
flowLoading.value = true
echoTableFormPage({id:props.versionid.toString()})
.then(({ data }) =>{
console.log("表单数据",data)
if(data.tableFormPage.flowIsOpen == 1 && data.tableFormPage.flowkeystr != "0"){
isFlowTable.value = true;
}else{
isFlowTable.value = false;
}
gainFlowChart.id=data.tableFormPage.flowkeystr
console.log("表单数据--->1",data.flowPage.flowList)
flowMap.value = data.flowPage.flowList
state.id=props.versionid
state.formData = stringToObj(data.tableFormPage.mastesform)
state.dict = string2json(data.tableFormPage.dict)
state.formData.powerstr = string2json(data.tableFormPage.powerstr)
judgeSubmitCancel({"name":data.tableFormPage.mastesformjson})
.then((datajud:any) =>{
if(datajud.code == 0){
if (datajud.data == 3 || datajud.data == 4){
state.formData.list.push(submitButton)
}
}
})
})
.finally(()=>{
formLoading.value = false
flowLoading.value = false
})
}
//
watch(()=>props.isopen,()=>{
if(props.isopen){
getTaskFormData();
}else{
initData()
}
})
//
const initData = () => {
state.formData = {
list: [],
form: {},
config: {}
};
state.dict = {};
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
//
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// console.log("--flowFactor--->",flowFactor)
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
if(notAsA_BasisForJudgment.indexOf(type) === -1){
isUpdateFlowChart = true
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
flowLoading.value = true
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
gainFlowChart.oldFlow = flowMap
// console.log("--gainFlowChart--->",gainFlowChart)
realTimeUpdateFlow(gainFlowChart)
.then((data:any) =>{
// console.log("-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
// // console.log("-1-->",flowMap.value)
flowLoading.value = false
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:41:20
@ 功能: 提交成功回调
*/
const afterSubmit = (type: string,val?:any) => {
console.log("表单提交成功------------------>",type,val)
console.log("流程------------------>",flowMap)
if (type === 'success') {
if(isFlowTable.value){
if(val.code == 0){
if(val.data){
let sendInfo ={
id:val.data.uuid,
flowList:flowMap.value,
state:3
}
startRunFlow(sendInfo)
.then((data:any)=>{
console.log("流程提交成功--------1---------->",data)
})
}
}
}
}
closeAppSubmit()
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:49:09
@ 功能: 表单前置数据
*/
const beforeSubmit = (params: any) => {
params.formId = props.versionid
params.id = ""
// emits("update:isopen", false);
return params
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:01
@ 功能: 关闭操作
*/
const closeAppSubmit = () =>{
emits("update:isopen", false);
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:37
@ 功能: 保存草稿
*/
const saveDraftPage = (type: string,val?:any) => {
if (type === 'success') {
if(isFlowTable.value){
if(val.code == 0){
let sendInfo ={
id:val.data.uuid,
flowList:flowMap.value,
state:1
}
startRunFlow(sendInfo)
.then((data:any)=>{
// console.log("--------1---------->",data)
})
}
}
}
closeAppSubmit()
}
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<div v-if="isFlowTable" class="common-layout">
<el-container>
<el-main v-loading="formLoading" element-loading-text="Loading...">
<ak-form
ref="formEl"
:numrun="formType"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
:save-draft-page="saveDraftPage"
/>
</el-main>
<el-aside v-loading="flowLoading" element-loading-text="Loading..." width="350px" class="flowBox">
<el-text size="large">审批流程</el-text>
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</el-aside>
</el-container>
</div>
<!--无流程表单-->
<div v-else class="common-layout">
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="state.formData"
:type="formType"
:numrun="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:save-draft-page="saveDraftPage"
/>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.common-layout{
height: calc(100vh - 55px);
padding: 0 15px;
.el-main{
height: calc(100vh - 55px);
padding:0;
}
.flowBox{
height: calc(100vh - 55px);
border-left: 1px solid #ccc;
padding: 0 15px;
}
.el-header{
padding:0 10px;
line-height:30px;
text-align:right;
font-size:20px;
i{
cursor:pointer;
}
}
}
</style>

876
src/views/sysworkflow/lowcodepage/pageList.vue

@ -4,15 +4,26 @@
@ 备注: 自定义表单列表
-->
<script lang='ts' setup>
import { ElTable } from 'element-plus'
import { Hide, View } from '@element-plus/icons-vue'
import { attrButton,tableButton,tableButtonList,tableLogButtonList,tableAttrLogButtonList,diaOrDrawer } from '@/api/DesignForm/tableButton'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { analysisForm,setFlowFormKeyPower } from '@/api/workflowapi/index'
import { gainFormTableField } from '@/api/DesignForm/requestapi'
import { gainFormTableField,editCustomerFormList,gainFormListCont } from '@/api/DesignForm/requestapi'
import { formTableField,formTabelStruct } from "@/api/DesignForm/type";
import tempOtherUnit from '@/components/DesignForm/pageList/types'
import { ElMessage } from 'element-plus'
import Sortable from 'sortablejs'
//
import PageListHeadTools from '@/views/sysworkflow/lowcodepage/pageListHeadTools.vue'
import ControlSetup from '@/views/sysworkflow/lowcodepage/pageSetUpDialog/controlSetup.vue'
import FieldSetUp from '@/views/sysworkflow/lowcodepage/pageSetUpDialog/fieldSetUp.vue'
import SearchField from '@/views/sysworkflow/lowcodepage/pageSetUpDialog/searchField.vue'
import PreviewPage from '@/views/sysworkflow/lowcodepage/pageSetUpDialog/previewPage.vue'
import CodePage from '@/views/sysworkflow/lowcodepage/pageSetUpDialog/codePage.vue'
const props = defineProps({
@ -61,20 +72,34 @@ const state = reactive({
tableData: {
// tableProps: {}, //
columns: [],
config: {}
config: {},
controlBtn:[],
operateBtn:[]
},
searchData: {},
searchData: [],
loading: false,
attrObj: {},
config: {},
config: {
pageSize:10,
searchIsShow:true,
searchFormIsShow:true,
openPageMode:"drawer"
},
tagList: {},
formId: props.formKey || '',
formId: props.formKey.toString() || '',
formList: [], //
name: '',
treeData: {}, //
previewVisible: false,
tabsName: 'second',
formFieldList: [], //
formApi:{
type:"1",
addApiUrl:"",
editApiUrl:"",
delApiUrl:"",
lookApiUrl:""
},
dict: {},
refreshTable: true
})
@ -104,7 +129,7 @@ const filterFiled = (obj: any) => {
}
})
}
const excludeType = [
const excludeType = [
'txt',
'title',
'table',
@ -159,15 +184,572 @@ const handleSelectionChange = (val: User[]) => {
// })
watch(()=>props.tabsActive,(val:number)=>{
if(val == 3){
jieForm()
jieForm();
getListInfo();
}
})
onMounted(()=>{
jieForm()
jieForm();
nextTick(() => {
columnDrop()
getListInfo();
})
})
const setUpFieldInfo = ref<tableButton>()
const setUpFieldIsOpen= ref(false)
const tableAttrBut = ref<InstanceType<typeof ElTable>>()
/**
@ 作者: 秦东
@ 时间: 2024-03-25 11:51:46
@ 功能: 设置字段属性
*/
const setUpField = (val:any) =>{
console.log("设置字段属性-->",val)
setUpFieldInfo.value = val
setUpFieldIsOpen.value = true
console.log("设置字段属性-1->",setUpFieldIsOpen)
}
/**
@ 作者: 秦东
@ 时间: 2024-03-27 09:17:15
@ 功能: 设置功能按钮
*/
const listButtonIsShow = ref(false)
const setUpFieldBut = () => {
// console.log("-->")
listButtonIsShow.value = true
}
//
const tableAttrButClick = (val:tableButton[]) => {
if(zhuDaunIsTrue.value == true){
if(state.tableData.controlBtn.length > 0){
state.tableData.controlBtn.splice(0, state.tableData.controlBtn.length);
state.tableData.controlBtn = val
}else{
state.tableData.controlBtn = val
}
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-25 14:58:22
@ 功能: 功能字段
*/
const tableFieldAttrButClick = (val:tableButton[]) => {
if(zhuDaunIsTrue.value == true){
if(val.length > 0){ //
if(state.tableData.columns.length > 0){ //
val.forEach((item:tableButton)=>{
let isTrue = true;
state.tableData.columns.forEach((itemTab:tableButton)=>{
if(item.id == itemTab.id){
isTrue = false;
}
});
if(isTrue){
state.tableData.columns.push(item)
}
})
}else{ //,
val.forEach((item:tableButton)=>{
state.tableData.columns.push(item)
})
}
//
let delField = []
tableAttrLogButtonList.forEach((item:tableButton)=>{
let isTrue = true;
val.forEach((itemVal:tableButton)=>{
if(item.id == itemVal.id){
isTrue = false
}
})
if(isTrue){
delField.push(item.id)
}
});
if(delField.length > 0){
state.tableData.columns.forEach((itemTab:tableButton,index:number)=>{
delField.forEach((item:string)=>{
if(item == itemTab.id){
state.tableData.columns.splice(index,1) //
}
})
});
}
}else{ //
if(state.tableData.columns.length > 0){
tableAttrLogButtonList.forEach((item:tableButton)=>{
state.tableData.columns.forEach((itemTab:tableButton,index:number)=>{
if(item.id == itemTab.id){
state.tableData.columns.splice(index,1) //
}
});
});
}
}
if(state.tableData.columns.length > 0){
let isOpent = true;
state.tableData.columns.forEach((itemTab:tableButton)=>{
if(itemTab.fieldClass == "__control"){
isOpent = false;
}
});
if(isOpent){
state.tableData.operateBtn = [];
}
}else{
state.tableData.operateBtn = [];
}
}
}
const zhuDaunIsTrue = ref(false);
/**
@ 作者: 秦东
@ 时间: 2024-03-25 16:36:38
@ 功能: 列表字段处理
*/
const tableListFieldClick = (val:any[]) => {
console.log("列表字段处理-->",val)
// zhuDaunIsTrue.value = true
if(zhuDaunIsTrue.value == true){
if(val.length > 0){
if(state.tableData.columns.length > 0){ //
val.forEach((item:tableButton)=>{
let isTrue = true;
state.tableData.columns.forEach((itemTab:tableButton)=>{
if(item.id == itemTab.id){
console.log("列表字段处理-111->",val)
isTrue = false;
}
});
if(isTrue){
state.tableData.columns.push(item)
}
})
}else{ //,
val.forEach((item:any)=>{
state.tableData.columns.push(item)
})
}
//
let delField = []
formTableField.masterTable.forEach((item:tableButton)=>{
let isTrue = true;
val.forEach((itemVal:tableButton)=>{
if(item.id == itemVal.id){
isTrue = false
}
})
if(isTrue){
delField.push(item.id)
}
});
if(delField.length > 0){
state.tableData.columns.forEach((itemTab:tableButton,index:number)=>{
delField.forEach((item:string)=>{
if(item == itemTab.id){
state.tableData.columns.splice(index,1) //
}
})
});
}
}else{
if(state.tableData.columns.length > 0){
formTableField.masterTable.forEach((item:tableButton)=>{
state.tableData.columns.forEach((itemTab:tableButton,index:number)=>{
if(item.id == itemTab.id){
state.tableData.columns.splice(index,1) //
}
});
});
}
}
}
}
const container = ref()
//
const columnDrop = () => {
const wrapperTr = container.value.querySelector(
'.el-table__header-wrapper tr'
)
console.log("wrapperTr",wrapperTr)
Sortable.create(wrapperTr, {
animation: 180,
delay: 0,
onEnd: (evt: any) => {
console.log("evt",evt.oldIndex,evt.newIndex)
const oldItem = state.tableData.columns[evt.oldIndex]
state.tableData.columns.splice(evt.oldIndex, 1)
state.tableData.columns.splice(evt.newIndex, 0, oldItem)
//
state.refreshTable = false
nextTick(() => {
state.refreshTable = true
nextTick(() => {
columnDrop() //
})
})
}
})
}
const tableFieldList = ref<InstanceType<typeof ElTable>>()
const tableFieldAttrBut = ref<InstanceType<typeof ElTable>>()
/**
@ 作者: 秦东
@ 时间: 2024-03-27 08:27:22
@ 功能: 删除表头列表字段
*/
const delCol = (val:any) => {
let delInfo = []
let delInfoBut = []
if(state.tableData.columns.length > 0) {
state.tableData.columns.forEach((item: any, index: number) => {
if (item.id === val.id) {
state.tableData.columns.splice(index, 1)
if(item.attribute == "-"){
delInfoBut.push(item)
}else{
delInfo.push(item)
}
}
})
// tableFieldList.value!.toggleRowSelection(delInfo, true)
console.log("delInfo",delInfo)
// tableFieldList.value!.clearSelection()
}else{
tableFieldList.value!.clearSelection()
tableFieldAttrBut.value!.clearSelection()
}
if(delInfo.length > 0){
delInfo.forEach((item:any)=>{
tableFieldList.value!.toggleRowSelection(item, false)
})
}
if(delInfoBut.length > 0){
delInfoBut.forEach((item:any)=>{
tableFieldAttrBut.value!.toggleRowSelection(item, false)
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-27 10:13:34
@ 功能: 更新列表记录操作按钮
*/
const updataLogBut = (val:attrButton[]) => {
console.log("更新列表记录操作按钮",val)
let isWrete = true
if(state.tableData.columns && state.tableData.columns.length > 0){
state.tableData.columns.forEach((item:any)=>{
if(item.fieldClass == "__control"){
state.tableData.operateBtn = val.value
isWrete = false
}
})
}
if(isWrete){
state.tableData.operateBtn = [];
}
// console.log("------1------->",state.tableData.operateBtn)
}
/**
@ 作者: 秦东
@ 时间: 2024-03-28 15:00:12
@ 功能: 处理查询条件
*/
const addOrDelSearchField = (val:attrButton,isTrue:boolean) => {
if(isTrue){
if(state.searchData.length>0){
let isWrite = true;
state.searchData.forEach((item:attrButton,index:number)=>{
if(item.id==val.id){
isWrite = false;
}
})
if(isWrite){
state.searchData.push(val)
}
}else{
state.searchData.push(val)
}
}else{
if(state.searchData.length>0){
state.searchData.forEach((item:attrButton,index:number)=>{
if(item.id==val.id){
state.searchData.splice(index,1)
}
})
}
}
}
//
const readerColumn = (column:any) => {
// console.log(column)
let labelLong = column.label.length // label
if(column.label.length < 3) {
labelLong = 3
}
let size = 30 //
// column.minWidth = labelLong * size
//@ts-ignore
return labelLong * size
}
const adaptiveWidth = (colName: any) =>{
if (!colName) {
return
}
colName += ''
const english = /\w+/
let colWidth = 0
for (const char of colName) {
if (english.test(char)) {
colWidth += 30
} else {
colWidth += 30
}
}
return colWidth
}
const codeIsShow = ref(false) //
/**
@ 作者: 秦东
@ 时间: 2024-03-29 11:12:26
@ 功能: 列表头部按钮操作
*/
const listPageTools = (type: string) => {
console.log("列表头部操作--》",type)
switch(type){
case "del":
clearData()
break;
case "eye":
state.previewVisible = true
break;
case "json":
drawer.title = "查看表格列表结构"
dialogOpen(state, { direction: 'ltr', type: 'json' })
break;
case "save":
saveFormListData()
break;
default:
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:42:39
@ 功能: 关闭预览
*/
const handlePreviewClose = () => {
state.previewVisible = false
}
const drawer = reactive({
visible: false,
title: '',
direction: 'ltr',
content: '',
codeType: ''
})
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:08:49
@ 功能: 数据格式处理
*/
const dialogOpen = (obj: any, params: any = {}) => {
drawer.visible = true
Object.assign(drawer, { direction: 'ltr' }, params)
let editData = objToStringify(obj, true)
switch (params.type) {
case 'dict':
editData = json2string(obj, true)
break
case 'beforeRequest':
case 'beforeDelete':
case 'treeBeforeRequest':
if (!obj) {
editData = beforeRequest
}
break
case 'afterResponse':
case 'treeAfterResponse':
if (!obj) {
editData = afterResponse
}
break
}
drawer.content = editData
}
/**
@ 作者: 秦东
@ 时间: 2024-03-29 11:02:51
@ 功能: 清空数据
*/
const clearData = () => {
tableFieldList.value!.clearSelection()
tableFieldAttrBut.value!.clearSelection()
tableAttrBut.value!.clearSelection()
state.searchData = []
// state.tableData.controlBtn = []
// state.tableData.columns = []
state.tableData.operateBtn = []
state.tableData.config = {}
if(formTableField.masterTable){
formTableField.masterTable.forEach((item)=>{
item.isSearch = false;
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-29 14:58:52
@ 功能: 添加自定义表单列表设定
*/
const saveFormListData = () => {
const { type ,addApiUrl ,editApiUrl,delApiUrl,lookApiUrl } = state.formApi
if(!props.formKey || props.formKey == "" || props.formKey == null || props.formKey == undefined){
return ElMessage.error('未知表单参数!请先保存前置表单后再操作!')
}
console.log("添加自定义表单列表设定",state.formApi)
if(type != 1){
if(addApiUrl=="" || editApiUrl=="" || delApiUrl=="" || lookApiUrl == ""){
return ElMessage.error('请补全列表第三方APIUrl!')
}
}
if(state.tableData.columns.length < 1){
return ElMessage.error('未设置表单查询项!不可提交!')
}
let params: any = {
data: json2string(state),
id: props.formKey.toString()
}
console.log("添加自定义表单列表设定",params)
editCustomerFormList(params)
.then((data)=>{
console.log("添加自定义表单列表设定",data)
ElMessage.success(data.msg)
})
}
/**
@ 作者: 秦东
@ 时间: 2024-04-01 08:41:31
@ 功能: 获取列表内容
*/
const getListInfo = () => {
console.log("获取列表内容1111",props.formKey)
gainFormListCont({id:props.formKey.toString()})
.then((data)=>{
console.log("获取列表内容",data)
if(data.data.listjson != null && data.data.listjson != ""){
let stateData = string2json(data.data.listjson)
console.log("获取列表内容---->",stateData)
state.tableData = stateData.tableData
state.searchData = stateData.searchData
state.loading = stateData.loading
state.attrObj = stateData.attrObj
state.config = stateData.config
state.tagList = stateData.tagList
state.formId = stateData.formId
state.formList = stateData.formList
state.name = stateData.name
state.treeData = stateData.treeData
state.previewVisible = stateData.previewVisible
state.formFieldList = stateData.formFieldList
state.formApi = stateData.formApi
state.dict = stateData.dict
state.refreshTable = stateData.refreshTable
}
zhuDaunIsTrue.value = false
if(state.tableData && state.tableData.columns && state.tableData.columns.length > 0) {
if(formTableField.masterTable && formTableField.masterTable.length > 0){
state.tableData.columns.forEach((itemCol:any)=>{
formTableField.masterTable.forEach((item:any)=>{
if(itemCol.id == item.id){
console.log("========>",item)
item.isSearch = true
tableFieldList.value!.toggleRowSelection(item, true)
}
})
})
}
if(tableAttrLogButtonList && tableAttrLogButtonList.length > 0){
state.tableData.columns.forEach((itemCol:any)=>{
tableAttrLogButtonList.forEach((item:any)=>{
if(itemCol.id == item.id){
tableFieldAttrBut.value!.toggleRowSelection(item, true)
}
})
})
}
// // let delInfo = []
// // let delInfoBut = []
// // state.tableData.columns.forEach((item: any) => {
// // if(item.fieldClass != "-"){
// // delInfo.push(item)
// // }else{
// // delInfoBut.push(item)
// // }
// // // tableFieldList.value!.toggleRowSelection(item, true)
// // // if
// // // tableFieldAttrBut.value!.toggleRowSelection(item, true)
// // })
// // if(delInfo.length > 0){
// // delInfo.forEach((item:any)=>{
// // tableFieldList.value!.toggleRowSelection(item, true)
// // })
// // }
// // if(delInfoBut.length > 0){
// // delInfoBut.forEach((item:any)=>{
// // tableFieldAttrBut.value!.toggleRowSelection(item, true)
// // })
// // }
}
if(state.tableData && state.tableData.controlBtn && state.tableData.controlBtn.length > 0) {
state.tableData.controlBtn.forEach((itemCol:any)=>{
tableButtonList.forEach((item:any)=>{
if(itemCol.id == item.id){
tableAttrBut.value!.toggleRowSelection(item, true)
}
})
})
}
zhuDaunIsTrue.value = true
})
}
</script>
<template>
<div ref="container" class="design-containers design-table" v-loading="pageLoading">
<div class="design-containers design-table" v-loading="pageLoading">
<!-- <div class="components-list">
<el-divider content-position="left">表格列字段</el-divider>
<el-table
@ -185,29 +767,206 @@ onMounted(()=>{
<div class="main-body">
<div class="header">
<div class="field">
{{props.formKey}}
</div>
<PageListHeadTools @clearData="listPageTools" />
</div>
<PageListHeadTools />
<div ref="container" class="table_box main_table">
<div class="search-box" >
<SearchField v-if="state.searchData&&state.searchData.length>0&&state.config.searchIsShow" v-model:searchData="state.searchData" />
<div v-else class="tipBox" >条件查询搜索区域</div>
</div>
<div class="operateButArea">
<div class="operatLeft">
<el-text v-if="state.tableData.controlBtn.length === 0" class="mx-1 tipBox" type="info">操作按钮区域</el-text>
<el-button
v-for="item in state.tableData.controlBtn"
v-bind="item"
:key="item.type"
>
{{ item.label }}
</el-button>
</div>
<div>
<el-tooltip
v-if="state.config.searchFormIsShow"
class="box-item"
effect="dark"
content="折叠查询表单"
placement="bottom"
>
<el-icon @click="state.config.searchIsShow=!state.config.searchIsShow"><Search /></el-icon>
</el-tooltip>
</div>
</div>
<div class="operateButArea tipBox" v-if="!state.tableData.columns?.length">
表格列设置区域可从左上角 添加表格列字段
选择已有列或直接从上方工具栏 生成脚本预览 编辑
</div>
<el-table
:data="[{}]"
v-bind="state.tableData.tableProps || {}"
ref="tableEl"
>
<template
v-for="item in state.tableData.columns"
:key="item.prop || item.label"
>
<el-table-column v-bind="item" :width="readerColumn(item)">
<template #header="scope">
<div class="field_close">
<el-text>{{ item.label }}</el-text>
<i ><el-icon @click="delCol(item)"><Close /></el-icon></i>
</div>
<el-tooltip placement="top" v-if="item.help">
<template #content>
<span v-html="item.help"></span>
</template>
<i class="icon-help"></i>
</el-tooltip>
</template>
<template #default v-if="item.field !== 'index'">
<el-checkbox v-if="item.field === 'checkbox'" />
<span v-if="item.field === 'operate'">操作</span>
<span v-if="item.field !== 'checkbox'&&item.field !== 'operate'" >数据</span>
</template>
</el-table-column>
</template>
</el-table>
<div class="table-tip">
操作提示<br />
*从数据列表配置中选择 所属表单<br />
*从左上角 添加表格字段 选择预设字段<br />
*可拖动表头字段移动调整表头字段排列顺序<br />
*可通过顶部工具栏 生成脚本预览 查看或编辑添加自定义字段<br />
</div>
</div>
</div>
<div class="sidebar-tools">
<el-tabs ref="multipleTableRef" v-model="formTableActive" class="form_tabs" @tab-click="handleClick">
<el-tab-pane label="字段设置" :name="1">
<el-divider content-position="left">查询设置</el-divider>
<el-divider content-position="left">列表字段</el-divider>
<el-table :data="formTableField.masterTable" border style="width: 100%">
<el-divider content-position="left">功能字段</el-divider>
<el-table ref="tableFieldAttrBut" :data="tableAttrLogButtonList" border style="width: 100%" @selection-change="tableFieldAttrButClick">
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="name" label="字段" />
<el-table-column prop="label" label="字段" />
<el-table-column fixed="right" label="设置" width="55" align="center">
<template #default="scope">
<el-icon title="设置"><Setting /></el-icon>
<el-icon v-if="scope.row.fieldClass=='__control'" title="设置" @click="setUpFieldBut(scope.row)"><Setting /></el-icon>
</template>
</el-table-column>
</el-table>
<el-divider content-position="left">列表字段</el-divider>
<el-table ref="tableFieldList" :data="formTableField.masterTable" border @selection-change="tableListFieldClick" style="width: 100%">
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段">
<template #default="scope">
{{scope.row.label}}({{scope.row.fieldClass}}[{{scope.row.pattern}}])
</template>
</el-table-column>
<el-table-column fixed="right" label="查询" width="55" align="center">
<template #default="scope">
<el-switch
v-model="scope.row.isSearch"
:active-action-icon="View"
:inactive-action-icon="Hide"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
@change="addOrDelSearchField(scope.row, $event)"
/>
</template>
</el-table-column>
<!-- <el-table-column fixed="right" label="设置" width="55" align="center">
<template #default="scope">
<el-icon title="设置" @click="setUpField(scope.row)"><Setting /></el-icon>
</template>
</el-table-column> -->
</el-table>
<el-divider content-position="left">查询条件</el-divider>
</el-tab-pane>
<el-tab-pane label="列表设置" :name="2">
<el-divider content-position="left">批量操作</el-divider>
<el-divider content-position="left">功能按钮</el-divider>
<el-table ref="tableAttrBut" :data="tableButtonList" border style="width: 100%" @selection-change="tableAttrButClick">
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段" />
</el-table>
<el-divider content-position="left">基本功能设置</el-divider>
<el-form :model="state.config" label-width="auto" style="width: 96%; margin-left:2%;">
<el-form-item label="每页显示数据得数量">
<el-input-number
v-model="state.config.pageSize"
class="mx-4"
:min="1"
:max="10000"
controls-position="right"
/>
</el-form-item>
<el-form-item label="数据添加编辑打开方式">
<el-select
v-model="state.config.openPageMode"
clearable
placeholder="请选择"
>
<el-option
v-for="itemOpt in diaOrDrawer"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
</el-form-item>
<el-form-item label="可折叠查询表单">
<el-switch
v-model="state.config.searchFormIsShow"
:active-action-icon="View"
:inactive-action-icon="Hide"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
/>
</el-form-item>
</el-form>
<el-divider content-position="left">数据处理事件</el-divider>
<el-form :model="state.formApi" label-width="auto" style="width: 96%; margin-left:2%;">
<el-form-item label="数据处理方式">
<el-switch
v-model="state.formApi.type"
active-text="默认"
inactive-text="第三方API"
active-value="1"
inactive-value="2"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #409EFF"
/>
</el-form-item>
<el-form-item v-if="state.formApi.type!=1" label="填加APIUrl">
<el-input v-model="state.formApi.addApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type!=1" label="编辑APIUrl">
<el-input v-model="state.formApi.editApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type!=1" label="删除APIUrl">
<el-input v-model="state.formApi.delApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
<el-form-item v-if="state.formApi.type!=1" label="查看APIUrl">
<el-input v-model="state.formApi.lookApiUrl" placeholder="请输入接口地址">
<template #prefix>http://</template>
</el-input>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
<!-- {{props.formKey}}
@ -216,6 +975,36 @@ onMounted(()=>{
<br>
{{formTableField}} -->
</div>
<ace-drawer
v-model="drawer.visible"
:title="drawer.title"
:direction="drawer.direction"
:content="drawer.content"
:code-type="drawer.codeType"
@before-close="drawerBeforeClose"
@confirm="dialogConfirm"
/>
<FieldSetUp v-model:is-open="setUpFieldIsOpen" :setup-field-info="setUpFieldInfo" />
<ControlSetup v-model:is-show="listButtonIsShow" v-model:contbutary:="state.tableData.operateBtn" @updata-log-but="updataLogBut" />
<CodePage v-model:is-show="codeIsShow" :list-data="state" />
<el-drawer
v-model="state.previewVisible"
title="列表预览"
direction="btt"
:before-close="handlePreviewClose"
size="90%"
>
<ak-page-list
:data="state.tableData"
:search-data="state.searchData"
:config="state.config"
v-if="state.previewVisible"
/>
</el-drawer>
</div>
</template>
<style lang='scss' scoped>
@ -236,4 +1025,57 @@ onMounted(()=>{
.form_tabs > .el-tabs__content{
padding: 0;
}
.table_box{
background: #fff;
border: 1px dashed #999;
margin: 10px;
height: calc(100vh - 100px);
overflow-y: auto;
overflow-x: hidden;
position: relative;
.table-tip{
color: #999;
padding: 30px 0;
line-height: 22px;
}
.operateButArea{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top:15px;
.operatLeft{
padding-bottom: 2px;
}
}
}
.main_table{
padding: 10px 20px;
}
.cell{
min-width:120px;
}
.field_close{
i{
display: none;
cursor: pointer;
}
}
.field_close:hover{
i{
display: inline;
cursor: pointer;
}
}
.tipBox{
border: 1px dotted #ddd;
padding: 3px 5px;
border-radius: 5px;
color: #999;
text-align: center;
cursor: pointer;
}
</style>

16
src/views/sysworkflow/lowcodepage/pageListHeadTools.vue

@ -1,6 +1,6 @@
<!-- Created by weiXin:337547038 -->
<template>
<div class="main-tools">
<div class="main-toolsTable">
<slot></slot>
<el-button
link
@ -58,7 +58,17 @@
}
})
const btnClick = (type: string) => {
emits('click', type)
emits('clearData', type)
}
</script>
<style lang='scss' scoped>
.main-toolsTable{
line-height: 26px;
border-bottom: 2px solid #e4e7ed;
/* margin-right: 10px; */
padding: 8px 10px 8px 0;
display: flex;
align-items: center;
justify-content: flex-end;
}
</style>

52
src/views/sysworkflow/lowcodepage/pageSetUpDialog/codePage.vue

@ -0,0 +1,52 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-29 13:52:10
@ 备注: 查看表单列表代码
-->
<script lang='ts' setup>
const props = defineProps({
isShow:{
type:Boolean,
default:false,
},
listData:{
type:Object,
default(){
return {}
}
}
});
const direction = ref('ltr')
const emits = defineEmits(["update:isShow"]);
const isShowIng = computed({
get() {
return props.isShow
},
set(val: formStruct) {
emits('update:isShow', val)
}
});
/**
@ 作者: 秦东
@ 时间: 2024-03-27 10:25:54
@ 功能: 关闭弹窗
*/
const closeLogBut = () =>{
emits('update:isShow', false)
}
</script>
<template>
<el-drawer
v-model="isShowIng"
title="生成脚本预览"
:direction="direction"
:before-close="closeLogBut"
>
<div v-if="props.listData" :id="id"></div>
</el-drawer>
</template>
<style lang='scss' scoped>
</style>

117
src/views/sysworkflow/lowcodepage/pageSetUpDialog/controlSetup.vue

@ -0,0 +1,117 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-27 10:02:17
@ 备注: 设置数据记录操作按钮
-->
<script lang='ts' setup>
import { ElTable } from 'element-plus'
import { tableLogButtonList,attrButton } from '@/api/DesignForm/tableButton'
const props = defineProps({
isShow:{
type:Boolean,
default:false,
},
contbutary:{
type:Object,
default(){
return {}
}
}
});
const direction = ref('ltr')
// const emits = defineEmits<{
// (e: 'update:isShow', val: boolean): void
// (e: 'updataLogBut', val: function): void
// }>()
const emits = defineEmits(["update:isShow","update:contbutary","updataLogBut"]);
const isShowIng = computed({
get() {
return props.isShow
},
set(val: formStruct) {
emits('update:isShow', val)
}
});
const contButList = computed({
get() {
return props.contbutary
},
set(val: formStruct) {
emits('update:contbutary', val)
}
});
const tableLogBut = ref<InstanceType<typeof ElTable>>()
watch(()=>isShowIng.value,(val: boolean)=>{
if(val){
// console.log("props.contbutary",props.contbutary)
// console.log("props.contbutary",contButList.value)
// if(contButList.value && contButList.value.length > 0){
// let delBut = []
// tableLogButtonList.forEach((item:any)=>{
// let isTrue = true;
// contButList.value.forEach((itemAll:any)=>{
// if (item.key === itemAll.key) {
// isTrue = false;
// }
// })
// if(isTrue){
// tableLogBut.value!.toggleRowSelection(item, false)
// }
// })
// }else{
// nextTick(() => {
// tableLogBut.value!.clearSelection()
// })
// }
}
})
/**
@ 作者: 秦东
@ 时间: 2024-03-27 10:25:54
@ 功能: 关闭弹窗
*/
const closeLogBut = () =>{
emits('update:isShow', false)
emits('updataLogBut', tableLogButtonList)
}
/**
@ 作者: 秦东
@ 时间: 2024-03-27 10:39:34
@ 功能: 选中的内容
*/
const xuanZhongLog = (val:attrButton[]) =>{
tableLogButtonList.value = val
console.log(tableLogButtonList)
}
</script>
<template>
<el-drawer
v-model="isShowIng"
title="设置数据记录操作按钮"
:direction="direction"
:before-close="closeLogBut"
>
<el-table ref="tableLogBut" :data="tableLogButtonList" border style="width: 100%" @selection-change="xuanZhongLog">
<el-table-column fixed type="selection" width="40" align="center" />
<el-table-column prop="label" label="字段" />
</el-table>
<div class="dialog-footer">
<el-button @click="closeLogBut">取消</el-button>
<el-button type="primary" @click="closeLogBut">确定</el-button>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.dialog-footer {
margin-top: 20px;
text-align: center;
}
</style>

77
src/views/sysworkflow/lowcodepage/pageSetUpDialog/fieldSetUp.vue

@ -0,0 +1,77 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-27 15:05:32
@ 备注: 设置字段属性
-->
<script lang='ts' setup>
const props = defineProps({
isOpen:{
type:Boolean,
default:false,
},
setupFieldInfo:{
type:Object,
default(){
return {}
}
}
});
const drawerTitle = ref("设置")
const direction = ref('ltr')
const emits = defineEmits(["update:isOpen","update:setupFieldInfo","updataLogBut"]);
const drawerIsShow = computed({
get() {
return props.isOpen
},
set(val: formStruct) {
emits('update:isOpen', val)
}
});
const setupFieldCentent = computed({
get() {
return props.setupFieldInfo
},
set(val: formStruct) {
emits('update:setupFieldInfo', val)
}
});
/**
@ 作者: 秦东
@ 时间: 2024-03-27 15:27:14
@ 功能: 关闭弹窗
*/
const handleDrawerClose = () => {
emits('update:isOpen',false)
}
/**
@ 作者: 秦东
@ 时间: 2024-03-27 15:47:38
@ 功能: 监听开关
*/
watch(()=>drawerIsShow.value,(val:boolean)=>{
// console.log("",setupFieldCentent)
if(val) {
drawerTitle.value = setupFieldCentent.value.name + "设置"
}else{
drawerTitle.value = "设置"
initData();
}
})
const initData = () => {
setupFieldCentent.value = {}
}
</script>
<template>
<el-drawer
v-model="drawerIsShow"
:title="drawerTitle"
:direction="direction"
:before-close="handleDrawerClose"
>
{{setupFieldCentent}}
</el-drawer>
</template>
<style lang='scss' scoped>
</style>

14
src/views/sysworkflow/lowcodepage/pageSetUpDialog/previewPage.vue

@ -0,0 +1,14 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-29 13:50:19
@ 备注: 列表预览
-->
<script lang='ts' setup>
</script>
<template>
<div></div>
</template>
<style lang='scss' scoped>
</style>

225
src/views/sysworkflow/lowcodepage/pageSetUpDialog/searchField.vue

@ -0,0 +1,225 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-28 11:39:14
@ 备注: 查询字段
-->
<script lang='ts' setup>
import { tableButton } from '@/api/DesignForm/tableButton'
import type { FormInstance, FormRules } from 'element-plus'
import { inputUnit,timeUnit,choiceUnit,switchUnit,orgUnit,checkboxUnit } from '@/api/DesignForm/fieldUnit'
const props = defineProps({
searchData:{
type:Object,
default(){
return {}
}
}
});
const emits = defineEmits(["update:searchData"]);
const drawerIsShow = computed({
get() {
return props.searchData
},
set(val: tableButton) {
emits('update:searchData', val)
}
});
watch(()=>drawerIsShow.value,(val:tableButton)=>{
},
{
deep: true
})
/**
@ 作者: 秦东
@ 时间: 2024-03-28 13:17:46
@ 功能: 重置表单
*/
const ruleSearchForm = ref()
const resetFields = (formEl: FormInstance | undefined) => {
// formEl.resetFields()
// console.log("formEl",formEl,formEl.resetFields())
// if (!formEl) return
// formEl.resetFields()
if(drawerIsShow.value.length > 0){
drawerIsShow.value.forEach((item:any)=>{
item.value="";
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-28 16:03:12
@ 功能: 判断类型
*/
const unitIsShow = (val:tableButton,unitName:string) => {
// val.pattern
switch (val.fieldClass) {
case "id": //
return inputUnit.includes(unitName);
break;
case "masters_key": //
return inputUnit.includes(unitName);
break;
case "creater": //
return inputUnit.includes(unitName);
break;
case "creater_time": //
return timeUnit.includes(unitName);
break;
case "edit_time": //
return timeUnit.includes(unitName);
break;
case "flow_id": //
return inputUnit.includes(unitName);
break;
case "baidumap": //
return inputUnit.includes(unitName);
break;
case "input": //
return inputUnit.includes(unitName);
break;
case "radio": //
return choiceUnit.includes(unitName);
break;
case "switch": //
return switchUnit.includes(unitName);
break;
case "orgCentent": //
return orgUnit.includes(unitName);
break;
case "varchar": //
return inputUnit.includes(unitName);
break;
case "checkbox":
return checkboxUnit.includes(unitName);
break;
default:
return inputUnit.includes(unitName);
break;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-28 16:59:13
@ 功能: 时间选择器
*/
const shortcuts = [
{
text: '此刻',
value: new Date(),
},
{
text: '昨天',
value: () => {
const date = new Date()
date.setTime(date.getTime() - 3600 * 1000 * 24)
return date
},
},
{
text: '一周前',
value: () => {
const date = new Date()
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
return date
},
},
]
</script>
<template>
<el-form ref="ruleSearchForm" class="seacherForm">
<template v-for="(item, index) in drawerIsShow" :key="index">
<div class="group group-input">
<el-form-item :label="item.label" class="form_cont">
<el-input
v-model="item.value"
:placeholder="'请输入'+item.label"
clearable
v-if="unitIsShow(item,'input')"
/>
<el-date-picker
v-model="item.value"
type="datetime"
:placeholder="'请选择'+item.label"
:shortcuts="shortcuts"
v-if="unitIsShow(item,'time')"
/>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'radio')"
>
<el-option
v-for="itemOpt in item.options"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'switch')"
>
<el-option
:key="item.activeValue"
label="是"
:value="item.activeValue"
/>
<el-option
:key="item.inactiveValue"
label="否"
:value="item.inactiveValue"
/>
</el-select>
<el-select
v-model="item.value"
multiple
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'checkbox')"
>
<el-option
v-for="itemOpt in item.options"
:key="itemOpt.value"
:label="itemOpt.label"
:value="itemOpt.value"
/>
</el-select>
<el-select
v-model="item.value"
clearable
:placeholder="'请选择'+item.label"
v-if="unitIsShow(item,'org')"
>
</el-select>
</el-form-item>
</div>
</template>
<div class="group group-btn" v-if="drawerIsShow.length">
<el-button type="primary"><el-icon><Search /></el-icon></el-button>
<el-button @click="resetFields(ruleSearchForm)"><el-icon><Refresh /></el-icon></el-button>
</div>
</el-form>
</template>
<style lang='scss' scoped>
.seacherForm{
min-height: auto;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
}
.group{
width: auto;
margin-right: 10px;
}
</style>

16
src/views/taskplatform/taskmanagement/flowStep.vue

@ -58,7 +58,7 @@ onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
// console.log("val----->",val)
console.log("val----->",val)
if(val.customNode == "beginnode"){
val.runscope = val.runscope!=0?val.runscope:1
return true
@ -81,11 +81,14 @@ const judgeAddUser = (val:any):boolean =>{
}
break;
default:
if(!val.operator){
val.runscope = val.runscope!=0?val.runscope:1
return true
}else if(val.operator.length < 1){
val.runscope = val.runscope!=0?val.runscope:1
// if(!val.operator){
// val.runscope = val.runscope!=0?val.runscope:1
// return true
// }else if(val.operator.length < 1){
// val.runscope = val.runscope!=0?val.runscope:1
// return true
// }
if(val.runscope != 0){
return true
}
return false
@ -130,6 +133,7 @@ const updateNode = (val:any) =>{
{{ item.nodeName }}
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">

7
src/views/taskplatform/taskmanagement/runFlowStep.vue

@ -7,6 +7,7 @@
import SvgIcon from "@/components/SvgIcon/index.vue";
import OrgUserPage from "@/views/public/orguser/orguser.vue"
import OrgAllUserPage from "@/views/public/orguser/orgalluser.vue"
import { authorizeWorkflow } from '@/api/taskapi/management'
// import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { gainRunTaskFlow,submitApprovalResults } from '@/api/DesignForm/requestapi'
@ -112,7 +113,7 @@ const yesOrNo = (val:string,agreeOrRefuse:number) =>{
suggest:sendFlowInfo.value,
flowlist:flowMaps.value
}
submitApprovalResults(sendInfo)
authorizeWorkflow(sendInfo)
.then((data:any)=>{
// console.log("----22222->",data)
@ -133,9 +134,9 @@ defineExpose({gainRunFlowTask})
<template>
<div class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20" style="width:100%">
<!-- <el-affix :offset="20" style="width:100%">
<el-text size="large">审批流程</el-text>
</el-affix>
</el-affix> -->
<el-steps v-loading="flowLoading" element-loading-text="Loading..." direction="vertical" :active="currentStep">
<el-step v-for="item in flowMaps" :key="item.step">

248
src/views/taskplatform/taskmanagement/runFlowStep_20240411.vue

@ -0,0 +1,248 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-24 13:18:02
@ 备注: 流程执行
-->
<script lang='ts' setup>
import SvgIcon from "@/components/SvgIcon/index.vue";
import OrgUserPage from "@/views/public/orguser/orguser.vue"
import OrgAllUserPage from "@/views/public/orguser/orgalluser.vue"
// import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { gainRunTaskFlow,submitApprovalResults } from '@/api/DesignForm/requestapi'
//
import squareUrlOne from "@/assets/images/1.png"
import squareUrlTwo from "@/assets/images/2.png"
const state = reactive({
circleUrl:squareUrlTwo,
squareUrl: squareUrlOne,
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const props = defineProps({
flowKey:{
type:String,
default:""
},
currentProgress:{
type:Number,
default:0
}
})
const emits = defineEmits(["update:flowary","updatelist"]);
const flowLoading = ref(false)
const openOrClose = ref(false) //
const openclosebox = ref(false) //
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const flowOpinion = ref(false) //
const currentStep = ref<number>(props.currentProgress)
const flowMaps = ref<any[]>();
//
const gainRunFlowTask = () =>{
flowLoading.value = true
let sendInfo = {
id:props.flowKey
}
gainRunTaskFlow(sendInfo)
.then((data:any) =>{
console.log("获取流程----->",data)
flowMaps.value = data.data.flowList
flowOpinion.value = data.data.operational
currentStep.value = data.data.current_step
emits("update:flowary", data.data.flowList);
})
.finally(()=>{
flowLoading.value = false
})
}
//
onBeforeMount(()=>{
gainRunFlowTask();
})
//
onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
console.log("获取流程----1111->",val.judgelist)
if(val.judgelist){
return true
}
return false
}
let zhiXingStep = 1;
//
const addPeople = (val:any) =>{
zhiXingStep = val.step
presetPersonnel.value = val.pendpers
selectedPeople.value = val.operator
if(val.runscope == 1){
openclosebox.value = true
}else{
openOrClose.value = true
}
}
//
const updateNode = (val:any) =>{
if(flowMaps.value&& flowMaps.value.length > 0){
flowMaps.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
item.operator = val
}
})
}
}
const sendFlowInfo = ref<string>() //
//
const yesOrNo = (val:string,agreeOrRefuse:number) =>{
console.log("提交审批----1111->",val,agreeOrRefuse,sendFlowInfo.value)
let sendInfo = {
id:props.flowKey,
agreeOrRefuse:agreeOrRefuse,
suggest:sendFlowInfo.value,
flowlist:flowMaps.value
}
submitApprovalResults(sendInfo)
.then((data:any)=>{
// console.log("----22222->",data)
ElMessage({
message: '处理完成!',
type: 'success'
})
})
.finally(()=>{
gainRunFlowTask();
emits("updatelist");
})
}
defineExpose({gainRunFlowTask})
</script>
<template>
<div class="drawerFormBox boxRight">
<div class="flowBox">
<!-- <el-affix :offset="20" style="width:100%">
<el-text size="large">审批流程</el-text>
</el-affix> -->
<el-steps v-loading="flowLoading" element-loading-text="Loading..." direction="vertical" :active="currentStep">
<el-step v-for="item in flowMaps" :key="item.step">
<template #title>
{{ item.nodeName }}<span v-if="item.examinemode==1"> 依次审批</span><span v-if="item.examinemode==2"> 会签</span><span v-if="item.examinemode==3"> 或签</span>
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">
<el-avatar v-if="items.iconbase64==''&&items.icon!=''" shape="square" fit="cover" :src="items.icon" />
<el-avatar v-else-if="items.iconbase64!=''" shape="square" fit="cover" :src="items.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td valign="top" align="left">
<el-row>
<el-col :span="24">
<el-text>{{ items.departmentname }}</el-text>
<el-text><span v-if="items.departmentname"> - </span>{{ items.postname }}</el-text>
<el-text><span v-if="items.departmentname||items.postname"> - </span>{{ items.name }}</el-text>
</el-col>
<el-col :span="24">
<ul>
<li v-for="(logItem,logIndex) in items.log" :key="logIndex" class="logLi">
<el-text v-if="logItem.state==2" type="success">
<span v-if="logItem.cause">{{logItem.cause}}</span><span v-else>已同意</span>
</el-text>
<el-text v-else-if="logItem.state==3" type="danger">
<span v-if="logItem.cause">{{logItem.cause}}</span><span v-else>已驳回</span>
</el-text>
<el-text v-else-if="logItem.state==4" type="primary">
<span v-if="logItem.cause">{{logItem.cause}}</span><span v-else>已查看</span>
</el-text>
<el-text v-else>
<span v-if="logItem.cause">{{logItem.cause}}</span><span v-else>未操作</span>
</el-text> · {{ logItem.time }}
</li>
</ul>
</el-col>
</el-row>
</td>
</tr>
<tr>
<td>
<div v-if="item.judgelist" class="addUser" @click="addPeople(item)">
<svg-icon icon-class="addxuxian" size="50" />
</div>
</td>
<td></td>
</tr>
</table>
</template>
</el-step>
</el-steps>
</div>
<el-affix v-if="flowOpinion" position="bottom" :offset="0">
<div class="approvalBoard">
<el-text size="large" class="appBoardTitle">审批意见</el-text>
<el-row :gutter="20">
<el-col :span="24">
<el-input
v-model="sendFlowInfo"
:autosize="{ minRows: 2, maxRows: 6 }"
type="textarea"
placeholder="请输入审批意见"
/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4"></el-col>
<el-col :span="8" class="juzhong"><el-button type="primary" style="width:100%" @click="yesOrNo(props.flowKey,1)">同意</el-button></el-col>
<el-col :span="8" class="juzhong"><el-button type="danger" style="width:100%" @click="yesOrNo(props.flowKey,2)">驳回</el-button></el-col>
<el-col :span="4"></el-col>
</el-row>
</div>
</el-affix>
<OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" />
<OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" />
</div>
</template>
<style lang='scss' scoped>
.drawerFormBox{
width: 100%;
height: 100%;
}
.boxRight{
overflow: hidden;
overflow-y: auto;
border-left: 1px solid #EEEEEE;
}
.flowBox{
width: 100%;
padding: 0 5px 0 10px;
}
.approvalBoard{
padding: 5px 10px;
background-color: #FFFFFF;
border-top: 1px solid #EEEEEE;
.juzhong{
padding: 10px 0;
text-align: center;
}
.appBoardTitle{
padding: 5px 0 10px 0;
display: block;
}
}
</style>

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

@ -97,6 +97,8 @@ const drawerOpenOrClose = computed({
},
});
const isFlowTable = ref(false)
//
const getTaskFormData = () =>{
loadingData.value = true;
@ -111,6 +113,13 @@ const getTaskFormData = () =>{
}else{
isFlowForm.value = false;
}
if(data.flowIsOpen == 1 && data.flowkeystr != "0"){
isFlowTable.value = true;
}else{
isFlowTable.value = false;
}
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
@ -124,7 +133,7 @@ const getTaskFormData = () =>{
})
nextTick(() => {
//
if(data.flowIsOpen == 1 && gainFlowChart.id != "0"){
generateFlow(gainFlowChart)
.then((datagen:any) =>{
console.log("获取工作流不进图",datagen.data)
@ -132,7 +141,13 @@ const getTaskFormData = () =>{
console.log("获取工作流不进图--->",flowMap.value)
formLoading.value = false
})
}
console.log("获取工作流不进图",data.flowIsOpen,gainFlowChart)
//
})
})
.finally(()=>{
loadingData.value = false;
@ -435,7 +450,7 @@ const sendFlowInfo = ref<any>()
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<table border="0" v-if="isFlowForm" class="tableFlowBox">
<table border="0" v-if="isFlowTable" class="tableFlowBox">
<tr>
<td valign="top">
<div class="drawerFormBox boxLeft">

Loading…
Cancel
Save