Browse Source

修改显示页面

power_master
herenshan112 2 months ago
parent
commit
dfd362d66d
  1. 2
      src/api/DesignForm/type.ts
  2. 5
      src/api/taskapi/types.ts
  3. 47
      src/components/DesignForm/app/index.vue
  4. 3
      src/components/DesignForm/public/form/form.vue
  5. 4
      src/components/DesignForm/public/form/formGroup.vue
  6. 4
      src/components/DesignForm/public/form/formItem.vue
  7. 67
      src/components/DesignForm/public/form/newForm.vue
  8. 10
      src/components/DesignForm/tableListPage/formPageCont.vue
  9. 2
      src/components/DesignForm/tableListPage/formPageContApp.vue
  10. 634
      src/components/DesignForm/tableListPage/newFormPageCont.vue
  11. 9
      src/utils/request.ts
  12. 222
      src/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue
  13. 11
      src/views/sysworkflow/lowcodepage/runApp/regularPage/completedMattersPage.vue
  14. 87
      src/views/sysworkflow/lowcodepage/runApp/regularPage/myCreate.vue
  15. 13
      src/views/sysworkflow/lowcodepage/runApp/regularPage/myToDoPage.vue
  16. 7
      src/views/sysworkflow/lowcodepage/runApp/regularPage/sendCopy.vue
  17. 2
      src/views/taskplatform/taskmanagement/lookFlowInfoApp.vue
  18. 523
      src/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue
  19. 465
      src/views/taskplatform/taskmanagement/runNewFlowStep.vue

2
src/api/DesignForm/type.ts

@ -152,6 +152,8 @@ export interface hanziToPinyin{
//获取工作流步进节点 //获取工作流步进节点
export interface nodeFlow extends enableVersionId{ export interface nodeFlow extends enableVersionId{
conditionList?:conditionInfo[] conditionList?:conditionInfo[]
nodelPeople?:any[]
oldFlow?:any
} }
export interface conditionInfo{ export interface conditionInfo{
factorid:string; factorid:string;

5
src/api/taskapi/types.ts

@ -45,6 +45,8 @@ export interface customerFormLogo{
} }
//自定义表单版本内容 //自定义表单版本内容
export interface customerFormVersionCont{ export interface customerFormVersionCont{
structure: any;
tableData: any;
id:number; id:number;
tablekey:string; tablekey:string;
version:number; version:number;
@ -62,7 +64,8 @@ export interface customerFormVersionCont{
//获取工作流步进节点 //获取工作流步进节点
export interface nodeFlow extends customerFormLogo{ export interface nodeFlow extends customerFormLogo{
conditionList?:conditionInfo[]; conditionList?:conditionInfo[];
nodelPeople?:nodelPeoples[] nodelPeople?:nodelPeoples[];
oldFlow?:any
} }
export interface nodelPeoples { export interface nodelPeoples {
factorid?:string; factorid?:string;

47
src/components/DesignForm/app/index.vue

@ -47,6 +47,8 @@ import {printHtmlPage} from '../printHtmlRender.js'
// //
import FormPageCont from "@/components/DesignForm/tableListPage/formPageCont.vue"; import FormPageCont from "@/components/DesignForm/tableListPage/formPageCont.vue";
import NewFormPageCont from "@/components/DesignForm/tableListPage/newFormPageCont.vue";
import NewTableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue"; import NewTableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue";
@ -1780,7 +1782,16 @@ const asflookPageInfoIsShow = ref(false);
const pageInfoCont = ref<any>(); const pageInfoCont = ref<any>();
const lookPageInfo = (val: any) => { const lookPageInfo = (val: any) => {
tablePageClass.value = 4; console.log("查看详细内容--------------------------->");
console.log(val);
console.log("查看详细内容--------------------------->");
tablePageClass.value = 3;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
@ -1796,6 +1807,11 @@ const editInfo = (val: any) => {
// console.log('!',val) // console.log('!',val)
operState.value = 5; operState.value = 5;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
@ -1808,6 +1824,11 @@ const editInfo = (val: any) => {
const submitApproval = (val: any) => { const submitApproval = (val: any) => {
operState.value = 4; operState.value = 4;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
@ -1856,6 +1877,11 @@ const recallSendMsg = (val: any) => {
const afreshSendFlow = (val: any) => { const afreshSendFlow = (val: any) => {
operState.value = 2; operState.value = 2;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
@ -1868,6 +1894,11 @@ const afreshSendFlow = (val: any) => {
const editFormSendFlow = (val: any) => { const editFormSendFlow = (val: any) => {
operState.value = 3; operState.value = 3;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
@ -2690,15 +2721,27 @@ const getNonValue = () => {
</el-button-group> </el-button-group>
</el-col> </el-col>
</el-row> </el-row>
<FormPageCont
<NewFormPageCont
v-model:is-show="lookPageInfoIsShow" v-model:is-show="lookPageInfoIsShow"
:drawer-with="drawerWith" :drawer-with="drawerWith"
:page-info="pageInfoCont" :page-info="pageInfoCont"
:table-page-class="tablePageClass" :table-page-class="tablePageClass"
:oper-state="operState" :oper-state="operState"
:dprt="rangedDatePickerInTables1" :dprt="rangedDatePickerInTables1"
:versiontitle="props.versiontitle"
@get-page-data="getPageData" @get-page-data="getPageData"
/> />
<!-- <FormPageCont
v-model:is-show="lookPageInfoIsShow"
:drawer-with="drawerWith"
:page-info="pageInfoCont"
:table-page-class="tablePageClass"
:oper-state="operState"
:dprt="rangedDatePickerInTables1"
@get-page-data="getPageData"
/> -->
<FormPageCont <FormPageCont
v-model:is-show="asflookPageInfoIsShow" v-model:is-show="asflookPageInfoIsShow"
:drawer-with="drawerWith" :drawer-with="drawerWith"

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

@ -3144,7 +3144,7 @@ const submitEditButton = (params = {}) => {
if (submitParams === false) { if (submitParams === false) {
return; return;
} }
// console.log("",apiUrl,submitParams,formatParams) console.log("提交修改数据",apiUrl,submitParams,formatParams)
// //
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams) currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => { .then((res: any) => {
@ -3248,6 +3248,7 @@ const webPage = computed({
class="pcBox" class="pcBox"
:class="{ boxAI: type != 5 && currentAgent.length > 0 }" :class="{ boxAI: type != 5 && currentAgent.length > 0 }"
> >
<Aiassist <Aiassist
ref="aiassistRef" ref="aiassistRef"
v-if="type != 5 && currentAgent.length > 0" v-if="type != 5 && currentAgent.length > 0"

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

@ -849,7 +849,9 @@ const judgaButClass = (btnClass:string):string => {
}" }"
@add="draggableAdd" @add="draggableAdd"
> >
<template #item="{ element, index }"> <template #item="{ element, index }">
<div <div
class="group" class="group"
:class="{ :class="{
@ -1028,7 +1030,7 @@ const judgaButClass = (btnClass:string):string => {
> >
<td :style="getFormItemLableStyle(element.styles)"> <td :style="getFormItemLableStyle(element.styles)">
{{ element.control?.label }}{{ element.control?.type }} {{ element.control?.label }}
</td> </td>
</el-button> </el-button>
</div> </div>

4
src/components/DesignForm/public/form/formItem.vue

@ -1114,6 +1114,7 @@ const diGuiJilian = (val: any, options: any[]) => {
</script> </script>
<template> <template>
<BaiduMap <BaiduMap
v-if="judgeIsShow(data.name) && data.type === 'baidumap' && type != 4" v-if="judgeIsShow(data.name) && data.type === 'baidumap' && type != 4"
:data="data" :data="data"
@ -1226,7 +1227,7 @@ const diGuiJilian = (val: any, options: any[]) => {
</template> </template>
<template #label v-else> <template #label v-else>
<span :style="getFormItemLableStyle(configStyle)">{{ getLabel(data.item) }}</span> <span :style="getFormItemLableStyle(configStyle)">{{ getLabel(data.item) }}</span>
{{ editDisabled }}
</template> </template>
<template class="form-value" v-if="type === 4"> <template class="form-value" v-if="type === 4">
<div <div
@ -1342,6 +1343,7 @@ const diGuiJilian = (val: any, options: any[]) => {
:form-table-set-up="props.alldata" :form-table-set-up="props.alldata"
v-model="value" v-model="value"
/> />
<div class="form-value" v-else v-html="value"></div> <div class="form-value" v-else v-html="value"></div>
</template> </template>
<template v-else> <template v-else>

67
src/components/DesignForm/public/form/newForm.vue

@ -25,12 +25,13 @@ import formatResult from "@/utils/DesignForm/formatResult";
import formChangeValue from "@/utils/DesignForm/formChangeValue"; import formChangeValue from "@/utils/DesignForm/formChangeValue";
import { jsonParseStringify } from "@/utils/DesignForm"; import { jsonParseStringify } from "@/utils/DesignForm";
// //
import { currencyFormApiSubmit } from "@/api/taskapi/management"; import { currencyFormApiSubmit,gainEditDataLog } from "@/api/taskapi/management";
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
drawTitle: string; drawTitle: string;
formData: FormData | any; formData: FormData | any;
masters_key?: string;
type?: number; // 123 4 5 type?: number; // 123 4 5
numrun?: number; //11 numrun?: number; //11
disabled?: boolean; // disabled?: boolean; //
@ -95,6 +96,7 @@ const props = withDefaults(
groupid: "", groupid: "",
signCode: "", signCode: "",
mastesformjson: "", mastesformjson: "",
masters_key: "",
} }
); );
const emits = defineEmits<{ const emits = defineEmits<{
@ -107,6 +109,7 @@ const emits = defineEmits<{
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const loading = ref(false); const loading = ref(false);
const pageLog = ref<any[]>([]);
let timer = 0; let timer = 0;
let eventName = ""; let eventName = "";
let getValueEvent = ""; let getValueEvent = "";
@ -177,7 +180,12 @@ const getInitModel = () => {
const obj = {}; const obj = {};
forEachGetFormModel(props.formData.list, obj); forEachGetFormModel(props.formData.list, obj);
// console.log("obj===>",obj)
gainEditDataLog({ id: props.masters_key.toString() }).then((data:any) => {
console.log("obj==11111111111111111=>",data)
pageLog.value = data.data;
})
// console.log("obj===>",props.formData.list) // console.log("obj===>",props.formData.list)
model.value = obj; model.value = obj;
}; };
@ -2998,6 +3006,7 @@ const draftSubmit = (params = {}) => {
// //
return; return;
} }
validate((valid: boolean, fields: any) => { validate((valid: boolean, fields: any) => {
if (valid) { if (valid) {
const formatParams = Object.assign({}, fields, params); const formatParams = Object.assign({}, fields, params);
@ -3034,6 +3043,8 @@ const draftSubmit = (params = {}) => {
}; };
const sendDraftSubmit = (type: string, res: any) => { const sendDraftSubmit = (type: string, res: any) => {
const sendDraftSubmit = props.formData.events?.sendDraftSubmit; const sendDraftSubmit = props.formData.events?.sendDraftSubmit;
let notReturn; let notReturn;
if (typeof sendDraftSubmit === "function") { if (typeof sendDraftSubmit === "function") {
@ -3049,7 +3060,7 @@ const sendDraftSubmit = (type: string, res: any) => {
return; return;
} }
if (type === "success") { if (type === "success") {
ElMessage.success(res.msg || "提交成功!"); ElMessage.success(res.msg || "提交成功111111111111111111!");
} else if (type === "fail") { } else if (type === "fail") {
ElMessage.error(res.message || "提交失败!"); ElMessage.error(res.message || "提交失败!");
} }
@ -3213,6 +3224,56 @@ const webPage = computed({
:org-and-man-tree="rangedUserTrees1" :org-and-man-tree="rangedUserTrees1"
/> />
</el-form> </el-form>
<el-divider v-if="pageLog && pageLog.length > 0" content-position="left">历史记录</el-divider>
<el-timeline style="width: 90%; margin: 0 auto">
<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="mastItem.label"
:label="mastItem.label"
>
{{ mastItem.label }}
</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"
:key="sonIndex"
:label="sonIndex.toString()"
>
<el-descriptions
v-for="(sonVal, sonIndex) in sonItem"
:key="sonIndex"
border
>
<el-descriptions-item
v-for="(sonCentor, sonKey) in sonVal"
:key="sonKey"
:label="sonKey.toString()"
>
{{ sonCentor }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
<table style="margin: 20px">
<tr>
<td class="biankuang" width="100">修改说明</td>
<td class="biankuang">{{ item.explicate }}</td>
</tr>
</table>
</el-card>
</el-timeline-item>
</el-timeline>
</el-scrollbar> </el-scrollbar>

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

@ -74,7 +74,7 @@ const emits = defineEmits(["update:isShow", "getPageData", "optionsValue4Get4"])
const formLoading = ref(false); const formLoading = ref(false);
const flowAry = ref<any[]>(); // const flowAry = ref<any[]>(); //
const currentProgress = ref<number>(1); // const currentProgress = ref<number>(1); //
const runstep = ref(null); const runstep = ref();
const nodeKey = ref<string>(""); const nodeKey = ref<string>("");
const currterNodePower = ref<nodePoweInfo[]>([]) const currterNodePower = ref<nodePoweInfo[]>([])
@ -148,9 +148,11 @@ watch(
if (props.tablePageClass != 4) { if (props.tablePageClass != 4) {
judgeSubmitCancel({ name: stringObjMastesform }).then((data: any) => { judgeSubmitCancel({ name: stringObjMastesform }).then((data: any) => {
console.log("添加按钮处理--->",data,data.data.buttonIsTrue )
if (data.code == 0) { if (data.code == 0) {
if (data.data == 3 || data.data == 4) { if (data.data.buttonIsTrue == 3 || data.data.buttonIsTrue == 4) {
// formState.formData.list.push(submitButtonEs) // formState.formData.list.push(submitButtonEs)
console.log("添加按钮处理--111111->",data,props.operState)
if (props.operState == 2) { if (props.operState == 2) {
formState.formData.list.push(afreshSubmitButton); formState.formData.list.push(afreshSubmitButton);
} else if (props.operState == 3) { } else if (props.operState == 3) {
@ -158,10 +160,12 @@ watch(
} else if (props.operState == 4) { } else if (props.operState == 4) {
formState.formData.list.push(draftSubmitButton); formState.formData.list.push(draftSubmitButton);
} else if (props.operState == 5) { } else if (props.operState == 5) {
console.log("添加按钮处理--2222->",data,props.operState)
formState.formData.list.push(submitButtonEs); formState.formData.list.push(submitButtonEs);
} }
} }
} }
console.log("添加按钮处理-wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww-->",formState.formData.list,submitButtonEs)
}); });
} }
nextTick(() => { nextTick(() => {
@ -176,7 +180,7 @@ watch(
}); });
formLoading.value = false; formLoading.value = false;
//alert(props.pageInfo.masters_key) //alert(props.pageInfo.masters_key)
gainEditDataLog({ id: props.pageInfo.masters_key }).then(({ data }) => { gainEditDataLog({ id: props.pageInfo.masters_key.toString() }).then(({ data }) => {
//console.log(formState.formData.list) //console.log(formState.formData.list)
//console.log("-1111-->",data) //console.log("-1111-->",data)

2
src/components/DesignForm/tableListPage/formPageContApp.vue

@ -128,7 +128,7 @@ const getCustomrrFormInfo = () => {
}) })
.finally(()=>{ .finally(()=>{
formLoading.value = false; formLoading.value = false;
gainEditDataLog({id:props.pageInfo.mastersKeyStr}) gainEditDataLog({id:props.pageInfo.mastersKeyStr.toString()})
.then(({data})=>{ .then(({data})=>{
// console.log("-1111-->",data) // console.log("-1111-->",data)
pageLog.value = data pageLog.value = data

634
src/components/DesignForm/tableListPage/newFormPageCont.vue

@ -0,0 +1,634 @@
<!--
@ 作者: 秦东
@ 时间: 2026-01-30 16:42:49
@ 备注: 112312
-->
<script lang='ts' setup>
import { afreshRunWorkflow, draftsInitiateApproval, gainEditDataLog, gainTaskFormInfo } from '@/api/taskapi/management';
import { string2json, stringToObj } from '@/utils/DesignForm/form';
import { constAiEffect } from "@/api/DesignForm/utils";
import { customerFormVersionCont, nodePoweInfo } from "@/api/taskapi/types";
import RunFlowStep from "@/views/taskplatform/taskmanagement/runNewFlowStep.vue";
import AiPage from "@/views/sysworkflow/lowcodepage/pageFlow/aiPage.vue";
import { getFieldRecord, judgeSubmitCancel } from '@/api/DesignForm/requestapi';
import { afreshSubmitButton, draftSubmitButton, editFormCont } from '@/utils/workflow/const';
import { submitButtonEs } from '@/api/DesignForm/tableButton';
const props = defineProps({
isShow: {
type: Boolean,
default: false
},
drawerWith: {
type: Number,
default: 0,
},
pageInfo: {
type: Object,
default() {
return {};
},
},
tablePageClass: {
type: Number,
default: 1,
},
operState: {
type: Number,
default: 1,
},
dprt: {
type: Object,
default() {
return {};
},
},
versiontitle: {
type: String,
default: "",
}
})
const drawTitle = computed(() => props.versiontitle)
const drawBodyWidth = ref(props.drawerWith)
const emits = defineEmits(["update:isShow", "getPageData", "optionsValue4Get4"]);
const drawLoading = ref(false)
const aiConfigArea =ref(false) //AI
const isFlowTable = ref(false); //
let gainTaskFormInfoPromise: any[] = [];
const runstep = ref();
const flowAry = ref<any[]>(); //
const currentProgress = ref<number>(1); //
//
const formState = reactive<any>({
formData: {
list: [],
form: {},
config: {},
powerstr: {},
aiConfig:[]
},
dict: {},
formId: props.pageInfo.id,
id: 1,
loading: true,
type: props.tablePageClass,
});
let gainTaskFormInfoData: customerFormVersionCont;
const currterNodePower = ref<nodePoweInfo[]>([])
const openOrClose = computed({
get: () => {
return props.isShow
},
set: (val) => {
emits("update:isShow", val);
drawBodyWidth.value = 0;
},
});
const nodeKey = ref<string>("");
//-----------------------AI setting--------------------------
//AIform
//params subparams ; rowdex:
const currentAgent = ref<
{
model: boolean;
name: string;
rowdex:number,
uuid: string[];
fields: string[];
trigger: number;
params: { [key: string]: any };
subparams:{[key: string]: any}[];
}[]
>([]);
const aiassistRef = ref();
//AI
provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
//ai_envents
const ai_events: Array<{ uuids: string[]; params: { [key: string]: any } }> = [];
currentAgent.value.forEach(ag=>{
if(ag.fields.includes(key)){ //trigger: 1: 2 3
if (rowdex!=null){//
ag.rowdex=rowdex //rowdex
if(rowdex>=ag.subparams.length){
ag.subparams.push({[field]:value})
}else{
ag.subparams[rowdex][field]=value
}
}else{ //, params
ag.params[field]=value; //keyfieldName
}
let mergedObj;
if(ag.subparams.length>0){
mergedObj = Object.assign({}, ag.params, ag.subparams[ag.rowdex]); //
}else{
mergedObj = ag.params
}
switch(ag.trigger){
case 2:
if(Object.keys(mergedObj).length>=ag.fields.length/2){
ai_events.push({uuids:ag.uuid,params:mergedObj })
}
break;
case 3:
if(Object.keys(mergedObj).length==ag.fields.length){
ai_events.push({uuids:ag.uuid,params:mergedObj})
}
break;
default:
ai_events.push({uuids:ag.uuid,params:mergedObj})
}
}
})
if(ai_events.length>0){
aiassistRef.value.onSendParamToAI(ai_events)
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:33:15
@ 功能: 获取自定义表单内容
*/
const getCustomrrFormInfo = () => {
gainTaskFormInfoPromise.push(
gainTaskFormInfo({ id: props.pageInfo.masters_key,runFlowId: props.pageInfo.runFlowId })
.then(({ data }) => {
let extraW=0;
console.log("获取自定义表单内容--->",data)
formState.formData = stringToObj(data.structure.mastesform);
console.log("获取自定义表单内容--state.formData->1", formState.formData);
if(isFlowTable.value){
extraW = 320
}
if(formState.formData&&formState.formData.aiConfig&&formState.formData.aiConfig.length>0){
aiConfigArea.value=true
formState.formData.aiConfig?.forEach((item: { library: any; title: any; trigger: any; }) => {
currentAgent.value.push({
name: "test",
model: false,
rowdex:0,
uuid: item.library,
fields: item.title,
trigger: item.trigger,
params: {},
subparams:[]
});
});
}
if(aiConfigArea.value){
extraW = extraW + 320
}
console.log("获取自定义表单内容--drawBodyWidth.value->2", drawBodyWidth.value);
if (aiConfigArea.value && isFlowTable.value){
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
drawBodyWidth.value = drawBodyWidth.value + extraW
}else{
drawBodyWidth.value = drawBodyWidth.value
}
props.dprt.forEach((element: any[]) => {
let tableName = element[0]
let datePickerName = element[1]
data.tableData[tableName].forEach((item: any) => {
let arr = []
arr.push(item[datePickerName])
arr.push(item[datePickerName+"_end"])
item[datePickerName] = arr
})
})
gainTaskFormInfoData = data;
nodeKey.value = data.nodeKey?data.nodeKey:"";
if(data.structure.powerAry && Array.isArray(data.structure.powerAry) && data.structure.powerAry.length > 0){
currterNodePower.value = data.structure.powerAry
}
console.log("获取自定义表单内容--props.tablePageClass->2", props.tablePageClass);
if(props.tablePageClass != 4){
judgeSubmitCancel({"name":data.structure.mastesformjson})
.then((data:any) =>{
console.log("获取自定义表单内容--props.tablePageClass->data", data);
if(data.code == 0){
if (data.data.buttonIsTrue == 3 || data.data.buttonIsTrue == 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(() => {
})
)
}
const formLoading = ref(false);
// props.drawerWithdrawBodyWidth
watch(() => props.drawerWith, (newVal) => {
drawBodyWidth.value = newVal;
});
let objMastesform: any;
let getFieldRecordPromises: any[] = [];
let transferDetails: any = [];
const formEl = ref<any>();
// props.isShowisShowtruedrawBodyWidth
watch(() => props.isShow, (newVal) => {
if (newVal) {
if(props.pageInfo.flowIsOpens == 1){
isFlowTable.value = true
}else{
isFlowTable.value = false
}
drawBodyWidth.value = props.drawerWith;
getCustomrrFormInfo();
}
});
interface TreeNode {
id: string;
label: string;
disabled: boolean;
children: TreeNode[];
}
const pageLog = ref<any[]>([]);
function mapIdsToLabels(treeNodes: TreeNode[], ids1: string): string[] {
/* console.log(treeNodes)
console.log(ids1) */
const ids: string[] = JSON.parse(ids1);
// idlabel
const idToLabelMap: Record<string, string> = {};
//
function traverse(node: TreeNode) {
idToLabelMap[node.id] = node.label; //
node.children.forEach((child) => traverse(child)); //
}
//
treeNodes.forEach((root) => traverse(root));
//console.log(ids)
// idlabel
return ids.map((id) => idToLabelMap[id]);
}
//
const drawerBeforeClose = () => {
// console.log("",false)
// emits("getmytodolist")
// emits("update:isshow", false);
};
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:49:09
@ 功能: 表单前置数据
*/
const beforeSubmit = (params: any) => {
// params.formId = props.versionid;
// params.id = "";
// emits("update:isopen", false);
return params;
};
/**
@ 作者: 秦东
@ 时间: 2024-04-07 10:55:34
@ 功能: 表单动作回调
*/
const afterSubmit = (type: string) => {
// console.log("")
if (type === "success") {
// router.go(-1)
// console.log("")
emits("getPageData");
closeAppSubmit();
}
};
//
const changeKeyVal = (key: any, val: any, type: any, attribute: any) => {
}
//
const anewSubmit = (type: string, val?: any) => {
// console.log("-11--<",type,val)
if (type == "success") {
afreshRunWorkflow({ id: val.data.runFlowId })
.then((data: any) => {
// console.log("---<",data,runstep.value)
runstep.value.gainRunFlowTask();
})
.finally(() => {
emits("getPageData");
closeAppSubmit();
});
}
};
//稿()
const saveEditFormInfo = (type: string, val?: any) => {
// console.log("稿--1-<",type,val)
if (type == "success") {
runstep.value.gainRunFlowTask();
emits("getPageData");
closeAppSubmit();
}
};
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:01
@ 功能: 关闭操作
*/
const closeAppSubmit = () => {
emits("update:isShow", false)
};
//
const sendDraftSubmit = (type: string, val?: any) => {
console.log("提交审批",type,val)
console.log(new Error("请在表单设计处配置接口事件url或选择数据源或设置props11111"));
// emits("getmytodolist")
if (type === "success") {
console.log("草稿提交审批--2-<",props.pageInfo )
if (props.pageInfo.flowIsOpens == 1) {
let sendInfo = {
id: val.data.runFlowId,
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");
closeAppSubmit();
}
});
}
}
};
function optionsValue3Get3(data: any, fieldName: any) {
//console.log("formPageCont","optionsValue3Get3")
emits("optionsValue4Get4", data, fieldName);
}
//
const submitEdit = (type: string, val?: any) => {
// console("----->",type,val)
if (type == "success") {
runstep.value.gainRunFlowTask();
emits("getPageData");
closeAppSubmit();
}
};
// onMounted(() => {
// getCustomrrFormInfo();
// })
</script>
<template>
<div v-if="openOrClose" class="drawerClass">
<el-drawer
v-model="openOrClose"
:title="drawTitle"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
:size="drawBodyWidth"
:close="closeAppSubmit"
>
<template #header>
<div class="drawHeader">
<el-text size="large">{{ drawTitle }}</el-text>
</div>
</template>
<div v-loading="drawLoading" :class="aiConfigArea&&isFlowTable?'drawBody treePage':(aiConfigArea&&!isFlowTable)?'drawBody twoPageAi':(!aiConfigArea&&isFlowTable)?'drawBody twoPageFlow':'drawBody'">
<!-- {{ formState.formData }} -->
<AiPage
v-if="formState.type != 5 && aiConfigArea"
ref="aiassistRef"
:agent="currentAgent"
/>
<AppForm
ref="formEl"
:draw-title="drawTitle"
:form-data="formState.formData"
:masters_key="props.pageInfo.masters_key"
:type="props.tablePageClass"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
:anew-submit="anewSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit="sendDraftSubmit"
:submit-edit="submitEdit"
@options-value3-get3="optionsValue3Get3"
/>
<RunFlowStep
v-if="isFlowTable"
ref="runstep"
v-model:flowary="flowAry"
:flow-key="props.pageInfo.runFlowId"
:current-progress="currentProgress"
@updatelist="drawerBeforeClose"
/>
</div>
</el-drawer>
</div>
</template>
<style lang='scss' scoped>
.drawerClass{
:deep .el-drawer__header{
border-bottom: 1px solid #ECECEC;
}
}
.drawHeader {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.drawBody{
width: 100%;
height: 100%;
padding: 10px 10px;
:deep .el-card{
border-radius: 15px;
}
:deep .el-card__header{
padding: 15px 15px;
}
:deep .el-card__body{
padding: 0;
}
:deep .el-card__footer{
padding: 10px 10px;
}
}
.twoPageAi{
display: grid;
grid-template-columns: minmax(150px, 250px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.twoPageFlow{
display: grid;
grid-template-columns: 1fr minmax(150px, 250px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 250px) 1fr minmax(150px, 250px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.svgBox{
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
}
.card-header{
font-size: 1.4rem;
font-weight: 700;
color: #0020C2;
display: flex;
align-items: center;
gap: 10px;
}
.scroBox{
padding: 10px 15px;
height: calc(100vh - 200px);
}
.formBody{
width: 100%;
overflow-x: auto;
}
.flowBody{
padding: 10px 15px;
height: calc(100vh - 260px);
}
.bootemWorkFlow{
width: 100%;
text-align: center;
.bootemWorkFlowBut{
width: 100%;
padding: 10px 0;
text-align: center;
}
}
.btn {
padding: 14px 16px;
border-radius: 10px;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s;
border: none;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 32, 194, 0.15);
}
.approve-btn {
background: linear-gradient(135deg, #00cc66, #33dd88);
color: white;
}
.reject-btn {
background: linear-gradient(135deg, #ff3366, #ff5588);
color: white;
}
.bootemAi{
display: grid;
grid-template-columns: 1fr 50px; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
:deep .el-input__wrapper{
border-radius: 10px;
}
}
.ai-send-btn {
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
border: none;
width: 46px;
border-radius: 10px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
}
.ai-send-btn:hover {
background: linear-gradient(135deg, #0019a0, #3a5aff);
transform: translateY(-2px);
}
.ai-conversation {
flex: 1;
display: flex;
flex-direction: column;
gap: 15px;
margin-bottom: 20px;
}
.message {
padding: 12px 16px;
border-radius: 12px;
max-width: 90%;
line-height: 1.5;
}
.user-message {
background: #eef2ff;
align-self: flex-end;
border-top-right-radius: 4px;
border: 1px solid rgba(0, 32, 194, 0.2);
}
.ai-message {
background: linear-gradient(to right, #f0f5ff, #ffffff);
align-self: flex-start;
border-top-left-radius: 4px;
border: 1px solid rgba(0, 32, 194, 0.1);
}
</style>

9
src/utils/request.ts

@ -60,9 +60,10 @@ service.interceptors.request.use(
} }
// console.error('请求拦截---------->', randomString) // console.error('请求拦截---------->', randomString)
// console.error('请求拦截----headers------>', headers) // console.error('请求拦截----headers------>', headers)
// console.error('请求拦截----data------>', config.data) console.log('请求拦截----config---url--->', config.url)
console.log('请求拦截----data------>', data)
// console.error('请求拦截----config------>', config) // console.error('请求拦截----config------>', config)
// console.error('请求拦截----config---url--->', config.url)
// console.log('请求拦截----content-type------>', config.headers['Content-Type']) // console.log('请求拦截----content-type------>', config.headers['Content-Type'])
// console.log('请求拦截----config------>', config.headers) // console.log('请求拦截----config------>', config.headers)
return config return config
@ -81,13 +82,13 @@ service.interceptors.response.use(
let { data, headers } = response let { data, headers } = response
let authKey = headers['auth-key'] let authKey = headers['auth-key']
// console.log('行营结果----authKey------>', authKey) // console.log('行营结果----data------>', data)
// 解密响应数据 // 解密响应数据
if (authKey) { if (authKey) {
let jsonData = sm4DecryptMethod(data.data, authKey) let jsonData = sm4DecryptMethod(data.data, authKey)
response.data.data = JSON.parse(jsonData) response.data.data = JSON.parse(jsonData)
} }
// console.error('行营结果----解密结构------>', response.data) console.log('行营结果----解密结构------>', response.data)
const { code, msg } = response.data; const { code, msg } = response.data;
if (code === 0 || code === 200 || code === 10001) { if (code === 0 || code === 200 || code === 10001) {
return response.data; return response.data;

222
src/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue

@ -19,7 +19,7 @@ import {
submitButton, submitButton,
afreshSubmitButton, afreshSubmitButton,
} from "@/utils/workflow/const"; } from "@/utils/workflow/const";
import { nodePoweInfo } from "@/api/taskapi/types"; import { nodelPeoples, nodePoweInfo } from "@/api/taskapi/types";
import request from "@/utils/request"; import request from "@/utils/request";
import SvgIcon from "@/components/SvgIcon/index.vue"; import SvgIcon from "@/components/SvgIcon/index.vue";
import FlowStep from "@/views/sysworkflow/lowcodepage/pageFlow/flowStep.vue"; import FlowStep from "@/views/sysworkflow/lowcodepage/pageFlow/flowStep.vue";
@ -60,6 +60,8 @@ const flowMap = ref<any[]>(); //工作流
const flowFactor = reactive<conditionInfo[]>([]); // const flowFactor = reactive<conditionInfo[]>([]); //
const pageType = ref<number>(1) const pageType = ref<number>(1)
const aiConfigArea =ref(false) const aiConfigArea =ref(false)
const formLoading = ref(false); //loading
const flowLoading = ref(false); //loading
const drawLoading = ref(false) const drawLoading = ref(false)
const isFlowTable = ref(false); // const isFlowTable = ref(false); //
const openOrClose = computed({ const openOrClose = computed({
@ -77,6 +79,8 @@ const currentProgress = ref<number>(1);
const pageBody = ref("") const pageBody = ref("")
const drawTitle = computed(() => props.versiontitle) const drawTitle = computed(() => props.versiontitle)
let qrCodeImgInside = ""; let qrCodeImgInside = "";
const appInitData = ref<appPageDataInit>(); const appInitData = ref<appPageDataInit>();
const mastesformjson = ref(""); // const mastesformjson = ref(""); //
@ -85,10 +89,13 @@ const versionTitle = ref<string>(""); //表单名称
const changeFlowPick = ref<string[]>([]) const changeFlowPick = ref<string[]>([])
const purviewAry = ref<any[]>([]); const purviewAry = ref<any[]>([]);
const qrCodeInsideDialogFlag = ref(false); const qrCodeInsideDialogFlag = ref(false);
const nodelUserList = reactive<nodelPeoples[]>([]);
// //
const gainFlowChart = reactive<nodeFlow>({ const gainFlowChart = reactive<nodeFlow>({
id: "0", id: "0",
conditionList: flowFactor,
nodelPeople: nodelUserList,
oldFlow: flowMap.value,
}); });
const state = reactive<any>({ const state = reactive<any>({
@ -169,14 +176,15 @@ const getTaskFormData = () => {
state.formData.powerstr = string2json(data.tableFormPage.powerstr); state.formData.powerstr = string2json(data.tableFormPage.powerstr);
judgeSubmitCancel({ name: data.tableFormPage.mastesformjson }).then( judgeSubmitCancel({ name: data.tableFormPage.mastesformjson }).then(
(datajud: any) => { (datajud: any) => {
console.error("不存在流程--1-datajud-》",datajud)
if (datajud.code == 0) { if (datajud.code == 0) {
if (datajud.data == 3 || datajud.data == 4) { if (datajud.data.buttonIsTrue == 3 || datajud.data.buttonIsTrue == 4) {
state.formData.list.push(submitButton); state.formData.list.push(submitButton);
} }
} }
} }
); );
console.log("表单数据--state.formData->1", state.formData);
console.error("不存在流程--1--》",state.formData.aiConfig) console.error("不存在流程--1--》",state.formData.aiConfig)
if(state.formData.aiConfig.length>0){ if(state.formData.aiConfig.length>0){
@ -308,16 +316,21 @@ const initLoadData = () => {
stateForm.formData.powerstr = string2json( stateForm.formData.powerstr = string2json(
gainAppPageInfoData.data.appForm.powerstr gainAppPageInfoData.data.appForm.powerstr
); );
// console.log("data.data.mastesform", stateForm.formData) console.log("data.data.mastesform", stateForm.formData)
judgeSubmitCancel({ judgeSubmitCancel({
name: gainAppPageInfoData.data.appForm.mastesformjson, name: gainAppPageInfoData.data.appForm.mastesformjson,
}).then((datajud: any) => { }).then((datajud: any) => {
console.log("datajud---------------->", datajud,datajud.data.buttonIsTrue)
if (datajud.code == 0) { if (datajud.code == 0) {
if (datajud.data == 3 || datajud.data == 4) { if (datajud.data.buttonIsTrue == 3 || datajud.data.buttonIsTrue == 4) {
stateForm.formData.list.push(submitButton); stateForm.formData.list.push(submitButton);
} }
} }
console.log("datajud------stateForm.formData.list---------->", stateForm.formData.list)
}); });
} }
}); });
@ -336,7 +349,7 @@ const initLoadData = () => {
watch(() => openOrClose,(val) => { watch(() => openOrClose,(val) => {
if(val){ if(val){
getTaskFormData() getTaskFormData()
initLoadData() // initLoadData()
}else{ }else{
initData() initData()
} }
@ -429,10 +442,195 @@ const closeAppSubmit = () => {
}; };
// //
const changeKeyVal = (key: any, val: any, type: any, attribute: any) => { const changeKeyVal = (key: any, val: any, type: any, attribute: any) => {
console.log("改变表单值--key--->",key) // console.log("--key--->",key)
console.log("改变表单值--val--->",val,Array.isArray(val)) // console.log("--val--->",val,Array.isArray(val))
console.log("改变表单值--type--->",type) // console.log("--type--->",type)
console.log("改变表单值--attribute--->",attribute) // console.log("--attribute--->",attribute)
let isUpdateFlowChart = false;
console.log("改变表单值--notAsA_BasisForJudgment--->",notAsA_BasisForJudgment.indexOf(type))
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;
}
}
//
if (
timeControl.indexOf(type) > -1 ||
fixedValueControl.indexOf(type) > -1 ||
type == "input"
) {
let addNewTime = true; //
flowFactor.forEach((item: any) => {
if (item.type == 2) {
addNewTime = false;
if (item.customFields && item.customFields.length > 0) {
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,
});
}
}
let isTrue = false
if(changeFlowPick.value && Array.isArray(changeFlowPick.value) && changeFlowPick.value.includes(key)){
isTrue = true
}
//
if (isUpdateFlowChart && isTrue) {
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;
});
}
} }
@ -515,7 +713,7 @@ provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
> >
<template #header> <template #header>
<div class="drawHeader"> <div class="drawHeader">
<el-text size="large">{{ drawTitle }}</el-text>{{ pageType }}--->{{ props.drawerwith }}-->{{ drawBodyWidth }} <el-text size="large">{{ drawTitle }}</el-text>
<el-button v-if="stateForm.formData.form.qrCodeFlag == true && stateForm.formData.form.qrCodeInside == true" size="small" @click="showFillFormQrCode">扫码填单</el-button> <el-button v-if="stateForm.formData.form.qrCodeFlag == true && stateForm.formData.form.qrCodeInside == true" size="small" @click="showFillFormQrCode">扫码填单</el-button>
</div> </div>
</template> </template>

11
src/views/sysworkflow/lowcodepage/runApp/regularPage/completedMattersPage.vue

@ -6,6 +6,7 @@
<script lang='ts' setup> <script lang='ts' setup>
import { gainAppTaskList } from "@/api/DesignForm/requestapi" import { gainAppTaskList } from "@/api/DesignForm/requestapi"
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue' import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue'
import LookAndOperateNewLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue'
const props = defineProps({ const props = defineProps({
pickAppMenu:{ pickAppMenu:{
type:Object, type:Object,
@ -54,7 +55,10 @@ const getToDoList = () =>{
taskFlowAry.value = data.data.list taskFlowAry.value = data.data.list
}) })
} }
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() =>{ onMounted(() =>{
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList() getToDoList()
}) })
const flowLogInfo = ref<any>() const flowLogInfo = ref<any>()
@ -72,7 +76,12 @@ const searchQuery = () =>{}
</script> </script>
<template> <template>
<div ref="myappbox" class="app_box"> <div ref="myappbox" class="app_box">
<LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getToDoListTd" /> <!-- <LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getToDoListTd" /> -->
<LookAndOperateNewLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerWithNew" @getmytodolist="getToDoListTd" />
<div class="app-container"> <div class="app-container">
<div class="search"> <div class="search">
<div class="titleBox"> <div class="titleBox">

87
src/views/sysworkflow/lowcodepage/runApp/regularPage/myCreate.vue

@ -14,6 +14,7 @@ import {
import { gainAppAllTaskList } from "@/api/DesignForm/requestapi"; import { gainAppAllTaskList } from "@/api/DesignForm/requestapi";
// //
import NewFormPageCont from "@/components/DesignForm/tableListPage/newFormPageCont.vue";
import FormPageCont from "@/components/DesignForm/tableListPage/formPageContApp.vue"; import FormPageCont from "@/components/DesignForm/tableListPage/formPageContApp.vue";
import TableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue"; import TableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue";
@ -69,9 +70,9 @@ const getToDoList = () => {
onMounted(() => { onMounted(() => {
getToDoList(); getToDoList();
}); });
const rangedDatePickerInTables1: any = []
const container = ref(); // const container = ref(); //
const drawerWith = ref(); // const drawerWithing = ref(); //
const openTaskDrawer = ref(false); // const openTaskDrawer = ref(false); //
/** /**
@ 作者: 秦东 @ 作者: 秦东
@ -82,9 +83,22 @@ const tablePageClass = ref(1);
const lookPageInfoIsShow = ref(false); const lookPageInfoIsShow = ref(false);
const pageInfoCont = ref<any>(); const pageInfoCont = ref<any>();
const lookPageInfo = (val: any) => { const lookPageInfo = (val: any) => {
tablePageClass.value = 4; tablePageClass.value = 3;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
if(val.runFlowIdStr && val.runFlowIdStr != ""){
val.runFlowId = val.runFlowIdStr
}
console.log("查看详细内容--------------------------->");
console.log(val);
console.log("查看详细内容--------------------------->");
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
}; };
/** /**
@ -97,8 +111,18 @@ const editInfo = (val: any) => {
// console.log('!',val) // console.log('!',val)
operState.value = 5; operState.value = 5;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
if(val.runFlowIdStr && val.runFlowIdStr != ""){
val.runFlowId = val.runFlowIdStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
}; };
/** /**
@ -109,8 +133,18 @@ const editInfo = (val: any) => {
const submitApproval = (val: any) => { const submitApproval = (val: any) => {
operState.value = 4; operState.value = 4;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
if(val.runFlowIdStr && val.runFlowIdStr != ""){
val.runFlowId = val.runFlowIdStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
}; };
/** /**
@ -156,8 +190,18 @@ const recallSendMsg = (val: any) => {
const afreshSendFlow = (val: any) => { const afreshSendFlow = (val: any) => {
operState.value = 2; operState.value = 2;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
if(val.runFlowIdStr && val.runFlowIdStr != ""){
val.runFlowId = val.runFlowIdStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
}; };
/** /**
@ -168,8 +212,18 @@ const afreshSendFlow = (val: any) => {
const editFormSendFlow = (val: any) => { const editFormSendFlow = (val: any) => {
operState.value = 3; operState.value = 3;
tablePageClass.value = 2; tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
if(val.runFlowIdStr && val.runFlowIdStr != ""){
val.runFlowId = val.runFlowIdStr
}
pageInfoCont.value = val; pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth; drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true; lookPageInfoIsShow.value = true;
}; };
const cancelEvent = (val: any) => { const cancelEvent = (val: any) => {
@ -432,15 +486,28 @@ const searchQuery = () => {};
/> />
</el-card> </el-card>
<FormPageCont
<NewFormPageCont
v-model:is-show="lookPageInfoIsShow" v-model:is-show="lookPageInfoIsShow"
:drawer-with="props.drawerWith" :drawer-with="drawerWithing"
:page-info="pageInfoCont" :page-info="pageInfoCont"
:table-page-class="tablePageClass" :table-page-class="tablePageClass"
:oper-state="operState" :oper-state="operState"
:dprt="rangedDatePickerInTables1"
@get-page-data="getToDoList" @get-page-data="getToDoList"
/> />
<!-- <FormPageCont
v-model:is-show="lookPageInfoIsShow"
:drawer-with="props.drawerWith"
:page-info="pageInfoCont"
:table-page-class="tablePageClass"
:oper-state="operState"
@get-page-data="getToDoList"
/> -->
<TableFlow <TableFlow
v-model:isopen="openTaskDrawer" v-model:isopen="openTaskDrawer"
:versionid="props.versionid" :versionid="props.versionid"

13
src/views/sysworkflow/lowcodepage/runApp/regularPage/myToDoPage.vue

@ -8,6 +8,7 @@ import { gainAppTaskList } from "@/api/DesignForm/requestapi";
import { taskflowquery } from "@/api/DesignForm/type"; import { taskflowquery } from "@/api/DesignForm/type";
import LookAndOperateLogInfo from "@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue"; import LookAndOperateLogInfo from "@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue";
import lookFlowInfoNewApp from "@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue";
const props = defineProps({ const props = defineProps({
pickAppMenu: { pickAppMenu: {
@ -58,7 +59,10 @@ const getToDoList = () => {
taskFlowAryTd.value = data.data.list; taskFlowAryTd.value = data.data.list;
}); });
}; };
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() => { onMounted(() => {
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList(); getToDoList();
}); });
/** /**
@ -86,12 +90,19 @@ const searchQuery = () => {};
</script> </script>
<template> <template>
<div ref="myappbox" class="app_box"> <div ref="myappbox" class="app_box">
<LookAndOperateLogInfo <!-- <LookAndOperateLogInfo
v-if="darwOpenOrClose" v-if="darwOpenOrClose"
v-model:isshow="darwOpenOrClose" v-model:isshow="darwOpenOrClose"
:flow-log-info="flowLogInfo" :flow-log-info="flowLogInfo"
:drawer-with="props.drawerWith" :drawer-with="props.drawerWith"
@getmytodolist="getToDoListTd" @getmytodolist="getToDoListTd"
/> -->
<lookFlowInfoNewApp
v-if="darwOpenOrClose"
v-model:isshow="darwOpenOrClose"
:flow-log-info="flowLogInfo"
:drawer-with="drawerWithNew"
@getmytodolist="getToDoListTd"
/> />
<div class="app-container"> <div class="app-container">
<div class="search"> <div class="search">

7
src/views/sysworkflow/lowcodepage/runApp/regularPage/sendCopy.vue

@ -6,6 +6,7 @@
<script lang='ts' setup> <script lang='ts' setup>
import { gainAppTaskList } from "@/api/DesignForm/requestapi" import { gainAppTaskList } from "@/api/DesignForm/requestapi"
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue' import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue'
import LookAndOperateLogNewInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue'
const props = defineProps({ const props = defineProps({
pickAppMenu:{ pickAppMenu:{
type:Object, type:Object,
@ -49,7 +50,10 @@ const getToDoList = () =>{
taskFlowAry.value = data.data.list taskFlowAry.value = data.data.list
}) })
} }
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() =>{ onMounted(() =>{
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList() getToDoList()
}) })
@ -68,7 +72,8 @@ const searchQuery = () =>{}
</script> </script>
<template> <template>
<div ref="myappbox" class="app_box"> <div ref="myappbox" class="app_box">
<LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getToDoListTd" /> <!-- <LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getToDoListTd" /> -->
<LookAndOperateLogNewInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerWithNew" @getmytodolist="getToDoListTd" />
<div class="app-container"> <div class="app-container">
<div class="search"> <div class="search">
<div class="titleBox"> <div class="titleBox">

2
src/views/taskplatform/taskmanagement/lookFlowInfoApp.vue

@ -133,7 +133,7 @@ const gainFormData = () => {
}) })
.finally(() => { .finally(() => {
formLoading.value = false; formLoading.value = false;
gainEditDataLog({ id: props.flowLogInfo.mastersKeyStr }).then(({ data }) => { gainEditDataLog({ id: props.flowLogInfo.mastersKeyStr.toString() }).then(({ data }) => {
// console.log("-1111-->",data) // console.log("-1111-->",data)
pageLog.value = data; pageLog.value = data;
}); });

523
src/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue

@ -0,0 +1,523 @@
<!--
@ 作者: 秦东
@ 时间: 2026-02-05 13:51:29
@ 备注: 代办事宜
-->
<script lang='ts' setup>
import {
submitButton,
afreshSubmitButton,
editFormCont,
draftSubmitButton,
editLookFormCont,
} from "@/utils/workflow/const";
import {
json2string,
objToStringify,
string2json,
stringToObj,
} from "@/utils/DesignForm/form";
import {
haveCustomerFormVersion,
generateFlow,
gainTaskFormInfo,
gainEditDataLog,
} from "@/api/taskapi/management";
import RunFlowStepApp from "@/views/taskplatform/taskmanagement/runFlowStepApp.vue";
import {
judgeSubmitCancel,
startRunFlow,
afreshRunFlow,
onlyPublishFlow,
gainEditFormFlowInfo,
} from "@/api/DesignForm/requestapi";
import FlowStep from "@/views/taskplatform/taskmanagement/flowStep.vue";
import { constAiEffect } from "@/api/DesignForm/utils";
import RunFlowStep from "@/views/taskplatform/taskmanagement/runNewFlowStep.vue";
import AiPage from "@/views/sysworkflow/lowcodepage/pageFlow/aiPage.vue";
const props = defineProps({
isshow: {
type: Boolean,
default: true,
},
drawerWith: {
type: Number,
default: 0,
},
flowLogInfo: {
type: Object,
default() {
return {};
},
},
operState: {
type: Number,
default: 1,
},
});
const flowAry = ref<any[]>();
const emits = defineEmits(["update:isshow", "getmytodolist"]);
const isOpen = computed({
get: () => props.isshow,
set: (val) => {
emits("update:isshow", val);
},
});
const drawBodyWidth = ref(props.drawerWith)
const aiConfigArea =ref(false) //AI
const isFlowTable = ref(true); //
const formType = ref<number>(3);
const logistrue = ref(false);
const formLoading = ref(false);
const loadingData = ref(false); //
const flowLoading = ref(false); //
const versiontitle = ref<any>("");
const flowMap = ref<any>();
const nextStep = ref(0);
const nodeKey = ref<string>("");
const purviewAry = ref<any[]>([]);
const currentProgress = ref<number>(1);
const newLogAry = ref<any>("");
const oldLogAry = ref<any>("");
const newDataLen = ref<number>(0);
//
const formState = reactive({
formData: {
list: [] as any[],
form: {},
config: {},
powerstr: {},
aiConfig:[]
},
dict: {},
formId: 25,
id: 1,
loading: true,
});
const formEl = ref<any>();
const drawerBeforeClose = () => {
// console.log("",false)
emits("getmytodolist");
emits("update:isshow", false);
drawBodyWidth.value = 0;
};
onMounted(() => {
versiontitle.value = props.flowLogInfo.title;
flowMap.value = JSON.parse(props.flowLogInfo.flowcont);
// console.log("",props.flowLogInfo)
gainFormData();
});
const pageLog = ref<any[]>([]);
//
const gainFormData = () => {
formLoading.value = true;
console.log("获取表单内容--->", props.flowLogInfo);
nextStep.value = props.flowLogInfo.nextStep;
nodeKey.value = props.flowLogInfo.currentNodeKey;
purviewAry.value = props.flowLogInfo.powerAry;
currentProgress.value = props.flowLogInfo.currentStep;
// console.log("props.flowLogInfo--5-------->",props.flowLogInfo.mastesform)
formState.formData = stringToObj(props.flowLogInfo.mastesform);
gainTaskFormInfo({ id: props.flowLogInfo.mastersKeyStr.toString(),runFlowId: props.flowLogInfo.runFlowIdStr.toString() })
.then((data: any) => {
let extraW=0;
if(isFlowTable.value){
extraW = 320
}
if (data.data.logistrue) {
formState.formData.list.push(editLookFormCont);
}
// console.log("res----------->",data)
formEl.value.setValue(data.data.masterDataInfo);
newLogAry.value = data.data.newData;
oldLogAry.value = data.data.oldData;
logistrue.value = data.data.logistrue;
newDataLen.value = data.data.newDataLen;
formLoading.value = false;
if(formState.formData&&formState.formData.aiConfig&&formState.formData.aiConfig.length>0){
aiConfigArea.value=true
formState.formData.aiConfig?.forEach((item: { library: any; title: any; trigger: any; }) => {
currentAgent.value.push({
name: "test",
model: false,
rowdex:0,
uuid: item.library,
fields: item.title,
trigger: item.trigger,
params: {},
subparams:[]
});
});
}
if(aiConfigArea.value){
extraW = extraW + 320
}
if (aiConfigArea.value && isFlowTable.value){
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
drawBodyWidth.value = drawBodyWidth.value + extraW
}else{
drawBodyWidth.value = drawBodyWidth.value
}
nextTick(() => {
// console.log("-1111-->",data.data.tableData)
formEl.value.setValue(data.data.tableData);
});
})
.finally(() => {
formLoading.value = false;
gainEditDataLog({ id: props.flowLogInfo.mastersKeyStr.toString() }).then((data:any) => {
// console.log("-1111-->",data)
pageLog.value = data.data;
});
});
// haveCustomerFormVersion({id:props.flowLogInfo.version_id.toString()})
// .then(({ data }) =>{
// formState.dict = string2json(data.dict)
// judgeSubmitCancel({"name":data.mastesformjson})
// .then((dataBut:any) =>{
// if(dataBut.code == 0){
// formState.formData.list.push(afreshSubmitButton)
// // console.log("res----------->",dataBut,props.operState)
// // if (dataBut.data == 3 || dataBut.data == 4){
// // formInfo.formData.list.push(editFormCont)
// // }
// }
// })
// })
// .finally(() => {
// formLoading.value = false;
// formEl
// })
};
//-----------------------AI setting--------------------------
//AIform
//params subparams ; rowdex:
const currentAgent = ref<
{
model: boolean;
name: string;
rowdex:number,
uuid: string[];
fields: string[];
trigger: number;
params: { [key: string]: any };
subparams:{[key: string]: any}[];
}[]
>([]);
const aiassistRef = ref();
//AI
provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
//ai_envents
const ai_events: Array<{ uuids: string[]; params: { [key: string]: any } }> = [];
currentAgent.value.forEach(ag=>{
if(ag.fields.includes(key)){ //trigger: 1: 2 3
if (rowdex!=null){//
ag.rowdex=rowdex //rowdex
if(rowdex>=ag.subparams.length){
ag.subparams.push({[field]:value})
}else{
ag.subparams[rowdex][field]=value
}
}else{ //, params
ag.params[field]=value; //keyfieldName
}
let mergedObj;
if(ag.subparams.length>0){
mergedObj = Object.assign({}, ag.params, ag.subparams[ag.rowdex]); //
}else{
mergedObj = ag.params
}
switch(ag.trigger){
case 2:
if(Object.keys(mergedObj).length>=ag.fields.length/2){
ai_events.push({uuids:ag.uuid,params:mergedObj })
}
break;
case 3:
if(Object.keys(mergedObj).length==ag.fields.length){
ai_events.push({uuids:ag.uuid,params:mergedObj})
}
break;
default:
ai_events.push({uuids:ag.uuid,params:mergedObj})
}
}
})
if(ai_events.length>0){
aiassistRef.value.onSendParamToAI(ai_events)
}
})
const beforeSubmit = () => {
}
const afterSubmit = () => {
}
const closeAppSubmit = () => {
}
const changeKeyVal = () => {
}
const anewSubmit = () => {
}
const saveEditFormInfo = () => {
}
const sendDraftSubmit = () => {
}
const optionsValue3Get3 = () => {
}
const submitEdit = () => {
}
</script>
<template>
<div v-if="isOpen" class="drawerClass">
<el-drawer
v-model="isOpen"
:title="versiontitle"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
:size="drawBodyWidth"
:close="drawerBeforeClose"
>
<template #header>
<div class="drawHeader">
<el-text size="large">{{ versiontitle }}</el-text>
</div>
</template>
<div v-loading="loadingData" :class="aiConfigArea&&isFlowTable?'drawBody treePage':(aiConfigArea&&!isFlowTable)?'drawBody twoPageAi':(!aiConfigArea&&isFlowTable)?'drawBody twoPageFlow':'drawBody'">
<!-- {{ formState.formData }} -->
<AiPage
v-if="formType != 5 && aiConfigArea"
ref="aiassistRef"
:agent="currentAgent"
/>
<AppForm
ref="formEl"
:draw-title="versiontitle"
:form-data="formState.formData"
:type="formType"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
:anew-submit="anewSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit="sendDraftSubmit"
:submit-edit="submitEdit"
@options-value3-get3="optionsValue3Get3"
/>
<RunFlowStep
v-if="isFlowTable"
ref="runstep"
v-model:flowary="flowAry"
:flow-key="props.flowLogInfo.idStr"
:current-progress="currentProgress"
@updatelist="drawerBeforeClose"
/>
</div>
</el-drawer>
</div>
</template>
<style lang='scss' scoped>
.drawerClass{
:deep .el-drawer__header{
border-bottom: 1px solid #ECECEC;
}
}
.drawHeader {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.drawBody{
width: 100%;
height: 100%;
padding: 10px 10px;
:deep .el-card{
border-radius: 15px;
}
:deep .el-card__header{
padding: 15px 15px;
}
:deep .el-card__body{
padding: 0;
}
:deep .el-card__footer{
padding: 10px 10px;
}
}
.twoPageAi{
display: grid;
grid-template-columns: minmax(150px, 250px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.twoPageFlow{
display: grid;
grid-template-columns: 1fr minmax(150px, 250px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 250px) 1fr minmax(150px, 250px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.svgBox{
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
}
.card-header{
font-size: 1.4rem;
font-weight: 700;
color: #0020C2;
display: flex;
align-items: center;
gap: 10px;
}
.scroBox{
padding: 10px 15px;
height: calc(100vh - 200px);
}
.formBody{
width: 100%;
overflow-x: auto;
}
.flowBody{
padding: 10px 15px;
height: calc(100vh - 260px);
}
.bootemWorkFlow{
width: 100%;
text-align: center;
.bootemWorkFlowBut{
width: 100%;
padding: 10px 0;
text-align: center;
}
}
.btn {
padding: 14px 16px;
border-radius: 10px;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s;
border: none;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 32, 194, 0.15);
}
.approve-btn {
background: linear-gradient(135deg, #00cc66, #33dd88);
color: white;
}
.reject-btn {
background: linear-gradient(135deg, #ff3366, #ff5588);
color: white;
}
.bootemAi{
display: grid;
grid-template-columns: 1fr 50px; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
:deep .el-input__wrapper{
border-radius: 10px;
}
}
.ai-send-btn {
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
border: none;
width: 46px;
border-radius: 10px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
}
.ai-send-btn:hover {
background: linear-gradient(135deg, #0019a0, #3a5aff);
transform: translateY(-2px);
}
.ai-conversation {
flex: 1;
display: flex;
flex-direction: column;
gap: 15px;
margin-bottom: 20px;
}
.message {
padding: 12px 16px;
border-radius: 12px;
max-width: 90%;
line-height: 1.5;
}
.user-message {
background: #eef2ff;
align-self: flex-end;
border-top-right-radius: 4px;
border: 1px solid rgba(0, 32, 194, 0.2);
}
.ai-message {
background: linear-gradient(to right, #f0f5ff, #ffffff);
align-self: flex-start;
border-top-left-radius: 4px;
border: 1px solid rgba(0, 32, 194, 0.1);
}
</style>

465
src/views/taskplatform/taskmanagement/runNewFlowStep.vue

@ -0,0 +1,465 @@
<!--
@ 作者: 秦东
@ 时间: 2026-02-02 14:00:47
@ 备注: 新流程
-->
<script lang='ts' setup>
import { gainRunTaskFlow } from "@/api/DesignForm/requestapi";
import SvgIcon from "@/components/SvgIcon/index.vue";
//
import squareUrlOne from "@/assets/images/1.png"
import squareUrlTwo from "@/assets/images/2.png"
import { afreshRunWorkflow, authorizeWorkflow } from "@/api/taskapi/management";
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 ifSendFlow = ref(false)//
const flowLoading = ref(false)
const flowMaps = ref<any[]>();
// const flowOpinion = ref(false) //
const currentStep = ref<number>(props.currentProgress)
const nextStep = ref<number>(0)
//
const gainRunFlowTask = () =>{
flowLoading.value = true
let sendInfo = {
id:props.flowKey
}
gainRunTaskFlow(sendInfo)
.then((data:any) =>{
console.log("获取流程--werwerwerwer--->",data)
flowMaps.value = data.data.flowList
ifSendFlow.value = data.data.operational
currentStep.value = data.data.current_step
nextStep.value = data.data.next_step
emits("update:flowary", data.data.flowList);
})
.finally(()=>{
flowLoading.value = false
})
}
/**
@ 作者: 秦东
@ 时间: 2026-01-29 16:37:56
@ 功能: 判断审批节点样式
*/
const judgeNodeClass = (val:number,stepVal:number):string => {
console.log("判断审批节点样式",val,stepVal)
switch(val){
case 1:
if(ifSendFlow.value){
if(currentStep.value == stepVal){
return "in-progress"
}else{
return 'completed'
}
}else{
if(nextStep.value == stepVal){
return "in-progress"
}else{
return 'completed'
}
}
case 2:
return 'pending'
case 3:
// return 'in-progress'
if(ifSendFlow.value){
if(currentStep.value == stepVal){
return "in-progress"
}else{
return 'in-executor'
}
}else{
if(nextStep.value == stepVal){
return "in-progress"
}else{
return 'completed'
}
}
default:
if(ifSendFlow.value){
if(currentStep.value == stepVal){
return "in-progress"
}else{
return 'completed'
}
}else{
if(nextStep.value == stepVal){
return "in-progress"
}else{
return 'completed'
}
}
}
return 'completed'
}
//
onBeforeMount(()=>{
gainRunFlowTask();
})
//
const judgeAddUser = (val:any):boolean =>{
// console.log("----1111->",val.judgelist)
if(val.judgelist){
return true
}
return false
}
let zhiXingStep = 1;
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const openclosebox = ref(false)
const openOrClose = ref(false)
const sendFlowInfo = ref<string>() //
//
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
}
// console.log("PresetPersonnel.value--------1-------->",val)
// console.log("PresetPersonnel.value--------2-------->",val.pendpers)
// console.log("PresetPersonnel.value--------3-------->",val.operator)
// console.log("PresetPersonnel.value--------4-------->",selectedPeople.value)
}
//
const updateNode = (val:any) =>{
if(flowMaps.value&& flowMaps.value.length > 0){
flowMaps.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
item.operator = val
}
})
}
}
//
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
}
authorizeWorkflow(sendInfo)
.then((data:any)=>{
// console.log("----22222->",data)
ElMessage({
message: '处理完成!',
type: 'success'
})
})
.finally(()=>{
gainRunFlowTask();
emits("updatelist");
})
}
//
const anewSubmit = (type: string,val?:any) => {
afreshRunWorkflow({id:props.flowKey})
.then((data:any) => {
})
.finally(() => {
gainRunFlowTask()
})
}
defineExpose({gainRunFlowTask,anewSubmit})
</script>
<template>
<el-card shadow="always">
<template #header>
<div class="card-header">
<div class="svgBox"><SvgIcon icon-class="liuChengBiaoDan" size="25" /></div>
审批流程
</div>
</template>
<el-scrollbar v-loading="flowLoading" element-loading-text="Loading..." :class="ifSendFlow?'flowBody':'flowBodyNofoot'">
<div class="approval-steps">
<div v-for="item in flowMaps" :key="item.step" :class="['step', judgeNodeClass(item.type,item.step)]">
<div class="step-icon">
<SvgIcon v-if="item.type==0" icon-class="faqiren" size="25" />
<SvgIcon v-if="item.type==1" icon-class="spr" size="25" />
<SvgIcon v-if="item.type==2" icon-class="csr" size="25" />
<SvgIcon v-if="item.type==3" icon-class="zxr" size="25" />
<!--SvgIcon v-else icon-class="shenpi" size="25" /-->
</div>
<div class="step-content">
<h3 class="step-title">{{item.nodeName}}</h3>
<div v-for="items in item.operator" :key="items.id" class="flowLogBox">
<div >
<el-avatar v-if="items.icon!=''" shape="square" fit="cover" :src="items.icon" style="width: 40px;" class="avatarBox" />
<el-avatar v-else-if="items.iconbase64!=''" shape="square" fit="cover" :src="items.iconbase64" style="width: 40px;" class="avatarBox" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" style="width: 40px;" class="avatarBox" />
</div>
<div>
<div>
<el-text size="small">{{ items.departmentname }}</el-text>
<el-text size="small"><span v-if="items.departmentname"> - </span>{{ items.postname }}</el-text>
<el-text size="small"><span v-if="items.departmentname||items.postname"> - </span>{{ items.name }}</el-text>
</div>
<div v-for="(logItem,logIndex) in items.log" :key="logIndex" >
<div v-if="logItem.state==2" class="step-info">
<el-text v-if="logItem.cause" type="success" size="small">{{logItem.cause}}</el-text>
<el-text v-else type="success" size="small" >已同意</el-text>
</div>
<div v-if="logItem.state==3" class="step-info">
<el-text v-if="logItem.cause" type="danger" size="small">{{logItem.cause}}</el-text>
<el-text v-else type="danger" size="small" >已驳回</el-text>
</div>
<div v-else class="step-info">
<el-text v-if="logItem.cause" size="small">{{logItem.cause}}</el-text>
<el-text v-else size="small" >未操作</el-text>
</div>
<div class="step-time">{{ logItem.time }}</div>
</div>
</div>
</div>
<div v-if="judgeAddUser(item)" class="addUser" @click="addPeople(item)">
<svg-icon icon-class="addxuxian" size="50" />
</div>
</div>
</div>
</div>
</el-scrollbar>
<template v-if="ifSendFlow" #footer>
<div class="bootemWorkFlow">
<el-input v-model="sendFlowInfo" type="textarea" :rows="2" style="width: 100%" placeholder="请输入审批意见"></el-input>
<div class="bootemWorkFlowBut">
<el-button class="btn approve-btn" @click="yesOrNo(props.flowKey,1)"><SvgIcon icon-class="kxdg" size="" style="margin-right: 5px" />通过审批</el-button>
<el-button class="btn reject-btn" @click="yesOrNo(props.flowKey,2)" ><SvgIcon icon-class="cwkx" size="" style="margin-right: 5px" />驳回申请</el-button>
</div>
</div>
</template>
</el-card>
<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" />
</template>
<style lang='scss' scoped>
.card-header{
font-size: 1.4rem;
font-weight: 700;
color: #0020C2;
display: flex;
align-items: center;
gap: 10px;
}
.flowBody{
padding: 10px 15px;
height: calc(100vh - 260px);
}
.flowBodyNofoot{
padding: 10px 15px;
height: calc(100vh - 140px);
}
.svgBox{
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
}
.bootemWorkFlow{
width: 100%;
text-align: center;
.bootemWorkFlowBut{
width: 100%;
padding: 10px 0;
text-align: center;
}
}
.btn {
padding: 14px 16px;
border-radius: 10px;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s;
border: none;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 32, 194, 0.15);
}
.approve-btn {
background: linear-gradient(135deg, #00cc66, #33dd88);
color: white;
}
.reject-btn {
background: linear-gradient(135deg, #ff3366, #ff5588);
color: white;
}
.approval-steps {
flex: 1;
}
.step {
display: flex;
margin-bottom: 25px;
position: relative;
margin-left: 7px;
margin-top: 7px;
}
.step:not(:last-child)::after {
content: '';
position: absolute;
left: 20px;
top: 40px;
width: 2px;
height: calc(100% + 5px);
background: linear-gradient(to bottom, rgba(0, 32, 194, 0.2), rgba(0, 32, 194, 0.05));
}
.step-icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
z-index: 1;
flex-shrink: 0;
}
.step.completed .step-icon {
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
}
.step.in-progress .step-icon {
background: linear-gradient(135deg, #ffcc00, #ffdd55);
color: #333;
animation: pulse 2s infinite;
}
.step.in-executor .step-icon {
background: linear-gradient(135deg, #67C23A, #95f764);
color: #fff;
}
.step.pending .step-icon {
background: #f0f4ff;
color: #a0a6c9;
}
.step-content {
flex: 1;
}
.step-title {
font-weight: 600;
margin-bottom: 5px;
color: #0020C2;
}
.step.completed .step-title {
color: #4d6cff;
}
.step.in-progress .step-title {
color: #ff9900;
}
.step.in-executor .step-title {
color: #67C23A;
}
.step.pending .step-title {
color: #a0a6c9;
}
.step-info {
font-size: 0.9rem;
color: #666;
margin-top: 0px;
}
.step-time {
font-size: 0.8rem;
color: #888;
margin-bottom: 4px;
}
/* 响应式设计 */
@media (max-width: 1200px) {
.container {
grid-template-columns: 1fr;
grid-template-rows: auto auto auto;
height: auto;
gap: 15px;
}
.card {
min-height: 400px;
}
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(255, 204, 0, 0.7); }
70% { box-shadow: 0 0 0 10px rgba(255, 204, 0, 0); }
100% { box-shadow: 0 0 0 0 rgba(255, 204, 0, 0); }
}
.flowLogBox{
display: grid;
grid-template-columns: 45px 1fr;
}
.addUser{
display:block;
cursor:pointer;
}
.avatarBox{
border: 1px solid rgba(255, 255, 255, 0.5);
}
</style>
Loading…
Cancel
Save