@ -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. |
@ -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 |
@ -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": {} | |||
} | |||
] | |||
} |
@ -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/ |
@ -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/ |
@ -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/**" | |||
], | |||
} | |||
] | |||
} |
@ -0,0 +1,3 @@ | |||
{ | |||
"typescript.tsdk": "node_modules\\typescript\\lib" | |||
} |
@ -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). |
@ -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" | |||
} | |||
} |
@ -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" | |||
} | |||
} | |||
} | |||
}; |
@ -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)); | |||
}); | |||
}); |
@ -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>; | |||
} | |||
} |
@ -0,0 +1,13 @@ | |||
{ | |||
"extends": "../tsconfig.json", | |||
"compilerOptions": { | |||
"outDir": "../out-tsc/e2e", | |||
"module": "commonjs", | |||
"target": "es2015", | |||
"types": [ | |||
"jasmine", | |||
"jasminewd2", | |||
"node" | |||
] | |||
} | |||
} |
@ -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 | |||
}); | |||
}; |
@ -0,0 +1,10 @@ | |||
module.exports = { | |||
packages: { | |||
'@webdpt/components': { | |||
ignorableDeepImportMatchers: [ | |||
/ng-quicksilver\/date-picker\/standard-types/, | |||
/iv-viewer\// | |||
] | |||
} | |||
}, | |||
}; |
@ -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" | |||
} | |||
} | |||
] | |||
} |
@ -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" | |||
} | |||
} |
@ -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": { |
@ -0,0 +1 @@ | |||
{ "envType": "angular", "dap": { "enabled": false }, "athena": { "enabled": true } } |
@ -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. |
@ -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 +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(); | |||
})); | |||
}); |
@ -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) {} | |||
} |
@ -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(); | |||
} | |||
} |
@ -0,0 +1,5 @@ | |||
/** | |||
* IAM 的 digi-middleware-auth-app [各應用系統的AppToken]. | |||
*/ | |||
// eslint-disable-next-line max-len | |||
export const DigiMiddlewareAuthApp = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IkF0aGVuYSIsInNpZCI6MTYzNjc3NzI1NzgyNTkyfQ.3QLTPVKsk2Mp3j_aQ3X8bQW1wCJMNWeCkL6VPoK352c'; |
@ -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 = {}; |
@ -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; | |||
} | |||
} |
@ -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 | |||
] | |||
}; | |||
} | |||
} |
@ -0,0 +1,11 @@ | |||
import { Routes } from '@angular/router'; | |||
import { IMPLEMENTATION_ROUTES } from '../implementation/implementation-routes'; | |||
export const CUSTOMIZATION_ROUTES: Routes = [ | |||
// 設定客製應用模組路由 | |||
// 應用開發應用模組路由 | |||
...IMPLEMENTATION_ROUTES | |||
]; |
@ -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 { } |
@ -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 +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 { } |
@ -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 { | |||
} |
@ -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; | |||
} |
@ -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> |
@ -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; | |||
} |
@ -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 | |||
]; | |||
} | |||
} |
@ -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 { } |
@ -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 { | |||
} |
@ -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 { } |
@ -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; | |||
} |
@ -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> |
@ -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; | |||
} | |||
@ -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, | |||
) { } | |||
} |
@ -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 +1,3 @@ | |||
<p> | |||
home works! | |||
</p> |
@ -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() { } | |||
} |
@ -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 { } |
@ -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); | |||
} | |||
} |
@ -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)); | |||
} | |||
} |
@ -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 | |||
} | |||
} | |||
]; |
@ -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 { } |
@ -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 | |||
] | |||
}; | |||
} | |||
} |
@ -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; |
@ -0,0 +1,15 @@ | |||
// 可用語言清單靜態設定檔 | |||
export const languageList = [ | |||
{ | |||
'value': 'en_US', | |||
'label': 'English' | |||
}, | |||
{ | |||
'value': 'zh_CN', | |||
'label': '简体' | |||
}, | |||
{ | |||
'value': 'zh_TW', | |||
'label': '繁體' | |||
} | |||
]; |
@ -0,0 +1,5 @@ | |||
import { menuData } from './menu.model'; // Menu靜態設定檔 | |||
export const menuJson = [ | |||
...menuData | |||
]; |
@ -0,0 +1 @@ | |||
export const menuData = []; |
@ -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; | |||
} |
@ -0,0 +1,6 @@ | |||
import { programActionData } from './program-action.model'; | |||
export const programActionInfoJson = [ | |||
...programActionData // ProgramAction靜態設定檔 | |||
]; |
@ -0,0 +1 @@ | |||
export const programActionData = []; |
@ -0,0 +1,6 @@ | |||
import { programPageData } from './program-page.model'; | |||
export const programPageInfoJson = [ | |||
...programPageData // ProgramPage靜態設定檔 | |||
]; |
@ -0,0 +1 @@ | |||
export const programPageData = []; |
@ -0,0 +1,5 @@ | |||
import { programData } from './program.model'; | |||
export const programInfoJson = [ | |||
...programData, // Program靜態設定檔 | |||
]; |
@ -0,0 +1,8 @@ | |||
export const programData = [ | |||
{ | |||
'id': 'home', | |||
'module': 'root', // 沒有模組歸屬不做模組切分,不上傳到IAM做權限控管 | |||
'type': '', | |||
'routerLink': '/' | |||
}, | |||
]; |
@ -0,0 +1,15 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
const programsModules = [ | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
...programsModules | |||
], | |||
declarations: [] | |||
}) | |||
export class BasicDetailModule { } |
@ -0,0 +1,15 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
const programsModules = [ | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
...programsModules | |||
], | |||
declarations: [] | |||
}) | |||
export class ProjectDetailModule { } |
@ -0,0 +1,15 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
const programsModules = [ | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
...programsModules | |||
], | |||
declarations: [] | |||
}) | |||
export class TaskDetailModule { } |
@ -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; | |||
} |
@ -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); | |||
}); | |||
}); | |||
} | |||
} |
@ -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; | |||
} | |||
} |
@ -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 { } |
@ -0,0 +1,4 @@ | |||
import { IDwOrgTreeDefault } from '@webdpt/framework/organize-tree-core'; | |||
import { NzTreeNode } from 'ng-zorro-antd/tree'; | |||
export const openOrgTreeModalDefault: IDwOrgTreeDefault<NzTreeNode> = {}; |
@ -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. | |||
}; |
@ -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 { } |
@ -0,0 +1 @@ | |||
@import './variable.less'; |
@ -0,0 +1,10 @@ | |||
// 多頁佈局預設開啟作業 | |||
export const tabRouteConfigJson = [ | |||
{ | |||
'id': 'home', | |||
'canClose': false, | |||
'defaultOpen': true, | |||
'canMultiOpen': false, | |||
'iconClass': 'dwType:home' | |||
} | |||
]; |
@ -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 { } |
@ -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); | |||
} | |||
} |
@ -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 { } |
@ -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 { } |
@ -0,0 +1,12 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
@Component({ | |||
selector: 'app-prog001', | |||
template: `<h1>404</h1>` | |||
}) | |||
export class PageNotFoundComponent { | |||
constructor() { } | |||
} |
@ -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 | |||
]; |
@ -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'; |
@ -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@" | |||
} | |||
@ -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@" | |||
} |
@ -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" | |||
} |
@ -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}}" | |||
} |
@ -0,0 +1,3 @@ | |||
{ | |||
} |
@ -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" | |||
} |
@ -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-请输入专案名称": "请输入专案名称" | |||
} |
@ -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个条件" | |||
} |
@ -0,0 +1,3 @@ | |||
{ | |||
} |
@ -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-确定": "确定" | |||
} |
@ -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-专案已暂停": "專案已暫停" | |||
} |