Browse Source

feat: ✨ 完成项目管理界面以及修复bug

@sun-chaoqun 1 year ago
parent
commit
a9f280b730

+ 4 - 0
.eslintrc.cjs

@@ -28,6 +28,10 @@ module.exports = {
     withDefaults: 'readonly'
   },
   rules: {
+    quotes: [1, 'single'],
+    'prettier/prettier': 'off',
+    // 'prettier/prettier': ['error', { singleQuote: true, parser: 'flow' }],
+
     'vue/multi-word-component-names': 'off',
     'no-var': 'error',
     'no-multiple-empty-lines': ['error', { max: 1 }],

+ 1 - 0
.gitignore

@@ -12,6 +12,7 @@ dist
 ERP
 dist-ssr
 *.local
+stats.html
 
 # Editor directories and files
 .vscode/*

+ 8 - 8
.prettierrc.cjs

@@ -1,23 +1,23 @@
 module.exports = {
   tabWidth: 2, // 使用4个空格缩进
   semi: false, // 代码结尾是否加分号
-  trailingComma: "none", // 代码末尾不需要逗号
+  trailingComma: 'none', // 代码末尾不需要逗号
   singleQuote: true, // 是否使用单引号
   printWidth: 120, // 超过多少字符强制换行
-  arrowParens: "avoid", // 单个参数的箭头函数不加括号 x => x
+  arrowParens: 'avoid', // 单个参数的箭头函数不加括号 x => x
   bracketSpacing: true, // 对象大括号内两边是否加空格 { a:0 }
 
-  endOfLine: "auto", // 文件换行格式 LF/CRLF
+  endOfLine: 'auto', // 文件换行格式 LF/CRLF
   useTabs: false, // 不使用缩进符,而使用空格
-  quoteProps: "as-needed", // 对象的key仅在必要时用引号
+  quoteProps: 'as-needed', // 对象的key仅在必要时用引号
   jsxSingleQuote: false, // jsx不使用单引号,而使用双引号
   jsxBracketSameLine: false, // jsx标签的反尖括号需要换行
   rangeStart: 0, // 每个文件格式化的范围是文件的全部内容
   rangeEnd: Infinity, // 结尾
   requirePragma: false, // 不需要写文件开头的 @prettier
   insertPragma: false, // 不需要自动在文件开头插入 @prettier
-  proseWrap: "preserve", // 使用默认的折行标准
-  htmlWhitespaceSensitivity: "css", // 根据显示样式决定html要不要折行
+  proseWrap: 'preserve', // 使用默认的折行标准
+  htmlWhitespaceSensitivity: 'css', // 根据显示样式决定html要不要折行
   // 格式化嵌入的内容
-  embeddedLanguageFormatting: 'auto',
-};
+  embeddedLanguageFormatting: 'auto'
+}

+ 2 - 0
README.md

@@ -16,6 +16,8 @@
 
 考勤管理 https://erp.baozhida.cn/api/ams
 
+立项管理 https://erp.baozhida.cn/testapi/project
+
 #### 测试环境
 
 https://erp.baozhida.cn/testapi/storage

+ 330 - 0
package-lock.json

@@ -33,6 +33,7 @@
         "eslint-plugin-prettier": "^4.2.1",
         "eslint-plugin-vue": "^9.9.0",
         "prettier": "^2.8.4",
+        "rollup-plugin-visualizer": "^5.9.0",
         "sass": "^1.59.3",
         "typescript": "^4.9.3",
         "unplugin-auto-import": "^0.15.1",
@@ -1882,6 +1883,20 @@
         "node": ">= 10.0"
       }
     },
+    "node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -2046,6 +2061,15 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "node_modules/define-lazy-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -2270,6 +2294,12 @@
         }
       }
     },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
     "node_modules/entities": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
@@ -2786,6 +2816,15 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
     "node_modules/glob": {
       "version": "7.2.3",
       "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
@@ -3003,6 +3042,18 @@
         "has": "^1.0.3"
       }
     },
+    "node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "dev": true,
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3012,6 +3063,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/is-glob": {
       "version": "4.0.3",
       "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
@@ -3042,6 +3102,18 @@
         "node": ">=8"
       }
     },
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -3434,6 +3506,20 @@
         "wrappy": "1"
       }
     },
+    "node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "dev": true,
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/optionator": {
       "version": "0.9.1",
       "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz",
@@ -3730,6 +3816,15 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/resolve": {
       "version": "1.22.1",
       "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
@@ -3791,6 +3886,41 @@
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/rollup-plugin-visualizer": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+      "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
+      "dev": true,
+      "dependencies": {
+        "open": "^8.4.0",
+        "picomatch": "^2.3.1",
+        "source-map": "^0.7.4",
+        "yargs": "^17.5.1"
+      },
+      "bin": {
+        "rollup-plugin-visualizer": "dist/bin/cli.js"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "rollup": "2.x || 3.x"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -3900,6 +4030,20 @@
       "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
       "deprecated": "Please use @jridgewell/sourcemap-codec instead"
     },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -4556,6 +4700,20 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
@@ -4571,12 +4729,48 @@
         "node": ">=12"
       }
     },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -5930,6 +6124,17 @@
         "source-map": "~0.6.0"
       }
     },
+    "cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
     "color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -6061,6 +6266,12 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "define-lazy-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+      "dev": true
+    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -6232,6 +6443,12 @@
         }
       }
     },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
     "entities": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
@@ -6634,6 +6851,12 @@
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true
     },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true
+    },
     "glob": {
       "version": "7.2.3",
       "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
@@ -6811,12 +7034,24 @@
         "has": "^1.0.3"
       }
     },
+    "is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "dev": true
+    },
     "is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true
     },
+    "is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true
+    },
     "is-glob": {
       "version": "4.0.3",
       "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
@@ -6838,6 +7073,15 @@
       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
       "dev": true
     },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -7168,6 +7412,17 @@
         "wrappy": "1"
       }
     },
+    "open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "dev": true,
+      "requires": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      }
+    },
     "optionator": {
       "version": "0.9.1",
       "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz",
@@ -7385,6 +7640,12 @@
       "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
       "dev": true
     },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true
+    },
     "resolve": {
       "version": "1.22.1",
       "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
@@ -7426,6 +7687,26 @@
         "fsevents": "~2.3.2"
       }
     },
+    "rollup-plugin-visualizer": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+      "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
+      "dev": true,
+      "requires": {
+        "open": "^8.4.0",
+        "picomatch": "^2.3.1",
+        "source-map": "^0.7.4",
+        "yargs": "^17.5.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.4",
+          "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
+          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+          "dev": true
+        }
+      }
+    },
     "run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -7507,6 +7788,17 @@
       "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
       "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
     },
+    "string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
     "strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -7965,6 +8257,17 @@
       "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true
     },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
@@ -7977,12 +8280,39 @@
       "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
       "dev": true
     },
+    "y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true
+    },
     "yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
+      "requires": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      }
+    },
+    "yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true
+    },
     "yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",

+ 1 - 0
package.json

@@ -35,6 +35,7 @@
     "eslint-plugin-prettier": "^4.2.1",
     "eslint-plugin-vue": "^9.9.0",
     "prettier": "^2.8.4",
+    "rollup-plugin-visualizer": "^5.9.0",
     "sass": "^1.59.3",
     "typescript": "^4.9.3",
     "unplugin-auto-import": "^0.15.1",

+ 18 - 0
src/api/project/index.ts

@@ -0,0 +1,18 @@
+import $http from '../index'
+
+// 项目列表(财务)
+export const Project_Finance_List = (params: any) => $http.post('/testapi/project/Project/Finance_List', params)
+// 项目列表
+export const User_Power_List = (params: any) => $http.post('/testapi/project/Project/List', params)
+// 审批
+export const User_Power_Approval = (params: any) => $http.post('/testapi/project/Project/Approval', params)
+// 我的项目
+export const User_Power_User_list = (params: any) => $http.post('/testapi/project/Project/User_list', params)
+// 详情
+export const User_Power_Get = (params: any) => $http.post('/testapi/project/Project/Get', params)
+// 立项申请
+export const User_Power_Add = (params: any) => $http.post('/testapi/project/Project/Add', params)
+// 编辑
+export const User_Power_Edit = (params: any) => $http.post('/testapi/project/Project/Edit', params)
+// 删除
+export const User_Power_Del = (params: any) => $http.post('/testapi/project/Project/Del', params)

+ 40 - 40
src/api/storehouse/index.ts

@@ -4,116 +4,116 @@ import $http from '../index'
  * 仓库
  */
 // 仓库列表
-export const Storehouse_Depot_List = (params: any) => $http.post('/testapi/storage/Depot/List', params)
+export const Storehouse_Depot_List = (params: any) => $http.post('/api/storage/Depot/List', params)
 // 仓库添加
-export const Storehouse_Depot_Add = (params: any) => $http.post('/testapi/storage/Depot/Add', params)
+export const Storehouse_Depot_Add = (params: any) => $http.post('/api/storage/Depot/Add', params)
 // 仓库修改
-export const Storehouse_Depot_Edit = (params: any) => $http.post('/testapi/storage/Depot/Edit', params)
+export const Storehouse_Depot_Edit = (params: any) => $http.post('/api/storage/Depot/Edit', params)
 // 仓库删除
-export const Storehouse_Depot_Del = (params: any) => $http.post('/testapi/storage/Depot/Del', params)
+export const Storehouse_Depot_Del = (params: any) => $http.post('/api/storage/Depot/Del', params)
 
 /**
  * 产品分类
  */
 // 产品列表
-export const Storehouse_ProductClass_List = (params: any) => $http.post('/testapi/storage/ProductClass/List', params)
+export const Storehouse_ProductClass_List = (params: any) => $http.post('/api/storage/ProductClass/List', params)
 // 产品添加
-export const Storehouse_ProductClass_Add = (params: any) => $http.post('/testapi/storage/ProductClass/Add', params)
+export const Storehouse_ProductClass_Add = (params: any) => $http.post('/api/storage/ProductClass/Add', params)
 // 产品修改
-export const Storehouse_ProductClass_Edit = (params: any) => $http.post('/testapi/storage/ProductClass/Edit', params)
+export const Storehouse_ProductClass_Edit = (params: any) => $http.post('/api/storage/ProductClass/Edit', params)
 // 产品删除
-export const Storehouse_ProductClass_Del = (params: any) => $http.post('/testapi/storage/ProductClass/Del', params)
+export const Storehouse_ProductClass_Del = (params: any) => $http.post('/api/storage/ProductClass/Del', params)
 
 /**
  * 产品
  */
 // 产品名称
-export const Storehouse_Product_Name_List = (params: any) => $http.post('/testapi/storage/Product/Name_List', params)
+export const Storehouse_Product_Name_List = (params: any) => $http.post('/api/storage/Product/Name_List', params)
 // 产品型号
-export const Storehouse_Product_Model_List = (params: any) => $http.post('/testapi/storage/Product/Model_List', params)
+export const Storehouse_Product_Model_List = (params: any) => $http.post('/api/storage/Product/Model_List', params)
 // 产品规格
-export const Storehouse_Product_Spec_List = (params: any) => $http.post('/testapi/storage/Product/Spec_List', params)
+export const Storehouse_Product_Spec_List = (params: any) => $http.post('/api/storage/Product/Spec_List', params)
 // 产品列表
-export const Storehouse_Product_List = (params: any) => $http.post('/testapi/storage/Product/List', params)
+export const Storehouse_Product_List = (params: any) => $http.post('/api/storage/Product/List', params)
 // 产品添加
-export const Storehouse_Product_Add = (params: any) => $http.post('/testapi/storage/Product/Add', params)
+export const Storehouse_Product_Add = (params: any) => $http.post('/api/storage/Product/Add', params)
 // 产品修改
-export const Storehouse_Product_Edit = (params: any) => $http.post('/testapi/storage/Product/Edit', params)
+export const Storehouse_Product_Edit = (params: any) => $http.post('/api/storage/Product/Edit', params)
 // 产品删除
-export const Storehouse_Product_Del = (params: any) => $http.post('/testapi/storage/Product/Del', params)
+export const Storehouse_Product_Del = (params: any) => $http.post('/api/storage/Product/Del', params)
 
 /**
  * 物联网卡
  */
 // 物联网卡列表
-export const Storehouse_IotCard_List = (params: any) => $http.post('/testapi/storage/IotCard/List', params)
+export const Storehouse_IotCard_List = (params: any) => $http.post('/api/storage/IotCard/List', params)
 // 物联网卡添加
-export const Storehouse_IotCard_Add = (params: any) => $http.post('/testapi/storage/IotCard/Add', params)
+export const Storehouse_IotCard_Add = (params: any) => $http.post('/api/storage/IotCard/Add', params)
 // 物联网卡编辑
-export const Storehouse_IotCard_Edit = (params: any) => $http.post('/testapi/storage/IotCard/Edit', params)
+export const Storehouse_IotCard_Edit = (params: any) => $http.post('/api/storage/IotCard/Edit', params)
 // 物联网卡删除
-export const Storehouse_IotCard_Del = (params: any) => $http.post('/testapi/storage/IotCard/Del', params)
+export const Storehouse_IotCard_Del = (params: any) => $http.post('/api/storage/IotCard/Del', params)
 
 /**
  * 销售管理 -> 合同
  */
 // 合同列表
-export const Storehouse_Contract_List = (params: any) => $http.post('/testapi/storage/Contract/List', params)
+export const Storehouse_Contract_List = (params: any) => $http.post('/api/storage/Contract/List', params)
 // 合同-销售
-export const Storehouse_Contract_User_List = (params: any) => $http.post('/testapi/storage/Contract/User_List', params)
+export const Storehouse_Contract_User_List = (params: any) => $http.post('/api/storage/Contract/User_List', params)
 // 详情
-export const Storehouse_Contract_Get = (params: any) => $http.post('/testapi/storage/Contract/Get', params)
+export const Storehouse_Contract_Get = (params: any) => $http.post('/api/storage/Contract/Get', params)
 // 审批
-export const Storehouse_Contract_Approval = (params: any) => $http.post('/testapi/storage/Contract/Approval', params)
+export const Storehouse_Contract_Approval = (params: any) => $http.post('/api/storage/Contract/Approval', params)
 // 添加
-export const Storehouse_Contract_Add = (params: any) => $http.post('/testapi/storage/Contract/Add', params)
+export const Storehouse_Contract_Add = (params: any) => $http.post('/api/storage/Contract/Add', params)
 // 修改
-export const Storehouse_Contract_Edit = (params: any) => $http.post('/testapi/storage/Contract/Edit', params)
+export const Storehouse_Contract_Edit = (params: any) => $http.post('/api/storage/Contract/Edit', params)
 // 删除
-export const Storehouse_Contract_Del = (params: any) => $http.post('/testapi/storage/Contract/Del', params)
+export const Storehouse_Contract_Del = (params: any) => $http.post('/api/storage/Contract/Del', params)
 // 产品列表
 export const Storehouse_Contract_Product_List = (params: any) =>
-  $http.post('/testapi/storage/Contract/Product_List', params)
+  $http.post('/api/storage/Contract/Product_List', params)
 // 获取为出库或为完全出库合同列表
-export const Storehouse_Contract_Out_List = (params: any) => $http.post('/testapi/storage/Contract/Out_List', params)
+export const Storehouse_Contract_Out_List = (params: any) => $http.post('/api/storage/Contract/Out_List', params)
 
 /**
  * 库存管理
  */
 // 设备列表
-export const Storehouse_Device_List = (params: any) => $http.post('/testapi/storage/Device/List', params)
+export const Storehouse_Device_List = (params: any) => $http.post('/api/storage/Device/List', params)
 
 /**
  * 入库
  */
 // 入库列表
-export const Storehouse_StockIn_List = (params: any) => $http.post('/testapi/storage/StockIn/List', params)
+export const Storehouse_StockIn_List = (params: any) => $http.post('/api/storage/StockIn/List', params)
 // 详情
-export const Storehouse_StockIn_Get = (params: any) => $http.post('/testapi/storage/StockIn/Get', params)
+export const Storehouse_StockIn_Get = (params: any) => $http.post('/api/storage/StockIn/Get', params)
 // 入库
-export const Storehouse_StockIn_Add = (params: any) => $http.post('/testapi/storage/StockIn/Add', params)
+export const Storehouse_StockIn_Add = (params: any) => $http.post('/api/storage/StockIn/Add', params)
 
 /**
  * 出库
  */
 // 出库列表
-export const Storehouse_StockOut_List = (params: any) => $http.post('/testapi/storage/StockOut/List', params)
+export const Storehouse_StockOut_List = (params: any) => $http.post('/api/storage/StockOut/List', params)
 // 出库
-export const Storehouse_StockOut_Add = (params: any) => $http.post('/testapi/storage/StockOut/Add', params)
+export const Storehouse_StockOut_Add = (params: any) => $http.post('/api/storage/StockOut/Add', params)
 // 详情
-export const Storehouse_StockOut_Get = (params: any) => $http.post('/testapi/storage/StockOut/Get', params)
+export const Storehouse_StockOut_Get = (params: any) => $http.post('/api/storage/StockOut/Get', params)
 // 修改发货订单
-export const Storehouse_StockOut_Edit = (params: any) => $http.post('/testapi/storage/StockOut/Edit', params)
+export const Storehouse_StockOut_Edit = (params: any) => $http.post('/api/storage/StockOut/Edit', params)
 
 /**
  * 库存统计
  */
 // 统计列表
-export const Storehouse_Stock_List = (params: any) => $http.post('/testapi/storage/Stock/List', params)
+export const Storehouse_Stock_List = (params: any) => $http.post('/api/storage/Stock/List', params)
 // 查询明细
-export const Storehouse_Stock_Detail_List = (params: any) => $http.post('/testapi/storage/Stock/Detail_List', params)
+export const Storehouse_Stock_Detail_List = (params: any) => $http.post('/api/storage/Stock/Detail_List', params)
 // 导出明细
-export const Storehouse_Stock_Detail_Excel = (params: any) => $http.post('/testapi/storage/Stock/Detail_Excel', params)
+export const Storehouse_Stock_Detail_Excel = (params: any) => $http.post('/api/storage/Stock/Detail_Excel', params)
 
 // 检查 Sn 号
-export const Storehouse_Device_Check = (params: any) => $http.post('/testapi/storage/Device/Check', params)
+export const Storehouse_Device_Check = (params: any) => $http.post('/api/storage/Device/Check', params)

BIN
src/assets/images/1.jpg


+ 34 - 0
src/router/modules/staticRouter.ts

@@ -87,6 +87,40 @@ export const staticRouter: RouteRecordRaw[] = [
         ]
       },
       {
+        path: '/projectMange',
+        name: 'ProjectMange',
+        redirect: '/contract',
+        meta: {
+          title: '项目管理'
+        },
+        children: [
+          {
+            path: '/projectFinance',
+            name: 'ProjectFinance',
+            component: () => import('@/views/project/ProjectFinance.vue'),
+            meta: {
+              title: '项目管理(财务)'
+            }
+          },
+          {
+            path: '/project',
+            name: 'Project',
+            component: () => import('@/views/project/Project.vue'),
+            meta: {
+              title: '项目管理'
+            }
+          },
+          {
+            path: '/myProject',
+            name: 'MyProject',
+            component: () => import('@/views/project/MyProject.vue'),
+            meta: {
+              title: '我的项目'
+            }
+          }
+        ]
+      },
+      {
         path: '/user',
         name: 'User',
         component: () => import('@/views/home/User.vue'),

+ 2 - 1
src/styles/element.scss

@@ -34,8 +34,9 @@ img {
 .el-table .cell {
   white-space: nowrap !important;
 }
-.el-table td.el-table__cell div {
+.el-table .el-table__row {
   color: #909399;
+  font-weight: 600;
 }
 
 .el-popper.is-customized {

+ 6 - 0
src/views/project/MyProject.vue

@@ -0,0 +1,6 @@
+<script setup lang="ts"></script>
+<template>
+  <div></div>
+</template>
+
+<style scoped></style>

+ 6 - 0
src/views/project/Project.vue

@@ -0,0 +1,6 @@
+<script setup lang="ts"></script>
+<template>
+  <div></div>
+</template>
+
+<style scoped></style>

+ 155 - 0
src/views/project/ProjectFinance.vue

@@ -0,0 +1,155 @@
+<script setup lang="ts">
+import { ElMessage } from 'element-plus'
+import { GlobalStore } from '@/stores/index'
+import { ref, reactive } from 'vue'
+import { getFormatDuration } from '@/utils/common'
+import { UserFilled } from '@element-plus/icons-vue'
+import TableBase from '@/components/TableBase/index.vue'
+import { ColumnProps } from '@/components/TableBase/interface/index'
+import { User_List } from '@/api/user/index'
+import { Project_Finance_List } from '@/api/project/index'
+
+interface UserInfoIn {
+  T_name: string
+  T_type_name: string
+  T_text: string
+  T_uuid: string
+  T_dept_name: string
+  T_post_name: string
+}
+const userInfo = ref<UserInfoIn>({
+  T_name: '',
+  T_type_name: '',
+  T_text: '',
+  T_uuid: '',
+  T_dept_name: '',
+  T_post_name: ''
+})
+const TableRef = ref()
+const globalStore = GlobalStore()
+const columns: ColumnProps[] = [{ prop: 'T_name', label: '姓名' }]
+const columnsProject: ColumnProps[] = [{ prop: 'T_name', label: '姓名' }]
+const initParam = { User_tokey: globalStore.GET_User_tokey }
+const initParamProject = reactive({ User_tokey: globalStore.GET_User_tokey, T_uuid: userInfo.value.T_uuid, page_z: 99 })
+
+const getSalaryParams = (row: any) => {
+  userInfo.value.T_uuid = ''
+  console.log(row)
+  setTimeout(() => {
+    userInfo.value = { ...row }
+    initParamProject.T_uuid = userInfo.value.T_uuid
+  }, 100)
+}
+
+const tableRowClassName = (data: any): any => {
+  //判断是否相等,相同时改变背景颜色
+  let user: any = undefined
+  if (data.row.T_uuid === userInfo.value.T_uuid) {
+    user = data.row
+  }
+  if (user !== undefined) {
+    let rowBackground = {
+      background: '#f0f9eb',
+      color: '#67c23a'
+    }
+    return rowBackground
+  } else {
+    return ''
+  }
+}
+</script>
+<template>
+  <div class="project-finance">
+    <div style="width: 290px" class="project-table">
+      <TableBase
+        ref="TableRef"
+        :columns="columns"
+        :requestApi="User_List"
+        :initParam="initParam"
+        layout="prev, pager, next"
+        :rowClick="getSalaryParams"
+        :tableRowClassName="tableRowClassName"
+      >
+        <template #table-header>
+          <h3 class="title">员工列表</h3>
+        </template>
+      </TableBase>
+    </div>
+    <transition
+      leave-active-class="animate__animated animate__fadeOutRight"
+      enter-active-class="animate__animated animate__fadeInLeft"
+    >
+      <div class="project-container" v-if="userInfo.T_uuid">
+        <el-card class="box-card">
+          <h3 class="text title m-b-5">员工基本信息</h3>
+          <div class="info-content">
+            <el-avatar shape="square" size="large" :icon="UserFilled" />
+            <div class="info-name">
+              <h4>名字:{{ userInfo.T_name }}</h4>
+              <h4>部门: {{ userInfo.T_dept_name }}</h4>
+              <h4>岗位: {{ userInfo.T_post_name }}</h4>
+            </div>
+          </div>
+        </el-card>
+        <TableBase
+          :columns="columnsProject"
+          :requestApi="Project_Finance_List"
+          :initParam="initParamProject"
+          :displayHeader="true"
+          :pagination="false"
+        >
+          <template #table-header>
+            <h3 class="title">员工列表</h3>
+          </template>
+        </TableBase>
+      </div>
+    </transition>
+  </div>
+</template>
+
+<style scoped lang="scss">
+@import '@/styles/var.scss';
+.project-finance {
+  height: 100%;
+  display: flex;
+  overflow: hidden;
+  .project-table {
+    z-index: 1;
+    @include f-direction;
+  }
+  .project-container {
+    z-index: 0;
+    flex: 1;
+    margin-left: 12px;
+    .box-card {
+      border-radius: 8px;
+    }
+    .text {
+      text-align: left;
+    }
+    .info-content {
+      display: flex;
+      color: #606266;
+      .info-name {
+        flex: 1;
+        display: flex;
+        justify-content: space-around;
+        align-items: center;
+        padding-left: 0.75rem;
+      }
+    }
+  }
+  :deep(.table-header),
+  :deep(.card) {
+    margin: 0;
+    border-radius: 8px;
+  }
+  .title {
+    width: 100%;
+    text-align: center;
+    line-height: 1.7em;
+    font-size: 20px;
+    color: #707b84;
+  }
+}
+</style>

+ 4 - 1
src/views/storehouse/ProductionList.vue

@@ -104,7 +104,10 @@ const ProductDelete = (row: any) => {
     type: 'warning'
   })
     .then(async () => {
-      const res: any = await Storehouse_Product_Del({ User_tokey: globalStore.GET_User_tokey, T_id: row.Id })
+      const res: any = await Storehouse_Product_Del({
+        User_tokey: globalStore.GET_User_tokey,
+        T_id: row.Id
+      })
       if (res.Code === 200) {
         ElMessage.success('删除成功!')
         nextTick(() => {

+ 1 - 1
src/views/storehouse/outStock/ReceiveOutStock.vue

@@ -44,7 +44,7 @@ const validate_T_product = (rule: any, value: any, callback: any) => {
 
 const rules = reactive<FormRules>({
   T_product: [{ required: true, validator: validate_T_product, trigger: 'blur' }],
-  T_receive: [{ required: true, message: '请选择经办人', trigger: 'blur' }],
+  T_receive: [{ required: true, message: '请选择经办人', trigger: 'change' }],
   T_depot_id: [{ required: true, message: '请选择仓库', trigger: 'blur' }],
   T_date: [{ required: true, message: '请选择出库日期', trigger: 'blur' }]
 })

+ 8 - 3
src/views/storehouse/outStock/SaleOutStock.vue

@@ -55,7 +55,7 @@ const columns = [
 
 const validate_T_product = (rule: any, value: any, callback: any) => {
   if (value.includes(undefined) || value === '') {
-    callback(new Error('请填写产品数量'))
+    callback(new Error('请填写产品数量,数量不能大于库存数量!'))
   } else if (value.includes(null)) {
     callback(new Error('请添加产品SN'))
   } else {
@@ -74,6 +74,7 @@ const rules = reactive<FormRules>({
 const countBlurHandle = () => {
   form.value.T_product = tableData.value.map(item => {
     if (!item.count && item.T_product_relation_sn !== 1) return undefined
+    if (item.count > item.T_stock_total) return undefined
     return `${item.T_product_id},${item.count}|`
   })
 }
@@ -106,8 +107,12 @@ const getDeviceSnToProduct = () => {
  */
 const determineSNorCount = (DeviceSnData: any) => {
   for (const item of tableData.value) {
-    if (!item.count && item.T_product_relation_sn !== 1) return 'count'
-    if (item.T_product_relation_sn === 1 && !DeviceSnData.get(item.Id) && !DeviceSnData.size) return 'sn'
+    if ((!item.count && item.T_product_relation_sn !== 1) || item.count > item.T_stock_total) return 'count'
+    if (
+      (item.T_product_relation_sn === 1 && !DeviceSnData.get(item.Id) && !DeviceSnData.size) ||
+      item.count > item.T_stock_total
+    )
+      return 'sn'
   }
   return false
 }

+ 20 - 19
vite.config.ts

@@ -3,11 +3,11 @@ import { createHtmlPlugin } from 'vite-plugin-html'
 import vue from '@vitejs/plugin-vue'
 import { resolve } from 'path'
 import path from 'path'
-// import eslintPlugin from "vite-plugin-eslint";
+// import eslintPlugin from 'vite-plugin-eslint'
 import AutoImport from 'unplugin-auto-import/vite'
 import Components from 'unplugin-vue-components/vite'
 import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
-
+import { visualizer } from 'rollup-plugin-visualizer' // Bundle 分析
 // https://vitejs.dev/config/
 export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
   const env = loadEnv(mode, process.cwd())
@@ -29,22 +29,22 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
     },
     server: {
       open: true,
-      host: '0.0.0.0',
-      proxy: {
-        '/api': {
-          target: 'https://erp.baozhida.cn',
-          changeOrigin: true,
-          rewrite: path => path.replace(/^\/api/, '/testapi')
-        },
-        '/testapi': {
-          target: 'https://erp.baozhida.cn',
-          changeOrigin: true
-        },
-        '/ams': {
-          target: 'http://erp.baozhida.cn',
-          changeOrigin: true
-        }
-      }
+      host: '0.0.0.0'
+      // proxy: {
+      //   '/api': {
+      //     target: 'https://erp.baozhida.cn',
+      //     changeOrigin: true,
+      //     rewrite: path => path.replace(/^\/api/, '/testapi')
+      //   },
+      //   '/testapi': {
+      //     target: 'https://erp.baozhida.cn',
+      //     changeOrigin: true
+      //   },
+      //   '/ams': {
+      //     target: 'http://erp.baozhida.cn',
+      //     changeOrigin: true
+      //   }
+      // }
     },
     plugins: [
       vue(),
@@ -55,8 +55,9 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
           }
         }
       }),
+      visualizer(),
       // eslintPlugin({
-      //   include: ["src/**/*.js", "src/**/*.vue", "src/*.js", "src/*.vue"],
+      //   include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue']
       // }),
       AutoImport({
         resolvers: [ElementPlusResolver()]