Browse Source

Merge branch 'master' into li_s1

qin_s3
liwenxuan 2 months ago
parent
commit
32a90c2fa4
  1. 2
      package.json
  2. 2
      src/api/DesignForm/type.ts
  3. 5
      src/api/DesignForm/types.ts
  4. 1
      src/api/hr/org/type.ts
  5. 5
      src/api/taskapi/types.ts
  6. 2
      src/assets/icons/caogaoxiang.svg
  7. 1
      src/assets/icons/csr.svg
  8. 1
      src/assets/icons/faqiren.svg
  9. 1
      src/assets/icons/shenpi.svg
  10. 1
      src/assets/icons/spr.svg
  11. 1
      src/assets/icons/zxr.svg
  12. 575
      src/components/DesignForm/app/index.vue
  13. 1387
      src/components/DesignForm/app/index_20260129.vue
  14. 38
      src/components/DesignForm/app/pageViews/tableList.vue
  15. 23
      src/components/DesignForm/public/expand/lowcodeImage.vue
  16. 6
      src/components/DesignForm/public/form/form.vue
  17. 118
      src/components/DesignForm/public/form/formGroup.vue
  18. 4
      src/components/DesignForm/public/form/formItem.vue
  19. 3466
      src/components/DesignForm/public/form/newForm.vue
  20. 10
      src/components/DesignForm/tableListPage/formPageCont.vue
  21. 2
      src/components/DesignForm/tableListPage/formPageContApp.vue
  22. 634
      src/components/DesignForm/tableListPage/newFormPageCont.vue
  23. 4
      src/main.ts
  24. 8
      src/utils/encryptionAndDecryption/sm4Utils.ts
  25. 20
      src/utils/request.ts
  26. 250
      src/utils/workflow/const.ts
  27. 149
      src/views/public/orguser/orgalluser.vue
  28. 2
      src/views/public/orguser/orguser.vue
  29. 3
      src/views/sysworkflow/codepage/index.ts
  30. 281
      src/views/sysworkflow/lowcodepage/pageFlow/aiPage.vue
  31. 427
      src/views/sysworkflow/lowcodepage/pageFlow/flowStep.vue
  32. 583
      src/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue
  33. 2
      src/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue
  34. 11
      src/views/sysworkflow/lowcodepage/runApp/regularPage/completedMattersPage.vue
  35. 87
      src/views/sysworkflow/lowcodepage/runApp/regularPage/myCreate.vue
  36. 13
      src/views/sysworkflow/lowcodepage/runApp/regularPage/myToDoPage.vue
  37. 7
      src/views/sysworkflow/lowcodepage/runApp/regularPage/sendCopy.vue
  38. 5
      src/views/taskplatform/taskmanagement/flowStep.vue
  39. 2
      src/views/taskplatform/taskmanagement/lookFlowInfoApp.vue
  40. 523
      src/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue
  41. 465
      src/views/taskplatform/taskmanagement/runNewFlowStep.vue
  42. 214
      yarn.lock

2
package.json

@ -42,7 +42,7 @@
"dependencies": {
"@crazydos/vue-markdown": "^1.1.4",
"@dnd-kit/core": "^6.1.0",
"@element-plus/icons-vue": "^2.3.1",
"@element-plus/icons-vue": "^2.3.2",
"@onlyoffice/document-editor-vue": "^1.5.0",
"@sv-print/vue3": "^0.2.2",
"@tinymce/tinymce-vue": "^5.1.1",

2
src/api/DesignForm/type.ts

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

5
src/api/DesignForm/types.ts

@ -36,6 +36,7 @@ export interface FormData {
list: FormList[]
form: any // form所有props
config: {
groupKey: any
style?: string // 表单css样式,相当于scope
hideField?: string[] // 使用v-if隐藏的字段,用于交互
requestUrl?: string // 表单数据请求url
@ -160,7 +161,7 @@ export interface formStruct{
designType: any; // 当前页面设计类型,有效值search
formDict: any;
formOtherData:formOtherData;
echatsViews:echatsViews[];
echatsViews:echatsViewStruct[];
}
export interface DrawerStruct{
@ -234,7 +235,7 @@ export interface appSetUpContent{
appdescribe?:string;
}
//图标结构
export interface echatsViews {
export interface echatsViewStruct {
widthBox: number
styles: any
uuid:string;

1
src/api/hr/org/type.ts

@ -162,6 +162,7 @@ export interface searchCriteriaForPeople extends PageQuery{
}
export interface criteriaForPeopleList{
noedit: any;
id: number
userkey: string
number: string

5
src/api/taskapi/types.ts

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

2
src/assets/icons/caogaoxiang.svg

@ -1 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700784220084" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17019" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M755.2 857.6H262.4c-54.4 0-98.5-44.1-98.5-98.6V512.7h49.3v-312c0-27.2 22.1-49.3 49.3-49.3h492.7c27.2 0 49.3 22.1 49.3 49.3v312h49.3v246.4c-0.1 54.4-44.2 98.5-98.6 98.5z m0-656.9H262.4v312h147.8v98.6h197.1v-98.6h147.8v-312zM804.4 562H656.6v49.3c0 27.2-22.1 49.3-49.3 49.3H410.2c-27.2 0-49.3-22.1-49.3-49.3V562H213.1v197.1c0 27.2 22.1 49.3 49.3 49.3h492.7c27.2 0 49.3-22.1 49.3-49.3V562z m0 0" fill="#8a8a8a" p-id="17020"></path><path d="M656.8 330.2H361.2c-13.6 0-24.6-11-24.6-24.6 0-13.6 11-24.6 24.6-24.6h295.6c13.6 0 24.6 11 24.6 24.6 0.1 13.6-10.9 24.6-24.6 24.6z m0 0M484.4 445.3H361.2c-13.6 0-24.6-11-24.6-24.6s11-24.6 24.6-24.6h123.2c13.6 0 24.6 11 24.6 24.6s-11 24.6-24.6 24.6z m0 0" fill="#8a8a8a" p-id="17021"></path></svg>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700784220084" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17019" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M755.2 857.6H262.4c-54.4 0-98.5-44.1-98.5-98.6V512.7h49.3v-312c0-27.2 22.1-49.3 49.3-49.3h492.7c27.2 0 49.3 22.1 49.3 49.3v312h49.3v246.4c-0.1 54.4-44.2 98.5-98.6 98.5z m0-656.9H262.4v312h147.8v98.6h197.1v-98.6h147.8v-312zM804.4 562H656.6v49.3c0 27.2-22.1 49.3-49.3 49.3H410.2c-27.2 0-49.3-22.1-49.3-49.3V562H213.1v197.1c0 27.2 22.1 49.3 49.3 49.3h492.7c27.2 0 49.3-22.1 49.3-49.3V562z m0 0" p-id="17020"></path><path d="M656.8 330.2H361.2c-13.6 0-24.6-11-24.6-24.6 0-13.6 11-24.6 24.6-24.6h295.6c13.6 0 24.6 11 24.6 24.6 0.1 13.6-10.9 24.6-24.6 24.6z m0 0M484.4 445.3H361.2c-13.6 0-24.6-11-24.6-24.6s11-24.6 24.6-24.6h123.2c13.6 0 24.6 11 24.6 24.6s-11 24.6-24.6 24.6z m0 0" p-id="17021"></path></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

1
src/assets/icons/csr.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

1
src/assets/icons/faqiren.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769738394292" class="icon" viewBox="0 0 1147 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6496" xmlns:xlink="http://www.w3.org/1999/xlink" width="224.0234375" height="200"><path d="M768.00532 940.28436l82.502369-40.691214a435.283996 435.283996 0 0 1 15.212541 115.913963v8.492891h-89.78199V1017.28035a301.637623 301.637623 0 0 0-7.93292-76.99599zM612.146771 718.629238a337.755742 337.755742 0 0 0-179.004011-50.957346C243.872618 667.858549 89.78731 824.370397 89.78731 1017.28035v6.71965H0.00532v-8.492891a438.643821 438.643821 0 0 1 325.156398-425.85782A307.983959 307.983959 0 0 1 133.465035 305.184105C133.465035 137.099526 267.484722 0 433.14276 0s299.677725 136.446227 299.677726 305.184105A304.810791 304.810791 0 0 1 541.31046 589.089318a441.443675 441.443675 0 0 1 115.260664 49.090777zM224.460296 305.184105c0 117.033904 94.0751 212.882246 208.682464 212.882246a211.202333 211.202333 0 0 0 208.682465-212.975574A211.015676 211.015676 0 0 0 433.14276 92.768502 211.109005 211.109005 0 0 0 224.460296 305.184105zM774.631641 586.009479l47.877507 35.744805L632.119064 877.287641l-47.877507-35.931462z" fill="" p-id="6497"></path><path d="M839.961572 530.199052l26.691943 9.332847A232.107911 232.107911 0 0 1 979.954281 628.473934l20.065621 30.331753a162.858184 162.858184 0 0 0 69.436384 59.823551l58.890266 26.038644a29.30514 29.30514 0 0 1 13.905942 43.117754l-112.740794 151.658768a27.998542 27.998542 0 0 1-33.971564 7.279621l-58.890267-26.131973a229.1214 229.1214 0 0 1-98.274881-83.06234l-20.065622-30.331754A163.604812 163.604812 0 0 0 737.300252 743.174626l-26.691943-9.332847a29.398469 29.398469 0 0 1-16.425811-43.677725l113.207437-152.12541a31.265038 31.265038 0 0 1 32.571637-7.839592z" fill="" p-id="6498"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

1
src/assets/icons/shenpi.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769738970750" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12083" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M928 960a32 32 0 1 1 0 64h-832a32 32 0 1 1 0-64h832zM512 0a256 256 0 0 1 123.392 480.32L663.872 576 832 576a128 128 0 0 1 128 128v64a128 128 0 0 1-128 128H192a128 128 0 0 1-128-128v-64a128 128 0 0 1 128-128h168.704l30.656-94.208A256 256 0 0 1 512 0z m0 64a192 192 0 0 0-69.76 370.88l1.728 0.832 1.856 0.832 0.96 0.576-4.544-2.24a32.128 32.128 0 0 1 20.096 34.112l-0.192 1.024a31.872 31.872 0 0 1-0.448 2.24l-0.64 2.368-46.656 143.296a32 32 0 0 1-30.336 22.08H192a64 64 0 0 0-63.552 56.512L128 704v64a64 64 0 0 0 56.512 63.552L192 832h640a64 64 0 0 0 63.552-56.512L896 768v-64a64 64 0 0 0-56.512-63.552L832 640h-192a32 32 0 0 1-30.72-22.848l-43.072-144.704-0.32-1.472-0.32-1.024a31.808 31.808 0 0 1-0.256-1.664l0.896 4.16a32.064 32.064 0 0 1 18.56-38.72A192 192 0 0 0 512 63.936z" p-id="12084"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
src/assets/icons/spr.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769739576182" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15863" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M978.125808 1009.088932c-13.27917 13.311168-32.413974 13.311168-42.685332 13.311168h-313.196426c-37.533654 0-57.372414-19.870758-57.372415-57.532404v-23.070559c0-34.653834 22.494594-57.020436 57.372415-57.020436h57.884382l1.055934-1.087932c29.374164-24.414474 23.230548-32.861946 2.783826-60.796201a505.248424 505.248424 0 0 0-3.135804-4.31973 145.206925 145.206925 0 0 1-8.191488-11.99925l-0.47997-0.511968a127.928005 127.928005 0 0 1-27.454284-79.291044c0-71.835511 59.484282-130.263859 132.567715-130.263859h3.647772c70.587589 1.5999 128.439973 59.548278 128.951941 129.207925 0 22.71858-5.471658 44.509218-15.871008 63.03606l-16.606962 24.830448c-21.310668 32.79795-26.590338 43.261296-6.463596 65.627899a13.375164 13.375164 0 0 1 2.335854 2.943816 17.5989 17.5989 0 0 1 2.23986 2.623836h59.420286c47.421036 0 57.372414 31.006062 57.372415 57.020436v23.070559c0.191988 19.67877-4.575714 34.589838-14.175115 44.221236z m-152.598463-237.553154l10.847322-15.871008c4.7997-8.607462 7.135554-18.622836 6.655584-28.734204-0.47997-33.693894-29.694144-62.460097-63.740016-62.908069h-2.015874c-35.933754 0-65.179927 28.606212-65.179927 63.740017 0 13.791138 4.735704 27.070308 13.727142 38.461596l4.767702 6.943566c2.207862 3.03981 4.63971 6.3996 6.71958 9.695394l0.991938 1.471908c26.622336 33.565902 34.429848 68.283733 22.718581 100.441723h34.749828c-14.71908-43.805262 9.183426-81.274921 25.214424-106.361353v-0.031998l4.543716-6.847572z m109.209175 199.763516v-29.278171h-311.244548v29.278171h311.244548zM490.956255 684.501217H483.18074c-178.772827 3.007812-333.611151 131.959753-368.168991 306.572841a39.773514 39.773514 0 0 1-39.741516 32.893944l-1.151928-0.031998H65.926817c-23.390538-5.023686-37.629648-26.526342-33.085932-48.988938a457.571404 457.571404 0 0 1 279.822512-339.306795 330.283359 330.283359 0 0 1-169.653397-293.421662c0-188.66021 154.454347-342.218613 344.298482-342.218613 189.812138 0 344.266485 153.558403 344.266485 342.250611v0.031998c-1.567902 188.244236-151.158553 338.538843-340.618712 342.218612z m-4.159741-602.650337c-144.470971 0-261.967628 116.792701-261.967628 260.399727 2.527842 139.959253 114.488845 254.352104 254.89607 260.399726h11.167303c143.319043-3.551778 256.847948-117.912631 258.383852-260.431724 0-143.575027-117.784639-260.367728-262.479597-260.367729z" p-id="15864"></path></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

1
src/assets/icons/zxr.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769739269992" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14857" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M390.826667 503.876267a221.866667 221.866667 0 1 1 0-443.733334 221.866667 221.866667 0 0 1 0 443.733334z m0-34.133334a187.733333 187.733333 0 1 0 0-375.466666 187.733333 187.733333 0 0 0 0 375.466666zM66.56 946.653867a17.066667 17.066667 0 1 1-34.133333 0v-187.733334c0-113.4592 99.6352-204.8 221.866666-204.8h273.066667c34.6112 0 68.164267 7.338667 98.542933 21.265067a17.066667 17.066667 0 0 1-14.2336 31.061333 202.171733 202.171733 0 0 0-84.309333-18.193066h-273.066667c-104.0384 0-187.733333 76.8-187.733333 170.666666v187.733334zM556.475733 727.790933a38.058667 38.058667 0 0 0 0 53.8624l90.999467 90.965334a38.058667 38.058667 0 1 0 53.828267-53.8624l-90.965334-90.965334a38.058667 38.058667 0 0 0-53.8624 0z m-24.132266-24.132266a72.192 72.192 0 0 1 102.126933 0l90.965333 90.965333a72.192 72.192 0 1 1-102.0928 102.126933l-90.999466-90.965333a72.192 72.192 0 0 1 0-102.126933zM764.416 519.850667a38.058667 38.058667 0 0 0 0 53.8624l90.999467 90.965333a38.058667 38.058667 0 1 0 53.828266-53.8624l-90.965333-90.965333a38.058667 38.058667 0 0 0-53.8624 0z m-24.132267-24.132267a72.192 72.192 0 0 1 102.126934 0l90.965333 90.965333a72.192 72.192 0 1 1-102.0928 102.126934l-90.999467-90.965334a72.192 72.192 0 0 1 0-102.126933z" p-id="14858"></path><path d="M630.101333 699.255467l99.7376 99.771733 105.813334-105.813333-99.7376-99.771734-105.813334 105.813334z m105.813334-154.077867l148.002133 148.036267-154.077867 154.077866-148.036266-148.036266 154.112-154.077867z" p-id="14859"></path><path d="M933.376 937.608533a28.8768 28.8768 0 0 0 40.8576-40.8576l-146.909867-146.909866-40.8576 40.823466 146.909867 146.944z m-106.052267-236.066133l171.008 171.076267a63.010133 63.010133 0 0 1-89.088 89.088l-171.042133-171.008 89.088-89.156267zM531.319467 980.753067a17.066667 17.066667 0 1 1 0-34.133334h226.065066a17.066667 17.066667 0 0 1 0 34.133334h-226.065066zM254.293333 946.653867a17.066667 17.066667 0 1 1-34.133333 0v-167.799467a17.066667 17.066667 0 1 1 34.133333 0v167.799467z" p-id="14860"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

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

@ -6,11 +6,9 @@
<script lang="ts" setup>
import {
json2string,
objToStringify,
string2json,
stringToObj,
} from "@/utils/DesignForm/form";
import { onBeforeRouteLeave, useRoute, useRouter } from "vue-router";
import { useRoute, useRouter } from "vue-router";
import { useDesignFormStore } from "@/store/DesignForm/designForm";
import {
attrButton,
@ -28,28 +26,28 @@ import {
checkboxUnit,
orgDeptUnit,
} from "@/api/DesignForm/fieldUnit";
import type { FormInstance, FormRules } from "element-plus";
import type { FormInstance } from "element-plus";
import { ElLoading, ElMessage, ElNotification } from "element-plus";
import html2canvas from "html2canvas";
import JSZip, { forEach } from "jszip";
import JSZip from "jszip";
import { gainFormPageListCont } from "@/api/DesignForm/requestapi";
import { Picture, InfoFilled, QuestionFilled } from "@element-plus/icons-vue";
import { Picture, QuestionFilled } from "@element-plus/icons-vue";
import request from "@/utils/request";
import {
softDeletion,
retractRunWorkFlow,
recallSendMsg,
recalSendMsg,
} from "@/api/taskapi/management";
import { formatNumber } from "@/api/DesignForm/utils";
import { formHasPower } from "@/directive/permission/button";
import {printHtmlPage} from '../printHtmlRender.ts'
import {printHtmlPage} from '../printHtmlRender.js'
//
import FormPageCont from "@/components/DesignForm/tableListPage/formPageCont.vue";
import TableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue";
import NewFormPageCont from "@/components/DesignForm/tableListPage/newFormPageCont.vue";
import NewTableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue";
@ -61,24 +59,23 @@ import GanttPageIng from "@/components/DesignForm/app/gannttPage.vue";
import MapPage from "@/components/DesignForm/app/mapPage.vue";
import CalendarPage from "@/components/DesignForm/app/calendar/calendar1/calendarPage.vue";
import SearchSelect from "@/components/DesignForm/app/calendar/selectSearch.vue";
import AKSelect from "@/components/DesignForm/public/form/select.vue";
import ContainerPath from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/container.vue";
import SeeContChart from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/seeContChart.vue";
import exportPanel from "../exportPanel.vue";
import importPanel from "../importPanel.vue";
import { EpPropMergeType } from "element-plus/es/utils";
import { RendererNode, RendererElement } from "vue";
import { echatsViews } from "@/api/DesignForm/types";
import { echatsViewStruct } from '@/api/DesignForm/types';
const props = withDefaults(
defineProps<{
data: FormPageList;
searchData?: attrButton[];
data: FormPageList | any;
searchData?: attrButton[] | any;
config?: FormPageConfig|any;
appKey?: string;
formId?: string;
formKey?:string;
signCode?: string;
beforeRequest?: (params: any, rout: any) => any;
afterResponse?: (result: any) => any | string;
@ -99,7 +96,7 @@ const props = withDefaults(
formBasicConfig?: any;
fieldsDetailList?: any;
orgAndManTree?: any;
echatsViews: echatsViews;
echatsViews: echatsViewStruct;
}>(),
{
showPage: true,
@ -118,6 +115,12 @@ const props = withDefaults(
appKey: () => {
return "";
},
requestUrl: () => {
return "";
},
deleteUrl: () => {
return "";
},
formId: () => {
return "";
},
@ -127,7 +130,7 @@ const props = withDefaults(
versionid: () => {
return "";
},
signCode: () => {
formKey: () => {
return "";
},
versiontitle: () => {
@ -154,13 +157,25 @@ const props = withDefaults(
orgAndManTree: () => {
return {};
},
pickAppMenu: () => {
return {};
},
beforeRequest: (_params: any, _rout: any):any => {
return
},
afterResponse: (_result: any):any | string => {
return
},
beforeDelete: (_params: any, _rout: any):any => {
return
}
}
);
const echatsViewsdf = computed({
get() {
return props.echatsViews;
},
set(newVal: any) {},
set(_newVal: any) {},
});
const emits = defineEmits<{
(e: "selectionChange", row: any): void;
@ -178,13 +193,16 @@ const openTaskDrawer = ref(false); //新增数据
//
const dynamicVNode = ref<VNode | null>(null); //
interface TableItem {
id: string | number;
//
}
const state = reactive({
loading: false,
currentPage: 1,
pageSize: props.config?.pageSize || 2,
total: 0,
selectionChecked: [],
selectionChecked: [] as TableItem[],
dict: {}, //
searchFormDown: false,
treeValue: {}, //
@ -197,7 +215,7 @@ const state = reactive({
@ 时间: 2024-03-28 16:03:12
@ 功能: 判断类型
*/
const unitIsShow = (val: tableButton, unitName: string) => {
const unitIsShow = (val: attrButton, unitName: string) => {
// val.pattern
switch (val.fieldClass) {
case "id": //
@ -258,7 +276,7 @@ const unitIsShow = (val: tableButton, unitName: string) => {
@ 功能: 重置表单
*/
const ruleSearchForm = ref();
const resetFields = (formEl: FormInstance | undefined) => {
const resetFields = (_formEl: FormInstance | undefined) => {
// formEl.resetFields()
// console.log("formEl",formEl,formEl.resetFields())
// if (!formEl) return
@ -272,8 +290,16 @@ const resetFields = (formEl: FormInstance | undefined) => {
//20250117
const qrCodesPrintDialogFlag = ref(false);
let tableRefs = reactive({});
const tablesData = ref({});
let tableRefs = reactive<Record<string, HTMLElement>>({});
interface TableData {
dataTitle: any;
appName: string;
formName: string;
bufferedImage: string;
fieldsMap: Array<{ key: string; value: string }>;
}
const tablesData = ref<Record<string, TableData>>({});
function getDetailQrCodes(val: any) {
return request({
url: "/javasys/lowCode/QrCode/getDetailQrCodes",
@ -286,18 +312,42 @@ function getDetailQrCodes(val: any) {
});
}
// function modifyFieldsMap4(fieldsMap: any): Array<{ key: string; value: string }> {
// let result: Array<{ key: string; value: string }> = [];
// // 使 Object.entries
// for (const [key, value] of Object.entries(fieldsMap)) {
// let parts = value.split("!@#@!");
// if (parts.length === 2) {
// result.push({ key: parts[0], value: parts[1] });
// } else {
// // 使
// result.push({ key, value });
// }
// }
// return result;
// }
function modifyFieldsMap4(fieldsMap: any): Array<{ key: string; value: string }> {
let result: Array<{ key: string; value: string }> = [];
// 使 Object.entries
if (!fieldsMap || typeof fieldsMap !== 'object') {
console.warn('Invalid fieldsMap provided:', fieldsMap);
return result;
}
for (const [key, value] of Object.entries(fieldsMap)) {
let parts = value.split("!@#@!");
if (parts.length === 2) {
result.push({ key: parts[0], value: parts[1] });
} else {
// 使
result.push({ key, value });
try {
let parts = String(value).split("!@#@!");
if (parts.length === 2) {
result.push({ key: parts[0], value: parts[1] });
} else {
result.push({ key, value: String(value) });
}
} catch (error) {
console.error('Error processing field:', key, error);
result.push({ key, value: String(value) });
}
}
return result;
}
@ -305,61 +355,169 @@ function modifyFieldsMap4(fieldsMap: any): Array<{ key: string; value: string }>
const isButton1Disabled = ref(false);
const isButton2Disabled = ref(false);
// async function downloadTables() {
// isButton1Disabled.value = true;
// isButton2Disabled.value = true;
// const loadingInstance = ElLoading.service({
// fullscreen: true,
// text: "...", //
// });
// //ElMessage('This is a message.')
// const zip = new JSZip();
// //console.log(tableRefs)
// // for (const [tableKey, element] of Object.entries(tableRefs)) {
// // try {
// // const canvas = await html2canvas(element);
// // const dataUrl = canvas.toDataURL("image/png");
// // const byteString = atob(dataUrl.split(",")[1]);
// // const mimeString = dataUrl.split(",")[0].split(":")[1].split(";")[0];
// // const ab = new ArrayBuffer(byteString.length);
// // const ia = new Uint8Array(ab);
// // for (let i = 0; i < byteString.length; i++) {
// // ia[i] = byteString.charCodeAt(i);
// // }
// // const blob = new Blob([ab], { type: mimeString });
// // zip.file(`${props.formBasicConfig.formName}-${tableKey}.png`, blob);
// // } catch (error) {
// // console.error(`Error converting ${tableKey} to image:`, error);
// // }
// // }
// const tableEntries = Object.entries(tableRefs);
// //
// await Promise.all(tableEntries.map(async ([tableKey, element]) => {
// try {
// const canvas = await html2canvas(element);
// const dataUrl = canvas.toDataURL("image/png");
// const byteString = atob(dataUrl.split(",")[1]);
// const mimeString = dataUrl.split(",")[0].split(":")[1].split(";")[0];
// const ab = new ArrayBuffer(byteString.length);
// const ia = new Uint8Array(ab);
// for (let i = 0; i < byteString.length; i++) {
// ia[i] = byteString.charCodeAt(i);
// }
// const blob = new Blob([ab], { type: mimeString });
// zip.file(`${props.formBasicConfig.formName}-${tableKey}.png`, blob);
// } catch (error) {
// console.error(`Error converting ${tableKey} to image:`, error);
// }
// }));
// zip.generateAsync({ type: "blob" }).then(function (content) {
// const now = new Date();
// const formattedDate = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(
// 2,
// "0"
// )}${String(now.getDate()).padStart(2, "0")}_${String(now.getHours()).padStart(
// 2,
// "0"
// )}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(
// 2,
// "0"
// )}`;
// const fileName = `${props.formBasicConfig.formName}-${formattedDate}.zip`;
// const link = document.createElement("a");
// link.href = URL.createObjectURL(content);
// link.download = fileName;
// loadingInstance.close();
// link.click();
// tableRefs = {};
// //
// isButton1Disabled.value = false;
// isButton2Disabled.value = false;
// });
// }
async function downloadTables() {
// 1.
isButton1Disabled.value = true;
isButton2Disabled.value = true;
const loadingInstance = ElLoading.service({
fullscreen: true,
text: "正在生成图片,请稍候...", //
text: "正在生成图片,请稍候...",
});
//ElMessage('This is a message.')
const zip = new JSZip();
//console.log(tableRefs)
for (const [tableKey, element] of Object.entries(tableRefs)) {
try {
const canvas = await html2canvas(element);
const dataUrl = canvas.toDataURL("image/png");
const byteString = atob(dataUrl.split(",")[1]);
const mimeString = dataUrl.split(",")[0].split(":")[1].split(";")[0];
const ab = new ArrayBuffer(byteString.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
const blob = new Blob([ab], { type: mimeString });
zip.file(`${props.formBasicConfig.formName}-${tableKey}.png`, blob);
} catch (error) {
console.error(`Error converting ${tableKey} to image:`, error);
try {
const zip = new JSZip();
const tableEntries = Object.entries(tableRefs);
const errors: string[] = [];
// 2.
const concurrencyLimit = 3;
const batches = [];
for (let i = 0; i < tableEntries.length; i += concurrencyLimit) {
batches.push(tableEntries.slice(i, i + concurrencyLimit));
}
}
zip.generateAsync({ type: "blob" }).then(function (content) {
// 3.
for (const batch of batches) {
await Promise.all(batch.map(async ([tableKey, element]) => {
try {
// 4. html2canvas
const canvas = await html2canvas(element, {
scale: 2,
useCORS: true,
logging: false,
backgroundColor: "#ffffff",
removeContainer: true
});
// 5.
const dataUrl = canvas.toDataURL("image/png");
const byteString = atob(dataUrl.split(",")[1]);
const mimeString = dataUrl.split(",")[0].split(":")[1].split(";")[0];
const ab = new ArrayBuffer(byteString.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
const blob = new Blob([ab], { type: mimeString });
zip.file(`${props.formBasicConfig.formName}-${tableKey}.png`, blob);
} catch (error) {
console.error(`Error converting ${tableKey} to image:`, error);
errors.push(tableKey);
}
}));
}
// 6. ZIP
const content = await zip.generateAsync({ type: "blob" });
const now = new Date();
const formattedDate = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(
2,
"0"
)}${String(now.getDate()).padStart(2, "0")}_${String(now.getHours()).padStart(
2,
"0"
)}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(
2,
"0"
)}`;
const formattedDate = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}_${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
const fileName = `${props.formBasicConfig.formName}-${formattedDate}.zip`;
const link = document.createElement("a");
link.href = URL.createObjectURL(content);
link.download = fileName;
loadingInstance.close();
document.body.appendChild(link);
link.click();
tableRefs = {};
//
document.body.removeChild(link);
// 7.
if (errors.length > 0) {
ElMessage.warning(`以下表格转换失败:${errors.join(", ")}`);
}
} catch (error) {
console.error("Error in downloadTables:", error);
ElMessage.error("生成图片时发生错误,请重试");
} finally {
// 8.
loadingInstance.close();
isButton1Disabled.value = false;
isButton2Disabled.value = false;
});
}
}
function closeQrDownload() {
qrCodesPrintDialogFlag.value = false;
tableRefs = {};
@ -376,7 +534,7 @@ let dofs: any[] = []; //deptOrgAndOrgCententAndFounderArr
let rangedDatePickerInTables: any[] = [];
function getAllRangedDatePickerInTables(){
let dataList = ref({});
let dataList = ref<any[]>([]);
dataList.value = props.fieldsDetailList;
if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) {
for (let i = 0; i < dataList.value.length; i++) {
@ -398,7 +556,7 @@ function getAllRangedDatePickerInTables(){
function getAsfs() {
//setTimeout(() => {
let dataList = ref({});
let dataList = ref<any[]>([]);
dataList.value = props.fieldsDetailList;
if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) {
for (let i = 0; i < dataList.value.length; i++) {
@ -590,7 +748,7 @@ function getLabelById(id: string): string | undefined {
@ 时间: 2024-04-01 11:36:07
@ 功能: 功能按钮动作
*/
const setUpClick = (val: string, id: string) => {
const setUpClick = (val: any, _id?: string) => {
//alert(val.key)
// console.log("",val,"----id----->",props.versionid,"-----formId---->",props.versiontitle)
if (val.key == "newAdd") {
@ -603,7 +761,8 @@ const setUpClick = (val: string, id: string) => {
} else if (val.key == "showQrCode") {
//liwenxuan 20250114 start
//,
let idArray = state.selectionChecked.map((item) => item.id);
// let idArray = state.selectionChecked.map((item) => item.id);
let idArray = Array.isArray(state.selectionChecked) ? state.selectionChecked.map((item) => item?.id).filter(Boolean) : [];
if (idArray.length > 0) {
//console.log(props.formBasicConfig)
if (props.formBasicConfig.qrCodeFlag == true) {
@ -964,7 +1123,7 @@ watch(
);
watch(
() => props.formId,
(val: any) => {
(_val: any) => {
getPageData();
},
{
@ -972,9 +1131,9 @@ watch(
}
);
const timeAxisRef = ref(null);
const calendarPageRef = ref(null);
const cardPageRef = ref(null);
const timeAxisRef = ref();
const calendarPageRef = ref();
const cardPageRef = ref();
const searchSend = reactive({
formId: props.formId,
page: state.currentPage,
@ -1092,9 +1251,14 @@ function doExportTableData() {
let maxline = 0;
//
for (let val of fields) {
if (typeof val === "string")
line.push((item[val.field] as string).replaceAll(",", ","));
else line.push(item[val.field]);
const fieldValue = item[val.field];
if (fieldValue == null) {
line.push(""); //
} else if (typeof fieldValue === "string") {
line.push((fieldValue as string).replaceAll(",", ","));
} else {
line.push(fieldValue);
}
}
//
@ -1168,8 +1332,8 @@ function doExportTableData() {
}
dynamicVNode.value = h(exportPanel, {
fields: columnsFilter.value.filter((item) => item.pattern !== "table"),
subtabs: columnsFilter.value.filter((item) => item.pattern === "table"),
fields: columnsFilter.value.filter((item:any) => item.pattern !== "table"),
subtabs: columnsFilter.value.filter((item:any) => item.pattern === "table"),
subFields: subTableFieldsFilter.value.fields,
commitFunc: exportFunc,
closeFunc: () => (dynamicVNode.value = null),
@ -1278,7 +1442,7 @@ async function doGainFormPageListCont(sendData: any) {
}
//console.log(data.data.list)
transferDetails.forEach((element) => {
transferDetails.forEach((element:any) => {
//console.log(element)
data.data.list.forEach((obj: any) => {
//console.log(obj)
@ -1525,10 +1689,9 @@ const judjeRadio = (val: any, options: any[]) => {
@ 功能: 获取级联选择值
*/
const judjeCascader = (val: any[], options: any[]) => {
if (val.length < 0) return "";
let valAry = stringToObj(val);
// console.log("", stringToObj(val), val.length, options);
if (!Array.isArray(valAry)) return "";
if (!Array.isArray(val) || val.length === 0) return "";
let valAry = val;
// console.log("", val, val.length, options);
let title = "";
valAry.forEach((item: any) => {
// console.log("item", item);
@ -1603,7 +1766,7 @@ const confirmEvent = (val: any) => {
getPageData();
});
};
const cancelEvent = (val: any) => {
const cancelEvent = (_val: any) => {
// console.log('cancel!',val)
};
const container = ref(); //
@ -1619,7 +1782,16 @@ const asflookPageInfoIsShow = ref(false);
const pageInfoCont = ref<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;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
@ -1635,6 +1807,11 @@ const editInfo = (val: any) => {
// console.log('!',val)
operState.value = 5;
tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
@ -1647,6 +1824,11 @@ const editInfo = (val: any) => {
const submitApproval = (val: any) => {
operState.value = 4;
tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
@ -1662,7 +1844,7 @@ const withdrawApplication = (val: any) => {
// id: val.masters_key,
id: val.runFlowId,
};
retractRunWorkFlow(sendInfo).then((data) => {
retractRunWorkFlow(sendInfo).then((_data) => {
ElMessage({
message: "撤回成功!",
type: "success",
@ -1679,7 +1861,7 @@ const recallSendMsg = (val: any) => {
let sendInfo = {
id: val.masters_key.toString(),
};
recalSendMsg(sendInfo).then((data) => {
recalSendMsg(sendInfo).then((_data) => {
ElMessage({
message: "撤回成功!",
type: "success",
@ -1695,6 +1877,11 @@ const recallSendMsg = (val: any) => {
const afreshSendFlow = (val: any) => {
operState.value = 2;
tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
@ -1707,81 +1894,62 @@ const afreshSendFlow = (val: any) => {
const editFormSendFlow = (val: any) => {
operState.value = 3;
tablePageClass.value = 2;
if(val.mastersKeyStr && val.mastersKeyStr != ""){
val.masters_key = val.mastersKeyStr
}
pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
const viewType = ref(1);
const viewLayout = ref<any>();
const resetViewClickStates = (excludeView?: string) => {
if (!props.viewPage || typeof props.viewPage !== 'object') return;
const views = ['list', 'date', 'time', 'gantt', 'map', 'card', 'chart'];
views.forEach(view => {
const viewObj = props.viewPage[view];
if (view !== excludeView && viewObj && typeof viewObj === 'object') {
viewObj.isClick = false;
}
});
};
/**
@ 作者: 秦东
@ 时间: 2024-07-08 09:39:52
@ 功能: 切换视图展示方式
*/
const tabsView = (val: any, types: number) => {
viewType.value = types;
viewType.value = types;
val.isClick = true;
viewLayout.value = val;
// console.log("",val)
switch (types) {
case 2:
props.viewPage.list.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.map.isClick = false;
props.viewPage.card.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('date');
break;
case 3:
props.viewPage.list.isClick = false;
props.viewPage.date.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.map.isClick = false;
props.viewPage.card.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('time');
getPageData();
break;
case 4:
props.viewPage.list.isClick = false;
props.viewPage.date.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.map.isClick = false;
props.viewPage.card.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('gantt');
break;
case 5:
props.viewPage.list.isClick = false;
props.viewPage.date.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.card.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('map');
break;
case 6:
props.viewPage.list.isClick = false;
props.viewPage.date.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.map.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('card');
break;
case 7:
props.viewPage.card.isClick = false;
props.viewPage.list.isClick = false;
props.viewPage.date.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.map.isClick = false;
resetViewClickStates('chart');
break;
default:
props.viewPage.date.isClick = false;
props.viewPage.card.isClick = false;
props.viewPage.time.isClick = false;
props.viewPage.gantt.isClick = false;
props.viewPage.map.isClick = false;
props.viewPage.chart.isClick = false;
resetViewClickStates('list');
break;
}
}
};
/**
@ 作者: 秦东
@ -1794,7 +1962,7 @@ const writeListTitle = (val: any, viewConfig: any) => {
var titleAry: any[] = [];
if (viewConfig.form && viewConfig.form.title) {
if (viewConfig.form.title.length > 0) {
viewConfig.form.title.forEach((item: string|number, index: any) => {
viewConfig.form.title.forEach((item: string|number, _index: any) => {
// console.log("--"+index+"-->",val[item])
if (val[item]) {
titleAry.push(val[item]);
@ -1845,7 +2013,7 @@ const judgeListTitle = (val: any, viewConfig: any) => {
return false;
};
//
const transformOption = (val: string | number, type?: string) => {
const transformOption = (val: string | number, _type?: string) => {
return formatNumber(val);
};
@ -1891,7 +2059,7 @@ const tableChildren = (field:string,dataList:any) => {
let jieguo = ""
if(Array.isArray(dataList)){
dataList.forEach((item:any,key:string) => {
dataList.forEach((item:any,_index:number) => {
// console.log("label-item--->",field, item);
if(isObject(item)){
@ -1916,6 +2084,15 @@ jieguo = jieguo+"<div style='width: 100%;height: 1px;border-bottom: 1px solid #E
const isObject = (obj: any) => {
return typeof obj === "object";
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 13:17:48
@ 功能: 取菲值
*/
const getNonValue = () => {
// eslint-disable-next-line vue/no-mutating-props
props.config.searchIsShow = !props.config.searchIsShow
}
</script>
<template>
<div ref="container" v-loading="state.loading" class="table-list-comm">
@ -1936,7 +2113,6 @@ const isObject = (obj: any) => {
v-model="item.value"
type="datetime"
:placeholder="'请选择' + item.label"
:shortcuts="shortcuts"
/>
<SearchSelect
v-if="unitIsShow(item, 'radio')"
@ -2045,7 +2221,7 @@ const isObject = (obj: any) => {
<el-button
size="small"
class="fa fa-search"
@click="config.searchIsShow = !config.searchIsShow"
@click="getNonValue()"
/>
</el-tooltip>
<el-tooltip
@ -2201,15 +2377,15 @@ const isObject = (obj: any) => {
header-align="center"
align="center"
>
<template #default="scope">
<template v-for="sunItem in item.children" v-if="item.pattern == 'table'">
<el-table-column v-if="sunItem.fieldClass == ''" :prop="sunItem.field" :label="sunItem.label" header-align="center" align="center" :min-width="readerColumnSun(sunItem)">
<template #default="scopeChilder">
<div v-html="tableChildren(sunItem.field,scopeChilder.row[item.field])"></div>
</template>
</el-table-column>
<template #default>
<template v-for="sunItem in item.children" :key="sunItem.field">
<template v-if="item.pattern == 'table'" >
<el-table-column v-if="sunItem.fieldClass == ''" :prop="sunItem.field" :label="sunItem.label" header-align="center" align="center" :min-width="readerColumnSun(sunItem)">
<template #default="scopeChilder">
<div v-html="tableChildren(sunItem.field,scopeChilder.row[item.field])"></div>
</template>
</el-table-column>
</template>
</template>
</template>
</el-table-column>
@ -2379,32 +2555,33 @@ const isObject = (obj: any) => {
{{ scope.column.label }}
<tooltip :content="item.help" />
</template>
<template v-if="item.fieldClass == 'deptOrg'" #default="scope">
<!-- {{scope.row[scope.column.property]}}{{item}} -->
{{ scope.row[scope.column.property] }}
</template>
<template v-if="item.fieldClass == 'cascader'" #default="scope">
{{ judjeCascader(scope.row[scope.column.property], item.options) }}
</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>
<template #default="scope">
<div v-if="item.fieldClass == 'deptOrg'">
<!-- {{scope.row[scope.column.property]}}{{item}} -->
{{ scope.row[scope.column.property] }}
</div>
</template>
<template v-if="item.fieldClass == 'switch'" #default="scope">
<div v-else-if="item.fieldClass == 'cascader'">
{{ judjeCascader(scope.row[scope.column.property], item.options) }}
</div>
<div v-else-if="item.fieldClass == 'radio'">
<!-- {{scope.row[scope.column.property]}}{{item}} -->
{{ judjeRadio(scope.row[scope.column.property], item.options) }}
</div>
<div v-else-if="item.fieldClass == 'upload'">
<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>
</div>
<div v-else-if="item.fieldClass == 'switch'">
<el-tag
v-if="judjeSwitch(scope.row[scope.column.property], item.activeValue)"
type="success"
@ -2413,18 +2590,19 @@ const isObject = (obj: any) => {
启用
</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>
<template v-if="item.fieldClass == 'associatedForms'" #default="scope">
<el-link
key="primary"
type="primary"
@click="showAsfDetailDialog(item, scope, asfQueryParams)"
>
{{ scope.row[scope.column.property] }}==
</el-link>
</div>
<div v-else-if="item.fieldClass == 'baidumap'">
{{ scope.row[scope.column.property] }}
</div>
<div v-else-if="item.fieldClass == 'associatedForms'">
<el-link
key="primary"
type="primary"
@click="showAsfDetailDialog(item, scope, asfQueryParams)"
>
{{ scope.row[scope.column.property] }}==
</el-link>
</div>
</template>
</el-table-column>
</template>
@ -2493,7 +2671,7 @@ const isObject = (obj: any) => {
<SeeContChart
:echats-views="echatsViewsdf"
:echats-views="[echatsViewsdf]"
:table-key="formBasicConfig.name"
:types="1"
/>
@ -2543,15 +2721,27 @@ const isObject = (obj: any) => {
</el-button-group>
</el-col>
</el-row>
<FormPageCont
<NewFormPageCont
v-model:is-show="lookPageInfoIsShow"
:drawer-with="drawerWith"
:page-info="pageInfoCont"
:table-page-class="tablePageClass"
:oper-state="operState"
:dprt="rangedDatePickerInTables1"
:versiontitle="props.versiontitle"
@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
v-model:is-show="asflookPageInfoIsShow"
:drawer-with="drawerWith"
@ -2561,22 +2751,23 @@ const isObject = (obj: any) => {
:dprt="rangedDatePickerInTables1"
@get-page-data="getPageData"
/>
<TableFlow
<!-- <TableFlow
v-model:isopen="openTaskDrawer"
:versionid="props.versionid"
:versiontitle="props.versiontitle"
:drawerwith="drawerWith"
:pick-app-menu="pickAppMenu"
@searchquery="getListData"
/>
<!-- <NewTableFlow
/> -->
<NewTableFlow
v-model:show="openTaskDrawer"
:versionid="props.versionid"
:versiontitle="props.versiontitle"
:drawerwith="drawerWith"
:pick-app-menu="pickAppMenu"
@searchquery="getListData"
/> -->
/>
</div>
<div v-if="dynamicVNode">

1387
src/components/DesignForm/app/index_20260129.vue

File diff suppressed because it is too large

38
src/components/DesignForm/app/pageViews/tableList.vue

@ -0,0 +1,38 @@
<!--
@ 作者: 秦东
@ 时间: 2026-01-28 14:29:57
@ 备注: 列表视图
-->
<script lang='ts' setup>
import { attrButton, FormPageList } from '@/api/DesignForm/tableButton';
const props = withDefaults(
defineProps<{
data: FormPageList | any;
searchData?: attrButton[] | any;
}>(),
{
showPage: true,
data: () => {
return { columns: [], controlBtn: [], operateBtn: [], config: {} };
},
searchData: () => {
return [];
},
}
)
const tableDataList = ref([]); //
</script>
<template>
<div class="app-content">
</div>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

23
src/components/DesignForm/public/expand/lowcodeImage.vue

@ -7,7 +7,7 @@
import {
AnalysisCss,
AnalysisInputCss,
} from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
} from "@/components/DesignForm/public/form/calculate/cssInfo";
import errimg from "@/assets/404_images/imgNotFound.png";
import { uploadUrl, getRequest } from "@/api/DesignForm";
import { ref,useAttrs } from 'vue'
@ -16,6 +16,8 @@ import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile } from 'element-plus'
import { useRoute } from 'vue-router';
import NoImgPage from '@/assets/image/1.png'
import { getCurrentInstance } from 'vue';
const getAncestorComponentNames = () => {
@ -310,7 +312,7 @@ const fit = computed(()=>{
</script>
<template>
<el-image
v-if="(!hasELCard(ancestors))&&props.data.control.useDefaultImg&&props.type==5"
v-if="(!hasELCard(ancestors))&&props.data.control&&props.type==5"
:src="value"
class="avatar"
:style="getFormItemInputStyle(configStyle, 2)"
@ -351,6 +353,23 @@ const fit = computed(()=>{
:style="getFormItemInputStyle(configStyle, 2)"
:fit="fit"
/>
</el-upload>
<el-upload
v-if="props.type==1"
v-bind="$props"
class="upload-demo"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
>
<el-image
:src="props.modelValue?props.modelValue:NoImgPage"
class="avatar"
:style="getFormItemInputStyle(configStyle, 2)"
:fit="fit"
/>
</el-upload>
<!-- <img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" /> -->
<!-- <div></div> -->

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

@ -613,7 +613,8 @@ provide(constControlChange, ({ key, value, data, tProp, type, attribute }: any)
let formatRes: any = data.data;
//
const afterResponse = props.formData.events?.afterResponse;
// -
let result = {};
if (typeof afterResponse === "string" && afterResponse) {
formatRes = formatResult(result, afterResponse);
} else if (typeof afterResponse === "function") {
@ -3143,7 +3144,7 @@ const submitEditButton = (params = {}) => {
if (submitParams === false) {
return;
}
// console.log("",apiUrl,submitParams,formatParams)
console.log("提交修改数据",apiUrl,submitParams,formatParams)
//
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => {
@ -3247,6 +3248,7 @@ const webPage = computed({
class="pcBox"
:class="{ boxAI: type != 5 && currentAgent.length > 0 }"
>
<Aiassist
ref="aiassistRef"
v-if="type != 5 && currentAgent.length > 0"

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

@ -18,6 +18,8 @@ import { jsonParseStringify } from "@/utils/DesignForm";
import request from "@/utils/request";
import { AnalysisCss } from "@/components/DesignForm/public/form/calculate/cssInfo";
import { nodePoweInfo,powerAryInfo } from "@/api/taskapi/types";
import SvgIcon from "@/components/SvgIcon/index.vue";
import { cs } from "element-plus/es/locale";
const props = withDefaults(
defineProps<{
@ -355,7 +357,7 @@ const linksIf = (obj: FormList) => {
//
const injectBtnEvent: any = inject(constFormBtnEvent);
const clickBtn = (control: any) => {
// console.log(control)
console.log(type.value,"------->",control)
// 0: '',
// 1: '',
// 2: '',
@ -798,6 +800,39 @@ const judgeIsShow = (key: string) => {
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-29 11:31:35
@ 功能: 输出按钮样式
*/
const judgaButClass = (btnClass:string):string => {
switch(btnClass){
case "submit":
return "btn-primary"
break;
case "draftSubmit":
return "btn-primary"
break;
case "saveDraft":
return "btn-secondary"
break;
case "saveEditDraft":
return "btn-success"
break;
case "submitEdit":
return "btn-success"
break;
case "afreshSubmit":
return "btn-warning"
break;
case "dangerErr":
return "btn-danger"
break;
default:
return "btn-primary"
}
return ""
}
</script>
<template>
<draggable
@ -814,7 +849,9 @@ const judgeIsShow = (key: string) => {
}"
@add="draggableAdd"
>
<template #item="{ element, index }">
<div
class="group"
:class="{
@ -944,6 +981,24 @@ const judgeIsShow = (key: string) => {
<form-group :data="element.list" data-type="not-nested" :org-and-man-tree="orgAndManTree" />
</div>
</template>
<template v-else-if="element.type === 'btndiv' && judgeIsShow(element.name)">
<div class="form-buttons">
<!-- <form-group :data="element.list" data-type="not-nested" :org-and-man-tree="orgAndManTree" /> -->
<template v-for="(item,index) in element.list" :key="index">
<button v-bind="item.control" @click="clickBtn(item.control)" type="submit" :class="['btn',judgaButClass(item.control?.key)]">
<SvgIcon v-if="item.control?.key=='submit'" icon-class="fbsk" />
<SvgIcon v-if="item.control?.key=='saveDraft'" icon-class="caogaoxiang" />
<SvgIcon v-if="item.control?.key=='draftSubmit'" icon-class="fbsk" />
<SvgIcon v-if="item.control?.key=='saveEditDraft'" icon-class="caogaoxiang" />
<SvgIcon v-if="item.control?.key=='submitEdit'" icon-class="cssq" />
<SvgIcon v-if="item.control?.key=='afreshSubmit'" icon-class="gdqr" />
<SvgIcon v-if="item.control?.key=='dangerErr'" icon-class="gb2" />
{{ item.control?.label }}
</button>
</template>
</div>
</template>
<!--弹性布局-->
<template v-else-if="element.type === 'flex' && judgeIsShow(element.name)" >
@ -965,13 +1020,14 @@ const judgeIsShow = (key: string) => {
<!--按钮-->
<template v-else-if="element.type === 'button'">
<div
:class="[element.config?.className]"
:class="['form-buttons',element.config?.className]"
:style="{ 'text-align': element.config?.textAlign }"
>
<el-button
v-bind="element.control"
@click="clickBtn(element.control)"
color="#626aef"
>
<td :style="getFormItemLableStyle(element.styles)">
{{ element.control?.label }}
@ -1045,4 +1101,60 @@ const judgeIsShow = (key: string) => {
</template>
</draggable>
</template>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.form-buttons {
// display: flex;
gap: 15px;
margin-top: 30px;
width: 100%;
text-align: center;
svg{
margin-right: 5px;
}
}
.btn {
padding: 10px 28px;
border-radius: 10px;
font-weight: 600;
font-size: 1.3rem;
cursor: pointer;
transition: all 0.3s;
border: none;
margin: 0 5px;
}
.btn-primary {
background: linear-gradient(135deg, #0020C2, #4d6cff);
color: white;
// flex: 1;
}
.btn-secondary {
background: #f0f4ff;
color: #0020C2;
border: 1px solid rgba(0, 32, 194, 0.3);
// flex: 1;
}
.btn-success {
background: #67C23A;
color: #FFFFFF;
// flex: 2;
}
.btn-warning {
background: #E6A23C;
color: #FFFFFF;
// flex: 1;
}
.btn-danger {
background: #F56C6C;
color: #FFFFFF;
// flex: 1;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 32, 194, 0.15);
}
</style>

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

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

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

File diff suppressed because it is too large

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

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

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

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

4
src/main.ts

@ -31,14 +31,14 @@ import * as pinia from './store/index'
import SketchRule from 'vue3-sketch-ruler'
import 'vue3-sketch-ruler/lib/style.css'
import '@/styles/tree-select-global.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
const app = createApp(App);
// 全局注册 自定义指令(directive)
setupDirective(app);
// 全局注册 状态管理(store)
setupStore(app);
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}

8
src/utils/encryptionAndDecryption/sm4Utils.ts

@ -59,10 +59,10 @@ const sm4DecryptMethod = (data: string, customKey: string): string => {
}
}
// console.log('SM4解密方法----解密结构---data--->', data)
console.log('SM4解密方法----解密结构----customKey-->', customKey)
console.log('SM4解密方法----解密结构--ivSetup---->', ivSetup)
console.log('SM4解密方法----解密结构---sm4TokenKey--->', sm4TokenKey)
console.log('SM4解密方法----解密结构---appSystemKey--->', appSystemKey)
// console.log('SM4解密方法----解密结构----customKey-->', customKey)
// console.log('SM4解密方法----解密结构--ivSetup---->', ivSetup)
// console.log('SM4解密方法----解密结构---sm4TokenKey--->', sm4TokenKey)
// console.log('SM4解密方法----解密结构---appSystemKey--->', appSystemKey)
return sm4.decrypt(data, appSystemKey, {
iv: ivSetup,
mode: sm4.constants.CBC,

20
src/utils/request.ts

@ -43,7 +43,7 @@ service.interceptors.request.use(
//form 云盘请求不加密, 但是Auth-key还是要传输,接口返回的数据可能需要加密 :by han2015
//form 云盘请求不加密, 但是Auth-key还是要传输,接口返回的数据可能需要加密
if (config.headers['Content-Type'] == 'application/x-www-form-urlencoded'||config.headers['Content-Type'] == 'multipart/form-data' ){
return config
}
@ -58,10 +58,12 @@ service.interceptors.request.use(
data: sm4EncryptMethod(JSON.stringify(data), randomString)
}
}
console.log('请求拦截---------->', randomString)
console.log('请求拦截----headers------>', headers)
console.log('请求拦截----data------>', config.data)
console.log('请求拦截----config------>', config)
// console.error('请求拦截---------->', randomString)
// console.error('请求拦截----headers------>', headers)
console.log('请求拦截----config---url--->', config.url)
console.log('请求拦截----data------>', data)
// console.error('请求拦截----config------>', config)
// console.log('请求拦截----content-type------>', config.headers['Content-Type'])
// console.log('请求拦截----config------>', config.headers)
return config
@ -80,7 +82,7 @@ service.interceptors.response.use(
let { data, headers } = response
let authKey = headers['auth-key']
// console.log('行营结果----authKey------>', authKey)
// console.log('行营结果----data------>', data)
// 解密响应数据
if (authKey) {
let jsonData = sm4DecryptMethod(data.data, authKey)
@ -97,7 +99,7 @@ service.interceptors.response.use(
type: "warning",
}).then(() => {
localStorage.clear();
window.location.href = "/login";
window.location.href = "#/login";
// routerPinia.push({path:"/login"})
});
return response.data;
@ -139,7 +141,7 @@ service.interceptors.response.use(
type: 'warning'
}).then(() => {
localStorage.clear();
window.location.href = '/login';
window.location.href = '#/login';
// router.push({path:"/login"})
});
}else if(code === 7 || code === 300 || code === 301 || code === 302){
@ -148,7 +150,7 @@ service.interceptors.response.use(
type: "warning",
}).then(() => {
localStorage.clear();
window.location.href = "/login";
window.location.href = "#/login";
// routerPinia.push({path:"/login"})
});
}else if (code === 10001 || code === 10002 || code === 10003) {

250
src/utils/workflow/const.ts

@ -94,7 +94,7 @@ export let timeEquation = [
//新增表单数据按钮
export let submitButton = {
type: "div",
type: "btndiv",
control:
{},
config:
@ -104,22 +104,6 @@ export let submitButton = {
},
list: [
{
type: "grid",
iconFont: "fa-th-large",
columns: [
{
attr:{
span: 7
},
list: [],
type: "gridChild"
},
{
attr:{
span: 5
},
list: [
{
type: "button",
iconFont: "fa-square-o",
control:{
@ -130,12 +114,7 @@ export let submitButton = {
config:{
textAlign: "center"
}
}
],
type: "gridChild"
},
{
list: [
},
{
type: "button",
iconFont: "fa-square-o",
@ -148,28 +127,73 @@ export let submitButton = {
textAlign: "center"
}
}
],
attr:{
span: 5
},
type: "gridChild"
},
{
list: [],
attr:{
span: 7
},
type: "gridChild"
}
],
control:{},
config:{}
}
// {
// type: "grid",
// iconFont: "fa-th-large",
// columns: [
// {
// attr:{
// span: 7
// },
// list: [],
// type: "gridChild"
// },
// {
// attr:{
// span: 5
// },
// list: [
// {
// type: "button",
// iconFont: "fa-square-o",
// control:{
// label: "确认提交",
// type: "primary",
// key: "submit"
// },
// config:{
// textAlign: "center"
// }
// }
// ],
// type: "gridChild"
// },
// {
// list: [
// {
// type: "button",
// iconFont: "fa-square-o",
// control:{
// label: "保存草稿",
// type: "warning",
// key: "saveDraft"
// },
// config:{
// textAlign: "center"
// }
// }
// ],
// attr:{
// span: 5
// },
// type: "gridChild"
// },
// {
// list: [],
// attr:{
// span: 7
// },
// type: "gridChild"
// }
// ],
// control:{},
// config:{}
// }
]
}
//重新提交表单数据按钮
export let afreshSubmitButton = {
type: "div",
type: "btndiv",
control:
{},
config:
@ -179,67 +203,91 @@ export let afreshSubmitButton = {
},
list: [
{
type: "grid",
iconFont: "fa-th-large",
columns: [
{
attr:{
span: 7
},
list: [],
type: "gridChild"
},
{
attr:{
span: 5
},
list: [
{
type: "button",
iconFont: "fa-square-o",
control:{
label: "确认提交",
type: "primary",
key: "afreshSubmit"
},
config:{
textAlign: "center"
}
}
],
type: "gridChild"
},
{
list: [
{
type: "button",
iconFont: "fa-square-o",
control:{
label: "保存草稿",
type: "warning",
key: "saveEditDraft"
},
config:{
textAlign: "center"
}
}
],
attr:{
span: 5
},
type: "gridChild"
},
{
list: [],
attr:{
span: 7
},
type: "gridChild"
}
],
control:{},
config:{}
type: "button",
iconFont: "fa-square-o",
control:{
label: "确认提交",
type: "primary",
key: "afreshSubmit"
},
config:{
textAlign: "center"
}
},
{
type: "button",
iconFont: "fa-square-o",
control:{
label: "保存草稿",
type: "warning",
key: "saveEditDraft"
},
config:{
textAlign: "center"
}
}
// {
// type: "grid",
// iconFont: "fa-th-large",
// columns: [
// {
// attr:{
// span: 7
// },
// list: [],
// type: "gridChild"
// },
// {
// attr:{
// span: 5
// },
// list: [
// {
// type: "button",
// iconFont: "fa-square-o",
// control:{
// label: "确认提交",
// type: "primary",
// key: "afreshSubmit"
// },
// config:{
// textAlign: "center"
// }
// }
// ],
// type: "gridChild"
// },
// {
// list: [
// {
// type: "button",
// iconFont: "fa-square-o",
// control:{
// label: "保存草稿",
// type: "warning",
// key: "saveEditDraft"
// },
// config:{
// textAlign: "center"
// }
// }
// ],
// attr:{
// span: 5
// },
// type: "gridChild"
// },
// {
// list: [],
// attr:{
// span: 7
// },
// type: "gridChild"
// }
// ],
// control:{},
// config:{}
// }
]
}

149
src/views/public/orguser/orgalluser.vue

@ -34,7 +34,7 @@ const defaultProps ={
const orgLoading = ref(false)
const userLoading = ref(false)
//
const treeEl = ref(null)
const treeEl = ref()
const treeData = ref<orgform[]>([])
const department = ref<any>()
const userName = ref<any>()
@ -101,31 +101,31 @@ onMounted(() => {
})
})
//
const checkDataList = reactive<criteriaForPeopleList[]>([]);
const checkDataList = ref<criteriaForPeopleList[]>([]);
const tableRowClick = (row: any) => {
if(checkDataList.length > 0){
if(checkDataList.value.length > 0){
let isIn = true
checkDataList.forEach(item =>{
checkDataList.value.forEach(item =>{
if(item.id == row.id){
isIn = false
}
})
if(isIn){
checkDataList.push(row)
checkDataList.value.push(row)
}
}else{
checkDataList.push(row)
checkDataList.value.push(row)
}
// console.log("checkDataList",checkDataList,row)
}
//
const delRowClick = (row: criteriaForPeopleList) => {
// console.log("checkDataList",row)
if(checkDataList &&checkDataList.length > 0) {
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(checkDataList &&checkDataList.value.length > 0) {
checkDataList.value.forEach((item:criteriaForPeopleList,index:number) => {
if(item.id == row.id){
if(!item.noedit){
checkDataList.splice(index,1)
checkDataList.value.splice(index,1)
}
}
})
@ -134,11 +134,22 @@ const delRowClick = (row: criteriaForPeopleList) => {
//
const delAllClick = () => {
// checkDataList.splice(0,checkDataList.length)
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(!item.noedit){
checkDataList.splice(index,1)
console.log("清除所有的选择--1--->",checkDataList)
let delIndex: criteriaForPeopleList[] = []
checkDataList.value.forEach((item:criteriaForPeopleList,index:number) => {
console.log("清除所有的选择",item)
if(item.noedit){
// checkDataList.splice(index,1)
delIndex.push(item)
}
})
// if(delIndex.length > 0){
// delIndex.forEach((item:number) => {
// checkDataList.splice(item,1)
// })
// }
checkDataList.value = delIndex
console.log("清除所有的选择---2-->",delIndex)
}
//
@ -154,9 +165,9 @@ const confirmChoices = () => {
//
const backfillData = () => {
if(props.selectedPeople && props.selectedPeople.length > 0){
checkDataList.splice(0,checkDataList.length)
checkDataList.value.splice(0,checkDataList.value.length)
props.selectedPeople.forEach((item:any)=>{
checkDataList.push(item)
checkDataList.value.push(item)
})
}
// console.log("props.selectedPeople",props.selectedPeople,checkDataList)
@ -168,11 +179,93 @@ const backfillData = () => {
title="选择人员"
:append-to-body="true"
:props="defaultProps "
width="80%"
width="90%"
top="2vh"
draggable
>
<el-row :gutter="20">
<div class="diaBody">
<div class="sidebar_tree">
<el-text class="orgTitle" size="large">行政组织</el-text>
<el-tree
v-loading="orgLoading"
element-loading-text="Loading..."
ref="treeEl"
:data="treeData"
node-key="id"
@node-click="handleNodeClick"
:props="defaultProps "
highlight-current
/>
</div>
<div>
<div class="search">
<el-input placeholder="请输入用户名" v-model="userName" />
<el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="resetClick">重置</el-button>
</div>
<div class="list">
<el-table v-loading="userLoading" border element-loading-text="Loading..." :data="tableData" style="width: 100%; height:660px">
<el-table-column fixed prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column fixed prop="name" label="姓名" width="150px" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column prop="tel" label="联系方式" width="120px" align="left" />
<el-table-column prop="nickName" label="归属行政组织" width="500px" align="left">
<template #default="{ row }">
{{ row.companyName }}<span v-if="row.departmentname!=''"> / {{ row.departmentname }}</span><span v-if="row.postname!=''"> / {{ row.postname }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60px">
<template #default="{ row }">
<el-button circle size="small" @click="tableRowClick(row)"><el-icon><ArrowRight /></el-icon></el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination
size="small"
layout="prev, pager, next"
:total="page.total"
class="mt-4"
@current-change="currentChange"
/>
</div>
</div>
</div>
<div class="has_select">
<div class="total">
<div>已选择{{ checkDataList.length }}</div>
<el-button type="danger" @click="delAllClick" size="small">全部移除</el-button>
</div>
<el-table :data="checkDataList" border style="height:680px">
<el-table-column prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column label="操作" width="60px">
<template #default="{ row }">
<el-button v-if="!row.noedit" size="small" type="danger" @click="delRowClick(row)">移除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- <el-row :gutter="20">
<el-col :span="6" style="padding:0">
<div class="sidebar_tree">
<el-text class="orgTitle" size="large">行政组织</el-text>
@ -261,7 +354,7 @@ const backfillData = () => {
</div>
</el-col>
</el-row>
</el-row> -->
<template #footer>
<div>
<el-button @click="clostBox">取消</el-button>
@ -271,6 +364,17 @@ const backfillData = () => {
</el-dialog>
</template>
<style lang='scss' scoped>
.diaBody{
width: 100%;
display: grid;
grid-template-columns: 300px 1fr 250px; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
margin: 0 auto;
}
.orgTitle{
padding: 0 0 0 5px;
}
@ -285,7 +389,7 @@ const backfillData = () => {
}
.has_select {
width: 100%;
.total {
display: flex;
justify-content: space-between;
@ -301,10 +405,15 @@ const backfillData = () => {
margin-right: 10px;
}
}
.list{
width: 100%;
display: inline-grid;
}
.page {
padding-top: 20px;
padding-top: 0px;
width: 100%;
display: flex;
justify-content:space-between;
justify-content: center;
}
.expand-user-dialog {
display: flex;

2
src/views/public/orguser/orguser.vue

@ -113,7 +113,7 @@ const saveFlowUser = () => {
title="选择人员"
width="800"
draggable
:before-close="handleClose"
:before-close="closeBox"
>
<el-row :gutter="20">
<el-col :span="12" >

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

@ -7,6 +7,8 @@ import AppPageList from '@/components/DesignForm/app/index.vue'
import AppFormPage from '@/components/DesignForm/app/formPage.vue'
import DataSourcePage from '@/components/dataSource/index.vue'
import newFormDesign from '@/components/DesignForm/public/form/newForm.vue'
export default (app: any) => {
app.component('AkForm', formDesign)
app.component('AkList', tableList)
@ -16,4 +18,5 @@ export default (app: any) => {
app.component('AppPageList', AppPageList)
app.component('AppFormPage', AppFormPage)
app.component('DataSourcePage', DataSourcePage)
app.component('AppForm', newFormDesign)
}

281
src/views/sysworkflow/lowcodepage/pageFlow/aiPage.vue

@ -0,0 +1,281 @@
<!--
@ 作者: 秦东
@ 时间: 2026-01-28 08:25:29
@ 备注:
-->
<script lang='ts' setup>
import SvgIcon from "@/components/SvgIcon/index.vue";
import { doAiChat,aiChatData} from "@/api/doc/space"
import { useUserStore } from "@/store/modules/user";
import { VueMarkdown } from '@crazydos/vue-markdown'
import rehypeRaw from 'rehype-raw'
//
const userStore = useUserStore();
const userid="p0"+userStore.userInfoCont.userId;
const regulaKey=import.meta.env.VITE_REGUL_AI_AGENT;
const baseURL=import.meta.env.VITE_APP_BASE_API
const regulaURL =`${baseURL}/aibot/agents/${regulaKey}/chat`
const conversation=ref("") //uuid
const controller = ref<AbortController | null>(null)
const interact_msg=ref<{ask:boolean,think:string,content:string}[]>([{ask:false,think:"是",content:`你好!我是你的AI助手,
你可以直接向我提问或者编辑表单我会自动为你提供相关信息`}])
//
const inputText = ref('');
const respMsg=ref("") //markdown
//
interface message{
ask:boolean,
think:string,
content:string
}
//
interface chatRecord{
uuid:string,
agentuuid:string,
brief:string,
messages:message[]
}
defineExpose({onSendParamToAI})
async function onSendParamToAI(arr:Array<{ uuids: string[]; params: { [key: string]: any } }>){
//interact_msg.value=[]
for (let ele of arr){
//interact_msg.value.unshift({ask:true,think:"", content:"AI"})
for (let uid of ele.uuids){
let para={
inputs: {
"checkType":"travel",
"checkInfo":JSON.stringify(ele.params)
},
response_mode:"streaming",
user:userid,//base64
}
//
interact_msg.value.push({ask:true,think:"", content:JSON.stringify(para)})
await doRequest(`${baseURL}/aibot/assisted/${uid}/workflow`,para)
}
}
}
async function doRequest(furl:string,param:any){
let mRespMsg=""
controller.value = new AbortController();
try{
const res= await doAiChat(
furl,
param,
controller.value.signal
)
if (!res.ok) {
throw new Error(`HTTP ${res.status} ${res.statusText}`);
}
const reader = res.body!.getReader();
const decoder = new TextDecoder('utf-8');
let chunk = ''; //
while (true) {
const {done, value} = await reader.read()
if (done) break;
//
chunk += decoder.decode(value, {stream: true});
const lines = chunk.split(/\n/);
chunk = lines.pop() || ''
for (const line of lines) {
if (!line.trim()) continue; //
if (line.startsWith('data: ')) {
const data = line.slice(6);
const json = JSON.parse(data);
if(json.event==="text_chunk"){
//conversation.value=json.conversation_id
mRespMsg+=json.data.text
}else if(json.event==="message"){
respMsg.value+=json.answer
mRespMsg+=json.answer
}
}
}
}
}catch (e: any) {
if (e.name === 'AbortError') {
console.log('用户手动中断')
}
}
respMsg.value=""
const arr=mRespMsg.split("</think>")
if(arr.length===1){
interact_msg.value.push({ask:false,think:"",content:arr[0]})
}else{
//
let st = arr[1].trim().match(/({.*})/s)
if (st){
let res= JSON.parse(st[1])
interact_msg.value.push({ask:false,think:res.success,content:res.reason})
}else{
interact_msg.value.push({ask:false,think:arr[0],content:arr[1]})
}
}
scrollToBottom()
}
function resetContext(){
interact_msg.value=[]
conversation.value=""
//props.closefunc()
}
//
const sendMessage = () => {
const content = inputText.value.trim();
if (!content) return;
//
interact_msg.value.push({ ask: true,think:"", content });
const params={
inputs: {"onlineSearch":"否",
"useDataset":"是",
"queryUrl":""},
query:content,
response_mode:"streaming",
conversation_id:conversation.value,
user:userid
}
doRequest(regulaURL,params)
//
inputText.value = '';
};
const scrollbarRef = ref()
const scrollToBottom = () => {
const wrap = scrollbarRef.value?.wrapRef //
if (wrap) {
console.log(wrap.scrollHeight , wrap.clientHeight)
wrap.scrollTop = wrap.scrollHeight - wrap.clientHeight
}
}
</script>
<template>
<el-card shadow="always">
<template #header>
<div class="card-header">
<div class="svgBox"><SvgIcon icon-class="aiRoboot" size="25" /></div>
AI智能问答助手
</div>
</template>
<el-scrollbar ref="scrollbarRef" class="scroBox ">
<div v-for="(msg, index) in interact_msg" :key="index" class="ai-conversation">
<div v-if="msg.ask" class="message user-message">
<strong>用户</strong>{{ msg.content }}
</div>
<div v-else class="message ai-message">
<strong>AI助手</strong> <VueMarkdown :markdown="msg.content" :rehype-plugins="[rehypeRaw]" ></VueMarkdown>
</div>
</div>
<div class="ai-conversation">
<div v-show="respMsg" class="message user-message">
<strong>AI助手</strong><VueMarkdown :markdown="respMsg" :rehype-plugins="[rehypeRaw]" class="t_resp"></VueMarkdown>
</div>
</div>
</el-scrollbar>
<template #footer>
<div class="bootemAi">
<el-input v-model="inputText" placeholder="请输入您的问题..." />
<el-button :disabled="!inputText.trim()" class="ai-send-btn" @click="sendMessage"><SvgIcon icon-class="fbsk" size="" /></el-button>
</div>
</template>
</el-card>
</template>
<style lang='scss' scoped>
.card-header{
font-size: 1.4rem;
font-weight: 700;
color: #0020C2;
display: flex;
align-items: center;
gap: 10px;
}
.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;
}
.scroBox{
padding: 10px 15px;
height: calc(100vh - 200px);
}
.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);
}
.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);
}
.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;
}
}
</style>

427
src/views/sysworkflow/lowcodepage/pageFlow/flowStep.vue

@ -0,0 +1,427 @@
<!--
@ 作者: 秦东
@ 时间: 2026-01-27 16:11:23
@ 备注:
-->
<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 squareUrlOne from "@/assets/images/1.png"
import squareUrlTwo from "@/assets/images/2.png"
const activeStep = ref(1)
const state = reactive({
circleUrl:squareUrlTwo,
squareUrl: squareUrlOne,
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const openOrClose = ref(false)
const openclosebox = ref(false)
const ifSendFlow = ref(false)
const props = defineProps({
flowMap: {
type: Array,
default: () => []
},
nodeKey:{
type:String,
default:""
},
currentProgress:{
type:Number,
default:0
}
,
nextStep:{
type:Number,
default:0
}
})
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const flowMaps = ref<any[]>();
const emits = defineEmits(["update:flowMap"]);
const flowList = computed<any>({
get: () => props.flowMap,
set: (val) => {
emits("update:flowMap", val);
},
});
watch(()=>props.flowMap,(val:any)=>{
emits("update:flowMap", val);
})
onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
console.log("val----->",val)
if(val.customNode == "beginnode"){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
switch(val.runtype){
case 1:
val.runscope = val.runscope!=0?val.runscope:1
return true
break;
case 3:
if(val.customNode == props.nodeKey){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
break;
case 4:
if(val.runscope==1){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
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
// return true
// }
if(val.runscope != 0){
return true
}
return false
}
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
}
// 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) =>{
// console.log("P",zhiXingStep,val)
flowList.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
// console.log("P---1-->",item.step , zhiXingStep)
item.operator = val
}
})
// console.log("P--2--->",flowList)
}
/**
@ 作者: 秦东
@ 时间: 2026-01-29 16:37:56
@ 功能: 判断审批节点样式
*/
const judgeNodeClass = (val:number,stepVal:number):string => {
console.log("判断审批节点样式",val,stepVal)
switch(val){
case 1:
if(props.currentProgress == stepVal){
return "in-progress"
}else{
return 'completed'
}
case 2:
return 'pending'
case 3:
// return 'in-progress'
if(props.currentProgress == stepVal){
return "in-progress"
}else{
return 'in-executor'
}
default:
if(props.currentProgress == stepVal){
return "in-progress"
}else{
return 'completed'
}
}
return 'completed'
}
</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 :class="ifSendFlow?'flowBody':'flowBodyNofoot'">
<div class="approval-steps">
<div v-for="item in flowList" :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 #footer>
<div class="bootemWorkFlow">
<el-input type="textarea" :rows="2" style="width: 100%" placeholder="请输入审批意见"></el-input>
<div class="bootemWorkFlowBut">
<el-button class="btn approve-btn"><SvgIcon icon-class="kxdg" size="" style="margin-right: 5px" />通过审批</el-button>
<el-button class="btn reject-btn"><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>

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

@ -19,9 +19,12 @@ import {
submitButton,
afreshSubmitButton,
} from "@/utils/workflow/const";
import { nodePoweInfo } from "@/api/taskapi/types";
import { nodelPeoples, nodePoweInfo } from "@/api/taskapi/types";
import request from "@/utils/request";
import SvgIcon from "@/components/SvgIcon/index.vue";
import FlowStep from "@/views/sysworkflow/lowcodepage/pageFlow/flowStep.vue";
import AiPage from "@/views/sysworkflow/lowcodepage/pageFlow/aiPage.vue";
import { constAiEffect } from "@/api/DesignForm/utils";
const props = defineProps({
show:{
@ -47,6 +50,7 @@ const props = defineProps({
},
},
})
const formType = ref(1)
const formBodyRef = ref()
const drawBodyWidth = ref(props.drawerwith)
const emits = defineEmits(["update:show", "searchquery"]);
@ -56,6 +60,8 @@ const flowMap = ref<any[]>(); //工作流
const flowFactor = reactive<conditionInfo[]>([]); //
const pageType = ref<number>(1)
const aiConfigArea =ref(false)
const formLoading = ref(false); //loading
const flowLoading = ref(false); //loading
const drawLoading = ref(false)
const isFlowTable = ref(false); //
const openOrClose = computed({
@ -68,38 +74,13 @@ const openOrClose = computed({
drawBodyWidth.value = 0;
},
});
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const pageBody = ref("")
const drawTitle = computed(() => props.versiontitle)
const drawbox = computed({
get: () => {
let pageContWidth = props.drawerwith
let extraW=0;
if (aiConfigArea.value){
extraW=300 //ai
}
if (isFlowTable.value) {
extraW = 300+extraW;
}
if (aiConfigArea.value && isFlowTable.value){
pageType.value = 3
pageBody.value = "treePage"
pageContWidth = pageContWidth - (extraW/2)
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
pageType.value = 2
pageBody.value = "twoPage"
pageContWidth = pageContWidth - (extraW/2)
}else{
pageType.value = 1
pageBody.value = ""
}
console.error("1---------------->",pageContWidth)
return pageContWidth+extraW;
},
set: (val: number) => {
return val;
},
});
let qrCodeImgInside = "";
const appInitData = ref<appPageDataInit>();
const mastesformjson = ref(""); //
@ -108,10 +89,13 @@ const versionTitle = ref<string>(""); //表单名称
const changeFlowPick = ref<string[]>([])
const purviewAry = ref<any[]>([]);
const qrCodeInsideDialogFlag = ref(false);
const nodelUserList = reactive<nodelPeoples[]>([]);
//
const gainFlowChart = reactive<nodeFlow>({
id: "0",
conditionList: flowFactor,
nodelPeople: nodelUserList,
oldFlow: flowMap.value,
});
const state = reactive<any>({
@ -162,12 +146,20 @@ const getTaskFormData = () => {
let extraW=0;
if (data.tableFormPage.flowIsOpen == 1 && data.tableFormPage.flowkeystr != "0") {
isFlowTable.value = true;
extraW = 300
// drawbox.value = 800 + 350;
console.error("存在流程----》",extraW)
} else {
isFlowTable.value = false;
// drawbox.value = 800;
console.error("不存在流程----》",extraW)
}
if(isFlowTable.value){
extraW = 320
}
if(data.tableFormPage.powerAry && Array.isArray(data.tableFormPage.powerAry) && data.tableFormPage.powerAry.length > 0){
currterNodePower.value = data.tableFormPage.powerAry
}
@ -184,26 +176,47 @@ const getTaskFormData = () => {
state.formData.powerstr = string2json(data.tableFormPage.powerstr);
judgeSubmitCancel({ name: data.tableFormPage.mastesformjson }).then(
(datajud: any) => {
console.error("不存在流程--1-datajud-》",datajud)
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);
}
}
}
);
console.log("表单数据--state.formData->1", state.formData);
console.error("不存在流程--1--》",state.formData.aiConfig)
if(state.formData.aiConfig.length>0){
aiConfigArea.value=true
extraW = extraW + 300
state.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.error("不存在流程--extraW--》",extraW)
if (aiConfigArea.value && isFlowTable.value){
pageType.value = 3
pageBody.value = "treePage"
drawBodyWidth.value = drawBodyWidth.value + extraW - (extraW/2)
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
pageType.value = 2
pageBody.value = "twoPage"
drawBodyWidth.value = drawBodyWidth.value + extraW- (extraW/2)
drawBodyWidth.value = drawBodyWidth.value + extraW
}else{
pageType.value = 1
pageBody.value = ""
@ -212,7 +225,7 @@ const getTaskFormData = () => {
drawLoading.value = false
console.error("2---------------->",formBodyRef.value?.clientWidth)
// console.error("2---------------->",formBodyRef.value?.clientWidth)
})
.finally(()=>{})
}
@ -303,16 +316,21 @@ const initLoadData = () => {
stateForm.formData.powerstr = string2json(
gainAppPageInfoData.data.appForm.powerstr
);
// console.log("data.data.mastesform", stateForm.formData)
console.log("data.data.mastesform", stateForm.formData)
judgeSubmitCancel({
name: gainAppPageInfoData.data.appForm.mastesformjson,
}).then((datajud: any) => {
console.log("datajud---------------->", datajud,datajud.data.buttonIsTrue)
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);
}
}
console.log("datajud------stateForm.formData.list---------->", stateForm.formData.list)
});
}
});
@ -331,7 +349,7 @@ const initLoadData = () => {
watch(() => openOrClose,(val) => {
if(val){
getTaskFormData()
initLoadData()
// initLoadData()
}else{
initData()
}
@ -347,70 +365,343 @@ const showFillFormQrCode = () => {
//,,app,,
//,,,
//cfid
if (
state.formData.form.qrCodeFlag == true &&
state.formData.form.qrCodeInside == true
) {
getQrCodeImgInside().then(({ data }) => {
qrCodeImgInside = data;
if (qrCodeInsideDialogFlag.value == false) {
//console.log(qrCodeImgInside)
qrCodeInsideDialogFlag.value = true;
}
});
} else {
alert("请先开启表单二维码功能");
}
}
const getQrCodeImgInside = () => {
return request({
url: "/javasys/lowCode/QrCode/getQrCodeImgInside",
method: "post",
data: {
cfid: state.formId,
},
});
}
/**
@ 作者: 秦东
@ 时间: 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:41:20
@ 功能: 提交成功回调
*/
const afterSubmit = (type: string, val?: any) => {
// console.log("------------------>",type,val)
// console.log("------------------>",flowMap)
if (type === "success") {
emits("searchquery");
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:50:37
@ 功能: 保存草稿
*/
const saveDraftPage = (type: string, val?: any) => {
if (type === "success") {
emits("searchquery");
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();
};
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:01
@ 功能: 关闭操作
*/
const closeAppSubmit = () => {
emits("update:show", false);
flowMap.value = [];
emits("searchquery");
emits("update:show", false);
};
/**
@ 作者: 秦东
@ 时间: 2026-01-19 16:36:28
@ 功能: 判断怎么分屏
*/
// const pageBody = ():string => {
// let pageClass = ""
// switch(pageType.value){
// case 2:
// pageClass = "twoPage";
// break;
// case 3:
// pageClass = "treePage";
// break;
// default:
// pageClass = ""
// break;
// }
// console.log("------------->",pageClass)
// console.log("------1------->",pageType.value)
// console.log("------2------->",pageType.value)
// return pageClass;
// }
provide('flowNodePower', currterNodePower)
provide('currentNodeKey', nodeKey)
//
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)
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;
});
}
}
const appTableForm = ref({
name:""
})
//-----------------------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)
}
})
</script>
<template>
<div class="drawerClass">
<div v-if="openOrClose" class="drawerClass">
<el-drawer
v-model="openOrClose"
:title="drawTitle"
@ -418,7 +709,7 @@ provide('currentNodeKey', nodeKey)
:close-on-press-escape="false"
:destroy-on-close="true"
:size="drawBodyWidth"
:close="closeAppSubmit"
>
<template #header>
<div class="drawHeader">
@ -426,67 +717,39 @@ provide('currentNodeKey', nodeKey)
<el-button v-if="stateForm.formData.form.qrCodeFlag == true && stateForm.formData.form.qrCodeInside == true" size="small" @click="showFillFormQrCode">扫码填单</el-button>
</div>
</template>
<div v-loading="drawLoading" :class="aiConfigArea&&isFlowTable?'drawBody treePage':((!aiConfigArea&&isFlowTable)||(aiConfigArea&&!isFlowTable))?'drawBody twoPage':'drawBody'">
<el-card v-if="aiConfigArea" shadow="always">
<template #header>
<div class="card-header">
<div class="svgBox"><SvgIcon icon-class="aiRoboot" size="25" /></div>
AI智能问答助手
</div>
</template>
<el-scrollbar class="scroBox ">
<div class="ai-conversation">
<div class="message ai-message">
<strong>AI助手</strong>您好我是您的智能助手我可以帮您解答关于表单填写和流程审批的问题请问有什么可以帮您的
</div>
<div class="message user-message">
<strong>用户</strong>如何填写项目申请表中的预算部分
</div>
</div>
<div v-loading="drawLoading" :class="aiConfigArea&&isFlowTable?'drawBody treePage':(aiConfigArea&&!isFlowTable)?'drawBody twoPageAi':(!aiConfigArea&&isFlowTable)?'drawBody twoPageFlow':'drawBody'">
<AiPage
v-if="state.type != 5 && aiConfigArea"
ref="aiassistRef"
:agent="currentAgent"
/>
</el-scrollbar>
<template #footer>
<div class="bootemAi">
<el-input placeholder="请输入您的问题..." />
<el-button class="ai-send-btn"><SvgIcon icon-class="fbsk" size="" /></el-button>
</div>
</template>
</el-card>
<el-card shadow="always">
<template #header>
<div class="card-header">
<div class="svgBox"><SvgIcon icon-class="edit" size="25" /></div>
项目申请表
</div>
</template>
<el-scrollbar class="formBody">
<p v-for="o in 400" :key="o" class="text item">{{ 'List item ' + o }}</p>
</el-scrollbar>
</el-card>
<el-card v-if="isFlowTable" shadow="always">
<template #header>
<div class="card-header">
<div class="svgBox"><SvgIcon icon-class="liuChengBiaoDan" size="25" /></div>
审批流程
</div>
</template>
<el-scrollbar class="flowBody">
<p v-for="o in 400" :key="o" class="text item">{{ 'List item ' + o }}</p>
</el-scrollbar>
<template #footer>
<div class="bootemWorkFlow">
<el-input type="textarea" :rows="2" style="width: 100%" placeholder="请输入审批意见"></el-input>
<div class="bootemWorkFlowBut">
<el-button class="btn approve-btn"><SvgIcon icon-class="kxdg" size="" style="margin-right: 5px" />通过审批</el-button>
<el-button class="btn reject-btn"><SvgIcon icon-class="cwkx" size="" style="margin-right: 5px" />驳回申请</el-button>
</div>
</div>
</template>
</el-card>
<AppForm
ref="formEl"
:drawTitle="drawTitle"
: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"
:node-key="nodeKey"
:purview="purviewAry"
/>
<FlowStep
v-if="isFlowTable"
v-model:flow-map="flowMap"
:next-step="nextStep"
:current-progress="currentProgress"
:node-key="nodeKey"
/>
</div>
</el-drawer>
</div>
@ -520,7 +783,15 @@ provide('currentNodeKey', nodeKey)
padding: 10px 10px;
}
}
.twoPage{
.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;
@ -560,8 +831,8 @@ provide('currentNodeKey', nodeKey)
height: calc(100vh - 200px);
}
.formBody{
padding: 10px 15px;
height: calc(100vh - 145px);
width: 100%;
overflow-x: auto;
}
.flowBody{
padding: 10px 15px;

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

@ -558,7 +558,7 @@ provide('currentNodeKey', nodeKey)
{{ versiontitle }}
<div class="flex-grow"></div>
<el-button size="small" style="margin-right: 15px" @click="showFillFormQrCode"
>扫码填单123</el-button
>扫码填单</el-button
>
</div>
</template>

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

@ -6,6 +6,7 @@
<script lang='ts' setup>
import { gainAppTaskList } from "@/api/DesignForm/requestapi"
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue'
import LookAndOperateNewLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue'
const props = defineProps({
pickAppMenu:{
type:Object,
@ -54,7 +55,10 @@ const getToDoList = () =>{
taskFlowAry.value = data.data.list
})
}
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() =>{
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList()
})
const flowLogInfo = ref<any>()
@ -72,7 +76,12 @@ const searchQuery = () =>{}
</script>
<template>
<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="search">
<div class="titleBox">

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

@ -14,6 +14,7 @@ import {
import { gainAppAllTaskList } from "@/api/DesignForm/requestapi";
//
import NewFormPageCont from "@/components/DesignForm/tableListPage/newFormPageCont.vue";
import FormPageCont from "@/components/DesignForm/tableListPage/formPageContApp.vue";
import TableFlow from "@/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue";
@ -69,9 +70,9 @@ const getToDoList = () => {
onMounted(() => {
getToDoList();
});
const rangedDatePickerInTables1: any = []
const container = ref(); //
const drawerWith = ref(); //
const drawerWithing = ref(); //
const openTaskDrawer = ref(false); //
/**
@ 作者: 秦东
@ -82,9 +83,22 @@ const tablePageClass = ref(1);
const lookPageInfoIsShow = ref(false);
const pageInfoCont = ref<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;
drawerWith.value = container.value?.clientWidth;
drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
/**
@ -97,8 +111,18 @@ const editInfo = (val: any) => {
// console.log('!',val)
operState.value = 5;
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;
drawerWith.value = container.value?.clientWidth;
drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
/**
@ -109,8 +133,18 @@ const editInfo = (val: any) => {
const submitApproval = (val: any) => {
operState.value = 4;
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;
drawerWith.value = container.value?.clientWidth;
drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
/**
@ -156,8 +190,18 @@ const recallSendMsg = (val: any) => {
const afreshSendFlow = (val: any) => {
operState.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;
drawerWith.value = container.value?.clientWidth;
drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
/**
@ -168,8 +212,18 @@ const afreshSendFlow = (val: any) => {
const editFormSendFlow = (val: any) => {
operState.value = 3;
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;
drawerWith.value = container.value?.clientWidth;
drawerWithing.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
const cancelEvent = (val: any) => {
@ -432,15 +486,28 @@ const searchQuery = () => {};
/>
</el-card>
<FormPageCont
<NewFormPageCont
v-model:is-show="lookPageInfoIsShow"
:drawer-with="props.drawerWith"
:drawer-with="drawerWithing"
:page-info="pageInfoCont"
:table-page-class="tablePageClass"
:oper-state="operState"
:dprt="rangedDatePickerInTables1"
@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
v-model:isopen="openTaskDrawer"
: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 LookAndOperateLogInfo from "@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue";
import lookFlowInfoNewApp from "@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue";
const props = defineProps({
pickAppMenu: {
@ -58,7 +59,10 @@ const getToDoList = () => {
taskFlowAryTd.value = data.data.list;
});
};
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() => {
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList();
});
/**
@ -86,12 +90,19 @@ const searchQuery = () => {};
</script>
<template>
<div ref="myappbox" class="app_box">
<LookAndOperateLogInfo
<!-- <LookAndOperateLogInfo
v-if="darwOpenOrClose"
v-model:isshow="darwOpenOrClose"
:flow-log-info="flowLogInfo"
:drawer-with="props.drawerWith"
@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="search">

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

@ -6,6 +6,7 @@
<script lang='ts' setup>
import { gainAppTaskList } from "@/api/DesignForm/requestapi"
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoApp.vue'
import LookAndOperateLogNewInfo from '@/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue'
const props = defineProps({
pickAppMenu:{
type:Object,
@ -49,7 +50,10 @@ const getToDoList = () =>{
taskFlowAry.value = data.data.list
})
}
const drawerWithNew =ref(props.drawerWith)
const myappbox = ref()
onMounted(() =>{
drawerWithNew.value = myappbox.value?.clientWidth;
getToDoList()
})
@ -68,7 +72,8 @@ const searchQuery = () =>{}
</script>
<template>
<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="search">
<div class="titleBox">

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

@ -157,6 +157,11 @@ const updateNode = (val:any) =>{
</el-col>
<el-col :span="24">
<ul>
<li>
<el-text type="success">
<span>已同意</span>
</el-text> · 2025/10/24 16:23:12
</li>
<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>

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

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

214
yarn.lock

@ -283,19 +283,19 @@
resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz"
integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
"@dnd-kit/accessibility@^3.1.1":
version "3.1.1"
resolved "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz"
integrity sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==
"@dnd-kit/accessibility@^3.1.0":
version "3.1.0"
resolved "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz"
integrity sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==
dependencies:
tslib "^2.0.0"
"@dnd-kit/core@^6.1.0":
version "6.3.1"
resolved "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.3.1.tgz"
integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==
version "6.1.0"
resolved "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.1.0.tgz"
integrity sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==
dependencies:
"@dnd-kit/accessibility" "^3.1.1"
"@dnd-kit/accessibility" "^3.1.0"
"@dnd-kit/utilities" "^3.2.2"
tslib "^2.0.0"
@ -306,10 +306,10 @@
dependencies:
tslib "^2.0.0"
"@element-plus/icons-vue@^2.3.1":
version "2.3.1"
resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
"@element-plus/icons-vue@^2.3.1", "@element-plus/icons-vue@^2.3.2":
version "2.3.2"
resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz"
integrity sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
@ -2044,12 +2044,12 @@ available-typed-arrays@^1.0.7:
possible-typed-array-names "^1.0.0"
axios@^1.10.0:
version "1.11.0"
resolved "https://registry.npmmirror.com/axios/-/axios-1.11.0.tgz"
integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==
version "1.10.0"
resolved "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz"
integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.4"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
@ -2864,9 +2864,9 @@ buffer@^5.5.0, buffer@^5.7.0:
ieee754 "^1.1.13"
bufferutil@^4.0.1:
version "4.0.9"
resolved "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.9.tgz"
integrity sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==
version "4.0.8"
resolved "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.8.tgz"
integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==
dependencies:
node-gyp-build "^4.3.0"
@ -2927,14 +2927,6 @@ cachedir@2.3.0:
resolved "https://registry.npmmirror.com/cachedir/-/cachedir-2.3.0.tgz"
integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==
call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
dependencies:
es-errors "^1.3.0"
function-bind "^1.1.2"
call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
version "1.0.7"
resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz"
@ -4202,15 +4194,6 @@ dot-prop@^5.1.0:
dependencies:
is-obj "^2.0.0"
dunder-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz"
integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
dependencies:
call-bind-apply-helpers "^1.0.1"
es-errors "^1.3.0"
gopd "^1.2.0"
duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz"
@ -4245,9 +4228,9 @@ electron-to-chromium@^1.2.7:
integrity sha1-uM5ck7MI2w6S9tBDXEbd7I9jY6s=
electron-to-chromium@^1.4.820:
version "1.4.832"
resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.832.tgz"
integrity sha512-cTen3SB0H2SGU7x467NRe1eVcQgcuS6jckKfWJHia2eo0cHIGOqHoAxevIYZD4eRHcWjkvFzo93bi3vJ9W+1lA==
version "1.4.830"
resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz"
integrity sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==
element-plus@^2.3.4:
version "2.7.7"
@ -4468,32 +4451,33 @@ es-abstract@^1.7.0:
is-callable "^1.1.3"
is-regex "^1.0.3"
es-define-property@^1.0.0, es-define-property@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz"
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
es-define-property@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz"
integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
dependencies:
get-intrinsic "^1.2.4"
es-errors@^1.2.1, es-errors@^1.3.0:
version "1.3.0"
resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
es-object-atoms@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz"
integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
dependencies:
es-errors "^1.3.0"
es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
es-set-tostringtag@^2.0.3:
version "2.0.3"
resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz"
integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
dependencies:
es-errors "^1.3.0"
get-intrinsic "^1.2.6"
get-intrinsic "^1.2.4"
has-tostringtag "^1.0.2"
hasown "^2.0.2"
hasown "^2.0.1"
es-to-primitive@^1.1.1:
version "1.1.1"
@ -5445,15 +5429,13 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
form-data@^4.0.4:
version "4.0.4"
resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz"
integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
es-set-tostringtag "^2.1.0"
hasown "^2.0.2"
mime-types "^2.1.12"
fraction.js@^4.3.7:
@ -5560,29 +5542,16 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4, get-intrinsic@^1.2.6:
version "1.3.0"
resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz"
integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
dependencies:
call-bind-apply-helpers "^1.0.2"
es-define-property "^1.0.1"
es-errors "^1.3.0"
es-object-atoms "^1.1.1"
function-bind "^1.1.2"
get-proto "^1.0.1"
gopd "^1.2.0"
has-symbols "^1.1.0"
hasown "^2.0.2"
math-intrinsics "^1.1.0"
get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
dependencies:
dunder-proto "^1.0.1"
es-object-atoms "^1.0.0"
has-proto "^1.0.1"
has-symbols "^1.0.3"
hasown "^2.0.0"
get-stream@^6.0.0, get-stream@^6.0.1:
version "6.0.1"
@ -5803,10 +5772,12 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz"
integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
dependencies:
get-intrinsic "^1.1.3"
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.11"
@ -5879,15 +5850,15 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
dependencies:
es-define-property "^1.0.0"
has-proto@^1.0.3:
has-proto@^1.0.1, has-proto@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz"
integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
has-symbols@^1.0.2, has-symbols@^1.0.3, has-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
version "1.0.2"
@ -5941,7 +5912,7 @@ hash.js@^1.0.0, hash.js@^1.0.3:
dependencies:
inherits "^2.0.1"
hasown@^2.0.0, hasown@^2.0.2:
hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
@ -6953,16 +6924,16 @@ js-md5@^0.7.3:
resolved "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz"
integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-tokens@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz"
integrity sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-tokens@^9.0.0:
version "9.0.0"
resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz"
@ -7601,6 +7572,13 @@ loose-envify@^1.0.0:
dependencies:
js-tokens "^3.0.0"
loose-envify@^1.1.0:
version "1.4.0"
resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lru-cache@^10.2.0:
version "10.4.3"
resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz"
@ -7687,11 +7665,6 @@ markdown-table@^3.0.0:
resolved "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz"
integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
mathml-tag-names@^2.1.3:
version "2.1.3"
resolved "https://registry.npmmirror.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz"
@ -8585,9 +8558,9 @@ node-fetch-native@^1.6.3:
integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==
node-gyp-build@^4.3.0:
version "4.8.4"
resolved "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz"
integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
version "4.8.1"
resolved "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz"
integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==
node-gyp@^12.1.0:
version "12.1.0"
@ -9886,16 +9859,19 @@ react-dnd-html5-backend@^16.0.1:
dnd-core "^16.0.1"
react-dom@>=16.8.0:
version "19.0.0"
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-19.0.0.tgz"
integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==
version "18.3.1"
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
dependencies:
scheduler "^0.25.0"
loose-envify "^1.1.0"
scheduler "^0.23.2"
react@^19.0.0, react@>=16.8.0:
version "19.0.0"
resolved "https://registry.npmmirror.com/react/-/react-19.0.0.tgz"
integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==
react@^18.3.1, react@>=16.8.0:
version "18.3.1"
resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
dependencies:
loose-envify "^1.1.0"
read-cmd-shim@^6.0.0:
version "6.0.0"
@ -10481,10 +10457,12 @@ sax@^1.2.4:
resolved "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz"
integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
scheduler@^0.25.0:
version "0.25.0"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.25.0.tgz"
integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==
scheduler@^0.23.2:
version "0.23.2"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz"
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
dependencies:
loose-envify "^1.1.0"
screenfull@^6.0.0:
version "6.0.2"
@ -11429,9 +11407,9 @@ tar@^7.4.3, tar@^7.5.1, tar@^7.5.2:
yallist "^5.0.0"
terser@^5.0.0, terser@^5.4.0:
version "5.44.1"
resolved "https://registry.npmmirror.com/terser/-/terser-5.44.1.tgz"
integrity sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==
version "5.44.0"
resolved "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz"
integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.15.0"

Loading…
Cancel
Save