diff --git a/src/css/dialog.css b/src/css/dialog.css
new file mode 100644
index 0000000..eb462a0
--- /dev/null
+++ b/src/css/dialog.css
@@ -0,0 +1,38 @@
+.person_body {
+ border: 1px solid #f5f5f5;
+ height: 500px;
+}
+
+.tree_nav span {
+ display: inline-block;
+ padding-right: 10px;
+ margin-right: 5px;
+ max-width: 6em;
+ color: #38adff;
+ font-size: 12px;
+ cursor: pointer;
+ background: url("@/assets/images/jiaojiao.png") no-repeat right center;
+}
+
+.tree_nav span:last-of-type {
+ background: none;
+}
+
+.person_tree {
+ padding: 10px 12px 0 8px;
+ width: 280px;
+ height: 100%;
+ border-right: 1px solid #f5f5f5;
+}
+
+.person_tree input {
+ padding-left: 22px;
+ width: 210px;
+ height: 30px;
+ font-size: 12px;
+ border-radius: 2px;
+ border: 1px solid #d5dadf;
+ background: url("@/assets/images/list_search.png") no-repeat 10px center;
+ background-size: 14px 14px;
+ margin-bottom: 14px;
+}
diff --git a/src/css/override-element-ui.css b/src/css/override-element-ui.css
new file mode 100644
index 0000000..d772692
--- /dev/null
+++ b/src/css/override-element-ui.css
@@ -0,0 +1,125 @@
+.el-drawer__header button.el-drawer__close-btn {
+ display: none !important;
+}
+
+.el-drawer__header {
+ margin-bottom: 0 !important;
+ padding: 14px 0 14px 20px !important;
+
+ /* border-bottom: 1px solid #f2f2f2 !important; */
+ color: #323232 !important;
+ font-size: 16px !important;
+}
+
+.el-drawer__header .el-drawer__title {
+ font-size: 16px !important;
+}
+
+.demo-drawer__content {
+ display: flex !important;
+ flex-direction: column !important;
+ height: 100% !important;
+}
+
+.drawer_content {
+ flex: 1 !important;
+}
+
+.demo-drawer__content > div {
+ border-top: 1px solid #f2f2f2 !important;
+}
+
+.el-button {
+ min-width: 79px !important;
+ padding: 8px 12px !important;
+ font-size: 12px !important;
+ border-radius: 2px !important;
+ color: #323232 !important;
+ background: #f2f2f2 !important;
+ height: 30px !important;
+}
+
+.el-button.el-button--primary {
+ background: #46a6fe !important;
+ color: #fff !important;
+}
+
+.demo-drawer__footer {
+ padding: 10px 30px !important;
+ border-top: 1px solid #f2f2f2 !important;
+}
+
+.demo-drawer__footer .el-button {
+ float: right !important;
+ margin-right: 10px !important;
+}
+
+.el-dialog {
+ width: 520px;
+ border: 1px solid #dde1e5 !important;
+ border-radius: 3px !important;
+}
+
+.el-dialog__header {
+ padding: 0 0 0 20px !important;
+ line-height: 50px !important;
+ height: 50px !important;
+ background: #fff !important;
+ border-bottom: 1px solid #f2f2f2 !important;
+}
+
+.el-dialog__header .el-dialog__title {
+ font-size: 16px !important;
+ line-height: 50px !important;
+ color: #333 !important;
+}
+
+.el-dialog__header .el-dialog__headerbtn {
+ height: 12px !important;
+ width: 12px !important;
+}
+
+.el-dialog__header .el-icon-close {
+ width: 12px !important;
+ height: 12px !important;
+ float: left !important;
+}
+
+.el-dialog__header .el-icon-close::before {
+ display: block !important;
+ width: 12px !important;
+ height: 12px !important;
+ background: url("@/assets/images/add-close.png") no-repeat center !important;
+ background-size: 100% 100% !important;
+ content: "" !important;
+}
+
+.el-drawer__body {
+ padding: 0 !important;
+}
+
+.el-dialog__footer {
+ border-top: 1px solid #f2f2f2 !important;
+ padding-bottom: 10px !important;
+}
+
+.el-checkbox,
+.el-checkbox__input.is-checked + .el-checkbox__label,
+.el-radio,
+.el-radio__input.is-checked + .el-radio__label,
+.el-dialog__body,
+.el-tree {
+ color: #333 !important;
+}
+
+.el-radio__label,
+.el-checkbox__label {
+ font-size: 12px !important;
+}
+
+.my-el-custom-spinner {
+ display: inline-block !important;
+ width: 80px !important;
+ height: 80px !important;
+ background: url("@/assets/images/loading.gif") no-repeat center !important;
+}
diff --git a/src/css/workflow.css b/src/css/workflow.css
new file mode 100644
index 0000000..26ba1e6
--- /dev/null
+++ b/src/css/workflow.css
@@ -0,0 +1,1706 @@
+body {
+ background: #eee;
+ margin: 0;
+ font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-variant: tabular-nums;
+ line-height: 1.5;
+ color: rgb(0 0 0 / 65%);
+ background-color: #fff;
+}
+
+@font-face {
+ font-family: "Chinese Quote";
+ src: local("PingFang SC"), local("SimSun");
+ unicode-range: u+2018, u+2019, u+201c, u+201d;
+}
+
+body,
+html {
+ width: 100%;
+
+ /* height: 100% */
+}
+
+input::-ms-clear,
+input::-ms-reveal {
+ display: none;
+}
+
+*,
+::after,
+::before {
+ box-sizing: border-box;
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
+}
+
+@viewport {
+ width: device-width;
+}
+
+article,
+aside,
+dialog,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+ display: block;
+}
+
+[tabindex="-1"]:focus {
+ outline: none !important;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: 0.5em;
+ color: rgb(0 0 0 / 85%);
+ font-weight: 500;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+
+abbr[data-original-title],
+abbr[title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+}
+
+address {
+ margin-bottom: 1em;
+ font-style: normal;
+ line-height: inherit;
+}
+
+input[type="number"],
+input[type="password"],
+input[type="text"],
+textarea {
+ appearance: none;
+}
+
+dl,
+ol,
+ul {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 500;
+}
+
+dd {
+ margin-bottom: 0.5em;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1em;
+}
+
+dfn {
+ font-style: italic;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+a {
+ color: #1890ff;
+ background-color: transparent;
+ text-decoration: none;
+ outline: none;
+ cursor: pointer;
+ transition: color 0.3s;
+ text-decoration-skip: objects;
+}
+
+a:focus {
+ text-decoration: underline;
+ text-decoration-skip: auto;
+}
+
+a:hover {
+ color: #40a9ff;
+}
+
+a:active {
+ color: #096dd9;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+ text-decoration: none;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1em;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1em;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+[role="button"],
+a,
+area,
+button,
+input:not([type="range"]),
+label,
+select,
+summary,
+textarea {
+ touch-action: manipulation;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.75em;
+ padding-bottom: 0.3em;
+ color: rgb(0 0 0 / 45%);
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ text-align: inherit;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ color: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+[type="reset"],
+[type="submit"],
+button,
+html [type="button"] {
+ appearance: button;
+}
+
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner,
+button::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="date"],
+input[type="datetime-local"],
+input[type="month"],
+input[type="time"] {
+ appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: 0.5em;
+ font-size: 1.5em;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ appearance: none;
+}
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+
+mark {
+ padding: 0.2em;
+ background-color: #feffe6;
+}
+
+::selection {
+ background: #1890ff;
+ color: #fff;
+}
+
+.clearfix {
+ zoom: 1;
+}
+
+.clearfix::after,
+.clearfix::before {
+ content: "";
+ display: table;
+}
+
+.clearfix::after {
+ clear: both;
+}
+
+@font-face {
+ font-family: anticon;
+ font-display: fallback;
+ src: url("https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.eot");
+ src: url("https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.woff") format("woff"), url("https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.ttf") format("truetype"), url("https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.svg#iconfont") format("svg");
+}
+
+.anticon {
+ display: inline-block;
+ font-style: normal;
+ vertical-align: baseline;
+ text-align: center;
+ text-transform: none;
+ line-height: 1;
+ text-rendering: optimizelegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.anticon::before {
+ display: block;
+ font-family: anticon !important;
+}
+
+.anticon-close::before {
+ content: "\E633";
+}
+
+.anticon-right::before {
+ content: "\E61F";
+}
+
+.anticon-exclamation-circle {
+ color: rgb(242 86 67);
+}
+
+.anticon-exclamation-circle::before {
+ content: "\E62C";
+}
+
+.anticon-left::before {
+ content: "\E620";
+}
+
+.anticon-close-circle::before {
+ content: "\E62E";
+}
+
+.ant-btn {
+ line-height: 1.5;
+ display: inline-block;
+ font-weight: 400;
+ text-align: center;
+ touch-action: manipulation;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 0 15px;
+ font-size: 14px;
+ border-radius: 4px;
+ height: 32px;
+ user-select: none;
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+ position: relative;
+ color: rgb(0 0 0 / 65%);
+ background-color: #fff;
+ border-color: #d9d9d9;
+}
+
+.ant-btn > .anticon {
+ line-height: 1;
+}
+
+.ant-btn,
+.ant-btn:active,
+.ant-btn:focus {
+ outline: 0;
+}
+
+.ant-btn > a:only-child {
+ color: currentcolor;
+}
+
+.ant-btn > a:only-child::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ background: transparent;
+}
+
+.ant-btn:focus,
+.ant-btn:hover {
+ color: #40a9ff;
+ background-color: #fff;
+ border-color: #40a9ff;
+}
+
+.ant-btn:focus > a:only-child,
+.ant-btn:hover > a:only-child {
+ color: currentcolor;
+}
+
+.ant-btn:focus > a:only-child::after,
+.ant-btn:hover > a:only-child::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ background: transparent;
+}
+
+.ant-btn.active,
+.ant-btn:active {
+ color: #096dd9;
+ background-color: #fff;
+ border-color: #096dd9;
+}
+
+.ant-btn.active > a:only-child,
+.ant-btn:active > a:only-child {
+ color: currentcolor;
+}
+
+.ant-btn.active > a:only-child::after,
+.ant-btn:active > a:only-child::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ background: transparent;
+}
+
+.ant-btn.active,
+.ant-btn:active,
+.ant-btn:focus,
+.ant-btn:hover {
+ background: #fff;
+ text-decoration: none;
+}
+
+.ant-btn > i,
+.ant-btn > span {
+ pointer-events: none;
+}
+
+.ant-btn::before {
+ position: absolute;
+ top: -1px;
+ left: -1px;
+ bottom: -1px;
+ right: -1px;
+ background: #fff;
+ opacity: 0.35;
+ content: "";
+ border-radius: inherit;
+ z-index: 1;
+ transition: opacity 0.2s;
+ pointer-events: none;
+ display: none;
+}
+
+.ant-btn .anticon {
+ transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+.ant-btn:active > span,
+.ant-btn:focus > span {
+ position: relative;
+}
+
+.ant-btn > .anticon + span,
+.ant-btn > span + .anticon {
+ margin-left: 8px;
+}
+
+.fd-nav-container {
+ display: inline-block;
+ position: relative;
+}
+
+.fd-nav-container .ghost-bar {
+ position: absolute;
+ width: 150px;
+ height: 100%;
+ left: 0;
+ background: #1583f2;
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+.fd-nav-container .ghost-bar::after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 5px 6px;
+ border-color: transparent transparent #f6f6f6;
+}
+
+.fd-nav-item {
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ line-height: 60px;
+ width: 150px;
+ text-align: center;
+ white-space: nowrap;
+}
+
+.fd-nav-item .order-num {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ border: 1px solid #fff;
+ border-radius: 50%;
+ margin-right: 6px;
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+.fd-nav-item.active .order-num {
+ color: #1583f2;
+ background: #fff;
+}
+
+.ant-input {
+ font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-variant: tabular-nums;
+ box-sizing: border-box;
+ margin: 0;
+ list-style: none;
+ position: relative;
+ display: inline-block;
+ padding: 4px 11px;
+ width: 100%;
+ height: 32px;
+ font-size: 14px;
+ line-height: 1.5;
+ color: rgb(0 0 0 / 65%);
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ transition: all 0.3s;
+}
+
+.ant-input::placeholder {
+ color: #bfbfbf;
+ opacity: 1;
+}
+
+/* .ant-input:input-placeholder {
+ color: #bfbfbf;
+} */
+
+/* .ant-input::input-placeholder {
+ color: #bfbfbf;
+} */
+
+.ant-input:focus,
+.ant-input:hover {
+ border-color: #40a9ff;
+ border-right-width: 1px !important;
+}
+
+.ant-input:focus {
+ outline: 0;
+ box-shadow: 0 0 0 2px rgb(24 144 255 / 20%);
+}
+
+textarea.ant-input {
+ max-width: 100%;
+ height: auto;
+ vertical-align: bottom;
+ transition: all 0.3s, height 0s;
+ min-height: 32px;
+}
+
+a,
+abbr,
+acronym,
+address,
+applet,
+article,
+aside,
+audio,
+b,
+big,
+blockquote,
+body,
+canvas,
+caption,
+center,
+cite,
+code,
+dd,
+del,
+details,
+dfn,
+div,
+dl,
+dt,
+em,
+fieldset,
+figcaption,
+figure,
+footer,
+form,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+header,
+hgroup,
+html,
+i,
+iframe,
+img,
+ins,
+kbd,
+label,
+legend,
+li,
+mark,
+menu,
+nav,
+object,
+ol,
+p,
+pre,
+q,
+s,
+samp,
+section,
+small,
+span,
+strike,
+strong,
+sub,
+summary,
+sup,
+table,
+tbody,
+td,
+tfoot,
+th,
+thead,
+time,
+tr,
+tt,
+u,
+ul,
+var,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-size: 100%;
+
+ /* font: inherit; */
+ vertical-align: baseline;
+}
+
+/* *,
+::after,
+::before {
+ box-sizing: border-box;
+}
+
+html {
+ font-family: sans-serif;
+ text-size-adjust: 100%;
+}
+
+body,
+html {
+ font-size: 14px;
+}
+
+body {
+ font-family: "Microsoft Yahei", "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, Verdana, sans-serif;
+ line-height: 1.6;
+ background-color: #fff;
+ position: static !important;
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
+} */
+
+ol,
+ul {
+ list-style-type: none;
+}
+
+/* b,
+strong {
+ font-weight: 700;
+}
+
+img {
+ border: 0;
+} */
+
+button,
+input,
+select,
+textarea {
+ font-family: inherit;
+ font-size: 100%;
+ margin: 0;
+}
+
+/* textarea {
+ overflow: auto;
+ vertical-align: top;
+ appearance: none;
+}
+
+button,
+input {
+ line-height: normal;
+}
+
+button,
+select {
+ text-transform: none;
+} */
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ appearance: button;
+ cursor: pointer;
+}
+
+input[type="search"] {
+ appearance: textfield;
+ box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ appearance: none;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/* table {
+ width: 100%;
+ border-spacing: 0;
+ border-collapse: collapse;
+} */
+
+table,
+td,
+th {
+ border: 0;
+}
+
+td,
+th {
+ padding: 0;
+ vertical-align: top;
+}
+
+/* th {
+ font-weight: 700;
+ text-align: left;
+} */
+
+thead th {
+ white-space: nowrap;
+}
+
+/* a {
+ text-decoration: none;
+ cursor: pointer;
+ color: #3296fa;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+ color: #3296fa;
+}
+
+small {
+ font-size: 80%;
+}
+
+body,
+html {
+ font-size: 12px !important;
+ color: #191f25 !important;
+ background: #f6f6f6 !important;
+} */
+
+.wrap {
+ display: -webkit-box;
+ display: flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ height: 100%;
+}
+
+@font-face {
+ font-family: IconFont;
+ src: url("//at.alicdn.com/t/font_135284_ph2thxxbzgf.eot");
+ src: url("//at.alicdn.com/t/font_135284_ph2thxxbzgf.eot?#iefix") format("embedded-opentype"), url("//at.alicdn.com/t/font_135284_ph2thxxbzgf.woff") format("woff"), url("//at.alicdn.com/t/font_135284_ph2thxxbzgf.ttf") format("truetype"), url("//at.alicdn.com/t/font_135284_ph2thxxbzgf.svg#IconFont") format("svg");
+}
+
+.iconfont {
+ font-family: IconFont !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.fd-nav {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 997;
+ width: 100%;
+ height: 60px;
+ font-size: 14px;
+ color: #fff;
+ background: #3296fa;
+ display: flex;
+ align-items: center;
+}
+
+.fd-nav > * {
+ flex: 1;
+ width: 100%;
+}
+
+.fd-nav .fd-nav-left {
+ display: -webkit-box;
+ display: flex;
+ align-items: center;
+}
+
+.fd-nav .fd-nav-center {
+ flex: none;
+ width: 600px;
+ text-align: center;
+}
+
+.fd-nav .fd-nav-right {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ text-align: right;
+}
+
+.fd-nav .fd-nav-back {
+ display: inline-block;
+ width: 60px;
+ height: 60px;
+ font-size: 22px;
+ border-right: 1px solid #1583f2;
+ text-align: center;
+ cursor: pointer;
+}
+
+.fd-nav .fd-nav-back:hover {
+ background: #5af;
+}
+
+.fd-nav .fd-nav-back:active {
+ background: #1583f2;
+}
+
+.fd-nav .fd-nav-back .anticon {
+ line-height: 60px;
+}
+
+.fd-nav .fd-nav-title {
+ width: 0;
+ flex: 1;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ padding: 0 15px;
+}
+
+.fd-nav a {
+ color: #fff;
+ margin-left: 12px;
+}
+
+.fd-nav .button-publish {
+ min-width: 80px;
+ margin-left: 4px;
+ margin-right: 15px;
+ color: #3296fa;
+ border-color: #fff;
+}
+
+.fd-nav .button-publish.ant-btn:focus,
+.fd-nav .button-publish.ant-btn:hover {
+ color: #3296fa;
+ border-color: #fff;
+ box-shadow: 0 10px 20px 0 rgb(0 0 0 / 30%);
+}
+
+.fd-nav .button-publish.ant-btn:active {
+ color: #3296fa;
+ background: #d6eaff;
+ box-shadow: none;
+}
+
+.fd-nav .button-preview {
+ min-width: 80px;
+ margin-left: 16px;
+ margin-right: 4px;
+ color: #fff;
+ border-color: #fff;
+ background: transparent;
+}
+
+.fd-nav .button-preview.ant-btn:focus,
+.fd-nav .button-preview.ant-btn:hover {
+ color: #fff;
+ border-color: #fff;
+ background: #59acfc;
+}
+
+.fd-nav .button-preview.ant-btn:active {
+ color: #fff;
+ border-color: #fff;
+ background: #2186ef;
+}
+
+.fd-nav-content {
+ /* position: fixed;
+ top: 60px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 1; */
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding-bottom: 30px;
+}
+
+.error-modal-desc {
+ font-size: 13px;
+ color: rgb(25 31 37 / 56%);
+ line-height: 22px;
+ margin-bottom: 14px;
+}
+
+.error-modal-list {
+ height: 200px;
+ overflow-y: auto;
+ margin-right: -25px;
+ padding-right: 25px;
+}
+
+.error-modal-item {
+ padding: 10px 20px;
+ line-height: 21px;
+ background: #f6f6f6;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+ border-radius: 4px;
+}
+
+.error-modal-item-label {
+ flex: none;
+ font-size: 15px;
+ color: rgb(25 31 37 / 56%);
+ padding-right: 10px;
+}
+
+.error-modal-item-content {
+ text-align: right;
+ flex: 1;
+ font-size: 13px;
+ color: #191f25;
+}
+
+#body.blur {
+ filter: blur(3px);
+}
+
+.zoom {
+ display: flex;
+ position: fixed;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ height: 40px;
+ width: 125px;
+ right: 40px;
+ margin-top: 30px;
+ z-index: 10;
+}
+
+.zoom .zoom-in,
+.zoom .zoom-out {
+ width: 30px;
+ height: 30px;
+ background: #fff;
+ color: #c1c1cd;
+ cursor: pointer;
+ background-size: 100%;
+ background-repeat: no-repeat;
+}
+
+.zoom .zoom-out {
+ background-image: url("https://gw.alicdn.com/tfs/TB1s0qhBHGYBuNjy0FoXXciBFXa-90-90.png");
+}
+
+.zoom .zoom-out.disabled {
+ opacity: 0.5;
+}
+
+.zoom .zoom-in {
+ background-image: url("https://gw.alicdn.com/tfs/TB1UIgJBTtYBeNjy1XdXXXXyVXa-90-90.png");
+}
+
+.zoom .zoom-in.disabled {
+ opacity: 0.5;
+}
+
+.auto-judge:hover .editable-title,
+.node-wrap-box:hover .editable-title {
+ border-bottom: 1px dashed #fff;
+}
+
+.auto-judge:hover .editable-title.editing,
+.node-wrap-box:hover .editable-title.editing {
+ text-decoration: none;
+ border: 1px solid #d9d9d9;
+}
+
+.auto-judge:hover .editable-title {
+ border-color: #15bc83;
+}
+
+.editable-title {
+ line-height: 15px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ border-bottom: 1px dashed transparent;
+}
+
+.editable-title::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 40px;
+}
+
+.editable-title:hover {
+ border-bottom: 1px dashed #fff;
+}
+
+.editable-title-input {
+ flex: none;
+ height: 18px;
+ padding-left: 4px;
+ text-indent: 0;
+ font-size: 12px;
+ line-height: 18px;
+ z-index: 1;
+}
+
+.editable-title-input:hover {
+ text-decoration: none;
+}
+
+/* .ant-btn {
+ position: relative;
+} */
+
+.node-wrap-box {
+ display: inline-box;
+ display: inline-flexbox;
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ position: relative;
+ width: 220px;
+ min-height: 72px;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ background: #fff;
+ border-radius: 4px;
+ cursor: pointer;
+}
+
+.node-wrap-box::after {
+ pointer-events: none;
+ content: "";
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 2;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);
+ box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%);
+}
+
+.node-wrap-box.active::after,
+.node-wrap-box:active::after,
+.node-wrap-box:hover::after {
+ border: 1px solid #3296fa;
+ box-shadow: 0 0 6px 0 rgb(50 150 250 / 30%);
+}
+
+.node-wrap-box.active .close,
+.node-wrap-box:active .close,
+.node-wrap-box:hover .close {
+ display: block;
+}
+
+.node-wrap-box.error::after {
+ border: 1px solid #f25643;
+ box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%);
+}
+
+.node-wrap-box .title {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding-left: 16px;
+ padding-right: 30px;
+ width: 100%;
+ height: 24px;
+ line-height: 24px;
+ font-size: 12px;
+ color: #fff;
+ text-align: left;
+ background: #576a95;
+ border-radius: 4px 4px 0 0;
+}
+
+.node-wrap-box .title .iconfont {
+ font-size: 12px;
+ margin-right: 5px;
+}
+
+.node-wrap-box .placeholder {
+ color: #bfbfbf;
+}
+
+.node-wrap-box .close {
+ display: none;
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 20px;
+ height: 20px;
+ font-size: 14px;
+ color: #fff;
+ border-radius: 50%;
+ text-align: center;
+ line-height: 20px;
+}
+
+.node-wrap-box .content {
+ position: relative;
+ font-size: 14px;
+ padding: 16px;
+ padding-right: 30px;
+}
+
+.node-wrap-box .content .text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+}
+
+.node-wrap-box .content .arrow {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 20px;
+ height: 14px;
+ font-size: 14px;
+ color: #979797;
+}
+
+.start-node.node-wrap-box .content .text {
+ display: block;
+ white-space: nowrap;
+}
+
+.node-wrap-box::before {
+ content: "";
+ position: absolute;
+ top: -12px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 0;
+ height: 4px;
+ border-style: solid;
+ border-width: 8px 6px 4px;
+ border-color: #cacaca transparent transparent;
+ background: #f5f5f7;
+}
+
+.node-wrap-box.start-node::before {
+ content: none;
+}
+
+.top-left-cover-line {
+ left: -1px;
+}
+
+.top-left-cover-line,
+.top-right-cover-line {
+ position: absolute;
+ height: 8px;
+ width: 50%;
+ background-color: #f5f5f7;
+ top: -4px;
+}
+
+.top-right-cover-line {
+ right: -1px;
+}
+
+.bottom-left-cover-line {
+ left: -1px;
+}
+
+.bottom-left-cover-line,
+.bottom-right-cover-line {
+ position: absolute;
+ height: 8px;
+ width: 50%;
+ background-color: #f5f5f7;
+ bottom: -4px;
+}
+
+.bottom-right-cover-line {
+ right: -1px;
+}
+
+.dingflow-design {
+ width: 100%;
+ background-color: #f5f5f7;
+ overflow: auto;
+
+ /* position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ top: 0; */
+}
+
+.dingflow-design .box-scale {
+ transform: scale(1);
+ display: inline-block;
+ position: relative;
+ width: 100%;
+ padding: 54.5px 0;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ flex-wrap: wrap;
+ min-width: min-content;
+ background-color: #f5f8ff;
+ transform-origin: 50% 0 0;
+}
+
+.dingflow-design .node-wrap {
+ flex-direction: column;
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+
+ /* flex-wrap: wrap; */
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ padding: 0 50px;
+ position: relative;
+}
+
+.dingflow-design .branch-wrap,
+.dingflow-design .node-wrap {
+ display: inline-flex;
+ width: 100%;
+}
+
+.dingflow-design .branch-box-wrap {
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+
+ /* flex-wrap: wrap; */
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ min-height: 270px;
+ width: 100%;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+
+.dingflow-design .branch-box {
+ display: flex;
+ overflow: visible;
+ min-height: 180px;
+ height: auto;
+ border-bottom: 2px solid #ccc;
+ border-top: 2px solid #ccc;
+ position: relative;
+ margin-top: 15px;
+}
+
+.dingflow-design .branch-box .col-box {
+ background: #f5f5f7;
+}
+
+.dingflow-design .branch-box .col-box::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 0;
+ margin: auto;
+ width: 2px;
+ height: 100%;
+ background-color: #cacaca;
+}
+
+.dingflow-design .add-branch {
+ border: none;
+ outline: none;
+ user-select: none;
+ justify-content: center;
+ font-size: 12px;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+ border-radius: 15px;
+ color: #3296fa;
+ background: #fff;
+ box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%);
+ position: absolute;
+ top: -16px;
+ left: 50%;
+ transform: translateX(-50%);
+ transform-origin: center center;
+ cursor: pointer;
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+.dingflow-design .add-branch:hover {
+ transform: translateX(-50%) scale(1.1);
+ box-shadow: 0 8px 16px 0 rgb(0 0 0 / 10%);
+}
+
+.dingflow-design .add-branch:active {
+ transform: translateX(-50%);
+ box-shadow: none;
+}
+
+.dingflow-design .col-box {
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-align: center;
+ align-items: center;
+ position: relative;
+}
+
+.dingflow-design .condition-node {
+ min-height: 220px;
+}
+
+.dingflow-design .condition-node,
+.dingflow-design .condition-node-box {
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-flex: 1;
+}
+
+.dingflow-design .condition-node-box {
+ padding-top: 30px;
+ padding-right: 50px;
+ padding-left: 50px;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ flex-grow: 1;
+ position: relative;
+}
+
+.dingflow-design .condition-node-box::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ width: 2px;
+ height: 100%;
+ background-color: #cacaca;
+}
+
+.dingflow-design .auto-judge {
+ position: relative;
+ width: 220px;
+ min-height: 72px;
+ background: #fff;
+ border-radius: 4px;
+ padding: 14px 19px;
+ cursor: pointer;
+}
+
+.dingflow-design .auto-judge::after {
+ pointer-events: none;
+ content: "";
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 2;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);
+ box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%);
+}
+
+.dingflow-design .auto-judge.active::after,
+.dingflow-design .auto-judge:active::after,
+.dingflow-design .auto-judge:hover::after {
+ border: 1px solid #3296fa;
+ box-shadow: 0 0 6px 0 rgb(50 150 250 / 30%);
+}
+
+.dingflow-design .auto-judge.active .close,
+.dingflow-design .auto-judge:active .close,
+.dingflow-design .auto-judge:hover .close {
+ display: block;
+}
+
+.dingflow-design .auto-judge.error::after {
+ border: 1px solid #f25643;
+ box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%);
+}
+
+.dingflow-design .auto-judge .title-wrapper {
+ position: relative;
+ font-size: 12px;
+ color: #15bc83;
+ text-align: left;
+ line-height: 16px;
+}
+
+.dingflow-design .auto-judge .title-wrapper .editable-title {
+ display: inline-block;
+ max-width: 120px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.dingflow-design .auto-judge .title-wrapper .priority-title {
+ display: inline-block;
+ float: right;
+ margin-right: 10px;
+ color: rgb(25 31 37 / 56%);
+}
+
+.dingflow-design .auto-judge .placeholder {
+ color: #bfbfbf;
+}
+
+.dingflow-design .auto-judge .close {
+ display: none;
+ position: absolute;
+ right: -10px;
+ top: -10px;
+ width: 20px;
+ height: 20px;
+ font-size: 14px;
+ color: rgb(0 0 0 / 25%);
+ border-radius: 50%;
+ text-align: center;
+ line-height: 20px;
+ z-index: 2;
+}
+
+.dingflow-design .auto-judge .content {
+ font-size: 14px;
+ color: #191f25;
+ text-align: left;
+ margin-top: 6px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+}
+
+.dingflow-design .auto-judge .sort-left,
+.dingflow-design .auto-judge .sort-right {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ display: none;
+ z-index: 1;
+}
+
+.dingflow-design .auto-judge .sort-left {
+ left: 0;
+ border-right: 1px solid #f6f6f6;
+}
+
+.dingflow-design .auto-judge .sort-right {
+ right: 0;
+ border-left: 1px solid #f6f6f6;
+}
+
+.dingflow-design .auto-judge:hover .sort-left,
+.dingflow-design .auto-judge:hover .sort-right {
+ display: flex;
+ align-items: center;
+}
+
+.dingflow-design .auto-judge .sort-left:hover,
+.dingflow-design .auto-judge .sort-right:hover {
+ background: #efefef;
+}
+
+.dingflow-design .end-node {
+ border-radius: 50%;
+ font-size: 14px;
+ color: rgb(25 31 37 / 40%);
+ text-align: left;
+}
+
+.dingflow-design .end-node .end-node-circle {
+ width: 10px;
+ height: 10px;
+ margin: auto;
+ border-radius: 50%;
+ background: #dbdcdc;
+}
+
+.dingflow-design .end-node .end-node-text {
+ margin-top: 5px;
+ text-align: center;
+}
+
+.approval-setting {
+ border-radius: 2px;
+ margin: 20px 0;
+ position: relative;
+ background: #fff;
+}
+
+/* .ant-btn {
+ position: relative;
+} */
diff --git a/src/plugins/api.js b/src/plugins/api.js
new file mode 100644
index 0000000..b3b9e24
--- /dev/null
+++ b/src/plugins/api.js
@@ -0,0 +1,60 @@
+/*
+ * @Date: 2022-08-25 14:06:59
+ * @LastEditors: StavinLi 495727881@qq.com
+ * @LastEditTime: 2022-09-21 14:36:58
+ * @FilePath: /Workflow-Vue3/src/plugins/api.js
+ */
+import http from '@/plugins/axios'
+const baseUrl = import.meta.env.BASE_URL
+
+/**
+ * 获取角色
+ * @param {*} data
+ * @returns
+ */
+export function getRoles(data) {
+ return http.get(`${baseUrl}roles.json`, { params: data })
+}
+
+/**
+ * 获取部门
+ * @param {*} data
+ * @returns
+ */
+export function getDepartments(data) {
+ return http.get(`${baseUrl}departments.json`, { params: data })
+}
+
+/**
+ * 获取职员
+ * @param {*} data
+ * @returns
+ */
+export function getEmployees(data) {
+ return http.get(`${baseUrl}employees.json`, { params: data })
+}
+/**
+ * 获取条件字段
+ * @param {*} data
+ * @returns
+ */
+export function getConditions(data) {
+ return http.get(`${baseUrl}conditions.json`, { params: data })
+}
+
+/**
+ * 获取审批数据
+ * @param {*} data
+ * @returns
+ */
+export function getWorkFlowData(data) {
+ return http.get(`${baseUrl}data.json`, { params: data })
+}
+/**
+ * 设置审批数据
+ * @param {*} data
+ * @returns
+ */
+export function setWorkFlowData(data) {
+ return http.post(`${baseUrl}`, data)
+}
diff --git a/src/plugins/axios.js b/src/plugins/axios.js
new file mode 100644
index 0000000..ca3c7e2
--- /dev/null
+++ b/src/plugins/axios.js
@@ -0,0 +1,47 @@
+/*
+ * @Date: 2022-08-25 14:43:53
+ * @LastEditors: StavinLi 495727881@qq.com
+ * @LastEditTime: 2022-09-21 14:37:02
+ * @FilePath: /Workflow-Vue3/src/plugins/axios.js
+ */
+'use strict'
+
+import axios from 'axios'
+
+// Full config: https://github.com/axios/axios#request-config
+// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
+// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
+// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+
+const config = {
+ // baseURL: process.env.baseURL || process.env.apiUrl || ""
+ // timeout: 60 * 1000, // Timeout
+ // withCredentials: true, // Check cross-site Access-Control
+}
+
+const _axios = axios.create(config)
+
+_axios.interceptors.request.use(
+ (config) => {
+ // Do something before request is sent
+ return config
+ },
+ (error) => {
+ // Do something with request error
+ return Promise.reject(error)
+ },
+)
+
+// Add a response interceptor
+_axios.interceptors.response.use(
+ (response) => {
+ // Do something with response data
+ return response.data
+ },
+ (error) => {
+ // Do something with response error
+ return Promise.reject(error)
+ },
+)
+
+export default _axios
diff --git a/src/plugins/element.js b/src/plugins/element.js
new file mode 100644
index 0000000..3e66f98
--- /dev/null
+++ b/src/plugins/element.js
@@ -0,0 +1,36 @@
+import Vue from 'vue'
+import {
+ Breadcrumb, BreadcrumbItem,
+ Button, Checkbox,
+ CheckboxGroup, Dialog,
+ Drawer, Message,
+ Popover, Radio,
+ RadioGroup, TabPane,
+ Tabs,
+ Tree,
+} from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+Vue.use(Button)
+Vue.use(Popover)
+Vue.use(Dialog)
+Vue.use(Drawer)
+Vue.use(Tree)
+Vue.use(Radio)
+Vue.use(RadioGroup)
+Vue.use(Checkbox)
+Vue.use(CheckboxGroup)
+Vue.use(Breadcrumb)
+Vue.use(BreadcrumbItem)
+Vue.use(Tabs)
+Vue.use(TabPane)
+
+Vue.prototype.$message = {
+ error(msg) {
+ Message.closeAll()
+ Message.error(msg)
+ },
+ success(msg) {
+ Message.closeAll()
+ Message.success(msg)
+ },
+}
diff --git a/src/plugins/lib.ts b/src/plugins/lib.ts
new file mode 100644
index 0000000..cc6ab69
--- /dev/null
+++ b/src/plugins/lib.ts
@@ -0,0 +1,45 @@
+/*
+ * @Date: 2022-08-25 15:35:18
+ * @LastEditors: StavinLi 495727881@qq.com
+ * @LastEditTime: 2022-09-21 14:37:04
+ * @FilePath: /Workflow-Vue3/src/plugins/lib.js
+ */
+import { computed } from 'vue'
+// import { useStore } from 'vuex'
+import useWorkFlowStore from '../../src/store/modules/workFlow'
+const store = useWorkFlowStore()
+
+const mapState = () => {
+ return Object.fromEntries(
+ Object.keys(store.$state).map(
+ key => [key, computed(() => store.$state[key])],
+ ),
+ )
+}
+
+const mapGetters = () => {
+ return Object.fromEntries(
+ Object.keys(store.getters).map(
+ getter => [getter, computed(() => store.getters[getter])],
+ ),
+ )
+}
+
+const mapMutations = () => {
+ return Object.fromEntries(
+
+ Object.keys(store._mutations).map(
+ mutation => [mutation, value => store.commit(mutation, value)],
+ ),
+ )
+}
+
+const mapActions = () => {
+ return Object.fromEntries(
+ Object.keys(store._actions).map(
+ action => [action, value => store.dispatch(action, value)],
+ ),
+ )
+}
+
+export { mapState, mapGetters, mapMutations, mapActions }
diff --git a/src/plugins/preload.js b/src/plugins/preload.js
new file mode 100644
index 0000000..b0281d9
--- /dev/null
+++ b/src/plugins/preload.js
@@ -0,0 +1,170 @@
+function All() {}
+All.prototype = {
+ timer: '',
+ debounce(fn, delay = 500) {
+ var _this = this
+ return function (arg) {
+ // 获取函数的作用域和变量
+ const that = this
+ const args = arg
+ clearTimeout(_this.timer) // 清除定时器
+ _this.timer = setTimeout(() => {
+ fn.call(that, args)
+ }, delay)
+ }
+ },
+ setCookie(val) { // cookie设置[{key:value}]、获取key、清除['key1','key2']
+ for (var i = 0, len = val.length; i < len; i++) {
+ for (var key in val[i]) {
+ document.cookie = `${key}=${encodeURIComponent(val[i][key])}; path=/`
+ }
+ }
+ },
+ getCookie(name) {
+ var strCookie = document.cookie
+ var arrCookie = strCookie.split('; ')
+ for (var i = 0, len = arrCookie.length; i < len; i++) {
+ var arr = arrCookie[i].split('=')
+ if (name == arr[0]) {
+ return decodeURIComponent(arr[1])
+ }
+ }
+ },
+ clearCookie(name) {
+ var myDate = new Date()
+ myDate.setTime(-1000) // 设置时间
+ for (var i = 0, len = name.length; i < len; i++) {
+ document.cookie = `${name[i]}=''; path=/; expires=${myDate.toGMTString()}`
+ }
+ },
+ arrToStr(arr) {
+ if (arr) {
+ return arr.map((item) => { return item.name }).toString()
+ }
+ },
+ toggleClass(arr, elem, key = 'id') {
+ return arr.some((item) => { return item[key] == elem[key] })
+ },
+ toChecked(arr, elem, key = 'id') {
+ var isIncludes = this.toggleClass(arr, elem, key)
+ !isIncludes ? arr.push(elem) : this.removeEle(arr, elem, key)
+ },
+ removeEle(arr, elem, key = 'id') {
+ var includesIndex
+ arr.map((item, index) => {
+ if (item[key] == elem[key]) {
+ includesIndex = index
+ }
+ })
+ arr.splice(includesIndex, 1)
+ },
+ setApproverStr(nodeConfig) {
+ if (nodeConfig.settype == 1) {
+ if (nodeConfig.nodeUserList.length == 1) {
+ return nodeConfig.nodeUserList[0].name
+ }
+ else if (nodeConfig.nodeUserList.length > 1) {
+ if (nodeConfig.examineMode == 1) {
+ return this.arrToStr(nodeConfig.nodeUserList)
+ }
+ else if (nodeConfig.examineMode == 2) {
+ return `${nodeConfig.nodeUserList.length}人会签`
+ }
+ }
+ }
+ else if (nodeConfig.settype == 2) {
+ const level = nodeConfig.directorLevel == 1 ? '直接主管' : `第${nodeConfig.directorLevel}级主管`
+ if (nodeConfig.examineMode == 1) {
+ return level
+ }
+ else if (nodeConfig.examineMode == 2) {
+ return `${level}会签`
+ }
+ }
+ else if (nodeConfig.settype == 4) {
+ if (nodeConfig.selectRange == 1) {
+ return '发起人自选'
+ }
+ else {
+ if (nodeConfig.nodeUserList.length > 0) {
+ if (nodeConfig.selectRange == 2) {
+ return '发起人自选'
+ }
+ else {
+ return `发起人从${nodeConfig.nodeUserList[0].name}中自选`
+ }
+ }
+ else {
+ return ''
+ }
+ }
+ }
+ else if (nodeConfig.settype == 5) {
+ return '发起人自己'
+ }
+ else if (nodeConfig.settype == 7) {
+ return `从直接主管到通讯录中级别最高的第${nodeConfig.examineEndDirectorLevel}个层级主管`
+ }
+ },
+ dealStr(str, obj) {
+ const arr = []
+ const list = str.split(',')
+ for (var elem in obj) {
+ list.map((item) => {
+ if (item == elem) {
+ arr.push(obj[elem].value)
+ }
+ })
+ }
+ return arr.join('或')
+ },
+ conditionStr(nodeConfig, index) {
+ var { conditionList, nodeUserList } = nodeConfig.conditionNodes[index]
+ if (conditionList.length == 0) {
+ return (index == nodeConfig.conditionNodes.length - 1) && nodeConfig.conditionNodes[0].conditionList.length != 0 ? '其他条件进入此流程' : '请设置条件'
+ }
+ else {
+ let str = ''
+ for (var i = 0; i < conditionList.length; i++) {
+ var { columnId, columnType, showType, showName, optType, zdy1, opt1, zdy2, opt2, fixedDownBoxValue } = conditionList[i]
+ if (columnId == 0) {
+ if (nodeUserList.length != 0) {
+ str += '发起人属于:'
+ str += `${nodeUserList.map((item) => { return item.name }).join('或')} 并且 `
+ }
+ }
+ if (columnType == 'String' && showType == '3') {
+ if (zdy1) {
+ str += `${showName}属于:${this.dealStr(zdy1, JSON.parse(fixedDownBoxValue))} 并且 `
+ }
+ }
+ if (columnType == 'Double') {
+ if (optType != 6 && zdy1) {
+ var optTypeStr = ['', '<', '>', '≤', '=', '≥'][optType]
+ str += `${showName} ${optTypeStr} ${zdy1} 并且 `
+ }
+ else if (optType == 6 && zdy1 && zdy2) {
+ str += `${zdy1} ${opt1} ${showName} ${opt2} ${zdy2} 并且 `
+ }
+ }
+ }
+ return str ? str.substring(0, str.length - 4) : '请设置条件'
+ }
+ },
+ copyerStr(nodeConfig) {
+ if (nodeConfig.nodeUserList.length != 0) {
+ return this.arrToStr(nodeConfig.nodeUserList)
+ }
+ else {
+ if (nodeConfig.ccSelfSelectFlag == 1) {
+ return '发起人自选'
+ }
+ }
+ },
+ toggleStrClass(item, key) {
+ const a = item.zdy1 ? item.zdy1.split(',') : []
+ return a.some((item) => { return item == key })
+ },
+}
+
+export default new All()
diff --git a/src/store/modules/workFlow.ts b/src/store/modules/workFlow.ts
new file mode 100644
index 0000000..956b386
--- /dev/null
+++ b/src/store/modules/workFlow.ts
@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+const useWorkFlowStore = defineStore(
+ 'workFlow',
+ {
+ state: () => ({
+ tableId: '',
+ isTried: false,
+ promoterDrawer: false,
+ flowPermission1: {},
+ approverDrawer: false,
+ approverConfig1: {},
+ copyerDrawer: false,
+ copyerConfig1: {},
+ conditionDrawer: false,
+ conditionsConfig1: {
+ conditionNodes: [],
+ },
+ }),
+ actions: {
+ setTableId(payload: string) {
+ this.tableId = payload
+ },
+ setIsTried(payload: boolean) {
+ this.isTried = payload
+ },
+ setPromoter(payload: boolean) {
+ this.promoterDrawer = payload
+ },
+ setFlowPermission(payload: object) {
+ this.flowPermission1 = payload
+ },
+ setApprover(payload: boolean) {
+ this.approverDrawer = payload
+ },
+ setApproverConfig(payload: object) {
+ this.approverConfig1 = payload
+ },
+ setCopyer(payload: boolean) {
+ this.copyerDrawer = payload
+ },
+ setCopyerConfig(payload: object) {
+ this.copyerConfig1 = payload
+ },
+ setCondition(payload: boolean) {
+ this.conditionDrawer = payload
+ },
+ setConditionsConfig(payload: any) {
+ this.conditionsConfig1 = payload
+ },
+ },
+ },
+)
+
+export default useWorkFlowStore
diff --git a/src/views/setting.vue b/src/views/setting.vue
new file mode 100644
index 0000000..534d796
--- /dev/null
+++ b/src/views/setting.vue
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+
+
diff --git a/.eslintrc b/.eslintrc
index cd94cc4..a6a6e44 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -6,6 +6,12 @@
"no-const-assign": "off",
"no-console": "off",
"eqeqeq": "off",
+ "vars-on-top":"off",
+ "no-var":"off",
+ "array-callback-return":"off",
+ "@typescript-eslint/no-this-alias": "off",
+ "no-unused-expressions":"off",
+ "vue/no-mutating-props": "off",
"vue/component-name-in-template-casing": ["error", "kebab-case", {
"registeredComponentsOnly": false,
"ignores": []
diff --git a/.gitignore b/.gitignore
index 8265508..84ea431 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@
!src/assets/sprites/.gitkeep
public/icons
.idea
+.history
diff --git a/public/data.json b/public/data.json
new file mode 100644
index 0000000..bbe88b1
--- /dev/null
+++ b/public/data.json
@@ -0,0 +1,139 @@
+{
+ "code": "200",
+ "msg": "success",
+ "data": {
+ "tableId": 1,
+ "workFlowDef": {
+ "name": "合同审批"
+ },
+ "directorMaxLevel": 4,
+ "flowPermission": [],
+ "nodeConfig": {
+ "nodeName": "发起人",
+ "type": 0,
+ "priorityLevel": "",
+ "settype": "",
+ "selectMode": "",
+ "selectRange": "",
+ "directorLevel": "",
+ "examineMode": "",
+ "noHanderAction": "",
+ "examineEndDirectorLevel": "",
+ "ccSelfSelectFlag": "",
+ "conditionList": [],
+ "nodeUserList": [],
+ "childNode": {
+ "nodeName": "审核人",
+ "error": false,
+ "type": 1,
+ "settype": 2,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 0,
+ "childNode": {
+ "nodeName": "路由",
+ "type": 4,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [],
+ "childNode": {
+ "nodeName": "抄送人",
+ "type": 2,
+ "ccSelfSelectFlag": 1,
+ "childNode": null,
+ "nodeUserList": [],
+ "error": false
+ },
+ "conditionNodes": [{
+ "nodeName": "条件1",
+ "type": 3,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [{
+ "columnId": 0,
+ "type": 1,
+ "conditionEn": "",
+ "conditionCn": "",
+ "optType": "",
+ "zdy1": "",
+ "zdy2": "",
+ "opt1": "",
+ "opt2": "",
+ "columnDbname": "",
+ "columnType": "",
+ "showType": "",
+ "showName": "",
+ "fixedDownBoxValue": ""
+ }],
+ "nodeUserList": [{
+ "targetId": 85,
+ "type": 1,
+ "name": "天旭"
+ }],
+ "childNode": {
+ "nodeName": "审核人",
+ "type": 1,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [{
+ "targetId": 2515744,
+ "type": 1,
+ "name": "哈哈哈哈"
+ }],
+ "childNode": null,
+ "conditionNodes": [],
+ "error": false
+ },
+ "conditionNodes": [],
+ "error": false
+ }, {
+ "nodeName": "条件2",
+ "type": 3,
+ "priorityLevel": 2,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [],
+ "childNode": null,
+ "conditionNodes": [],
+ "error": false
+ }]
+ },
+ "nodeUserList": []
+ },
+ "conditionNodes": []
+ }
+ }
+}
\ No newline at end of file
diff --git "a/public/data\345\255\227\346\256\265\346\263\250\351\207\212.js" "b/public/data\345\255\227\346\256\265\346\263\250\351\207\212.js"
new file mode 100644
index 0000000..bb7afeb
--- /dev/null
+++ "b/public/data\345\255\227\346\256\265\346\263\250\351\207\212.js"
@@ -0,0 +1,137 @@
+export default {
+ "code": "200",
+ "msg": "success",
+ "data": {
+ "tableId": 1,//审批id
+ "workFlowDef": {
+ "name": "合同审批",//审批名称
+ },
+ "directorMaxLevel": 4,//审批主管最大层级
+ "flowPermission": [],//发起人
+ "nodeConfig": {
+ "nodeName": "发起人",//节点名称
+ "type": 0,// 0 发起人 1审批 2抄送 3条件 4路由
+ "priorityLevel": "",// 条件优先级
+ "settype": "",// 审批人设置 1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管
+ "selectMode": "", //审批人数 1选一个人 2选多个人
+ "selectRange": "", //选择范围 1.全公司 2指定成员 2指定角色
+ "directorLevel": "", //审批终点 最高层主管数
+ "examineMode": "", //多人审批时采用的审批方式 1依次审批 2会签
+ "noHanderAction": "",//审批人为空时 1自动审批通过/不允许发起 2转交给审核管理员
+ "examineEndDirectorLevel": "", //审批终点 第n层主管
+ "ccSelfSelectFlag": "", //允许发起人自选抄送人
+ "conditionList": [], //当审批单同时满足以下条件时进入此流程
+ "nodeUserList": [], //操作人
+ "childNode": {
+ "nodeName": "审核人",
+ "error": false, //当前审批是否通过校验
+ "type": 1,
+ "settype": 2,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 0,
+ "childNode": {
+ "nodeName": "路由",
+ "type": 4,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [],
+ "childNode": {
+ "nodeName": "抄送人",
+ "type": 2,
+ "ccSelfSelectFlag": 1,
+ "childNode": null,
+ "nodeUserList": [],
+ "error": false
+ },
+ "conditionNodes": [{ //条件节点
+ "nodeName": "条件1",
+ "type": 3,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [{ //当前条件
+ "columnId": 0, //发起人
+ "type": 1, //1 发起人 2其他
+ "optType": "", //["", "<", ">", "≤", "=", "≥"][optType]
+ "zdy1": "",//左侧自定义内容
+ "zdy2": "",//右侧自定义内容
+ "opt1": "",//左侧符号 < ≤
+ "opt2": "",//右侧符号 < ≤
+ "columnDbname": "",//条件字段名称
+ "columnType": "",//条件字段类型
+ "showType": "",//3多选 其他
+ "showName": "",//展示名
+ "fixedDownBoxValue": ""//多选数组
+ }],
+ "nodeUserList": [{
+ "targetId": 85,
+ "type": 1,
+ "name": "天旭"
+ }],
+ "childNode": {
+ "nodeName": "审核人",
+ "type": 1,
+ "priorityLevel": 1,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [{
+ "targetId": 2515744,
+ "type": 1,
+ "name": "哈哈哈哈"
+ }],
+ "childNode": null,
+ "conditionNodes": [],
+ "error": false
+ },
+ "conditionNodes": [],
+ "error": false
+ }, {
+ "nodeName": "条件2",
+ "type": 3,
+ "priorityLevel": 2,
+ "settype": 1,
+ "selectMode": 0,
+ "selectRange": 0,
+ "directorLevel": 1,
+ "examineMode": 1,
+ "noHanderAction": 2,
+ "examineEndDirectorLevel": 1,
+ "ccSelfSelectFlag": 1,
+ "conditionList": [],
+ "nodeUserList": [],
+ "childNode": null,
+ "conditionNodes": [],
+ "error": false
+ }]
+ },
+ "nodeUserList": []
+ },
+ "conditionNodes": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components.d.ts b/src/components.d.ts
index 4fd0936..f96b6fe 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -7,29 +7,39 @@
declare module '@vue/runtime-core' {
export interface GlobalComponents {
- AddNode: typeof import('./components/workFlow/addNode.vue')['default']
+ AddNode: typeof import('./components/addNode.vue')['default']
AppContainer: typeof import('./components/AppContainer/index.vue')['default']
+ ApproverDrawer: typeof import('./components/drawer/approverDrawer.vue')['default']
Auth: typeof import('./components/Auth/index.vue')['default']
AuthAll: typeof import('./components/AuthAll/index.vue')['default']
BatchActionBar: typeof import('./components/BatchActionBar/index.vue')['default']
+ ConditionDrawer: typeof import('./components/drawer/conditionDrawer.vue')['default']
+ CopyerDrawer: typeof import('./components/drawer/copyerDrawer.vue')['default']
Copyright: typeof import('./components/Copyright/index.vue')['default']
DeptSelect: typeof import('./components/DeptSelect/index.vue')['default']
Editor: typeof import('./components/Editor/index.vue')['default']
+ EmployeesDialog: typeof import('./components/dialog/employeesDialog.vue')['default']
+ EmployeesRoleDialog: typeof import('./components/dialog/employeesRoleDialog.vue')['default']
+ ErrorDialog: typeof import('./components/dialog/errorDialog.vue')['default']
FileUpload: typeof import('./components/FileUpload/index.vue')['default']
FixedActionBar: typeof import('./components/FixedActionBar/index.vue')['default']
ImagePreview: typeof import('./components/ImagePreview/index.vue')['default']
ImagesUpload: typeof import('./components/ImagesUpload/index.vue')['default']
ImageUpload: typeof import('./components/ImageUpload/index.vue')['default']
- NodeWrap: typeof import('./components/workFlow/nodeWrap.vue')['default']
+ NodeWrap: typeof import('./components/nodeWrap.vue')['default']
NormalTable: typeof import('./components/NormalTable/index.vue')['default']
PageHeader: typeof import('./components/PageHeader/index.vue')['default']
PageMain: typeof import('./components/PageMain/index.vue')['default']
PcasCascader: typeof import('./components/PcasCascader/index.vue')['default']
+ PromoterDrawer: typeof import('./components/drawer/promoterDrawer.vue')['default']
+ RoleDialog: typeof import('./components/dialog/roleDialog.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SearchArea: typeof import('./components/SearchArea/index.vue')['default']
SearchBar: typeof import('./components/SearchBar/index.vue')['default']
SearchItem: typeof import('./components/SearchArea/SearchItem.vue')['default']
+ SelectBox: typeof import('./components/selectBox.vue')['default']
+ SelectResult: typeof import('./components/selectResult.vue')['default']
SelectTree: typeof import('./components/SelectTree/index.vue')['default']
SvgIcon: typeof import('./components/SvgIcon/index.vue')['default']
SystemInfo: typeof import('./components/SystemInfo/index.vue')['default']
diff --git a/src/components/addNode.vue b/src/components/addNode.vue
new file mode 100644
index 0000000..71f6df6
--- /dev/null
+++ b/src/components/addNode.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/dialog/common.js b/src/components/dialog/common.js
new file mode 100644
index 0000000..c7984c5
--- /dev/null
+++ b/src/components/dialog/common.js
@@ -0,0 +1,47 @@
+/*
+ * @Date: 2022-08-25 14:05:59
+ * @LastEditors: StavinLi 495727881@qq.com
+ * @LastEditTime: 2022-09-21 14:36:34
+ * @FilePath: /Workflow-Vue3/src/components/dialog/common.js
+ */
+import { ref } from 'vue'
+import { getDepartments, getEmployees, getRoles } from '@/plugins/api.js'
+import $func from '@/plugins/preload.js'
+export const searchVal = ref('')
+export const departments = ref({
+ titleDepartments: [],
+ childDepartments: [],
+ employees: [],
+})
+export const roles = ref({})
+export const getRoleList = async () => {
+ const { data: { list } } = await getRoles()
+ roles.value = list
+}
+export const getDepartmentList = async (parentId = 0) => {
+ const { data } = await getDepartments({ parentId })
+ departments.value = data
+}
+export const getDebounceData = (event, type = 1) => {
+ $func.debounce(async () => {
+ if (event.target.value) {
+ const data = {
+ searchName: event.target.value,
+ pageNum: 1,
+ pageSize: 30,
+ }
+ if (type == 1) {
+ departments.value.childDepartments = []
+ const res = await getEmployees(data)
+ departments.value.employees = res.data.list
+ }
+ else {
+ const res = await getRoles(data)
+ roles.value = res.data.list
+ }
+ }
+ else {
+ type == 1 ? await getDepartmentList() : await getRoleList()
+ }
+ })()
+}
diff --git a/src/components/dialog/employeesDialog.vue b/src/components/dialog/employeesDialog.vue
new file mode 100644
index 0000000..61ac040
--- /dev/null
+++ b/src/components/dialog/employeesDialog.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+ 天下
+ {{ item.departmentName }}
+
+
+
+
+
+
+
+ 取 消
+
+
+ 确 定
+
+
+
+
+
+
diff --git a/src/components/dialog/employeesRoleDialog.vue b/src/components/dialog/employeesRoleDialog.vue
new file mode 100644
index 0000000..9679941
--- /dev/null
+++ b/src/components/dialog/employeesRoleDialog.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 天下
+ {{ item.departmentName }}
+
+
+
+
+
+
+
+ 取 消
+
+
+ 确 定
+
+
+
+
+
+
diff --git a/src/components/dialog/errorDialog.vue b/src/components/dialog/errorDialog.vue
new file mode 100644
index 0000000..f79428d
--- /dev/null
+++ b/src/components/dialog/errorDialog.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
当前无法发布
+
+
+
+ 以下内容不完善,需进行修改
+
+
+
+
+ 流程设计
+
+
+ {{ item.name }} 未选择{{ item.type }}
+
+
+
+
+
+
+
+
+ 我知道了
+
+
+ 前往修改
+
+
+
+
+
+
diff --git a/src/components/dialog/roleDialog.vue b/src/components/dialog/roleDialog.vue
new file mode 100644
index 0000000..025a105
--- /dev/null
+++ b/src/components/dialog/roleDialog.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+ 取 消
+
+
+ 确 定
+
+
+
+
+
+
diff --git a/src/components/drawer/approverDrawer.vue b/src/components/drawer/approverDrawer.vue
new file mode 100644
index 0000000..6b2694d
--- /dev/null
+++ b/src/components/drawer/approverDrawer.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+ 指定成员
+
+
+ 主管
+
+
+ 发起人自选
+
+
+ 发起人自己
+
+
+ 连续多级主管
+
+
+
+ 添加/修改成员
+
+
+ {{ item.name }}
+
+
+ 清除
+
+
+
+
+ 发起人的:
+
+
+
+ 找不到主管时,由上级主管代审批
+
+
+
+
该审批节点设置“发起人自己”后,审批人默认为发起人
+
+
+
+
+ 选一个人
+
+
+ 选多个人
+
+
+
选择范围
+
+
+ 全公司
+
+
+ 指定成员
+
+
+ 指定角色
+
+
+
+ 添加/修改成员
+
+
+ 添加/修改角色
+
+
+ {{ item.name }}
+
+
+ 清除
+
+
+
+
审批终点
+
+ 发起人的:
+
+
+
+
+
多人审批时采用的审批方式
+
+
+ 依次审批
+
+
+
+ 会签(须所有审批人同意)
+
+
+
+
+
审批人为空时
+
+
+ 自动审批通过/不允许发起
+
+
+
+ 转交给审核管理员
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/drawer/conditionDrawer.vue b/src/components/drawer/conditionDrawer.vue
new file mode 100644
index 0000000..bc3d84e
--- /dev/null
+++ b/src/components/drawer/conditionDrawer.vue
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+ 条件设置
+
+
+
+
+
+
+ 当审批单同时满足以下条件时进入此流程
+
+
+ -
+ {{ item.type === 1 ? '发起人' : item.showName }}:
+
+
+
+ {{ item1.name }}
+
+
+
+
+
+
+ 删除
+ 删除
+
+
+
+ 添加条件
+
+
+ 请选择用来区分审批流程的条件字段
+
+ 发起人
+ {{ item.showName }}
+
+
+
+ 取 消
+
+
+ 确 定
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/drawer/copyerDrawer.vue b/src/components/drawer/copyerDrawer.vue
new file mode 100644
index 0000000..a3fc819
--- /dev/null
+++ b/src/components/drawer/copyerDrawer.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+ 添加成员
+
+
+ {{ item.name }}
+
+
+ 清除
+
+
+
+ 允许发起人自选抄送人
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/drawer/promoterDrawer.vue b/src/components/drawer/promoterDrawer.vue
new file mode 100644
index 0000000..7108976
--- /dev/null
+++ b/src/components/drawer/promoterDrawer.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
{{ $func.arrToStr(flowPermission) || '所有人' }}
+
+ 添加/修改发起人
+
+
+
+
+
+
+
+
+
diff --git a/src/components/nodeWrap.vue b/src/components/nodeWrap.vue
new file mode 100644
index 0000000..0cd3792
--- /dev/null
+++ b/src/components/nodeWrap.vue
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+ {{ nodeConfig.nodeName }}
+
+ {{ nodeConfig.type === 1 ? '' : '' }}
+
+ {{ nodeConfig.nodeName }}
+
+
+
+
+
+ 请选择{{ defaultText }}
+ {{ showText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <
+
+
+
+ {{ item.nodeName }}
+ 优先级{{ item.priorityLevel }}
+
+
+
+ >
+
+
+ {{ $func.conditionStr(nodeConfig, index) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/selectBox.vue b/src/components/selectBox.vue
new file mode 100644
index 0000000..e4f2c55
--- /dev/null
+++ b/src/components/selectBox.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
diff --git a/src/components/selectResult.vue b/src/components/selectResult.vue
new file mode 100644
index 0000000..21c2de5
--- /dev/null
+++ b/src/components/selectResult.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+ 已选({{ total }})
+ 清空
+
+
+
+
+ -
+
+ {{ item.roleName }}
+
+
+
+
+ -
+
+ {{ item.departmentName }}
+
+
+
+
+ -
+
+ {{ item.employeeName }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/workFlow/addNode.vue b/src/components/workFlow/addNode.vue
index 19cc830..2c0ea84 100644
--- a/src/components/workFlow/addNode.vue
+++ b/src/components/workFlow/addNode.vue
@@ -1,4 +1,5 @@
@@ -87,7 +87,7 @@
-
+
@@ -108,10 +108,12 @@
条件分支
-
-
+
+
+
+
+
+
@@ -137,7 +139,7 @@
bottom: 0;
z-index: -1;
margin: auto;
- width: 1px;
+ width: 2px;
// height: 100%;
background-color: #ebebeb;
}
@@ -148,9 +150,11 @@
}
.add-node-popover {
+ width: fit-content;
padding: 14px 26px;
.add-node-popover-body {
+ width: fit-content;
display: flex;
.add-node-popover-item {
@@ -169,6 +173,7 @@
p {
color: #333;
margin-top: 4px;
+ white-space: nowrap;
}
}
@@ -192,3 +197,15 @@
}
}
+
+
diff --git a/src/components/workFlow/nodeWrap.vue b/src/components/workFlow/nodeWrap.vue
index f6e3bd1..a5b1ff7 100644
--- a/src/components/workFlow/nodeWrap.vue
+++ b/src/components/workFlow/nodeWrap.vue
@@ -644,8 +644,8 @@