Browse Source

feat(#初始化项目): 初始化项目

master
丁翠 1 month ago
parent
commit
3bf3589ce5
223 changed files with 11721 additions and 0 deletions
  1. +14
    -0
      efm-demo-web/.browserslistrc
  2. +14
    -0
      efm-demo-web/.editorconfig
  3. +177
    -0
      efm-demo-web/.eslintrc.json
  4. +54
    -0
      efm-demo-web/.gitignore
  5. +4
    -0
      efm-demo-web/.npmrc
  6. +24
    -0
      efm-demo-web/.vscode/launch.json
  7. +3
    -0
      efm-demo-web/.vscode/settings.json
  8. +28
    -0
      efm-demo-web/README.md
  9. +210
    -0
      efm-demo-web/angular.json
  10. +27
    -0
      efm-demo-web/athena-microsite.config.js
  11. +23
    -0
      efm-demo-web/e2e/src/app.e2e-spec.ts
  12. +11
    -0
      efm-demo-web/e2e/src/app.po.ts
  13. +13
    -0
      efm-demo-web/e2e/tsconfig.json
  14. +36
    -0
      efm-demo-web/karma.conf.js
  15. +10
    -0
      efm-demo-web/ngcc.config.js
  16. +39
    -0
      efm-demo-web/ngsw-config.json
  17. +152
    -0
      efm-demo-web/package.json
  18. +24
    -0
      efm-demo-web/patches/@schematics+update+0.1102.12.patch
  19. +1
    -0
      efm-demo-web/project.config.json
  20. +0
    -0
      efm-demo-web/projects/webdpt/webdpt-packages/.gitkeep
  21. +20
    -0
      efm-demo-web/src/.browserslistrc
  22. +35
    -0
      efm-demo-web/src/app/app-routing.module.ts
  23. +0
    -0
      efm-demo-web/src/app/app.component.css
  24. +29
    -0
      efm-demo-web/src/app/app.component.spec.ts
  25. +13
    -0
      efm-demo-web/src/app/app.component.ts
  26. +70
    -0
      efm-demo-web/src/app/app.module.ts
  27. +5
    -0
      efm-demo-web/src/app/config/app-auth-token.ts
  28. +29
    -0
      efm-demo-web/src/app/config/custom-app-config.ts
  29. +62
    -0
      efm-demo-web/src/app/config/system-config.ts
  30. +35
    -0
      efm-demo-web/src/app/config/system.module.ts
  31. +11
    -0
      efm-demo-web/src/app/customization/customization-routes.ts
  32. +10
    -0
      efm-demo-web/src/app/customization/customization-routing.module.ts
  33. +13
    -0
      efm-demo-web/src/app/customization/customization.module.ts
  34. +0
    -0
      efm-demo-web/src/app/customization/style/index.less
  35. +47
    -0
      efm-demo-web/src/app/implementation/athena-app.module.ts
  36. +26
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget-routing.module.ts
  37. +20
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget.component.css
  38. +19
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget.component.html
  39. +82
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget.component.spec.ts
  40. +26
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget.component.ts
  41. +25
    -0
      efm-demo-web/src/app/implementation/auth/forget/forget.module.ts
  42. +34
    -0
      efm-demo-web/src/app/implementation/auth/login-routing.module.ts
  43. +24
    -0
      efm-demo-web/src/app/implementation/auth/login.module.ts
  44. +30
    -0
      efm-demo-web/src/app/implementation/auth/login/login.component.css
  45. +19
    -0
      efm-demo-web/src/app/implementation/auth/login/login.component.html
  46. +84
    -0
      efm-demo-web/src/app/implementation/auth/login/login.component.spec.ts
  47. +16
    -0
      efm-demo-web/src/app/implementation/auth/login/login.component.ts
  48. +26
    -0
      efm-demo-web/src/app/implementation/home/home-routing.module.ts
  49. +0
    -0
      efm-demo-web/src/app/implementation/home/home.component.css
  50. +3
    -0
      efm-demo-web/src/app/implementation/home/home.component.html
  51. +13
    -0
      efm-demo-web/src/app/implementation/home/home.component.ts
  52. +16
    -0
      efm-demo-web/src/app/implementation/home/home.module.ts
  53. +25
    -0
      efm-demo-web/src/app/implementation/http-error-handle.service.ts
  54. +290
    -0
      efm-demo-web/src/app/implementation/http-interceptor.service.ts
  55. +27
    -0
      efm-demo-web/src/app/implementation/implementation-routes.ts
  56. +49
    -0
      efm-demo-web/src/app/implementation/implementation-routing.module.ts
  57. +72
    -0
      efm-demo-web/src/app/implementation/implementation.module.ts
  58. +12
    -0
      efm-demo-web/src/app/implementation/language/index.ts
  59. +15
    -0
      efm-demo-web/src/app/implementation/language/model/language.config.ts
  60. +5
    -0
      efm-demo-web/src/app/implementation/menu/model/menu.config.ts
  61. +1
    -0
      efm-demo-web/src/app/implementation/menu/model/menu.model.ts
  62. +19
    -0
      efm-demo-web/src/app/implementation/model/model.ts
  63. +6
    -0
      efm-demo-web/src/app/implementation/program-info/model/program-action.config.ts
  64. +1
    -0
      efm-demo-web/src/app/implementation/program-info/model/program-action.model.ts
  65. +6
    -0
      efm-demo-web/src/app/implementation/program-info/model/program-page.config.ts
  66. +1
    -0
      efm-demo-web/src/app/implementation/program-info/model/program-page.model.ts
  67. +5
    -0
      efm-demo-web/src/app/implementation/program-info/model/program.config.ts
  68. +8
    -0
      efm-demo-web/src/app/implementation/program-info/model/program.model.ts
  69. +0
    -0
      efm-demo-web/src/app/implementation/programs/.gitkeep
  70. +15
    -0
      efm-demo-web/src/app/implementation/programs/basic-detail/basic-detail.module.ts
  71. +15
    -0
      efm-demo-web/src/app/implementation/programs/project-detail/project-detail.module.ts
  72. +15
    -0
      efm-demo-web/src/app/implementation/programs/task-detail/task-detail.module.ts
  73. +15
    -0
      efm-demo-web/src/app/implementation/service/business-dynamic-component-map.ts
  74. +123
    -0
      efm-demo-web/src/app/implementation/service/common.service.ts
  75. +40
    -0
      efm-demo-web/src/app/implementation/service/dynamic-model-convert-bussiness.service.ts
  76. +24
    -0
      efm-demo-web/src/app/implementation/shared/cust-shared.module.ts
  77. +4
    -0
      efm-demo-web/src/app/implementation/shared/organize-tree-modal/default.ts
  78. +20
    -0
      efm-demo-web/src/app/implementation/shared/select-modal/default.ts
  79. +24
    -0
      efm-demo-web/src/app/implementation/shared/shared.module.ts
  80. +1
    -0
      efm-demo-web/src/app/implementation/style/index.less
  81. +0
    -0
      efm-demo-web/src/app/implementation/style/variable.less
  82. +10
    -0
      efm-demo-web/src/app/implementation/tab-route/model/tab-route-config.ts
  83. +17
    -0
      efm-demo-web/src/app/implementation/tools-routing-wrapper.module.ts
  84. +38
    -0
      efm-demo-web/src/app/implementation/utils.ts/cookie-util.ts
  85. +10
    -0
      efm-demo-web/src/app/industry/industry-routing.module.ts
  86. +13
    -0
      efm-demo-web/src/app/industry/industry.module.ts
  87. +12
    -0
      efm-demo-web/src/app/page-not-found.component.ts
  88. +12
    -0
      efm-demo-web/src/app/routes.ts
  89. +6
    -0
      efm-demo-web/src/app/style.less
  90. +34
    -0
      efm-demo-web/src/assets/api.dev.json
  91. +19
    -0
      efm-demo-web/src/assets/api.json
  92. +211
    -0
      efm-demo-web/src/assets/i18n/en_US/ant-components.json
  93. +157
    -0
      efm-demo-web/src/assets/i18n/en_US/basic.json
  94. +3
    -0
      efm-demo-web/src/assets/i18n/en_US/default.json
  95. +36
    -0
      efm-demo-web/src/assets/i18n/en_US/task.json
  96. +215
    -0
      efm-demo-web/src/assets/i18n/zh_CN/ant-components.json
  97. +167
    -0
      efm-demo-web/src/assets/i18n/zh_CN/basic.json
  98. +3
    -0
      efm-demo-web/src/assets/i18n/zh_CN/default.json
  99. +36
    -0
      efm-demo-web/src/assets/i18n/zh_CN/task.json
  100. +217
    -0
      efm-demo-web/src/assets/i18n/zh_TW/ant-components.json

+ 14
- 0
efm-demo-web/.browserslistrc View File

@ -0,0 +1,14 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

+ 14
- 0
efm-demo-web/.editorconfig View File

@ -0,0 +1,14 @@
# Editor configuration, see http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
end_of_line = lf
[*.md]
max_line_length = off
trim_trailing_whitespace = false

+ 177
- 0
efm-demo-web/.eslintrc.json View File

@ -0,0 +1,177 @@
{
"root": true,
"ignorePatterns": [
"src/test.ts",
"**/*.spec.ts",
"projects/**/*"
],
"overrides": [
{
"files": [
"*.ts"
],
"parserOptions": {
"project": [
"tsconfig.json"
],
"createDefaultProgram": true
},
"extends": [
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"spaced-comment": [
"error",
"always",
{
"line": {
"markers": [
"/"
],
"exceptions": [
"-",
"+"
]
},
"block": {
"markers": [
"!"
],
"exceptions": [
"*"
],
"balanced": true
}
}
],
"curly": [
"error",
"all"
],
"eol-last": "error",
"guard-for-in": "error",
"indent": [
"error",
2,
{
"SwitchCase": 1
}
],
"no-labels": "error",
"max-len": [
"error",
140,
4
],
"no-caller": "error",
"no-bitwise": "error",
"no-console": "off",
"no-restricted-syntax": [
"error",
{
"selector": "CallExpression[callee.object.name=\"console\"][callee.property.name!=/^(log|warn|error|info|trace)$/]",
"message": "Unexpected property on console object was called"
}
],
"no-new-wrappers": "error",
"no-debugger": "error",
"no-empty": "off",
"no-eval": "error",
"no-shadow": [
"error",
{
"hoist": "functions"
}
],
"no-throw-literal": "error",
"no-fallthrough": "error",
"no-trailing-spaces": "error",
"no-unused-expressions": [
"error",
{
"allowTernary": true
}
],
"no-var": "error",
"prefer-const": [
"error",
{
"destructuring": "any",
"ignoreReadBeforeAssign": false
}
],
"quotes": [
"error",
"single",
{
"allowTemplateLiterals": true,
"avoidEscape": true
}
],
"radix": "error",
"semi": [
"error",
"always"
],
"eqeqeq": [
"error",
"allow-null"
],
"camelcase": "off",
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": [
"app",
"cust"
],
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": [
"app",
"cust"
],
"style": "kebab-case"
}
],
"@angular-eslint/no-inputs-metadata-property": "error",
"@angular-eslint/no-outputs-metadata-property": "error",
"@angular-eslint/no-host-metadata-property": "error",
"@angular-eslint/no-input-rename": "error",
"@angular-eslint/no-output-rename": "error",
"@angular-eslint/use-lifecycle-interface": "error",
"@angular-eslint/use-pipe-transform-interface": "error",
"@angular-eslint/component-class-suffix": "error",
"@angular-eslint/directive-class-suffix": "error",
"@angular-eslint/use-component-view-encapsulation": "off",
"@angular-eslint/no-attribute-decorator": "error",
"@angular-eslint/no-output-native": "error",
"@angular-eslint/no-output-on-prefix": "error",
"@angular-eslint/no-forward-ref": "off",
"@angular-eslint/no-unused-css": "off",
"@angular-eslint/contextual-lifecycle": "error",
"@angular-eslint/no-pipe-impure": "error",
"@angular-eslint/no-empty-lifecycle-method": [
"off"
],
"@angular-eslint/no-conflicting-lifecycle": "off"
}
},
{
"files": [
"*.html"
],
"extends": [
"plugin:@angular-eslint/template/recommended"
],
"rules": {}
}
]
}

+ 54
- 0
efm-demo-web/.gitignore View File

@ -0,0 +1,54 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/tmp
/out-tsc
/doc
# dependencies
/node_modules
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
testem.log
/typings
# e2e
/e2e/*.js
/e2e/*.map
# System Files
.DS_Store
Thumbs.db
package-lock.json
gitDiff.sh
.update
# SonarQube
.scannerwork
sonar-project.properties
.microsite/node_modules/
.microsite/src/static/package-umd/
.microsite/src/static/.version/

+ 4
- 0
efm-demo-web/.npmrc View File

@ -0,0 +1,4 @@
registry=https://registry.npmmirror.com
unsafe-perm=true
@webdpt:registry=https://repo.digiwincloud.com.cn/maven/repository/npm-webdpt/
@athena:registry=https://repo.digiwincloud.com.cn/maven/repository/npm-athena/

+ 24
- 0
efm-demo-web/.vscode/launch.json View File

@ -0,0 +1,24 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch via NPM",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script",
"schematics-debug"
],
"stopOnEntry": true,
"port": 9229,
"skipFiles": [
"<node_internals>/**"
],
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**"
],
}
]
}

+ 3
- 0
efm-demo-web/.vscode/settings.json View File

@ -0,0 +1,3 @@
{
"typescript.tsdk": "node_modules\\typescript\\lib"
}

+ 28
- 0
efm-demo-web/README.md View File

@ -0,0 +1,28 @@
# Ng-Web端平台
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.8.
需搭配nodejs 8.8以上(含npm)
## Development server
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

+ 210
- 0
efm-demo-web/angular.json View File

@ -0,0 +1,210 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"ng-webdpt": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "ngx-build-plus:browser",
"options": {
"allowedCommonJsDependencies": [
"crypto-js",
"ag-grid-angular",
"ag-grid-community",
"@ant-design/colors",
"date-fns/format",
"date-fns/parse",
"qs",
"@webdpt/framework/themes",
"lodash",
"rxjs",
"zrender"
],
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"assets": [
"src/assets",
"src/favicon.ico",
{
"glob": "**/*",
"input": "./node_modules/@webdpt/framework/assets/dw-framework",
"output": "assets/dw-framework"
},
{
"glob": "**/*",
"input": "src/assets",
"output": "assets"
},
{
"glob": "**/*",
"input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",
"output": "assets"
},
"src/manifest.webmanifest"
],
"styles": [
"src/styles.less"
],
"scripts": [
"node_modules/jsencrypt/bin/jsencrypt.js"
],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true,
"extraWebpackConfig": "webpack.config.js",
"commonChunk": false
},
"configurations": {
"production": {
"budgets": [
{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"serviceWorker": true,
"extraWebpackConfig": "webpack.prod.config.js"
},
"service-worker-dev": {
"budgets": [
{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}
],
"outputHashing": "all",
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"serviceWorker": true
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "ngx-build-plus:dev-server",
"options": {
"browserTarget": "ng-webdpt:build:development",
"port": 4200,
"extraWebpackConfig": "webpack.config.js"
},
"configurations": {
"production": {
"browserTarget": "ng-webdpt:build:production",
"extraWebpackConfig": "webpack.prod.config.js"
}
}
},
"extract-i18n": {
"builder": "ngx-build-plus:extract-i18n",
"options": {
"browserTarget": "ng-webdpt:build",
"extraWebpackConfig": "webpack.config.js"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"scripts": [
"node_modules/jsencrypt/bin/jsencrypt.js"
],
"styles": [
"src/styles.less"
],
"assets": [
"src/assets",
"src/favicon.ico",
{
"glob": "**/*",
"input": "./node_modules/@webdpt/framework/assets/dw-framework",
"output": "assets/dw-framework"
},
{
"glob": "**/*",
"input": "src/assets",
"output": "assets"
},
{
"glob": "**/*",
"input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",
"output": "assets"
},
"src/manifest.webmanifest"
]
}
},
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "ng-webdpt:serve"
},
"configurations": {
"production": {
"devServerTarget": "ng-webdpt:serve:production"
}
}
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": [
"src/**/*.ts",
"src/**/*.html"
]
}
}
}
}
},
"defaultProject": "ng-webdpt",
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
"style": "less"
},
"@schematics/angular:directive": {
"prefix": "app"
}
},
"cli": {
"warnings": {},
"analytics": false,
"defaultCollection": "@angular-eslint/schematics"
}
}

+ 27
- 0
efm-demo-web/athena-microsite.config.js View File

@ -0,0 +1,27 @@
module.exports = {
port: 4000,
envHosts: {
paas: 'https://athena-paas.digiwincloud.com.cn',
test: 'https://athena-test.digiwincloud.com.cn',
prod: 'https://athena.digiwincloud.com.cn'
},
apiJson: {
},
pluginsConfigServer: {
"app": {
"efm-demoAT": {
"name": "efmdemoAT",
"urlPrefixType": "",
"root": "http://localhost:4200",
"path": "EfmDemoATModule.js",
"description": "",
"i18n": true,
"disabledMultiVersion": true,
"isMF": true,
"moduleName": "EfmDemoATModule",
"exposesPath": "./efm-demoAT"
}
}
}
};

+ 23
- 0
efm-demo-web/e2e/src/app.e2e-spec.ts View File

@ -0,0 +1,23 @@
import { AppPage } from './app.po';
import { browser, logging } from 'protractor';
describe('workspace-project App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getTitleText()).toEqual('');
});
afterEach(async () => {
// Assert that there are no errors emitted from the browser
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
expect(logs).not.toContain(jasmine.objectContaining({
level: logging.Level.SEVERE,
} as logging.Entry));
});
});

+ 11
- 0
efm-demo-web/e2e/src/app.po.ts View File

@ -0,0 +1,11 @@
import { browser, by, element } from 'protractor';
export class AppPage {
navigateTo(): Promise<any> {
return browser.get(browser.baseUrl) as Promise<any>;
}
getTitleText(): Promise<string> {
return element(by.css('app-root')).getText() as Promise<string>;
}
}

+ 13
- 0
efm-demo-web/e2e/tsconfig.json View File

@ -0,0 +1,13 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"module": "commonjs",
"target": "es2015",
"types": [
"jasmine",
"jasminewd2",
"node"
]
}
}

+ 36
- 0
efm-demo-web/karma.conf.js View File

@ -0,0 +1,36 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/ng-webdpt'),
subdir: '.',
reporters: [
{ type: 'html' },
{ type: 'lcovonly' },
{ type: 'text-summary' }
]
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['ChromeHeadless'],
singleRun: false,
restartOnFileChange: true
});
};

+ 10
- 0
efm-demo-web/ngcc.config.js View File

@ -0,0 +1,10 @@
module.exports = {
packages: {
'@webdpt/components': {
ignorableDeepImportMatchers: [
/ng-quicksilver\/date-picker\/standard-types/,
/iv-viewer\//
]
}
},
};

+ 39
- 0
efm-demo-web/ngsw-config.json View File

@ -0,0 +1,39 @@
{
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "lazy",
"resources": {
"files": [
"/favicon.ico",
"/index.html",
"/*.css",
"/*.js"
]
}
}, {
"name": "assets",
"installMode": "lazy",
"updateMode": "lazy",
"resources": {
"files": [
"/assets/**",
"!/assets/**/*.json"
]
}
}
],
"dataGroups": [
{
"name": "app",
"urls": ["**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 0,
"maxAge": "0u",
"timeout": "3s"
}
}
]
}

+ 152
- 0
efm-demo-web/package.json View File

@ -0,0 +1,152 @@
{
"name": "ng-webdpt",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"postinstall": "npx patch-package@6.5.1 && ngcc",
"ng": "ng",
"start": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng serve",
"start-prod": "ng serve --configuration production",
"build": "ng build",
"test": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng test",
"framework-test": "ng test @webdpt/framework --code-coverage --watch",
"components-test": "ng test @webdpt/components --code-coverage --watch",
"mfa-app-test": "ng test @webdpt/mfa-app --code-coverage --watch",
"lint": "ng lint ng-webdpt",
"e2e": "ng e2e",
"buildCss": "node themeCssBuild",
"generate-i18n-files": "ngx-translate-extract -i ./src -o ./src/i18n/default-en.json --clean --sort --format namespaced-json",
"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --configuration production && node node_modules/@webdpt/scripts/builds/replace-sw.js && npm run dw-zip",
"doc:build": "compodoc -p src/tsconfig.app.json -d ./doc",
"doc:serve": "compodoc -s -r 4201 -d ./doc",
"doc:buildandserve": "compodoc -p ./tsconfig.json -s -r 4201 -d ./doc",
"sonar": "sonar-scanner",
"gmc": "node node_modules/@webdpt/scripts/builds/generate.js",
"dw-zip": "node node_modules/@webdpt/scripts/builds/dw-zip.js",
"microsite": "athena-microsite serve -e test -t mf",
"microsite:paas": "athena-microsite serve -e paas -t mf",
"microsite:prod": "athena-microsite serve -e prod -t mf"
},
"private": true,
"dependencies": {
"@angular-architects/module-federation": "^12.2.0",
"@angular/animations": "12.2.16",
"@angular/cdk": "^12.1.0",
"@angular/common": "12.2.16",
"@angular/compiler": "12.2.16",
"@angular/core": "12.2.16",
"@angular/forms": "12.2.16",
"@angular/platform-browser": "12.2.16",
"@angular/platform-browser-dynamic": "12.2.16",
"@angular/router": "12.2.16",
"@angular/service-worker": "12.2.16",
"@ant-design/icons-angular": "^12.0.3",
"@ng-dynamic-forms/core": "^14.0.0",
"@ngx-translate/core": "^13.0.0",
"@ngx-translate/http-loader": "^6.0.0",
"@types/requirejs": "^2.1.31",
"@webdpt/analytics": "5.2.11-1000",
"@webdpt/components": "5.2.11-1000",
"@webdpt/framework-js": "5.2.11-1000",
"@webdpt/framework": "5.2.11-1000",
"@webdpt/iv-viewer": "2.0.1",
"@webdpt/programs": "5.2.11-1000",
"ag-grid-angular": "^26.0.0",
"ag-grid-community": "^26.0.0",
"angular-gridster2": "^12.0.0",
"angular-in-memory-web-api": "^0.9.0",
"axios": "^1.4.0",
"classlist.js": "1.1.20150312",
"core-js": "^3.8.0",
"crypto-js": "^3.1.9-1",
"date-fns": "^2.10.0",
"fast-deep-equal": "^3.1.3",
"i18next": "^22.5.1",
"injection-js": "^2.4.0",
"jsencrypt": "^3.0.0-rc.1",
"moment": "2.24.0",
"ng-zorro-antd": "https://repo.digiwincloud.com.cn/maven/repository/npm-webdpt/ng-zorro-antd/-/ng-zorro-antd-12.1.1-1000.tgz",
"ngx-color": "5.1.3",
"ngx-highlightjs": "^2.1.1",
"ngx-mask": "^12.0.0",
"resize-observer-polyfill": "^1.5.1",
"rrule": "2.6.0",
"rxjs": "~6.6.0",
"sonarqube-scanner": "^2.4.1",
"tslint-sonarts": "^1.9.0",
"web-animations-js": "^2.3.2",
"bignumber.js": "^9.0.1",
"angular2-uuid": "^1.1.1",
"paho-mqtt": "^1.1.0",
"file-loader": "6.0.0",
"ag-grid-enterprise": "^26.0.0",
"xlsx": "^0.16.4",
"jsonpath": "^1.0.2",
"echarts": "^4.6.0",
"angular-split": "^3.0.3",
"ngx-image-cropper": "^4.0.0",
"@angular/material": "12.2.13",
"dayjs": "^1.10.4",
"jsstore": "^4.3.7",
"lodash": "^4.17.21",
"@athena/design-ui": "2.2.11-next.5",
"@athena/dynamic-core": "2.2.11-next.5",
"@athena/dynamic-ui": "2.2.11-next.5",
"ngx-echarts": "^4.2.2"
},
"devDependencies": {
"@angular-devkit/build-angular": "12.2.16",
"@angular-devkit/core": "12.2.16",
"@angular-devkit/schematics": "12.2.16",
"@angular-devkit/schematics-cli": "12.2.16",
"@angular-eslint/builder": "^12.7.0",
"@angular-eslint/eslint-plugin": "^12.7.0",
"@angular-eslint/eslint-plugin-template": "^12.7.0",
"@angular-eslint/schematics": "^12.7.0",
"@angular-eslint/template-parser": "^12.7.0",
"@angular/cli": "12.2.16",
"@angular/compiler-cli": "12.2.16",
"@angular/language-service": "12.2.16",
"@biesbjerg/ngx-translate-extract": "^2.3.4",
"@compodoc/compodoc": "^1.1.3",
"@phenomnomnominal/tsquery": "^4.1.0",
"@schematics/angular": "12.2.16",
"@schematics/update": "0.1102.12",
"@types/jasmine": "~3.6.0",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"@typescript-eslint/eslint-plugin": "4.28.2",
"@typescript-eslint/parser": "4.28.2",
"@webdpt/schematics": "5.2.11-1000",
"@webdpt/scripts": "5.2.11-1000",
"@webdpt/tslint-rules": "5.2.11-1000",
"archiver": "5.3.1",
"codelyzer": "^6.0.0",
"commander": "^5.1.0",
"cpx": "^1.5.0",
"eslint": "^7.26.0",
"inquirer": "^7.3.0",
"jasmine-core": "~3.8.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "~6.3.15",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"less": "^3.10.3",
"ng-packagr": "^12.1.1",
"protractor": "~7.0.0",
"qs": "^6.11.2",
"raw-loader": "0.5.1",
"ts-node": "~7.0.0",
"tslib": "^2.0.0",
"tslint": "~6.1.0",
"typescript": "~4.3.5",
"webpack-bundle-analyzer": "^3.7.0",
"zone.js": "~0.11.4",
"@angular-devkit/architect": "0.1202.16",
"@webdpt/athena-dev-tools": "5.2.11-1000",
"@webdpt/athena-microsite": "5.2.11-1000",
"@athena/platform-devkit": "1.0.0-4"
}
}

+ 24
- 0
efm-demo-web/patches/@schematics+update+0.1102.12.patch View File

@ -0,0 +1,24 @@
diff --git a/node_modules/@schematics/update/migrate/schema.json b/node_modules/@schematics/update/migrate/schema.json
index 58fca36..257ee01 100644
--- a/node_modules/@schematics/update/migrate/schema.json
+++ b/node_modules/@schematics/update/migrate/schema.json
@@ -1,6 +1,6 @@
{
"$schema": "http://json-schema.org/schema",
- "id": "PostUpdateSchema",
+ "$id": "PostUpdateSchema",
"type": "object",
"properties": {
"package": {
diff --git a/node_modules/@schematics/update/update/schema.json b/node_modules/@schematics/update/update/schema.json
index d921b9d..465cf9e 100644
--- a/node_modules/@schematics/update/update/schema.json
+++ b/node_modules/@schematics/update/update/schema.json
@@ -1,6 +1,6 @@
{
"$schema": "http://json-schema.org/schema",
- "id": "SchematicsUpdateSchema",
+ "$id": "SchematicsUpdateSchema",
"title": "Schematic Options Schema",
"type": "object",
"properties": {

+ 1
- 0
efm-demo-web/project.config.json View File

@ -0,0 +1 @@
{ "envType": "angular", "dap": { "enabled": false }, "athena": { "enabled": true } }

+ 0
- 0
efm-demo-web/projects/webdpt/webdpt-packages/.gitkeep View File


+ 20
- 0
efm-demo-web/src/.browserslistrc View File

@ -0,0 +1,20 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# You can see what browsers were selected by your queries by running:
# npx browserslist
#> 0.5%
#last 2 versions
#Firefox ESR
#not dead
#not IE 9-11 # For IE 9-11 support, remove 'not'.
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

+ 35
- 0
efm-demo-web/src/app/app-routing.module.ts View File

@ -0,0 +1,35 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { PageNotFoundComponent } from './page-not-found.component';
const routes: Routes = [
{
path: '',
pathMatch: 'prefix',
loadChildren: (): Promise<any> => import('./implementation/implementation.module').then(m => m.ImplementationModule)
},
{
path: '**',
component: PageNotFoundComponent
}
];
@NgModule({
imports: [
RouterModule.forRoot(
routes,
{ relativeLinkResolution: 'legacy' }
// , { enableTracing: true } // debugging purposes only
),
],
declarations: [
PageNotFoundComponent
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
}

+ 0
- 0
efm-demo-web/src/app/app.component.css View File


+ 29
- 0
efm-demo-web/src/app/app.component.spec.ts View File

@ -0,0 +1,29 @@
import { TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { DwLanguageService } from '@webdpt/framework/language';
import { of } from 'rxjs/internal/observable/of';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
providers: [
{ provide: DwLanguageService, useValue: {
currentLanguage: 'zh_TW',
setUp: (lan: string): void => { },
language$: of('zh_TW')
} }
],
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should create the app', waitForAsync(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
});

+ 13
- 0
efm-demo-web/src/app/app.component.ts View File

@ -0,0 +1,13 @@
import { Component } from '@angular/core';
import { DwLanguageService } from '@webdpt/framework/language';
@Component({
selector: 'app-root',
template: `
<router-outlet></router-outlet>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(langService: DwLanguageService) {}
}

+ 70
- 0
efm-demo-web/src/app/app.module.ts View File

@ -0,0 +1,70 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS, HttpClientJsonpModule, HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { DwIamModule, FrameworkModule } from '@webdpt/framework';
import { FrameworkUICoreModule } from '@webdpt/components/providers';
import { DwServiceWorkerModule } from '@webdpt/framework/service-worker';
import { DwDapModule } from '@webdpt/framework/dap';
import { DwProgramsModule } from '@webdpt/programs';
import { ImplementationModule } from './implementation/implementation.module';
import { SYSTEM_CONFIG } from './config/system-config';
import { SystemModule } from './config/system.module';
import { environment } from '../environments/environment';
import { DynamicFormsAntUIModule } from '@athena/dynamic-ui';
import { HttpInterceptorService } from './implementation/http-interceptor.service';
import {
DynamicFormsCoreModule,
DynamicUserBehaviorCommService,
PluginLanguageStoreService,
UserOrgInfoService,
DynamicUserBehaviorService
} from '@athena/dynamic-core';
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
AppRoutingModule,
HttpClientModule,
HttpClientJsonpModule,
/** ************* 端平台 ***************/
FrameworkModule.forRoot([], SYSTEM_CONFIG),
FrameworkUICoreModule.forRoot(),
// ---------------------------------------------------------
// | 選配
// ---------------------------------------------------------
// DwDapModule, // DAP平台
// DwProgramsModule, // 平台作業
SystemModule.forRoot([]),
ImplementationModule.forRoot([]),
DwIamModule,
DynamicFormsAntUIModule.forRoot(),
DynamicFormsCoreModule.forRoot()
],
declarations: [
AppComponent
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: HttpInterceptorService,
multi: true,
},
...DynamicFormsCoreModule.forRoot().providers,
DynamicUserBehaviorCommService,
UserOrgInfoService,
PluginLanguageStoreService
],
bootstrap: [AppComponent]
})
export class AppModule {
constructor(private userBehaviorService: DynamicUserBehaviorService, private userOrgInfoService: UserOrgInfoService) {
this.userBehaviorService.init();
this.userOrgInfoService.monitorLogin();
}
}

+ 5
- 0
efm-demo-web/src/app/config/app-auth-token.ts View File

@ -0,0 +1,5 @@
/**
* IAM digi-middleware-auth-app [AppToken].
*/
// eslint-disable-next-line max-len
export const DigiMiddlewareAuthApp = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IkF0aGVuYSIsInNpZCI6MTYzNjc3NzI1NzgyNTkyfQ.3QLTPVKsk2Mp3j_aQ3X8bQW1wCJMNWeCkL6VPoK352c';

+ 29
- 0
efm-demo-web/src/app/config/custom-app-config.ts View File

@ -0,0 +1,29 @@
export interface ICustomAppConfig {
/** 定制应用名称 */
appCode: string;
/** 定制模块名称 */
moduleName?: string;
/** 定制模块路径 */
modulePath?: string;
}
export interface IProgramInfo {
[key: string]: IProgramInfoParams;
}
export interface IProgramInfoParams {
/** json路径 */
jsonPath: string;
/** 定制页说明 */
description?: string;
}
/** 定制应用配置 */
export const CUSTOM_APP_CONFIG: ICustomAppConfig = {
appCode: 'EfmDemoAT',
moduleName: 'EfmDemoATModule',
modulePath: './src/app/implementation/athena-app.module.ts',
};
/** 定制页信息 */
export const programs: IProgramInfo = {};

+ 62
- 0
efm-demo-web/src/app/config/system-config.ts View File

@ -0,0 +1,62 @@
import { DigiMiddlewareAuthApp } from './app-auth-token';
import { IDWDmcUserInfo } from '@webdpt/framework/config';
// 開發環境變數
export const SYSTEM_CONFIG: IAppConfig = {
dwAppId: 'Athena',
dwAppName: '设备故障管理演示应用',
defaultApp: '/',
dwLogoPath: './assets/img/dwLogo.svg',
dwDateFormat: 'yyyy/MM/dd',
dwTimeFormat: 'HH:mm:ss',
dwUsingTab: false,
dwTabMultiOpen: false,
defaultLogin: '/login',
dwAppAuthToken: DigiMiddlewareAuthApp,
dwLoadMaskHttp: true,
dwLoadMaskDelay: 0,
dwDmcUserInfo: {
username: '',
password: ''
},
dwTabStoreStrategy: 'session'
};
export interface IAppConfig {
dwAppId: string; // Application ID(對應到互聯應用管理中心)
dwAppName: string; // Application NAME(對應到互聯應用管理中心)
defaultApp: string; // 首頁路徑
dwLogoPath: string; // Logo圖檔路徑
dwDateFormat: string; // 日期格式
dwTimeFormat: string; // 時間格式
dwUsingTab: boolean; // 是否啟用多頁佈局
dwTabMultiOpen: boolean; // 多頁佈局預設是否可重覆開啟作業
defaultLogin: string; // 登入頁路徑
dwAppAuthToken: string; // IAM 的 digi-middleware-auth-app [各應用系統的AppToken].
dwLoadMaskHttp: boolean; // HTTP加載遮罩是否啟用
dwLoadMaskDelay: number; // 延遲顯示加載效果的時間毫秒
dwDmcUserInfo: IDWDmcUserInfo; // 文檔中心的登入帳密
dwTabStoreStrategy?: 'session' | 'local' | 'none'; // 多頁籤儲存策略
}
function loadJSON(filePath: string): any {
const json = loadTextFileAjaxSync(filePath, 'application/json');
const obj = JSON.parse(json);
return obj;
}
function loadTextFileAjaxSync(filePath: string, mimeType: string): string {
const xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', filePath, false);
if (mimeType != null) {
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType(mimeType);
}
}
xmlhttp.send();
if (xmlhttp.status === 200) {
return xmlhttp.responseText;
} else {
return null;
}
}

+ 35
- 0
efm-demo-web/src/app/config/system.module.ts View File

@ -0,0 +1,35 @@
import { ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Provider } from '@angular/compiler/src/core';
import { DwMockModule } from '@webdpt/framework/mock';
import { DW_MOCK, DW_APP_AUTH_TOKEN } from '@webdpt/framework/config';
import { environment } from '../../environments/environment';
import { DigiMiddlewareAuthApp } from './app-auth-token';
@NgModule({
imports: [
CommonModule,
DwMockModule
],
declarations: []
})
export class SystemModule {
static forRoot(providers: Provider[]): ModuleWithProviders<SystemModule> {
return {
ngModule: SystemModule,
providers: [
{
provide: DW_MOCK,
useValue: environment.mock
},
{
provide: DW_APP_AUTH_TOKEN,
useValue: DigiMiddlewareAuthApp
},
...providers
]
};
}
}

+ 11
- 0
efm-demo-web/src/app/customization/customization-routes.ts View File

@ -0,0 +1,11 @@
import { Routes } from '@angular/router';
import { IMPLEMENTATION_ROUTES } from '../implementation/implementation-routes';
export const CUSTOMIZATION_ROUTES: Routes = [
// 設定客製應用模組路由
// 應用開發應用模組路由
...IMPLEMENTATION_ROUTES
];

+ 10
- 0
efm-demo-web/src/app/customization/customization-routing.module.ts View File

@ -0,0 +1,10 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class CustomizationRoutingModule { }

+ 13
- 0
efm-demo-web/src/app/customization/customization.module.ts View File

@ -0,0 +1,13 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CustomizationRoutingModule } from './customization-routing.module';
@NgModule({
imports: [
CommonModule,
CustomizationRoutingModule
],
declarations: []
})
export class CustomizationModule { }

+ 0
- 0
efm-demo-web/src/app/customization/style/index.less View File


+ 47
- 0
efm-demo-web/src/app/implementation/athena-app.module.ts View File

@ -0,0 +1,47 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DYNAMIC_FORM_CONTROL_MAP_FNS, DYNAMIC_FORM_MODEL_CONVERTS, PLUGIN_LANGUAGE_CHECKLIST } from '@athena/dynamic-core';
import { businessUIFormComponentMapFn } from './service/business-dynamic-component-map';
import { DynamicBusinessFormModelConvertService } from './service/dynamic-model-convert-bussiness.service';
import { APP_LANGUAGE_CHECKLIST } from './language';
import { TaskDetailModule } from './programs/task-detail/task-detail.module';
import { ProjectDetailModule } from './programs/project-detail/project-detail.module';
import { BasicDetailModule } from './programs/basic-detail/basic-detail.module';
// 定制页集合
const dynamicModules = [
TaskDetailModule,
ProjectDetailModule,
BasicDetailModule
];
const components = [
];
@NgModule({
providers: [
{
provide: DYNAMIC_FORM_CONTROL_MAP_FNS,
useValue: businessUIFormComponentMapFn,
multi: true,
},
{
provide: DYNAMIC_FORM_MODEL_CONVERTS,
useClass: DynamicBusinessFormModelConvertService,
multi: true,
},
{
provide: PLUGIN_LANGUAGE_CHECKLIST,
useValue: APP_LANGUAGE_CHECKLIST,
multi: true,
}
],
imports: [
CommonModule,
...dynamicModules
],
declarations: [...components],
entryComponents: [...components],
exports: [...components],
})
export class EfmDemoATModule { }

+ 26
- 0
efm-demo-web/src/app/implementation/auth/forget/forget-routing.module.ts View File

@ -0,0 +1,26 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ForgetComponent } from './forget.component';
const routes: Routes = [
{
path: '',
component: ForgetComponent,
pathMatch: 'prefix',
data: {
dwRouteData: {
programId: 'dw-forget'
}
}
}
];
@NgModule({
imports: [
RouterModule.forChild(routes)
],
exports: [RouterModule]
})
export class ForgetRoutingModule {
}

+ 20
- 0
efm-demo-web/src/app/implementation/auth/forget/forget.component.css View File

@ -0,0 +1,20 @@
.forget-bg {
background-color: rgba(0, 21, 41, 1);
min-height: 100vh;
}
.forget-logo {
margin-bottom: 10px;
padding-top: 100px;
}
.forget-copyright {
text-align: center;
padding-bottom: 1rem;
}
.forget-copyright span {
font-size: 14px;
}
span {
color: white;
}

+ 19
- 0
efm-demo-web/src/app/implementation/auth/forget/forget.component.html View File

@ -0,0 +1,19 @@
<div nz-row class="forget-bg">
<div nz-col [nzSpan]="24" class="forget-content">
<div nz-row class="forget-main-block">
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'">
</div>
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'6'" [nzLg]="'6'">
<img class="forget-logo" src="{{dwLogoPath | translate}}">
<dw-forget-block [verificationType]="verificationType"></dw-forget-block>
</div>
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'">
</div>
</div>
<div nz-row class="forget-copyright-block">
<div nz-col [nzSpan]="24" class="forget-copyright">
<span>© Data Systems Consulting Co., Ltd. All rights reserved.</span>
</div>
</div>
</div>
</div>

+ 82
- 0
efm-demo-web/src/app/implementation/auth/forget/forget.component.spec.ts View File

@ -0,0 +1,82 @@
import { Component, Injectable, Input, Pipe, PipeTransform } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
import { DwForgetModule } from '@webdpt/components/user/forget-block';
import { Logo_Path } from '@webdpt/framework/config';
import { Observable } from 'rxjs/internal/Observable';
import { of } from 'rxjs/internal/observable/of';
import { ForgetComponent } from './forget.component';
import { ForgetModule } from './forget.module';
describe('ForgetComponent', () => {
let component: ForgetComponent;
let fixture: ComponentFixture<ForgetComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
ForgetModule,
RouterTestingModule
],
providers: [
{ provide: TranslateService, useClass: TranslateServiceStub },
{ provide: TranslatePipe, useClass: TranslatePipeMock },
{ provide: Logo_Path, useValue: '/mock-logo-path' }
],
declarations: [ForgetComponent]
})
.overrideModule(DwForgetModule,
{
set: {
imports: [],
declarations: [MockDwForgetBlockComponent],
exports: [MockDwForgetBlockComponent]
}
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ForgetComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@Pipe({
name: 'translate'
})
export class TranslatePipeMock implements PipeTransform {
public name = 'translate';
public transform(query: string, ...args: any[]): any {
return query;
}
}
@Injectable()
export class TranslateServiceStub {
public instant(key: string, interpolateParams?: Object): string {
return key;
}
public get<T>(key: T): Observable<T> {
return of(key);
}
public onTranslationChange = of({ lang: 'TW' });
public onLangChange = of({ translations: null });
public onDefaultLangChange = of(true);
public currentLang = 'zh_TW';
}
@Component({
selector: 'dw-forget-block',
template: `
<div>MockDwForgetBlockComponent</div>
`
})
export class MockDwForgetBlockComponent {
@Input() verificationType: any;
}

+ 26
- 0
efm-demo-web/src/app/implementation/auth/forget/forget.component.ts View File

@ -0,0 +1,26 @@
import { Component, Inject, OnInit } from '@angular/core';
import { Logo_Path } from '@webdpt/framework/config';
import { IDwForgetverificationType } from '@webdpt/framework/account';
@Component({
selector: 'app-forget',
templateUrl: './forget.component.html',
styleUrls: ['./forget.component.css']
})
export class ForgetComponent implements OnInit {
verificationType: Array<IDwForgetverificationType> = [];
constructor(
@Inject(Logo_Path) public dwLogoPath: string
) { }
ngOnInit(): void {
this.verificationType = [
IDwForgetverificationType.EMAIL,
IDwForgetverificationType.MOBILEPHONE
];
}
}

+ 25
- 0
efm-demo-web/src/app/implementation/auth/forget/forget.module.ts View File

@ -0,0 +1,25 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../../shared/shared.module';
import { ForgetRoutingModule } from './forget-routing.module';
import { ForgetComponent } from './forget.component';
import { DwForgetModule } from '@webdpt/components/user/forget-block';
import { NzGridModule } from 'ng-zorro-antd/grid';
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
CommonModule,
ForgetRoutingModule,
SharedModule,
DwForgetModule,
NzGridModule,
TranslateModule
],
declarations: [
ForgetComponent
]
})
export class ForgetModule { }

+ 34
- 0
efm-demo-web/src/app/implementation/auth/login-routing.module.ts View File

@ -0,0 +1,34 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './login/login.component';
const routes: Routes = [
{
path: '',
component: LoginComponent,
pathMatch: 'prefix',
data: {
dwRouteData: {
programId: 'dw-login'
}
}
},
// {
// path: 'register',
// component: RegisterComponent
// },
// {
// path: 'forgot',
// component: ForgotComponent
// }
];
@NgModule({
imports: [
RouterModule.forChild(routes)
],
exports: [RouterModule]
})
export class LoginRoutingModule {
}

+ 24
- 0
efm-demo-web/src/app/implementation/auth/login.module.ts View File

@ -0,0 +1,24 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module';
import { LoginRoutingModule } from './login-routing.module';
import { LoginComponent } from './login/login.component';
import { DwLoginModule } from '@webdpt/components/login';
import { NzGridModule } from 'ng-zorro-antd/grid';
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
CommonModule,
LoginRoutingModule,
SharedModule,
DwLoginModule,
NzGridModule,
TranslateModule
],
declarations: [
LoginComponent
]
})
export class LoginModule { }

+ 30
- 0
efm-demo-web/src/app/implementation/auth/login/login.component.css View File

@ -0,0 +1,30 @@
.login-bg {
background-color: rgba(0, 21, 41, 1);
height: 100%;
padding-top: 100px;
}
.login-logo {
margin-bottom: 10px;
}
.login-form {
min-width: 250px;
}
.login-form-forgot {
float: right;
}
.login-form-button {
width: 100%;
}
.login-copyright {
text-align: center;
}
.login-copyright span {
font-size: 14px;
}
span {
color: white;
}

+ 19
- 0
efm-demo-web/src/app/implementation/auth/login/login.component.html View File

@ -0,0 +1,19 @@
<div nz-row class="login-bg">
<div nz-col nzSpan="24" class="login-content">
<div nz-row class="login-main-block">
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'">
</div>
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'6'" [nzLg]="'6'" style="z-index: 1">
<img class="login-logo" src="{{dwLogoPath | translate}}">
<dw-login-block [showRemember]="true" [showLanguage]="true"></dw-login-block>
</div>
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'">
</div>
</div>
<div nz-row class="login-copyright-block" nzJustify="center">
<div nz-col nzSpan="24" class="login-copyright">
<span>© Data Systems Consulting Co., Ltd. All rights reserved.</span>
</div>
</div>
</div>
</div>

+ 84
- 0
efm-demo-web/src/app/implementation/auth/login/login.component.spec.ts View File

@ -0,0 +1,84 @@
import { Component, Injectable, Input, Pipe, PipeTransform } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
import { DwLoginModule } from '@webdpt/components/login';
import { Logo_Path } from '@webdpt/framework/config';
import { Observable } from 'rxjs/internal/Observable';
import { of } from 'rxjs/internal/observable/of';
import { LoginModule } from '../login.module';
import { LoginComponent } from './login.component';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
LoginModule,
RouterTestingModule
],
providers: [
{ provide: TranslateService, useClass: TranslateServiceStub },
{ provide: TranslatePipe, useClass: TranslatePipeMock },
{ provide: Logo_Path, useValue: '/mock-logo-path' }
],
declarations: [LoginComponent]
})
.overrideModule(DwLoginModule, {
set: {
imports: [],
declarations: [MockLoginComponent],
exports: [MockLoginComponent]
}
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@Pipe({
name: 'translate'
})
export class TranslatePipeMock implements PipeTransform {
public name = 'translate';
public transform(query: string, ...args: any[]): any {
return query;
}
}
@Injectable()
export class TranslateServiceStub {
public instant(key: string, interpolateParams?: Object): string {
return key;
}
public get<T>(key: T): Observable<T> {
return of(key);
}
public onTranslationChange = of({ lang: 'TW' });
public onLangChange = of({ translations: null });
public onDefaultLangChange = of(true);
public currentLang = 'zh_TW';
}
@Component({
selector: 'dw-login-block',
template: `
<div>mockLoginComponent</div>
`
})
export class MockLoginComponent {
@Input() showRemember;
@Input() showLanguage;
}

+ 16
- 0
efm-demo-web/src/app/implementation/auth/login/login.component.ts View File

@ -0,0 +1,16 @@
import { Component, Inject, OnInit } from '@angular/core';
import { Logo_Path } from '@webdpt/framework/config';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
constructor(
@Inject(Logo_Path) public dwLogoPath: string,
) { }
}

+ 26
- 0
efm-demo-web/src/app/implementation/home/home-routing.module.ts View File

@ -0,0 +1,26 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { DwAuthGuardService } from '@webdpt/framework/auth';
import { DwDefaultAppGuardService } from '@webdpt/framework/program-info';
import { HomeComponent } from './home.component';
const routes: Routes = [
{
path: '',
component: HomeComponent,
pathMatch: 'prefix',
canActivate: [DwAuthGuardService, DwDefaultAppGuardService],
data: {
dwRouteData: {
programId: 'home'
}
}
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class HomeRoutingModule { }

+ 0
- 0
efm-demo-web/src/app/implementation/home/home.component.css View File


+ 3
- 0
efm-demo-web/src/app/implementation/home/home.component.html View File

@ -0,0 +1,3 @@
<p>
home works!
</p>

+ 13
- 0
efm-demo-web/src/app/implementation/home/home.component.ts View File

@ -0,0 +1,13 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent {
constructor() { }
}

+ 16
- 0
efm-demo-web/src/app/implementation/home/home.module.ts View File

@ -0,0 +1,16 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module';
import { HomeRoutingModule } from './home-routing.module';
import { HomeComponent } from './home.component';
@NgModule({
imports: [
CommonModule,
SharedModule,
HomeRoutingModule
],
declarations: [HomeComponent]
})
export class HomeModule { }

+ 25
- 0
efm-demo-web/src/app/implementation/http-error-handle.service.ts View File

@ -0,0 +1,25 @@
import { Injectable, ErrorHandler } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { NzMessageService } from 'ng-zorro-antd/message';
@Injectable({
providedIn: 'root',
})
export class AppErrorHandleService implements ErrorHandler {
constructor(private messageService: NzMessageService) {}
handleError(error: any): void {
// 如果是http的错误
if (error instanceof HttpErrorResponse) {
if (error.error && error.error.errorMessage) {
if (error.error.errorCode === '1001105') {
this.messageService.error('租户不正确!');
} else {
this.messageService.error(error.error.errorMessage);
}
} else {
this.messageService.error(error.message);
}
}
console.error(error);
}
}

+ 290
- 0
efm-demo-web/src/app/implementation/http-interceptor.service.ts View File

@ -0,0 +1,290 @@
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpResponse,
HttpErrorResponse,
} from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { tap, map, catchError } from 'rxjs/operators';
import { DW_AUTH_TOKEN } from '@webdpt/framework/auth';
import { DwLanguageService } from '@webdpt/framework/language';
import { DW_APP_AUTH_TOKEN, DwSystemConfigService } from '@webdpt/framework/config';
import { Inject, Injectable } from '@angular/core';
import { DynamicFormDataService, isObject, convertStrDate, isNone } from '@athena/dynamic-core';
import { NzMessageService } from 'ng-zorro-antd/message';
import { AppErrorHandleService } from './http-error-handle.service';
import { CookieUtil } from './utils.ts/cookie-util';
@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
whiteList: string[] = ['iam', 'emc', 'eoc'];
muiUrl: string = window.location.origin;
constructor(
@Inject(DW_AUTH_TOKEN) protected authToken: any,
@Inject(DW_APP_AUTH_TOKEN) protected appAuthToken: any,
private languageService: DwLanguageService,
private messageService: NzMessageService,
private dateFormateService: DynamicFormDataService,
private config: DwSystemConfigService,
private appErrorHandleService: AppErrorHandleService,
// protected systemConfig: any
) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
// 每个请求添加唯一标志uuid
req = req.clone({
headers: req.headers.delete('noCommonTipError'),
});
// 设置语言别
if (this.languageService && this.languageService.currentLanguage) {
req = req.clone({
setHeaders: {
locale: this.languageService.currentLanguage,
},
});
}
// 兼容api平台:用户token
if (this.authToken.token && !req.headers.get('token')) {
req = req.clone({
setHeaders: {
token: this.authToken.token,
},
});
}
// 中间件用户token
if (this.authToken.token && !req.headers.get('digi-middleware-auth-user')) {
req = req.clone({
setHeaders: {
'digi-middleware-auth-user': this.authToken.token,
},
});
}
// atmc和ui_bot场景需要该proxyToken
if (
(req.url.includes('/bot/') || req.url.includes('/atmc/') || req.url.includes('/atdm/')) &&
sessionStorage.getItem('proxyToken') &&
!req.headers.get('proxy_token')
) {
req = req.clone({
setHeaders: {
proxy_token: sessionStorage.getItem('proxyToken'),
},
});
}
if (!req.url.includes('kmo/file')) {
// 设置平台别
req = req.clone({
setHeaders: {
'client-agent': 'webplatform',
},
});
}
const { url } = req;
// uibotUrl、atmcUrl、atdmUrl、smartDataUrl、themeMapUrl、bpmUrl 添加routerKey,租户id
if (this.checkNeedAdd(req, 'routerKey')) {
const tenantId = JSON.parse(sessionStorage.getItem('DwUserInfo'))?.tenantId ?? '';
const token = this.appAuthToken;
req = req.clone({
setHeaders: {
routerKey: tenantId,
'digi-middleware-auth-app': token
},
});
if (CookieUtil.get('routerKey') !== tenantId) {
CookieUtil.set('routerKey', tenantId);
}
}
if (this.checkNeedAdd(req, 'digiMiddlewareAuthApp')) {
const token = this.appAuthToken;
req = req.clone({
setHeaders: {
'digi-middleware-auth-app': token,
},
});
}
// 统一处理date
if (req && req.body) {
if (req.body['data']) {
this.dateFormateService.formatDate(req.body['data']);
} else {
this.dateFormateService.formatDate(req.body);
}
this.convertAllStrDateFromData(req.body, true);
}
return next.handle(req).pipe(
tap((event) => { }),
map((res: HttpResponse<any>) => {
if (isObject(res) && res instanceof HttpResponse && isObject(res.body)) {
// eslint-disable-next-line no-shadow
const { url, body } = res as any;
// 符合规范的接口
if (this.whiteList.every((item) => !url.includes(item)) && body.status) {
if (body.status === 200) {
// 成功
res = res.clone({
body: {
code: 0,
data: body.response,
},
});
} else {
// 接口报错
console.error(res);
const { errorMessage, statusDescription } = body;
const message = errorMessage || statusDescription;
this.messageService.error(message);
throw new HttpErrorResponse({
error: { errorMessage: message, errorCode: body.errorCode, code: body.status },
headers: res.headers,
status: body.status,
statusText: body.status,
url: res.url,
});
}
} else {
// 不符合规范的接口
if (body.code && body.code !== 200) {
console.error(res);
const { message } = body;
if (message) {
this.messageService.error(message);
}
throw new HttpErrorResponse({
error: { errorMessage: message, errorCode: body.code },
headers: res.headers,
status: body.code,
statusText: body.code,
url: res.url,
});
}
}
this.convertAllStrDateFromData(res.body);
}
return res;
}),
catchError((error: any) => {
this.appErrorHandleService.handleError(error);
throw error;
})
);
}
/**
* -/
*/
convertAllStrDateFromData(data: any, isReverse: boolean = false): void {
// tslint:disable-next-line: forin
// eslint-disable-next-line guard-for-in
for (const propName in data) {
const prop = data[propName];
const descriptor = Reflect.getOwnPropertyDescriptor(data, propName);
if (isNone(descriptor) || !descriptor.writable) {
continue;
}
if (typeof prop === 'string') {
data[propName] = convertStrDate(prop, isReverse);
} else if (prop instanceof Array) {
for (let index = 0; index < prop.length; index++) {
const element = prop[index];
if (typeof element === 'string') {
prop[index] = convertStrDate(element, isReverse);
} else {
this.convertAllStrDateFromData(element, isReverse);
}
}
} else if (isObject(prop) && (prop !== null || prop !== undefined)) {
this.convertAllStrDateFromData(prop, isReverse);
}
}
}
/**
*
* @param req
*/
private checkNeedAdd(req: HttpRequest<any>, type): boolean {
const { url } = req;
let serverNameList = [];
// 哪些请求需要添加routerKey的appToken
const routerKeyServerList = [
'uibot',
'atmc',
'atdm',
'aim',
'aam',
'smartdata',
'knowledgemaps',
'flowengine',
'tdd',
'alearning',
'audc',
'im',
'taskengine',
'mdc',
'digiwinabi',
'semc',
'semcdwscreen',
];
// 需要添加digi-middleware-auth-app的请求
const digiMiddlewareServerNameList = [
'iam',
'eoc',
'emc',
'knowledgemaps',
'uibot',
'atmc',
'atdm',
'aim',
'aam',
'im',
'alearning',
'audc',
'semc',
// 新添加
'dmc',
'cac',
'semcdwscreen',
'bossiam',
'agileinteraction',
'smartdata',
'athena-console',
'console',
// mui识别 athena-paas.digiwincloud.com.cn
this.muiUrl,
'assets/', // mui取到的服务器资源
'flowengine', // bpmUrl
'market', // digiwincloudUrl
'tdd', // tddUrl
'tbb',
'digiwinabi', // biUrl
'taskengine', // taskEngineUrl
'athena-it', // itUrl
'mdc',
'lmc',
'eas-designer', // ddsmDesignerUrl
'esp', // espUrl
];
switch (type) {
case 'routerKey':
serverNameList = routerKeyServerList;
break;
case 'digiMiddlewareAuthApp':
serverNameList = digiMiddlewareServerNameList;
break;
}
return serverNameList.some((name) => url.includes(name));
}
}

+ 27
- 0
efm-demo-web/src/app/implementation/implementation-routes.ts View File

@ -0,0 +1,27 @@
import { Routes } from '@angular/router';
import { DwEmailLayoutComponent, DwPageIndexComponent } from '@webdpt/athena-dev-tools';
import { DwAuthGuardService } from '@webdpt/framework/auth';
import { programs } from 'app/config/custom-app-config';
export const IMPLEMENTATION_ROUTES: Routes = [
{
path: '',
component: DwPageIndexComponent,
canActivate: [DwAuthGuardService],
data: {
tabSetHosting: true,
programs
}
},
{
path: 'dev/:secretkey',
pathMatch: 'prefix',
component: DwEmailLayoutComponent,
canActivate: [DwAuthGuardService],
data: {
tabSetHosting: true,
programs
}
}
];

+ 49
- 0
efm-demo-web/src/app/implementation/implementation-routing.module.ts View File

@ -0,0 +1,49 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { MODULE_ROUTES } from '../routes';
import { DwSsoLoginComponent } from '@webdpt/components/sso-login';
import { DwLayoutAthenaComponent } from '@webdpt/athena-dev-tools';
import { programs } from 'app/config/custom-app-config';
import { DwLanguageService } from '@webdpt/framework/language';
const routes: Routes = [
{
path: '',
pathMatch: 'prefix',
component: DwLayoutAthenaComponent,
children: [
...MODULE_ROUTES
],
data: {
tabSetHosting: true,
programs,
dwRouteData: {
programId: 'default',
i18n: ['basic', 'ant-components']
}
},
resolve: { transaction: DwLanguageService }
},
{
path: 'login',
pathMatch: 'full',
loadChildren: (): Promise<any> => import('./auth/login.module').then(m => m.LoginModule)
},
{
path: 'forget',
pathMatch: 'full',
loadChildren: (): Promise<any> => import('./auth/forget/forget.module').then(m => m.ForgetModule)
},
{
path: 'sso-login',
pathMatch: 'full',
component: DwSsoLoginComponent
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ImplementationRoutingModule { }

+ 72
- 0
efm-demo-web/src/app/implementation/implementation.module.ts View File

@ -0,0 +1,72 @@
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Provider } from '@angular/compiler/src/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import {
DW_MENU_JSON,
DW_PROGRAM_JSON,
DW_TAB_ROUTE_CONFIG_JSON,
DW_LANGUAGE_JSON
} from '@webdpt/framework/config';
import { DW_PROGRAM_PAGE, DW_PROGRAM_ACTION } from '@webdpt/framework/config';
import { DwHttpApiInterceptor } from '@webdpt/framework/http';
import { ImplementationRoutingModule } from './implementation-routing.module';
import { SharedModule } from './shared/shared.module';
import { menuJson } from './menu/model/menu.config';
import { programInfoJson } from './program-info/model/program.config';
import { programPageInfoJson } from './program-info/model/program-page.config';
import { programActionInfoJson } from './program-info/model/program-action.config';
import { tabRouteConfigJson } from './tab-route/model/tab-route-config';
import { languageList } from './language/model/language.config';
import { openSelectModalDefault } from './shared/select-modal/default';
import { openOrgTreeModalDefault } from './shared/organize-tree-modal/default';
import { DW_SELECT_MODAL_DEFAULT } from '@webdpt/components/modals/select';
import { DW_ORGTREE_MODAL_DEFAULT } from '@webdpt/framework/organize-tree-core';
import { EfmDemoATModule } from './athena-app.module';
// import { themeConfig } from '../config/theme.config';
@NgModule({
imports: [
CommonModule,
ImplementationRoutingModule,
SharedModule, // 共享模組
EfmDemoATModule
],
declarations: [],
providers: []
})
export class ImplementationModule {
static forRoot(providers: Provider[]): ModuleWithProviders<ImplementationModule> {
return {
ngModule: ImplementationModule,
providers: [
// ---------------------------------------------------------
// | 選配
// ---------------------------------------------------------
// 靜態設定檔
// { provide: DW_THEME, useValue: themeConfig }, // 主題設定檔
{ provide: DW_MENU_JSON, useValue: menuJson }, // Menu靜態設定檔
{ provide: DW_LANGUAGE_JSON, useValue: languageList }, // 可用語言清單
{ provide: DW_PROGRAM_JSON, useValue: programInfoJson }, // 作業靜態設定檔
{ provide: DW_PROGRAM_PAGE, useValue: programPageInfoJson }, // 作業子頁面設定檔
{ provide: DW_PROGRAM_ACTION, useValue: programActionInfoJson }, // 作業功能設定檔
{ provide: DW_TAB_ROUTE_CONFIG_JSON, useValue: tabRouteConfigJson }, // 多頁佈局預設開啟作業
{ provide: DW_SELECT_MODAL_DEFAULT, useValue: openSelectModalDefault }, // 開窗服務的共用設定值
{ provide: DW_ORGTREE_MODAL_DEFAULT, useValue: openOrgTreeModalDefault }, // 組織人員樹開窗元件
// Http API 攔截器
DwHttpApiInterceptor,
{
provide: HTTP_INTERCEPTORS,
// 用來替換api的網址
// request.url = '/users'; => request.url = 'http://api/users';
useExisting: DwHttpApiInterceptor,
multi: true
},
...providers
]
};
}
}

+ 12
- 0
efm-demo-web/src/app/implementation/language/index.ts View File

@ -0,0 +1,12 @@
import * as zh_CN from '../../../assets/i18n/zh_CN/default.json';
import * as zh_TW from '../../../assets/i18n/zh_TW/default.json';
import * as en_US from '../../../assets/i18n/en_US/default.json';
import { PluginLanguageChecklist } from '@athena/dynamic-core';
export const APP_LANGUAGE_CHECKLIST = {
language: {
zh_CN,
zh_TW,
en_US
}
} as PluginLanguageChecklist;

+ 15
- 0
efm-demo-web/src/app/implementation/language/model/language.config.ts View File

@ -0,0 +1,15 @@
// 可用語言清單靜態設定檔
export const languageList = [
{
'value': 'en_US',
'label': 'English'
},
{
'value': 'zh_CN',
'label': '简体'
},
{
'value': 'zh_TW',
'label': '繁體'
}
];

+ 5
- 0
efm-demo-web/src/app/implementation/menu/model/menu.config.ts View File

@ -0,0 +1,5 @@
import { menuData } from './menu.model'; // Menu靜態設定檔
export const menuJson = [
...menuData
];

+ 1
- 0
efm-demo-web/src/app/implementation/menu/model/menu.model.ts View File

@ -0,0 +1 @@
export const menuData = [];

+ 19
- 0
efm-demo-web/src/app/implementation/model/model.ts View File

@ -0,0 +1,19 @@
import {
DynamicFormValueControlModelConfig,
} from '@athena/dynamic-core';
// eslint-disable-next-line no-shadow
export enum StateCode {
waiting = 'waiting',
completed = 'completed',
}
export interface DefaultModelConfig extends DynamicFormValueControlModelConfig<string | number> {
type: string;
stateCode?: StateCode;
actions?: any[];
operations?: any[];
finished?: boolean;
extendedFields: any;
attach: any;
}

+ 6
- 0
efm-demo-web/src/app/implementation/program-info/model/program-action.config.ts View File

@ -0,0 +1,6 @@
import { programActionData } from './program-action.model';
export const programActionInfoJson = [
...programActionData // ProgramAction靜態設定檔
];

+ 1
- 0
efm-demo-web/src/app/implementation/program-info/model/program-action.model.ts View File

@ -0,0 +1 @@
export const programActionData = [];

+ 6
- 0
efm-demo-web/src/app/implementation/program-info/model/program-page.config.ts View File

@ -0,0 +1,6 @@
import { programPageData } from './program-page.model';
export const programPageInfoJson = [
...programPageData // ProgramPage靜態設定檔
];

+ 1
- 0
efm-demo-web/src/app/implementation/program-info/model/program-page.model.ts View File

@ -0,0 +1 @@
export const programPageData = [];

+ 5
- 0
efm-demo-web/src/app/implementation/program-info/model/program.config.ts View File

@ -0,0 +1,5 @@
import { programData } from './program.model';
export const programInfoJson = [
...programData, // Program靜態設定檔
];

+ 8
- 0
efm-demo-web/src/app/implementation/program-info/model/program.model.ts View File

@ -0,0 +1,8 @@
export const programData = [
{
'id': 'home',
'module': 'root', // 沒有模組歸屬不做模組切分,不上傳到IAM做權限控管
'type': '',
'routerLink': '/'
},
];

+ 0
- 0
efm-demo-web/src/app/implementation/programs/.gitkeep View File


+ 15
- 0
efm-demo-web/src/app/implementation/programs/basic-detail/basic-detail.module.ts View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
const programsModules = [
];
@NgModule({
imports: [
CommonModule,
...programsModules
],
declarations: []
})
export class BasicDetailModule { }

+ 15
- 0
efm-demo-web/src/app/implementation/programs/project-detail/project-detail.module.ts View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
const programsModules = [
];
@NgModule({
imports: [
CommonModule,
...programsModules
],
declarations: []
})
export class ProjectDetailModule { }

+ 15
- 0
efm-demo-web/src/app/implementation/programs/task-detail/task-detail.module.ts View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
const programsModules = [
];
@NgModule({
imports: [
CommonModule,
...programsModules
],
declarations: []
})
export class TaskDetailModule { }

+ 15
- 0
efm-demo-web/src/app/implementation/service/business-dynamic-component-map.ts View File

@ -0,0 +1,15 @@
import {
DynamicFormControl,
DynamicFormControlModel,
} from '@athena/dynamic-core';
import { Type } from '@angular/core';
export function businessUIFormComponentMapFn(
model: DynamicFormControlModel
): Type<any> | null {
switch (model.type) {
default:
break;
}
return null;
}

+ 123
- 0
efm-demo-web/src/app/implementation/service/common.service.ts View File

@ -0,0 +1,123 @@
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { DwSystemConfigService } from '@webdpt/framework/config';
import { DW_AUTH_TOKEN } from '@webdpt/framework/auth';
@Injectable({ providedIn: 'root' })
export class CommonService {
atdmUrl: string;
bpmUrl: string;
atmcUrl: any;
frcUrl: any;
eocUrl: any;
themeMapUrl: any;
pageData: any;
// 记录机制的content参数
content: any;
uibotUrl: string;
constructor(
@Inject(DW_AUTH_TOKEN) protected authToken: any,
private http: HttpClient,
private configService: DwSystemConfigService
) {
this.configService.get('atdmUrl').subscribe((url: string): void => {
this.atdmUrl = url;
});
this.configService.get('bpmUrl').subscribe((url): void => {
this.bpmUrl = url;
});
this.configService.get('atmcUrl').subscribe((url): void => {
this.atmcUrl = url;
});
this.configService.get('frcUrl').subscribe((url): void => {
this.frcUrl = url;
});
this.configService.get('eocUrl').subscribe((url): void => {
this.eocUrl = url;
});
this.configService.get('uibotUrl').subscribe((url: string): void => {
this.uibotUrl = url;
});
}
/**
* inv_data
* @param actionId
* @param params
* */
getInvData(actionId: string, params?: any, eoc?: any): Observable<any> {
const executeContext = this.content?.executeContext;
const _params = {
actionId,
parameter: params,
businessUnit: eoc || executeContext?.businessUnit,
executeContext: executeContext, // 传参
};
return this.http.post(`${this.atdmUrl}/api/atdm/v1/data/query/by/actionId`, _params, {
headers: this.getHeader(),
});
}
/**
* -
* @param params
* @returns
*/
atmcSubmit(params: any): Observable<any> {
const url = `${this.atmcUrl}/api/atmc/v1/action/submit`;
return this.http.post(url, params, { headers: this.getHeader() });
}
getHeader(): any {
if (this.authToken?.token) {
return {
'digi-middleware-auth-user': this.authToken.token,
token: this.authToken.token,
};
}
return {};
}
/**
*
* @param executeContext executeContext
* @param serviceName
* @returns
*/
getOpenwindowParams(executeContext: any, serviceName: string): any {
return new Promise((resolve, inject) => {
const params = {
tmAction: {
actionId: 'esp_' + serviceName,
title: '推荐',
actionParams: [],
language: {
title: {
en_US: 'recommend',
zh_TW: '推薦',
},
},
type: 'ESP',
url: 'http://esp.digiwincloud.com.cn/CROSS/RESTful',
actionResponse: null,
serviceName: serviceName,
needProxyToken: null,
attachActions: null,
flatData: null,
},
executeContext: executeContext,
};
const url = `${this.uibotUrl}/api/ai/v1/data/query/action`;
this.http
.post(url, params, {
headers: this.getHeader(),
})
.subscribe((res): void => {
resolve(res);
});
});
}
}

+ 40
- 0
efm-demo-web/src/app/implementation/service/dynamic-model-convert-bussiness.service.ts View File

@ -0,0 +1,40 @@
import {
DynamicFormControlModel,
parseReviver, isString,
DynamicFormModelConvertService,
cloneDeep,
CustomAppConfigService
} from '@athena/dynamic-core';
import { Injectable } from '@angular/core';
import { SYSTEM_CONFIG } from 'app/config/system-config';
@Injectable()
export class DynamicBusinessFormModelConvertService implements DynamicFormModelConvertService {
constructor(
public customAppConfigService: CustomAppConfigService
) { }
fromOneJSON(
json: string | object,
content: any
): DynamicFormControlModel {
let model;
if (isString(json)) {
model = isString(json);
} else if (typeof json === 'object') {
model = cloneDeep(json);
} else {
model = JSON.parse(JSON.stringify(json), parseReviver);
}
const layout = model.layout || null;
let result: DynamicFormControlModel;
model.content = content;
switch (model.type) {
default:
break;
}
/** 渲染定制组件时,将应用信息传给service */
if (!!result) { this.customAppConfigService.customConfig = { appCode: SYSTEM_CONFIG.dwAppId };}
return result;
}
}

+ 24
- 0
efm-demo-web/src/app/implementation/shared/cust-shared.module.ts View File

@ -0,0 +1,24 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { DynamicFormsAntUIModule } from '@athena/dynamic-ui';
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
TranslateModule,
DynamicFormsAntUIModule,
],
exports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
TranslateModule,
DynamicFormsAntUIModule,
]
})
export class CustSharedModule { }

+ 4
- 0
efm-demo-web/src/app/implementation/shared/organize-tree-modal/default.ts View File

@ -0,0 +1,4 @@
import { IDwOrgTreeDefault } from '@webdpt/framework/organize-tree-core';
import { NzTreeNode } from 'ng-zorro-antd/tree';
export const openOrgTreeModalDefault: IDwOrgTreeDefault<NzTreeNode> = {};

+ 20
- 0
efm-demo-web/src/app/implementation/shared/select-modal/default.ts View File

@ -0,0 +1,20 @@
import { IDwSelectModalCustomizeConfig } from '@webdpt/components/modals/select';
export const openSelectModalDefault: IDwSelectModalCustomizeConfig = {
modalTitle: 'default', // modal 標題.
modalWidth: '80%', // modal 寬度.
modalOkText: 'dw-determine', // 確認按鈕文字.
modalCancelText: 'dw-cancel', // 取消按鈕文字.
tableIdField: '', // 使用的 id 欄位.
tableNameField: '', // 使用的 name 欄位.
tableColDefs: [], // 表格欄位定義.
tableMultiSelect: true, // 多選或單選.
tableShowTag: true, // 是否顯示下方的 tag.
tableIsFilter: true, // 是否提供搜尋.
tablePageSize: 3, // 每頁展示多少數據,可雙向繫結.
tableShowPagination: true, // 是否顯示分頁器.
tableShowSizeChanger: true, // 是否可以改變 dwPageSize.
tableNoResult: '', // 無數據時顯示內容, 空值則使用預設值.
tablePageSizeOptions: [5, 10, 15, 20], // 頁數選擇器可選值.
dataSource: null // 資料源 service.
};

+ 24
- 0
efm-demo-web/src/app/implementation/shared/shared.module.ts View File

@ -0,0 +1,24 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { DwExceptionModule } from '@webdpt/components/exception';
/**
*
*
* @export
* @class SharedModule
*/
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule
],
exports: [
FormsModule,
ReactiveFormsModule,
DwExceptionModule
]
})
export class SharedModule { }

+ 1
- 0
efm-demo-web/src/app/implementation/style/index.less View File

@ -0,0 +1 @@
@import './variable.less';

+ 0
- 0
efm-demo-web/src/app/implementation/style/variable.less View File


+ 10
- 0
efm-demo-web/src/app/implementation/tab-route/model/tab-route-config.ts View File

@ -0,0 +1,10 @@
// 多頁佈局預設開啟作業
export const tabRouteConfigJson = [
{
'id': 'home',
'canClose': false,
'defaultOpen': true,
'canMultiOpen': false,
'iconClass': 'dwType:home'
}
];

+ 17
- 0
efm-demo-web/src/app/implementation/tools-routing-wrapper.module.ts View File

@ -0,0 +1,17 @@
import { NgModule } from '@angular/core';
import { DwToolsRoutingModule } from '@webdpt/components/tools-routing';
import { SharedModule } from './shared/shared.module';
import { DwCmsRoutingModule } from '@webdpt/programs';
@NgModule({
imports: [
SharedModule, // 專案的共享模組
DwToolsRoutingModule, // 平台組件的預設路由模組
// ---------------------------------------------------------
// | 選配
// ---------------------------------------------------------
// DwCmsRoutingModule // 平台作業路由
]
})
export class ToolsRoutingWrapper { }

+ 38
- 0
efm-demo-web/src/app/implementation/utils.ts/cookie-util.ts View File

@ -0,0 +1,38 @@
export class CookieUtil {
static get(name) {
// eslint-disable-next-line prefer-const
let cookieName = `${encodeURIComponent(name)}=`,
// eslint-disable-next-line prefer-const
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
if (cookieStart > -1) {
let cookieEnd = document.cookie.indexOf(';', cookieStart);
if (cookieEnd === -1) {
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(
document.cookie.substring(cookieStart + cookieName.length, cookieEnd)
);
}
return cookieValue;
}
static set(name, value, expires?, path?, domain?, secure?) {
let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
if (expires instanceof Date) {
cookieText += `; expires=${expires.toUTCString()}`;
}
if (path) {
cookieText += `; path=${path}`;
}
if (domain) {
cookieText += `; domain=${domain}`;
}
if (secure) {
cookieText += '; secure';
}
document.cookie = cookieText;
}
static unset(name, path, domain, secure) {
CookieUtil.set(name, '', new Date(0), path, domain, secure);
}
}

+ 10
- 0
efm-demo-web/src/app/industry/industry-routing.module.ts View File

@ -0,0 +1,10 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class IndustryRoutingModule { }

+ 13
- 0
efm-demo-web/src/app/industry/industry.module.ts View File

@ -0,0 +1,13 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IndustryRoutingModule } from './industry-routing.module';
@NgModule({
imports: [
CommonModule,
IndustryRoutingModule
],
declarations: []
})
export class IndustryModule { }

+ 12
- 0
efm-demo-web/src/app/page-not-found.component.ts View File

@ -0,0 +1,12 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-prog001',
template: `<h1>404</h1>`
})
export class PageNotFoundComponent {
constructor() { }
}

+ 12
- 0
efm-demo-web/src/app/routes.ts View File

@ -0,0 +1,12 @@
import { Routes } from '@angular/router';
import { CUSTOMIZATION_ROUTES } from './customization/customization-routes';
export const MODULE_ROUTES: Routes = [
{
path: 'dpt', // 路徑為/dpt/*
pathMatch: 'prefix',
loadChildren: (): Promise<any> => import('./implementation/tools-routing-wrapper.module').then(m => m.ToolsRoutingWrapper)
},
...CUSTOMIZATION_ROUTES
];

+ 6
- 0
efm-demo-web/src/app/style.less View File

@ -0,0 +1,6 @@
/* You can add global styles to this file, and also import other style files */
@webdpt-path: "@webdpt";
@import "~@{webdpt-path}/components/style/index.less";
@import "~@{webdpt-path}/programs/style/index.less";
@import './implementation/style/index.less';
@import './customization/style/index.less';

+ 34
- 0
efm-demo-web/src/assets/api.dev.json View File

@ -0,0 +1,34 @@
{
"apiUrl": "",
"iamUrl": "https://iam-test.digiwincloud.com.cn",
"emcUrl": "https://emc-test.digiwincloud.com.cn",
"mscUrl": "https://msc-test.digiwincloud.com.cn",
"eocUrl": "https://eoc-test.digiwincloud.com.cn",
"dmcUrl": "https://dmc-test.digiwincloud.com.cn",
"themeMapUrl": "https://thememap-test.apps.digiwincloud.com.cn/restful/service",
"smartDataUrl": "https://smartdata-test.apps.digiwincloud.com.cn/restful/service",
"uibotUrl": "https://uibot-test.apps.digiwincloud.com.cn",
"atmcUrl": "https://atmc-test.apps.digiwincloud.com.cn",
"atdmUrl": "https://atdm-test.apps.digiwincloud.com.cn",
"multiTenant": "true",
"athenaConsole": "https://athena-console-test.digiwincloud.com.cn",
"consoleUrl": "https://console-test.digiwincloud.com.cn",
"muiUrl": "https://athena-test.digiwincloud.com.cn",
"bpmUrl": "https://flowengine-test.apps.digiwincloud.com.cn/restful/standard/bpm_cloud",
"digiwincloudUrl": "https://market-test.digiwincloud.com.cn",
"aimUrl": "https://aim-test.apps.digiwincloud.com.cn",
"aamUrl": "https://aam-test.apps.digiwincloud.com.cn",
"audcUrl": "https://audc-test.apps.digiwincloud.com.cn",
"omUrl": "@OM_URL@",
"marketUrl": "@MARKET_URL@",
"omcUrl": "@OMC_SERVICE_URL@",
"gmcUrl": "@GMC_SERVICE_URL@",
"cacUrl": "@CAC_SERVICE_URL@",
"frUrl": "@FINEREPORT_URL@",
"analytics": {
"gtm": "@ANALYTICS_GTM@",
"baidu": "@ANALYTICS_BAIDU@"
},
"dwAppSecret": "@DW_APP_SECRET@"
}

+ 19
- 0
efm-demo-web/src/assets/api.json View File

@ -0,0 +1,19 @@
{
"apiUrl": "@WEB_SERVICE_URL@",
"iamUrl": "@IAM_SERVICE_URL@",
"emcUrl": "@EMC_SERVICE_URL@",
"omUrl": "@OM_URL@",
"consoleUrl": "@CONSOLE_URL@",
"marketUrl": "@MARKET_URL@",
"omcUrl": "@OMC_SERVICE_URL@",
"gmcUrl": "@GMC_SERVICE_URL@",
"cacUrl": "@CAC_SERVICE_URL@",
"frUrl": "@FINEREPORT_URL@",
"dmcUrl": "@DMC_SERVICE_URL@",
"analytics": {
"gtm": "@ANALYTICS_GTM@",
"baidu": "@ANALYTICS_BAIDU@"
},
"multiTenant": "@MULTI_TENANT@",
"dwAppSecret": "@DW_APP_SECRET@"
}

+ 211
- 0
efm-demo-web/src/assets/i18n/en_US/ant-components.json View File

@ -0,0 +1,211 @@
{
"dj-c-由Athena发起当前项目": "Current project initiated by Athena",
"dj-c-预计开工日": "Expected commencement date",
"dj-c-来源由n张工单组成": "source:There are {{ taskName }}",
"dj-c-来源由n张ids工单组成": "source:There are {{ n }} {{ taskName }} such as {{ ids }}",
"dj-c-倒计时": "Countdown",
"dj-c-需完成": "To be completed",
"dj-c-收起": "fold",
"dj-c-更多": "more",
"dj-c-操作": "Operations",
"dj-c-更换": "Change",
"dj-c-提示": "Tips",
"dj-c-我知道了": "I know that",
"dj-c-存在异常是否忽略提交": "Existence {{n}} Exception, <br /> Are you sure to submit?",
"dj-c-是否确定提交": "Are you sure to submit?",
"dj-c-请确认是否填写完整": "Please confirm whether it is completed",
"dj-c-取消": "Cancel",
"dj-c-确认": "Confirm",
"dj-c-确定": "Determine",
"dj-c-明细": "Detail",
"dj-c-下载": "Download",
"dj-c-预览": "Preview",
"dj-c-已读n次": "Read {{ n }} times",
"dj-c-取消拆行": "Remove split",
"dj-c-拆行": "Split data",
"dj-c-旧公式": "Old Formula",
"dj-c-新公式": "New Formula",
"dj-c-查看模拟推估": "View simulation estimation",
"dj-c-权重总和应等于100": "The sum of weights should be equal to 100",
"dj-c-暂无数据": "No Data",
"dj-c-必填": "Required",
"dj-c-重新编辑": "Re Edit",
"dj-c-编辑": "Edit",
"dj-c-请选择需要提交的数据": "Please select the data to be submitted",
"dj-c-收货地址": "Receiving Address",
"dj-c-采购员编号": "Buyer Number",
"dj-c-转派至": "Transfer To",
"dj-c-员工编号": "Employee Number",
"dj-c-员工姓名": "Employee Name",
"dj-c-请输入员工编号": "Enter employee number",
"dj-c-将此任务转派至您": "assigned this task to you",
"dj-c-退回重签至": "Return To",
"dj-c-请输入签核意见": "Please enter your approval comments",
"dj-c-签核意见": "Approval comments",
"dj-c-查看签核进度": "Check sign off progress",
"dj-c-是否确定转派": "Are you sure you want to transfer",
"dj-c-是否确定退回": "Are you sure you want to return it",
"dj-c-签核进程": "Sign off process",
"dj-c-是否确定同意": "Are you sure you agree",
"dj-c-非必填": "Not required",
"dj-c-未开始": "Not started",
"dj-c-进行中": "In progress",
"dj-c-已完成": "Completed",
"dj-c-退回": "Return",
"dj-c-加签": "Countersignature",
"dj-c-已同意": "Agreed",
"dj-c-已撤销": "rescinded",
"dj-c-已中止": "Aborted",
"dj-c-已暂停": "Suspended",
"dj-c-不需签核": "No sign off",
"dj-c-需签核": "Sign off required",
"dj-c-取回重办": "Back to recreate",
"dj-c-已通知": "Notified",
"dj-c-已会办": "Will have to do",
"dj-c-正在进行": "in processing",
"dj-c-紧急": "in urgent",
"dj-c-逾期": "be overdue",
"dj-c-天": "day",
"dj-c-时": "hours",
"dj-c-分钟": "minutes",
"dj-c-最早": "The earliest",
"dj-c-最大逾期": "Maximum overdue",
"dj-c-共n项": "{{ n }} items in total",
"dj-c-共str": "{{ str }} in total",
"dj-c-个": " ",
"dj-c-页面加载失败": "Page Loading Failed",
"dj-c-重新加载": "Reload",
"dj-c-请不要输入表情": "Please do not enter the expression",
"dj-c-不能选择当前用户": "The current user cannot be selected",
"dj-c-是否确定退回重办": "Are you sure to return and re-do",
"dj-c-所有计量": "All measurements",
"dj-c-库存年月": "Inventory date",
"dj-c-周转天数": "Turnover days",
"dj-c-平均存货净额": "Average net inventory",
"dj-c-销售净额": "Net sales",
"dj-c-平均耗量(年月)": "Average consumption (month, month)",
"dj-c-标准差(年月)": "Standard deviation (month, year)",
"dj-c-平均销售金额(年月)": "Average sales amount (month, month)",
"dj-c-标准化生产": "Standardized production",
"dj-c-修改": "edit",
"dj-c-已": "result ",
"dj-c-总量": "Total",
"dj-c-目标:差异率小于n": "Target:The difference rate is less than {{n}}",
"dj-c-共n项定位调整": "A total of{{n}}positioning adjustment(s)",
"dj-c-实际": "Actual",
"dj-c-合理": "Expected",
"dj-c-本期共": "There are positioning adjustments in ",
"dj-c-项": " test(s)",
"dj-c-检测出现定位调整,建议修改参数": " in this issue, and it is recommended to modify the parameters",
"dj-c-成品": "Products",
"dj-c-半成品": "Semi-finished products",
"dj-c-原材料": "Material",
"dj-c-耗用金额": "Amount consumed",
"dj-c-高": "High",
"dj-c-中": "Medium",
"dj-c-低": "Low",
"dj-c-频进货": " frequency purchase",
"dj-c-原材料机制调整建议": "Material mechanism adjustment suggestions",
"dj-c-项采纳": "adopted",
"dj-c-项拒绝": "rejection(s)",
"dj-c-共计": "Total",
"dj-c-n项": "{{n}} item(s)",
"dj-c-返回": "Back",
"dj-c-统计": "Total",
"dj-c-标准差异率n": "Standard deviation rate {{n}}",
"dj-c-采购间隔参数": "Purchase interval parameters",
"dj-c-实际采购LT": "Actual purchase LT",
"dj-c-实际采购": "Actual purchase",
"dj-c-机制调整建议": "Mechanism adjustment suggestions",
"dj-c-建议新定位": "Suggest new positioning",
"dj-c-高频进货": "High frequency purchase",
"dj-c-中频进货": "Medium frequency purchase",
"dj-c-低频进货": "Low frequency purchase",
"dj-c-高频进货n项": "High frequency purchase {{n}} item(s)",
"dj-c-中频进货n项": "Medium frequency purchase {{n}} item(s)",
"dj-c-低频进货n项": "Low frequency purchase {{n}} item(s)",
"dj-c-没有可获取到的可退回列表": "No returnable list available",
"dj-c-数据加载异常": "Page Loading Failed",
"dj-c-正在校验": "validating",
"dj-c-输入错误": "Incorrect input",
"dj-c-输入不完整": "Incomplete input",
"dj-c-输入不完整或者错误": "Incomplete or incorrect input",
"dj-c-校验失败": "Verification failed",
"dj-c-支持批量提交但未选择对象": "Batch submission is supported but no object is selected",
"dj-c-差异": "difference",
"dj-c-方案进度": "Programme progress",
"dj-c-加量": "dosage",
"dj-c-减量": "decrement",
"dj-c-延迟": "delay",
"dj-c-提早": "early",
"dj-c-拆行输入错误": "Split line input error",
"dj-c-请上传": "Please select and upload file",
"dj-c-上传于": "{{user}} upload file at {{date}}",
"dj-c-已删除附件": "Attachment deleted",
"dj-c-删除附件失败": "Delete Failed",
"dj-c-上传失败": "Upload Failed",
"dj-c-转派": "Transfer",
"dj-c-没有查询到可退回的关卡名称": "No returnable level name found",
"dj-c-请刷新重试": "Please refresh and try again",
"dj-c-当前任务已完成": "Current task completed",
"dj-c-加签意见": "Endorsement opinion",
"dj-c-请选择加签方式": "Please choose the way of sign",
"dj-c-向前加签": "Sign forward",
"dj-c-向后加签": "Sign backward",
"dj-c-签核人": "Signer",
"dj-c-请选择": "Please choose",
"dj-c-请选择签核人": "Please choose signer",
"dj-c-是否确定撤回": "Are you sure you want to withdraw",
"dj-c-撤回后同一方案且同一批提交的方案将同步撤回": "After withdrawal, the same scheme and the same batch of submitted schemes will be withdrawn simultaneously",
"dj-c-撤回意见": "Withdrawal of opinion",
"dj-c-发票上传": "Invoice Upload",
"dj-c-发票代号": "Invoice Code",
"dj-c-发票号码": "Invoice Number",
"dj-c-开票日期": "Invoice Date",
"dj-c-校验码(后6位)": "Check Code (last 6 digits)",
"dj-c-请将6位校验码输入完整": "Please input the 6-digit check code completely",
"dj-c-金额(不含税)": "Amount (excluding tax)",
"dj-c-只能输入数字": "only can input numbers",
"dj-c-只能输入整数或者带2位小数": "only input integer or with 2 decimal places",
"dj-c-限制类型": "Support only {{ n }}.",
"dj-c-不限制大小": "Unlimited size.",
"dj-c-限制大小": "Limited {{ n }}.",
"dj-c-请输入关键字": "Please enter keywords",
"dj-c-合计": "Total",
"dj-c-是否确定加签": "Are you sure to sign",
"dj-c-已撤回": "Withdrawn",
"dj-c-请输入撤回意见": "Please enter withdrawal comments",
"dj-c-重签意见": "Re sign comments",
"dj-c-转派意见": "Opinions on assignment",
"dj-c-请填写意见": "Fill in comments",
"dj-c-重办意见": "Reorganized comments",
"dj-c-请填写重办意见": "Please fill in reorganized comments",
"dj-c-请输入发票代号": "Please input invoice code",
"dj-c-请输入发票号码": "Please enter invoice number",
"dj-c-请输入开票日期": "Please enter billing date",
"dj-c-请输入金额": "Please input the amount(Excluding tax)",
"dj-c-上传发票": "Upload Invoice",
"dj-c-支持上传多张发票": "Support to upload multiple invoices",
"dj-c-请留言": "Please input message",
"dj-c-发送": "Send",
"dj-c-通知提醒": "Notice to remind",
"dj-c-msg-content": "Please finish the task as soon as possible ~",
"dj-c-代": "E",
"dj-c-前": " before",
"dj-c-生效": "Valid",
"dj-c-已失效": "Invalid",
"dj-c-已保存": "Saved",
"dj-c-未保存": "Not saved",
"dj-c-已选中n项": "{{ n }} selected",
"dj-c-m来源共n项发生变更": "{{m}} total {{n}} item changed",
"dj-c-查看甘特图": "View Gantt chart",
"dj-c-甘特图": "Gantt chart",
"dj-c-异常": "abnormal",
"dj-c-逾期n天": "overdue for {{n}} days",
"dj-c-全部信息请输入关键字搜索": "Please enter keyword search for all information",
"dj-c-*至少选中一项数据": "*Select at least one item of data",
"dj-c-已选n项": "{{ n }} items selected",
"dj-c-荐": "Recommendation",
"dj-c-请输入专案编号": "Please enter project number",
"dj-c-请输入专案名称": "Please enter project name"
}

+ 157
- 0
efm-demo-web/src/assets/i18n/en_US/basic.json View File

@ -0,0 +1,157 @@
{
"dj-请输入": "Please Input ",
"dj-请选择": "Please Select ",
"dj-搜索点什么吧": "Search for date, project target, task name, charge person or executor",
"dj-历史记录": "Search History",
"dj-登出": "Sign Out",
"dj-管理模组": "Management Module",
"dj-交付设计器": "Delivery Designer",
"menu": {
"project-center": "Projects Center"
},
"dj-全部关闭": "Close All",
"dj-批量操作": "Batch",
"dj-来源由n张工单组成": "source:There are {{ n }} {{sourceName}} such as {{ ids }}",
"dj-来源由n张x单组成": "source:There are {{taskName}}",
"dj-来源由n张如ids的x单组成": "source:There are {{ n }} {{taskName}} such as {{ ids }}",
"dj-倒计时": "Countdown",
"dj-预计开工日": "Expected commencement date",
"dj-来源": "Source",
"dj-由Athena发起当前项目": "Current project initiated by Athena",
"dj-人工": "Manual",
"dj-自动": "Auto",
"dj-未完成": "Unfinished",
"dj-需完成": "Finished",
"dj-共计": "Total",
"dj-共n笔": "{{n}} in total",
"dj-n笔": "{{n}}",
"dj-待入库n项": "{{n}} items to be warehoused",
"dj-我知道了": "I got it!",
"dj-立即查看": "detail",
"dj-切换企业": "Switch Companies",
"dj-个性化设定": "Settings",
"dj-常用设置": "Common Settings",
"dj-开启勿扰": "Do not disturb has been turned on",
"dj-关闭勿扰": "Do not disturb has been turned off",
"dj-开启代理人": "Agent has been turned on",
"dj-关闭代理人": "Agent has been turned off",
"dj-基本设置": "Personalized Settings",
"dj-工作桌面": "Desktop",
"dj-搜索结果": "Search Result",
"dj-进度查询": "Progress Inquiry",
"dj-发起项目": "Add Project",
"dj-项目任务": "Tasks",
"dj-当责者": "Charge Person",
"dj-项目名称": "Project Name",
"dj-状态": "Status",
"dj-task-report-项目状况查询": "Project Status",
"dj-task-report-历史项目查询": "Project History",
"dj-task-report-区间": "Interval",
"dj-task-report-天": "Day",
"dj-task-report-周": "Week",
"dj-task-report-月": "Month",
"dj-task-report-季度": "Season",
"dj-task-report-项目名称": "Project Name",
"dj-task-report-当责者": "Charge Person",
"dj-task-report-筛查": "Search",
"dj-task-report-重置": "Reset",
"dj-task-report-目标": "Target",
"dj-task-report-子项目": "Children Project",
"dj-task-report-子项目数单位": "",
"dj-task-report-请选择项目名称": "Please select project name",
"dj-task-report-请选择当责者": "Please select charge person",
"dj-task-report-没有结果": "No related project found, please check again",
"dj-task-report-项": "item",
"dj-set-用户ID": "ID",
"dj-set-用户名称": "Name",
"dj-set-手机号码": "Phone",
"dj-set-所属组织": "Organization",
"dj-set-运营单位": "Business Unit",
"dj-set-语言设定": "Language",
"dj-set-时区选择": "Timezone",
"dj-set-变更密码": "Password",
"dj-set-点此修改": "Click Here",
"dj-set-代理人设置": "Agent Setup",
"dj-set-代理人": "Agent",
"dj-set-代理区间": "Agency Interval",
"dj-set-勿扰模式": "Do Not Disturb",
"dj-set-开始时间": "Start Time",
"dj-set-结束时间": "End Time",
"dj-set-设置代理区间成功": "Set proxy interval successfully",
"dj-set-设置代理区间失败": "Failed to set proxy interval",
"dj-是否确认提交": "Are you sure to submit ?",
"dj-取消": "Cancel",
"dj-确认": "Confirm",
"dj-提交": "Submit",
"dj-下一步": "Next Step",
"dj-提示": "Tips",
"dj-拒绝时审核意见必填哦": "approval comments required when rejecting~",
"dj-是否签核": "whether to sign off for {{title}} ?",
"dj-操作成功": "execute successfully",
"dj-上传成功": "upload successfully",
"dj-加载中": "Loading",
"dj-通知执行人": "Notification to executor",
"dj-去执行待办": "Go to the to-do list",
"dj-分享链接": "Share links",
"dj-查看子项目详情": "View sub project details",
"dj-复制成功": "Copied Successfully",
"dj-通知成功": "Notification successful",
"dj-消息通知": "Message Notification",
"dj-重要消息": "Important Message",
"dj-工作动态": "Work News",
"dj-紧急": "Urgent",
"dj-重要": "Focus",
"dj-变更": "Change",
"dj-共n个任务异常": "Total of {{n}} task exceptions",
"dj-共n个任务进行中": "{{n}} tasks are in progress",
"dj-已逾期": "Overdue",
"dj-小时": "hours",
"dj-天": "days",
"dj-标记所有为已读": "Mark all as read",
"dj-删除所有已读消息": "Delete all read messages",
"dj-通知设置": "Notification settings",
"dj-项目通知": "Project Notification",
"dj-暂无消息": "No Messages",
"dj-分钟前": "minutes ago",
"dj-今天": "today",
"dj-昨天": "yesterday",
"dj-周一": "Monday",
"dj-周二": "Tuesday",
"dj-周三": "Wednesday",
"dj-周四": "Thursday",
"dj-周五": "Friday",
"dj-周六": "Saturday",
"dj-周日": "Sunday",
"dj-任务通知": "task notice",
"dj-刚刚": "moment ago",
"dj-系统消息": "System Messaage",
"dj-异常排除": "exception exclusion",
"dj-任务已关闭": "The task has been closed",
"dj-暂无更多项目类型": "No more project types",
"dj-工单有变更,查看详情": "There are changes to the work order. Please check the details",
"dj-等": " etc.",
"dj-共": " Totally",
"dj-个": " ",
"dj-张": " ",
"dj-运营单元-1": "Branch Companies",
"dj-运营单元-2": "Factories",
"dj-运营单元-3": "Workshops",
"dj-工单明细": "Work Order Details",
"dj-明细": "Details",
"dj-数据上传中": "Data uploading",
"dj-数据校验中": "Data verification in progress",
"dj-msg-ATHENA_REMIND": "Athena Remind",
"dj-msg-EXCEPTION_OR_OVERDUE": "Exception/Overdue",
"dj-msg-INTERNAL_REMIND": "Notice",
"dj-msg-PROXY_REMIND": "Agency Remind",
"dj-msg-option-ALL": "All",
"dj-msg-option-EMERGENCY": "Emergency",
"dj-msg-option-EXCEPTION_OR_OVERDUE": "Exception/Overdue",
"dj-msg-option-NOTICE": "Notice",
"dj-msg-option-PROXY": "Agency",
"dj-msg-option-OTHER": "Other",
"dj-提醒关注": "reminds you to pay attention",
"dj-基础资料录入": "Basic data entry",
"dj-请输入需要录入的基础资料模板名称": "Please enter the name of the master data template to be entered",
"dj-已通知x": "also notice {{x}}"
}

+ 3
- 0
efm-demo-web/src/assets/i18n/en_US/default.json View File

@ -0,0 +1,3 @@
{
}

+ 36
- 0
efm-demo-web/src/assets/i18n/en_US/task.json View File

@ -0,0 +1,36 @@
{
"dj-task-日": "Day",
"dj-task-月": "Month",
"dj-task-今天": "Today",
"dj-task-本月": "Current month",
"dj-task-week1": "Monday",
"dj-task-week2": "Tuesday",
"dj-task-week3": "Wednesday",
"dj-task-week4": "Thursday",
"dj-task-week5": "Friday",
"dj-task-week6": "Saturday",
"dj-task-week0": "Sunday",
"dj-task-逾期任务": "Overdue Tasks",
"dj-task-暂无更多任务逾期": "No more tasks overdue",
"dj-task-任务未逾期": "The work is well done and the tasks is not overdue",
"dj-task-暂无异常排除": "There is no exception exclusion task to track",
"dj-task-暂无项目逾期": "There is no project overdue to be followed up",
"dj-task-今日需完成n项任务": "Tasks need to be completed today {{ n }} ",
"dj-task-需完成n项任务": "You need to complete {{ n }} tasks",
"dj-task-共n项任务": "{{ m }} tasks in total",
"dj-task-共计n项任务": "Total {{ n }} tasks",
"dj-task-查看完整版": "Enter the task of the day and view the full version",
"dj-task-项目逾期需跟催": "Overdue projects need to be followed up",
"dj-task-异常排除需追踪": "Exception elimination needs tracking",
"dj-task-今日优先处理任务": "Priority tasks today",
"dj-task-今日一般任务": "General tasks today",
"dj-task-可提前处理任务": "Tasks can be processed ahead of time",
"dj-task-暂无任务": "No task",
"dj-task-暂无任务可执行": "No task to execute",
"dj-task-all": "All",
"dj-task-等n个": " etc., totally {{ n }} ",
"dj-task-unit-1": "Branch Companies",
"dj-task-unit-2": "Factories",
"dj-task-unit-3": "Workshops",
"dj-task-确定": "OK"
}

+ 215
- 0
efm-demo-web/src/assets/i18n/zh_CN/ant-components.json View File

@ -0,0 +1,215 @@
{
"dj-c-由Athena发起当前项目": "由Athena发起当前项目",
"dj-c-预计开工日": "预计开工日",
"dj-c-来源由n张工单组成": "来源:由{{ taskName }}组成",
"dj-c-来源由n张ids工单组成": "来源:由 {{ ids }} 等{{ n }}张{{ taskName }}组成",
"dj-c-倒计时": "倒计时",
"dj-c-需完成": "需完成",
"dj-c-收起": "收起",
"dj-c-更多": "更多",
"dj-c-操作": "操作",
"dj-c-更换": "更换",
"dj-c-提示": "提示",
"dj-c-我知道了": "我知道了",
"dj-c-存在异常是否忽略提交": "存在 {{n}} 项异常,<br />是否确定提交?",
"dj-c-是否确定提交": "是否确定提交",
"dj-c-请确认是否填写完整": "请确认是否填写完整",
"dj-c-取消": "取消",
"dj-c-确认": "确认",
"dj-c-确定": "确定",
"dj-c-明细": "明细",
"dj-c-下载": "下载",
"dj-c-预览": "预览",
"dj-c-已读n次": "已读 {{ n }} 次",
"dj-c-取消拆行": "取消拆行",
"dj-c-拆行": "拆行",
"dj-c-旧公式": "旧公式",
"dj-c-新公式": "新公式",
"dj-c-查看模拟推估": "查看模拟推估",
"dj-c-权重总和应等于100": "权重总和应等于100",
"dj-c-暂无数据": "暂无数据",
"dj-c-必填": "必填",
"dj-c-重新编辑": "重新编辑",
"dj-c-编辑": "编辑",
"dj-c-请选择需要提交的数据": "请选择需要提交的数据",
"dj-c-收货地址": "收货地址",
"dj-c-采购员编号": "采购员编号",
"dj-c-转派至": "转派至",
"dj-c-员工编号": "员工编号",
"dj-c-员工姓名": "员工姓名",
"dj-c-请输入员工编号": "请输入员工编号",
"dj-c-将此任务转派至您": "将此任务转派至您",
"dj-c-退回重签至": "退回重签至",
"dj-c-请输入签核意见": "请输入签核意见",
"dj-c-签核意见": "签核意见",
"dj-c-是否确定转派": "是否确定转派",
"dj-c-是否确定退回": "是否确定退回",
"dj-c-签核进程": "签核进程",
"dj-c-查看签核进度": "查看签核进度",
"dj-c-是否确定同意": "是否确定同意",
"dj-c-非必填": "非必填",
"dj-c-未开始": "未开始",
"dj-c-进行中": "进行中",
"dj-c-已完成": "已完成",
"dj-c-退回": "退回",
"dj-c-加签": "加签",
"dj-c-已同意": "已同意",
"dj-c-已撤销": "已撤销",
"dj-c-已中止": "已中止",
"dj-c-已暂停": "已暂停",
"dj-c-不需签核": "不需签核",
"dj-c-需签核": "需签核",
"dj-c-取回重办": "取回重办",
"dj-c-已通知": "已通知",
"dj-c-已会办": "已会办",
"dj-c-正在进行": "正在进行",
"dj-c-逾期": "逾期",
"dj-c-紧急": "紧急",
"dj-c-天": "天",
"dj-c-时": "时",
"dj-c-分钟": "分钟",
"dj-c-最早": "最早",
"dj-c-最大逾期": "最大逾期",
"dj-c-共n项": "共{{ n }}项",
"dj-c-共str": "共{{ str }}",
"dj-c-个": "个",
"dj-c-页面加载失败": "页面加载失败",
"dj-c-重新加载": "重新加载",
"dj-c-请不要输入表情": "请不要输入表情",
"dj-c-不能选择当前用户": "不能选择当前用户",
"dj-c-是否确定退回重办": "是否确定退回重办",
"dj-c-所有计量": "所有计量",
"dj-c-库存年月": "库存年月",
"dj-c-周转天数": "周转天数",
"dj-c-平均存货净额": "平均存货净额",
"dj-c-销售净额": "销售净额",
"dj-c-平均耗量(年月)": "平均耗量(年月)",
"dj-c-标准差(年月)": "标准差(年月)",
"dj-c-平均销售金额(年月)": "平均销售金额(年月)",
"dj-c-标准化生产": "标准化生产",
"dj-c-不可放弃": "不可放弃",
"dj-c-接单再做": "接单再做",
"dj-c-允许低缺料": "允许低缺料",
"dj-c-修改": "修改",
"dj-c-已": "已",
"dj-c-总量": "总量",
"dj-c-目标:差异率小于n": "目标:差异率小于{{n}}",
"dj-c-共n项定位调整": "共{{n}}项定位调整",
"dj-c-实际": "实际",
"dj-c-合理": "合理",
"dj-c-建议": "建议",
"dj-c-本期共": "本期共",
"dj-c-项": "项",
"dj-c-检测出现定位调整,建议修改参数": "检测出现定位调整,建议修改参数",
"dj-c-成品": "成品",
"dj-c-半成品": "半成品",
"dj-c-原材料": "原材料",
"dj-c-耗用金额": "耗用金额",
"dj-c-高": "高",
"dj-c-中": "中",
"dj-c-低": "低",
"dj-c-频进货": "频进货",
"dj-c-原材料机制调整建议": "原材料机制调整建议",
"dj-c-项采纳": "项采纳",
"dj-c-项拒绝": "项拒绝",
"dj-c-共计": "共计",
"dj-c-n项": "{{n}}项",
"dj-c-返回": "返回",
"dj-c-统计": "统计",
"dj-c-标准差异率n": "标准差异率{{n}}",
"dj-c-采购间隔参数": "采购间隔参数",
"dj-c-实际采购LT": "实际采购LT",
"dj-c-实际采购": "实际采购",
"dj-c-机制调整建议": "机制调整建议",
"dj-c-建议新定位": "建议新定位",
"dj-c-高频进货": "高频进货",
"dj-c-中频进货": "中频进货",
"dj-c-低频进货": "低频进货",
"dj-c-高频进货n项": "高频进货{{n}}项",
"dj-c-中频进货n项": "中频进货{{n}}项",
"dj-c-低频进货n项": "低频进货{{n}}项",
"dj-c-没有可获取到的可退回列表": "没有可获取到的可退回列表",
"dj-c-数据加载异常": "数据加载异常",
"dj-c-正在校验": "正在校验",
"dj-c-输入错误": "输入错误",
"dj-c-输入不完整": "输入不完整",
"dj-c-输入不完整或者错误": "输入不完整或者输入错误",
"dj-c-校验失败": "校验失败",
"dj-c-支持批量提交但未选择对象": "支持批量提交但未选择对象",
"dj-c-差异": "差异",
"dj-c-方案进度": "方案进度",
"dj-c-加量": "加量",
"dj-c-减量": "减量",
"dj-c-延迟": "延迟",
"dj-c-提早": "提早",
"dj-c-拆行输入错误": "拆行输入错误",
"dj-c-请上传": "请上传",
"dj-c-上传于": "{{user}}上传于{{date}}",
"dj-c-已删除附件": "附件已删除",
"dj-c-删除附件失败": "删除附件失败",
"dj-c-上传失败": "上传失败",
"dj-c-转派": "转派",
"dj-c-没有查询到可退回的关卡名称": "没有查询到可退回的关卡名称",
"dj-c-请刷新重试": "请刷新重试",
"dj-c-当前任务已完成": "当前任务已完成",
"dj-c-加签意见": "加签意见",
"dj-c-请选择加签方式": "请选择加签方式",
"dj-c-向前加签": "向前加签",
"dj-c-向后加签": "向后加签",
"dj-c-签核人": "签核人",
"dj-c-请选择": "请选择",
"dj-c-请选择签核人": "请选择签核人",
"dj-c-是否确定撤回": "是否确定撤回",
"dj-c-撤回后同一方案且同一批提交的方案将同步撤回": "撤回后同一方案且同一批提交的方案将同步撤回",
"dj-c-撤回意见": "撤回意见",
"dj-c-发票上传": "发票上传",
"dj-c-发票代号": "发票代号",
"dj-c-发票号码": "发票号码",
"dj-c-开票日期": "开票日期",
"dj-c-校验码(后6位)": "校验码(后6位)",
"dj-c-请将6位校验码输入完整": "请将6位校验码输入完整",
"dj-c-金额(不含税)": "金额(不含税)",
"dj-c-只能输入数字": "只能输入数字",
"dj-c-只能输入整数或者带2位小数": "只能输入整数或者带2位小数",
"dj-c-限制类型": "只支持{{ n }}",
"dj-c-不限制大小": "大小不限制",
"dj-c-限制大小": "大小限制{{ n }}",
"dj-c-请输入关键字": "请输入关键字",
"dj-c-合计": "合计",
"dj-c-是否确定加签": "是否确定加签",
"dj-c-已撤回": "已撤回",
"dj-c-请输入撤回意见": "请输入撤回意见",
"dj-c-重签意见": "重签意见",
"dj-c-转派意见": "转派意见",
"dj-c-请填写意见": "请填写意见",
"dj-c-重办意见": "重办意见",
"dj-c-请填写重办意见": "请填写重办意见",
"dj-c-请输入发票代号": "请输入发票代号",
"dj-c-请输入发票号码": "请输入发票号码",
"dj-c-请输入开票日期": "请输入开票日期",
"dj-c-请输入金额": "请输入金额(不含税)",
"dj-c-上传发票": "上传发票",
"dj-c-支持上传多张发票": "支持上传多张发票",
"dj-c-请留言": "请输入留言~",
"dj-c-发送": "发送",
"dj-c-通知提醒": "通知提醒",
"dj-c-msg-content": "请尽快完成任务~",
"dj-c-代": "代",
"dj-c-前": "前",
"dj-c-生效": "生效",
"dj-c-已失效": "已失效",
"dj-c-已保存": "已保存",
"dj-c-未保存": "未保存",
"dj-c-已选中n项": "已选中{{ n }}项",
"dj-c-m来源共n项发生变更": "{{m}}共{{n}}项发生变更",
"dj-c-查看甘特图": "查看甘特图",
"dj-c-甘特图": "甘特图",
"dj-c-异常": "异常",
"dj-c-逾期n天": "逾期{{ n }}天",
"dj-c-全部信息请输入关键字搜索": "全部信息请输入关键字搜索",
"dj-c-*至少选中一项数据": "*至少选中一项数据",
"dj-c-已选n项": "已选{{ n }}项",
"dj-c-荐": "荐",
"dj-c-请输入专案编号": "请输入专案编号",
"dj-c-请输入专案名称": "请输入专案名称"
}

+ 167
- 0
efm-demo-web/src/assets/i18n/zh_CN/basic.json View File

@ -0,0 +1,167 @@
{
"dj-请输入": "请输入",
"dj-请选择": "请选择",
"dj-搜索点什么吧": "搜索点什么吧",
"dj-历史记录": "搜索历史",
"dj-登出": "登出",
"dj-管理模组": "管理模组",
"dj-交付设计器": "交付设计器",
"menu": {
"project-center": "项目中心"
},
"dj-全部关闭": "全部关闭",
"dj-批量操作": "批量操作",
"dj-来源由n张工单组成": "来源:由 {{ ids }} 等 {{ n }} 张{{sourceName}}组成",
"dj-来源由n张x单组成": "来源:由 {{taskName}} 组成",
"dj-来源由n张如ids的x单组成": "来源:由 {{ ids }} 等 {{ n }} 张 {{taskName}} 组成",
"dj-倒计时": "倒计时",
"dj-预计开工日": "预计开工日",
"dj-来源": "来源",
"dj-由Athena发起当前项目": "由Athena发起当前项目",
"dj-人工": "人工",
"dj-自动": "自动",
"dj-未完成": "未完成",
"dj-需完成": "需完成",
"dj-共计": "共计",
"dj-共n笔": "共 {{n}} 笔",
"dj-n笔": "{{n}} 笔",
"dj-待入库n项": "待入库 {{n}} 项",
"dj-我知道了": "我知道了",
"dj-立即查看": "立即查看",
"dj-切换企业": "切换企业",
"dj-个性化设定": "设置",
"dj-常用设置": "常用设置",
"dj-开启勿扰": "已开启勿扰",
"dj-关闭勿扰": "已关闭勿扰",
"dj-开启代理人": "已开启代理人",
"dj-关闭代理人": "已关闭代理人",
"dj-基本设置": "个性化设定",
"dj-工作桌面": "工作桌面",
"dj-搜索结果": "搜索结果",
"dj-进度查询": "进度查询",
"dj-发起项目": "发起项目",
"dj-项目任务": "项目任务",
"dj-当责者": "当责者",
"dj-项目名称": "项目名称",
"dj-状态": "状态",
"dj-task-report-项目状况查询": "项目状况查询",
"dj-task-report-历史项目查询": "历史项目查询",
"dj-task-report-区间": "区间",
"dj-task-report-天": "天",
"dj-task-report-周": "周",
"dj-task-report-月": "月",
"dj-task-report-季度": "季度",
"dj-task-report-项目名称": "项目名称",
"dj-task-report-当责者": "当责者",
"dj-task-report-筛查": "筛查",
"dj-task-report-重置": "重置",
"dj-task-report-目标": "目标",
"dj-task-report-子项目": "子项目",
"dj-task-report-子项目数": "子项目数",
"dj-task-report-子项目数单位": "个",
"dj-task-report-请选择项目名称": "请选择项目名称",
"dj-task-report-请选择当责者": "请选择当责者",
"dj-task-report-没有结果": "没有找到相关项目,请重新筛查",
"dj-task-report-项": "项",
"dj-set-用户ID": "用户ID",
"dj-set-用户名称": "用户名称",
"dj-set-手机号码": "手机号码",
"dj-set-所属组织": "所属组织",
"dj-set-运营单位": "运营单位",
"dj-set-语言设定": "语言设定",
"dj-set-时区选择": "时区选择",
"dj-set-变更密码": "变更密码",
"dj-set-点此修改": "点此修改",
"dj-set-代理人设置": "代理人设置",
"dj-set-代理人": "代理人",
"dj-set-代理区间": "代理区间",
"dj-set-勿扰模式": "勿扰模式",
"dj-set-开始时间": "开始时间",
"dj-set-结束时间": "结束时间",
"dj-set-设置代理区间成功": "设置代理区间成功",
"dj-set-设置代理区间失败": "设置代理区间失败",
"dj-是否确认提交": "是否确认提交",
"dj-取消": "取消",
"dj-确认": "确认",
"dj-提交": "提交",
"dj-下一步": "下一步",
"dj-拒绝时审核意见必填哦": "拒绝时审核意见必填哦~",
"dj-提示": "提示",
"dj-是否签核": "是否 {{title}} 签核",
"dj-操作成功": "操作成功",
"dj-上传成功": "上传成功",
"dj-加载中": "加载中",
"dj-通知执行人": "通知执行人",
"dj-去执行待办": "去执行待办",
"dj-分享链接": "分享链接",
"dj-查看子项目详情": "查看子项目详情",
"dj-复制成功": "复制成功",
"dj-通知成功": "通知成功",
"dj-消息通知": "消息通知",
"dj-重要消息": "重要消息",
"dj-工作动态": "工作动态",
"dj-紧急": "紧急",
"dj-重要": "特别关注",
"dj-变更": "变更",
"dj-共n个任务异常": "共{{ n }}个任务异常",
"dj-共n个任务进行中": "共{{ n }}个任务进行中",
"dj-已逾期": "已逾期",
"dj-小时": "小时",
"dj-天": "天",
"dj-标记所有为已读": "标记所有为已读",
"dj-删除所有已读消息": "删除所有已读消息",
"dj-通知设置": "通知设置",
"dj-项目通知": "项目通知",
"dj-暂无消息": "暂无消息",
"dj-分钟前": "分钟前",
"dj-今天": "今天",
"dj-昨天": "昨天",
"dj-周一": "周一",
"dj-周二": "周二",
"dj-周三": "周三",
"dj-周四": "周四",
"dj-周五": "周五",
"dj-周六": "周六",
"dj-周日": "周日",
"dj-任务通知": "任务通知",
"dj-刚刚": "刚刚",
"dj-系统消息": "系统消息",
"dj-异常排除": "异常排除",
"dj-任务已关闭": "当前任务已关闭",
"dj-暂无更多项目类型": "暂无更多项目类型",
"dj-工单有变更,查看详情": "工单有变更,查看详情",
"dj-等": "等",
"dj-共": "共",
"dj-个": "个",
"dj-张": "张",
"dj-运营单元-1": "分公司",
"dj-运营单元-2": "工厂",
"dj-运营单元-3": "车间",
"dj-工单明细": "工单明细",
"dj-明细": "明细",
"dj-数据上传中": "数据上传中",
"dj-数据校验中": "数据校验中",
"dj-msg-ATHENA_REMIND": "ATHENA提醒",
"dj-msg-EXCEPTION_OR_OVERDUE": "项目异常/逾期提醒",
"dj-msg-INTERNAL_REMIND": "内部提醒",
"dj-msg-PROXY_REMIND": "代理人提醒",
"dj-msg-option-ALL": "全部",
"dj-msg-option-EMERGENCY": "紧急",
"dj-msg-option-EXCEPTION_OR_OVERDUE": "异常/逾期",
"dj-msg-option-NOTICE": "通知",
"dj-msg-option-PROXY": "代理",
"dj-msg-option-OTHER": "其他",
"dj-提醒关注": "提醒您关注",
"dj-基础资料录入": "基础资料录入",
"dj-请输入需要录入的基础资料模板名称": "请输入需要录入的基础资料模板名称",
"dj-已通知x": "已通知{{x}}",
"dj-全部": "全部",
"dj-包含": "包含",
"dj-搜索关键字": "搜索关键字",
"dj-重置": "重置",
"dj-搜索": "搜索",
"dj-栏位": "栏位",
"dj-公式": "公式",
"dj-新增查询条件": "新增查询条件",
"dj-最多同时查询3个条件": "最多同时查询3个条件"
}

+ 3
- 0
efm-demo-web/src/assets/i18n/zh_CN/default.json View File

@ -0,0 +1,3 @@
{
}

+ 36
- 0
efm-demo-web/src/assets/i18n/zh_CN/task.json View File

@ -0,0 +1,36 @@
{
"dj-task-日": "日",
"dj-task-月": "月",
"dj-task-今天": "今天",
"dj-task-本月": "本月",
"dj-task-week1": "星期一",
"dj-task-week2": "星期二",
"dj-task-week3": "星期三",
"dj-task-week4": "星期四",
"dj-task-week5": "星期五",
"dj-task-week6": "星期六",
"dj-task-week0": "星期日",
"dj-task-逾期任务": "逾期任务",
"dj-task-暂无更多任务逾期": "暂无更多任务逾期",
"dj-task-任务未逾期": "工作完成良好,任务未逾期",
"dj-task-暂无异常排除": "暂无异常排除任务需跟踪",
"dj-task-暂无项目逾期": "暂无项目逾期需跟催",
"dj-task-今日需完成n项任务": "今日需完成任务 {{ n }}",
"dj-task-需完成n项任务": "需完成{{ n }}项任务",
"dj-task-共n项任务": "共{{ n }}项任务",
"dj-task-共计n项任务": "共计{{ n }}项任务",
"dj-task-查看完整版": "进入当天任务,查看完整版",
"dj-task-项目逾期需跟催": "项目逾期需跟催",
"dj-task-异常排除需追踪": "异常排除需追踪",
"dj-task-今日优先处理任务": "今日优先处理任务",
"dj-task-今日一般任务": "今日一般任务",
"dj-task-可提前处理任务": "可提前处理任务",
"dj-task-暂无任务": "暂无任务",
"dj-task-暂无任务可执行": "暂无任务可执行",
"dj-task-all": "全部",
"dj-task-等n个": "…等{{ n }}个",
"dj-task-unit-1": "分公司",
"dj-task-unit-2": "工厂",
"dj-task-unit-3": "车间",
"dj-task-确定": "确定"
}

+ 217
- 0
efm-demo-web/src/assets/i18n/zh_TW/ant-components.json View File

@ -0,0 +1,217 @@
{
"dj-c-预计开工日": "預計開工日",
"dj-c-由Athena发起当前项目": "由Athena發起當前項目",
"dj-c-来源由n张工单组成": "來源:由{{ taskName }}組成",
"dj-c-来源由n张ids工单组成": "來源:由 {{ ids }} 等{{ n }}張{{ taskName }}組成",
"dj-c-倒计时": "倒計時",
"dj-c-需完成": "需完成",
"dj-c-收起": "收起",
"dj-c-更多": "更多",
"dj-c-操作": "操作",
"dj-c-更换": "更換",
"dj-c-提示": "提示",
"dj-c-我知道了": "我知道了",
"dj-c-存在异常是否忽略提交": "存在 {{n}} 項异常,<br />是否確定提交?",
"dj-c-是否确定提交": "是否確定提交?",
"dj-c-请确认是否填写完整": "請確認是否填寫完整",
"dj-c-取消": "取消",
"dj-c-确认": "確認",
"dj-c-确定": "確定",
"dj-c-明细": "明細",
"dj-c-下载": "下載",
"dj-c-预览": "預覽",
"dj-c-已读n次": "已讀 {{ n }} 次",
"dj-c-取消拆行": "取消拆行",
"dj-c-拆行": "拆行",
"dj-c-旧公式": "舊公式",
"dj-c-新公式": "新公式",
"dj-c-查看模拟推估": "查看類比推估",
"dj-c-权重总和应等于100": "權重總和應等於100",
"dj-c-暂无数据": "暫無數據",
"dj-c-必填": "必填",
"dj-c-重新编辑": "重新編輯",
"dj-c-编辑": "編輯",
"dj-c-请选择需要提交的数据": "請選擇需要提交的數據",
"dj-c-收货地址": "收貨地址",
"dj-c-采购员编号": "採購員編號",
"dj-c-转派至": "轉派至",
"dj-c-员工编号": "員工編號",
"dj-c-员工姓名": "員工姓名",
"dj-c-请输入员工编号": "請輸入員工編號",
"dj-c-将此任务转派至您": "將此任務轉派至您",
"dj-c-退回重签至": "退回重簽至",
"dj-c-请输入签核意见": "請輸入簽核意見",
"dj-c-签核意见": "簽核意見",
"dj-c-查看签核进度": "查看簽核進度",
"dj-c-是否确定转派": "是否確定轉派",
"dj-c-是否确定退回": "是否確定退回",
"dj-c-签核进程": "簽核進程",
"dj-c-是否确定同意": "是否確定同意",
"dj-c-非必填": "非必填",
"dj-c-未开始": "未開始",
"dj-c-进行中": "進行中",
"dj-c-已完成": "已完成",
"dj-c-退回": "退回",
"dj-c-加签": "加簽",
"dj-c-已同意": "已同意",
"dj-c-已撤销": "已撤銷",
"dj-c-已中止": "已中止",
"dj-c-已暂停": "已暫停",
"dj-c-不需签核": "不需簽核",
"dj-c-需签核": "需簽核",
"dj-c-取回重办": "取回重辦",
"dj-c-已通知": "已通知",
"dj-c-已会办": "已會辦",
"dj-c-正在进行": "正在進行",
"dj-c-逾期": "逾期",
"dj-c-紧急": "緊急",
"dj-c-天": "天",
"dj-c-时": "時",
"dj-c-分钟": "分鐘",
"dj-c-最早": "最早",
"dj-c-最大逾期": "最大逾期",
"dj-c-共n项": "共{{ n }}項",
"dj-c-共str": "共{{ str }}",
"dj-c-个": "個",
"dj-c-页面加载失败": "頁面加載失敗",
"dj-c-重新加载": "重新加載",
"dj-c-请不要输入表情": "請不要輸入表情",
"dj-c-不能选择当前用户": "不能選擇當前用戶",
"dj-c-是否确定退回重办": "是否確定退回重辦",
"dj-c-所有计量": "所有計量",
"dj-c-库存年月": "庫存年月",
"dj-c-周转天数": "周轉天數",
"dj-c-平均存货净额": "平均存貨淨額",
"dj-c-销售净额": "銷售淨額",
"dj-c-平均耗量(年月)": "平均耗量(年月)",
"dj-c-标准差(年月)": "標準差(年月)",
"dj-c-平均销售金额(年月)": "平均銷售金額(年月)",
"dj-c-标准化生产": "標準化生產",
"dj-c-修改": "修改",
"dj-c-已": "已",
"dj-c-总量": "總量",
"dj-c-目标:差异率小于n": "目标:差异率小于{{n}}",
"dj-c-共n项定位调整": "共{{n}}项定位调整",
"dj-c-实际": "實際",
"dj-c-合理": "合理",
"dj-c-建议": "建議",
"dj-c-本期共": "本期共",
"dj-c-项": "項",
"dj-c-检测出现定位调整,建议修改参数": "检测出现定位调整,建议修改参数",
"dj-c-成品": "成品",
"dj-c-半成品": "半成品",
"dj-c-原材料": "原材料",
"dj-c-耗用金额": "耗用金額",
"dj-c-高": "高",
"dj-c-中": "中",
"dj-c-低": "低",
"dj-c-频进货": "頻進貨",
"dj-c-原材料机制调整建议": "原材料機制調整建議",
"dj-c-项采纳": "項采納",
"dj-c-项拒绝": "項拒絕",
"dj-c-共计": "共計",
"dj-c-n项": "{{n}}項",
"dj-c-返回": "返回",
"dj-c-统计": "統計",
"dj-c-标准差异率n": "標準差異率{{n}}",
"dj-c-采购间隔参数": "采購間隔參數",
"dj-c-实际采购LT": "實際采購LT",
"dj-c-实际采购": "實際采購",
"dj-c-机制调整建议": "機制調整建議",
"dj-c-建议新定位": "建議新定位",
"dj-c-高频进货": "高頻進貨",
"dj-c-中频进货": "中頻進貨",
"dj-c-低频进货": "低頻進貨",
"dj-c-高频进货n项": "高頻進貨{{n}}項",
"dj-c-中频进货n项": "中頻進貨{{n}}項",
"dj-c-低频进货n项": "低頻進貨{{n}}項",
"dj-c-没有可获取到的可退回列表": "沒有可獲取到的可退回列表",
"dj-c-数据加载异常": "數據加載異常",
"dj-c-正在校验": "正在校驗",
"dj-c-输入错误": "輸入錯誤",
"dj-c-输入不完整": "輸入不完整",
"dj-c-输入不完整或者错误": "輸入不完整或者輸入錯誤",
"dj-c-校验失败": "校驗失敗",
"dj-c-支持批量提交但未选择对象": "支持批量提交但未選擇對象",
"dj-c-差异": "差異",
"dj-c-方案进度": "方案進度",
"dj-c-加量": "加量",
"dj-c-减量": "減量",
"dj-c-延迟": "延遲",
"dj-c-提早": "提早",
"dj-c-拆行输入错误": "拆行輸入錯誤",
"dj-c-请上传": "請上傳",
"dj-c-上传于": "{{user}}上傳于{{date}}",
"dj-c-已删除附件": "附件已刪除",
"dj-c-删除附件失败": "删除附件失敗",
"dj-c-上传失败": "上傳失敗",
"dj-c-转派": "轉派",
"dj-c-没有查询到可退回的关卡名称": "沒有査詢到可退回的關卡名稱",
"dj-c-请刷新重试": "請刷新重試",
"dj-c-当前任务已完成": "當前任務已完成",
"dj-c-加签意见": "加簽意見",
"dj-c-请选择加签方式": "請選擇加簽方式",
"dj-c-向前加签": "向前加簽",
"dj-c-向后加签": "向後加簽",
"dj-c-签核人": "簽核人",
"dj-c-请选择": "請選擇",
"dj-c-请选择签核人": "請選擇簽核人",
"dj-c-是否确定撤回": "是否確定撤回",
"dj-c-撤回后同一方案且同一批提交的方案将同步撤回": "撤回後同一方案且同一批提交的方案將同步撤回",
"dj-c-撤回意见": "撤回意見",
"dj-c-发票上传": "發票上傳",
"dj-c-发票代号": "發票代號",
"dj-c-发票号码": "發票號碼",
"dj-c-开票日期": "開票日期",
"dj-c-校验码(后6位)": "校驗碼(後6位)",
"dj-c-请将6位校验码输入完整": "請將6位校驗碼輸入完整",
"dj-c-金额(不含税)": "金額(不含稅)",
"dj-c-只能输入数字": "只能輸入數位",
"dj-c-只能输入整数或者带2位小数": "只能輸入整數或者帶2位小數",
"dj-c-限制类型": "只支持{{ n }}",
"dj-c-不限制大小": "大小不限制",
"dj-c-限制大小": "大小限制{{ n }}",
"dj-c-请输入关键字": "請輸入關鍵字",
"dj-c-合计": "合計",
"dj-c-是否确定加签": "是否確定加簽",
"dj-c-已撤回": "已撤回",
"dj-c-请输入撤回意见": "請輸入撤回意見",
"dj-c-重签意见": "重簽意見",
"dj-c-转派意见": "轉派意見",
"dj-c-请填写意见": "請填寫意見",
"dj-c-重办意见": "重辦意見",
"dj-c-请填写重办意见": "請填寫重辦意見",
"dj-c-请输入发票代号": "請輸入發票代號",
"dj-c-请输入发票号码": "請輸入發票號碼",
"dj-c-请输入开票日期": "請輸入開票日期",
"dj-c-请输入金额": "請輸入金額(不含稅)",
"dj-c-上传发票": "上傳發票",
"dj-c-支持上传多张发票": "支持上傳多張發票",
"dj-c-请留言": "請輸入留言~",
"dj-c-发送": "發送",
"dj-c-通知提醒": "通知提醒",
"dj-c-msg-content": "請盡快完成任務~",
"dj-c-代": "代",
"dj-c-前": "前",
"dj-c-生效": "生效",
"dj-c-已失效": "已失效",
"dj-c-已保存": "已保存",
"dj-c-未保存": "未保存",
"dj-c-已选中n项": "已選中{{ n }}項",
"dj-c-m来源共n项发生变更": "{{m}}共{{n}}項發生變更",
"dj-c-查看甘特图": "查看甘特圖",
"dj-c-甘特图": "甘特圖",
"dj-c-异常": "異常",
"dj-c-逾期n天": "逾期{{ n }}天",
"dj-c-全部信息请输入关键字搜索": "全部信息請輸入關鍵字搜索",
"dj-c-*至少选中一项数据": "*至少選中一項數據",
"dj-c-已选n项": "已選{{ n }}項",
"dj-c-荐": "薦",
"dj-c-请输入专案编号": "請輸入專案編號",
"dj-c-请输入专案名称": "請輸入專案名稱",
"dj-c-计划维护": "計畫維護",
"dj-c-专案基础信息维护": "專案基礎信息維護",
"dj-c-启动专案": "啟動專案",
"dj-c-专案已启动": "專案已啟動",
"dj-c-专案已暂停": "專案已暫停"
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save