diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..427441dc --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,17 @@ +# 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 + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# 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. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..59d9a3a3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..42da9d3f --- /dev/null +++ b/.eslintignore @@ -0,0 +1,34 @@ +_cli-tpl/ +dist/ +coverage/ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +.cache/ + +# yarn v2 +.yarn diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..78aaeb78 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,126 @@ +const prettierConfig = require('./.prettierrc.js'); + +module.exports = { + root: true, + parserOptions: { ecmaVersion: 2021 }, + overrides: [ + { + files: ['*.ts'], + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['tsconfig.json'], + createDefaultProgram: true + }, + plugins: ['@typescript-eslint', 'jsdoc', 'import'], + extends: [ + 'plugin:@angular-eslint/recommended', + 'plugin:@angular-eslint/template/process-inline-templates', + 'plugin:prettier/recommended' + ], + rules: { + 'prettier/prettier': ['error', prettierConfig], + 'jsdoc/newline-after-description': 1, + '@angular-eslint/component-class-suffix': [ + 'error', + { + suffixes: ['Directive', 'Component', 'Base', 'Widget'] + } + ], + '@angular-eslint/directive-class-suffix': [ + 'error', + { + suffixes: ['Directive', 'Component', 'Base', 'Widget'] + } + ], + '@angular-eslint/component-selector': [ + 'off', + { + type: ['element', 'attribute'], + prefix: ['app', 'test'], + style: 'kebab-case' + } + ], + '@angular-eslint/directive-selector': [ + 'off', + { + type: 'attribute', + prefix: ['app'] + } + ], + '@angular-eslint/no-attribute-decorator': 'error', + '@angular-eslint/no-conflicting-lifecycle': 'off', + '@angular-eslint/no-forward-ref': 'off', + '@angular-eslint/no-host-metadata-property': 'off', + '@angular-eslint/no-lifecycle-call': 'off', + '@angular-eslint/no-pipe-impure': 'error', + '@angular-eslint/prefer-output-readonly': 'error', + '@angular-eslint/use-component-selector': 'off', + '@angular-eslint/use-component-view-encapsulation': 'off', + '@angular-eslint/no-input-rename': 'off', + '@angular-eslint/no-output-native': 'off', + '@typescript-eslint/array-type': [ + 'error', + { + default: 'array-simple' + } + ], + '@typescript-eslint/ban-types': [ + 'off', + { + types: { + String: { + message: 'Use string instead.' + }, + Number: { + message: 'Use number instead.' + }, + Boolean: { + message: 'Use boolean instead.' + }, + Function: { + message: 'Use specific callable interface instead.' + } + } + } + ], + 'import/no-duplicates': 'error', + 'import/no-unused-modules': 'error', + 'import/no-unassigned-import': 'error', + 'import/order': [ + 'error', + { + alphabetize: { order: 'asc', caseInsensitive: false }, + 'newlines-between': 'always', + groups: ['external', 'internal', ['parent', 'sibling', 'index']], + pathGroups: [], + pathGroupsExcludedImportTypes: [] + } + ], + '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/member-ordering': 'off', + 'no-irregular-whitespace': 'error', + 'no-multiple-empty-lines': 'error', + 'no-sparse-arrays': 'error', + 'prefer-object-spread': 'error', + 'prefer-template': 'error', + 'prefer-const': 'off', + 'max-len': 'off' + } + }, + { + files: ['*.html'], + extends: ['plugin:@angular-eslint/template/recommended'], + rules: {} + }, + { + files: ['*.html'], + excludedFiles: ['*inline-template-*.component.html'], + extends: ['plugin:prettier/recommended'], + rules: { + 'prettier/prettier': ['error', { parser: 'angular' }], + '@angular-eslint/template/eqeqeq': 'off' + } + } + ] +}; diff --git a/.gitignore b/.gitignore index 08b25532..b5af4d96 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,50 @@ -node_modules +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# /src/assets/color.less +delon-builds +scripts/var.less +# src/assets/style.dark.css +# src/assets/style.compact.css + +# dependencies +/node_modules +/yarn.lock + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.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 +yarn-error.log +/_all.less + +# e2e +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 00000000..31354ec1 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..3e1f42ec --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ +.github +node_modules + +dist +tmp diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..5c088ddb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +12.14.1 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..d250447c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,18 @@ +# add files you wish to ignore here +**/*.md +**/*.svg +**/test.ts + +.stylelintrc +.prettierrc + +src/assets/* +src/index.html +node_modules/ +.vscode/ +coverage/ +dist/ +package.json +tslint.json + +_cli-tpl/**/* diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..26ba9009 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,13 @@ +module.exports = { + singleQuote: true, + useTabs: false, + printWidth: 140, + tabWidth: 2, + semi: true, + htmlWhitespaceSensitivity: 'strict', + arrowParens: 'avoid', + bracketSpacing: true, + proseWrap: 'preserve', + trailingComma: 'none', + endOfLine: 'lf' +}; diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 00000000..86e9c6a3 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,28 @@ +{ + "extends": [ + "stylelint-config-standard", + "stylelint-config-rational-order", + "stylelint-config-prettier" + ], + "plugins": [ + "stylelint-order", + "stylelint-declaration-block-no-ignored-properties" + ], + "rules": { + "no-descending-specificity": null, + "plugin/declaration-block-no-ignored-properties": true, + "selector-type-no-unknown": null, + "selector-pseudo-element-no-unknown": [ + true, + { + "ignorePseudoElements": [ + "ng-deep" + ] + } + ], + "at-rule-no-unknown": null + }, + "ignoreFiles": [ + "src/assets/**/*" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..a1c49108 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "compile-hero.disable-compile-files-on-did-save-code": true +} \ No newline at end of file diff --git a/_cli-tpl/README.md b/_cli-tpl/README.md new file mode 100644 index 00000000..409ebc52 --- /dev/null +++ b/_cli-tpl/README.md @@ -0,0 +1 @@ +[Document](https://ng-alain.com/cli/generate#Custom-template-page) diff --git a/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html new file mode 100644 index 00000000..8a7009bc --- /dev/null +++ b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts new file mode 100644 index 00000000..5b408fb6 --- /dev/null +++ b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { <%= componentName %> } from './<%= dasherize(name) %>.component'; + +describe('<%= componentName %>', () => { + let component: <%= componentName %>; + let fixture: ComponentFixture<<%= componentName %>>; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ <%= componentName %> ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(<%= componentName %>); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts new file mode 100644 index 00000000..b9cf8f2b --- /dev/null +++ b/_cli-tpl/grid/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%><% if(changeDetection !== 'Default') { %>, ChangeDetectionStrategy<% }%> } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: '<%= selector %>', + templateUrl: './<%= dasherize(name) %>.component.html',<% if(!inlineStyle) { %><% } else { %> + styleUrls: ['./<%= dasherize(name) %>.component.<%= styleext %>']<% } %><% if(!!viewEncapsulation) { %>, + encapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } if (changeDetection !== 'Default') { %>, + changeDetection: ChangeDetectionStrategy.<%= changeDetection %><% } %> +}) +export class <%= componentName %> implements OnInit { + + constructor(private http: _HttpClient, private msg: NzMessageService) { } + + ngOnInit() { } + +} diff --git a/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html new file mode 100644 index 00000000..aef86ebd --- /dev/null +++ b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html @@ -0,0 +1,3 @@ + + + diff --git a/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts new file mode 100644 index 00000000..c7a520ca --- /dev/null +++ b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { <%= componentName %> } from './<%= dasherize(name) %>.component'; + +describe('<%= componentName %>', () => { + let component: <%= componentName %>; + let fixture: ComponentFixture<<%= componentName %>>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ <%= componentName %> ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(<%= componentName %>); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts new file mode 100644 index 00000000..b9cf8f2b --- /dev/null +++ b/_cli-tpl/list/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%><% if(changeDetection !== 'Default') { %>, ChangeDetectionStrategy<% }%> } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: '<%= selector %>', + templateUrl: './<%= dasherize(name) %>.component.html',<% if(!inlineStyle) { %><% } else { %> + styleUrls: ['./<%= dasherize(name) %>.component.<%= styleext %>']<% } %><% if(!!viewEncapsulation) { %>, + encapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } if (changeDetection !== 'Default') { %>, + changeDetection: ChangeDetectionStrategy.<%= changeDetection %><% } %> +}) +export class <%= componentName %> implements OnInit { + + constructor(private http: _HttpClient, private msg: NzMessageService) { } + + ngOnInit() { } + +} diff --git a/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template new file mode 100644 index 00000000..3f210156 --- /dev/null +++ b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template @@ -0,0 +1 @@ + diff --git a/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts.template b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts.template new file mode 100644 index 00000000..c7a520ca --- /dev/null +++ b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts.template @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { <%= componentName %> } from './<%= dasherize(name) %>.component'; + +describe('<%= componentName %>', () => { + let component: <%= componentName %>; + let fixture: ComponentFixture<<%= componentName %>>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ <%= componentName %> ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(<%= componentName %>); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts.template b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..b9cf8f2b --- /dev/null +++ b/_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts.template @@ -0,0 +1,18 @@ +import { Component, OnInit<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%><% if(changeDetection !== 'Default') { %>, ChangeDetectionStrategy<% }%> } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: '<%= selector %>', + templateUrl: './<%= dasherize(name) %>.component.html',<% if(!inlineStyle) { %><% } else { %> + styleUrls: ['./<%= dasherize(name) %>.component.<%= styleext %>']<% } %><% if(!!viewEncapsulation) { %>, + encapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } if (changeDetection !== 'Default') { %>, + changeDetection: ChangeDetectionStrategy.<%= changeDetection %><% } %> +}) +export class <%= componentName %> implements OnInit { + + constructor(private http: _HttpClient, private msg: NzMessageService) { } + + ngOnInit() { } + +} diff --git a/_mock/README.md b/_mock/README.md new file mode 100644 index 00000000..d30e74ab --- /dev/null +++ b/_mock/README.md @@ -0,0 +1 @@ +[Document](https://ng-alain.com/mock) diff --git a/_mock/_api.ts b/_mock/_api.ts new file mode 100644 index 00000000..7448a9f1 --- /dev/null +++ b/_mock/_api.ts @@ -0,0 +1,265 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; + +// region: mock data + +const titles = ['Alipay', 'Angular', 'Ant Design', 'Ant Design Pro', 'Bootstrap', 'React', 'Vue', 'Webpack']; + +const avatars = [ + 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay + 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular + 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design + 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro + 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap + 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React + 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue + 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', // Webpack +]; +const covers = [ + 'https://gw.alipayobjects.com/zos/rmsportal/HrxcVbrKnCJOZvtzSqjN.png', + 'https://gw.alipayobjects.com/zos/rmsportal/alaPpKWajEbIYEUvvVNf.png', + 'https://gw.alipayobjects.com/zos/rmsportal/RLwlKSYGSXGHuWSojyvp.png', + 'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png', +]; +const desc = [ + '那是一种内在的东西, 他们到达不了,也无法触及的', + '希望是一个好东西,也许是最好的,好东西是不会消亡的', + '生命就像一盒巧克力,结果往往出人意料', + '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + '那时候我只会想自己想要什么,从不想自己拥有什么', +]; + +const user = ['卡色', 'cipchk', '付小小', '曲丽丽', '林东东', '周星星', '吴加好', '朱偏右', '鱼酱', '乐哥', '谭小仪', '仲尼']; + +// endregion + +function getFakeList(count: number = 20): any[] { + const list: any[] = []; + for (let i = 0; i < count; i += 1) { + list.push({ + id: `fake-list-${i}`, + owner: user[i % 10], + title: titles[i % 8], + avatar: avatars[i % 8], + cover: parseInt((i / 4).toString(), 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)], + status: ['active', 'exception', 'normal'][i % 3], + percent: Math.ceil(Math.random() * 50) + 50, + logo: avatars[i % 8], + href: 'https://ant.design', + updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i), + createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i), + subDescription: desc[i % 5], + description: + '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。', + activeUser: Math.ceil(Math.random() * 100000) + 100000, + newUser: Math.ceil(Math.random() * 1000) + 1000, + star: Math.ceil(Math.random() * 100) + 100, + like: Math.ceil(Math.random() * 100) + 100, + message: Math.ceil(Math.random() * 10) + 10, + content: + '段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。', + members: [ + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', + name: '曲丽丽', + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', + name: '王昭君', + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', + name: '董娜娜', + }, + ], + }); + } + + return list; +} + +function getNotice(): any[] { + return [ + { + id: 'xxx1', + title: titles[0], + logo: avatars[0], + description: '那是一种内在的东西, 他们到达不了,也无法触及的', + updatedAt: new Date(), + member: '科学搬砖组', + href: '', + memberLink: '', + }, + { + id: 'xxx2', + title: titles[1], + logo: avatars[1], + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + updatedAt: new Date('2017-07-24'), + member: '全组都是吴彦祖', + href: '', + memberLink: '', + }, + { + id: 'xxx3', + title: titles[2], + logo: avatars[2], + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + updatedAt: new Date(), + member: '中二少女团', + href: '', + memberLink: '', + }, + { + id: 'xxx4', + title: titles[3], + logo: avatars[3], + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + updatedAt: new Date('2017-07-23'), + member: '程序员日常', + href: '', + memberLink: '', + }, + { + id: 'xxx5', + title: titles[4], + logo: avatars[4], + description: '凛冬将至', + updatedAt: new Date('2017-07-23'), + member: '高逼格设计天团', + href: '', + memberLink: '', + }, + { + id: 'xxx6', + title: titles[5], + logo: avatars[5], + description: '生命就像一盒巧克力,结果往往出人意料', + updatedAt: new Date('2017-07-23'), + member: '骗你来学计算机', + href: '', + memberLink: '', + }, + ]; +} + +function getActivities(): any[] { + return [ + { + id: 'trend-1', + updatedAt: new Date(), + user: { + name: '林东东', + avatar: avatars[0], + }, + group: { + name: '高逼格设计天团', + link: 'http://github.com/', + }, + project: { + name: '六月迭代', + link: 'http://github.com/', + }, + template: '在 @{group} 新建项目 @{project}', + }, + { + id: 'trend-2', + updatedAt: new Date(), + user: { + name: '付小小', + avatar: avatars[1], + }, + group: { + name: '高逼格设计天团', + link: 'http://github.com/', + }, + project: { + name: '六月迭代', + link: 'http://github.com/', + }, + template: '在 @{group} 新建项目 @{project}', + }, + { + id: 'trend-3', + updatedAt: new Date(), + user: { + name: '曲丽丽', + avatar: avatars[2], + }, + group: { + name: '中二少女团', + link: 'http://github.com/', + }, + project: { + name: '六月迭代', + link: 'http://github.com/', + }, + template: '在 @{group} 新建项目 @{project}', + }, + { + id: 'trend-4', + updatedAt: new Date(), + user: { + name: '周星星', + avatar: avatars[3], + }, + project: { + name: '5 月日常迭代', + link: 'http://github.com/', + }, + template: '将 @{project} 更新至已发布状态', + }, + { + id: 'trend-5', + updatedAt: new Date(), + user: { + name: '朱偏右', + avatar: avatars[4], + }, + project: { + name: '工程效能', + link: 'http://github.com/', + }, + comment: { + name: '留言', + link: 'http://github.com/', + }, + template: '在 @{project} 发布了 @{comment}', + }, + { + id: 'trend-6', + updatedAt: new Date(), + user: { + name: '乐哥', + avatar: avatars[5], + }, + group: { + name: '程序员日常', + link: 'http://github.com/', + }, + project: { + name: '品牌迭代', + link: 'http://github.com/', + }, + template: '在 @{group} 新建项目 @{project}', + }, + ]; +} + +export const APIS = { + '/api/list': (req: MockRequest) => getFakeList(req.queryString.count), + '/api/notice': () => getNotice(), + '/api/activities': () => getActivities(), + 'POST /api/auth/refresh': { msg: 'ok', token: 'new-token-by-refresh' }, + '/api/401': () => { + throw new MockStatusError(401); + }, + '/api/403': () => { + throw new MockStatusError(403); + }, + '/api/404': () => { + throw new MockStatusError(404); + }, + '/api/500': () => { + throw new MockStatusError(500); + }, +}; diff --git a/_mock/_chart.ts b/_mock/_chart.ts new file mode 100644 index 00000000..dfb3602a --- /dev/null +++ b/_mock/_chart.ts @@ -0,0 +1,205 @@ +import { format } from 'date-fns'; +import * as Mock from 'mockjs'; + +// region: mock data + +const visitData: any[] = []; +const beginDay = new Date().getTime(); + +const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5]; +for (let i = 0; i < fakeY.length; i += 1) { + visitData.push({ + x: format(new Date(beginDay + 1000 * 60 * 60 * 24 * i), 'yyyy-MM-dd'), + y: fakeY[i], + }); +} + +const visitData2: any[] = []; +const fakeY2 = [1, 6, 4, 8, 3, 7, 2]; +for (let i = 0; i < fakeY2.length; i += 1) { + visitData2.push({ + x: format(new Date(beginDay + 1000 * 60 * 60 * 24 * i), 'yyyy-MM-dd'), + y: fakeY2[i], + }); +} + +const salesData: any[] = []; +for (let i = 0; i < 12; i += 1) { + salesData.push({ + x: `${i + 1}月`, + y: Math.floor(Math.random() * 1000) + 200, + }); +} +const searchData: any[] = []; +for (let i = 0; i < 50; i += 1) { + searchData.push({ + index: i + 1, + keyword: `搜索关键词-${i}`, + count: Math.floor(Math.random() * 1000), + range: Math.floor(Math.random() * 100), + status: Math.floor((Math.random() * 10) % 2), + }); +} +const salesTypeData = [ + { + x: '家用电器', + y: 4544, + }, + { + x: '食用酒水', + y: 3321, + }, + { + x: '个护健康', + y: 3113, + }, + { + x: '服饰箱包', + y: 2341, + }, + { + x: '母婴产品', + y: 1231, + }, + { + x: '其他', + y: 1231, + }, +]; + +const salesTypeDataOnline = [ + { + x: '家用电器', + y: 244, + }, + { + x: '食用酒水', + y: 321, + }, + { + x: '个护健康', + y: 311, + }, + { + x: '服饰箱包', + y: 41, + }, + { + x: '母婴产品', + y: 121, + }, + { + x: '其他', + y: 111, + }, +]; + +const salesTypeDataOffline = [ + { + x: '家用电器', + y: 99, + }, + { + x: '个护健康', + y: 188, + }, + { + x: '服饰箱包', + y: 344, + }, + { + x: '母婴产品', + y: 255, + }, + { + x: '其他', + y: 65, + }, +]; + +const offlineData: any[] = []; +for (let i = 0; i < 10; i += 1) { + offlineData.push({ + name: `门店${i}`, + cvr: Math.ceil(Math.random() * 9) / 10, + }); +} +const offlineChartData: any[] = []; +for (let i = 0; i < 20; i += 1) { + offlineChartData.push({ + time: new Date().getTime() + 1000 * 60 * 30 * i, + y1: Math.floor(Math.random() * 100) + 10, + y2: Math.floor(Math.random() * 100) + 10, + }); +} + +const radarOriginData = [ + { + name: '个人', + ref: 10, + koubei: 8, + output: 4, + contribute: 5, + hot: 7, + }, + { + name: '团队', + ref: 3, + koubei: 9, + output: 6, + contribute: 3, + hot: 1, + }, + { + name: '部门', + ref: 4, + koubei: 1, + output: 6, + contribute: 5, + hot: 7, + }, +]; + +// +const radarData: any[] = []; +const radarTitleMap: any = { + ref: '引用', + koubei: '口碑', + output: '产量', + contribute: '贡献', + hot: '热度', +}; +radarOriginData.forEach((item: any) => { + Object.keys(item).forEach((key) => { + if (key !== 'name') { + radarData.push({ + name: item.name, + label: radarTitleMap[key], + value: item[key], + }); + } + }); +}); + +// endregion + +export const CHARTS = { + '/chart': JSON.parse( + JSON.stringify({ + visitData, + visitData2, + salesData, + searchData, + offlineData, + offlineChartData, + salesTypeData, + salesTypeDataOnline, + salesTypeDataOffline, + radarData, + }), + ), + '/chart/visit': JSON.parse(JSON.stringify(visitData)), + '/chart/tags': Mock.mock({ + 'list|100': [{ name: '@city', 'value|1-100': 150 }], + }), +}; diff --git a/_mock/_file-manager.ts b/_mock/_file-manager.ts new file mode 100644 index 00000000..a2a835d7 --- /dev/null +++ b/_mock/_file-manager.ts @@ -0,0 +1,126 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { Random } from 'mockjs'; + +import { genMp } from './utils'; + +interface FileItem { + id?: number; + parent_id?: number; + type?: 'folder' | 'file'; + title?: string; + mp?: string; + ext?: string; + size?: number; + width?: number; + height?: number; + created?: Date; +} + +let point = 1; +let DATA: FileItem[] = []; +DATA = DATA.concat(...genFolds(0, 3), ...genFiles(1, 6), ...genFiles(2, 3), ...genFiles(0, 1, 'zip'), ...genFiles(0, 10)); + +function genFolds(parent_id: number, count: number): FileItem[] { + return new Array(count).fill({}).map(() => { + return { + id: point++, + parent_id, + type: 'folder', + ext: 'folder', + title: Random.ctitle(3, 5), + created: new Date() + } as FileItem; + }); +} + +function genFiles(parent_id: number, count: number, ext: string = 'png'): FileItem[] { + return new Array(count).fill({}).map(() => { + return { + id: point++, + parent_id, + type: 'file', + title: `${Random.ctitle(3, 5)}.${ext}`, + mp: genMp(), + is_img: ext === 'png', + ext, + size: Random.natural(10, 10000), + width: Random.natural(100, 1000), + height: Random.natural(100, 1000), + created: new Date() + } as FileItem; + }); +} + +function get(params: any): any { + let ret = deepCopy(DATA) as FileItem[]; + const parent_id = +(params.parent_id || '0'); + ret = ret.filter(data => data.parent_id === parent_id); + if (params.type) { + ret = ret.filter(data => data.type!.indexOf(params.type) > -1); + } + if (params.q) { + ret = ret.filter(data => data.title!.indexOf(params.q) > -1); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex(w => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const FILES = { + '/file/folder': () => deepCopy(DATA).filter((w: any) => w.type === 'folder'), + '/file': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps) + }; + }, + 'POST /file': (req: MockRequest) => { + const file = req.body.get('file') as File; + const parent_id = +req.body.get('parent_id'); + const item = Object.assign(genFiles(req.body.parent_id, 1)[0], { + parent_id, + title: file.name, + size: file.size + }); + DATA.push(item); + return { msg: 'ok', item }; + }, + '/file/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { ...DATA[idx], ...req.body }; + return item; + }, + 'POST /file/rename': (req: MockRequest) => { + const idx = getIdx(req.body.id || 0); + DATA[idx].title = req.body.title; + return { msg: 'ok', item: DATA[idx] }; + }, + 'POST /file/move': (req: MockRequest) => { + const idx = getIdx(req.body.id || 0); + DATA[idx].parent_id = req.body.moveId; + return { msg: 'ok', item: DATA[idx] }; + }, + 'POST /file/copy/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { ...DATA[idx], id: point++ }; + item.title += ' - Copy'; + DATA.push(item); + return { msg: 'ok', item }; + }, + 'DELETE /file/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + } +}; diff --git a/_mock/_forum.ts b/_mock/_forum.ts new file mode 100644 index 00000000..a44198f8 --- /dev/null +++ b/_mock/_forum.ts @@ -0,0 +1,258 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { Random } from 'mockjs'; +import { genLabel, genMp } from './utils'; + +let id = 1; +const CATEGORY = [ + { + id: 1, + title: 'General', + list: [ + { + id: 1, + title: 'Getting started', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + { + id: 2, + title: 'Announcements', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + { + id: 3, + title: 'Guides', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + ], + }, + { + id: 2, + title: 'Shopping', + list: [ + { + id: 4, + title: 'Guides', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + { + id: 5, + title: 'Payments', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + { + id: 6, + title: 'Products', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + { + id: 7, + title: 'Refund', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + ], + }, + { + id: 3, + title: 'Support', + list: [ + { + id: 8, + title: 'Common questions', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + }, + { + id: 9, + title: 'Site issues', + threads: Random.natural(1, 20), + replies: Random.natural(6, 100), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, + }, + ], + }, +]; + +const THREAD: any[] = new Array(20).fill({}).map((v, idx) => ({ + id: id++, + title: Random.title(5, 10), + replies: Random.natural(1, 1000), + label: idx % 2 === 0 && Random.boolean() ? genLabel() : null, + category_id: Random.natural(1, 9), + last: { + id: id++, + mp: genMp(), + title: Random.title(5, 10), + user_name: Random.name(), + time: '1d ago', + }, +})); + +const REPLIES: any[] = new Array(20).fill({}).map((v, idx) => ({ + id: id++, + content: Random.paragraph(), + user: { + name: Random.name(), + mp: genMp(), + posts: Random.natural(0, 1000), + }, + time: Random.time(), + like: Random.natural(0, 100), + dislike: Random.natural(0, 10), +})); + +function get(params: any): any { + let ret = deepCopy(THREAD); + if (params.q) { + ret = ret.filter((data: any) => data.name.indexOf(params.q) > -1); + } + return ret; +} + +function getIdx(itemId: number): number { + itemId = +itemId; + const idx = THREAD.findIndex((w) => w.id === itemId); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +function getCate(itemId: number): any { + let item: any; + const category: any = deepCopy(CATEGORY).find((w: any) => { + item = w.list.find((l: any) => l.id === itemId); + if (item) { + return true; + } + return false; + }); + delete category.list; + return item; +} + +export const FORUMS = { + '/forum/category': CATEGORY, + '/forum/thread/:id': (req: MockRequest) => { + // list + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + category: getCate(+req.params.id), + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps), + }; + }, + '/forum/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { + ...THREAD[idx], + time: '3 days ago', + like: Random.natural(0, 100), + view: Random.natural(0, 10000), + user: { + name: Random.name(), + mp: genMp(), + posts: Random.natural(0, 1000), + }, + desc: + '

' + + new Array(Random.natural(1, 3)) + .fill('') + .map((v) => Random.paragraph()) + .join('

') + + '

', + }; + item.category = getCate(item.category_id); + return item; + }, + '/forum/:id/replies': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + return { + total: REPLIES.length, + list: REPLIES.slice((pi - 1) * ps, pi * ps), + }; + }, + + 'POST /forum': (req: MockRequest) => { + const itemId = req.body.id || 0; + if (itemId > 0) { + const idx = getIdx(itemId); + THREAD[idx] = { ...THREAD[idx], ...req.body }; + return { msg: 'ok', item: THREAD[idx] }; + } + + const item = { ...req.body, id: THREAD.sort((a, b) => b.id - a.id)[0].id + 1 }; + THREAD.push(item); + return { msg: 'ok', item }; + }, + 'DELETE /forum/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + THREAD.splice(idx, 1); + return { msg: 'ok' }; + }, +}; diff --git a/_mock/_geo.ts b/_mock/_geo.ts new file mode 100644 index 00000000..f52cf882 --- /dev/null +++ b/_mock/_geo.ts @@ -0,0 +1,76 @@ +import { MockRequest } from '@delon/mock'; + +const DATA = [ + { + name: '上海', + id: '310000', + }, + { + name: '市辖区', + id: '310100', + }, + { + name: '北京', + id: '110000', + }, + { + name: '市辖区', + id: '110100', + }, + { + name: '浙江省', + id: '330000', + }, + { + name: '杭州市', + id: '330100', + }, + { + name: '宁波市', + id: '330200', + }, + { + name: '温州市', + id: '330300', + }, + { + name: '嘉兴市', + id: '330400', + }, + { + name: '湖州市', + id: '330500', + }, + { + name: '绍兴市', + id: '330600', + }, + { + name: '金华市', + id: '330700', + }, + { + name: '衢州市', + id: '330800', + }, + { + name: '舟山市', + id: '330900', + }, + { + name: '台州市', + id: '331000', + }, + { + name: '丽水市', + id: '331100', + }, +]; + +export const GEOS = { + '/geo/province': () => DATA.filter(w => w.id.endsWith('0000')), + '/geo/:id': (req: MockRequest) => { + const pid = (req.params.id || '310000').slice(0, 2); + return DATA.filter(w => w.id.slice(0, 2) === pid && !w.id.endsWith('0000')); + }, +}; diff --git a/_mock/_img.ts b/_mock/_img.ts new file mode 100644 index 00000000..2f8ff63a --- /dev/null +++ b/_mock/_img.ts @@ -0,0 +1,103 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { genMp } from './utils'; + +interface ImgCat { + id: number; + parent_id: number; + title: string; +} +interface Img { + cat_id: number; + id: number; + title: string; + mp: string; + size: number; + width: number; + height: number; + created: Date; +} + +const CAT: ImgCat[] = [ + { id: 1, parent_id: 0, title: '店铺' }, + { id: 2, parent_id: 1, title: '产品图' }, + { id: 3, parent_id: 1, title: '品牌图' }, + { id: 4, parent_id: 0, title: '营销' }, + { id: 5, parent_id: 4, title: '双11' }, + { id: 6, parent_id: 4, title: '日常' }, + { id: 7, parent_id: 0, title: '其他' }, +]; +const DATA: Img[] = []; + +for (let i = 1; i <= 50; i += 1) { + DATA.push(gen(i)); +} + +function gen(i: number): any { + return { + cat_id: [1, 2, 3, 4, 5, 6, 7][Math.floor(Math.random() * 10) % 7], + id: i * 10000, + title: `title ${i}`, + mp: genMp(), + size: Math.floor(Math.random() * 1000) % 1000, + width: Math.floor(Math.random() * 1000) % 1000, + height: Math.floor(Math.random() * 1000) % 1000, + created: new Date(), + }; +} + +function get(params: any): any { + let ret = deepCopy(DATA); + const cat_id = +(params.cat_id || '0'); + if (cat_id > 0) { + ret = ret.filter((data: any) => data.cat_id === cat_id); + } + if (params.q) { + ret = ret.filter((data: any) => data.title.indexOf(params.q) > -1); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const IMGS = { + '/img/cat': () => deepCopy(CAT), + '/img': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps), + }; + }, + 'POST /img': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + DATA[idx] = { ...DATA[idx], ...req.body }; + return { msg: 'ok', item: DATA[idx] }; + } + + const item = Object.assign(gen(DATA.sort((a, b) => b.id - a.id)[0].id + 1), req.body); + DATA.push(item); + return { msg: 'ok', item }; + }, + '/img/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { ...DATA[idx], ...req.body }; + return item; + }, + 'DELETE /img/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + }, +}; diff --git a/_mock/_log.ts b/_mock/_log.ts new file mode 100644 index 00000000..b65269b3 --- /dev/null +++ b/_mock/_log.ts @@ -0,0 +1,62 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; + +const DATA: any[] = []; + +for (let i = 1; i <= 20; i += 1) { + DATA.push({ + id: i, + name: 'cms', + level: ['error', 'warning', 'info'][Math.floor(Math.random() * 10) % 3], + path: `/home/${i}`, + title: `未知报告 ${i}`, + data: `Uncaught Error: test-${i}\nat :1:7\nat :1:7\nat :1:7`, + created: new Date(), + }); +} + +function getIdx(id: number): number { + const idx = DATA.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +function get(params: any): any { + let ret = deepCopy(DATA); + if (params.q) { + ret = ret.filter((data: any) => data.title.indexOf(params.q) > -1); + } + if (params.level) { + ret = ret.filter((data: any) => data.level.indexOf(params.level) > -1); + } + return ret; +} + +function del(params: any): any { + const id = params.id || 0; + if (id > 0) { + DATA.splice(getIdx(id), 1); + } else { + get(params).forEach((w: any) => { + del({ id: w.id }); + }); + } +} + +export const LOGS = { + '/log': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps), + }; + }, + 'DELETE /log': (req: MockRequest) => { + del(req.queryString); + return { msg: 'ok' }; + }, +}; diff --git a/_mock/_menu.ts b/_mock/_menu.ts new file mode 100644 index 00000000..a3818413 --- /dev/null +++ b/_mock/_menu.ts @@ -0,0 +1,109 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { Menu } from '@delon/theme'; +import { deepCopy } from '@delon/util'; + +const DATA: Menu[] = [ + { + id: 1, + parent_id: 0, + text: '主导航', + i18n: 'menu.main', + group: true, + hideInBreadcrumb: true, + }, + { + id: 2, + parent_id: 1, + text: '仪表盘', + i18n: 'menu.dashboard', + icon: 'dashboard', + }, + { + id: 3, + parent_id: 2, + text: '分析页', + link: '/dashboard/analysis', + i18n: 'menu.dashboard.analysis', + }, + { + id: 4, + parent_id: 2, + text: '监控页', + link: '/dashboard/monitor', + i18n: 'menu.dashboard.monitor', + }, + { + id: 5, + parent_id: 2, + text: '工作台', + link: '/dashboard/workplace', + i18n: 'menu.dashboard.workplace', + }, + { + id: 6, + parent_id: 0, + text: 'Pro', + i18n: 'menu.pro', + group: true, + hideInBreadcrumb: true, + }, + { + id: 7, + parent_id: 6, + text: 'Form Page', + i18n: 'menu.form', + link: '/pro/form', + icon: 'anticon anticon-edit', + hideInBreadcrumb: true, + }, + { + id: 8, + parent_id: 6, + text: 'Basic Form', + link: '/pro/form/basic-form', + i18n: 'menu.form.basicform', + shortcut: true, + }, + { + id: 9, + parent_id: 6, + text: 'Step Form', + link: '/pro/form/step-form', + i18n: 'menu.form.stepform', + }, +]; + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const MENUS = { + '/menus': () => deepCopy(DATA), + 'POST /menus': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + DATA[idx] = { ...DATA[idx], ...req.body }; + return { msg: 'ok', item: DATA[idx] }; + } + + const item = { ...req.body, id: DATA.sort((a, b) => b.id - a.id)[0].id + 1 }; + DATA.push(item); + return { msg: 'ok', item }; + }, + 'DELETE /menus/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + }, + 'POST /menus/move': (req: MockRequest) => { + const idx = getIdx(req.body.from || 0); + DATA[idx].parent_id = req.body.to || 0; + return { msg: 'ok', item: DATA[idx] }; + }, +}; diff --git a/_mock/_other.ts b/_mock/_other.ts new file mode 100644 index 00000000..bb99bc87 --- /dev/null +++ b/_mock/_other.ts @@ -0,0 +1,917 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import format from 'date-fns/format'; +import getDaysInMonth from 'date-fns/getDaysInMonth'; +import startOfMonth from 'date-fns/startOfMonth'; +import { Random } from 'mockjs'; + +import { genArr, genBigMp, genColorName, genData, genLabel, genMp, genName, genTag } from './utils'; + +let ID = 1; +const DATA: any = { + kanban: null, + task: null, + email: null, + project: null, + client: null, + contact: null, + pricing: null, + billing: null, + course: null, + chat: null, + gallery: null, + article: null, + voting: null, + invoice: null, + faq: null, + calendar: null, + quick: null, + dd: null +}; + +function getIdx(type: string, id: number): number { + id = +id; + const idx = DATA[type].findIndex((w: any) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +function save(type: string, body: any): any { + const id = body.id || 0; + if (id > 0) { + const idx = getIdx(type, id); + DATA[type][idx] = { ...DATA[type][idx], ...body }; + return { msg: 'ok', item: DATA[type][idx], type: 'edit' }; + } + + const item = { ...body, id: DATA[type].sort((a: any, b: any) => b.id - a.id)[0].id + 1 }; + (DATA[type] as any[]).splice(0, 0, item); + return { msg: 'ok', item, type: 'add' }; +} + +function del(type: string, p: any): any { + const cid = +(p.cid || '0'); + let list: any[] = DATA[type]; + if (cid > 0) { + list = DATA[type].find((w: any) => w.id === cid).list; + } + + const idx = list.findIndex(w => w.id === p.id); + list.splice(idx, 1); + return { msg: 'ok' }; +} + +function genHtml(): string { + return `

${new Array(Random.natural(1, 3)) + .fill('') + .map(v => Random.sentence()) + .join('

')}

`; +} + +function attachements(): any { + return new Array(Random.natural(2, 6)).fill({}).map((v, idx) => { + const item = { + url: Random.url(), + type: genArr(['jpg', 'zip', 'pdf']), + filename: Random.name(false), + size: genArr(['100KB', '980KB', '1.56MB']) + }; + if (item.type === 'jpg') { + item.url = genBigMp(); + } + return item; + }); +} + +function genPage(type: string, queryString: any, qField: string = 'name'): any { + const pi = +(queryString.pi || 1); + const ps = +(queryString.ps || 10); + // data + let data = deepCopy(DATA[type]); + if (queryString.q) { + data = data.filter((data: any) => data[qField].indexOf(queryString.q) > -1); + } + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps) + }; +} + +// #region kanban + +function kanbanList(): any { + if (DATA.kanban) { + return DATA.kanban; + } + const res: any[] = [ + { + id: 1, + title: 'To Do', + list: [], + color: '#fadb14', + icon: 'warning' + }, + { id: 2, title: 'In progress', color: '#1890ff', icon: 'tool', list: [] }, + { id: 3, title: 'Done', color: '#52c41a', icon: 'check-circle', list: [] }, + { id: 4, title: 'Gone', color: '#f5222d', icon: 'delete', list: [] } + ]; + for (const i of res) { + i.list = new Array(Random.natural(2, 6)).fill({}).map((v, idx) => ({ + id: idx + 1, + title: Random.ctitle(3, 4), + content: Random.ctitle(0, 50), + attachement: Random.boolean() && Random.boolean() && Random.boolean() + })); + } + // new + if (res[0].list.length > 0) { + res[0].list[Random.natural(0, res[0].list.length - 1)].label = { + color: 'green', + text: 'Clients' + }; + } + if (res[1].list.length > 0) { + res[1].list[Random.natural(0, res[1].list.length - 1)].label = { + color: 'red', + text: 'Important' + }; + } + if (res[2].list.length > 0) { + res[2].list[Random.natural(0, res[2].list.length - 1)].label = { + color: 'blue', + text: 'Other' + }; + } + // labels + DATA.kanban = res; + return res; +} + +// #endregion + +// #region task + +function taskList(): any { + if (DATA.task) { + return DATA.task; + } + const res: any[] = [ + { id: 1, title: 'Today', list: [] }, + { id: 2, title: 'Tomorrow', list: [] }, + { id: 3, title: 'Next week', list: [] } + ]; + for (const i of res) { + i.list = new Array(Random.natural(2, 8)).fill({}).map((v, idx) => ({ + id: idx + 1, + title: Random.ctitle(3, 16), + due: i.id === 1 && Random.boolean() ? `${Random.natural(1, 59)} ${Random.boolean() ? 'mins' : 'hours'} left` : null + })); + } + // new + if (res[0].list.length > 0) { + res[0].list[Random.natural(0, res[0].list.length - 1)].label = { + color: 'green', + text: 'Clients' + }; + } + if (res[1].list.length > 0) { + res[1].list[Random.natural(0, res[1].list.length - 1)].label = { + color: 'red', + text: 'Important' + }; + res[0].list[Random.natural(0, res[0].list.length - 1)].done = true; + } + if (res[2].list.length > 0) { + res[2].list[Random.natural(0, res[2].list.length - 1)].label = { + color: 'blue', + text: 'Other' + }; + res[0].list[Random.natural(0, res[0].list.length - 1)].done = true; + } + // labels + DATA.task = res; + return res; +} + +// #endregion + +// #region email + +function emailList(queryString: any): any { + if (DATA.email) { + return genPage('email', queryString, 'subject'); + } + const res: any[] = new Array(20).fill({}).map((v, idx) => ({ + id: ID++, + from: Random.email(), + from_name: genName(), + to: Random.email(), + to_name: Random.name(), + cc: [Random.email(), Random.email()], + subject: Random.title(1, 6), + body: Random.paragraph(), + read: idx % 2 === 0 && Random.boolean(), + star: Random.boolean(), + label: genLabel(), + attach: idx % 3 === 0 && Random.boolean(), + time: `1${Random.boolean() ? 'h' : 'd'} ago` + })); + // labels + DATA.email = res; + return genPage('email', queryString, 'subject'); +} + +function emailGet(id: number): any { + const idx = getIdx('email', id || 0); + const item = { ...DATA.email[idx], mp: genMp(), desc: genHtml(), attachements: attachements() }; + return item; +} +// #endregion + +// #region project + +function projectList(): any { + if (DATA.project) { + return DATA.project; + } + const res: any[] = new Array(5).fill({}).map((v, idx) => ({ + id: idx + 1, + title: genArr(['UI update', 'Web Design', 'Pro Design', 'Ng Alain', 'Delon', 'SEO']), + status: idx % 2 ? genArr(['active', 'pending', 'complete']) : 'active', + task: { + process: Random.natural(1, 100), + opened: Random.natural(1, 100), + completed: Random.natural(1, 100) + }, + remark: Random.title(5, 10), + created: Random.date(), + deadline: Random.date(), + tean: new Array(Random.natural(1, 6)).fill({}).map(() => ({ + name: genName(), + mp: genMp() + })), + leaders: new Array(Random.natural(1, 2)).fill({}).map(() => ({ + name: genName(), + mp: genMp() + })), + participants: new Array(Random.natural(1, 6)).fill({}).map(() => ({ + name: Random.name(), + mp: genMp() + })) + })); + // labels + DATA.project = res; + return res; +} + +function projectGet(id: number): any { + const idx = getIdx('project', id || 0); + const item = { + ...DATA.project[idx], + user_name: genName(), + desc: genHtml(), + attachements: attachements(), + tasks: DATA.task, + discussions: new Array(Random.natural(3, 8)).fill({}).map((v, idx) => ({ + id: idx + 1, + user_avatar: genMp(), + user_name: genName(), + time: Random.datetime(), + content: Random.paragraph(1, 1) + })), + activities: new Array(Random.natural(3, 12)).fill({}).map((v, idx) => ({ + id: idx + 1, + user_avatar: genMp(), + user_name: genName(), + time: Random.datetime(), + type: idx % 2 === 0 ? genArr(['add', 'completed', 'assigned']) : 'push', + commit: Random.natural(10000, 99999), + assigne_name: Random.name(), + message: Random.title() + })) + }; + return item; +} + +// #endregion + +// #region billing + +function billingList(queryString: any): any { + if (DATA.billing) { + return genPage('billing', queryString, 'client'); + } + const res: any[] = new Array(11).fill({}).map((v, idx) => ({ + id: idx + 1, + order: `FR0${Random.natural(10, 99)}`, + client: genArr(['Google', 'Alibaba', 'Tencent']), + fee: Random.float(0, 9.0), + amount: Random.float(0.1, 99999.0), + date: Random.now('day'), + status: idx % 2 ? genArr(['Completed', 'Pending', 'Rejected']) : 'Completed', + auth_code: Random.natural(100000000), + address: (Random as any).county(true), + first_name: Random.first(), + last_name: Random.last(), + country: 'China' + })); + // labels + DATA.billing = res; + return genPage('billing', queryString, 'client'); +} + +function billingGet(id: number): any { + const idx = getIdx('billing', id || 0); + const item = { + ...DATA.billing[idx], + messages: new Array(Random.natural(0, 5)).fill({}).map((v, idx) => ({ + id: idx + 1, + time: `${Random.natural(1, 6)} day ago`, + message: Random.paragraph(1, 1) + })) + }; + return item; +} + +// #endregion + +// #region contact + +function contactList(queryString: any): any { + if (DATA.contact) { + return genPage('contact', queryString, 'contact'); + } + const res: any[] = new Array(11).fill({}).map((v, idx) => ({ + id: idx + 1, + mp: genMp(), + name: genName(), + user_name: Random.name(false), + company: Random.title(1, 3), + email: Random.email(), + tel: Random.natural(10000000000, 16000000000) + })); + // labels + DATA.contact = res; + return genPage('contact', queryString, 'company'); +} + +// #endregion + +// #region pricing + +function pricingList(): any { + if (DATA.pricing) { + return DATA.pricing; + } + const res: any = { + prices: [ + { + id: 1, + title: 'Basic', + icon: 'shop', + mo: 12, + yr: 12 * 12, + user: 5, + project: 5, + space: '100GB' + }, + { + id: 2, + title: 'Company', + icon: 'bank', + mo: 25, + yr: 25 * 12, + user: 30, + project: 150, + space: '300GB' + }, + { + id: 3, + title: 'Enterprise', + icon: 'crown', + mo: 50, + yr: 50 * 12, + user: -1, + project: -1, + space: '1000GB' + } + ], + faq: [ + { + q: 'Can I cancel at anytime?', + a: 'Yes, you can cancel anytime no questions are asked while you cancel but we would highly appreciate if you will give us some feedback.' + }, + { + q: 'My team has credits. How do we use them?', + a: 'Once your team signs up for a subscription plan. enim eiusmod high life accusamus eoset dignissimos.' + }, + { + q: `How does Front's pricing work?`, + a: 'Our subscriptions are tiered. based on the number of people enim eiusmod high life accusamus terry richardson ad squid.' + }, + { + q: 'How secure is Front?', + a: 'Protecting the data you trust to Front is our first priority. at vero eoset dignissimos ducimus qui blanditiis.' + }, + { + q: 'Do you offer discounts?', + a: `We've built in discounts at each tier for teams. leggings occaecat craft beer farm-to-table. raw denim aesthetic synth nesciunt.` + }, + { + q: 'What is your refund policy?', + a: 'We do not offer refunds apart leggings occaecat craft beer farm-to-table. raw leggings occaecat craft.' + } + ] + }; + // labels + DATA.pricing = res; + return res; +} + +// #endregion + +// #region client + +function clientList(queryString: any): any { + if (DATA.client) { + return genPage('client', queryString, 'company'); + } + const res: any[] = new Array(11).fill({}).map((v, idx) => ({ + id: idx + 1, + mp: genMp(), + name: genName(), + user_name: Random.name(false), + company: Random.title(1, 3), + email: Random.email(), + tel: Random.natural(10000000000, 16000000000), + status: idx % 2 ? genArr(['active', 'pending', 'progress']) : 'active' + })); + // labels + DATA.client = res; + return genPage('client', queryString, 'company'); +} + +function clientGet(id: number): any { + const idx = getIdx('client', id || 0); + const item = { + ...DATA.client[idx], + messages: new Array(Random.natural(0, 5)).fill({}).map((v, idx) => ({ + id: idx + 1, + time: `${Random.natural(1, 6)} day ago`, + message: Random.paragraph(1, 1) + })) + }; + return item; +} + +// #endregion + +// #region course + +function courseList(queryString: any): any { + if (DATA.course) { + return genPage('course', queryString, 'title'); + } + const res: any[] = new Array(10).fill({}).map((v, idx) => ({ + id: idx + 1, + mp: genBigMp(), + tags: genTag(), + price: idx === 0 ? 0 : Random.natural(0, 100), + title: Random.title(2, 5), + remark: Random.paragraph(1, 1), + star: genArr([4, 4.5, 5]), + hour: Random.natural(10, 99) + })); + // labels + DATA.course = res; + return genPage('course', queryString, 'title'); +} + +// #endregion + +// #region chat + +function chatList(): any { + if (DATA.chat) { + return DATA.chat; + } + const res: any = { + users: new Array(10).fill({}).map((v, idx) => ({ + id: idx + 1, + mp: genMp(), + name: genName(), + count: idx % 3 === 0 ? Random.natural(0, 5) : 0, + online: idx < 5 ? true : false, + unread: Random.boolean() && Random.boolean() ? Random.natural(0, 5) : 0 + })) + }; + // labels + DATA.chat = res; + return res; +} + +// #endregion + +// #region gallery + +function galleryList(): any { + if (DATA.gallery) { + return DATA.gallery; + } + const res: any = new Array(16).fill({}).map((v, idx) => ({ + id: idx + 1, + url: genBigMp(), + title: Random.title(), + type: genArr(['Nature', 'Beach', 'Animal', 'Other']) + })); + // labels + DATA.gallery = res; + return res; +} + +// #endregion + +// #region article + +function articleList(queryString: any): any { + if (DATA.article) { + return genPage('article', queryString, 'title'); + } + const res: any[] = new Array(11).fill({}).map((v, idx) => ({ + id: idx + 1, + mp: genMp(), + name: genName(), + title: Random.ctitle(), + likes: Random.natural(0, 1000), + comments: Random.natural(0, 1000), + created: Random.now('day'), + status: idx % 2 ? genArr(['Published', 'Draft', 'Deleted']) : 'Published' + })); + // labels + DATA.article = res; + return genPage('article', queryString, 'title'); +} + +function articleGet(id: number): any { + const idx = getIdx('article', id || 0); + const item = { ...DATA.article[idx] }; + return item; +} + +// #endregion + +// #region voting + +function votingList(queryString: any): any { + if (DATA.voting) { + return genPage('voting', queryString, 'title'); + } + const res: any[] = new Array(11).fill({}).map((v, idx) => ({ + id: idx + 1, + voting: Random.integer(-10, 10000), + title: Random.title(5, 10), + content: Random.paragraph(), + likes: Random.natural(0, 1000), + created: Random.now('day') + })); + // labels + DATA.voting = res; + return genPage('voting', queryString, 'title'); +} + +function votingSave(req: any): any { + const idx = getIdx('voting', req.id || 0); + DATA.voting[idx].value += req.voting; + return { msg: 'ok', item: DATA.voting[idx] }; +} + +// #endregion + +// #region voting + +function invoice(): any { + if (DATA.invoice) { + return deepCopy(DATA.invoice); + } + const res: any = { + id: Random.integer(10000, 99999), + zone: 'Mountain View, CA 94043 United States', + address: '1600 Amphitheatre Parkway', + tel: '15900000000, +86 (021) 99999999', + date: genData(0), + to: { + company: 'XXX Company LTD', + zone: 'Mountain View, CA 94043 United States', + address: '1600 Amphitheatre Parkway', + tel: '15900000000, +86 (021) 99999999', + email: 'cipchk@qq.com' + }, + payment: { + total: 0, + bank: 'XXXX Bank', + country: 'China', + city: 'Shang Hai', + address: 'xxx xxxx', + code: '012384' + }, + wares: [ + { + id: 1, + title: Random.title(), + remark: Random.title(), + price: +Random.float(0.1, 999).toFixed(2), + num: +Random.natural(1, 10) + }, + { + id: 2, + title: Random.title(), + remark: Random.title(), + price: +Random.float(0.1, 999).toFixed(2), + num: +Random.natural(1, 10) + } + ], + note: Random.paragraph() + }; + // total + res.wares.forEach((i: any) => { + i.total = +(i.price * i.num).toFixed(2); + }); + res.tax_rate = 0.2; + res.total = +(res.wares as any[]).reduce((a, b) => (a += b.total), 0).toFixed(2); + res.tax = +(res.total * 0.2).toFixed(2); + res.payment_total = +(res.total + res.tax).toFixed(2); + DATA.invoice = res; + + return deepCopy(DATA.invoice); +} + +// #endregion + +// #region faq + +function faq(): any { + if (DATA.faq) { + return deepCopy(DATA.faq); + } + DATA.faq = new Array(6).fill({}).map((v, idx) => ({ + title: `Knowledge ${idx + 1}`, + icon: 'question-circle', + primary: idx < 3, + remark: 'The list of FAQ', + children: new Array(Random.natural(3, 6)).fill({}).map((v, idx) => ({ + active: idx === 0, + q: 'What is a product key?', + a: genHtml() + })) + })); + + return deepCopy(DATA.faq); +} + +// #endregion + +// #region calendar + +function calendar(req: any): any { + const cur = new Date(+req.time || new Date()); + const startDate = startOfMonth(cur); + const max = getDaysInMonth(cur); + const start = format(startDate, 'yyyy-MM'); + const now = format(new Date(), 'yyyy-MM-dd'); + return [ + { + id: 1, + title: 'All Day Event', + start: `${start}-1`, + className: 'fc-event-danger fc-event-fill-warning' + }, + { + id: 2, + title: 'Reporting', + start: `${start}-7T13:30:00`, + end: `${start}-7`, + className: 'fc-event-success' + }, + { + id: 3, + title: 'Company Trip', + start: `${start}-12`, + end: `${start}-14`, + className: 'fc-event-primary' + }, + { + id: 4, + title: 'Product Release', + start: `${start}-3`, + end: `${start}-5`, + className: 'fc-event-light fc-event-fill-primary' + }, + { + id: 5, + title: 'Repeating Event', + start: `${start}-09T16:00:00`, + className: 'fc-event-purple' + }, + { id: 6, title: 'Repeating Event', start: `${start}-11T16:00:00` }, + { + id: 7, + title: 'Meeting', + start: `${now}T10:00:00`, + end: `${now}T11:30:00` + }, + { id: 8, title: 'Lunch', start: `${now}T12:00:00` }, + { + id: 9, + title: 'Meeting', + start: `${now}T14:00:00`, + className: 'fc-event-warning' + }, + { + id: 10, + title: 'Happy Hour', + start: `${now}T17:30:00`, + className: 'fc-event-success' + }, + { + id: 11, + title: 'Dinner', + start: `${now}T18:30:00`, + className: 'fc-event-fill-danger fc-event-light' + }, + { + id: 12, + title: 'Birthday Party', + start: `${now}T21:00:00`, + className: 'fc-event-primary' + }, + { + id: 13, + title: 'Click for Ng Alain', + url: 'https://ng-alain.com', + start: `${start}-27`, + className: 'fc-event-fill-success fc-event-light' + }, + { + id: 14, + title: 'Repeating Event', + start: `${start}-09T08:00:00`, + className: 'fc-event-magenta' + } + ]; +} + +// #endregion + +// #region quick + +function quick(): any { + if (DATA.quick) { + return deepCopy(DATA.quick); + } + DATA.quick = { + notifications: new Array(6).fill({}).map(() => ({ + dot: genArr([ + { icon: 'warning', bg: 'error' }, + { icon: 'pie-chart', bg: 'primary' }, + { icon: 'message', bg: 'success' }, + { icon: 'bell', bg: 'cyan' } + ]), + content: Random.title(5, 15), + time: genArr(['01:01 PM', '09:00 AM', '18:56']), + tags: genTag().join(',') + })), + actions: new Array(6).fill({}).map(() => ({ + bg: genColorName(), + title: Random.title(2, 3), + content: Random.title(5, 15) + })), + settings: { + notification: true, + audit_log: false, + new_order: false, + tracking_order: false, + reports_order: true, + new_customer: true, + reporting_customer: true + } + }; + + return deepCopy(DATA.quick); +} + +// #endregion + +// #region dd + +function ddList(): any { + if (DATA.dd) { + return DATA.dd; + } + DATA.dd = [ + { + name: 'total-sales', + title: '总数-总销售额', + enabled: true, + params: { title: '总销售额', total: 100, week: 10, day: 11, daySales: 1000 } + }, + { + name: 'total-sales', + title: '总数-总订单量', + enabled: false, + params: { title: '总订单量', total: 5500, week: 320, day: 5, daySales: 5422 } + }, + { + name: 'total-sales', + title: '总数-总用户量', + enabled: false, + params: { title: '总用户量', total: 500, week: 80, day: 23, daySales: 6666 } + }, + { + name: 'total-sales', + title: '总数-其他', + enabled: false, + params: { title: '其他', total: 200, week: 80, day: 23, daySales: 77777 } + }, + { + name: 'visits', + title: '访问量', + enabled: true, + params: { url: '/chart' } + }, + { + name: 'effect', + title: '访问量', + enabled: true, + params: { percent: 66, week: 11, day: 23 } + }, + { + name: 'gauge', + title: '核销率', + enabled: true + }, + { + name: 'radar', + title: '指数', + enabled: true, + params: { title: '贡献指数', url: '/chart' } + }, + { + name: 'activities', + title: '动态', + enabled: true, + params: { title: '动态', url: '/api/activities' } + } + ]; + return DATA.dd; +} + +function ddSave(req: any): any { + DATA.dd = req; + return { msg: 'ok' }; +} + +// #endregion + +export const OTHERS = { + '/kanban-board': kanbanList(), + 'DELETE /kanban-board': (req: MockRequest) => del('kanban', req.queryString), + '/task': taskList(), + 'DELETE /task': (req: MockRequest) => del('task', req.queryString), + '/email': (req: MockRequest) => emailList(req.queryString), + '/email/:id': (req: MockRequest) => emailGet(+req.params.id), + 'DELETE /email': (req: MockRequest) => del('email', req.queryString), + '/project': projectList(), + '/project/:id': (req: MockRequest) => projectGet(+req.params.id), + 'DELETE /project': (req: MockRequest) => del('project', req.queryString), + '/client': (req: MockRequest) => clientList(req.queryString), + '/client/:id': (req: MockRequest) => clientGet(+req.params.id), + '/contact': (req: MockRequest) => contactList(req.queryString), + 'DELETE /contact': (req: MockRequest) => del('contact', req.queryString), + '/pricing': () => pricingList(), + '/billing': (req: MockRequest) => billingList(req.queryString), + '/course': (req: MockRequest) => courseList(req.queryString), + '/chat': () => chatList(), + '/chat/message': () => { + const item: any = { + type: Random.boolean() && Random.boolean() ? 'image' : 'text', + dir: Random.boolean() ? 'left' : 'right' + }; + item.msg = item.type === 'text' ? Random.paragraph(1, 1) : genBigMp(); + return item; + }, + '/gallery': () => galleryList(), + '/article': (req: MockRequest) => articleList(req.queryString), + '/article/:id': (req: MockRequest) => articleGet(+req.params.id), + 'DELETE /article': (req: MockRequest) => del('article', req.queryString), + 'POST /article': (req: MockRequest) => save('article', req.body), + '/voting': (req: MockRequest) => votingList(req.queryString), + 'POST /voting': (req: MockRequest) => votingSave(req.body), + '/invoice': () => invoice(), + '/faq': () => faq(), + '/calendar': (req: MockRequest) => calendar(req.queryString), + '/quick': () => quick(), + '/dd': () => ddList(), + 'POST /dd': (req: MockRequest) => ddSave(req.body) +}; diff --git a/_mock/_permission.ts b/_mock/_permission.ts new file mode 100644 index 00000000..be8b61cb --- /dev/null +++ b/_mock/_permission.ts @@ -0,0 +1,58 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; + +interface Permission { + id: number; + parent_id: number; + text: string; +} + +export const PermissionData: Permission[] = [ + { id: 1, parent_id: 0, text: '超级权限' }, + { id: 2, parent_id: 0, text: '系统' }, + { id: 3, parent_id: 2, text: '员工' }, + { id: 4, parent_id: 2, text: '菜单' }, + { id: 5, parent_id: 2, text: '权限' }, + { id: 6, parent_id: 0, text: '订单' }, + { id: 7, parent_id: 6, text: '列表' }, + { id: 8, parent_id: 6, text: '导入订单' }, + { id: 9, parent_id: 6, text: '打印快递单' }, + { id: 10, parent_id: 9, text: '批量打印' }, + { id: 11, parent_id: 6, text: '发货' }, + { id: 12, parent_id: 11, text: '批量发货' }, +]; + +function getIdx(id: number): number { + id = +id; + const idx = PermissionData.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const PERMISSION = { + '/permission': () => deepCopy(PermissionData), + 'POST /permission': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + PermissionData[idx] = { ...PermissionData[idx], ...req.body }; + return { msg: 'ok', item: PermissionData[idx] }; + } + + const item = { ...req.body, id: PermissionData.sort((a, b) => b.id - a.id)[0].id + 1 }; + PermissionData.push(item); + return { msg: 'ok', item }; + }, + 'DELETE /permission/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + PermissionData.splice(idx, 1); + return { msg: 'ok' }; + }, + 'POST /permission/move': (req: MockRequest) => { + const idx = getIdx(req.body.from || 0); + PermissionData[idx].parent_id = req.body.to || 0; + return { msg: 'ok', item: PermissionData[idx] }; + }, +}; diff --git a/_mock/_pois.ts b/_mock/_pois.ts new file mode 100644 index 00000000..ad4c9b01 --- /dev/null +++ b/_mock/_pois.ts @@ -0,0 +1,61 @@ +export const POIS = { + '/pois': { + total: 2, + list: [ + { + id: 10000, + user_id: 1, + name: '测试品牌', + branch_name: '测试分店', + geo: 310105, + country: '中国', + province: '上海', + city: '上海市', + district: '长宁区', + address: '中山公园', + tel: '15900000000', + categories: '美食,粤菜,湛江菜', + lng: 121.41707989151003, + lat: 31.218656214644792, + recommend: '推荐品', + special: '特色服务', + introduction: '商户简介', + open_time: '营业时间', + avg_price: 260, + reason: null, + status: 1, + status_str: '待审核', + status_wx: 1, + modified: 1505826527288, + created: 1505826527288, + }, + { + id: 10001, + user_id: 2, + name: '测试品牌2', + branch_name: '测试分店2', + geo: 310105, + country: '中国', + province: '上海', + city: '上海市', + district: '长宁区', + address: '中山公园', + tel: '15900000000', + categories: '美食,粤菜,湛江菜', + lng: 121.41707989151003, + lat: 31.218656214644792, + recommend: '推荐品', + special: '特色服务', + introduction: '商户简介', + open_time: '营业时间', + avg_price: 260, + reason: null, + status: 1, + status_str: '待审核', + status_wx: 1, + modified: 1505826527288, + created: 1505826527288, + }, + ], + }, +}; diff --git a/_mock/_profile.ts b/_mock/_profile.ts new file mode 100644 index 00000000..888f5573 --- /dev/null +++ b/_mock/_profile.ts @@ -0,0 +1,152 @@ +const basicGoods = [ + { + id: '1234561', + name: '矿泉水 550ml', + barcode: '12421432143214321', + price: '2.00', + num: '1', + amount: '2.00', + }, + { + id: '1234562', + name: '凉茶 300ml', + barcode: '12421432143214322', + price: '3.00', + num: '2', + amount: '6.00', + }, + { + id: '1234563', + name: '好吃的薯片', + barcode: '12421432143214323', + price: '7.00', + num: '4', + amount: '28.00', + }, + { + id: '1234564', + name: '特别好吃的蛋卷', + barcode: '12421432143214324', + price: '8.50', + num: '3', + amount: '25.50', + }, +]; + +const basicProgress = [ + { + key: '1', + time: '2017-10-01 14:10', + rate: '联系客户', + status: 'processing', + operator: '取货员 ID1234', + cost: '5mins', + }, + { + key: '2', + time: '2017-10-01 14:05', + rate: '取货员出发', + status: 'success', + operator: '取货员 ID1234', + cost: '1h', + }, + { + key: '3', + time: '2017-10-01 13:05', + rate: '取货员接单', + status: 'success', + operator: '取货员 ID1234', + cost: '5mins', + }, + { + key: '4', + time: '2017-10-01 13:00', + rate: '申请审批通过', + status: 'success', + operator: '系统', + cost: '1h', + }, + { + key: '5', + time: '2017-10-01 12:00', + rate: '发起退货申请', + status: 'success', + operator: '用户', + cost: '5mins', + }, +]; + +const advancedOperation1 = [ + { + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, + { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + memo: '不通过原因', + }, + { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, + { + key: 'op4', + type: '提交订单', + name: '林东东', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '很棒', + }, + { + key: 'op5', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +const advancedOperation2 = [ + { + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +const advancedOperation3 = [ + { + key: 'op1', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +export const PROFILES = { + 'GET /profile/progress': basicProgress, + 'GET /profile/goods': basicGoods, + 'GET /profile/advanced': { + advancedOperation1, + advancedOperation2, + advancedOperation3, + }, +}; diff --git a/_mock/_role.ts b/_mock/_role.ts new file mode 100644 index 00000000..84afc1e4 --- /dev/null +++ b/_mock/_role.ts @@ -0,0 +1,73 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; + +interface Permission { + id: number; + parent_id: number; + text: string; + permission: number[]; +} + +export const RuleData: Permission[] = [ + { id: 1, parent_id: 0, text: '管理', permission: [1] }, + { id: 2, parent_id: 0, text: '仓储', permission: [] }, + { id: 3, parent_id: 0, text: '营销', permission: [] }, + { id: 4, parent_id: 0, text: '第三方', permission: [7] }, + { + id: 5, + parent_id: 2, + text: '仓储经理', + permission: [6, 7, 8, 9, 10, 11, 12], + }, + { id: 6, parent_id: 2, text: '出库员', permission: [6, 7, 9, 10, 11, 12] }, + { id: 7, parent_id: 2, text: '入库员', permission: [6, 7] }, + { id: 8, parent_id: 3, text: '市场经理', permission: [6, 7] }, + { id: 9, parent_id: 3, text: '销售人员', permission: [6, 7] }, +]; + +function get(params: any): any { + let ret = deepCopy(RuleData); + if (params.q) { + ret = ret.filter((data: any) => data.text.indexOf(params.q) > -1); + } + const p = +(params.permission || '0'); + if (p > 0) { + ret = ret.filter((data: any) => data.permission.includes(p)); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = RuleData.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const ROLES_PRO = { + '/role': (req: MockRequest) => get(req.queryString), + 'POST /role': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + RuleData[idx] = { ...RuleData[idx], ...req.body }; + return { msg: 'ok', item: RuleData[idx] }; + } + + const item = { ...req.body, id: RuleData.sort((a, b) => b.id - a.id)[0].id + 1 }; + RuleData.push(item); + return { msg: 'ok', item }; + }, + 'DELETE /role/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + RuleData.splice(idx, 1); + return { msg: 'ok' }; + }, + 'POST /role/move': (req: MockRequest) => { + const idx = getIdx(req.body.from || 0); + RuleData[idx].parent_id = req.body.to || 0; + return { msg: 'ok', item: RuleData[idx] }; + }, +}; diff --git a/_mock/_rule.ts b/_mock/_rule.ts new file mode 100644 index 00000000..4a145ba3 --- /dev/null +++ b/_mock/_rule.ts @@ -0,0 +1,83 @@ +import { HttpRequest } from '@angular/common/http'; +import { MockRequest } from '@delon/mock'; + +const list: any[] = []; + +for (let i = 0; i < 46; i += 1) { + list.push({ + key: i, + disabled: i % 6 === 0, + href: 'https://ant.design', + avatar: [ + 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png' + ][i % 2], + no: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + description: '这是一段描述', + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 4, + updatedAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`), + createdAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`), + progress: Math.ceil(Math.random() * 100) + }); +} + +function getRule(params: any): any { + let ret = [...list]; + if (params.sorter) { + const s = params.sorter.split('_'); + ret = ret.sort((prev, next) => { + if (s[1] === 'descend') { + return next[s[0]] - prev[s[0]]; + } + return prev[s[0]] - next[s[0]]; + }); + } + if (params.statusList && params.statusList.length > 0) { + ret = ret.filter(data => params.statusList.indexOf(data.status) > -1); + } + if (params.no) { + ret = ret.filter(data => data.no.indexOf(params.no) > -1); + } + return { data: { records: ret, total: ret.length }, success: true }; +} + +function removeRule(nos: string): any { + nos.split(',').forEach(no => { + const idx = list.findIndex(w => w.no === no); + if (idx !== -1) { + list.splice(idx, 1); + } + }); + + return { data: true, success: true }; +} + +function saveRule(description: string): void { + const i = Math.ceil(Math.random() * 10000); + list.unshift({ + key: i, + href: 'https://ant.design', + avatar: [ + 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png' + ][i % 2], + no: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + description, + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 2, + updatedAt: new Date(), + createdAt: new Date(), + progress: Math.ceil(Math.random() * 100) + }); +} + +export const RULES = { + 'POST /rule': (req: MockRequest) => getRule(req.queryString), + 'POST /delete/rule': (req: MockRequest) => removeRule(req.body.nos) + // 'POST /rule': (req: MockRequest) => saveRule(req.body.description) +}; diff --git a/_mock/_trade.ts b/_mock/_trade.ts new file mode 100644 index 00000000..6290e476 --- /dev/null +++ b/_mock/_trade.ts @@ -0,0 +1,172 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { Random } from 'mockjs'; + +import { genMp, genName } from './utils'; + +interface Trade { + id: number; + buyer_id: number; + buyer_nick: string; + price: number; + discount_fee: number; + post_fee: number; + payment: number; + pay_time?: Date; + status: number; + status_str: string; + logistics_name?: string; + logistics_no?: string; + finished?: Date; + created: Date; + wares: TradeWare[]; + memo?: string; + [key: string]: any; +} + +interface TradeWare { + ware_id: number; + sku_id: number; + num: number; + price: number; + mp: string; + title: string; +} + +const DATA: Trade[] = []; +const STATUS: { [key: string]: string } = { + CANCELED: '取消', + WAIT_BUYER_PAY: '等待买家付款', + WAIT_PAY_CONFIRM: '支付确认中', + WAIT_SELLER_STOCK_OUT: '等待出库', + WAIT_GOODS_RECEIVE_CONFIRM: '等待确认收货', + FINISHED: '交易成功' +}; + +for (let i = 1; i <= 30; i += 1) { + const buyer_nick = genName(); + const status: any = Object.keys(STATUS)[Random.natural(0, 5)]; + let pay_time: Date | null = null; + let finished: Date | null = null; + if (status !== 'WAIT_BUYER_PAY' || status !== 'CANCELED') { + pay_time = new Date(); + } + if (status !== 'FINISHED') { + finished = new Date(); + } + const price = Random.natural(100, 10000); + const discount_fee = Random.natural(0, 100); + const post_fee = Random.natural(6, 20); + + DATA.push({ + id: 10000 * i, + buyer_id: Random.natural(10000, 100000), + buyer_nick, + buyer_tel: Random.natural(10000000000, 19999999999), + buyer_adr: Random.city(true), + buyer_message: Random.title(5, 20), + price, + discount_fee, + post_fee, + payment: price - discount_fee + post_fee, + pay_time, + finished, + status, + status_str: STATUS[status], + logistics_name: '', + logistics_no: '', + created: new Date(), + wares: genWare(Random.natural(1, 5)) + } as any); +} + +function genWare(count: number): TradeWare[] { + return new Array(count).fill({}).map((v, idx) => ({ + ware_id: Random.natural(10000, 10020), + sku_id: (idx + 1) * 1000, + num: Random.natural(1, 10), + price: Random.natural(10, 500), + mp: genMp(), + title: Random.ctitle(5, 10) + })); +} + +function get(params: any): any { + let ret = deepCopy(DATA); + if (params.sorter) { + const s = params.sorter.split('_'); + ret = ret.sort((prev: any, next: any) => { + if (s[1] === 'descend') { + return next[s[0]] - prev[s[0]]; + } + return prev[s[0]] - next[s[0]]; + }); + } + if (params.id) { + ret = ret.filter((data: any) => data.id == params.id); + } + if (params.statusList && params.statusList.length > 0) { + ret = ret.filter((data: any) => params.statusList.indexOf(data.status) > -1); + } + if (params.ware_id) { + ret = ret.filter((data: any) => data.wares.find((w: any) => w.ware_id == params.ware_id)); + } + if (params.buyer_nick) { + ret = ret.filter((data: any) => data.buyer_nick.indexOf(params.buyer_nick) > -1); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex(w => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const TRADES = { + '/trade': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps) + }; + }, + 'POST /trade': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + DATA[idx] = { ...DATA[idx], ...req.body }; + return { msg: 'ok', item: DATA[idx] }; + } + + const item = { ...req.body, id: DATA.sort((a, b) => b.id - a.id)[0].id + 1 }; + DATA.push(item); + return { msg: 'ok', item }; + }, + '/trade/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { ...DATA[idx] }; + return item; + }, + 'DELETE /trade/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + }, + 'POST /trade/status': (req: MockRequest) => { + const idx = getIdx(req.body.id || 0); + DATA[idx].status = req.body.status; + DATA[idx].status_str = STATUS[req.body.status]; + return { msg: 'ok', item: DATA[idx] }; + }, + 'POST /trade/memo': (req: MockRequest) => { + const idx = getIdx(req.body.id || 0); + DATA[idx].memo = req.body.memo; + return { msg: 'ok', item: DATA[idx] }; + } +}; diff --git a/_mock/_user-pro.ts b/_mock/_user-pro.ts new file mode 100644 index 00000000..3909efb4 --- /dev/null +++ b/_mock/_user-pro.ts @@ -0,0 +1,91 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { Random } from 'mockjs'; +import { genName } from './utils'; +import { RuleData } from './_role'; + +interface UserPro { + id: number; + name: string; + userName: string; + email: string; + verified: boolean; + status: 'active' | 'banned' | 'deleted'; + role?: any; + permission?: any[]; + created: Date; +} + +const DATA: UserPro[] = []; + +for (let i = 1; i <= 20; i += 1) { + const name = genName(); + DATA.push({ + id: i, + name, + userName: `user name ${i}`, + email: `${name}` + ['@qq.com', '@gmail.com', '@163.com'][Math.floor(Math.random() * 10) % 3], + verified: [true, false][Math.floor(Math.random() * 10) % 2], + status: ['active', 'banned', 'deleted'][Math.floor(Math.random() * 10) % 3] as any, + role: deepCopy(RuleData[Random.natural(0, RuleData.length - 1)]), + permission: [], + created: new Date(), + }); +} + +function get(params: any): any { + let ret = deepCopy(DATA); + if (params.q) { + ret = ret.filter((data: any) => data.name.indexOf(params.q) > -1); + } + if (params.email) { + ret = ret.filter((data: any) => data.email.indexOf(params.email) > -1); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const USERS_PRO = { + '/user-pro': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps), + }; + }, + 'POST /user-pro': (req: MockRequest) => { + const id = req.body.id || 0; + // fix role data + req.body.role = RuleData.find((w) => w.id === req.body.role.id); + + if (id > 0) { + const idx = getIdx(id); + DATA[idx] = { ...DATA[idx], ...req.body }; + return { msg: 'ok', item: DATA[idx] }; + } + + const item = { ...req.body, id: DATA.sort((a, b) => b.id - a.id)[0].id + 1 }; + DATA.push(item); + return { msg: 'ok', item }; + }, + '/user-pro/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { ...DATA[idx], ...req.body }; + return item; + }, + 'DELETE /user-pro/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + }, +}; diff --git a/_mock/_user.ts b/_mock/_user.ts new file mode 100644 index 00000000..386ffd1b --- /dev/null +++ b/_mock/_user.ts @@ -0,0 +1,122 @@ +import { MockRequest } from '@delon/mock'; + +const list: any[] = []; +const total = 50; + +for (let i = 0; i < total; i += 1) { + list.push({ + id: i + 1, + disabled: i % 6 === 0, + href: 'https://ant.design', + avatar: [ + 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', + 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', + ][i % 2], + no: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + description: '这是一段描述', + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 4, + updatedAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`), + createdAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`), + progress: Math.ceil(Math.random() * 100), + }); +} + +function genData(params: any): { total: number; list: any[] } { + let ret = [...list]; + const pi = +params.pi; + const ps = +params.ps; + const start = (pi - 1) * ps; + + if (params.no) { + ret = ret.filter((data) => data.no.indexOf(params.no) > -1); + } + + return { total: ret.length, list: ret.slice(start, ps * pi) }; +} + +function saveData(id: number, value: any): { msg: string } { + const item = list.find((w) => w.id === id); + if (!item) { + return { msg: '无效用户信息' }; + } + Object.assign(item, value); + return { msg: 'ok' }; +} + +export const USERS = { + '/user': (req: MockRequest) => genData(req.queryString), + '/user/:id': (req: MockRequest) => list.find((w) => w.id === +req.params.id), + 'POST /user/:id': (req: MockRequest) => saveData(+req.params.id, req.body), + '/user/current': { + name: 'Cipchk', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'cipchk@qq.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { + key: '0', + label: '很有想法的', + }, + { + key: '1', + label: '专注撩妹', + }, + { + key: '2', + label: '帅~', + }, + { + key: '3', + label: '通吃', + }, + { + key: '4', + label: '专职后端', + }, + { + key: '5', + label: '海纳百川', + }, + ], + notifyCount: 12, + country: 'China', + geographic: { + province: { + label: '上海', + key: '330000', + }, + city: { + label: '市辖区', + key: '330100', + }, + }, + address: 'XX区XXX路 XX 号', + phone: '你猜-你猜你猜猜猜', + }, + 'POST /user/avatar': 'ok', + 'POST /login/account': (req: MockRequest) => { + const data = req.body; + if (!(data.userName === 'admin' || data.userName === 'user') || data.password !== 'ng-alain.com') { + return { msg: `Invalid username or password(admin/ng-alain.com)` }; + } + return { + msg: 'ok', + user: { + token: '123456789', + name: data.userName, + email: `${data.userName}@qq.com`, + id: 10000, + time: +new Date(), + }, + }; + }, + 'POST /register': { + msg: 'ok', + }, +}; diff --git a/_mock/_ware.ts b/_mock/_ware.ts new file mode 100644 index 00000000..e52d4fdb --- /dev/null +++ b/_mock/_ware.ts @@ -0,0 +1,163 @@ +import { MockRequest, MockStatusError } from '@delon/mock'; +import { deepCopy } from '@delon/util'; +import { genMp } from './utils'; + +interface UserPro { + cid: number; + cname: string; + id: number; + name: string; + mp: string; + stock: number; + outer_id: string; + market_price: number; + price: number; + sale_num: number; + status: string; + modified: Date; + [key: string]: any; +} + +const DATA: UserPro[] = []; + +for (let i = 1; i <= 20; i += 1) { + const name = ['HUAWEI Mate 20 Pro', '小米MAX3', 'IPhone X', 'Gree 8,000 BTU Portable Air Conditioner'][ + Math.floor(Math.random() * 10) % 4 + ]; + DATA.push({ + cid: i * 1000, + cname: '', + id: i + 10000, + name, + mp: genMp(), + stock: Math.floor(Math.random() * 1000) % 1000, + outer_id: `S50-${Math.floor(Math.random() * 100) % 100}`, + market_price: Math.floor(Math.random() * 1000) % 1000, + price: Math.floor(Math.random() * 1000) % 1000, + sale_num: Math.floor(Math.random() * 200) % 200, + modified: new Date(), + status: ['CUSTORMER_DOWN', 'ON_SALE', 'AUDIT_AWAIT', 'DELETED'][Math.floor(Math.random() * 10) % 4], + brand: 1, + place: 1, + }); +} + +function get(params: any): any { + let ret = deepCopy(DATA); + if (params.q) { + ret = ret.filter((data: any) => data.name.indexOf(params.q) > -1); + } + if (params.email) { + ret = ret.filter((data: any) => data.email.indexOf(params.email) > -1); + } + return ret; +} + +function getIdx(id: number): number { + id = +id; + const idx = DATA.findIndex((w) => w.id === id); + if (idx === -1) { + throw new MockStatusError(404); + } + return idx; +} + +export const WARES = { + '/ware': (req: MockRequest) => { + const pi = +(req.queryString.pi || 1); + const ps = +(req.queryString.ps || 10); + const data = get(req.queryString); + return { + total: data.length, + list: data.slice((pi - 1) * ps, pi * ps), + }; + }, + 'POST /ware': (req: MockRequest) => { + const id = req.body.id || 0; + if (id > 0) { + const idx = getIdx(id); + DATA[idx] = { ...DATA[idx], ...req.body }; + return { msg: 'ok', item: DATA[idx] }; + } + + const item = { ...req.body, id: DATA.sort((a, b) => b.id - a.id)[0].id + 1 }; + DATA.push(item); + return { msg: 'ok', item }; + }, + '/ware/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + const item = { + id: 0, + brand: 1, + is_7return: true, + prop: { + 1: '是', + 2: '24天', + 3: '0.5克', + }, + place: 1, + weight: 10, + skus: [ + { + id: 10001, + attributes: '1:10', + names: [`红色`, `S`], + price: 1000, + stock: 10, + }, + { + id: 10002, + attributes: '1:11', + names: [`红色`, `M`], + price: 1000, + stock: 11, + }, + { + id: 10003, + attributes: '3:10', + names: [`蓝色1`, `S`], + price: 1000, + stock: 12, + }, + { + id: 10004, + attributes: '3:11', + names: [`蓝色1`, `M`], + price: 1000, + stock: 13, + }, + ], + imgs: { + 0: ['https://randomuser.me/api/portraits/lego/0.jpg'], + 1: ['https://randomuser.me/api/portraits/lego/1.jpg'], + 3: ['https://randomuser.me/api/portraits/lego/3.jpg'], + }, + desc: `

Test

`, + ...(DATA[idx] as any), + }; + return item; + }, + 'DELETE /ware/:id': (req: MockRequest) => { + const idx = getIdx(req.params.id || 0); + DATA.splice(idx, 1); + return { msg: 'ok' }; + }, + 'POST /ware/status': (req: MockRequest) => { + const idx = getIdx(req.body.id || 0); + const item = DATA[idx]; + item.status = req.body.status; + return { msg: 'ok', item }; + }, + '/ware/cat': [ + { id: 1, name: '颜色', value: '红色', color: '#f5222d', type: 'color' }, + { id: 2, name: '颜色', value: '绿色', color: '#a0d911', type: 'color' }, + { id: 3, name: '颜色', value: '蓝色', color: '#1890ff', type: 'color' }, + { id: 4, name: '颜色', value: '洋红', color: '#eb2f96', type: 'color' }, + { id: 10, name: '尺寸', value: 'S', type: 'size' }, + { id: 11, name: '尺寸', value: 'M', type: 'size' }, + { id: 12, name: '尺寸', value: 'L', type: 'size' }, + { id: 13, name: '尺寸', value: 'XL', type: 'size' }, + { id: 14, name: '尺寸', value: 'XXL', type: 'size' }, + { id: 15, name: '尺寸', value: 'XXXL', type: 'size' }, + ], +}; diff --git a/_mock/index.ts b/_mock/index.ts new file mode 100644 index 00000000..69e1167a --- /dev/null +++ b/_mock/index.ts @@ -0,0 +1,21 @@ +export * from './_profile'; +export * from './_rule'; +export * from './_api'; +export * from './_chart'; +export * from './_pois'; +export * from './_user'; +export * from './_geo'; + +export * from './_file-manager'; +export * from './_img'; +export * from './_log'; +export * from './_menu'; +export * from './_permission'; +export * from './_role'; +export * from './_user-pro'; +export * from './utils'; + +export * from './_forum'; +export * from './_other'; +export * from './_trade'; +export * from './_ware'; diff --git a/_mock/utils.ts b/_mock/utils.ts new file mode 100644 index 00000000..71a98721 --- /dev/null +++ b/_mock/utils.ts @@ -0,0 +1,160 @@ +import addDays from 'date-fns/addDays'; +import format from 'date-fns/format'; +import { Random } from 'mockjs'; + +export const COLOR_NAMES = ['red', 'volcano', 'orange', 'gold', 'yellow', 'lime', 'green', 'cyan', 'blue', 'geekblue', 'purple', 'magenta']; + +export function genName(): any { + return genArr(['asdf', 'cipchk', '卡色']); +} + +export function genProvince(): any { + return genArr([ + '台湾', + '河北', + '山西', + '内蒙古', + '辽宁', + '吉林', + '黑龙江', + '江苏', + '浙江', + '安徽', + '福建', + '江西', + '山东', + '河南', + '湖北', + '湖南', + '广东', + '广西', + '海南', + '四川', + '贵州', + '云南', + '西藏', + '陕西', + '甘肃', + '青海', + '宁夏', + '新疆', + '北京', + '天津', + '上海', + '重庆', + '香港', + '澳门', + ]); +} + +export function genArr(arr: any[], count: number = 1): any { + if (count === 1) { + return arr[Random.natural(0, arr.length - 1)]; + } + return new Array(count <= -1 ? Random.natural(0, -count) : count).fill({}).map(() => { + return arr[Random.natural(0, arr.length - 1)]; + }); +} + +export function genColorName(): any { + return genArr(COLOR_NAMES); +} + +export function genLabel(): any { + return genArr([ + { + color: 'green', + text: 'Clients', + }, + { + color: 'red', + text: 'Important', + }, + { + color: 'blue', + text: 'Other', + }, + ]); +} + +/** 生成头像,`id` 只能0-8 */ +export function genMp(id?: number): string { + return `https://randomuser.me/api/portraits/lego/${typeof id === 'undefined' ? Random.natural(0, 8) : id}.jpg`; +} + +export function genBigMp(): string { + return `./assets/tmp/img-big/${Random.natural(1, 8)}.jpg`; +} + +export function genTag(num: number = -3): any { + return genArr(['Angular', 'Node', 'HTML5', 'Less', 'Db', 'Python', 'Go'], num); +} + +export function addDate(days: number): Date { + return addDays(new Date(), days); +} + +export function genData(days: number, dateFormat: string = 'yyyy-MM-dd'): string { + return format(addDate(days), dateFormat); +} + +export function rudeCopy(obj: any): string { + return JSON.parse(JSON.stringify(obj)); +} + +export function genContent(): string { + return ` +

主标题

+

次标题

+

段落,${Random.cparagraph(1, 1)}

+

段落,${Random.paragraph(1, 1)}

+

列表

+
    +
  1. +

    段落,${Random.paragraph(1, 1)}

    +

    +
  2. +
  3. +

    段落,${Random.paragraph(1, 1)}

    +

  4. +
  5. +

    段落,${Random.paragraph(1, 1)}

    +

  6. +
+

图像

+

+

表格

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ `; +} diff --git a/angular.json b/angular.json new file mode 100644 index 00000000..8bf0b9cb --- /dev/null +++ b/angular.json @@ -0,0 +1,179 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "cli": { + "analytics": "0398a482-260e-4ce3-b33e-91ecf55f0703" + }, + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ng-alain": { + "projectType": "application", + "root": "", + "sourceRoot": "src", + "prefix": "app", + "schematics": { + "@schematics/angular:component": { + "style": "less" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + "src/assets", + "src/favicon.ico" + ], + "styles": [ + "node_modules/perfect-scrollbar/css/perfect-scrollbar.css", + "node_modules/quill/dist/quill.snow.css", + "src/styles.less", + { + "input": "src/styles/default.less", + "bundleName": "default", + "inject": false + }, + { + "input": "src/styles/compact.less", + "bundleName": "compact", + "inject": false + } + ], + + "scripts": [ + "node_modules/quill/dist/quill.min.js", + "node_modules/perfect-scrollbar/dist/perfect-scrollbar.js", + "node_modules/qrious/dist/qrious.min.js" + ], + "allowedCommonJsDependencies": [ + "ajv", + "ajv-formats" + ] + }, + "configurations": { + "production": { + "fileReplacements": [{ + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + }], + "outputHashing": "all", + "budgets": [{ + "type": "initial", + "maximumWarning": "4mb", + "maximumError": "10mb" + }] + }, + "dev": { + "fileReplacements": [{ + "replace": "src/environments/environment.ts", + "with": "src/environments/eascs/environment.dev.ts" + }], + "outputHashing": "all", + "budgets": [{ + "type": "initial", + "maximumWarning": "4mb", + "maximumError": "10mb" + }] + }, + "test": { + "fileReplacements": [{ + "replace": "src/environments/environment.ts", + "with": "src/environments/eascs/environment.test.ts" + }], + "outputHashing": "all", + "budgets": [{ + "type": "initial", + "maximumWarning": "4mb", + "maximumError": "10mb" + }] + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ng-alain:build", + "proxyConfig": "proxy.conf.js" + }, + "configurations": { + "production": { + "browserTarget": "ng-alain:build:production" + }, + "dev": { + "browserTarget": "app:build:dev" + }, + "development": { + "browserTarget": "ng-alain:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ng-alain:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "karmaConfig": "karma.conf.js", + "tsConfig": "tsconfig.spec.json", + "scripts": [ + "node_modules/quill/dist/quill.min.js", + "node_modules/perfect-scrollbar/dist/perfect-scrollbar.js" + ], + "styles": [], + "assets": [ + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ng-alain:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ng-alain:serve:production" + }, + "dev": { + "devServerTarget": "app:build:dev" + } + } + } + } + } + }, + "defaultProject": "ng-alain" +} diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 00000000..73e4e680 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..df95215f --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,28 @@ +import { browser, logging } from 'protractor'; +import { AppPage } from './app.po'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to ng8!'); + }); + + 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), + ); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 00000000..08b20ffd --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo(): Promise { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText(): Promise { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 00000000..eddd492c --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": ["jasmine", "jasminewd2", "node"] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..224f06eb --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,38 @@ +// 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-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + customLaunchers: { + ChromeHeadlessCI: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'] + } + }, + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/ng-alain.json b/ng-alain.json new file mode 100644 index 00000000..2aecd66e --- /dev/null +++ b/ng-alain.json @@ -0,0 +1,17 @@ +{ + "$schema": "./node_modules/ng-alain/schema.json", + "theme": { + "additionalThemeVars": [ + "./src/app/layout/pro/styles/theme-#NAME#.less", + "./src/styles/fix/theme-#NAME#.less" + ], + "list": [ + { + "theme": "dark" + }, + { + "theme": "compact" + } + ] + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..93e9c26a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,24327 @@ +{ + "name": "tms-obc-web", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@agm/core": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@agm/core/download/@agm/core-1.1.0.tgz", + "integrity": "sha1-b43LrAaPaB/k+psKDL9mBYgCWRE=", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + } + } + }, + "@amap/amap-jsapi-loader": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz", + "integrity": "sha1-nsS01dJGfqxFH2yFLjXbaen58MA=" + }, + "@ampproject/remapping": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/download/@ampproject/remapping-1.0.1.tgz", + "integrity": "sha1-E5jnPlZ8KnmS32VUwVu5Som2i6I=", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "1.0.0", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1202.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/architect/download/@angular-devkit/architect-0.1202.13.tgz", + "integrity": "sha1-ubiD1i9iimsxzgcdqR4mj2HaAO8=", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.13", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/build-angular": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/build-angular/download/@angular-devkit/build-angular-12.2.13.tgz", + "integrity": "sha1-9VZNPsnbEylWRzu5BLs1kEgvWzY=", + "dev": true, + "requires": { + "@ampproject/remapping": "1.0.1", + "@angular-devkit/architect": "0.1202.13", + "@angular-devkit/build-optimizer": "0.1202.13", + "@angular-devkit/build-webpack": "0.1202.13", + "@angular-devkit/core": "12.2.13", + "@babel/core": "7.14.8", + "@babel/generator": "7.14.8", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.8", + "@babel/runtime": "7.14.8", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "12.2.13", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.2", + "browserslist": "^4.9.1", + "cacache": "15.2.0", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "9.0.1", + "core-js": "3.16.0", + "critters": "0.0.12", + "css-loader": "6.2.0", + "css-minimizer-webpack-plugin": "3.0.2", + "esbuild": "0.13.8", + "esbuild-wasm": "0.13.8", + "find-cache-dir": "3.3.1", + "glob": "7.1.7", + "https-proxy-agent": "5.0.0", + "inquirer": "8.1.2", + "karma-source-map-support": "1.4.0", + "less": "4.1.1", + "less-loader": "10.0.1", + "license-webpack-plugin": "2.3.20", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "2.4.2", + "minimatch": "3.0.4", + "open": "8.2.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.1.0", + "postcss": "8.3.6", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.1", + "postcss-preset-env": "6.7.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.36.0", + "sass-loader": "12.1.0", + "semver": "7.3.5", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.19", + "style-loader": "3.2.1", + "stylus": "0.54.8", + "stylus-loader": "6.1.0", + "terser": "5.7.1", + "terser-webpack-plugin": "5.1.4", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.0", + "webpack": "5.50.0", + "webpack-dev-middleware": "5.0.0", + "webpack-dev-server": "3.11.2", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "1.5.2" + }, + "dependencies": { + "esbuild": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild/download/esbuild-0.13.8.tgz", + "integrity": "sha1-vXzFG4gasGd4n4jhe6ynRyTB7E8=", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.13.8", + "esbuild-darwin-64": "0.13.8", + "esbuild-darwin-arm64": "0.13.8", + "esbuild-freebsd-64": "0.13.8", + "esbuild-freebsd-arm64": "0.13.8", + "esbuild-linux-32": "0.13.8", + "esbuild-linux-64": "0.13.8", + "esbuild-linux-arm": "0.13.8", + "esbuild-linux-arm64": "0.13.8", + "esbuild-linux-mips64le": "0.13.8", + "esbuild-linux-ppc64le": "0.13.8", + "esbuild-netbsd-64": "0.13.8", + "esbuild-openbsd-64": "0.13.8", + "esbuild-sunos-64": "0.13.8", + "esbuild-windows-32": "0.13.8", + "esbuild-windows-64": "0.13.8", + "esbuild-windows-arm64": "0.13.8" + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.1202.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/build-optimizer/download/@angular-devkit/build-optimizer-0.1202.13.tgz", + "integrity": "sha1-fwsTNozCoIsfR4mrEpahYJ9QSeo=", + "dev": true, + "requires": { + "source-map": "0.7.3", + "tslib": "2.3.0", + "typescript": "4.3.5" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1202.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/build-webpack/download/@angular-devkit/build-webpack-0.1202.13.tgz", + "integrity": "sha1-h1+flne7EAVrUiMJZdwvAL0wid0=", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1202.13", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/core/download/@angular-devkit/core-12.2.13.tgz", + "integrity": "sha1-2zkp0b/OcQELN/t8Tmwz74Ck818=", + "dev": true, + "requires": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-8.6.2.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-8.6.2.tgz", + "integrity": "sha1-L7ReDl/LwIEzJsHD2lNdGIG7BXE=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ajv-formats/download/ajv-formats-2.1.0.tgz", + "integrity": "sha1-lur4PjjTIQi2bYKpywz6JIhs3+s=", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular-devkit/schematics/download/@angular-devkit/schematics-12.2.13.tgz", + "integrity": "sha1-ZGTYb6PM0O+16tRseTzvnsRcd1g=", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.13", + "ora": "5.4.1", + "rxjs": "6.6.7" + } + }, + "@angular-eslint/builder": { + "version": "12.3.1", + "resolved": "https://registry.npmmirror.com/@angular-eslint/builder/download/@angular-eslint/builder-12.3.1.tgz", + "integrity": "sha1-4KZ2ipx+4jYjseNjoj5ZozO22r4=", + "dev": true, + "requires": { + "@nrwl/devkit": ">= 12.0.0 < 13.0.0" + } + }, + "@angular-eslint/eslint-plugin": { + "version": "12.3.1", + "resolved": "https://registry.npmmirror.com/@angular-eslint/eslint-plugin/download/@angular-eslint/eslint-plugin-12.3.1.tgz", + "integrity": "sha1-AKxE1ZhthhE9ZaU3N0bh/CL9hwI=", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.2" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "12.3.1", + "resolved": "https://registry.npmmirror.com/@angular-eslint/eslint-plugin-template/download/@angular-eslint/eslint-plugin-template-12.3.1.tgz", + "integrity": "sha1-MyYM1TVt9dt+J3GUQ+q89sIU4y4=", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.2", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + } + }, + "@angular-eslint/schematics": { + "version": "12.3.1", + "resolved": "https://registry.npmmirror.com/@angular-eslint/schematics/download/@angular-eslint/schematics-12.3.1.tgz", + "integrity": "sha1-mQYKZP1t02/7TF4lS4VWL00BUNk=", + "dev": true, + "requires": { + "@angular-eslint/eslint-plugin": "12.3.1", + "@angular-eslint/eslint-plugin-template": "12.3.1", + "ignore": "5.1.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-5.1.8.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-5.1.8.tgz", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.2.1.tgz", + "integrity": "sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ=", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@angular-eslint/template-parser": { + "version": "12.3.1", + "resolved": "https://registry.npmmirror.com/@angular-eslint/template-parser/download/@angular-eslint/template-parser-12.3.1.tgz", + "integrity": "sha1-Vh/hvT+0pNdcxVNm0ngYvKIiBMk=", + "dev": true, + "requires": { + "eslint-scope": "^5.1.0" + } + }, + "@angular/animations": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/animations/download/@angular/animations-12.2.13.tgz", + "integrity": "sha1-kJt5xWqFuzHAYF7UGYUDQLVYC+k=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/cdk": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/cdk/download/@angular/cdk-12.2.13.tgz", + "integrity": "sha512-zSKRhECyFqhingIeyRInIyTvYErt4gWo+x5DQr0b7YLUbU8DZSwWnG4w76Ke2s4U8T7ry1jpJBHoX/e8YBpGMg==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^2.2.0" + } + }, + "@angular/cli": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/cli/download/@angular/cli-12.2.13.tgz", + "integrity": "sha1-ylhsFKb4O7Q5CHW+Cg+nCbmirik=", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1202.13", + "@angular-devkit/core": "12.2.13", + "@angular-devkit/schematics": "12.2.13", + "@schematics/angular": "12.2.13", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.2", + "ini": "2.0.0", + "inquirer": "8.1.2", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.2.1", + "ora": "5.4.1", + "pacote": "11.3.5", + "resolve": "1.20.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "dev": true + } + } + }, + "@angular/common": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/common/download/@angular/common-12.2.13.tgz", + "integrity": "sha1-/lL/roZowd7EGybNw6dJEBOZ4f4=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/compiler": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/compiler/download/@angular/compiler-12.2.13.tgz", + "integrity": "sha1-fu9v24G53m/Q4s3aKtighMHZU1s=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/compiler-cli": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/compiler-cli/download/@angular/compiler-cli-12.2.13.tgz", + "integrity": "sha1-PORjJj6AqGHhSvLtO6gVmAYOPOA=", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.2.0", + "yargs": "^17.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-17.2.1.tgz", + "integrity": "sha1-4slbl5ag4ffzv0QnhjtC4EGBkeo=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "@angular/core": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/core/download/@angular/core-12.2.13.tgz?cache=0&sync_timestamp=1637205149537&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40angular%2Fcore%2Fdownload%2F%40angular%2Fcore-12.2.13.tgz", + "integrity": "sha1-/ECsvc7lxYeL0kndwNZDvnJAdsM=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/forms": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/forms/download/@angular/forms-12.2.13.tgz", + "integrity": "sha1-TekOiJkcJ0tdXjqwMAJn4WG6ePI=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/language-service": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/language-service/download/@angular/language-service-12.2.13.tgz", + "integrity": "sha1-MmBFoyj4qWIocDfXqFvoEgB0Qhw=", + "dev": true + }, + "@angular/platform-browser": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/platform-browser/download/@angular/platform-browser-12.2.13.tgz", + "integrity": "sha1-dp+xSLIShmPWtAXSpBAj8s2qHJU=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-12.2.13.tgz", + "integrity": "sha1-nuYwn1EdpBnV2AoagnmtyAbpLwQ=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/router": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@angular/router/download/@angular/router-12.2.13.tgz", + "integrity": "sha1-5bk5qWdfnUg0/uPnXrjQQO9js7U=", + "requires": { + "tslib": "^2.2.0" + } + }, + "@ant-design/colors": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.1.1.tgz", + "integrity": "sha1-gAshhrHifmZDLmfQPtlq8+IdiUA=", + "requires": { + "@ctrl/tinycolor": "^3.3.1" + } + }, + "@ant-design/icons-angular": { + "version": "12.0.3", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-angular/download/@ant-design/icons-angular-12.0.3.tgz", + "integrity": "sha1-Ppmqmc7ruXg4Sikm0G2hnAQ/xL0=", + "requires": { + "@ant-design/colors": "^5.0.0", + "tslib": "^2.0.0" + } + }, + "@antv/adjust": { + "version": "0.2.3", + "resolved": "https://registry.nlark.com/@antv/adjust/download/@antv/adjust-0.2.3.tgz", + "integrity": "sha1-w4hKaAwyZMwSXX8qtTmOihwLlAE=", + "requires": { + "@antv/util": "~2.0.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + } + } + }, + "@antv/attr": { + "version": "0.3.2", + "resolved": "https://registry.nlark.com/@antv/attr/download/@antv/attr-0.3.2.tgz", + "integrity": "sha1-5YZrZIcMYvOpwluKYfZUuiv9oFE=", + "requires": { + "@antv/color-util": "^2.0.1", + "@antv/util": "~2.0.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + } + } + }, + "@antv/color-util": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@antv/color-util/download/@antv/color-util-2.0.6.tgz", + "integrity": "sha1-XhKbuc4/K5MJtSECs9ySlDDMwBY=", + "requires": { + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + } + }, + "@antv/component": { + "version": "0.8.20", + "resolved": "https://registry.npmmirror.com/@antv/component/download/@antv/component-0.8.20.tgz", + "integrity": "sha1-l/Daoi83aKNd4zzQ2cWP8yzspBc=", + "requires": { + "@antv/color-util": "^2.0.3", + "@antv/dom-util": "~2.0.1", + "@antv/g-base": "0.5.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.7", + "@antv/scale": "~0.3.1", + "@antv/util": "~2.0.0", + "fecha": "~4.2.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "@antv/g-base": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/@antv/g-base/download/@antv/g-base-0.5.6.tgz", + "integrity": "sha1-2W2l+/bF+LBzBydR4V5e7HCzk/w=", + "requires": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + } + } + }, + "@antv/coord": { + "version": "0.3.1", + "resolved": "https://registry.nlark.com/@antv/coord/download/@antv/coord-0.3.1.tgz", + "integrity": "sha1-mC4mHYoeBqGY61GOp6zCDth1oBk=", + "requires": { + "@antv/matrix-util": "^3.1.0-beta.2", + "@antv/util": "~2.0.12", + "tslib": "^2.1.0" + } + }, + "@antv/data-set": { + "version": "0.11.8", + "resolved": "https://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.11.8.tgz", + "integrity": "sha1-dBPpAGJIY9Wl87RoQf0An8TypP8=", + "requires": { + "@antv/hierarchy": "^0.6.0", + "@antv/util": "^2.0.0", + "d3-composite-projections": "^1.2.0", + "d3-dsv": "^1.0.5", + "d3-geo": "~1.6.4", + "d3-geo-projection": "~2.1.2", + "d3-hexjson": "^1.0.1", + "d3-hierarchy": "^1.1.5", + "d3-sankey": "^0.9.1", + "d3-voronoi": "^1.1.2", + "dagre": "^0.8.2", + "point-at-length": "^1.0.2", + "regression": "^2.0.0", + "simple-statistics": "^6.1.0", + "topojson-client": "^3.0.0", + "wolfy87-eventemitter": "^5.1.0" + } + }, + "@antv/dom-util": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@antv/dom-util/download/@antv/dom-util-2.0.3.tgz", + "integrity": "sha1-y9FYsciODopNhlhxpZabEZBVT/U=", + "requires": { + "tslib": "^2.0.3" + } + }, + "@antv/event-emitter": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/@antv/event-emitter/download/@antv/event-emitter-0.1.2.tgz", + "integrity": "sha1-oXt8uG5tBxiA3Gv7IydW+IYk7Lw=" + }, + "@antv/g-base": { + "version": "0.5.9", + "resolved": "https://registry.npmmirror.com/@antv/g-base/download/@antv/g-base-0.5.9.tgz", + "integrity": "sha1-WNDhHYUVetoUCPvfJPT0aPQOWc0=", + "requires": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-canvas": { + "version": "0.5.12", + "resolved": "https://registry.npmmirror.com/@antv/g-canvas/download/@antv/g-canvas-0.5.12.tgz", + "integrity": "sha1-L8QNztaZTwdPIjQeZdVve71Sdfc=", + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-math": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/@antv/g-math/download/@antv/g-math-0.1.7.tgz", + "integrity": "sha1-bsJ2kmn3zLZ+WBQNVznfdARswE4=", + "requires": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "@antv/g-svg": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/@antv/g-svg/download/@antv/g-svg-0.5.6.tgz", + "integrity": "sha1-cLL6mAxDGzmtPFtLU+NqHWCVfWU=", + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g2": { + "version": "4.1.34", + "resolved": "https://registry.npmmirror.com/@antv/g2/download/@antv/g2-4.1.34.tgz", + "integrity": "sha1-aqcaCcJAuSkUvGZvESMQqrwOPhY=", + "requires": { + "@antv/adjust": "^0.2.1", + "@antv/attr": "^0.3.1", + "@antv/color-util": "^2.0.2", + "@antv/component": "^0.8.19", + "@antv/coord": "^0.3.0", + "@antv/dom-util": "^2.0.2", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "~0.5.6", + "@antv/g-canvas": "~0.5.10", + "@antv/g-svg": "~0.5.6", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.15", + "@antv/scale": "^0.3.14", + "@antv/util": "~2.0.5", + "tslib": "^2.0.0" + } + }, + "@antv/hierarchy": { + "version": "0.6.8", + "resolved": "https://registry.nlark.com/@antv/hierarchy/download/@antv/hierarchy-0.6.8.tgz", + "integrity": "sha1-t3xJCpwt1toYbLrO4OeIe4wbP6Q=", + "requires": { + "@antv/util": "^2.0.7" + } + }, + "@antv/matrix-util": { + "version": "3.1.0-beta.3", + "resolved": "https://registry.npmmirror.com/@antv/matrix-util/download/@antv/matrix-util-3.1.0-beta.3.tgz", + "integrity": "sha1-4GHej6e+BGBaFVxpzFzpCC7t3e4=", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.4.3", + "tslib": "^2.0.3" + } + }, + "@antv/path-util": { + "version": "2.0.15", + "resolved": "https://registry.npmmirror.com/@antv/path-util/download/@antv/path-util-2.0.15.tgz", + "integrity": "sha1-pvaR38i3vOW+fwqrtb1hSWQyVjE=", + "requires": { + "@antv/matrix-util": "^3.0.4", + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + }, + "dependencies": { + "@antv/matrix-util": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@antv/matrix-util/download/@antv/matrix-util-3.0.4.tgz", + "integrity": "sha1-6hPxWKovtLovuNa2tWHsRn6jrCA=", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^2.0.3" + } + } + } + }, + "@antv/scale": { + "version": "0.3.14", + "resolved": "https://registry.npmmirror.com/@antv/scale/download/@antv/scale-0.3.14.tgz", + "integrity": "sha1-Bxj4ZRNo5cmNtWEgZRMqjIu83kg=", + "requires": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + } + }, + "@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmmirror.com/@antv/util/download/@antv/util-2.0.17.tgz", + "integrity": "sha1-6O9CrKeJKBWyKSafPdEMazx1l6k=", + "requires": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmmirror.com/@assemblyscript/loader/download/@assemblyscript/loader-0.10.1.tgz", + "integrity": "sha1-cORWePBscvouNQ6FU+xKTXK5LgY=", + "dev": true + }, + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.0.tgz?cache=0&sync_timestamp=1635561808745&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.16.0.tgz", + "integrity": "sha1-DfyAMJvuyEEeZecGRhxAiwu5tDE=", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.14.8", + "resolved": "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.14.8.tgz?cache=0&sync_timestamp=1635561804981&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.14.8.tgz", + "integrity": "sha1-IM33yEtdhtg/rIcQqLxgWnuj8BA=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.8", + "resolved": "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.14.8.tgz?cache=0&sync_timestamp=1635561809489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.14.8.tgz", + "integrity": "sha1-v4b9avls87dDlajKQJUV+JQj4HA=", + "dev": true, + "requires": { + "@babel/types": "^7.14.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.14.5.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha1-e/R47Dtxcm1WqMpXdbBG/CmHnmE=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha1-8aaGuS2nlAIMJlguuFLprM0NeII=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.3.tgz?cache=0&sync_timestamp=1636495290322&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.0.tgz?cache=0&sync_timestamp=1635561800206&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha1-CQ1NFms0KgOp/sN+9P1a65x8aks=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha1-BrI0jON/zMT14Y3NjXUFPyp8RP8=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha1-iGeu150+psreQPgB77esXGaRaxA=", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.0.tgz?cache=0&sync_timestamp=1635567805771&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha1-dTAXM3oV9G+cCfZ0z/EM7pudd3g=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.0.tgz?cache=0&sync_timestamp=1635561947831&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.16.0.tgz", + "integrity": "sha1-t90Hl9ALv+5PB+nE6lsOMMi7FIE=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz?cache=0&sync_timestamp=1635561799475&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.16.0.tgz", + "integrity": "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.0.tgz?cache=0&sync_timestamp=1635561948623&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.16.0.tgz", + "integrity": "sha1-AIjHSGspqctdlIsaHeRttm4InPo=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.0.tgz?cache=0&sync_timestamp=1635561801635&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.16.0.tgz", + "integrity": "sha1-TJAjwvHe9+KP9G/B2802o5vqqBo=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.0.tgz?cache=0&sync_timestamp=1635561802435&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha1-KShwQO/Rl8d2Nu91GI6B2ovM1aQ=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.0.tgz?cache=0&sync_timestamp=1635561800759&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.16.0.tgz", + "integrity": "sha1-kFOOYLZy7PG0SPX09UM9N+eaPsM=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.0.tgz?cache=0&sync_timestamp=1635561798763&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-module-transforms%2Fdownload%2F%40babel%2Fhelper-module-transforms-7.16.0.tgz", + "integrity": "sha1-HIKo3UyzRXdQLr0pCWmbGUw+m7U=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz?cache=0&sync_timestamp=1635561799475&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.16.0.tgz", + "integrity": "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.0.tgz?cache=0&sync_timestamp=1635561802051&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha1-zs2xRdcMVAlrFWT46fEM19GTszg=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha1-WsgizpfuxGdBq3ClF5ceRDpwxak=", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.0.tgz?cache=0&sync_timestamp=1635561801283&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.16.0.tgz", + "integrity": "sha1-cwVejTz5vLqN21XK2T/tyGD2jxc=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.0.tgz?cache=0&sync_timestamp=1635561801108&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.16.0.tgz", + "integrity": "sha1-IdaidiDjg+N1NM9sELugGab5BRc=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.0.tgz?cache=0&sync_timestamp=1635561801459&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.16.0.tgz", + "integrity": "sha1-KWcvQ2Y+k23zcKrrIr7ds7rsdDg=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k=", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz", + "integrity": "sha1-bnKh//GNXfy4eOHmLxoCHEty1aM=", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.0.tgz", + "integrity": "sha1-s88xivzndN/nW4Z2fNbWjzSC5Xw=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz?cache=0&sync_timestamp=1635561799475&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.16.0.tgz", + "integrity": "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.3.tgz?cache=0&sync_timestamp=1636495281937&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz?cache=0&sync_timestamp=1635561799475&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.16.0.tgz", + "integrity": "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.0.tgz?cache=0&sync_timestamp=1635562526459&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.16.0.tgz", + "integrity": "sha1-bOsysspLj182H7f9gh4/3fShclo=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha1-NYly6qsAb16wgmGDsMk8vK8T4eI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha1-eEpIw9jtBz9lrc8wtXvL9sgRms4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha1-wClhgmfd68coD6KG4PjKKieKLRo=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha1-UpaULFZNgUTIPuo0fQqooLiRcOc=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha1-eD7KYdUFJiAvmylglUU5d+iGWfE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha1-nAHe5Auda4R7ZWqvSjl2pxdA8iI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha1-yuNale0dKn+inE3EFUC4SnLpqyU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha1-pxG4zrP/3dPviNOknobb08x9s/0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha1-ROHM4I/iQnSCz0RqkbtFFSjtBZY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha1-XUGOT7v4ubfQMSXTpScwQzo3NzQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha1-X7MvbZJNbmcSgQNipg4SomCYcuY=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha1-WRAIWBGrTCiwDW6/+kqwJ00eXxY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha1-VtvDlwglaDYI6e+1XqgsKi1sjcA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha1-tNr7nHF+QwHFd2sw0IDWODyJr/Y=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha1-aek1ssXHnSSIES2IbwxOJ5D+528=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha1-iQSC38XqN45C4Zpx5wlyjKvxhhI=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.nlark.com/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha1-lRcG+LRJyDTtB71HTAkkyUS5Wo4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha1-cseJCE2PIJSsuUVjOUPvhEPTnmc=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha1-xhh2MjOtAoR4BavKxMNFzp3nFF0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha1-vPQz+0gv6MPTtOimaxxKjnfTfBY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha1-VM9f8LIkLGVz11PNS/xwd6iygvU=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635561802239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha1-4MOFUH0h4bCwdtZr7W1SMbhRELc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha1-rT1+dFhK1epOrbHmZCFGxZDe4zw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha1-ULqwDBCEthYtClioGAMc9XeY4G8=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha1-i8LiGBPj6J5eW/O2CqX8RYV1oXY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha1-oYDNKIHjUzzvnTkB5I2tD77/S+Q=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha1-96us7RVSYOJGE1m7x8ckispea9I=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha1-AuNpnChMYmIjZZn3UQZcXV8fQA4=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha1-eXEeZw/86zG9KYIp1Q82IfeYDKw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha1-UlG0zOAer4MUQD0hrtsmnXn15ks=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha1-CavUHhjc9P1HnFmMHO97056xM34=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha1-rdWOY4yN3Eh1vZqey1xZRhP2ySI=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha1-qSzyQK/rYF9MoWZwRTAkQl5CHqQ=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha1-GV8mwq1tajkbcIgO/84YzmJeBqc=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha1-09thzF1bl5hlWZZ81eqD5cMglso=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha1-r4I6tXb3UiFaSZN3eaQcplglqzU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha1-+yDVgG3GSRoGKWrBTqjo1v7dpys=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.3.tgz?cache=0&sync_timestamp=1636495301748&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha1-qVxVIYmpagAFn2d23E4A42kMeNE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha1-6u5CLISwIy0Drqfbmcl97q9hJaQ=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha1-//S53LGeEmGTlL2hctFPLQTAN5w=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha1-MEkdrUnGBZ+Pj6XuiJagCJ6YdSM=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha1-CQNy4xQffMMk7XCz2vU3nfL6OE0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha1-0hygmbvVOrMHqGIeAZp70PQM3Ps=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha1-w16jGgLYa+SF9qpRAYS2d6kXOP0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha1-qOztOo57ji1A7E7EVIpFkSYw0wI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha1-ixmiRMb4ydZo3Kam91Stbq0RKPI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha1-GjVAZLTEVmOjIzT0b6DPYQC1sfM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha1-KTuAlQF3yMha7eh87ygCWfuZVAI=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.8", + "resolved": "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.14.8.tgz", + "integrity": "sha1-JUlC9cqAzKvPuyqfUkx0vKV0AFs=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.8", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz", + "integrity": "sha1-75Odbn8miCfhhBY43G/5VRXhFdk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz?cache=0&sync_timestamp=1636495277831&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.14.8.tgz", + "integrity": "sha1-cRmlb0IQGIUmlCkLn5FICXORtEY=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.16.3", + "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/download/@babel/runtime-corejs3-7.16.3.tgz?cache=0&sync_timestamp=1636495298551&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fruntime-corejs3%2Fdownload%2F%40babel%2Fruntime-corejs3-7.16.3.tgz", + "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", + "dev": true, + "requires": { + "core-js-pure": "^3.19.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.14.5.tgz?cache=0&sync_timestamp=1635561799475&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.14.5.tgz", + "integrity": "sha1-qbydizM1T/blWpxg0RCSAKaJdPQ=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.3.tgz?cache=0&sync_timestamp=1636495280926&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.0.tgz?cache=0&sync_timestamp=1635561809489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.16.0.tgz", + "integrity": "sha1-1A89HVB15i01ALzLZ/PaqKlSZbI=", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.0.tgz?cache=0&sync_timestamp=1635561799958&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.16.0.tgz", + "integrity": "sha1-2zsxOAT5aq3Qt3bEgj4SetZyibo=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/@csstools/convert-colors/download/@csstools/convert-colors-1.4.0.tgz", + "integrity": "sha1-rUldxBsS511YjG24uYNPCPoTHrc=", + "dev": true + }, + "@ctrl/tinycolor": { + "version": "3.4.0", + "resolved": "https://registry.nlark.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz", + "integrity": "sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8=" + }, + "@delon/abc": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/abc/download/@delon/abc-12.4.2.tgz", + "integrity": "sha512-K38WW6n7Kp5hYNrPoDfblJcPb5XF4apvbHlR76FLtkCjSpvNzRIKXi0DJJzmRchBOSHPvUYFk5EUGbgQSDe75w==", + "requires": { + "@delon/acl": "^12.4.2", + "@delon/theme": "^12.4.2", + "@delon/util": "^12.4.2", + "file-saver": "^2.0.5", + "isutf8": "^3.1.1", + "jszip": "^3.7.1", + "ngx-countdown": "^12.0.1", + "tslib": "^2.2.0", + "xlsx": "^0.17.1" + } + }, + "@delon/acl": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/acl/download/@delon/acl-12.4.2.tgz", + "integrity": "sha512-EPGwYZjZV05xZR9tRg5i1G00Zyp/VH8nO3H+Kze8fCrQsfc5tAxYXAFzpV3s003rzYQrW1mWLEge73IDVjIs1Q==", + "requires": { + "@delon/util": "^12.4.2", + "tslib": "^2.2.0" + } + }, + "@delon/auth": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/auth/download/@delon/auth-12.4.2.tgz", + "integrity": "sha512-2g+rQXrebAn5qDjM++GloPqRxVgxfy+kFcRKnpC8nOwoyIb9vDDf0sqcFUioLqugmJ7d7fGdROWCBuBWB5NMJQ==", + "requires": { + "@delon/util": "^12.4.2", + "tslib": "^2.2.0" + } + }, + "@delon/cache": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/cache/download/@delon/cache-12.4.2.tgz", + "integrity": "sha512-n9iu6lg/jdaDqRN1J3CQNz9heigH/xrHQYsHkjOWbwASA6rssP12ThvIvcuEClhKpxQrdCx6rGdg26TP1JSOvA==", + "requires": { + "@delon/util": "^12.4.2", + "tslib": "^2.2.0" + } + }, + "@delon/chart": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/chart/download/@delon/chart-12.4.2.tgz", + "integrity": "sha512-Z4lzKqEJfhePFWPSL0s2DUedOLtNj/2kcAvBqTtGW+VAzs7bYC+izIrHFNR03Qr0+DJtFeZk6kuuD2jhpfszzQ==", + "requires": { + "@antv/data-set": "^0.11.8", + "@antv/g2": "^4.1.24", + "@delon/theme": "^12.4.2", + "@delon/util": "^12.4.2", + "echarts": "^5.1.2", + "tslib": "^2.2.0" + } + }, + "@delon/form": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/form/download/@delon/form-12.4.2.tgz", + "integrity": "sha512-8/YCWqBhAdI8jGpfMrwgLDvSLtmXar9Y6iRq7eHAgD1PhF12vB4x0tIZtwU2AVWp7VOCC5ySKX003N2LYQkHTw==", + "requires": { + "@delon/acl": "^12.4.2", + "@delon/theme": "^12.4.2", + "@delon/util": "^12.4.2", + "ajv": "^8.6.2", + "ajv-formats": "^2.1.1", + "tslib": "^2.2.0" + } + }, + "@delon/mock": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/mock/download/@delon/mock-12.4.2.tgz", + "integrity": "sha512-DF1cPvajHgg09dlvzsbjWGrs3+9imMZgvytWky7K2UNhWc8Yr1240Qhq1vyDNiJMp0ZfMCqTPk9B9PBH+kxp3Q==", + "requires": { + "@delon/util": "^12.4.2", + "@types/mockjs": "^1.0.4", + "mockjs": "^1.1.0", + "tslib": "^2.2.0" + } + }, + "@delon/testing": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/testing/download/@delon/testing-12.4.2.tgz", + "integrity": "sha512-3LiUmHZMZfH/EfiYC8D1OJrHhvyhqD5n1RWQ7Fhqn8RSk7lODRU9dehiVWzJXutHkPVjktdsiOGJvJSq7wfPaw==", + "dev": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@delon/theme": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/theme/download/@delon/theme-12.4.2.tgz", + "integrity": "sha512-SV2TnUMv1rHWEJ2w9SnFCryv5HHt2Bh0nL/YpqkFw3XzB/FaOXFvKsL/iM6G/vwC5/ms6E/81STSN6sVkPEfyQ==", + "requires": { + "@delon/acl": "^12.4.2", + "@delon/util": "^12.4.2", + "ng-zorro-antd": "^12.0.1", + "tslib": "^2.2.0" + } + }, + "@delon/util": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/@delon/util/download/@delon/util-12.4.2.tgz", + "integrity": "sha512-dIF2Gkgj/XkFaAe4MGzSM5M+fyVR3BGEDfragADb3/2DiMPqMiiUPgPVi3e/cqdRuBWdkj2yMtIbI3l5aM3AeQ==", + "requires": { + "extend": "^3.0.2", + "tslib": "^2.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.nlark.com/@discoveryjs/json-ext/download/@discoveryjs/json-ext-0.5.3.tgz", + "integrity": "sha1-kEIPn5xtOYfxdqGafY52QnGi9V0=", + "dev": true + }, + "@es-joy/jsdoccomment": { + "version": "0.10.8", + "resolved": "https://registry.npmmirror.com/@es-joy/jsdoccomment/download/@es-joy/jsdoccomment-0.10.8.tgz", + "integrity": "sha1-sxUoh+JSRkEO1OpWmlWSbsE7KwU=", + "dev": true, + "requires": { + "comment-parser": "1.2.4", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + }, + "dependencies": { + "jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/jsdoc-type-pratt-parser/download/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha1-EP5eQJujjeIqSLVVWYlVom/wFg8=", + "dev": true + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz", + "integrity": "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw=", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmmirror.com/globals/download/globals-13.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-13.12.0.tgz", + "integrity": "sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4=", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true + } + } + }, + "@exodus/schemasafe": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@exodus/schemasafe/download/@exodus/schemasafe-1.0.0-rc.6.tgz", + "integrity": "sha1-eYX2gVZM/0/667WJbrS+IK86rno=", + "dev": true + }, + "@fullcalendar/common": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/common/download/@fullcalendar/common-5.10.1.tgz", + "integrity": "sha1-oBmVF0OFInekCV5Tb9dxb2+Fuao=", + "requires": { + "tslib": "^2.1.0" + } + }, + "@fullcalendar/core": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/core/download/@fullcalendar/core-5.10.1.tgz", + "integrity": "sha1-BcdlPlAEFJpjvLA+nciwSRhspQs=", + "requires": { + "@fullcalendar/common": "~5.10.1", + "preact": "^10.0.5", + "tslib": "^2.1.0" + } + }, + "@fullcalendar/daygrid": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/daygrid/download/@fullcalendar/daygrid-5.10.1.tgz", + "integrity": "sha1-ve5PWDZP2rYxsqv4tWCUq1d28gM=", + "requires": { + "@fullcalendar/common": "~5.10.1", + "tslib": "^2.1.0" + } + }, + "@fullcalendar/interaction": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/interaction/download/@fullcalendar/interaction-5.10.1.tgz", + "integrity": "sha1-36dLXFC71WCOtQrqtuV5yNIMs2c=", + "requires": { + "@fullcalendar/common": "~5.10.1", + "tslib": "^2.1.0" + } + }, + "@fullcalendar/list": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/list/download/@fullcalendar/list-5.10.1.tgz", + "integrity": "sha1-hQWq4JhFuC9b22JRvaD51jQu+dk=", + "requires": { + "@fullcalendar/common": "~5.10.1", + "tslib": "^2.1.0" + } + }, + "@fullcalendar/timegrid": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/@fullcalendar/timegrid/download/@fullcalendar/timegrid-5.10.1.tgz", + "integrity": "sha1-+n/rkJv1merBRmuecMDVbODRrvw=", + "requires": { + "@fullcalendar/common": "~5.10.1", + "@fullcalendar/daygrid": "~5.10.1", + "tslib": "^2.1.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz", + "integrity": "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk=", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40humanwhocodes%2Fobject-schema%2Fdownload%2F%40humanwhocodes%2Fobject-schema-1.2.1.tgz", + "integrity": "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/@istanbuljs/schema/download/@istanbuljs/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/download/@jridgewell/resolve-uri-1.0.0.tgz", + "integrity": "sha1-P99XmPC0npAVWJb2KR3xhurAbIM=", + "dev": true + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@jsdevtools/coverage-istanbul-loader/download/@jsdevtools/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha1-KkvGXQJx341ENZgttK812BdU7iY=", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + } + } + }, + "@ng-util/lazy": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/@ng-util/lazy/download/@ng-util/lazy-11.2.0.tgz", + "integrity": "sha1-bASRAM2HQyIdK05rpo8OWaRORqo=", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ng-util/util": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/@ng-util/util/download/@ng-util/util-11.2.0.tgz", + "integrity": "sha1-cSnnS9aO51W82M1330b2MEKlY4g=", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ngtools/webpack": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@ngtools/webpack/download/@ngtools/webpack-12.2.13.tgz", + "integrity": "sha1-RNcR7fo50XWi1lWqXG+ZaN/tzDU=", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz?cache=0&sync_timestamp=1622792655677&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.scandir%2Fdownload%2F%40nodelib%2Ffs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625795692378&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/@npmcli/git/download/@npmcli/git-2.1.0.tgz", + "integrity": "sha1-L7134UdTAkfTfzJZMNRXs+volPY=", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/@npmcli/installed-package-contents/download/@npmcli/installed-package-contents-1.0.7.tgz", + "integrity": "sha1-q3QIxhR5EblwqKviYc5RIjKj9Po=", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@npmcli/move-file/download/@npmcli/move-file-1.1.2.tgz", + "integrity": "sha1-GoLD43L3yuklPrZtclQ9a4aFxnQ=", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@npmcli/node-gyp/download/@npmcli/node-gyp-1.0.3.tgz", + "integrity": "sha1-qRLmN0GP/F8ts3XpO4WDdpGkOjM=", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.nlark.com/@npmcli/promise-spawn/download/@npmcli/promise-spawn-1.3.2.tgz", + "integrity": "sha1-QtTlao6SdPuhgNq8CupuOPKSdPU=", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.6", + "resolved": "https://registry.npmmirror.com/@npmcli/run-script/download/@npmcli/run-script-1.8.6.tgz", + "integrity": "sha1-GDFIAqZmCw1Lqkw6/n8a052MKLc=", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@nrwl/devkit": { + "version": "12.10.0", + "resolved": "https://registry.npmmirror.com/@nrwl/devkit/download/@nrwl/devkit-12.10.0.tgz", + "integrity": "sha1-z0od+xA2ISGFVI1oKWrCbkmKQcQ=", + "dev": true, + "requires": { + "@nrwl/tao": "12.10.0", + "ejs": "^3.1.5", + "ignore": "^5.0.4", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", + "integrity": "sha1-J6qn0uTKdkUvmNOt0JOnLJQ+3Jc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@nrwl/tao": { + "version": "12.10.0", + "resolved": "https://registry.npmmirror.com/@nrwl/tao/download/@nrwl/tao-12.10.0.tgz", + "integrity": "sha1-KM+72mb18QpJF98OcLlNBDNOFig=", + "dev": true, + "requires": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "nx": "12.10.0", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.0.0", + "yargs-parser": "20.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.0.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", + "integrity": "sha1-J6qn0uTKdkUvmNOt0JOnLJQ+3Jc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.2.1.tgz", + "integrity": "sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ=", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yargs-parser": { + "version": "20.0.0", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.0.0.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.0.0.tgz", + "integrity": "sha1-xlodqql3rWPOvdUhWRR7eJpOGak=", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "12.2.13", + "resolved": "https://registry.npmmirror.com/@schematics/angular/download/@schematics/angular-12.2.13.tgz", + "integrity": "sha1-W/PntpmkLX/X96oSu+RTTmcecgE=", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.13", + "@angular-devkit/schematics": "12.2.13", + "jsonc-parser": "3.0.0" + } + }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npm.taobao.org/@stylelint/postcss-css-in-js/download/@stylelint/postcss-css-in-js-0.37.2.tgz?cache=0&sync_timestamp=1599097529607&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40stylelint%2Fpostcss-css-in-js%2Fdownload%2F%40stylelint%2Fpostcss-css-in-js-0.37.2.tgz", + "integrity": "sha1-flqErRgfQjSiSAgDQipHuHSa89I=", + "dev": true, + "requires": { + "@babel/core": ">=7.9.0" + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmmirror.com/@stylelint/postcss-markdown/download/@stylelint/postcss-markdown-0.36.2.tgz", + "integrity": "sha1-ClQMRpL43N/BPI41LBfnv+4rs5E=", + "dev": true, + "requires": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + } + }, + "@swimlane/ngx-charts": { + "version": "18.0.1", + "resolved": "https://registry.npmmirror.com/@swimlane/ngx-charts/download/@swimlane/ngx-charts-18.0.1.tgz", + "integrity": "sha1-hMmZbVpmWQ2RHI4hj/snYYgMIs8=", + "requires": { + "@types/d3-shape": "^2.0.0", + "d3-array": "^2.9.1", + "d3-brush": "^2.1.0", + "d3-color": "^2.0.0", + "d3-format": "^2.0.0", + "d3-hierarchy": "^2.0.0", + "d3-interpolate": "^2.0.1", + "d3-scale": "^3.2.3", + "d3-selection": "^2.0.0", + "d3-shape": "^2.0.0", + "d3-time-format": "^3.0.0", + "d3-transition": "^2.0.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-color/download/d3-color-2.0.0.tgz?cache=0&sync_timestamp=1622917832534&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-color%2Fdownload%2Fd3-color-2.0.0.tgz", + "integrity": "sha1-jWJcq0Ltm49gGhdgo4n36pGJ1i4=" + }, + "d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-hierarchy/download/d3-hierarchy-2.0.0.tgz", + "integrity": "sha1-2riKWMo+ehvGyrOQ6JZn/MbSAhg=" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/d3-interpolate/download/d3-interpolate-2.0.1.tgz", + "integrity": "sha1-mL5JnPuKO5TU/2FpAFAaZKvJEWM=", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/d3-shape/download/d3-shape-2.1.0.tgz?cache=0&sync_timestamp=1622917833478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-shape%2Fdownload%2Fd3-shape-2.1.0.tgz", + "integrity": "sha1-O2qCzK+8Rd5VtX/PlWxYTe07Zm8=", + "requires": { + "d3-path": "1 - 2" + } + } + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@tootallnate/once/download/@tootallnate/once-1.1.2.tgz", + "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I=", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/@trysound/sax/download/@trysound/sax-0.2.0.tgz", + "integrity": "sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmmirror.com/@types/component-emitter/download/@types/component-emitter-1.2.11.tgz", + "integrity": "sha1-UNR9QrNHJTgXo5cJ/vA85moQhQY=", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@types/cookie/download/@types/cookie-0.4.1.tgz", + "integrity": "sha1-v9AsHyIkVnZ2wVRRmfh8OoYdh40=", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmmirror.com/@types/cors/download/@types/cors-2.8.12.tgz", + "integrity": "sha1-ayxRCnrXA56Y57jT1lmPQ1nlwIA=", + "dev": true + }, + "@types/d3-geo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.2.tgz", + "integrity": "sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-path": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/@types/d3-path/download/@types/d3-path-2.0.1.tgz", + "integrity": "sha1-ygPfqLlNit2XrQzZfpbiAGtHY8s=" + }, + "@types/d3-sankey": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz", + "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==", + "dev": true, + "requires": { + "@types/d3-shape": "^1" + }, + "dependencies": { + "@types/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==", + "dev": true + }, + "@types/d3-shape": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", + "dev": true, + "requires": { + "@types/d3-path": "^1" + } + } + } + }, + "@types/d3-shape": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/download/@types/d3-shape-2.1.3.tgz", + "integrity": "sha1-NdOXueaHq6oN6CNDslC5iXuMrPM=", + "requires": { + "@types/d3-path": "^2" + } + }, + "@types/d3-timer": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/download/@types/d3-timer-2.0.1.tgz", + "integrity": "sha1-/7ZiDSkGJPNyaqNiwMiktEyNcgA=" + }, + "@types/eslint": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/@types/eslint/download/@types/eslint-8.2.0.tgz", + "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/@types/eslint-scope/download/@types/eslint-scope-3.7.1.tgz", + "integrity": "sha1-jcOQp7T53Z8ShGKe/OmC5BYSEW4=", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz", + "integrity": "sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=", + "dev": true + }, + "@types/file-saver": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/file-saver/download/@types/file-saver-2.0.4.tgz", + "integrity": "sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg==", + "dev": true + }, + "@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz?cache=0&sync_timestamp=1637267477186&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.2.0.tgz", + "integrity": "sha1-vBtb86qS8lvV3TnzXFc2G9zlsus=", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.8.2", + "resolved": "https://registry.npmmirror.com/@types/jasmine/download/@types/jasmine-3.8.2.tgz", + "integrity": "sha1-J6sKqsKVgby95XdOGEP5Dfl3B44=", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmmirror.com/@types/jasminewd2/download/@types/jasminewd2-2.0.10.tgz", + "integrity": "sha1-rjHCN6pkIb3jDxBYsdIPRXflREM=", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/js-base64": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/@types/js-base64/download/@types/js-base64-3.3.1.tgz", + "integrity": "sha1-NsLW3BJid+oopNBZnQyvv1R7UeY=", + "dev": true, + "requires": { + "js-base64": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz", + "integrity": "sha1-l+3JA36gw4WFMgsolk3eOznkZg0=", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/mdast/download/@types/mdast-3.0.10.tgz", + "integrity": "sha1-RyQkSoKkWYiEy76bz9c9/5J+6K8=", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz", + "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A=", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@types/minimist/download/@types/minimist-1.2.2.tgz", + "integrity": "sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w=", + "dev": true + }, + "@types/mockjs": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@types/mockjs/download/@types/mockjs-1.0.4.tgz", + "integrity": "sha1-5waVHV4ztPCku3Ox+LEk4m8IHeA=" + }, + "@types/node": { + "version": "12.20.37", + "resolved": "https://registry.npmmirror.com/@types/node/download/@types/node-12.20.37.tgz", + "integrity": "sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz", + "integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE=", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@types/parse-json/download/@types/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1637284065529&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fparse-json%2Fdownload%2F%40types%2Fparse-json-4.0.0.tgz", + "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmmirror.com/@types/q/download/@types/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.19", + "resolved": "https://registry.npmmirror.com/@types/selenium-webdriver/download/@types/selenium-webdriver-3.0.19.tgz", + "integrity": "sha1-KOzt528VsTVTtOhgdNTPmgu+ScQ=", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz?cache=0&sync_timestamp=1637284095686&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fsource-list-map%2Fdownload%2F%40types%2Fsource-list-map-0.1.2.tgz", + "integrity": "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk=", + "dev": true + }, + "@types/swagger-schema-official": { + "version": "2.0.21", + "resolved": "https://registry.nlark.com/@types/swagger-schema-official/download/@types/swagger-schema-official-2.0.21.tgz", + "integrity": "sha1-VoEqhtzVe6YOXFFwXulqKy3Js3Q=", + "dev": true + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@types/unist/download/@types/unist-2.0.6.tgz?cache=0&sync_timestamp=1637284126736&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Funist%2Fdownload%2F%40types%2Funist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0=", + "dev": true + }, + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/@types/vfile/download/@types/vfile-3.0.2.tgz", + "integrity": "sha1-GcGM0jLfEc5vpq2AJZvIbDZrCbk=", + "dev": true, + "requires": { + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" + } + }, + "@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/@types/vfile-message/download/@types/vfile-message-2.0.0.tgz", + "integrity": "sha1-aQ5Grw/fwfn6rgDNBJzIiJV5J9U=", + "dev": true, + "requires": { + "vfile-message": "*" + } + }, + "@types/webpack-sources": { + "version": "0.1.9", + "resolved": "https://registry.nlark.com/@types/webpack-sources/download/@types/webpack-sources-0.1.9.tgz", + "integrity": "sha1-2mmwbrNPZDLmZYrLWmiTxV2YOSA=", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-4.29.3.tgz", + "integrity": "sha1-lcuAKai9i9nH9KuVB0p8shFa3vo=", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.29.3", + "@typescript-eslint/scope-manager": "4.29.3", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.29.3.tgz", + "integrity": "sha1-UuQ3ponM3vc+g8UQazQkCnBvFeE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.29.3.tgz", + "integrity": "sha1-SX3sZvOiLkWfbjBs8UAh5A7Ibhk=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3" + } + }, + "@typescript-eslint/types": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-4.29.3.tgz", + "integrity": "sha1-15gMSa72Q9CviVTJ8U9la3/RYBc=", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.29.3.tgz", + "integrity": "sha1-G6+tYQAVxN7TXIWnC2Ii+q1Zi0A=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.29.3.tgz", + "integrity": "sha1-xpF2CgC9hr+DINKpCpPYbTIvGr8=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.28.2.tgz", + "integrity": "sha1-Tr3sBqEIiOkybh1R2BrVKjYb0LA=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-4.29.3.tgz", + "integrity": "sha1-KsJVNfNMDpj1DA5rKMZ5wjV9RfI=", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "debug": "^4.3.1" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.29.3.tgz", + "integrity": "sha1-SX3sZvOiLkWfbjBs8UAh5A7Ibhk=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3" + } + }, + "@typescript-eslint/types": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-4.29.3.tgz", + "integrity": "sha1-15gMSa72Q9CviVTJ8U9la3/RYBc=", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.29.3.tgz", + "integrity": "sha1-G6+tYQAVxN7TXIWnC2Ii+q1Zi0A=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.29.3.tgz", + "integrity": "sha1-xpF2CgC9hr+DINKpCpPYbTIvGr8=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.28.2.tgz", + "integrity": "sha1-RR3OkDA6POKDdQERSV00ycIE5RA=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" + } + }, + "@typescript-eslint/types": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-4.28.2.tgz", + "integrity": "sha1-5rniNODppmxNJbq4gWYekUeCI7U=", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.28.2.tgz", + "integrity": "sha1-aAEpsqKFKJoV58YQjIRzmt86eYw=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.28.2.tgz", + "integrity": "sha1-v1akAIV7totZsxHm0KX771w7UTA=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.11.1.tgz", + "integrity": "sha1-K/12fq4aaZb0Mv9+jX/HVnnAtqc=", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.11.1.tgz?cache=0&sync_timestamp=1625473945010&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Ffloating-point-hex-parser%2Fdownload%2F%40webassemblyjs%2Ffloating-point-hex-parser-1.11.1.tgz", + "integrity": "sha1-9sYacF8P16auyqToGY8j2dwXnk8=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.11.1.tgz?cache=0&sync_timestamp=1625473943740&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.11.1.tgz", + "integrity": "sha1-GmMZLYeI5cASgAump6RscFKI/RY=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.11.1.tgz", + "integrity": "sha1-gyqQDrREiEzemnytRn+BUA9eWrU=", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/helper-numbers/download/@webassemblyjs/helper-numbers-1.11.1.tgz", + "integrity": "sha1-ZNgdohn7u6HjvRv8dPboxOEKYq4=", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha1-8ygkHkHnsZnQsgwY6IQpxEMyleE=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.11.1.tgz?cache=0&sync_timestamp=1625473968654&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.11.1.tgz", + "integrity": "sha1-Ie4GWntjXzGec48N1zv72igcCXo=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.11.1.tgz?cache=0&sync_timestamp=1625473943048&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fieee754%2Fdownload%2F%40webassemblyjs%2Fieee754-1.11.1.tgz", + "integrity": "sha1-ljkp6bvQVwnn4SJDoJkYCBKZJhQ=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.11.1.tgz?cache=0&sync_timestamp=1625473945849&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.11.1.tgz", + "integrity": "sha1-zoFLRVdOk9drrh+yZEq5zdlSeqU=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.11.1.tgz?cache=0&sync_timestamp=1625473943764&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Futf8%2Fdownload%2F%40webassemblyjs%2Futf8-1.11.1.tgz", + "integrity": "sha1-0fi3ZDaefG5rrjUOhU3smlnwo/8=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.11.1.tgz", + "integrity": "sha1-rSBuv0v5WgWM6YgKjAksXeyBk9Y=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.11.1.tgz", + "integrity": "sha1-hsXqMEhJdZt9iMR6MvTwOa48j3Y=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.11.1.tgz", + "integrity": "sha1-ZXtMIgL0zzs0X4pMZGHIwkGJhfI=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.11.1.tgz", + "integrity": "sha1-hspzRTT0F+m9PGfHocddi+QfsZk=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.nlark.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.11.1.tgz", + "integrity": "sha1-0Mc77ajuxUJvEK6O9VzuXnCEwvA=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/@yarnpkg/lockfile/download/@yarnpkg/lockfile-1.1.0.tgz", + "integrity": "sha1-53qX+9NFt22DJF7c0X05OxtB+zE=", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/abab/download/abab-2.0.5.tgz", + "integrity": "sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o=", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "dev": true + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/abs-svg-path/download/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-8.6.0.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/acorn-import-assertions/download/acorn-import-assertions-1.8.0.tgz?cache=0&sync_timestamp=1633349660084&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn-import-assertions%2Fdownload%2Facorn-import-assertions-1.8.0.tgz", + "integrity": "sha1-uitZOc5iwjjbbZPYHJsRGym4Vek=", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz?cache=0&sync_timestamp=1625793240297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.3.2.tgz", + "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/adjust-sourcemap-loader/download/adjust-sourcemap-loader-4.0.0.tgz?cache=0&sync_timestamp=1603701108010&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fadjust-sourcemap-loader%2Fdownload%2Fadjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha1-/EoP0ID30QRx8wpzIPJVYK3ijJk=", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.nlark.com/adler-32/download/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmmirror.com/adm-zip/download/adm-zip-0.4.16.tgz", + "integrity": "sha1-z0xQj9/6sCwmnLx/RxqHXwVXA2U=", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.nlark.com/agent-base/download/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npm.taobao.org/agentkeepalive/download/agentkeepalive-4.1.4.tgz?cache=0&sync_timestamp=1612490497760&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagentkeepalive%2Fdownload%2Fagentkeepalive-4.1.4.tgz", + "integrity": "sha1-2SgCikhiyxFxjlUieHLoQqRMlFs=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1622604530325&other_urls=https%3A%2F%2Fregistry.nlark.com%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz", + "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-8.8.2.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/download/ajv-formats-2.1.1.tgz", + "integrity": "sha1-bmaUAGWet0lzu/LjMycYCgmWtSA=", + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/download/ajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/alphanum-sort/download/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.nlark.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz?cache=0&sync_timestamp=1618847144938&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.2.tgz", + "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.nlark.com/ansi-html/download/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-3.1.2.tgz", + "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.nlark.com/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.nlark.com/are-we-there-yet/download/are-we-there-yet-1.1.7.tgz", + "integrity": "sha1-sVR0qTKtq0/4pQ2a36fk6SbyEUY=", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.nlark.com/arg/download/arg-4.1.3.tgz?cache=0&sync_timestamp=1629166537485&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farg%2Fdownload%2Farg-4.1.3.tgz", + "integrity": "sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.nlark.com/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/aria-query/download/aria-query-4.2.2.tgz?cache=0&sync_timestamp=1633308188641&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faria-query%2Fdownload%2Faria-query-4.2.2.tgz", + "integrity": "sha1-DSymyazrVriXfp/tau1+FbvS+Ds=", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.1.0.tgz?cache=0&sync_timestamp=1618846805394&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farr-flatten%2Fdownload%2Farr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/array-find-index/download/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-2.1.2.tgz", + "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", + "dev": true + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz?cache=0&sync_timestamp=1633411556939&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Farray-includes%2Fdownload%2Farray-includes-3.1.4.tgz", + "integrity": "sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/array-union/download/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/array-uniq/download/array-uniq-1.0.3.tgz?cache=0&sync_timestamp=1622605321175&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farray-uniq%2Fdownload%2Farray-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.nlark.com/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz", + "integrity": "sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/arrify/download/arrify-1.0.1.tgz?cache=0&sync_timestamp=1619599497996&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farrify%2Fdownload%2Farrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/asn1/download/asn1-0.2.6.tgz?cache=0&sync_timestamp=1635986760581&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasn1%2Fdownload%2Fasn1-0.2.6.tgz", + "integrity": "sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/astral-regex/download/astral-regex-2.0.0.tgz", + "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmmirror.com/async/download/async-2.6.3.tgz", + "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/async-limiter/download/async-limiter-1.0.1.tgz", + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/at-least-node/download/at-least-node-1.0.0.tgz", + "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmmirror.com/autoprefixer/download/autoprefixer-9.8.8.tgz?cache=0&sync_timestamp=1635421245353&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.8.8.tgz", + "integrity": "sha1-/UvUWVOF+m8GWZ3nSaTV96R0lXo=", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz?cache=0&sync_timestamp=1604101244098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.11.0.tgz", + "integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk=", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmmirror.com/axios/download/axios-0.21.4.tgz?cache=0&sync_timestamp=1635213960429&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faxios%2Fdownload%2Faxios-0.21.4.tgz", + "integrity": "sha1-xnuQ3AVo5cHPKwuFjEO6KOLtpXU=", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/axobject-query/download/axobject-query-2.2.0.tgz?cache=0&sync_timestamp=1633307441530&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faxobject-query%2Fdownload%2Faxobject-query-2.2.0.tgz", + "integrity": "sha1-lD1H4QwLcEqkInXiDt83ImSJib4=", + "dev": true + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmmirror.com/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1634769717079&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz", + "integrity": "sha1-k2POhMEMmkDmx1N0jhRBtgyKC4E=", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz?cache=0&sync_timestamp=1636687869321&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Floader-utils%2Fdownload%2Floader-utils-1.4.0.tgz", + "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.nlark.com/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz?cache=0&sync_timestamp=1618847141951&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.3.tgz?cache=0&sync_timestamp=1636799838015&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha1-btjjCYGwYvj+asqIc6N+vMjMHA8=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.2.5.tgz?cache=0&sync_timestamp=1636799836766&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs3%2Fdownload%2Fbabel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha1-J3mEahahZSJEriaLHpBq2hB/r5I=", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.2.3.tgz?cache=0&sync_timestamp=1636799764770&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-regenerator%2Fdownload%2Fbabel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha1-LpgI9QJ8QzbJlJkrSKQmJYDLjW0=", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/bail/download/bail-1.0.5.tgz?cache=0&sync_timestamp=1636274515578&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbail%2Fdownload%2Fbail-1.0.5.tgz", + "integrity": "sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/base64-arraybuffer/download/base64-arraybuffer-1.0.1.tgz?cache=0&sync_timestamp=1628588917496&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbase64-arraybuffer%2Fdownload%2Fbase64-arraybuffer-1.0.1.tgz", + "integrity": "sha1-h70TUlYm20qYOOAKUIwrc+/PNIw=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/base64id/download/base64id-2.0.0.tgz", + "integrity": "sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.nlark.com/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/bl/download/bl-4.1.0.tgz?cache=0&sync_timestamp=1617381897308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbl%2Fdownload%2Fbl-4.1.0.tgz", + "integrity": "sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/blocking-proxy/download/blocking-proxy-1.0.1.tgz", + "integrity": "sha1-gdb9H+E6TA1pV99/kbdemNrEDLI=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.nlark.com/body-parser/download/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.0.tgz?cache=0&sync_timestamp=1637015110760&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.nlark.com/bonjour/download/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/browserslist/download/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/browserstack/download/browserstack-1.6.1.tgz", + "integrity": "sha1-4FH5cz7DtQdlnzlcekdlobHjWLM=", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/agent-base/download/agent-base-4.3.0.tgz", + "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.nlark.com/https-proxy-agent/download/https-proxy-agent-2.2.4.tgz", + "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/btoa/download/btoa-1.2.1.tgz", + "integrity": "sha1-AamQn4ssk/a/aAuiYTHrMPf6PXM=", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.nlark.com/buffer/download/buffer-5.7.1.tgz", + "integrity": "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/buffer-indexof/download/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/builtins/download/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.0.0.tgz?cache=0&sync_timestamp=1637015110760&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbytes%2Fdownload%2Fbytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.nlark.com/cacache/download/cacache-15.2.0.tgz", + "integrity": "sha1-c69193xY5y2MYwp6KFjLGO9SM4k=", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237266442&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz", + "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-callsite/download/caller-callsite-2.0.0.tgz?cache=0&sync_timestamp=1633617041481&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-callsite%2Fdownload%2Fcaller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/callsites/download/callsites-2.0.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1633674209796&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-6.2.2.tgz?cache=0&sync_timestamp=1633332959770&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-6.2.2.tgz", + "integrity": "sha1-XnVda6UaoiPsfT1S8ld4IQ+dw8A=", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", + "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/canonical-path/download/canonical-path-1.0.0.tgz", + "integrity": "sha1-/LRwwjlY3vhQgYVr56hukE8YDR0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/ccount/download/ccount-1.1.0.tgz", + "integrity": "sha1-JGaH3rtgFHNRMb6KurLZOJj40EM=", + "dev": true + }, + "cfb": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/cfb/download/cfb-1.2.1.tgz", + "integrity": "sha1-IJQp5MaO/TBkH2/HSy1gKL0gJAI=", + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0", + "printj": "~1.3.0" + }, + "dependencies": { + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/adler-32/download/adler-32-1.3.0.tgz", + "integrity": "sha1-PK0bcc36afbIqR8+NhXTGk/e3HI=", + "requires": { + "printj": "~1.2.2" + }, + "dependencies": { + "printj": { + "version": "1.2.3", + "resolved": "https://registry.nlark.com/printj/download/printj-1.2.3.tgz", + "integrity": "sha1-LPsrGSoeU4XbvltGZYrDSqgoUIo=" + } + } + }, + "printj": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/printj/download/printj-1.3.0.tgz", + "integrity": "sha1-kBipGKeQ5DcH8QYl1uEBh6Nnz/Y=" + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/character-entities/download/character-entities-1.2.4.tgz?cache=0&sync_timestamp=1635869177182&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-entities%2Fdownload%2Fcharacter-entities-1.2.4.tgz", + "integrity": "sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs=", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/character-entities-html4/download/character-entities-html4-1.1.4.tgz", + "integrity": "sha1-DmSwo3U92/H9wETF/QHQGZoC4SU=", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/download/character-entities-legacy-1.1.4.tgz?cache=0&sync_timestamp=1635911795757&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-entities-legacy%2Fdownload%2Fcharacter-entities-legacy-1.1.4.tgz", + "integrity": "sha1-lLwYRdznClu50uzHSHJWYSk9j8E=", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/download/character-reference-invalid-1.1.4.tgz?cache=0&sync_timestamp=1636446246852&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-reference-invalid%2Fdownload%2Fcharacter-reference-invalid-1.1.4.tgz", + "integrity": "sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA=", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1634639141514&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz", + "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-2.0.0.tgz", + "integrity": "sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz", + "integrity": "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw=", + "dev": true + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha1-Oeg2B52x088vmI3EjFGIpEBYtgA=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.nlark.com/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmmirror.com/clean-css/download/clean-css-3.4.28.tgz?cache=0&sync_timestamp=1634992314911&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fclean-css%2Fdownload%2Fclean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dev": true, + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/commander/download/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1622605328444&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", + "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/cli-cursor/download/cli-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629747506749&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-3.1.0.tgz", + "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/cli-spinners/download/cli-spinners-2.6.1.tgz?cache=0&sync_timestamp=1633109609172&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.6.1.tgz", + "integrity": "sha1-rclU6+KBw3pjGb+kAebdJIj/tw0=", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/download/cli-truncate-2.1.0.tgz", + "integrity": "sha1-w54ovwXtzeW+O5iZKiLe7Vork8c=", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-3.0.0.tgz", + "integrity": "sha1-Md3BCTCht+C2ewjJbC9Jt3p4l4c=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/cli-width/download/cli-width-3.0.0.tgz", + "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/cliui/download/cliui-5.0.0.tgz", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/clone-deep/download/clone-deep-4.0.1.tgz", + "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/clone-regexp/download/clone-regexp-2.2.0.tgz?cache=0&sync_timestamp=1617892092032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone-regexp%2Fdownload%2Fclone-regexp-2.2.0.tgz", + "integrity": "sha1-fWXgCIXNh5ZAXDWnN+eoa3Qp428=", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + }, + "dependencies": { + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-2.1.0.tgz", + "integrity": "sha1-zXNKVoZOI7lWv058ZsOWpMCyLC0=", + "dev": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.nlark.com/codepage/download/codepage-1.15.0.tgz?cache=0&sync_timestamp=1627596487574&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcodepage%2Fdownload%2Fcodepage-1.15.0.tgz", + "integrity": "sha1-LgBRkCSzlCTsZu6z7AcifmkmGKs=" + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.6.tgz?cache=0&sync_timestamp=1615197514795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcollapse-white-space%2Fdownload%2Fcollapse-white-space-1.0.6.tgz", + "integrity": "sha1-5jYpwAFmZXkgYNu+t5xCI50sUoc=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colord": { + "version": "2.9.1", + "resolved": "https://registry.npmmirror.com/colord/download/colord-2.9.1.tgz?cache=0&sync_timestamp=1634659871445&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcolord%2Fdownload%2Fcolord-2.9.1.tgz", + "integrity": "sha1-yWHqDv61fJ8PSDRFjybLnMSj+Q4=", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/colorette/download/colorette-1.4.0.tgz", + "integrity": "sha1-UZD7uHJ2JZqGrXAL/yxtb6o/ykA=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/colors/download/colors-1.4.0.tgz", + "integrity": "sha1-xQSRR51MG9rtLJztMs98fcI2D3g=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.nlark.com/combined-stream/download/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" + }, + "comment-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/comment-parser/download/comment-parser-1.2.4.tgz?cache=0&sync_timestamp=1637132117502&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcomment-parser%2Fdownload%2Fcomment-parser-1.2.4.tgz", + "integrity": "sha1-SJ8+5V39GEpuS/+zG6uihEU8t2A=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", + "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.nlark.com/connect/download/connect-3.7.0.tgz?cache=0&sync_timestamp=1618847040246&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconnect%2Fdownload%2Fconnect-3.7.0.tgz", + "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.nlark.com/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz?cache=0&sync_timestamp=1618847040596&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconnect-history-api-fallback%2Fdownload%2Fconnect-history-api-fallback-1.6.0.tgz", + "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045508580&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz", + "integrity": "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.nlark.com/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/copy-anything/download/copy-anything-2.0.3.tgz", + "integrity": "sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/download/copy-webpack-plugin-9.0.1.tgz?cache=0&sync_timestamp=1637161330355&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-9.0.1.tgz", + "integrity": "sha1-tx0hmRWZ9hpO4AunkIe4uiebu1k=", + "dev": true, + "requires": { + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-3.1.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "core-js": { + "version": "3.16.0", + "resolved": "https://registry.npmmirror.com/core-js/download/core-js-3.16.0.tgz", + "integrity": "sha1-HUb7M3ILwfp/kNIEMfNqVUCFiYY=", + "dev": true + }, + "core-js-compat": { + "version": "3.19.1", + "resolved": "https://registry.npmmirror.com/core-js-compat/download/core-js-compat-3.19.1.tgz?cache=0&sync_timestamp=1635883123462&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcore-js-compat%2Fdownload%2Fcore-js-compat-3.19.1.tgz", + "integrity": "sha1-/lmPGpvzcxDXfDgTlo6ffHu5lHY=", + "dev": true, + "requires": { + "browserslist": "^4.17.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", + "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.19.1", + "resolved": "https://registry.npmmirror.com/core-js-pure/download/core-js-pure-3.19.1.tgz?cache=0&sync_timestamp=1635883214117&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcore-js-pure%2Fdownload%2Fcore-js-pure-3.19.1.tgz", + "integrity": "sha1-7f/B/HY0AApVugXpWz8P6Vh6WqQ=", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz", + "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npm.taobao.org/cors/download/cors-2.8.5.tgz", + "integrity": "sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.nlark.com/cosmiconfig/download/cosmiconfig-7.0.1.tgz", + "integrity": "sha1-cU11ZSLKzoZ4Z8y0R0xdAbuuXW0=", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.nlark.com/crc-32/download/crc-32-1.2.0.tgz", + "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "critters": { + "version": "0.0.12", + "resolved": "https://registry.npmmirror.com/critters/download/critters-0.0.12.tgz", + "integrity": "sha1-MrqodSbgU6QbZ+GZIWc+2SJk4qs=", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.1.3", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.nlark.com/parse5/download/parse5-6.0.1.tgz", + "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=", + "dev": true + }, + "postcss": { + "version": "8.4.1", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-8.4.1.tgz", + "integrity": "sha512-WqLs/TTzXdG+/A4ZOOK9WDZiikrRaiA+eoEb/jz2DT9KUhMNHgP7yKPO8vwi62ZCsb703Gwb7BMZwDzI54Y2Ag==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + } + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz", + "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/css-blank-pseudo/download/css-blank-pseudo-0.1.4.tgz?cache=0&sync_timestamp=1631804332345&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-blank-pseudo%2Fdownload%2Fcss-blank-pseudo-0.1.4.tgz", + "integrity": "sha1-3979MlS/ioICeZNnTM81SDv8s8U=", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.nlark.com/css-declaration-sorter/download/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha1-6YUuTPlAunn1CdlCWxN9H5RDjcI=", + "dev": true, + "requires": { + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.nlark.com/css-has-pseudo/download/css-has-pseudo-0.10.0.tgz", + "integrity": "sha1-PGQqs0yiQsWcQaEl35EFhB9pZu4=", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/cssesc/download/cssesc-2.0.0.tgz", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-5.0.0.tgz", + "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "requires": { + "utrie": "^1.0.2" + } + }, + "css-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/css-loader/download/css-loader-6.2.0.tgz?cache=0&sync_timestamp=1635967924209&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcss-loader%2Fdownload%2Fcss-loader-6.2.0.tgz", + "integrity": "sha1-lmPZRDhB3pV6PLm86i7aZbM3cHE=", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/css-minimizer-webpack-plugin/download/css-minimizer-webpack-plugin-3.0.2.tgz", + "integrity": "sha1-j6298QEoy0Aie/8nWku0dBJTQkU=", + "dev": true, + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "p-limit": "^3.0.2", + "postcss": "^8.3.5", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-3.1.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/css-parse/download/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/css-prefers-color-scheme/download/css-prefers-color-scheme-3.1.1.tgz?cache=0&sync_timestamp=1631886210994&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-prefers-color-scheme%2Fdownload%2Fcss-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha1-b4MKJxQZnU8NDQu4onkW7WXP8fQ=", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.nlark.com/css-select/download/css-select-4.1.3.tgz?cache=0&sync_timestamp=1622994276976&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-select%2Fdownload%2Fcss-select-4.1.3.tgz", + "integrity": "sha1-pwRA9wMX8maRGK10/xBeZYSccGc=", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/css-tree/download/css-tree-1.1.3.tgz", + "integrity": "sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz", + "integrity": "sha1-P3tweq32M7r2LCzrhXm1RbtA9/4=", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npm.taobao.org/cssdb/download/cssdb-4.4.0.tgz", + "integrity": "sha1-O/LypowQ9cagir2SN4Mx7oA83bA=", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "cssnano": { + "version": "5.0.11", + "resolved": "https://registry.npmmirror.com/cssnano/download/cssnano-5.0.11.tgz?cache=0&sync_timestamp=1637085734194&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcssnano%2Fdownload%2Fcssnano-5.0.11.tgz", + "integrity": "sha512-5SHM31NAAe29jvy0MJqK40zZ/8dGlnlzcfHKw00bWMVFp8LWqtuyPSFwbaoIoxvt71KWJOfg8HMRGrBR3PExCg==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.1.7", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.1.7", + "resolved": "https://registry.npmmirror.com/cssnano-preset-default/download/cssnano-preset-default-5.1.7.tgz?cache=0&sync_timestamp=1637084922741&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcssnano-preset-default%2Fdownload%2Fcssnano-preset-default-5.1.7.tgz", + "integrity": "sha512-bWDjtTY+BOqrqBtsSQIbN0RLGD2Yr2CnecpP0ydHNafh9ZUEre8c8VYTaH9FEbyOt0eIfEUAYYk5zj92ioO8LA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.1", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.4", + "postcss-merge-rules": "^5.0.3", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.3", + "postcss-minify-params": "^5.0.2", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.3", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.2" + } + }, + "cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/cssnano-utils/download/cssnano-utils-2.0.1.tgz", + "integrity": "sha1-hmCqKzfthp0uLyKRgZapqLZJjOI=", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.2.0.tgz?cache=0&sync_timestamp=1606408777341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsso%2Fdownload%2Fcsso-4.2.0.tgz", + "integrity": "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/csstype/download/csstype-3.0.10.tgz?cache=0&sync_timestamp=1637224507298&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2Fdownload%2Fcsstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/custom-event/download/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/d3-array/download/d3-array-2.12.1.tgz", + "integrity": "sha1-4gtBqvzf/fXVCSgATs7PgVpGXoE=", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-brush": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/d3-brush/download/d3-brush-2.1.0.tgz", + "integrity": "sha1-ra37sQTok3rxQumm4gKDJvBHEGU=", + "requires": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.7.tgz", + "integrity": "sha1-NJvSqpl32wcQkcExRNXk8WtbMQ4=" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.nlark.com/d3-color/download/d3-color-1.4.1.tgz?cache=0&sync_timestamp=1622917832534&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-color%2Fdownload%2Fd3-color-1.4.1.tgz", + "integrity": "sha1-xSACv4hGraRCTVXZeYL+8m6zvIo=" + }, + "d3-composite-projections": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/d3-composite-projections/download/d3-composite-projections-1.4.0.tgz", + "integrity": "sha1-J7GC+mNaWGk0n+kRzgGAuXTRfxI=", + "requires": { + "d3-geo": "^2.0.1", + "d3-path": "^2.0.0" + }, + "dependencies": { + "d3-geo": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/d3-geo/download/d3-geo-2.0.2.tgz", + "integrity": "sha1-wGXBtx/oxfG+ZX5fQ9m90BA4PEA=", + "requires": { + "d3-array": "^2.5.0" + } + } + } + }, + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-dispatch/download/d3-dispatch-2.0.0.tgz?cache=0&sync_timestamp=1622918261265&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-dispatch%2Fdownload%2Fd3-dispatch-2.0.0.tgz", + "integrity": "sha1-ihjhb3bdP8rvQhY8l7kmqptV588=" + }, + "d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-drag/download/d3-drag-2.0.0.tgz", + "integrity": "sha1-nq8EbOntHCXIhmGRHB1aTY636m0=", + "requires": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.nlark.com/d3-dsv/download/d3-dsv-1.2.0.tgz", + "integrity": "sha1-nV91w6X4q9YR900/WEew1DOLiFw=", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.nlark.com/d3-ease/download/d3-ease-1.0.7.tgz", + "integrity": "sha1-moNIkO+LiujFWLL+Vb1X9Zk7heI=" + }, + "d3-format": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-format/download/d3-format-2.0.0.tgz", + "integrity": "sha1-oQvMD5hsNytym6RHOCQTqr9bB2c=" + }, + "d3-geo": { + "version": "1.6.4", + "resolved": "https://registry.nlark.com/d3-geo/download/d3-geo-1.6.4.tgz", + "integrity": "sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk=", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/download/d3-array-1.2.4.tgz", + "integrity": "sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=" + } + } + }, + "d3-geo-projection": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz", + "integrity": "sha1-ffjh6dBG1jHGUJ9+UxNX1K3CSqM=", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.1.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/download/d3-array-1.2.4.tgz", + "integrity": "sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=" + } + } + }, + "d3-hexjson": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.1.1.tgz?cache=0&sync_timestamp=1605174916023&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fd3-hexjson%2Fdownload%2Fd3-hexjson-1.1.1.tgz", + "integrity": "sha1-oeJk/5A7sJuPj0vFnHJEepH0YP4=", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/download/d3-array-1.2.4.tgz", + "integrity": "sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=" + } + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.nlark.com/d3-hierarchy/download/d3-hierarchy-1.1.9.tgz", + "integrity": "sha1-L2vuJMqupD+Nw3VF+gFihVlkeoM=" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/d3-interpolate/download/d3-interpolate-1.4.0.tgz", + "integrity": "sha1-Um554tgNqjg/ngwcHH3MDwWD6Yc=", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-path/download/d3-path-2.0.0.tgz?cache=0&sync_timestamp=1622917833000&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-path%2Fdownload%2Fd3-path-2.0.0.tgz", + "integrity": "sha1-VdhqwTGgVIra4kHuv7VrRYLdCdg=" + }, + "d3-sankey": { + "version": "0.9.1", + "resolved": "https://registry.nlark.com/d3-sankey/download/d3-sankey-0.9.1.tgz", + "integrity": "sha1-uFAUWjKEERY23eyQ39qMZJGb7k4=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/download/d3-array-1.2.4.tgz", + "integrity": "sha1-Y1zk1e6nWfb2BYY9vPww7cc39x8=" + } + } + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/d3-scale/download/d3-scale-3.3.0.tgz", + "integrity": "sha1-KMYAsp9H5bnNLfl0nCBnJ5ZiA/M=", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-selection/download/d3-selection-2.0.0.tgz", + "integrity": "sha1-lKEWOOohQbdWX4g3gNq8fvamEGY=" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.nlark.com/d3-shape/download/d3-shape-1.3.7.tgz?cache=0&sync_timestamp=1622917833478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-shape%2Fdownload%2Fd3-shape-1.3.7.tgz", + "integrity": "sha1-32OAG+B7yYa8VPY3ibT+UCmStdc=", + "requires": { + "d3-path": "1" + }, + "dependencies": { + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.nlark.com/d3-path/download/d3-path-1.0.9.tgz?cache=0&sync_timestamp=1622917833000&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-path%2Fdownload%2Fd3-path-1.0.9.tgz", + "integrity": "sha1-SMBQux/owmJJOoyvVSTj6VkXAc8=" + } + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/d3-time/download/d3-time-2.1.1.tgz?cache=0&sync_timestamp=1622916838153&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-time%2Fdownload%2Fd3-time-2.1.1.tgz", + "integrity": "sha1-6dioqIaR9FSOaMoIXl/5VnJKZoI=", + "requires": { + "d3-array": "2" + } + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/d3-time-format/download/d3-time-format-3.0.0.tgz", + "integrity": "sha1-34BWyDZZ4B8grF2l/ernwI1fG7Y=", + "requires": { + "d3-time": "1 - 2" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.nlark.com/d3-timer/download/d3-timer-1.0.10.tgz", + "integrity": "sha1-3+dripF0iDGxO22ceT/71QjdneU=" + }, + "d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/d3-transition/download/d3-transition-2.0.0.tgz", + "integrity": "sha1-Nm73DCLviNHjQQX1B1FpkaKRyUw=", + "requires": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.4.tgz", + "integrity": "sha1-3Tx412U9K7NZKErkeGRdlZRMgpc=" + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.nlark.com/dagre/download/dagre-0.8.5.tgz", + "integrity": "sha1-ujCwBV2sErbB/MJHgXRCd30Gr+4=", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073454623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "2.26.0", + "resolved": "https://registry.npmmirror.com/date-fns/download/date-fns-2.26.0.tgz?cache=0&sync_timestamp=1637308994584&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdate-fns%2Fdownload%2Fdate-fns-2.26.0.tgz", + "integrity": "sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg==" + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/date-format/download/date-format-3.0.0.tgz", + "integrity": "sha1-64eANlx9KxURB4+0keZHl4DzrZU=", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/debug/download/debug-4.3.2.tgz", + "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1633055756574&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/decamelize-keys/download/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/map-obj/download/map-obj-1.0.1.tgz?cache=0&sync_timestamp=1634552719803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmap-obj%2Fdownload%2Fmap-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/deep-equal/download/deep-equal-1.1.1.tgz", + "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz", + "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/default-gateway/download/default-gateway-4.2.0.tgz", + "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/define-lazy-prop/download/define-lazy-prop-2.0.0.tgz", + "integrity": "sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz", + "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/globby/download/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/p-map/download/p-map-2.1.0.tgz?cache=0&sync_timestamp=1635931861684&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-map%2Fdownload%2Fp-map-2.1.0.tgz", + "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/delegates/download/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.nlark.com/dependency-graph/download/dependency-graph-0.11.0.tgz", + "integrity": "sha1-rAzn7WilTaIhZahel6AdU/XrLic=", + "dev": true + }, + "desandro-matches-selector": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/desandro-matches-selector/download/desandro-matches-selector-2.0.2.tgz", + "integrity": "sha1-cXvu1NwT59jzdi9wem1YpndCGOE=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-browser": { + "version": "5.2.1", + "resolved": "https://registry.nlark.com/detect-browser/download/detect-browser-5.2.1.tgz?cache=0&sync_timestamp=1631836807281&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdetect-browser%2Fdownload%2Fdetect-browser-5.2.1.tgz", + "integrity": "sha1-uIT42E6PM7uHT/7RC0vuomEz/NE=" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/detect-node/download/detect-node-2.1.0.tgz?cache=0&sync_timestamp=1621146954463&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdetect-node%2Fdownload%2Fdetect-node-2.1.0.tgz", + "integrity": "sha1-yccHdaScPQO8LAbZpzvlUPl4+LE=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/di/download/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/diff/download/diff-4.0.2.tgz", + "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.nlark.com/dns-packet/download/dns-packet-1.3.4.tgz", + "integrity": "sha1-40VQZYJKJQe6iGxVqJljuxB97G8=", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/dom-serialize/download/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz", + "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz", + "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", + "dev": true + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-4.2.2.tgz", + "integrity": "sha1-6CXXIdGahrjCAaNSZOImxnjudV8=", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz", + "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.nlark.com/dot-prop/download/dot-prop-5.3.0.tgz", + "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz", + "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", + "dev": true + } + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.nlark.com/duplexer/download/duplexer-0.1.2.tgz", + "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "echarts": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/echarts/download/echarts-5.2.2.tgz", + "integrity": "sha1-7DyLKhUcu6cbo8LHz5svIEfOQ3A=", + "requires": { + "tslib": "2.3.0", + "zrender": "5.2.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/ejs/download/ejs-3.1.6.tgz", + "integrity": "sha1-W/0KBol0O7UmizVQzO7rvBcCgio=", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "electron-to-chromium": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.3.tgz", + "integrity": "sha512-hfpppjYhqIZB8jrNb0rNceQRkSnBN7QJl3W26O1jUv3F3BkQknqy1YTqVXkFnIcFtBc3Qnv5M7r5Lez2iOLgZA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/encoding/download/encoding-0.1.13.tgz", + "integrity": "sha1-VldK/deR9UqOmyeFwFgqLSYhD6k=", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.6.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.6.3.tgz", + "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/engine.io/download/engine.io-6.1.0.tgz?cache=0&sync_timestamp=1636357215103&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fengine.io%2Fdownload%2Fengine.io-6.1.0.tgz", + "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.1.tgz", + "integrity": "sha1-r9cT/ibr0hupXOth+agRblClN9E=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmmirror.com/ws/download/ws-8.2.3.tgz", + "integrity": "sha1-Y6VkVtsbBDZ9C3IaC4DK5ti+y7o=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/engine.io-parser/download/engine.io-parser-5.0.2.tgz?cache=0&sync_timestamp=1636871351259&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fengine.io-parser%2Fdownload%2Fengine.io-parser-5.0.2.tgz", + "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==", + "dev": true, + "requires": { + "base64-arraybuffer": "~1.0.1" + } + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-5.8.3.tgz", + "integrity": "sha1-bVUtRlzOBCP1s9cYUR6lOCansvA=", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz", + "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/ent/download/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508189267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz", + "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/env-paths/download/env-paths-2.2.1.tgz?cache=0&sync_timestamp=1630095479786&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenv-paths%2Fdownload%2Fenv-paths-2.2.1.tgz", + "integrity": "sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI=", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/err-code/download/err-code-2.0.3.tgz", + "integrity": "sha1-I8Lzt1b/38YI0w4nyalBAkgH5/k=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.nlark.com/errno/download/errno-0.1.8.tgz", + "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.nlark.com/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.19.1.tgz", + "integrity": "sha1-1IhXlodpFpWd547aoN9FZicRXsM=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/download/es-module-lexer-0.7.1.tgz?cache=0&sync_timestamp=1633645560577&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-module-lexer%2Fdownload%2Fes-module-lexer-0.7.1.tgz", + "integrity": "sha1-wsjg9G8t8GJ0za8N0/OzPgoLJn0=", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/es6-promise/download/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/es6-promisify/download/es6-promisify-5.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fes6-promisify%2Fdownload%2Fes6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.8.tgz", + "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", + "dev": true + } + } + }, + "esbuild-android-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/download/esbuild-android-arm64-0.13.8.tgz?cache=0&sync_timestamp=1637462928775&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-android-arm64%2Fdownload%2Fesbuild-android-arm64-0.13.8.tgz", + "integrity": "sha1-wg6HXDyYFksf+6myhje9+W9ennw=", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/download/esbuild-darwin-64-0.13.8.tgz", + "integrity": "sha1-9G5rRx3b9iJlI0gIpqGqkd8YpBc=", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/download/esbuild-darwin-arm64-0.13.8.tgz", + "integrity": "sha1-qZEVemAT+s1PLhQVm32lJibJAVQ=", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/download/esbuild-freebsd-64-0.13.8.tgz", + "integrity": "sha1-MBYB0uRDrUWJYONZtAKhfZUAvp0=", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/download/esbuild-freebsd-arm64-0.13.8.tgz", + "integrity": "sha1-A5pjrMEuwIkgBsFH6iIeVfkSWp8=", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-32/download/esbuild-linux-32-0.13.8.tgz", + "integrity": "sha1-xTe2fX5pS2C/onhlgUEoOMa6AoQ=", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-64/download/esbuild-linux-64-0.13.8.tgz", + "integrity": "sha1-AJL8igZAAad3v6DjtCW7i+j5bmo=", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/download/esbuild-linux-arm-0.13.8.tgz", + "integrity": "sha1-rWNPlr8pdVNpB665/bdaMZT03c4=", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/download/esbuild-linux-arm64-0.13.8.tgz?cache=0&sync_timestamp=1637498766925&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-linux-arm64%2Fdownload%2Fesbuild-linux-arm64-0.13.8.tgz", + "integrity": "sha1-XNPyu5JCEpcUgujbwlxK/QmygRA=", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/download/esbuild-linux-mips64le-0.13.8.tgz", + "integrity": "sha1-V4V+3+v5v2V2bci+FjfyF5yZBXI=", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/download/esbuild-linux-ppc64le-0.13.8.tgz?cache=0&sync_timestamp=1637462927819&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-linux-ppc64le%2Fdownload%2Fesbuild-linux-ppc64le-0.13.8.tgz", + "integrity": "sha1-/bgqBZpbhrsQ+0IJG0689Ii5zUY=", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/download/esbuild-netbsd-64-0.13.8.tgz", + "integrity": "sha1-14eecSPTssBHVOzovQYapoZt7v8=", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/download/esbuild-openbsd-64-0.13.8.tgz?cache=0&sync_timestamp=1637462928360&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-openbsd-64%2Fdownload%2Fesbuild-openbsd-64-0.13.8.tgz", + "integrity": "sha1-iLKAtssKP2rbYKvyf8UGxQajXPA=", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/download/esbuild-sunos-64-0.13.8.tgz?cache=0&sync_timestamp=1637498783394&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-sunos-64%2Fdownload%2Fesbuild-sunos-64-0.13.8.tgz", + "integrity": "sha1-Iprnx3AxlqWKzQ8Cka2b69qBXWM=", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-wasm/download/esbuild-wasm-0.13.8.tgz", + "integrity": "sha1-80E0wYf/z8ItR26SWRf3C6tA+LA=", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-windows-32/download/esbuild-windows-32-0.13.8.tgz", + "integrity": "sha1-iS0JPjKiHAyRNeWg/9w4Cutw52M=", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-windows-64/download/esbuild-windows-64-0.13.8.tgz?cache=0&sync_timestamp=1637462927131&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fesbuild-windows-64%2Fdownload%2Fesbuild-windows-64-0.13.8.tgz", + "integrity": "sha1-fe/Y15rju35vU7ZacZC+fa+QFoY=", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/download/esbuild-windows-arm64-0.13.8.tgz", + "integrity": "sha1-5ZrgBElv2KWrZ7/HlFouR0gNb7k=", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmmirror.com/eslint/download/eslint-7.32.0.tgz?cache=0&sync_timestamp=1637475730061&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint%2Fdownload%2Feslint-7.32.0.tgz", + "integrity": "sha1-xtMooUvj+wjI0dIeEsAv23oqgS0=", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz?cache=0&sync_timestamp=1635561808745&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.12.11.tgz", + "integrity": "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", + "dev": true + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz?cache=0&sync_timestamp=1620975524854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-utils%2Fdownload%2Feslint-utils-2.1.0.tgz", + "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmmirror.com/globals/download/globals-13.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-13.12.0.tgz", + "integrity": "sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4=", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971632960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.nlark.com/eslint-config-prettier/download/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha1-90cbILb+ipqSVMxoRFQgKIai3Xo=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.nlark.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz?cache=0&sync_timestamp=1629046642917&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-import-resolver-node%2Fdownload%2Feslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha1-QEi5WDldqJZoJSAB29nsprg7rL0=", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.1.tgz?cache=0&sync_timestamp=1634151608499&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-module-utils%2Fdownload%2Feslint-module-utils-2.7.1.tgz", + "integrity": "sha1-tDUAHJ+N1Kt/bQ78rkuWltTCS3w=", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-2.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.24.2.tgz?cache=0&sync_timestamp=1636529205526&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-plugin-import%2Fdownload%2Feslint-plugin-import-2.24.2.tgz", + "integrity": "sha1-LIzS40HziFkY7ifRhHmRCt57tNo=", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz", + "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "eslint-plugin-jsdoc": { + "version": "36.0.8", + "resolved": "https://registry.npmmirror.com/eslint-plugin-jsdoc/download/eslint-plugin-jsdoc-36.0.8.tgz", + "integrity": "sha1-zXL3ZZPI+zNiN0sAUtTUmycRQIo=", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "0.10.8", + "comment-parser": "1.2.4", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + } + }, + "eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-prefer-arrow/download/eslint-plugin-prefer-arrow-1.2.3.tgz?cache=0&sync_timestamp=1611628691162&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-prefer-arrow%2Fdownload%2Feslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha1-5/uz+kzYT/EBW5xRrYZVDlUEEEE=", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/download/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha1-6d2yAO+289Bf/oOxZlpxavSjh+U=", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1637466929956&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz?cache=0&sync_timestamp=1620975524854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-utils%2Fdownload%2Feslint-utils-3.0.0.tgz", + "integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/espree/download/espree-7.3.1.tgz?cache=0&sync_timestamp=1637466456948&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fespree%2Fdownload%2Fespree-7.3.1.tgz", + "integrity": "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz", + "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/esquery/download/esquery-1.4.0.tgz", + "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "eta": { + "version": "1.12.3", + "resolved": "https://registry.nlark.com/eta/download/eta-1.12.3.tgz", + "integrity": "sha1-KYLQit++85+fpQ4vvULXM35zOLE=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.nlark.com/etag/download/etag-1.8.1.tgz?cache=0&sync_timestamp=1618847044821&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fetag%2Fdownload%2Fetag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "ev-emitter": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ev-emitter/download/ev-emitter-1.1.1.tgz", + "integrity": "sha1-jxiwzlx2pdGAF/ccCnlcZbkTjyo=" + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/eventemitter-asyncresource/download/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha1-c0/y5Ev0SOYn93SPkF1r3Ve9tls=", + "dev": true + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/download/events-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/eventsource/download/eventsource-1.1.0.tgz", + "integrity": "sha1-AOjKfJIQnpSw3fMtrGd9hBAoz68=", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1637147245057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/execall/download/execall-2.0.0.tgz?cache=0&sync_timestamp=1617892843041&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexecall%2Fdownload%2Fexecall-2.0.0.tgz", + "integrity": "sha1-FqBrX+UJnffQC+XZwG7s3tFmO0U=", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz", + "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/external-editor/download/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.nlark.com/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.3.0.tgz?cache=0&sync_timestamp=1635889740043&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=" + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.1.2.tgz", + "integrity": "sha1-S2LEK44D3j+EhGC2OQeZIGldAVQ=" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-3.2.7.tgz?cache=0&sync_timestamp=1625773305786&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.7.tgz", + "integrity": "sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/fast-safe-stringify/download/fast-safe-stringify-2.1.1.tgz?cache=0&sync_timestamp=1631085668938&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffast-safe-stringify%2Fdownload%2Ffast-safe-stringify-2.1.1.tgz", + "integrity": "sha1-xAaoO25w2eNc47MKgRQd8wrrqIQ=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npm.taobao.org/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha1-mZD306iMxan/0fF0V0UlFwDUl+I=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz", + "integrity": "sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw=", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.nlark.com/faye-websocket/download/faye-websocket-0.11.4.tgz", + "integrity": "sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.nlark.com/fecha/download/fecha-4.2.1.tgz", + "integrity": "sha1-CoOtj4bvYqCR4iu1oDnNA9I+7M4=" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/figures/download/figures-3.2.0.tgz?cache=0&sync_timestamp=1625254307578&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffigures%2Fdownload%2Ffigures-3.2.0.tgz", + "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794272556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz", + "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/file-saver/download/file-saver-2.0.5.tgz", + "integrity": "sha1-1hz+LOBZ9BTYmendbUEH7iVnDDg=" + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/filelist/download/filelist-1.0.2.tgz", + "integrity": "sha1-gCAvIUYtTRwuIUEZsYB8G8A4Dls=", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.nlark.com/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-3.3.1.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fizzy-ui-utils": { + "version": "2.0.7", + "resolved": "https://registry.npm.taobao.org/fizzy-ui-utils/download/fizzy-ui-utils-2.0.7.tgz", + "integrity": "sha1-ffRdzE6zdKCLZdObuaS+7fczBQU=", + "requires": { + "desandro-matches-selector": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-3.0.4.tgz", + "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/flatted/download/flatted-3.2.4.tgz?cache=0&sync_timestamp=1636473847692&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/flatten/download/flatten-1.0.3.tgz", + "integrity": "sha1-wSg6yfJ7Noq8HjbR/3sEUBowNWs=", + "dev": true + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.5.tgz?cache=0&sync_timestamp=1635857764332&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.5.tgz", + "integrity": "sha1-8JpYSJgdPHcrU5Iwl3hSP42Fw4E=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.nlark.com/form-data/download/form-data-2.3.3.tgz", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503408398&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "dev": true + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/frac/download/frac-1.1.2.tgz", + "integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-9.1.0.tgz", + "integrity": "sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0=", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz", + "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/fs-monkey/download/fs-monkey-1.0.3.tgz?cache=0&sync_timestamp=1617593290175&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-monkey%2Fdownload%2Ffs-monkey-1.0.3.tgz", + "integrity": "sha1-rjrJLVO7Mo7+DpodlUH2rY1I4tM=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmmirror.com/gauge/download/gauge-2.7.4.tgz?cache=0&sync_timestamp=1636989373302&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fgauge%2Fdownload%2Fgauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/get-caller-file/download/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz", + "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha1-tf3nfyLL4185C04ImSLFC85u9mQ=", + "dev": true + }, + "get-size": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/get-size/download/get-size-2.0.3.tgz", + "integrity": "sha1-VKHQJWsg6nrGRlFnViAnaZQa0u8=" + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.nlark.com/get-stdin/download/get-stdin-8.0.0.tgz", + "integrity": "sha1-y61qc/63X27rIrqeAfiaooqpelM=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz", + "integrity": "sha1-f9uByQAQH71WTdXxowr1qtweWNY=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.nlark.com/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.nlark.com/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/gl-matrix/download/gl-matrix-3.4.3.tgz", + "integrity": "sha1-/BGR6DIACf1NIOkzlZXGBB3cIsk=" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmmirror.com/glob/download/glob-7.1.7.tgz", + "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-6.0.2.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-6.0.2.tgz", + "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.nlark.com/glob-to-regexp/download/glob-to-regexp-0.4.1.tgz", + "integrity": "sha1-x1KXCHyFG5pXi9IX3VmpL1n+VG4=", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/global-modules/download/global-modules-2.0.0.tgz", + "integrity": "sha1-mXYFrSNF8n9RU5vqJldEISFcd4A=", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/global-prefix/download/global-prefix-3.0.0.tgz", + "integrity": "sha1-/IX3MGTfafUEIfR/iD/luRO6m5c=", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.nlark.com/ini/download/ini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.nlark.com/globby/download/globby-11.0.4.tgz", + "integrity": "sha1-LLr/d8Lypi5x6bKBOme5ejowAaU=", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/globjoin/download/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/gonzales-pe/download/gonzales-pe-4.3.0.tgz", + "integrity": "sha1-/p3sXzxVfurQn/hoxlgmvlTQZ7M=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.8.tgz", + "integrity": "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/graphlib/download/graphlib-2.1.8.tgz", + "integrity": "sha1-V2HUFHN4cAhMkux7XbywWSydNdo=", + "requires": { + "lodash": "^4.17.15" + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/gzip-size/download/gzip-size-6.0.0.tgz", + "integrity": "sha1-BlNn/VDCOcBnHLy61b4+LusQ5GI=", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz", + "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmmirror.com/har-validator/download/har-validator-5.1.5.tgz", + "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/hard-rejection/download/hard-rejection-2.1.0.tgz", + "integrity": "sha1-HG7aXBaFxjlCdm15u0Cudzzs2IM=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz", + "integrity": "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz", + "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628196402801&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz", + "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/has-unicode/download/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.nlark.com/hash.js/download/hash.js-1.1.7.tgz?cache=0&sync_timestamp=1622643346539&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhash.js%2Fdownload%2Fhash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hdr-histogram-js": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/hdr-histogram-js/download/hdr-histogram-js-2.0.1.tgz", + "integrity": "sha1-7LH/K8thgcPpP/SvlHLCjH6XKE4=", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/hdr-histogram-percentiles-obj/download/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha1-lAn03gwt2njmHeLZ14senzy6KDw=", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.nlark.com/hosted-git-info/download/hosted-git-info-4.0.2.tgz", + "integrity": "sha1-XkJVB+7eT+qEa3Ji8IOEVsQgmWE=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.nlark.com/hpack.js/download/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.4.0.tgz?cache=0&sync_timestamp=1617031468383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-entities%2Fdownload%2Fhtml-entities-1.4.0.tgz", + "integrity": "sha1-z70bAdKvr5rcobEK59/6uYxx0tw=", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/html-escaper/download/html-escaper-2.0.2.tgz?cache=0&sync_timestamp=1613643546928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-escaper%2Fdownload%2Fhtml-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", + "dev": true + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz", + "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=", + "dev": true + }, + "html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "requires": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640940074&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz", + "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz", + "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508189267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz", + "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/domhandler/download/domhandler-2.4.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.nlark.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508189267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz", + "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1636932182141&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.3.tgz", + "integrity": "sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k=", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz", + "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz", + "integrity": "sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/download/http-proxy-agent-4.0.1.tgz", + "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.nlark.com/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1637178646601&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-client": { + "version": "1.3.5", + "resolved": "https://registry.nlark.com/http2-client/download/http2-client-1.3.5.tgz", + "integrity": "sha1-IMnckJ48yYKE3SCvJDLFJAht8YE=", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/https-proxy-agent/download/https-proxy-agent-5.0.0.tgz", + "integrity": "sha1-4qkFQqu2inYuCghQ9sntrf2FBrI=", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/human-signals/download/human-signals-2.1.0.tgz?cache=0&sync_timestamp=1624364695595&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhuman-signals%2Fdownload%2Fhuman-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/humanize-ms/download/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/husky/download/husky-6.0.0.tgz", + "integrity": "sha1-gQ8RhprfUWBMMupXftvDd9f5MZ4=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz", + "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/ieee754/download/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", + "dev": true + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-5.1.9.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-5.1.9.tgz", + "integrity": "sha1-nsGly+jhRG7GDUQgBg1Dqm5zgvs=", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/ignore-walk/download/ignore-walk-3.0.4.tgz", + "integrity": "sha1-yaCfabfHtHml10rBo8DUI20qYzU=", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz?cache=0&sync_timestamp=1618422657851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimage-size%2Fdownload%2Fimage-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.nlark.com/immediate/download/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469532269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/import-lazy/download/import-lazy-4.0.0.tgz", + "integrity": "sha1-6OtidIOgpD2jwD8+NVSL5csMwVM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/import-local/download/import-local-2.0.0.tgz", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/indent-string/download/indent-string-4.0.0.tgz?cache=0&sync_timestamp=1622604582006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Findent-string%2Fdownload%2Findent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ini/download/ini-2.0.0.tgz", + "integrity": "sha1-5f1Vbs3VcmvpePoQAYYurLCpS8U=", + "dev": true + }, + "inquirer": { + "version": "8.1.2", + "resolved": "https://registry.npmmirror.com/inquirer/download/inquirer-8.1.2.tgz?cache=0&sync_timestamp=1633472964335&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Finquirer%2Fdownload%2Finquirer-8.1.2.tgz", + "integrity": "sha1-ZbIE0s1/tjQA7dkl3+Qouv1CLj0=", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.3.0", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/rxjs/download/rxjs-7.4.0.tgz?cache=0&sync_timestamp=1633554235070&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frxjs%2Fdownload%2Frxjs-7.4.0.tgz", + "integrity": "sha1-oSpE1+6/AW9f8kQbh/KMmlHOvGg=", + "dev": true, + "requires": { + "tslib": "~2.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.1.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.1.0.tgz", + "integrity": "sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=", + "dev": true + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/internal-ip/download/internal-ip-4.3.0.tgz", + "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/internal-slot/download/internal-slot-1.0.3.tgz", + "integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/internmap/download/internmap-1.0.1.tgz?cache=0&sync_timestamp=1632108258638&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finternmap%2Fdownload%2Finternmap-1.0.1.tgz", + "integrity": "sha1-ABfMijuZYF8DAvKxmNJy4BXl35U=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.nlark.com/ip/download/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/ip-regex/download/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz", + "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-alphabetical/download/is-alphabetical-1.0.4.tgz", + "integrity": "sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0=", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-alphanumeric/download/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/download/is-alphanumerical-1.0.4.tgz?cache=0&sync_timestamp=1636009316820&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-alphanumerical%2Fdownload%2Fis-alphanumerical-1.0.4.tgz", + "integrity": "sha1-frmiQx+FX2se8aeOMm31FWlsTb8=", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628201919104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz", + "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz", + "integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz", + "integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.nlark.com/is-buffer/download/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz", + "integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.0.tgz?cache=0&sync_timestamp=1634237061095&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.8.0.tgz", + "integrity": "sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.5.tgz", + "integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-decimal/download/is-decimal-1.0.4.tgz?cache=0&sync_timestamp=1636008973005&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-decimal%2Fdownload%2Fis-decimal-1.0.4.tgz", + "integrity": "sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz?cache=0&sync_timestamp=1630451108035&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-docker%2Fdownload%2Fis-docker-2.2.1.tgz", + "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/download/is-hexadecimal-1.0.4.tgz?cache=0&sync_timestamp=1636011536406&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-hexadecimal%2Fdownload%2Fis-hexadecimal-1.0.4.tgz", + "integrity": "sha1-zDXJdYjaS9Saju3WvECC1E3LI6c=", + "dev": true + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-interactive/download/is-interactive-1.0.0.tgz", + "integrity": "sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4=", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-lambda/download/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/is-negative-zero/download/is-negative-zero-2.0.1.tgz", + "integrity": "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz", + "integrity": "sha1-anqvg4x/BoalC0VT9+VKlklOifA=", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz?cache=0&sync_timestamp=1628686555851&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-2.2.0.tgz", + "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz?cache=0&sync_timestamp=1620047389319&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-2.1.0.tgz", + "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-2.1.0.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-2.1.0.tgz", + "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618601044820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.nlark.com/is-plain-object/download/is-plain-object-2.0.4.tgz?cache=0&sync_timestamp=1618846974259&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-plain-object%2Fdownload%2Fis-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221905423&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz", + "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha1-l7DIX72stZycRG/mU7gs8rW3z+Y=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz", + "integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-supported-regexp-flag/download/is-supported-regexp-flag-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-supported-regexp-flag%2Fdownload%2Fis-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha1-Ie4WUY0sHdPt0+mg1X5QIHrDZMo=", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz", + "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1625294161966&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz", + "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-weakref/download/is-weakref-1.0.1.tgz", + "integrity": "sha1-hC26TsF/qayYUN8tbvvBc3J08qI=", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/download/is-what-3.14.1.tgz?cache=0&sync_timestamp=1634283360064&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-what%2Fdownload%2Fis-what-3.14.1.tgz", + "integrity": "sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-whitespace-character/download/is-whitespace-character-1.0.4.tgz", + "integrity": "sha1-CFjt2UqVWUx8ndC1wXTsbkXuSqc=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-word-character/download/is-word-character-1.0.4.tgz", + "integrity": "sha1-zg5zIW+YWZBgWS9i/zE1TdvrAjA=", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.nlark.com/is-wsl/download/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.nlark.com/isbinaryfile/download/isbinaryfile-4.0.8.tgz", + "integrity": "sha1-XTS5SGW9SUZjPsx4oCb8dsWxH88=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.nlark.com/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/download/istanbul-lib-coverage-3.2.0.tgz?cache=0&sync_timestamp=1634527189737&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-coverage%2Fdownload%2Fistanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha1-GJ55CdCjn6Wj361bA/cZR3cBkdM=", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/download/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha1-hzxv/4l0UBGCIndGlqPyiQLXfB0=", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/istanbul-lib-report/download/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha1-dRj+UupE3jcvRgp2tezan/tz2KY=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/download/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/istanbul-reports/download/istanbul-reports-3.0.5.tgz?cache=0&sync_timestamp=1634144713451&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-reports%2Fdownload%2Fistanbul-reports-3.0.5.tgz", + "integrity": "sha1-olgBB+cSeeptZh3e3pKf/G1pM4Q=", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "isutf8": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/isutf8/download/isutf8-3.1.1.tgz", + "integrity": "sha1-PyrHf0mv+yOuVIE9oaSrRKrfHXs=" + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.nlark.com/jake/download/jake-10.8.2.tgz", + "integrity": "sha1-68nehVgWCmbYLQ6txqLlj7xQCns=", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/async/download/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/jasmine/download/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/jasmine-core/download/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.8.0", + "resolved": "https://registry.npmmirror.com/jasmine-core/download/jasmine-core-3.8.0.tgz", + "integrity": "sha1-gVOZquWqXZvusSYoBfmBuZ/8m/A=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.nlark.com/jasmine-spec-reporter/download/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha1-thKIqwdK1EDcJHfE1ChAsOdKa5U=", + "dev": true, + "requires": { + "colors": "1.4.0" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/jasminewd2/download/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "27.3.1", + "resolved": "https://registry.npmmirror.com/jest-worker/download/jest-worker-27.3.1.tgz?cache=0&sync_timestamp=1634626737887&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjest-worker%2Fdownload%2Fjest-worker-27.3.1.tgz", + "integrity": "sha1-De9/6uW4BCvjhHl5mut7X6ysJLI=", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/js-base64/download/js-base64-3.7.2.tgz", + "integrity": "sha1-gW0R2BqK/yQWA9Gc5XYeE+Qdd0U=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618435004368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz", + "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdoc-type-pratt-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/jsdoc-type-pratt-parser/download/jsdoc-type-pratt-parser-1.2.0.tgz", + "integrity": "sha1-NIKjgzt0qIyVprpyU/DA3jt3ufU=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.nlark.com/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.nlark.com/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/json-schema/download/json-schema-0.2.3.tgz?cache=0&sync_timestamp=1636423494254&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/json3/download/json3-3.3.3.tgz", + "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz", + "integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/jsonc-parser/download/jsonc-parser-3.0.0.tgz?cache=0&sync_timestamp=1605281904422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonc-parser%2Fdownload%2Fjsonc-parser-3.0.0.tgz", + "integrity": "sha1-q914VwHH5+rKip7IzwcMpRp0WiI=", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/jsonfile/download/jsonfile-6.1.0.tgz", + "integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/jsprim/download/jsprim-1.4.1.tgz?cache=0&sync_timestamp=1637110674471&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjsprim%2Fdownload%2Fjsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.7.1", + "resolved": "https://registry.nlark.com/jszip/download/jszip-3.7.1.tgz", + "integrity": "sha1-vWNAEiHBViWhIoxVbKimjab9o9k=", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "6.3.9", + "resolved": "https://registry.npmmirror.com/karma/download/karma-6.3.9.tgz?cache=0&sync_timestamp=1637099037935&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fkarma%2Fdownload%2Fkarma-6.3.9.tgz", + "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/download/mime-2.6.0.tgz", + "integrity": "sha1-oqaCqVzU0MsdYlfij4PafjWAA2c=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.2.1.tgz", + "integrity": "sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ=", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/karma-chrome-launcher/download/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha1-gFpYZ5mk0F9OVPcqIEl58/MGZzg=", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/karma-coverage/download/karma-coverage-2.0.3.tgz", + "integrity": "sha1-wQ9HEfTPXKqqZosdb2QufaEi2XM=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "minimatch": "^3.0.4" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-3.0.3.tgz?cache=0&sync_timestamp=1626199377702&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fkarma-coverage-istanbul-reporter%2Fdownload%2Fkarma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha1-87UwNVOq3I5oHUDTYN/cGbx+n+k=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "dependencies": { + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/download/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha1-KEmXxIIRdS7EhiU9qX44ed77qMg=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/download/istanbul-lib-coverage-2.0.5.tgz?cache=0&sync_timestamp=1634527189737&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-coverage%2Fdownload%2Fistanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k=", + "dev": true + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/karma-jasmine/download/karma-jasmine-4.0.1.tgz", + "integrity": "sha1-uZ4HO22ZpRlvxL/8EhuJMTsKvYI=", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.nlark.com/karma-jasmine-html-reporter/download/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha1-UsSJp012CTShCJv6XqSo/LhMwos=", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/karma-source-map-support/download/karma-source-map-support-1.4.0.tgz", + "integrity": "sha1-WFJs7M9+hzDlbv/Zek3o1xKsDWs=", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/killable/download/killable-1.0.1.tgz", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/klona/download/klona-2.0.5.tgz?cache=0&sync_timestamp=1635385383825&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fklona%2Fdownload%2Fklona-2.0.5.tgz", + "integrity": "sha1-0WZXTZAHY5XZljqnqSj6u412r7w=", + "dev": true + }, + "known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.nlark.com/known-css-properties/download/known-css-properties-0.21.0.tgz", + "integrity": "sha1-FfvQu7g0R/POCdivJH7UfGjt6A0=", + "dev": true + }, + "less": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/less/download/less-4.1.1.tgz", + "integrity": "sha1-Fb8lOpk5eR3GkIiMP/Qk8+bH7bo=", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "optional": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + } + } + }, + "less-loader": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/less-loader/download/less-loader-10.0.1.tgz", + "integrity": "sha1-wFqrpo0AQAggJ18hwq2Hy5+pkj8=", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "less-plugin-clean-css": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/less-plugin-clean-css/download/less-plugin-clean-css-1.5.1.tgz", + "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=", + "dev": true, + "requires": { + "clean-css": "^3.0.1" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/less-plugin-npm-import/download/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "less-vars-to-js": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/less-vars-to-js/download/less-vars-to-js-1.3.0.tgz", + "integrity": "sha1-wyLPQ6PI/D+rZV2j5RoUwUmatXE=", + "dev": true, + "requires": { + "strip-json-comments": "^2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/leven/download/leven-2.1.0.tgz?cache=0&sync_timestamp=1628598084975&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fleven%2Fdownload%2Fleven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz", + "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "license-webpack-plugin": { + "version": "2.3.20", + "resolved": "https://registry.npmmirror.com/license-webpack-plugin/download/license-webpack-plugin-2.3.20.tgz?cache=0&sync_timestamp=1636693292671&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flicense-webpack-plugin%2Fdownload%2Flicense-webpack-plugin-2.3.20.tgz", + "integrity": "sha1-9R+2dMoxUZ2+2+HHqrwDblp/KFg=", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/lie/download/lie-3.3.0.tgz", + "integrity": "sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o=", + "requires": { + "immediate": "~3.0.5" + } + }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/lilconfig/download/lilconfig-2.0.4.tgz?cache=0&sync_timestamp=1636150747257&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flilconfig%2Fdownload%2Flilconfig-2.0.4.tgz", + "integrity": "sha1-9FB9BD1wWLOAtqj1y3vNSzTO4II=", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/download/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "11.2.6", + "resolved": "https://registry.npmmirror.com/lint-staged/download/lint-staged-11.2.6.tgz?cache=0&sync_timestamp=1637566864097&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flint-staged%2Fdownload%2Flint-staged-11.2.6.tgz", + "integrity": "sha1-9HexrwKU2wVOWTfxcWed9juqTEM=", + "dev": true, + "requires": { + "cli-truncate": "2.1.0", + "colorette": "^1.4.0", + "commander": "^8.2.0", + "cosmiconfig": "^7.0.1", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "execa": "^5.1.1", + "listr2": "^3.12.2", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "3.3.0", + "supports-color": "8.1.1" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/download/commander-8.3.0.tgz", + "integrity": "sha1-SDfqGy2me5xhamevuw+v7lZ7ymY=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/download/execa-5.1.1.tgz?cache=0&sync_timestamp=1637147245057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-5.1.1.tgz", + "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0=", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-6.0.1.tgz", + "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/is-stream/download/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971632960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "listr2": { + "version": "3.13.5", + "resolved": "https://registry.npmmirror.com/listr2/download/listr2-3.13.5.tgz", + "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmmirror.com/colorette/download/colorette-2.0.16.tgz", + "integrity": "sha1-cTua+E/bAAE58EVGvUqT9ipQhdo=", + "dev": true + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/rxjs/download/rxjs-7.4.0.tgz?cache=0&sync_timestamp=1633554235070&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frxjs%2Fdownload%2Frxjs-7.4.0.tgz", + "integrity": "sha1-oSpE1+6/AW9f8kQbh/KMmlHOvGg=", + "dev": true, + "requires": { + "tslib": "~2.1.0" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.1.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.1.0.tgz", + "integrity": "sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/load-json-file/download/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/download/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-4.2.0.tgz?cache=0&sync_timestamp=1610027943366&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-4.2.0.tgz", + "integrity": "sha1-1wIjgNZtFMX7HUlriYZOvP1Hg4Q=", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/loader-utils/download/loader-utils-2.0.0.tgz?cache=0&sync_timestamp=1636687869321&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Floader-utils%2Fdownload%2Floader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.nlark.com/lodash/download/lodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/lodash.memoize/download/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npm.taobao.org/lodash.truncate/download/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.nlark.com/lodash.uniq/download/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-4.1.0.tgz", + "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/log-update/download/log-update-4.0.0.tgz?cache=0&sync_timestamp=1634542359448&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flog-update%2Fdownload%2Flog-update-4.0.0.tgz", + "integrity": "sha1-WJ7NNSRx8qHAxXAodUOmTf0g4KE=", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/log4js/download/log4js-6.3.0.tgz", + "integrity": "sha1-EN+vu0NDUaPjAnegC5h5RG9xW8s=", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/flatted/download/flatted-2.0.2.tgz?cache=0&sync_timestamp=1636473847692&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-2.0.2.tgz", + "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=", + "dev": true + } + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/loglevel/download/loglevel-1.8.0.tgz?cache=0&sync_timestamp=1637240410022&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Floglevel%2Fdownload%2Floglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/longest-streak/download/longest-streak-2.0.4.tgz?cache=0&sync_timestamp=1636446222992&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flongest-streak%2Fdownload%2Flongest-streak-2.0.4.tgz", + "integrity": "sha1-uFmZV9pbXatk3uP+MW+ndFl9kOQ=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.nlark.com/magic-string/download/magic-string-0.25.7.tgz?cache=0&sync_timestamp=1618847046304&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmagic-string%2Fdownload%2Fmagic-string-0.25.7.tgz", + "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npm.taobao.org/make-error/download/make-error-1.3.6.tgz", + "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=", + "dev": true + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.nlark.com/make-fetch-happen/download/make-fetch-happen-9.1.0.tgz?cache=0&sync_timestamp=1629820656927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmake-fetch-happen%2Fdownload%2Fmake-fetch-happen-9.1.0.tgz", + "integrity": "sha1-UwhaCeeXFDPmdl95cb9j9OBcuWg=", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.nlark.com/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz?cache=0&sync_timestamp=1629751304151&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmap-age-cleaner%2Fdownload%2Fmap-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.nlark.com/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/map-obj/download/map-obj-4.3.0.tgz?cache=0&sync_timestamp=1634552719803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmap-obj%2Fdownload%2Fmap-obj-4.3.0.tgz", + "integrity": "sha1-kwT5Buk/qucIgNoQKp8d8OqLsFo=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/markdown-escapes/download/markdown-escapes-1.0.4.tgz?cache=0&sync_timestamp=1635887464232&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmarkdown-escapes%2Fdownload%2Fmarkdown-escapes-1.0.4.tgz", + "integrity": "sha1-yVQV70UUmddgK5EJXzyOiXX3hTU=", + "dev": true + }, + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/markdown-table/download/markdown-table-1.1.3.tgz", + "integrity": "sha1-n8tpvP24cXv9A5jG7C2TA2743mA=", + "dev": true + }, + "masonry-layout": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/masonry-layout/download/masonry-layout-4.2.2.tgz", + "integrity": "sha1-1XtErxPmAb/NxCPx3YNItVJN40g=", + "requires": { + "get-size": "^2.0.2", + "outlayer": "^2.1.0" + } + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/mathml-tag-names/download/mathml-tag-names-2.1.3.tgz", + "integrity": "sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM=", + "dev": true + }, + "mdast-util-compact": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/mdast-util-compact/download/mdast-util-compact-1.0.4.tgz?cache=0&sync_timestamp=1627635894673&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmdast-util-compact%2Fdownload%2Fmdast-util-compact-1.0.4.tgz", + "integrity": "sha1-1TG7dme1Ejq/IIWb4IbE0GyJRZM=", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/download/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha1-0e8spCvDd+ywRjqYeRDa6JvZoow=", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/download/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha1-sz9nyoINaebMUnqT1AOSSbUEvr4=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/mdast-util-to-string/download/mdast-util-to-string-2.0.0.tgz?cache=0&sync_timestamp=1619426294961&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmdast-util-to-string%2Fdownload%2Fmdast-util-to-string-2.0.0.tgz", + "integrity": "sha1-uM/mpxPhCRy1tyj8SIhaR2f4uXs=", + "dev": true + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz", + "integrity": "sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.nlark.com/mem/download/mem-8.1.1.tgz?cache=0&sync_timestamp=1626534352883&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmem%2Fdownload%2Fmem-8.1.1.tgz", + "integrity": "sha1-zxGLNXxlq3t+CBe98AyAYil8ASI=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-3.1.0.tgz", + "integrity": "sha1-ZXVRRbvz42lUuUnBZFBCdFHVynQ=", + "dev": true + } + } + }, + "memfs": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/memfs/download/memfs-3.4.0.tgz", + "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/meow/download/meow-7.1.1.tgz?cache=0&sync_timestamp=1637477569022&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-7.1.1.tgz", + "integrity": "sha1-fAFZXj0zf8sOxOju0WZuqVkD0wY=", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.6.0.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-7.0.1.tgz", + "integrity": "sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc=", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.8.1.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.13.1.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.13.1.tgz", + "integrity": "sha1-AXLLW86AsL1ULqNI21DH4hg02TQ=", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz", + "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/micromark/download/micromark-2.11.4.tgz", + "integrity": "sha1-0TQ2E47qgmOD6CJEnJpcUO5EZlo=", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.nlark.com/micromatch/download/micromatch-4.0.4.tgz", + "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmmirror.com/mime-db/download/mime-db-1.51.0.tgz?cache=0&sync_timestamp=1636425951030&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-db%2Fdownload%2Fmime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.34.tgz?cache=0&sync_timestamp=1636432302620&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz", + "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk=", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/download/mini-css-extract-plugin-2.4.2.tgz", + "integrity": "sha1-s1CBkepHk4ikcVAYyZ3T5t1A0tI=", + "dev": true, + "requires": { + "schema-utils": "^3.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.nlark.com/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/minimist-options/download/minimist-options-4.1.0.tgz", + "integrity": "sha1-wGVXE8U6ii69d/+iR9NCxA8BBhk=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.nlark.com/minipass/download/minipass-3.1.5.tgz?cache=0&sync_timestamp=1631656314228&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminipass%2Fdownload%2Fminipass-3.1.5.tgz", + "integrity": "sha1-cfYlGwozpJwBs8+X/3ftoDDf9zI=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/minipass-collect/download/minipass-collect-1.0.2.tgz", + "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/minipass-fetch/download/minipass-fetch-1.4.1.tgz", + "integrity": "sha1-114AkdqsGw/9fp1BYp+v99DB8bY=", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/minipass-flush/download/minipass-flush-1.0.5.tgz", + "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minipass-json-stream/download/minipass-json-stream-1.0.1.tgz", + "integrity": "sha1-ftu5JYj7/C/x2y/BA5est7a0Sqc=", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.nlark.com/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz", + "integrity": "sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/minipass-sized/download/minipass-sized-1.0.3.tgz", + "integrity": "sha1-cO5afFBSBwr6z7wil36nne81O3A=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/minizlib/download/minizlib-2.1.2.tgz", + "integrity": "sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.nlark.com/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true + }, + "mockjs": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/mockjs/download/mockjs-1.1.0.tgz", + "integrity": "sha1-5qDDeOkZBtuv8gkRzAJzs8fXWwY=", + "requires": { + "commander": "*" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/multicast-dns/download/multicast-dns-6.2.3.tgz?cache=0&sync_timestamp=1633354821467&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmulticast-dns%2Fdownload%2Fmulticast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.nlark.com/mute-stream/download/mute-stream-0.0.8.tgz", + "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", + "dev": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.30.tgz?cache=0&sync_timestamp=1634166192601&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnanoid%2Fdownload%2Fnanoid-3.1.30.tgz", + "integrity": "sha1-Y/k8xUjSoRPcXfvGO/oJ4rm2Q2I=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.nlark.com/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-request": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/native-request/download/native-request-1.1.0.tgz?cache=0&sync_timestamp=1630540604934&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnative-request%2Fdownload%2Fnative-request-1.1.0.tgz", + "integrity": "sha1-rNsw/i7vo+G8jFSzpoUunFwNPLA=", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.nlark.com/needle/download/needle-2.9.1.tgz?cache=0&sync_timestamp=1630674995929&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fneedle%2Fdownload%2Fneedle-2.9.1.tgz", + "integrity": "sha1-ItHf++NJDCuD4wH3cJtnNs2PJoQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", + "dev": true + }, + "ng-alain": { + "version": "12.4.2", + "resolved": "https://registry.npmmirror.com/ng-alain/download/ng-alain-12.4.2.tgz", + "integrity": "sha512-BqKIqeHKbSu9VRgJCN8JelCYdelKFl7dIhQyG0lps1wWDJhhEBLVBdOmzITaC8kowKvL6DBJtOZf8SZJ687WYw==", + "dev": true, + "requires": { + "swagger-typescript-api": "^9.3.1" + } + }, + "ng-alain-plugin-theme": { + "version": "12.0.0", + "resolved": "https://registry.nlark.com/ng-alain-plugin-theme/download/ng-alain-plugin-theme-12.0.0.tgz?cache=0&sync_timestamp=1626077688559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fng-alain-plugin-theme%2Fdownload%2Fng-alain-plugin-theme-12.0.0.tgz", + "integrity": "sha1-F5FVp/NG39v4fJTvUCNQprlETmA=", + "dev": true, + "requires": { + "@angular-devkit/build-angular": "^12.0.0", + "hash.js": "^1.0.0", + "less": "^3.12.0", + "less-plugin-clean-css": "^1.5.1", + "less-plugin-npm-import": "^2.1.0", + "less-vars-to-js": "^1.3.0", + "meow": "^7.1.0", + "postcss": "^7.0.0", + "strip-css-comments": "^4.1.0" + }, + "dependencies": { + "less": { + "version": "3.13.1", + "resolved": "https://registry.npmmirror.com/less/download/less-3.13.1.tgz", + "integrity": "sha1-DryR0qDpwMZzW4PUlrCrBYMHeQk=", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + } + } + }, + "ng-alain-sts": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/ng-alain-sts/download/ng-alain-sts-0.0.1.tgz", + "integrity": "sha1-Fmm8TXj7U3TdmlFgeYShR5j6Qn0=", + "dev": true, + "requires": { + "@types/swagger-schema-official": "^2.0.15", + "extend": "^3.0.2", + "meow": "^5.0.0", + "request": "^2.88.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-4.1.0.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-4.2.0.tgz?cache=0&sync_timestamp=1633332959770&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/indent-string/download/indent-string-3.2.0.tgz?cache=0&sync_timestamp=1622604582006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Findent-string%2Fdownload%2Findent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/map-obj/download/map-obj-2.0.0.tgz?cache=0&sync_timestamp=1634552719803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmap-obj%2Fdownload%2Fmap-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/meow/download/meow-5.0.0.tgz?cache=0&sync_timestamp=1637477569022&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-5.0.0.tgz", + "integrity": "sha1-38c9Y6mvxxSl43F2DrXIi5EHiqQ=", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/minimist-options/download/minimist-options-3.0.2.tgz", + "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/quick-lru/download/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/redent/download/redent-2.0.0.tgz?cache=0&sync_timestamp=1620070119923&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-2.0.0.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-2.0.0.tgz?cache=0&sync_timestamp=1623341510447&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-10.1.0.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-10.1.0.tgz", + "integrity": "sha1-cgImW4n36eny5XZeD+c1qQXtuqg=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ng-gallery": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/ng-gallery/download/ng-gallery-5.1.1.tgz", + "integrity": "sha1-KtAgJ9WJ55817PcJIiLaIQzHvgE=", + "requires": { + "tslib": "^2.0.0" + } + }, + "ng-zorro-antd": { + "version": "12.0.2", + "resolved": "https://registry.npmmirror.com/ng-zorro-antd/download/ng-zorro-antd-12.0.2.tgz", + "integrity": "sha1-ih1BLid7lT35tYDNNmdEidfmTgM=", + "requires": { + "@angular/cdk": "^12.1.0", + "@ant-design/icons-angular": "^12.0.3", + "date-fns": "^2.10.0", + "tslib": "^2.2.0" + } + }, + "ngx-countdown": { + "version": "12.0.1", + "resolved": "https://registry.nlark.com/ngx-countdown/download/ngx-countdown-12.0.1.tgz", + "integrity": "sha1-C9au9MqDuvy8Pdk2bIRJTSuTzic=", + "requires": { + "tslib": "^2.1.0" + } + }, + "ngx-tinymce": { + "version": "12.0.0", + "resolved": "https://registry.nlark.com/ngx-tinymce/download/ngx-tinymce-12.0.0.tgz", + "integrity": "sha1-xTxfFUnLssOmoU4pBP3ZDa5xLzw=", + "requires": { + "@ng-util/lazy": "^11.1.0", + "@ng-util/util": "^11.1.0", + "tslib": "^2.1.0" + } + }, + "ngx-trend": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/ngx-trend/download/ngx-trend-7.0.0.tgz", + "integrity": "sha1-m6hRCd7EU+chOvO4gOJokkhG0ys=", + "requires": { + "tslib": "^2.1.0" + } + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/nice-napi/download/nice-napi-1.0.2.tgz", + "integrity": "sha1-3Aq1oerCDOVIgC/FaG6qa8ZUkns=", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz?cache=0&sync_timestamp=1614510016909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnice-try%2Fdownload%2Fnice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/node-addon-api/download/node-addon-api-3.2.1.tgz", + "integrity": "sha1-gTJeCiEXeJwBKNq2Xn448HzroWE=", + "dev": true, + "optional": true + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.nlark.com/node-emoji/download/node-emoji-1.11.0.tgz", + "integrity": "sha1-aaAVDmlG4vEV6dfqTfeXHiYoMBw=", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.6.tgz?cache=0&sync_timestamp=1636395469986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.6.tgz", + "integrity": "sha1-F1GnwBg06OFpd1hzLp77burfr4k=", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/node-fetch-h2/download/node-fetch-h2-2.3.0.tgz", + "integrity": "sha1-xhiDJfm9PYNAIL8PLW3BfO0iQaw=", + "dev": true, + "requires": { + "http2-client": "^1.2.5" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz", + "integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/node-gyp/download/node-gyp-7.1.2.tgz?cache=0&sync_timestamp=1637570177658&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-gyp%2Fdownload%2Fnode-gyp-7.1.2.tgz", + "integrity": "sha1-IagQrrsYcSAlHDvOyXmvFYexiK4=", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/node-gyp-build/download/node-gyp-build-4.3.0.tgz?cache=0&sync_timestamp=1631436711963&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-gyp-build%2Fdownload%2Fnode-gyp-build-4.3.0.tgz", + "integrity": "sha1-nyVrA+WCYVC+Ocdkv1Hpk5RtcaM=", + "dev": true, + "optional": true + }, + "node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/node-readfiles/download/node-readfiles-0.2.0.tgz", + "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", + "dev": true, + "requires": { + "es6-promise": "^3.2.1" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634806914912&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz", + "integrity": "sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/nopt/download/nopt-5.0.0.tgz", + "integrity": "sha1-UwlCu1ilEvzK/lP+IQ8TolNV3Ig=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.nlark.com/hosted-git-info/download/hosted-git-info-2.8.9.tgz", + "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.nlark.com/normalize-range/download/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-6.1.0.tgz", + "integrity": "sha1-QNCIW1Nd7/4/MUe+yHfQX+TFZoo=", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/npm-bundled/download/npm-bundled-1.1.2.tgz", + "integrity": "sha1-lEx4eJvXOQNbcLqiylzDK42GC8E=", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/npm-install-checks/download/npm-install-checks-4.0.0.tgz", + "integrity": "sha1-o3+sx2Oi/eBJfvLG0Kx8P74A17Q=", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/npm-normalize-package-bin/download/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha1-bnmkHyP9I1wGIyGCKNp9nCO49uI=", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.nlark.com/npm-package-arg/download/npm-package-arg-8.1.5.tgz?cache=0&sync_timestamp=1623784505093&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnpm-package-arg%2Fdownload%2Fnpm-package-arg-8.1.5.tgz", + "integrity": "sha1-M2my1f6P3GdLqn8XhlFN3BVGbkQ=", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.nlark.com/npm-packlist/download/npm-packlist-2.2.2.tgz?cache=0&sync_timestamp=1629740697962&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnpm-packlist%2Fdownload%2Fnpm-packlist-2.2.2.tgz", + "integrity": "sha1-B2uXKT+mIPYygzGGp6j2WqphSMg=", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npm.taobao.org/npm-pick-manifest/download/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha1-e1SEyiyQhWX0O38nZE82u4FvUUg=", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/npm-registry-fetch/download/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha1-aMG7gQxGVCdg1ipqll+FpwLUOnY=", + "dev": true, + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/npmlog/download/npmlog-4.1.2.tgz", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz", + "integrity": "sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.nlark.com/num2fraction/download/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nx": { + "version": "12.10.0", + "resolved": "https://registry.npmmirror.com/nx/download/nx-12.10.0.tgz", + "integrity": "sha1-pOj7pyVFKd5p/lTltLAH6KQyo/s=", + "dev": true, + "requires": { + "@nrwl/cli": "*" + }, + "dependencies": { + "@nrwl/cli": { + "version": "13.2.2", + "resolved": "https://registry.npmmirror.com/@nrwl/cli/download/@nrwl/cli-13.2.2.tgz", + "integrity": "sha512-iqWwULCgYV3r+sKA/jrh4Di5buesPDcmdG0vi4kFnMgNF3Pg+8Coa7qKXJXdTr1gugBfGPFFmHORmH1pE3CMYA==", + "dev": true, + "requires": { + "@nrwl/tao": "13.2.2", + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "v8-compile-cache": "2.3.0", + "yargs": "15.4.1", + "yargs-parser": "20.0.0" + } + }, + "@nrwl/tao": { + "version": "13.2.2", + "resolved": "https://registry.npmmirror.com/@nrwl/tao/download/@nrwl/tao-13.2.2.tgz", + "integrity": "sha512-IQtiTuouagSYpxztJvxD1XYha1eLagFoJV/2Y7bu6jUx5KTT5chLzXbz18WUeKhkuZAHhhb2UeOmL9ggQpWnZQ==", + "dev": true, + "requires": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "nx": "13.2.2", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "20.0.0" + }, + "dependencies": { + "nx": { + "version": "13.2.2", + "resolved": "https://registry.npmmirror.com/nx/download/nx-13.2.2.tgz", + "integrity": "sha512-d13Xb3pswItWS9sP4+ed4JarkTzo6+gCBNWSgxuO6MMkmKZPXH3yM3an9KlA5jCyFygcsny7CIgwwxJhz1SJCg==", + "dev": true, + "requires": { + "@nrwl/cli": "*" + } + } + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.0.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.nlark.com/cliui/download/cliui-6.0.0.tgz", + "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", + "integrity": "sha1-J6qn0uTKdkUvmNOt0JOnLJQ+3Jc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.2.1.tgz", + "integrity": "sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ=", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-15.4.1.tgz", + "integrity": "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz", + "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "20.0.0", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.0.0.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.0.0.tgz", + "integrity": "sha1-xlodqql3rWPOvdUhWRR7eJpOGak=", + "dev": true + } + } + }, + "oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/oas-kit-common/download/oas-kit-common-1.0.8.tgz", + "integrity": "sha1-bYys9ukJeWekx+qLy8vXcBjh9TU=", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/oas-linter/download/oas-linter-3.2.2.tgz", + "integrity": "sha1-q2ozc2MTSQZZA1ymgC3Es11Iqh4=", + "dev": true, + "requires": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, + "oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.nlark.com/oas-resolver/download/oas-resolver-2.5.6.tgz", + "integrity": "sha1-EEMFact9rKVhFckV5hHrxVFcVhs=", + "dev": true, + "requires": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-17.2.1.tgz", + "integrity": "sha1-4slbl5ag4ffzv0QnhjtC4EGBkeo=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/oas-schema-walker/download/oas-schema-walker-1.1.5.tgz", + "integrity": "sha1-dMPNR7cP+OCxmtraFEVbXTrDiiI=", + "dev": true + }, + "oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.nlark.com/oas-validator/download/oas-validator-5.0.8.tgz", + "integrity": "sha1-OH6Q33yvotP/yDtfuXYFK4fnPCg=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.nlark.com/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1618846992533&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz?cache=0&sync_timestamp=1626120241132&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.11.0.tgz", + "integrity": "sha1-nc6xRs7dQUig2eUauI00z1CZIrE=", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz?cache=0&sync_timestamp=1613857698573&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.5.tgz", + "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w=", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115183005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", + "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz?cache=0&sync_timestamp=1633326983597&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.5.tgz", + "integrity": "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/obuf/download/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz?cache=0&sync_timestamp=1614930634590&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fon-finished%2Fdownload%2Fon-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/on-headers/download/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmmirror.com/open/download/open-8.2.1.tgz", + "integrity": "sha1-gt5C2gzL9Cm8EtCZ2tLgl14U6K8=", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/opn/download/opn-5.5.0.tgz", + "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/is-wsl/download/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz", + "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.nlark.com/ora/download/ora-5.4.1.tgz?cache=0&sync_timestamp=1631556658795&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fora%2Fdownload%2Fora-5.4.1.tgz", + "integrity": "sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "outlayer": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/outlayer/download/outlayer-2.1.1.tgz", + "integrity": "sha1-KYY7beEOpdrf/8rfoNcokHOH6aI=", + "requires": { + "ev-emitter": "^1.0.0", + "fizzy-ui-utils": "^2.0.0", + "get-size": "^2.0.2" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-defer%2Fdownload%2Fp-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/p-map/download/p-map-4.0.0.tgz?cache=0&sync_timestamp=1635931861684&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-map%2Fdownload%2Fp-map-4.0.0.tgz", + "integrity": "sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs=", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/p-retry/download/p-retry-3.0.1.tgz?cache=0&sync_timestamp=1635966813736&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-retry%2Fdownload%2Fp-retry-3.0.1.tgz", + "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/download/p-try-2.2.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pacote": { + "version": "11.3.5", + "resolved": "https://registry.npmmirror.com/pacote/download/pacote-11.3.5.tgz?cache=0&sync_timestamp=1634076714071&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpacote%2Fdownload%2Fpacote-11.3.5.tgz", + "integrity": "sha1-c88fw3crUz9XXjnvqWxQvow9ydI=", + "dev": true, + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.nlark.com/pako/download/pako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=" + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/parchment/download/parchment-1.1.4.tgz", + "integrity": "sha1-rt7Xq5OP6SHUw0vDOc4RaLwv/eU=" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fparent-module%2Fdownload%2Fparent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/parse-entities/download/parse-entities-2.0.0.tgz", + "integrity": "sha1-U8brW5MUofTsmfoP33zgHs2gy+g=", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/download/parse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/download/parse-node-version-1.0.1.tgz", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", + "dev": true + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/parse-svg-path/download/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.nlark.com/parse5/download/parse5-5.1.1.tgz", + "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", + "optional": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/parse5-html-rewriting-stream/download/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha1-3hggVZMXq05FHqctugX939kUSAs=", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.nlark.com/parse5/download/parse5-6.0.1.tgz", + "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=", + "dev": true + } + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha1-LN+a2CMyEUA3DU2/XT6Sx8jdxuY=", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.nlark.com/parse5/download/parse5-6.0.1.tgz", + "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=", + "dev": true + } + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5-sax-parser/download/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha1-mLTTZrWyZqfNkLS1iQZmeviC2ro=", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.nlark.com/parse5/download/parse5-6.0.1.tgz", + "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/path-is-inside/download/path-is-inside-1.0.2.tgz?cache=0&sync_timestamp=1622604553837&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-is-inside%2Fdownload%2Fpath-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz?cache=0&sync_timestamp=1617971632960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz?cache=0&sync_timestamp=1621947783503&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-parse%2Fdownload%2Fpath-parse-1.0.7.tgz", + "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true + }, + "perfect-scrollbar": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/perfect-scrollbar/download/perfect-scrollbar-1.5.3.tgz?cache=0&sync_timestamp=1635159385205&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fperfect-scrollbar%2Fdownload%2Fperfect-scrollbar-1.5.3.tgz", + "integrity": "sha1-292EBx+EYNuf+JMhTtUBWWrZ3Fo=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz", + "integrity": "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648305056&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz", + "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "piscina": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/piscina/download/piscina-3.1.0.tgz", + "integrity": "sha1-IzNjaGW2y2nFo3C7xJmpjKvPPgQ=", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pkg-up/download/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/please-upgrade-node/download/please-upgrade-node-3.2.0.tgz", + "integrity": "sha1-rt3T+ZTJM+StmLmdmlVu+g4v6UI=", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "point-at-length": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/point-at-length/download/point-at-length-1.1.0.tgz", + "integrity": "sha1-CtcuvQmA1/WhqxIpbAVfnrazDlc=", + "requires": { + "abs-svg-path": "~0.1.1", + "isarray": "~0.0.1", + "parse-svg-path": "~0.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz", + "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-8.3.6.tgz", + "integrity": "sha1-JzDddql5afN/U7mmCWGXvjEcxOo=", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/source-map-js/download/source-map-js-0.6.2.tgz?cache=0&sync_timestamp=1636400772640&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map-js%2Fdownload%2Fsource-map-js-0.6.2.tgz", + "integrity": "sha1-C7XeYxtBz72mz7qL0FqA79/SOF4=", + "dev": true + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-attribute-case-insensitive/download/postcss-attribute-case-insensitive-4.0.2.tgz?cache=0&sync_timestamp=1600194210360&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-attribute-case-insensitive%2Fdownload%2Fpostcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha1-2T5GtQRYnpSscnewRjImxoBBqIA=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-8.0.0.tgz?cache=0&sync_timestamp=1609689191682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-8.0.0.tgz", + "integrity": "sha1-oFuHqs0TJ0Cl2wlGKjYSRT5d+Qo=", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/postcss-color-functional-notation/download/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha1-Xv03qI+6vrAKKWbR5T2Yztk/dOA=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-color-gray/download/postcss-color-gray-5.0.0.tgz", + "integrity": "sha1-Uyox65CfjaiYzv/ilv3B+GS+hUc=", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/postcss-color-hex-alpha/download/postcss-color-hex-alpha-5.0.3.tgz?cache=0&sync_timestamp=1632320902580&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-color-hex-alpha%2Fdownload%2Fpostcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha1-qNnKTDnUl8lmHjdLnFGJnvD4c4g=", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-color-mod-function/download/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha1-gWuhRawRzDy2uqkFp1pJ+QPk0x0=", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.nlark.com/postcss-color-rebeccapurple/download/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha1-x6ib6HK7dORbHjAiv+V0iCPm3nc=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-colormin": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/postcss-colormin/download/postcss-colormin-5.2.1.tgz", + "integrity": "sha1-bkRKgG/TxXiCfbrQInYt8ZM0QU0=", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-convert-values": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/postcss-convert-values/download/postcss-convert-values-5.0.2.tgz?cache=0&sync_timestamp=1635857664165&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-convert-values%2Fdownload%2Fpostcss-convert-values-5.0.2.tgz", + "integrity": "sha1-h5uEncNnfH1ryUtqLBo/CAh5gFk=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.nlark.com/postcss-custom-media/download/postcss-custom-media-7.0.8.tgz", + "integrity": "sha1-//0T/+/61zYhvl84cHaiiwApTgw=", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.nlark.com/postcss-custom-properties/download/postcss-custom-properties-8.0.11.tgz?cache=0&sync_timestamp=1631899559309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-custom-properties%2Fdownload%2Fpostcss-custom-properties-8.0.11.tgz", + "integrity": "sha1-LWF3LW6S8i9eDVJgLfj65G+jDZc=", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-custom-selectors/download/postcss-custom-selectors-5.1.2.tgz?cache=0&sync_timestamp=1610469257838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-custom-selectors%2Fdownload%2Fpostcss-custom-selectors-5.1.2.tgz", + "integrity": "sha1-ZIWMbrLs/y+0HQsoyd17PbTef7o=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/cssesc/download/cssesc-2.0.0.tgz", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-5.0.0.tgz", + "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/postcss-dir-pseudo-class/download/postcss-dir-pseudo-class-5.0.0.tgz?cache=0&sync_timestamp=1631886211698&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-dir-pseudo-class%2Fdownload%2Fpostcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha1-bjpBd9Dts6vMhf22+7HCbauuq6I=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/cssesc/download/cssesc-2.0.0.tgz", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-5.0.0.tgz", + "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-discard-comments/download/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha1-nq5LdHz3YNMfJEfCfwYZ1XGJAf4=", + "dev": true + }, + "postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-discard-duplicates/download/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha1-aPfMZFj+a6suRsn1WuUoafaA5m0=", + "dev": true + }, + "postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-discard-empty/download/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha1-7hNsOeJ9XS7U2g7l7QK8ip+L9tg=", + "dev": true + }, + "postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-discard-overridden/download/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha1-RUtB9wcwC5gQmnUAXKSrD/J0OsY=", + "dev": true + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/postcss-double-position-gradients/download/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha1-/JJ9Uv3ciWyzooEuvF3xR+EQUi4=", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/postcss-env-function/download/postcss-env-function-2.0.2.tgz?cache=0&sync_timestamp=1637256010098&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-env-function%2Fdownload%2Fpostcss-env-function-2.0.2.tgz", + "integrity": "sha1-Dz49PFfwlKksK69LYkHwsNpTZdc=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/postcss-focus-visible/download/postcss-focus-visible-4.0.0.tgz?cache=0&sync_timestamp=1632317515654&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-focus-visible%2Fdownload%2Fpostcss-focus-visible-4.0.0.tgz", + "integrity": "sha1-R30QcROt5gJLFBKDF63ivR4XBG4=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/postcss-focus-within/download/postcss-focus-within-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-focus-within%2Fdownload%2Fpostcss-focus-within-3.0.0.tgz", + "integrity": "sha1-djuHiFls7puHTJmSAc3egGWe9oA=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-font-variant/download/postcss-font-variant-4.0.1.tgz", + "integrity": "sha1-QtTAqzCJT2D5ixdWHrXAMh9QJkE=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/postcss-gap-properties/download/postcss-gap-properties-2.0.0.tgz?cache=0&sync_timestamp=1631886207918&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-gap-properties%2Fdownload%2Fpostcss-gap-properties-2.0.0.tgz", + "integrity": "sha1-QxwZKrPtlqPD0J8v9hWWD5AsFxU=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmmirror.com/postcss-html/download/postcss-html-0.36.0.tgz", + "integrity": "sha1-tAkT+U6qzCRT/TChMnrW7h+IsgQ=", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/postcss-image-set-function/download/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha1-KJIKLymUW+1MMZjX32SW1BDT8og=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.nlark.com/postcss-import/download/postcss-import-14.0.2.tgz", + "integrity": "sha1-YO/3fmvpLntn/kaex5fZQkyuGqE=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/postcss-initial/download/postcss-initial-3.0.4.tgz", + "integrity": "sha1-nTIGmhBTH+Lsr6C2rHUO4Lx+/FM=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-jsx": { + "version": "0.36.4", + "resolved": "https://registry.npm.taobao.org/postcss-jsx/download/postcss-jsx-0.36.4.tgz", + "integrity": "sha1-N6aPMAo55XSNVH8Zp0ezJXJAvVA=", + "dev": true, + "requires": { + "@babel/core": ">=7.2.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/postcss-lab-function/download/postcss-lab-function-2.0.1.tgz?cache=0&sync_timestamp=1637260919901&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-lab-function%2Fdownload%2Fpostcss-lab-function-2.0.1.tgz", + "integrity": "sha1-u1GmhWzRIomrSuINseOCHvE9fS4=", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.nlark.com/postcss-less/download/postcss-less-3.1.4.tgz?cache=0&sync_timestamp=1627347193371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-less%2Fdownload%2Fpostcss-less-3.1.4.tgz", + "integrity": "sha1-Np9YZCtZKO+Jj/vBpuk8lYMExa0=", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-6.1.1.tgz", + "integrity": "sha1-WN0KOszZvIfMUu/3UkTbV40RMBo=", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/postcss-logical/download/postcss-logical-3.0.0.tgz", + "integrity": "sha1-JJXQ+LgunyYnJfdflAGzTntF1bU=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-markdown": { + "version": "0.36.0", + "resolved": "https://registry.npmmirror.com/postcss-markdown/download/postcss-markdown-0.36.0.tgz", + "integrity": "sha1-fyKEmuDj2xiCC3sNXngz8TpEdWA=", + "dev": true, + "requires": { + "remark": "^10.0.1", + "unist-util-find-all-after": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/is-buffer/download/is-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=", + "dev": true + }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/parse-entities/download/parse-entities-1.2.2.tgz", + "integrity": "sha1-wxvw9lO2ZhNU+Jc1WcuG3R1e31A=", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "remark": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/remark/download/remark-10.0.1.tgz?cache=0&sync_timestamp=1637258856657&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark%2Fdownload%2Fremark-10.0.1.tgz", + "integrity": "sha1-MFgHbcQXgb9QXYl4wpFIX+R2Z98=", + "dev": true, + "requires": { + "remark-parse": "^6.0.0", + "remark-stringify": "^6.0.0", + "unified": "^7.0.0" + } + }, + "remark-parse": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/remark-parse/download/remark-parse-6.0.3.tgz", + "integrity": "sha1-yZExBSgJ2kghCEE/h7Duf1IYCjo=", + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/remark-stringify/download/remark-stringify-6.0.4.tgz", + "integrity": "sha1-FqwinU0VkySQGGY8e93yiq/E4Ig=", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "unified": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/unified/download/unified-7.1.0.tgz", + "integrity": "sha1-UDLxwe4zZL0J2hLif91KdVPHvhM=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-find-all-after": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/unist-util-find-all-after/download/unist-util-find-all-after-1.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-find-all-after%2Fdownload%2Funist-util-find-all-after-1.0.5.tgz", + "integrity": "sha1-V1GoYIg09B0RetnFd3cMXy8bKJk=", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/unist-util-is/download/unist-util-is-3.0.0.tgz?cache=0&sync_timestamp=1626874922677&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-is%2Fdownload%2Funist-util-is-3.0.0.tgz", + "integrity": "sha1-2ehDgcJGjoJinkpb6dfQWi3TJM0=", + "dev": true + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/unist-util-stringify-position/download/unist-util-stringify-position-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-stringify-position%2Fdownload%2Funist-util-stringify-position-1.1.2.tgz", + "integrity": "sha1-Pzf881EnncvKdICrWIm7ioMu4cY=", + "dev": true + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/vfile/download/vfile-3.0.1.tgz", + "integrity": "sha1-RzMdKr4ygkJPSku2rNIKRMQSGAM=", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/vfile-message/download/vfile-message-1.1.1.tgz?cache=0&sync_timestamp=1628780833868&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvfile-message%2Fdownload%2Fvfile-message-1.1.1.tgz", + "integrity": "sha1-WDOuB4od+i2W6WR4hs0ymTqzE+E=", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + } + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-media-minmax/download/postcss-media-minmax-4.0.0.tgz?cache=0&sync_timestamp=1610466264580&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-media-minmax%2Fdownload%2Fpostcss-media-minmax-4.0.0.tgz", + "integrity": "sha1-t1u2y8IXyKxJQz4S8iBIgUpPXtU=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-merge-longhand": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/download/postcss-merge-longhand-5.0.4.tgz?cache=0&sync_timestamp=1637084982494&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-merge-longhand%2Fdownload%2Fpostcss-merge-longhand-5.0.4.tgz", + "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + } + }, + "postcss-merge-rules": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/postcss-merge-rules/download/postcss-merge-rules-5.0.3.tgz?cache=0&sync_timestamp=1637085799347&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-merge-rules%2Fdownload%2Fpostcss-merge-rules-5.0.3.tgz", + "integrity": "sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-minify-font-values/download/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha1-qQzvv9qgdb09uqGzNYi7TcJord8=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-gradients": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/download/postcss-minify-gradients-5.0.3.tgz?cache=0&sync_timestamp=1635856917388&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-minify-gradients%2Fdownload%2Fpostcss-minify-gradients-5.0.3.tgz", + "integrity": "sha1-+XChHMceCOkJXnjsOms0uRwZVQ4=", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-params": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-params/download/postcss-minify-params-5.0.2.tgz?cache=0&sync_timestamp=1637084983019&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-minify-params%2Fdownload%2Fpostcss-minify-params-5.0.2.tgz", + "integrity": "sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.6", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/postcss-minify-selectors/download/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha1-Q4XIRdOXn/FgKRd0Uj/6VOr9WlQ=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587625149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586215124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz", + "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-nesting/download/postcss-nesting-7.0.1.tgz?cache=0&sync_timestamp=1637236305822&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-nesting%2Fdownload%2Fpostcss-nesting-7.0.1.tgz", + "integrity": "sha1-tQrXt/AXPlteOIDDUBNEcD4EwFI=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha1-EhVZ0b68VayNJK839nvU2p79kdA=", + "dev": true + }, + "postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-display-values/download/postcss-normalize-display-values-5.0.1.tgz?cache=0&sync_timestamp=1621449652268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-display-values%2Fdownload%2Fpostcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha1-YmULllmBqVXf/ugzY0U9uC9q0f0=", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-positions/download/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha1-ho9q8Xlf36hvu+lg3OtH5flJL+U=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha1-y8DeE4O1f1u2Hd1qhGU7XoZlsrU=", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-string/download/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha1-2er6pN94x6O5c640bvDkfFVJhbA=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha1-juQRA7kTBCnGy7pzaTK3XF4ssIw=", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-unicode/download/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha1-gtZy1kikEYFKpb865WU3nM2fXjc=", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-url": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/postcss-normalize-url/download/postcss-normalize-url-5.0.3.tgz?cache=0&sync_timestamp=1637084983535&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-normalize-url%2Fdownload%2Fpostcss-normalize-url-5.0.3.tgz", + "integrity": "sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg==", + "dev": true, + "requires": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha1-sLQLW8rINYX/B+rS2vLc++7vjpo=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.nlark.com/postcss-ordered-values/download/postcss-ordered-values-5.0.2.tgz?cache=0&sync_timestamp=1623330460500&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-5.0.2.tgz", + "integrity": "sha1-HzUUJpd74A4PdlsxZK11PayO0EQ=", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/postcss-overflow-shorthand/download/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha1-MezzUOnG9t3CUKePDD4RHzLdTDA=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/postcss-page-break/download/postcss-page-break-2.0.0.tgz", + "integrity": "sha1-rdUtDgpSjKvmr+6LRuKrsnffRr8=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-place/download/postcss-place-4.0.1.tgz?cache=0&sync_timestamp=1637322613194&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-place%2Fdownload%2Fpostcss-place-4.0.1.tgz", + "integrity": "sha1-6fOdM9LcWE5G7h20Wtt3yp0dzGI=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmmirror.com/postcss-preset-env/download/postcss-preset-env-6.7.0.tgz?cache=0&sync_timestamp=1637321343139&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-preset-env%2Fdownload%2Fpostcss-preset-env-6.7.0.tgz", + "integrity": "sha1-w03az4+QI4OzWtHgMPF49M3xGKU=", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.nlark.com/postcss-pseudo-class-any-link/download/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha1-LtPu05OzcCh53sSocDKyENrrBNE=", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/cssesc/download/cssesc-2.0.0.tgz", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-5.0.0.tgz", + "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-reduce-initial/download/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha1-nWNphlsPb29rFloO9dwaSFbH6UY=", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/postcss-reduce-transforms/download/postcss-reduce-transforms-5.0.1.tgz?cache=0&sync_timestamp=1621449730895&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-reduce-transforms%2Fdownload%2Fpostcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha1-k8EvahWUdKpxHVJpkj4jg87c9kA=", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-replace-overflow-wrap/download/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha1-YbNg/9rtyoTHyRjSsPDQ6lWasBw=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-reporter/download/postcss-reporter-6.0.1.tgz", + "integrity": "sha1-fAVRIAYKl8iDe05IIVZhqvt0JF8=", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + }, + "dependencies": { + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.nlark.com/postcss-safe-parser/download/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha1-ptTkjw832ffBGypYG/APi6SHC5Y=", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.nlark.com/postcss-sass/download/postcss-sass-0.4.4.tgz", + "integrity": "sha1-kfDzRHtFzjcyJ6mLYfjY8HhShaM=", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/postcss-scss/download/postcss-scss-2.1.1.tgz?cache=0&sync_timestamp=1635496103823&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-scss%2Fdownload%2Fpostcss-scss-2.1.1.tgz", + "integrity": "sha1-7Dp1+imlXgFrkL8yaQJsU8HSs4M=", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-selector-matches/download/postcss-selector-matches-4.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-matches%2Fdownload%2Fpostcss-selector-matches-4.0.0.tgz", + "integrity": "sha1-ccgkj5F7osyTA3yWN+4JxkQ2/P8=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-selector-not/download/postcss-selector-not-4.0.1.tgz?cache=0&sync_timestamp=1612096191464&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-not%2Fdownload%2Fpostcss-selector-not-4.0.1.tgz", + "integrity": "sha1-JjAW7vHPIZ4K3pqRN4D8H0ggTL8=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz", + "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sorting": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/postcss-sorting/download/postcss-sorting-4.1.0.tgz", + "integrity": "sha1-oQfwvzhSl3+mTkRCvDQMiNWqzbM=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "postcss-svgo": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/postcss-svgo/download/postcss-svgo-5.0.3.tgz", + "integrity": "sha1-2UUYV1bl36rgf57bDTyuf/efmzA=", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npm.taobao.org/postcss-syntax/download/postcss-syntax-0.36.2.tgz", + "integrity": "sha1-8IV4x9lYNFdOVZOoLfv6ivrjtRw=", + "dev": true + }, + "postcss-unique-selectors": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/download/postcss-unique-selectors-5.0.2.tgz?cache=0&sync_timestamp=1637084982907&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-unique-selectors%2Fdownload%2Fpostcss-unique-selectors-5.0.2.tgz", + "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", + "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", + "dev": true + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/postcss-values-parser/download/postcss-values-parser-2.0.1.tgz", + "integrity": "sha1-2otHLZAdoeIFtHvcmGN7np5VDl8=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "preact": { + "version": "10.6.1", + "resolved": "https://registry.npmmirror.com/preact/download/preact-10.6.1.tgz", + "integrity": "sha512-ydCg+ISIq70vqiThvNWStZWLRjR9U2awP/JAmGdWUKm9+Tyuy+MqVdAIyEByeIspAVtD4GWC/SJtxO8XD4knVA==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.2.1.tgz", + "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", + "dev": true + }, + "prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/prettier/download/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-5.6.0.tgz", + "integrity": "sha1-NWJW9kOAR3PIL2RyP+eMksYr6us=", + "dev": true + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/printj/download/printj-1.1.2.tgz", + "integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "promise": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/promise/download/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/promise-retry/download/promise-retry-2.0.1.tgz", + "integrity": "sha1-/3R6E2IKtXumiPX8Z4VUEMNw2iI=", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "protractor": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/protractor/download/protractor-7.0.0.tgz", + "integrity": "sha1-w+JjYIvXLiwtyAKxGncnEaR5LQM=", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.nlark.com/cliui/download/cliui-6.0.0.tgz", + "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/del/download/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/globby/download/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.nlark.com/ini/download/ini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-1.0.0.tgz?cache=0&sync_timestamp=1628686555851&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-1.0.1.tgz?cache=0&sync_timestamp=1620047389319&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-1.0.1.tgz", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-1.0.1.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmmirror.com/source-map-support/download/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.nlark.com/webdriver-manager/download/webdriver-manager-12.1.8.tgz", + "integrity": "sha1-XnDnPqr1Ogdn1XRScK3a+8WQX9Q=", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-15.4.1.tgz", + "integrity": "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz", + "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", + "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz", + "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/q/download/q-1.4.1.tgz?cache=0&sync_timestamp=1599054212574&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fq%2Fdownload%2Fq-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/qjobs/download/qjobs-1.2.0.tgz", + "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "dev": true + }, + "qrious": { + "version": "4.0.2", + "resolved": "http://npm.eascs.com/qrious/-/qrious-4.0.2.tgz", + "integrity": "sha1-CcTUB50rlhYX9ixpz/O5u2ajlpM=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.nlark.com/qs/download/qs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz", + "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.nlark.com/queue-microtask/download/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/quick-lru/download/quick-lru-4.0.1.tgz", + "integrity": "sha1-W4h48ROlgheEjGSCAmxz4bpXcn8=", + "dev": true + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/quill/download/quill-1.3.7.tgz", + "integrity": "sha1-2lsvOixHDpMjQM2/NmjJ8h+Shug=", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.nlark.com/quill-delta/download/quill-delta-3.6.3.tgz", + "integrity": "sha1-sZ/SuJQSMBxg4f8hPY2GDqwPEDI=", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "quill-image-resize-module": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/quill-image-resize-module/download/quill-image-resize-module-3.0.0.tgz", + "integrity": "sha1-D9k3Rqg3M22VsvU2FAQWpiPHF3E=", + "requires": { + "lodash": "^4.17.4", + "quill": "^1.2.2", + "raw-loader": "^0.5.1" + }, + "dependencies": { + "acorn": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-5.0.2.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-5.0.2.tgz", + "integrity": "sha1-3ByPuQf2TbKrVz3iMmtzUnwk3jY=" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.11", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-4.0.11.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-4.0.11.tgz", + "integrity": "sha1-7c2jvZN+dVZBDULtWGD2c5nHlMA=" + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-3.0.1.tgz?cache=0&sync_timestamp=1625793240297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-jsx%2Fdownload%2Facorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-3.3.0.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "ajv": { + "version": "4.11.5", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-4.11.5.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-4.11.5.tgz", + "integrity": "sha1-tu50ZXuZOgHc5Et5RNVvSFgo1b0=", + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/ajv-keywords/download/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/ansi-escapes/download/ansi-escapes-1.4.0.tgz?cache=0&sync_timestamp=1618847144938&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.0.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "requires": { + "arrify": "^1.0.0", + "micromatch": "^2.1.5" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.nlark.com/argparse/download/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/aria-query/download/aria-query-0.3.0.tgz?cache=0&sync_timestamp=1633308188641&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faria-query%2Fdownload%2Faria-query-0.3.0.tgz", + "integrity": "sha1-y4qZhOKGJxHIPICt5bj1yg3itGc=", + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.0.1.tgz?cache=0&sync_timestamp=1618846805394&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farr-flatten%2Fdownload%2Farr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/array-uniq/download/array-uniq-1.0.3.tgz?cache=0&sync_timestamp=1622605321175&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farray-uniq%2Fdownload%2Farray-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/array-unique/download/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/array.prototype.find/download/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/arrify/download/arrify-1.0.1.tgz?cache=0&sync_timestamp=1619599497996&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farrify%2Fdownload%2Farrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/ast-types-flow/download/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "async": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/async/download/async-2.3.0.tgz", + "integrity": "sha1-EBPRBRBH3TIP4k5JTVxm7K9hR9k=", + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "babel-cli": { + "version": "6.24.0", + "resolved": "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.24.0.tgz", + "integrity": "sha1-oF/9IQ3KDCiKJtUxnFrIZpomWtA=", + "requires": { + "babel-core": "^6.24.0", + "babel-polyfill": "^6.23.0", + "babel-register": "^6.24.0", + "babel-runtime": "^6.22.0", + "chokidar": "^1.6.1", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.0.0", + "lodash": "^4.2.0", + "output-file-sync": "^1.1.0", + "path-is-absolute": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "v8flags": "^2.0.10" + } + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-code-frame/download/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "requires": { + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "babel-core": { + "version": "6.24.0", + "resolved": "https://registry.npm.taobao.org/babel-core/download/babel-core-6.24.0.tgz", + "integrity": "sha1-jzagp39cFVrtb5ILhE0julZ0KgI=", + "requires": { + "babel-code-frame": "^6.22.0", + "babel-generator": "^6.24.0", + "babel-helpers": "^6.23.0", + "babel-messages": "^6.23.0", + "babel-register": "^6.24.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.11.0", + "convert-source-map": "^1.1.0", + "debug": "^2.1.1", + "json5": "^0.5.0", + "lodash": "^4.2.0", + "minimatch": "^3.0.2", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "slash": "^1.0.0", + "source-map": "^0.5.0" + } + }, + "babel-eslint": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/babel-eslint/download/babel-eslint-7.2.1.tgz", + "integrity": "sha1-B5Qi63O6gR48oIZc6Hrykyf4xS8=", + "requires": { + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.16.1" + } + }, + "babel-generator": { + "version": "6.24.0", + "resolved": "https://registry.npm.taobao.org/babel-generator/download/babel-generator-6.24.0.tgz", + "integrity": "sha1-66JwqMxM5uCaYb5DRl18YsH4fFY=", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.23.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz", + "integrity": "sha1-Kd9WvhRNgb3qwIJiv6QdLF6Rzc0=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.22.0.tgz", + "integrity": "sha1-EZkhtWEg8X6drj90tPXMe8wbN+8=", + "requires": { + "babel-helper-hoist-variables": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-define-map": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-helper-define-map/download/babel-helper-define-map-6.23.0.tgz", + "integrity": "sha1-FET5YMlpHWmiztaiBTFfj9AIBOc=", + "requires": { + "babel-helper-function-name": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.23.0", + "lodash": "^4.2.0" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.22.0.tgz", + "integrity": "sha1-yXv3bu0+C65ASBIfK52uGk59BHg=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-function-name": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-helper-function-name/download/babel-helper-function-name-6.23.0.tgz", + "integrity": "sha1-JXQtZxdciQPb5LbLnZ4fy43PI6Y=", + "requires": { + "babel-helper-get-function-arity": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.22.0.tgz", + "integrity": "sha1-C+tGStadxzR0EKxq3p8DpQY09c4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.22.0.tgz", + "integrity": "sha1-Pqy/cx2AcFhF3S6XGPYAz7m0unI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.23.0.tgz", + "integrity": "sha1-8+5+7TVbQoITizPQK3g2nkcGIvU=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.23.0" + } + }, + "babel-helper-regex": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-helper-regex/download/babel-helper-regex-6.22.0.tgz", + "integrity": "sha1-efUyvhZHsfDuNHS19cPaWAAdJH0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0", + "lodash": "^4.2.0" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.22.0.tgz", + "integrity": "sha1-IYaucyeO0DuLFc7QiWCdqYEFM4M=", + "requires": { + "babel-helper-function-name": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.22.0", + "babel-traverse": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-helper-replace-supers/download/babel-helper-replace-supers-6.23.0.tgz", + "integrity": "sha1-7q+K2bWOxDN8qUIjus3KH42bS/0=", + "requires": { + "babel-helper-optimise-call-expression": "^6.23.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0" + } + }, + "babel-helpers": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-helpers/download/babel-helpers-6.23.0.tgz", + "integrity": "sha1-T48uCS0LaogIpL3nnCfx4uzw2ZI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmmirror.com/babel-loader/download/babel-loader-6.4.1.tgz?cache=0&sync_timestamp=1634769717079&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-loader%2Fdownload%2Fbabel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "requires": { + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-messages/download/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.nlark.com/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.22.0.tgz", + "integrity": "sha1-GUtpOOwZWtNu/EwzqXGs8A2M014=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.22.0", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.23.0.tgz", + "integrity": "sha1-GHt0fuQEOZATVjyZPbA480dUrDs=", + "requires": { + "babel-helper-function-name": "^6.23.0", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz", + "integrity": "sha1-5IiVzws3W+FIzXyIebQicHoFO1E=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0", + "lodash": "^4.2.0" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.23.0.tgz", + "integrity": "sha1-SbU/MmICov0bO7ql4u3YpPeGQ8E=", + "requires": { + "babel-helper-define-map": "^6.23.0", + "babel-helper-function-name": "^6.23.0", + "babel-helper-optimise-call-expression": "^6.23.0", + "babel-helper-replace-supers": "^6.23.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz", + "integrity": "sha1-fDg+lim7pIIMEbBCW91ikPfwV+c=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz", + "integrity": "sha1-ZyOXAxwhYQ1y3Su7C6n7Ynfhw2s=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.22.0.tgz", + "integrity": "sha1-9fzIsJCT+aI8dqw9njksPsS3cQQ=", + "requires": { + "babel-helper-function-name": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz", + "integrity": "sha1-oZEfubfsfgWkOmPFmVAHVXvPai4=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.24.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz", + "integrity": "sha1-6SGu+3LCzCbLA9EHYmFWQTIiE08=", + "requires": { + "babel-plugin-transform-strict-mode": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-types": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz", + "integrity": "sha1-rjRpIn/6w5sDENkP7HO/3E9jF7A=", + "requires": { + "babel-helper-hoist-variables": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz", + "integrity": "sha1-/V+mNSHK6NJzknw5WK/XwGdzNFA=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.22.0.tgz", + "integrity": "sha1-2qYOEUoELqdp3VP+Uo/IIxHrmPw=", + "requires": { + "babel-helper-replace-supers": "^6.22.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.23.0.tgz", + "integrity": "sha1-OiqrtwyK+UXVzjhvGkJQYlqDrjs=", + "requires": { + "babel-helper-call-delegate": "^6.22.0", + "babel-helper-get-function-arity": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.23.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz", + "integrity": "sha1-i6d24K/6pgv/IekhQDuKZSov9yM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz", + "integrity": "sha1-qzFoKehm7j9LnrlpOXV9GaW8RZM=", + "requires": { + "babel-helper-regex": "^6.22.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz", + "integrity": "sha1-jZzCfn7h3s/mVFT7mGRSoEphPSA=", + "requires": { + "babel-helper-regex": "^6.22.0", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.22.0.tgz", + "integrity": "sha1-1XyDNSgZGOVO8FMRjObrEIRoCE0=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.22.0", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.22.0.tgz", + "integrity": "sha1-ZXQFk6MZxEUiFXU41pC4QJRhfqY=", + "requires": { + "regenerator-transform": "0.9.8" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.22.0", + "resolved": "https://registry.nlark.com/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.22.0.tgz", + "integrity": "sha1-4AjfATQP3IfpWdplmRt+BZcMjHw=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.22.0" + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-polyfill/download/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "requires": { + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "babel-preset-env": { + "version": "1.3.2", + "resolved": "https://registry.nlark.com/babel-preset-env/download/babel-preset-env-1.3.2.tgz", + "integrity": "sha1-COq9K/gQw2eAaffgUjI0GfFEh0k=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^1.4.0", + "invariant": "^2.2.2" + } + }, + "babel-preset-es2015": { + "version": "6.24.0", + "resolved": "https://registry.npmmirror.com/babel-preset-es2015/download/babel-preset-es2015-6.24.0.tgz", + "integrity": "sha1-wWLWixkyaW4DbNMRDcHM0wPSZzo=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.22.0", + "babel-plugin-transform-es2015-classes": "^6.22.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.22.0", + "babel-plugin-transform-es2015-modules-umd": "^6.24.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.22.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0" + } + }, + "babel-register": { + "version": "6.24.0", + "resolved": "https://registry.npm.taobao.org/babel-register/download/babel-register-6.24.0.tgz", + "integrity": "sha1-Xon4RjuplwNW0C6wfavjMIsIDP0=", + "requires": { + "babel-core": "^6.24.0", + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.2" + } + }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "babel-template": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-template/download/babel-template-6.23.0.tgz", + "integrity": "sha1-BNTycK27OqcEqBQ64m+qUpI45jg=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.23.0", + "babel-types": "^6.23.0", + "babylon": "^6.11.0", + "lodash": "^4.2.0" + } + }, + "babel-traverse": { + "version": "6.23.1", + "resolved": "https://registry.nlark.com/babel-traverse/download/babel-traverse-6.23.1.tgz", + "integrity": "sha1-08tZAQ7NBql9gTEAZflmtpnhT0g=", + "requires": { + "babel-code-frame": "^6.22.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.23.0", + "babylon": "^6.15.0", + "debug": "^2.2.0", + "globals": "^9.0.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + } + }, + "babel-types": { + "version": "6.23.0", + "resolved": "https://registry.nlark.com/babel-types/download/babel-types-6.23.0.tgz", + "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=", + "requires": { + "babel-runtime": "^6.22.0", + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^1.0.1" + } + }, + "babylon": { + "version": "6.16.1", + "resolved": "https://registry.npm.taobao.org/babylon/download/babylon-6.16.1.tgz", + "integrity": "sha1-MMWiL0gZeKnn+M399JaxHZS0BNM=" + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" + }, + "big.js": { + "version": "3.1.3", + "resolved": "https://registry.nlark.com/big.js/download/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" + }, + "binary-extensions": { + "version": "1.8.0", + "resolved": "https://registry.nlark.com/binary-extensions/download/binary-extensions-1.8.0.tgz", + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=" + }, + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + }, + "brace-expansion": { + "version": "1.1.6", + "resolved": "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.6.tgz", + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.nlark.com/browserify-aes/download/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "requires": { + "buffer-xor": "^1.0.2", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/browserify-cipher/download/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/browserify-des/download/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.nlark.com/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.nlark.com/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/browserify-zlib/download/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "~0.2.0" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmmirror.com/browserslist/download/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.nlark.com/buffer/download/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/caller-path/download/caller-path-0.1.0.tgz?cache=0&sync_timestamp=1633674209796&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-path%2Fdownload%2Fcaller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/callsites/download/callsites-0.2.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-1.2.1.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caniuse-db": { + "version": "1.0.30000646", + "resolved": "https://registry.npmmirror.com/caniuse-db/download/caniuse-db-1.0.30000646.tgz", + "integrity": "sha1-xyS5DWHfJChuAV/FKNBiBzwA3vQ=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/chokidar/download/chokidar-1.6.1.tgz", + "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/cipher-base/download/cipher-base-1.0.3.tgz", + "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", + "requires": { + "inherits": "^2.0.1" + } + }, + "circular-json": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/circular-json/download/circular-json-0.3.1.tgz", + "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=" + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/cli-cursor/download/cli-cursor-1.0.2.tgz?cache=0&sync_timestamp=1629747506749&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/cli-width/download/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/commander/download/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.nlark.com/concat-stream/download/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/console-browserify/download/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/contains-path/download/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.5.0.tgz?cache=0&sync_timestamp=1624045508580&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/core-js/download/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/create-ecdh/download/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/create-hash/download/create-hash-1.1.2.tgz", + "integrity": "sha1-USEAYte7dHn2xlu0GpIgix1hq60=", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^1.0.0", + "sha.js": "^2.3.6" + } + }, + "create-hmac": { + "version": "1.1.4", + "resolved": "https://registry.nlark.com/create-hmac/download/create-hmac-1.1.4.tgz", + "integrity": "sha1-0/tLolPriz9W456i+8uK90e9MXA=", + "requires": { + "create-hash": "^1.1.0", + "inherits": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.11.0", + "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.11.0.tgz", + "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/d/download/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "^0.10.9" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/damerau-levenshtein/download/damerau-levenshtein-1.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdamerau-levenshtein%2Fdownload%2Fdamerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/date-now/download/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.3", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.3.tgz", + "integrity": "sha1-D364wwll7AjHKsz6ATDIt5mEFB0=", + "requires": { + "ms": "0.7.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1633055756574&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/deep-equal/download/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/define-properties/download/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/del/download/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/detect-indent/download/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.nlark.com/diffie-hellman/download/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.nlark.com/domain-browser/download/domain-browser-1.1.7.tgz?cache=0&sync_timestamp=1627591557212&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "electron-to-chromium": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.3.2.tgz", + "integrity": "sha1-uM5ck7MI2w6S9tBDXEbd7I9jY6s=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "6.4.1", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-6.4.1.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-6.4.1.tgz", + "integrity": "sha1-d0hv6c1FQh0mCmI4uI1yHi+tIFA=" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "enhanced-resolve": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-3.1.0.tgz", + "integrity": "sha1-n0tib1dyRe3PSyrYPYbhf09CHew=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.5" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/errno/download/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "requires": { + "prr": "~0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.nlark.com/error-ex/download/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.7.0.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.7.0.tgz", + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.0", + "is-callable": "^1.1.3", + "is-regex": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-ext": { + "version": "0.10.15", + "resolved": "https://registry.nlark.com/es5-ext/download/es5-ext-0.10.15.tgz", + "integrity": "sha1-wzClk0we4hKEp8CBqG5f2TfJHqY=", + "requires": { + "es6-iterator": "2", + "es6-symbol": "~3.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/es6-iterator/download/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-symbol": "^3.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.nlark.com/es6-map/download/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/es6-weak-map/download/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmmirror.com/eslint/download/eslint-3.19.0.tgz?cache=0&sync_timestamp=1637475730061&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint%2Fdownload%2Feslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "requires": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "dependencies": { + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/user-home/download/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "requires": { + "os-homedir": "^1.0.0" + } + } + } + }, + "eslint-config-airbnb": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/eslint-config-airbnb/download/eslint-config-airbnb-14.1.0.tgz", + "integrity": "sha1-NV0pAEC7+OAL+LSxn0twy+fCMX8=", + "requires": { + "eslint-config-airbnb-base": "^11.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "11.1.2", + "resolved": "https://registry.npmmirror.com/eslint-config-airbnb-base/download/eslint-config-airbnb-base-11.1.2.tgz?cache=0&sync_timestamp=1636442475199&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-config-airbnb-base%2Fdownload%2Feslint-config-airbnb-base-11.1.2.tgz", + "integrity": "sha1-JZIJp2eL9pPjHL6PlT8ga2qnzMM=" + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.nlark.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.2.3.tgz?cache=0&sync_timestamp=1629046642917&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-import-resolver-node%2Fdownload%2Feslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "requires": { + "debug": "^2.2.0", + "object-assign": "^4.0.1", + "resolve": "^1.1.6" + } + }, + "eslint-module-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.0.0.tgz?cache=0&sync_timestamp=1634151608499&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-module-utils%2Fdownload%2Feslint-module-utils-2.0.0.tgz", + "integrity": "sha1-pvjCHZATWHWc3DXbrBmCrh7li84=", + "requires": { + "debug": "2.2.0", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.2.0.tgz?cache=0&sync_timestamp=1636529205526&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-plugin-import%2Fdownload%2Feslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "requires": { + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.2.0", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.2.0", + "eslint-module-utils": "^2.0.0", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "pkg-up": "^1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/download/eslint-plugin-jsx-a11y-4.0.0.tgz?cache=0&sync_timestamp=1636698418809&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-plugin-jsx-a11y%2Fdownload%2Feslint-plugin-jsx-a11y-4.0.0.tgz", + "integrity": "sha1-d5uw/nsI2lZKQiYkkR3hAGHgSO4=", + "requires": { + "aria-query": "^0.3.0", + "ast-types-flow": "0.0.7", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^1.0.0", + "object-assign": "^4.0.1" + } + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react/download/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "requires": { + "array.prototype.find": "^2.0.1", + "doctrine": "^1.2.2", + "has": "^1.0.1", + "jsx-ast-utils": "^1.3.4", + "object.assign": "^4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "espree": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/espree/download/espree-3.4.1.tgz?cache=0&sync_timestamp=1637466456948&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fespree%2Fdownload%2Fespree-3.4.1.tgz", + "integrity": "sha1-KKg6tKrtce2P4PXv5ht2oFwTxNI=", + "requires": { + "acorn": "^5.0.1", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/esquery/download/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.1.0.tgz", + "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", + "requires": { + "estraverse": "~4.1.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "estraverse": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-4.1.1.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=" + } + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-4.2.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.nlark.com/event-emitter/download/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/events/download/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/evp_bytestokey/download/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "requires": { + "create-hash": "^1.1.1" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/exit-hook/download/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.nlark.com/expand-range/download/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + } + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/extend/download/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.nlark.com/extglob/download/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fast-diff": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.1.1.tgz", + "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.nlark.com/figures/download/figures-1.7.0.tgz?cache=0&sync_timestamp=1625254307578&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffigures%2Fdownload%2Ffigures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz?cache=0&sync_timestamp=1613794272556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filename-regex": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.nlark.com/fill-range/download/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-0.1.1.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.nlark.com/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/fs-readdir-recursive/download/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/fsevents/download/fsevents-1.1.1.tgz", + "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=", + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.29" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "optional": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "optional": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "optional": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "optional": true, + "requires": { + "ms": "0.7.1" + } + }, + "deep-extend": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "optional": true + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "fstream": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", + "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz", + "integrity": "sha1-HCOFX5YvF7OtPQ3HRD8wRULt/gk=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "getpass": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "optional": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "optional": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", + "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "optional": true + }, + "jsprim": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + } + }, + "mime-db": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", + "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=", + "optional": true + }, + "mime-types": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", + "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=", + "optional": true, + "requires": { + "mime-db": "~1.26.0" + } + }, + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz", + "integrity": "sha1-ZArFUZj2qSWXLgwWxKwmoDTV7Mk=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "nopt": "~3.0.6", + "npmlog": "^4.0.1", + "rc": "~1.1.6", + "request": "^2.79.0", + "rimraf": "~2.5.4", + "semver": "~5.3.0", + "tar": "~2.2.1", + "tar-pack": "~3.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.1", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.1.tgz", + "integrity": "sha1-kYwLO802Z5dyuvE1say0wWUe150=", + "optional": true + }, + "rc": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", + "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=", + "optional": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", + "integrity": "sha1-1agEziJpVRVjjnmNviMnPeBwpfo=", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "optional": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", + "integrity": "sha1-MJMYFkGPVa/E0hd1r91nIM7kXa4=", + "optional": true, + "requires": { + "debug": "~2.2.0", + "fstream": "~1.0.10", + "fstream-ignore": "~1.0.5", + "once": "~1.3.3", + "readable-stream": "~2.1.4", + "rimraf": "~2.5.1", + "tar": "~2.2.1", + "uid-number": "~0.0.6" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "optional": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + } + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", + "optional": true, + "requires": { + "string-width": "^1.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/get-caller-file/download/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/glob/download/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-2.0.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.17.0", + "resolved": "https://registry.npmmirror.com/globals/download/globals-9.17.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-9.17.0.tgz", + "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/globby/download/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-1.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "hash.js": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/hash.js/download/hash.js-1.0.3.tgz?cache=0&sync_timestamp=1622643346539&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhash.js%2Fdownload%2Fhash.js-1.0.3.tgz", + "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=", + "requires": { + "inherits": "^2.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/hmac-drbg/download/hmac-drbg-1.0.0.tgz", + "integrity": "sha1-PbRx9FquSplKBogyIXH1G4uRvuU=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz?cache=0&sync_timestamp=1618599551277&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhome-or-tmp%2Fdownload%2Fhome-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.4.1", + "resolved": "https://registry.nlark.com/hosted-git-info/download/hosted-git-info-2.4.1.tgz", + "integrity": "sha1-SwRF5BwASovRM3dzpP95DKQDGMg=" + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.nlark.com/https-browserify/download/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.nlark.com/ieee754/download/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-3.2.6.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-3.2.6.tgz", + "integrity": "sha1-JujaBkS+C7TLOVFvbHnw4PT/5Iw=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/inquirer/download/inquirer-0.12.0.tgz?cache=0&sync_timestamp=1633472964335&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Finquirer%2Fdownload%2Finquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.0.2.tgz", + "integrity": "sha1-9PYj8LtxIvFfVxfI4lS4FhtcWy0=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/invert-kv/download/invert-kv-1.0.0.tgz?cache=0&sync_timestamp=1630996775723&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finvert-kv%2Fdownload%2Finvert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.nlark.com/is-buffer/download/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-builtin-module/download/is-builtin-module-1.0.0.tgz?cache=0&sync_timestamp=1618995546759&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-builtin-module%2Fdownload%2Fis-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/is-dotfile/download/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.nlark.com/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-finite/download/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmmirror.com/is-my-json-valid/download/is-my-json-valid-2.16.0.tgz?cache=0&sync_timestamp=1636548715824&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-my-json-valid%2Fdownload%2Fis-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-1.0.0.tgz?cache=0&sync_timestamp=1628686555851&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz?cache=0&sync_timestamp=1620047389319&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-1.0.0.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/is-primitive/download/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.0.4.tgz?cache=0&sync_timestamp=1628221905423&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "requires": { + "tryit": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.1.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-3.0.1.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" + }, + "js-yaml": { + "version": "3.8.2", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.8.2.tgz?cache=0&sync_timestamp=1618435004368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.8.2.tgz", + "integrity": "sha1-AtPiwPa+qyAkjUEsNSIDgn14ZyE=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^3.1.1" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/jsesc/download/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-loader": { + "version": "0.5.4", + "resolved": "https://registry.nlark.com/json-loader/download/json-loader-0.5.4.tgz", + "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.nlark.com/jsonify/download/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/jsonpointer/download/jsonpointer-4.0.1.tgz?cache=0&sync_timestamp=1636550164046&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjsonpointer%2Fdownload%2Fjsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsx-ast-utils": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/jsx-ast-utils/download/jsx-ast-utils-1.4.0.tgz?cache=0&sync_timestamp=1631856184359&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjsx-ast-utils%2Fdownload%2Fjsx-ast-utils-1.4.0.tgz", + "integrity": "sha1-Wv44ho9WvIzHrq7wEAuox1vRJZE=", + "requires": { + "object-assign": "^4.1.0" + } + }, + "kind-of": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.1.0.tgz", + "integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz?cache=0&sync_timestamp=1618599642133&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.3.0.tgz?cache=0&sync_timestamp=1610027943366&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/loader-utils/download/loader-utils-0.2.17.tgz?cache=0&sync_timestamp=1636687869321&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Floader-utils%2Fdownload%2Floader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.nlark.com/lodash/download/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npm.taobao.org/lodash.cond/download/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.nlark.com/loose-envify/download/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.nlark.com/micromatch/download/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/miller-rabin/download/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/minimalistic-assert/download/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.nlark.com/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/ms/download/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.nlark.com/mute-stream/download/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + }, + "nan": { + "version": "2.5.1", + "resolved": "https://registry.nlark.com/nan/download/nan-2.5.1.tgz?cache=0&sync_timestamp=1628093719696&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnan%2Fdownload%2Fnan-2.5.1.tgz", + "integrity": "sha1-1bAWkSUzJql6K77p5hxV2NYDUeI=", + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/node-libs-browser/download/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "0.0.1", + "os-browserify": "^0.2.0", + "path-browserify": "0.0.0", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "normalize-package-data": { + "version": "2.3.6", + "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.3.6.tgz", + "integrity": "sha1-SY+kIMlkAfeHQCuiHmAN75+YH/8=", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.nlark.com/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1618846992533&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.0.4.tgz?cache=0&sync_timestamp=1604115183005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.0", + "object-keys": "^1.0.10" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/os-locale/download/os-locale-1.4.0.tgz?cache=0&sync_timestamp=1633618260196&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fos-locale%2Fdownload%2Fos-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.nlark.com/pako/download/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "parchment": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/parchment/download/parchment-1.0.8.tgz", + "integrity": "sha1-E+xr7M5sFnSB8Xcr1RpZBt51oDg=" + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/parse-asn1/download/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/path-is-inside/download/path-is-inside-1.0.2.tgz?cache=0&sync_timestamp=1622604553837&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-is-inside%2Fdownload%2Fpath-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.5.tgz?cache=0&sync_timestamp=1621947783503&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-parse%2Fdownload%2Fpath-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.9", + "resolved": "https://registry.nlark.com/pbkdf2/download/pbkdf2-3.0.9.tgz", + "integrity": "sha1-8sSyWmAAWLPDdzwIbDfbvuH/5pM=", + "requires": { + "create-hmac": "^1.1.2" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-1.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/pkg-up/download/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "requires": { + "find-up": "^1.0.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/pluralize/download/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/preserve/download/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.nlark.com/private/download/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + }, + "process": { + "version": "0.11.9", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.9.tgz", + "integrity": "sha1-e9WtIapiU+fahoImTx4R0RwDGME=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.nlark.com/prr/download/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "quill": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/quill/download/quill-1.2.3.tgz", + "integrity": "sha1-j8Yu1m2Bc+35vB2ft3fddOsGMu4=", + "requires": { + "clone": "~2.1.1", + "deep-equal": "~1.0.1", + "eventemitter3": "~2.0.2", + "extend": "~3.0.0", + "parchment": "1.0.8", + "quill-delta": "3.5.0" + } + }, + "quill-delta": { + "version": "3.5.0", + "resolved": "https://registry.nlark.com/quill-delta/download/quill-delta-3.5.0.tgz", + "integrity": "sha1-W2fmhdpgw06r7URJxBbHSquJFXs=", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.0", + "fast-diff": "1.1.1" + } + }, + "randomatic": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-1.1.6.tgz", + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.0.3.tgz", + "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/raw-loader/download/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.2.6", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.2.6.tgz", + "integrity": "sha1-i0Ou125xSDk40SqNRsbPGgCx+BY=", + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/readdirp/download/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/readline2/download/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.nlark.com/rechoir/download/rechoir-0.6.2.tgz?cache=0&sync_timestamp=1627101702123&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frechoir%2Fdownload%2Frechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.3.2.tgz?cache=0&sync_timestamp=1604218353677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" + }, + "regenerator-runtime": { + "version": "0.10.3", + "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.10.3.tgz?cache=0&sync_timestamp=1626992969133&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=" + }, + "regenerator-transform": { + "version": "0.9.8", + "resolved": "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.9.8.tgz?cache=0&sync_timestamp=1627057533376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.9.8.tgz", + "integrity": "sha1-D4i7K8A5Mt23trcxLmgHjwECbWw=", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.nlark.com/regex-cache/download/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "requires": { + "is-equal-shallow": "^0.1.3", + "is-primitive": "^2.0.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/regexpu-core/download/regexpu-core-2.0.0.tgz?cache=0&sync_timestamp=1631619113277&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpu-core%2Fdownload%2Fregexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.nlark.com/regjsparser/download/regjsparser-0.1.5.tgz?cache=0&sync_timestamp=1630946816794&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregjsparser%2Fdownload%2Fregjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.nlark.com/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/remove-trailing-separator/download/remove-trailing-separator-1.0.1.tgz", + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/repeating/download/repeating-2.0.1.tgz?cache=0&sync_timestamp=1622605325095&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frepeating%2Fdownload%2Frepeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.3.2.tgz", + "integrity": "sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU=", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/restore-cursor/download/restore-cursor-1.0.1.tgz?cache=0&sync_timestamp=1629746923086&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.nlark.com/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/ripemd160/download/ripemd160-1.0.1.tgz", + "integrity": "sha1-k6S71JQrxXS2mo+lfHHeEOzKfW4=" + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/run-async/download/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "requires": { + "once": "^1.3.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.nlark.com/rx-lite/download/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "requires": { + "inherits": "^2.0.1" + } + }, + "shelljs": { + "version": "0.7.7", + "resolved": "https://registry.nlark.com/shelljs/download/shelljs-0.7.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshelljs%2Fdownload%2Fshelljs-0.7.7.tgz", + "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + }, + "source-list-map": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/source-list-map/download/source-list-map-1.1.1.tgz", + "integrity": "sha1-GjOsIQyhRNHlYfkG68yrVmn/TLQ=" + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "source-map-support": { + "version": "0.4.14", + "resolved": "https://registry.npmmirror.com/source-map-support/download/source-map-support-0.4.14.tgz", + "integrity": "sha1-nURjdyWYuGJxtPUj9sH04Cp9au8=", + "requires": { + "source-map": "^0.5.6" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz?cache=0&sync_timestamp=1636978474315&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&sync_timestamp=1618847174560&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.7.0", + "resolved": "https://registry.nlark.com/stream-http/download/stream-http-2.7.0.tgz", + "integrity": "sha1-zsH047SUvEqBtFGAiXD4sgtO1fY=", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1618599642133&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmmirror.com/table/download/table-3.8.3.tgz?cache=0&sync_timestamp=1636037112686&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftable%2Fdownload%2Ftable-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-2.0.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "0.2.6", + "resolved": "https://registry.nlark.com/tapable/download/tapable-0.2.6.tgz", + "integrity": "sha1-IGvo4YiGC1FEJTdebxrom/sB/Y0=" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timers-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.2.tgz", + "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-1.0.2.tgz", + "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/trim-right/download/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/tryit/download/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.nlark.com/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.nlark.com/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "2.8.20", + "resolved": "https://registry.npmmirror.com/uglify-js/download/uglify-js-2.8.20.tgz", + "integrity": "sha1-vocQD7wY3jh27WBunSS0VoMRzs8=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.nlark.com/url/download/url-0.11.0.tgz?cache=0&sync_timestamp=1618847135337&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl%2Fdownload%2Furl-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/user-home/download/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.nlark.com/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1622212984161&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/v8flags/download/v8flags-2.0.12.tgz?cache=0&sync_timestamp=1636336418259&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fv8flags%2Fdownload%2Fv8flags-2.0.12.tgz", + "integrity": "sha1-cyNdn3F2+OiDP7KGeVRF95ONhOU=", + "requires": { + "user-home": "^1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.nlark.com/vm-browserify/download/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/watchpack/download/watchpack-1.3.1.tgz", + "integrity": "sha1-fYaTkHsozmAT5/NhCqKhrPB9rYc=", + "requires": { + "async": "^2.1.2", + "chokidar": "^1.4.3", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/webpack/download/webpack-2.3.3.tgz", + "integrity": "sha1-7swIPBj7e/lY6k9AtXpmQMWgzHg=", + "requires": { + "acorn": "^4.0.4", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.0.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.5", + "watchpack": "^1.3.1", + "webpack-sources": "^0.2.3", + "yargs": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "4.0.11", + "resolved": "https://registry.npmmirror.com/acorn/download/acorn-4.0.11.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-4.0.11.tgz", + "integrity": "sha1-7c2jvZN+dVZBDULtWGD2c5nHlMA=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-3.0.0.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + } + } + }, + "webpack-sources": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/download/webpack-sources-0.2.3.tgz?cache=0&sync_timestamp=1636982731420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-0.2.3.tgz", + "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", + "requires": { + "source-list-map": "^1.1.1", + "source-map": "~0.5.3" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.nlark.com/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-2.1.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.nlark.com/write/download/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-4.2.1.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-3.0.0.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/raw-body/download/raw-body-2.4.0.tgz?cache=0&sync_timestamp=1637116848060&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fraw-body%2Fdownload%2Fraw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.0.tgz?cache=0&sync_timestamp=1637015110760&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/read-package-json-fast/download/read-package-json-fast-2.0.3.tgz", + "integrity": "sha1-MjylKWMNqCyzSzbMC5lmk8mMK4M=", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-type/download/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.nlark.com/readdirp/download/readdirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/redent/download/redent-3.0.0.tgz?cache=0&sync_timestamp=1620070119923&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-3.0.0.tgz", + "integrity": "sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8=", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.13.tgz", + "integrity": "sha1-Z648pXyXKiqhZCsQ/jY/4y1J3Ag=", + "dev": true + }, + "reftools": { + "version": "1.1.9", + "resolved": "https://registry.nlark.com/reftools/download/reftools-1.1.9.tgz", + "integrity": "sha1-4W4Z9mLM1GSGBTEsBtNOXaOit34=", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218353677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz", + "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.nlark.com/regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz?cache=0&sync_timestamp=1631617161322&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerate-unicode-properties%2Fdownload%2Fregenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY=", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626992969133&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz", + "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1627057533376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz", + "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.nlark.com/regex-parser/download/regex-parser-2.2.11.tgz", + "integrity": "sha1-OzfskEnhlHmAboeMq+fByoPM/lg=", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.nlark.com/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY=", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz?cache=0&sync_timestamp=1623669331185&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpp%2Fdownload%2Fregexpp-3.2.0.tgz", + "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.nlark.com/regexpu-core/download/regexpu-core-4.8.0.tgz?cache=0&sync_timestamp=1631619113277&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.8.0.tgz", + "integrity": "sha1-5WBbo2G2excYR4UBMnUC9EeamPA=", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regextras": { + "version": "0.8.0", + "resolved": "https://registry.nlark.com/regextras/download/regextras-0.8.0.tgz?cache=0&sync_timestamp=1621860451154&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregextras%2Fdownload%2Fregextras-0.8.0.tgz", + "integrity": "sha1-7A+ZhT1JEoOTIRcvYItUSBSwIhc=", + "dev": true + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.5.2.tgz", + "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.nlark.com/regjsparser/download/regjsparser-0.7.0.tgz?cache=0&sync_timestamp=1630946816794&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregjsparser%2Fdownload%2Fregjsparser-0.7.0.tgz", + "integrity": "sha1-prZntUyIXhi1JVTLSWDvcRh+mWg=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.nlark.com/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "regression": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz", + "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=" + }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmmirror.com/remark/download/remark-13.0.0.tgz?cache=0&sync_timestamp=1637258856657&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark%2Fdownload%2Fremark-13.0.0.tgz", + "integrity": "sha1-0V2b9xpAL0Aofr42Bntm1Uho5CU=", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/remark-parse/download/remark-parse-9.0.0.tgz", + "integrity": "sha1-TSCimWZYgOT0r12Qt8e4qTWFNkA=", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/remark-stringify/download/remark-stringify-9.0.1.tgz", + "integrity": "sha1-V20G6RBUiwpxkacfJ7M/EhiGKJQ=", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.4.tgz", + "integrity": "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmmirror.com/request/download/request-2.88.2.tgz", + "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.nlark.com/qs/download/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/require-from-string/download/require-from-string-2.0.2.tgz", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/requires-port/download/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz", + "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-url-loader/download/resolve-url-loader-4.0.0.tgz", + "integrity": "sha1-1Q1N3HRrsQRoRDFnrPgA3NbDrVc=", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/restore-cursor/download/restore-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629746923086&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-3.1.0.tgz", + "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.nlark.com/retry/download/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/reusify/download/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/rfdc/download/rfdc-1.3.0.tgz", + "integrity": "sha1-0LfEQasnINBdxM8m4ByJYx2doIs=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.nlark.com/run-async/download/run-async-2.4.1.tgz", + "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/download/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmmirror.com/rxjs/download/rxjs-6.6.7.tgz?cache=0&sync_timestamp=1633554235070&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frxjs%2Fdownload%2Frxjs-6.6.7.tgz", + "integrity": "sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk=", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + } + } + }, + "rxjs-for-await": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/rxjs-for-await/download/rxjs-for-await-0.0.2.tgz", + "integrity": "sha1-JlmKHWFnFHzBkhcpcOfu1OYgOEs=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "sass": { + "version": "1.36.0", + "resolved": "https://registry.npmmirror.com/sass/download/sass-1.36.0.tgz", + "integrity": "sha1-WRLvnV0WcUFxuhHLF+2ydMS7wH4=", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmmirror.com/sass-loader/download/sass-loader-12.1.0.tgz?cache=0&sync_timestamp=1635385383233&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsass-loader%2Fdownload%2Fsass-loader-12.1.0.tgz", + "integrity": "sha1-tzMkYiIxAJ2m+6Yat2ATJWOA0gE=", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/saucelabs/download/saucelabs-1.5.0.tgz", + "integrity": "sha1-lAWnPDYNRJsjKDmRmobDltN5/Z0=", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/agent-base/download/agent-base-4.3.0.tgz", + "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.nlark.com/https-proxy-agent/download/https-proxy-agent-2.2.4.tgz", + "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-2.7.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-2.7.1.tgz", + "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + } + } + }, + "screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/screenfull/download/screenfull-5.2.0.tgz", + "integrity": "sha1-ZTPVJNMGIfwSg7lpIUbz8TqT0bo=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/selenium-webdriver/download/selenium-webdriver-3.6.0.tgz", + "integrity": "sha1-K6h6FmLAILiYjJga5iyyoBKY6vw=", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.nlark.com/selfsigned/download/selfsigned-1.10.11.tgz?cache=0&sync_timestamp=1620160245612&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.11.tgz", + "integrity": "sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k=", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/semver-compare/download/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-6.0.0.tgz?cache=0&sync_timestamp=1624284098038&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-6.0.0.tgz", + "integrity": "sha1-765diPRdeSQUHai1w6en5mP+/rg=", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1636932182141&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1631437857327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-3.0.1.tgz", + "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "should": { + "version": "13.2.3", + "resolved": "https://registry.nlark.com/should/download/should-13.2.3.tgz", + "integrity": "sha1-ltjlrPPpe0nYm1H+qlro0H71jxA=", + "dev": true, + "requires": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/should-equal/download/should-equal-2.0.0.tgz", + "integrity": "sha1-YHLPgwRzYIZ+aOmLCdcRQ9BO4MM=", + "dev": true, + "requires": { + "should-type": "^1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/should-format/download/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/should-type/download/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/should-type-adaptors/download/should-type-adaptors-1.1.0.tgz", + "integrity": "sha1-QB5/M7VTMDOUTVzYvytlAneS4no=", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "should-util": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/should-util/download/should-util-1.0.1.tgz", + "integrity": "sha1-+w1xM49TKjoUkhNjni0yy+qLyyg=", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz", + "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "simple-statistics": { + "version": "6.1.1", + "resolved": "https://registry.npm.taobao.org/simple-statistics/download/simple-statistics-6.1.1.tgz", + "integrity": "sha1-46B5n/xJkU1vQhxaSsWF9qE+K60=" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz", + "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.nlark.com/smart-buffer/download/smart-buffer-4.2.0.tgz?cache=0&sync_timestamp=1628317244992&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsmart-buffer%2Fdownload%2Fsmart-buffer-4.2.0.tgz", + "integrity": "sha1-bh1x+k8YwF99D/IW3RakgdDo2a4=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/socket.io/download/socket.io-4.4.0.tgz?cache=0&sync_timestamp=1637252559928&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsocket.io%2Fdownload%2Fsocket.io-4.4.0.tgz", + "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/socket.io-adapter/download/socket.io-adapter-2.3.3.tgz?cache=0&sync_timestamp=1637252559030&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsocket.io-adapter%2Fdownload%2Fsocket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/socket.io-parser/download/socket.io-parser-4.0.4.tgz", + "integrity": "sha1-nqIbDWFQjRgZbvBKLGuatjD0wrA=", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.nlark.com/sockjs/download/sockjs-0.3.21.tgz", + "integrity": "sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc=", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.nlark.com/sockjs-client/download/sockjs-client-1.5.2.tgz", + "integrity": "sha1-S8SMLanOR2nxnccjOWtQ9cEjMKM=", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socks": { + "version": "2.6.1", + "resolved": "https://registry.nlark.com/socks/download/socks-2.6.1.tgz", + "integrity": "sha1-mJ5lNKB88zfesbHJSqpEKWUg0w4=", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/socks-proxy-agent/download/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + }, + "source-map-explorer": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/source-map-explorer/download/source-map-explorer-2.5.2.tgz", + "integrity": "sha1-hXyrXdnR1xdenFwnOdycz7mfLcU=", + "dev": true, + "requires": { + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.3", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmmirror.com/open/download/open-7.4.2.tgz", + "integrity": "sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE=", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/source-map-js/download/source-map-js-1.0.1.tgz?cache=0&sync_timestamp=1636400772640&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map-js%2Fdownload%2Fsource-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/source-map-loader/download/source-map-loader-3.0.0.tgz", + "integrity": "sha1-8qBO4oCK0Bx3TeprfSY5g587MEk=", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.6.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.6.3.tgz", + "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/source-map-js/download/source-map-js-0.6.2.tgz?cache=0&sync_timestamp=1636400772640&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map-js%2Fdownload%2Fsource-map-js-0.6.2.tgz", + "integrity": "sha1-C7XeYxtBz72mz7qL0FqA79/SOF4=", + "dev": true + } + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.nlark.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz", + "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmmirror.com/source-map-support/download/source-map-support-0.5.19.tgz", + "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.nlark.com/source-map-url/download/source-map-url-0.4.1.tgz", + "integrity": "sha1-CvZmBadFpaL5HPG7+KevvCg97FY=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.nlark.com/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz", + "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/download/spdx-license-ids-3.0.11.tgz?cache=0&sync_timestamp=1636978474315&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.nlark.com/spdy/download/spdy-4.0.2.tgz", + "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", + "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/specificity/download/specificity-0.4.1.tgz", + "integrity": "sha1-qrXmRQEtsIuhguFRFlc40AiHsBk=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&sync_timestamp=1618847174560&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.11.2.tgz", + "integrity": "sha1-C5lpiyN1SNCI/EPN8rcMGnUSwGw=", + "requires": { + "frac": "~1.1.2" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1621364918494&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-8.0.1.tgz", + "integrity": "sha1-Y45OQ54v+9LNKJd21cpFfE9Roq8=", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz", + "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", + "dev": true + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.3.tgz", + "integrity": "sha1-4SOxaojhQxObCcaFIiG8mBWRff4=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654066899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/streamroller/download/streamroller-2.2.4.tgz", + "integrity": "sha1-wZjO1C25QIamGTYIGHzoCl8rDlM=", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/date-format/download/date-format-2.1.0.tgz", + "integrity": "sha1-MdW16iEc9f12TNOLr50DPffhJc8=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-8.1.0.tgz", + "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/jsonfile/download/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.nlark.com/universalify/download/universalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "dev": true + } + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.nlark.com/string-argv/download/string-argv-0.3.1.tgz", + "integrity": "sha1-leL77AQnrhkYSTX4FtdKqkxcGdo=", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz?cache=0&sync_timestamp=1614127461586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimend%2Fdownload%2Fstring.prototype.trimend-1.0.4.tgz", + "integrity": "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127357785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz", + "integrity": "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/stringify-entities/download/stringify-entities-1.3.2.tgz?cache=0&sync_timestamp=1636445763931&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstringify-entities%2Fdownload%2Fstringify-entities-1.3.2.tgz", + "integrity": "sha1-qYQX5Ucf0iez5F09sYYcEcr2aPc=", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.nlark.com/stringify-object/download/stringify-object-3.3.0.tgz", + "integrity": "sha1-cDBlrvyhkwDTzoivT1s5VtdVZik=", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1618599642133&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-css-comments": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/strip-css-comments/download/strip-css-comments-4.1.0.tgz", + "integrity": "sha1-ynmOPmtxkp8LNU4L1y53WbLqF+A=", + "dev": true, + "requires": { + "is-regexp": "^2.1.0" + }, + "dependencies": { + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-2.1.0.tgz", + "integrity": "sha1-zXNKVoZOI7lWv058ZsOWpMCyLC0=", + "dev": true + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-eof/download/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-3.0.0.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-3.0.0.tgz", + "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true + }, + "style-loader": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/style-loader/download/style-loader-3.2.1.tgz?cache=0&sync_timestamp=1634872439692&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstyle-loader%2Fdownload%2Fstyle-loader-3.2.1.tgz", + "integrity": "sha1-Y8uSDsFFyGaemlDpKWFFKh713N4=", + "dev": true + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/style-search/download/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/stylehacks/download/stylehacks-5.0.1.tgz?cache=0&sync_timestamp=1621449652268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstylehacks%2Fdownload%2Fstylehacks-5.0.1.tgz", + "integrity": "sha1-Mj7FVBmFIJhoBjiMf9rrw40sBvs=", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmmirror.com/stylelint/download/stylelint-13.13.1.tgz", + "integrity": "sha1-/KnJ9d55kKsmoA8We4l48IOhjzw=", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-2.0.0.tgz", + "integrity": "sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k=", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/meow/download/meow-9.0.0.tgz?cache=0&sync_timestamp=1637477569022&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-9.0.0.tgz", + "integrity": "sha1-zZUQvFysne59A8c+4fmtlZ9Oo2Q=", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-3.0.3.tgz", + "integrity": "sha1-28w+LaWVCaCYNCKITNFy7v36Ul4=", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.nlark.com/hosted-git-info/download/hosted-git-info-2.8.9.tgz", + "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.6.0.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-7.0.1.tgz", + "integrity": "sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc=", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.8.1.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.18.1.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.18.1.tgz", + "integrity": "sha1-20vBUaSiz07r+a3V23VQjbbMhB8=", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "stylelint-config-prettier": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/stylelint-config-prettier/download/stylelint-config-prettier-8.0.2.tgz", + "integrity": "sha1-2p3jPaTFaJPL5+Jt8jmnN0BF4U4=", + "dev": true + }, + "stylelint-config-rational-order": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/stylelint-config-rational-order/download/stylelint-config-rational-order-0.1.2.tgz", + "integrity": "sha1-TpjjkHg9Q38OxB+3O8QZkueNAqA=", + "dev": true, + "requires": { + "stylelint": "^9.10.1", + "stylelint-order": "^2.2.1" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz", + "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/astral-regex/download/astral-regex-1.0.0.tgz", + "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-4.1.0.tgz?cache=0&sync_timestamp=1636945205805&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-4.2.0.tgz?cache=0&sync_timestamp=1633332959770&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/clone-regexp/download/clone-regexp-1.0.1.tgz?cache=0&sync_timestamp=1617892092032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone-regexp%2Fdownload%2Fclone-regexp-1.0.1.tgz", + "integrity": "sha1-BRgFzTMXM3XYIRj8CRhgbaOf1g8=", + "dev": true, + "requires": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.nlark.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz", + "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", + "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/execall/download/execall-1.0.0.tgz?cache=0&sync_timestamp=1617892843041&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexecall%2Fdownload%2Fexecall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "requires": { + "clone-regexp": "^1.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-2.2.7.tgz?cache=0&sync_timestamp=1625773305786&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffast-glob%2Fdownload%2Ffast-glob-2.2.7.tgz", + "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "file-entry-cache": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-4.0.0.tgz?cache=0&sync_timestamp=1613794272556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-4.0.0.tgz", + "integrity": "sha1-YzVn0VNkrv4LKZ4eIXc16POp9ug=", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", + "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/flatted/download/flatted-2.0.2.tgz?cache=0&sync_timestamp=1636473847692&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-2.0.2.tgz", + "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.nlark.com/get-stdin/download/get-stdin-6.0.0.tgz", + "integrity": "sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs=", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.nlark.com/globby/download/globby-9.2.0.tgz", + "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1608469532269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/import-lazy/download/import-lazy-3.1.0.tgz", + "integrity": "sha1-iRJ5ICyKIoD9vWZ029jaGh38Z8w=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/indent-string/download/indent-string-3.2.0.tgz?cache=0&sync_timestamp=1622604582006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Findent-string%2Fdownload%2Findent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "known-css-properties": { + "version": "0.11.0", + "resolved": "https://registry.nlark.com/known-css-properties/download/known-css-properties-0.11.0.tgz", + "integrity": "sha1-DaeE8RXqd8drgVNtcFLpDubIaoo=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/map-obj/download/map-obj-2.0.0.tgz?cache=0&sync_timestamp=1634552719803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmap-obj%2Fdownload%2Fmap-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/meow/download/meow-5.0.0.tgz?cache=0&sync_timestamp=1637477569022&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-5.0.0.tgz", + "integrity": "sha1-38c9Y6mvxxSl43F2DrXIi5EHiqQ=", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.nlark.com/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/minimist-options/download/minimist-options-3.0.2.tgz", + "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/download/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-type/download/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-sass": { + "version": "0.3.5", + "resolved": "https://registry.nlark.com/postcss-sass/download/postcss-sass-0.3.5.tgz", + "integrity": "sha1-bT458QGlPS76CR+VNJMRbTK+tow=", + "dev": true, + "requires": { + "gonzales-pe": "^4.2.3", + "postcss": "^7.0.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", + "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/quick-lru/download/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/redent/download/redent-2.0.0.tgz?cache=0&sync_timestamp=1620070119923&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", + "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-2.1.0.tgz", + "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-2.0.0.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "stylelint": { + "version": "9.10.1", + "resolved": "https://registry.npmmirror.com/stylelint/download/stylelint-9.10.1.tgz", + "integrity": "sha1-Xw7jcBRh3/HWgoThOG7+jwZ3p10=", + "dev": true, + "requires": { + "autoprefixer": "^9.0.0", + "balanced-match": "^1.0.0", + "chalk": "^2.4.1", + "cosmiconfig": "^5.0.0", + "debug": "^4.0.0", + "execall": "^1.0.0", + "file-entry-cache": "^4.0.0", + "get-stdin": "^6.0.0", + "global-modules": "^2.0.0", + "globby": "^9.0.0", + "globjoin": "^0.1.4", + "html-tags": "^2.0.0", + "ignore": "^5.0.4", + "import-lazy": "^3.1.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.11.0", + "leven": "^2.1.0", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "mathml-tag-names": "^2.0.1", + "meow": "^5.0.0", + "micromatch": "^3.1.10", + "normalize-selector": "^0.2.0", + "pify": "^4.0.0", + "postcss": "^7.0.13", + "postcss-html": "^0.36.0", + "postcss-jsx": "^0.36.0", + "postcss-less": "^3.1.0", + "postcss-markdown": "^0.36.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-reporter": "^6.0.0", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.0", + "postcss-sass": "^0.3.5", + "postcss-scss": "^2.0.0", + "postcss-selector-parser": "^3.1.0", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^3.3.0", + "resolve-from": "^4.0.0", + "signal-exit": "^3.0.2", + "slash": "^2.0.0", + "specificity": "^0.4.1", + "string-width": "^3.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^5.0.0" + } + }, + "stylelint-order": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/stylelint-order/download/stylelint-order-2.2.1.tgz", + "integrity": "sha1-zS1KDYHZHHBfHSdaWEh+WtWqWCg=", + "dev": true, + "requires": { + "lodash": "^4.17.10", + "postcss": "^7.0.2", + "postcss-sorting": "^4.1.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmmirror.com/table/download/table-5.4.6.tgz?cache=0&sync_timestamp=1636037112686&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftable%2Fdownload%2Ftable-5.4.6.tgz", + "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-2.0.0.tgz?cache=0&sync_timestamp=1623341510447&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-10.1.0.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-10.1.0.tgz", + "integrity": "sha1-cgImW4n36eny5XZeD+c1qQXtuqg=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/stylelint-config-recommended/download/stylelint-config-recommended-5.0.0.tgz", + "integrity": "sha1-+1ZT9JWmC0k48q0+d3EtnhA5rng=", + "dev": true + }, + "stylelint-config-standard": { + "version": "22.0.0", + "resolved": "https://registry.npmmirror.com/stylelint-config-standard/download/stylelint-config-standard-22.0.0.tgz", + "integrity": "sha1-yGC+mhPrvBsIRFb6EFJ78TpErd8=", + "dev": true, + "requires": { + "stylelint-config-recommended": "^5.0.0" + } + }, + "stylelint-declaration-block-no-ignored-properties": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/stylelint-declaration-block-no-ignored-properties/download/stylelint-declaration-block-no-ignored-properties-2.5.0.tgz?cache=0&sync_timestamp=1636703410304&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstylelint-declaration-block-no-ignored-properties%2Fdownload%2Fstylelint-declaration-block-no-ignored-properties-2.5.0.tgz", + "integrity": "sha512-UNz5nUC5GMgMb6GPc/pHUTC0+ydxTdj2mUn7XcKRdwQoiUzzUmWWdSf1aFv2UzrW4x8JYNReE1u5JOj7g0ThJw==", + "dev": true + }, + "stylelint-order": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/stylelint-order/download/stylelint-order-4.1.0.tgz", + "integrity": "sha1-aS0Ft9DCNaxm/PXqHZ5fCKdnR/Y=", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "postcss": "^7.0.31", + "postcss-sorting": "^5.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-sorting": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/postcss-sorting/download/postcss-sorting-5.0.1.tgz", + "integrity": "sha1-ENXQBZ7qgzTazIIMASGGQDW8PxE=", + "dev": true, + "requires": { + "lodash": "^4.17.14", + "postcss": "^7.0.17" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.nlark.com/stylus/download/stylus-0.54.8.tgz", + "integrity": "sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc=", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "stylus-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/stylus-loader/download/stylus-loader-6.1.0.tgz?cache=0&sync_timestamp=1634037061456&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstylus-loader%2Fdownload%2Fstylus-loader-6.1.0.tgz", + "integrity": "sha1-ejpxmifLK5YXiW1too/alMPtl2I=", + "dev": true, + "requires": { + "fast-glob": "^3.2.5", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/sugarss/download/sugarss-2.0.0.tgz", + "integrity": "sha1-3dduASSyl9QL88yjHIsi7LQ7xh0=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", + "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz", + "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/download/svgo-2.8.0.tgz", + "integrity": "sha1-T/gMzmcQ3CeV8MfHQQHmdkz8zSQ=", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/download/commander-7.2.0.tgz", + "integrity": "sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=", + "dev": true + } + } + }, + "swagger-schema-official": { + "version": "2.0.0-bab6bed", + "resolved": "https://registry.npm.taobao.org/swagger-schema-official/download/swagger-schema-official-2.0.0-bab6bed.tgz", + "integrity": "sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0=", + "dev": true + }, + "swagger-typescript-api": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/swagger-typescript-api/download/swagger-typescript-api-9.3.1.tgz", + "integrity": "sha1-B986qOg6OJc1am6CDoi4NIgwqms=", + "dev": true, + "requires": { + "@types/swagger-schema-official": "2.0.21", + "axios": "^0.21.4", + "commander": "^6.2.1", + "cosmiconfig": "^7.0.0", + "eta": "^1.12.1", + "js-yaml": "^4.0.0", + "lodash": "^4.17.21", + "make-dir": "^3.1.0", + "nanoid": "^3.1.22", + "node-emoji": "^1.10.0", + "prettier": "^2.2.1", + "swagger-schema-official": "2.0.0-bab6bed", + "swagger2openapi": "^7.0.5", + "typescript": "^4.2.4" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/argparse/download/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/commander/download/commander-6.2.1.tgz", + "integrity": "sha1-B5LraC37wyWZm7K4T93duhEKxzw=", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-4.1.0.tgz?cache=0&sync_timestamp=1618435004368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-4.1.0.tgz", + "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.nlark.com/swagger2openapi/download/swagger2openapi-7.0.8.tgz", + "integrity": "sha1-EsiNXed2yxy7p1iZSTD0CtCvrFk=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-17.2.1.tgz", + "integrity": "sha1-4slbl5ag4ffzv0QnhjtC4EGBkeo=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-4.0.0.tgz?cache=0&sync_timestamp=1618451954701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsymbol-observable%2Fdownload%2Fsymbol-observable-4.0.0.tgz", + "integrity": "sha1-W0JfGSJ56H8vm5N6yFQNGYSzkgU=", + "dev": true + }, + "table": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/table/download/table-6.7.3.tgz?cache=0&sync_timestamp=1636037112686&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftable%2Fdownload%2Ftable-6.7.3.tgz", + "integrity": "sha1-JVOIQ5cVpzg5G9LuTLyomk0Fqbc=", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/tapable/download/tapable-2.2.1.tgz", + "integrity": "sha1-GWenPvQGCoLxKrlq+G1S/bdu7KA=", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.nlark.com/tar/download/tar-6.1.11.tgz", + "integrity": "sha1-Z2CjjwA6+hsv/Q/+npq70Oqz1iE=", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "temp": { + "version": "0.9.4", + "resolved": "https://registry.npm.taobao.org/temp/download/temp-0.9.4.tgz", + "integrity": "sha1-zSCoWAy2NjXQ5OnUvZidRChudiA=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "terser": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/terser/download/terser-5.7.1.tgz?cache=0&sync_timestamp=1636988182324&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fterser%2Fdownload%2Fterser-5.7.1.tgz", + "integrity": "sha1-LcemEAm2a7Y4MFyyqCR2OxFr94Q=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + } + }, + "terser-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/download/terser-webpack-plugin-5.1.4.tgz?cache=0&sync_timestamp=1636385901001&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-5.1.4.tgz", + "integrity": "sha1-w2nPikeqmSK9DYqU/j09oRp2eKE=", + "dev": true, + "requires": { + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/p-limit/download/p-limit-3.1.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "requires": { + "utrie": "^1.0.2" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/thunky/download/thunky-1.1.0.tgz", + "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", + "dev": true + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/timsort/download/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.nlark.com/tmp/download/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/toidentifier/download/toidentifier-1.0.0.tgz?cache=0&sync_timestamp=1636938489272&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftoidentifier%2Fdownload%2Ftoidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "dev": true + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/topojson-client/download/topojson-client-3.1.0.tgz", + "integrity": "sha1-Iuix7QiiuSL+60r29Ttu8JpGe5k=", + "requires": { + "commander": "2" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz", + "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/download/tr46-0.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftr46%2Fdownload%2Ftr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.nlark.com/tree-kill/download/tree-kill-1.2.2.tgz", + "integrity": "sha1-TKCakJLIi3OnzcXooBtQeweQoMw=", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/trim/download/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-3.0.1.tgz?cache=0&sync_timestamp=1623341510447&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-3.0.1.tgz", + "integrity": "sha1-Jgpdli2LdSQlsy86fbDcrNF2wUQ=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/trim-trailing-lines/download/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha1-vUq77HzIgEYvELLItc4djR7HwsA=", + "dev": true + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/trough/download/trough-1.0.5.tgz?cache=0&sync_timestamp=1625401006146&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrough%2Fdownload%2Ftrough-1.0.5.tgz", + "integrity": "sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY=", + "dev": true + }, + "ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/ts-node/download/ts-node-8.3.0.tgz", + "integrity": "sha1-5AWWGEETcZJKH7XzsSWRXzJO+1c=", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmmirror.com/tsconfig-paths/download/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.1.tgz", + "integrity": "sha1-6KM1rdXOrlGqJh0ypJAVjvBC7wE=" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138426726&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz", + "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz", + "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.21.3.tgz?cache=0&sync_timestamp=1637149878210&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.21.3.tgz", + "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.nlark.com/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmmirror.com/typescript/download/typescript-4.3.5.tgz", + "integrity": "sha1-TRw3zBbok5c8RaBohrcRMjTxGfQ=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmmirror.com/ua-parser-js/download/ua-parser-js-0.7.31.tgz", + "integrity": "sha1-ZJplaxkd/6tPIdXgU+J8oXy/9cY=", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz", + "integrity": "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/unherit/download/unherit-1.1.3.tgz?cache=0&sync_timestamp=1626423513229&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funherit%2Fdownload%2Funherit-1.1.3.tgz", + "integrity": "sha1-bJtQPytBsmIzDIDpHIYUq9qmnCI=", + "dev": true, + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw=", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618696521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-ecmascript%2Fdownload%2Funicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631609457921&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-property-aliases-ecmascript%2Fdownload%2Funicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g=", + "dev": true + }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/unified/download/unified-9.2.2.tgz", + "integrity": "sha1-Z2SaGr/Dq4XSlpUCkCd16wMUaXU=", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/is-buffer/download/is-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-2.1.0.tgz?cache=0&sync_timestamp=1618601044820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/union-value/download/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/uniq/download/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.nlark.com/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/unist-util-find-all-after/download/unist-util-find-all-after-3.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-find-all-after%2Fdownload%2Funist-util-find-all-after-3.0.2.tgz", + "integrity": "sha1-/f7NFMW3rqXp7zjV4NX3dO61YfY=", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/unist-util-is/download/unist-util-is-4.1.0.tgz?cache=0&sync_timestamp=1626874922677&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-is%2Fdownload%2Funist-util-is-4.1.0.tgz", + "integrity": "sha1-l25fRip6Xec9lLcGusG5BnG1d5c=", + "dev": true + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.nlark.com/unist-util-remove-position/download/unist-util-remove-position-1.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-remove-position%2Fdownload%2Funist-util-remove-position-1.1.4.tgz", + "integrity": "sha1-7ANzSLYQLIl3A+7m0ClMpHVaICA=", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/unist-util-stringify-position/download/unist-util-stringify-position-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-stringify-position%2Fdownload%2Funist-util-stringify-position-2.0.3.tgz", + "integrity": "sha1-zOO/oc34W6c3XR1bF73Eytqb2do=", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/unist-util-visit/download/unist-util-visit-1.4.1.tgz?cache=0&sync_timestamp=1632405298952&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Funist-util-visit%2Fdownload%2Funist-util-visit-1.4.1.tgz", + "integrity": "sha1-RySqqEhububibX/zyGhZYNVgseM=", + "dev": true, + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/unist-util-visit-parents/download/unist-util-visit-parents-2.1.2.tgz?cache=0&sync_timestamp=1632208991791&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-visit-parents%2Fdownload%2Funist-util-visit-parents-2.1.2.tgz", + "integrity": "sha1-JeQ+VTEhZvM0jK5nQ1iHgdESwek=", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/unist-util-is/download/unist-util-is-3.0.0.tgz?cache=0&sync_timestamp=1626874922677&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-is%2Fdownload%2Funist-util-is-3.0.0.tgz", + "integrity": "sha1-2ehDgcJGjoJinkpb6dfQWi3TJM0=", + "dev": true + } + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/universalify/download/universalify-2.0.0.tgz", + "integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.nlark.com/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.nlark.com/upath/download/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.nlark.com/url/download/url-0.11.0.tgz?cache=0&sync_timestamp=1618847135337&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl%2Fdownload%2Furl-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.nlark.com/url-parse/download/url-parse-1.5.3.tgz", + "integrity": "sha1-ccEwPTj7Zjmt4YPCmSyMwGht+GI=", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "requires": { + "base64-arraybuffer": "^1.0.2" + }, + "dependencies": { + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + } + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz?cache=0&sync_timestamp=1614993639567&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.3.0.tgz", + "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.nlark.com/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/validate-npm-package-name/download/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/verror/download/verror-1.10.0.tgz?cache=0&sync_timestamp=1635885078723&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fverror%2Fdownload%2Fverror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/vfile/download/vfile-4.2.1.tgz", + "integrity": "sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/is-buffer/download/is-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=", + "dev": true + } + } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.nlark.com/vfile-location/download/vfile-location-2.0.6.tgz", + "integrity": "sha1-iidPOUEbhxnqVyiALhDZ4N/xUZ4=", + "dev": true + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.nlark.com/vfile-message/download/vfile-message-2.0.4.tgz?cache=0&sync_timestamp=1628780833868&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvfile-message%2Fdownload%2Fvfile-message-2.0.4.tgz", + "integrity": "sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/void-elements/download/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/watchpack/download/watchpack-2.3.0.tgz", + "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/wcwidth/download/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/webdriver-js-extender/download/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha1-V9epPADbTMjVVuTT20tdsKgMO7c=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/webidl-conversions/download/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "webpack": { + "version": "5.50.0", + "resolved": "https://registry.npmmirror.com/webpack/download/webpack-5.50.0.tgz", + "integrity": "sha1-VWLXWQKnSetNdRMfVifqw6MZJSc=", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/webpack-sources/download/webpack-sources-3.2.2.tgz?cache=0&sync_timestamp=1636982731420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-5.0.0.tgz?cache=0&sync_timestamp=1637165508298&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-5.0.0.tgz", + "integrity": "sha1-Cr6CUnVyDgozmXiupfCwOxQMFYQ=", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz", + "integrity": "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmmirror.com/webpack-dev-server/download/webpack-dev-server-3.11.2.tgz", + "integrity": "sha1-aV687Xakkp8NXef9c/r+GF/jNwg=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1637522259668&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.nlark.com/binary-extensions/download/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/chokidar/download/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/fsevents/download/fsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.nlark.com/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/download/mime-2.6.0.tgz", + "integrity": "sha1-oqaCqVzU0MsdYlfij4PafjWAA2c=", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/readdirp/download/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1637075888461&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz?cache=0&sync_timestamp=1637165508298&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-3.7.3.tgz", + "integrity": "sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU=", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz?cache=0&sync_timestamp=1615477439589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-log%2Fdownload%2Fwebpack-log-2.0.0.tgz", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.nlark.com/webpack-merge/download/webpack-merge-5.8.0.tgz", + "integrity": "sha1-Kznb8ir4d3atdEw5AiNzHTCmj2E=", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/download/webpack-sources-1.4.3.tgz?cache=0&sync_timestamp=1636982731420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/webpack-subresource-integrity/download/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha1-5AtleNMHLi0kEEl1JJxSxm6adD4=", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.4.tgz", + "integrity": "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A=", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz", + "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-5.0.0.tgz?cache=0&sync_timestamp=1634673646149&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwhatwg-url%2Fdownload%2Fwhatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/wide-align/download/wide-align-1.1.5.tgz", + "integrity": "sha1-3x1MIGhUNp7PPJpImPGyP72dFdM=", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/wildcard/download/wildcard-2.0.0.tgz", + "integrity": "sha1-p30g5SAMb6qsl55LOq3Hs91/j+w=", + "dev": true + }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/wmf/download/wmf-1.0.2.tgz", + "integrity": "sha1-fRnWIQcaCMK9xrfmiKnENSmMwto=" + }, + "wolfy87-eventemitter": { + "version": "5.2.9", + "resolved": "https://registry.nlark.com/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.9.tgz", + "integrity": "sha1-6Hn3cLMPu2USqK+7Mww4hZEJnCo=" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/word/download/word-0.3.0.tgz", + "integrity": "sha1-hUIVfk+OhJ9KNjooiZLUdhLbmWE=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-5.1.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-5.1.0.tgz", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/write/download/write-1.0.3.tgz", + "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/write-file-atomic/download/write-file-atomic-3.0.3.tgz?cache=0&sync_timestamp=1618847057132&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrite-file-atomic%2Fdownload%2Fwrite-file-atomic-3.0.3.tgz", + "integrity": "sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ws/download/ws-6.2.2.tgz", + "integrity": "sha1-3Vzb1XqZeZFgl2UtePHMX66gwy4=", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, + "xlsx": { + "version": "0.17.4", + "resolved": "https://registry.npmmirror.com/xlsx/download/xlsx-0.17.4.tgz", + "integrity": "sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg==", + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.15.0", + "crc-32": "~1.2.0", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npm.taobao.org/xml2js/download/xml2js-0.4.23.tgz", + "integrity": "sha1-oMaVFnUkIesqx1juTUzPWIQ+rGY=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.nlark.com/xmlbuilder/download/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.3.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-4.0.3.tgz", + "integrity": "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/download/yaml-1.10.2.tgz?cache=0&sync_timestamp=1636797216143&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyaml%2Fdownload%2Fyaml-1.10.2.tgz", + "integrity": "sha1-IwHF/78StGfejaIzOkWeKeeSDks=", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-13.3.2.tgz", + "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1637031053426&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz", + "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/yn/download/yn-3.1.1.tgz", + "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.nlark.com/yocto-queue/download/yocto-queue-0.1.0.tgz", + "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=", + "dev": true + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/zone.js/download/zone.js-0.11.4.tgz", + "integrity": "sha1-D3Dc9quoD2mK9XNcuyV5aTlugCU=", + "requires": { + "tslib": "^2.0.0" + } + }, + "zrender": { + "version": "5.2.1", + "resolved": "https://registry.nlark.com/zrender/download/zrender-5.2.1.tgz", + "integrity": "sha1-X0u9qRW6bUErCxncJDG+qtBUF7s=", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=" + } + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/zwitch/download/zwitch-1.0.5.tgz?cache=0&sync_timestamp=1617357623494&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fzwitch%2Fdownload%2Fzwitch-1.0.5.tgz", + "integrity": "sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..bc21e82a --- /dev/null +++ b/package.json @@ -0,0 +1,142 @@ +{ + "name": "tms-obc-web", + "version": "1.0.0", + "description": "运营后台-WEB", + "author": "cipchk ", + "repository": { + "type": "git", + "url": "git+https://github.com/ng-alain/ng-alain.git" + }, + "homepage": "https://e.ng-alain.com/theme/pro", + "scripts": { + "ng-high-memory": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng", + "ng": "ng", + "start": "ng s -o --port 4202 --host 0.0.0.0", + "startIp": "ng serve -o --port 4202 --host 172.29.9.71 --open", + "hmr": "ng s -o --hmr", + "build": "npm run ng-high-memory build --", + "build:dev": "npm run build -- -c dev", + "build:test": "npm run build -- -c test", + "analyze": "npm run ng-high-memory build -- --source-map", + "analyze:view": "source-map-explorer dist/**/*.js", + "lint": "npm run lint:ts && npm run lint:style", + "lint:ts": "ng lint --fix", + "lint:style": "stylelint \"src/**/*.less\" --syntax less --fix", + "e2e": "ng e2e", + "test": "ng test --watch", + "test-coverage": "ng test --code-coverage --watch=false", + "color-less": "ng-alain-plugin-theme -t=colorLess", + "theme": "ng-alain-plugin-theme -t=themeCss", + "icon": "ng g ng-alain:plugin icon", + "prepare": "husky install" + }, + "dependencies": { + "@agm/core": "^1.1.0", + "@amap/amap-jsapi-loader": "^1.0.1", + "@angular/animations": "~12.2.0", + "@angular/common": "~12.2.0", + "@angular/compiler": "~12.2.0", + "@angular/core": "~12.2.0", + "@angular/forms": "~12.2.0", + "@angular/platform-browser": "~12.2.0", + "@angular/platform-browser-dynamic": "~12.2.0", + "@angular/router": "~12.2.0", + "@delon/abc": "^12.3.0", + "@delon/acl": "^12.3.0", + "@delon/auth": "^12.3.0", + "@delon/cache": "^12.3.0", + "@delon/chart": "^12.3.0", + "@delon/form": "^12.3.0", + "@delon/mock": "^12.3.0", + "@delon/theme": "^12.3.0", + "@delon/util": "^12.3.0", + "@fullcalendar/core": "^5.9.0", + "@fullcalendar/daygrid": "^5.9.0", + "@fullcalendar/interaction": "^5.9.0", + "@fullcalendar/list": "^5.9.0", + "@fullcalendar/timegrid": "^5.9.0", + "@swimlane/ngx-charts": "^18.0.1", + "ajv": "^8.6.2", + "file-saver": "^2.0.5", + "html2canvas": "^1.4.1", + "js-base64": "^3.6.1", + "masonry-layout": "^4.2.2", + "ng-gallery": "^5.0.0", + "ng-zorro-antd": "^12.0.1", + "ngx-tinymce": "^12.0.0", + "ngx-trend": "^7.0.0", + "perfect-scrollbar": "^1.5.2", + "qrious": "^4.0.2", + "quill": "^1.3.7", + "quill-image-resize-module": "^3.0.0", + "rxjs": "~6.6.0", + "screenfull": "^5.1.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~12.2.0", + "@angular-eslint/builder": "~12.3.1", + "@angular-eslint/eslint-plugin": "~12.3.1", + "@angular-eslint/eslint-plugin-template": "~12.3.1", + "@angular-eslint/schematics": "~12.3.1", + "@angular-eslint/template-parser": "~12.3.1", + "@angular/cli": "~12.2.0", + "@angular/compiler-cli": "~12.2.0", + "@angular/language-service": "~12.2.0", + "@delon/testing": "^12.3.0", + "@types/d3-geo": "^3.0.2", + "@types/d3-sankey": "^0.11.2", + "@types/file-saver": "^2.0.3", + "@types/jasmine": "~3.8.0", + "@types/jasminewd2": "~2.0.3", + "@types/js-base64": "^3.0.0", + "@types/node": "^12.11.1", + "@typescript-eslint/eslint-plugin": "~4.29.2", + "@typescript-eslint/parser": "~4.29.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "~8.3.0", + "eslint-plugin-import": "~2.24.1", + "eslint-plugin-jsdoc": "~36.0.7", + "eslint-plugin-prefer-arrow": "~1.2.3", + "eslint-plugin-prettier": "~3.4.1", + "husky": "^6.0.0", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.0.3", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "lint-staged": "^11.1.2", + "ng-alain": "^12.3.0", + "ng-alain-plugin-theme": "^12.0.0", + "ng-alain-sts": "^0.0.1", + "node-fetch": "^2.6.1", + "prettier": "^2.2.1", + "protractor": "~7.0.0", + "source-map-explorer": "^2.5.2", + "stylelint": "^13.13.1", + "stylelint-config-prettier": "^8.0.2", + "stylelint-config-rational-order": "^0.1.2", + "stylelint-config-standard": "^22.0.0", + "stylelint-declaration-block-no-ignored-properties": "^2.4.0", + "stylelint-order": "^4.1.0", + "ts-node": "~8.3.0", + "typescript": "~4.3.5" + }, + "lint-staged": { + "(src)/**/*.{html,ts}": [ + "eslint --fix" + ], + "(src)/**/*.less": [ + "stylelint --syntax less --fix" + ] + }, + "private": true, + "theme": { + "name": "pro", + "version": "12.0.0" + } +} diff --git a/proxy.conf.js b/proxy.conf.js new file mode 100644 index 00000000..3639702c --- /dev/null +++ b/proxy.conf.js @@ -0,0 +1,41 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-18 09:51:21 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-19 14:20:28 + * @FilePath : \\tms-obc-web\\proxy.conf.js + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +module.exports = { + /** + * The following means that all requests are directed to the backend `https://localhost:9000/` + */ + // '/': { + // target: 'https://localhost:9000/', + // secure: false, // Ignore invalid SSL certificates + // changeOrigin: true + // } + // '//api': { + // target: { + // host: 'tms-api.yunduoxing.com', + // protocol: 'https:', + // port: 443 + // }, + // secure: false, + // changeOrigin: true, + // logLevel: 'debug' + // }, + '//api': { + target: { + host: 'tms-api-test.eascs.com', + protocol: 'https:', + port: 443 + }, + secure: false, + changeOrigin: true, + logLevel: 'debug' + }, +}; diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 00000000..69b42ef3 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,63 @@ +import { Component, ElementRef, OnInit, Renderer2 } from '@angular/core'; +import { NavigationEnd, NavigationError, RouteConfigLoadStart, Router } from '@angular/router'; +import { TitleService, VERSION as VERSION_ALAIN } from '@delon/theme'; +import { environment } from '@env/environment'; +import { NzIconService } from 'ng-zorro-antd/icon'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { VERSION as VERSION_ZORRO } from 'ng-zorro-antd/version'; +import { ThemeService } from './theme.service'; + +@Component({ + selector: 'app-root', + template: ` ` +}) +export class AppComponent implements OnInit { + constructor( + el: ElementRef, + renderer: Renderer2, + private router: Router, + private titleSrv: TitleService, + private modalSrv: NzModalService, + private iconService: NzIconService, + private themeService: ThemeService + ) { + renderer.setAttribute(el.nativeElement, 'ng-alain-version', VERSION_ALAIN.full); + renderer.setAttribute(el.nativeElement, 'ng-zorro-version', VERSION_ZORRO.full); + this.iconService.fetchFromIconfont({ + scriptUrl: 'https://at.alicdn.com/t/font_3153207_udngwyp35db.js' + }); + } + + ngOnInit(): void { + let configLoad = false; + this.router.events.subscribe(ev => { + if (ev instanceof RouteConfigLoadStart) { + configLoad = true; + } + if (configLoad && ev instanceof NavigationError) { + this.modalSrv.confirm({ + nzTitle: `提醒`, + nzContent: environment.production ? `应用可能已发布新版本,请点击刷新才能生效。` : `无法加载路由:${ev.url}`, + nzCancelDisabled: false, + nzOkText: '刷新', + nzCancelText: '忽略', + nzOnOk: () => location.reload() + }); + } + if (ev instanceof NavigationEnd) { + this.titleSrv.setTitle(); + this.modalSrv.closeAll(); + } + }); + // 适配放大150%的屏幕 + const screen: any = window.screen + var zoom = window.devicePixelRatio || screen.deviceXDPI / screen?.logicalXDPI; + // console.log(zoom) + if (document.body.clientWidth >= 1280) { + if (zoom != 1 && zoom != 2 && zoom != 3) { + this.themeService.toggleTheme().then(); + } + } + + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 00000000..32f1b6a4 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,77 @@ +/* eslint-disable import/order */ +/* eslint-disable import/no-duplicates */ +import { HttpClientModule } from '@angular/common/http'; +import { default as ngLang } from '@angular/common/locales/zh'; +import { APP_INITIALIZER, DEFAULT_CURRENCY_CODE, LOCALE_ID, NgModule, Type } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { SimpleInterceptor } from '@delon/auth'; +import { NzNotificationModule } from 'ng-zorro-antd/notification'; +import zh from '@angular/common/locales/zh'; +registerLocaleData(zh); +// #region global third module + +import { BidiModule } from '@angular/cdk/bidi'; +const GLOBAL_THIRD_MODULES: Array> = [BidiModule]; + +// #endregion + +// #region Http Interceptors +import { HTTP_INTERCEPTORS } from '@angular/common/http'; + +import { BusinessInterceptor, DefaultInterceptor } from '@core'; + +const INTERCEPTOR_PROVIDES = [ + { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: BusinessInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true } +]; +// #endregion + +// #region Startup Service +import { StartupService } from '@core'; +export function StartupServiceFactory(startupService: StartupService): () => Promise { + return () => startupService.load(); +} +const APPINIT_PROVIDES = [ + StartupService, + { + provide: APP_INITIALIZER, + useFactory: StartupServiceFactory, + deps: [StartupService], + multi: true + }, + { provide: DEFAULT_CURRENCY_CODE, useValue: '¥' }, + AuthGuard +]; +// #endregion + +import { AppComponent } from './app.component'; +import { CoreModule } from './core/core.module'; +import { GlobalConfigModule } from './global-config.module'; +import { LayoutModule } from './layout/layout.module'; +import { RoutesModule } from './routes/routes.module'; +import { SharedModule } from './shared/shared.module'; +import { STWidgetModule } from './shared/widget/st-widget.module'; +import { registerLocaleData } from '@angular/common'; +import { AuthGuard } from './core/guards/auth.guard'; + +@NgModule({ + declarations: [AppComponent], + imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, + GlobalConfigModule.forRoot(), + CoreModule, + SharedModule, + LayoutModule, + RoutesModule, + STWidgetModule, + NzNotificationModule, + ...GLOBAL_THIRD_MODULES + ], + providers: [...INTERCEPTOR_PROVIDES, ...APPINIT_PROVIDES], + bootstrap: [AppComponent] +}) +export class AppModule {} diff --git a/src/app/core/README.md b/src/app/core/README.md new file mode 100644 index 00000000..2d98e129 --- /dev/null +++ b/src/app/core/README.md @@ -0,0 +1,5 @@ +### CoreModule + +**应** 仅只留 `providers` 属性。 + +**作用:** 一些通用服务,例如:用户消息、HTTP数据访问。 diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts new file mode 100644 index 00000000..777d8016 --- /dev/null +++ b/src/app/core/core.module.ts @@ -0,0 +1,13 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { EATokenGuard } from './guards/token.guard'; + +import { throwIfAlreadyLoaded } from './module-import-guard'; + +@NgModule({ + providers: [EATokenGuard] +}) +export class CoreModule { + constructor(@Optional() @SkipSelf() parentModule: CoreModule) { + throwIfAlreadyLoaded(parentModule, 'CoreModule'); + } +} diff --git a/src/app/core/core.service.ts b/src/app/core/core.service.ts new file mode 100644 index 00000000..53cd814a --- /dev/null +++ b/src/app/core/core.service.ts @@ -0,0 +1,92 @@ +/* + * @Author: Maple + * @Date: 2021-03-22 11:42:26 + * @LastEditors: Do not edit + * @LastEditTime: 2021-05-27 14:06:18 + * @Description: 全局核心服务 + */ +import { Injectable, Injector } from '@angular/core'; +import { Router } from '@angular/router'; +import { ReuseTabService } from '@delon/abc/reuse-tab'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; +import { CacheService } from '@delon/cache'; +import { SettingsService } from '@delon/theme'; +import { EnvironmentService } from '@env/environment.service'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Injectable({ + providedIn: 'root' +}) +export class CoreService { + // 获取当前登录用户信息 + public $api_get_current_user_info = `/scm/cuc/cuc/user/getUserDetail`; + + // 获取当前用户所拥有的菜单 + public $api_get_current_user_menus = `/api/mdc/cuc/functionInfo/getUserHaveFunctionsList`; + + position = { lat: '', lng: '' }; + + constructor(private injector: Injector) {} + // 注入路由 + public get router(): Router { + return this.injector.get(Router); + } + + // 注入全局设置服务 + public get settingSrv(): SettingsService { + return this.injector.get(SettingsService); + } + + // 注入缓存服务 + public get cacheSrv(): CacheService { + return this.injector.get(CacheService); + } + + // 注入令牌服务 + public get tokenSrv(): ITokenService { + return this.injector.get(DA_SERVICE_TOKEN); + } + + // 注入消息服务 + public get msgSrv(): NzMessageService { + return this.injector.get(NzMessageService); + } + + // 注入环境服务 + public get envSrv(): EnvironmentService { + return this.injector.get(EnvironmentService); + } + + // 注入路由复用服务 + private get reuseTabService(): ReuseTabService { + return this.injector.get(ReuseTabService); + } + + // 登录状态 + public get loginStatus(): boolean { + try { + return !!this.tokenSrv.get()?.token; + } catch (error) { + return false; + } + } + + // 权限认证凭据(TOKEN) + public get token(): string { + return this.tokenSrv.get()?.token || ''; + } + + /** + * 登出系统 + * @param showMsg 是否显示登录过期弹窗 + */ + logout(showMsg: boolean = false): void { + if (showMsg) { + this.msgSrv.warning('未登录或登录信息已过期,请重新登录!'); + } + this.settingSrv.setUser({}); + this.tokenSrv.clear(); + this.cacheSrv.clear(); + this.router.navigate([this.tokenSrv.login_url]); + } +} diff --git a/src/app/core/guards/auth.guard.ts b/src/app/core/guards/auth.guard.ts new file mode 100644 index 00000000..b5a30a58 --- /dev/null +++ b/src/app/core/guards/auth.guard.ts @@ -0,0 +1,89 @@ +import { Injectable, Injector } from '@angular/core'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { ACLGuard, ACLService } from '@delon/acl'; +import { MenuService, SettingsService } from '@delon/theme'; +import { EAUserService } from '@shared'; +import { Observable, of } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; + +@Injectable() +export class AuthGuard extends ACLGuard { + constructor( + srv: ACLService, + public srv1: ACLService, + private menuService: MenuService, + private settings: SettingsService, + private userService: EAUserService, + router: Router, + private inject: Injector + ) { + super(srv, router, inject); + } + + canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): Observable { + // if (Object.keys(route.params)?.length > 0 || !route.routeConfig?.path) { + // return super.canActivate(route, _state); + // } else { + // return super.canActivate(route, _state); + // } + return super.canActivate(route, _state); + } + + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + if (childRoute.routeConfig?.loadChildren || childRoute.routeConfig?.children) { + return super.canActivateChild(childRoute, state); + } else { + return this.handle(childRoute, state, 2, this.settingRoute(childRoute.params, state.url)); + } + } + + private handle(route: ActivatedRouteSnapshot, state: RouterStateSnapshot, type: 1 | 2, router?: string): Observable { + if (!router) { + return type === 1 ? super.canActivate(route, state) : super.canActivateChild(route, state); + } + return this.userService + .request('/api/mdc/cuc/userAuthority/isUserAdmin', { + appUserId: this.settings.user.appUserId + }) + .pipe( + switchMap(res => { + if (res) { + // 超级管理员赋值全量权限 + this.srv1.setFull(true); + return of(true); + } else { + // 如果不是超级管理员 获取权限 + return this.userService.request('/api/mdc/cuc/functionButton/getUserFunctionButton', { link: router }); + } + }), + switchMap(res => { + if (res?.abilities) { + this.srv1.setAbility(res.abilities || []); + // this.menuService.resume(); + this.userService.loadUserMenus(); + } + return type === 1 ? super.canActivate(route, state) : super.canActivateChild(route, state); + }) + ); + } + + /** + * 根据参数拼接原始路由 + * @param params 参数 + * @param route 实际路由 + * @returns + */ + private settingRoute(params: any, route: string) { + let _route = route; + if (_route.indexOf('?') > -1) { + _route = route.split('?')[0]; + } + for (const key of Object.keys(params)) { + if (_route.indexOf(params[key]) > -1) { + _route = _route.replace(params[key], ':' + key); + } + } + + return _route; + } +} diff --git a/src/app/core/guards/token.guard.ts b/src/app/core/guards/token.guard.ts new file mode 100644 index 00000000..c043a978 --- /dev/null +++ b/src/app/core/guards/token.guard.ts @@ -0,0 +1,38 @@ +import { Inject, Injectable, Injector } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router, RouterStateSnapshot } from '@angular/router'; +import { sysConf } from '@conf/sys.conf'; +import { CoreService } from '@core'; +import { ACLGuard, ACLService } from '@delon/acl'; +import { EAUserService } from '@shared'; +import { Observable, of } from 'rxjs'; + +@Injectable() +export class EATokenGuard implements CanActivate, CanActivateChild { + constructor(srv: ACLService, router: Router, private eaUserSrv: CoreService, private router2: Router, private inject: Injector) {} + + canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot | null): Observable { + const canOpen = this.eaUserSrv.loginStatus; + if (!canOpen) { + this.router2.navigate([sysConf.login_url], { + queryParams: { + returnUrl: _state?.url + } + }); + return of(!canOpen); + } + return of(true); + } + + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + const canOpen = this.eaUserSrv.loginStatus; + if (!canOpen) { + this.router2.navigate([sysConf.login_url], { + queryParams: { + returnUrl: state?.url + } + }); + return of(!canOpen); + } + return of(true); + } +} diff --git a/src/app/core/index.ts b/src/app/core/index.ts new file mode 100644 index 00000000..9f525334 --- /dev/null +++ b/src/app/core/index.ts @@ -0,0 +1,9 @@ +export * from './module-import-guard'; +export * from './net/default.interceptor'; +export * from './net/business.interceptor'; + +// Services +export * from './core.service'; +export * from './startup/startup.service'; + +export * from './guards/token.guard'; diff --git a/src/app/core/module-import-guard.ts b/src/app/core/module-import-guard.ts new file mode 100644 index 00000000..ad3d795a --- /dev/null +++ b/src/app/core/module-import-guard.ts @@ -0,0 +1,6 @@ +// https://angular.io/guide/styleguide#style-04-12 +export function throwIfAlreadyLoaded(parentModule: any, moduleName: string): void { + if (parentModule) { + throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`); + } +} diff --git a/src/app/core/net/business.interceptor.ts b/src/app/core/net/business.interceptor.ts new file mode 100644 index 00000000..9e34709e --- /dev/null +++ b/src/app/core/net/business.interceptor.ts @@ -0,0 +1,108 @@ +import { + HttpErrorResponse, + HttpEvent, + HttpHandler, + HttpInterceptor, + HttpRequest, + HttpResponse, + HttpResponseBase +} from '@angular/common/http'; +import { Inject, Injectable, Optional } from '@angular/core'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; +import { environment } from '@env/environment'; +import { EAEnvironmentService, EAUserService } from '@shared'; +import { Observable, of } from 'rxjs'; +import { catchError, mergeMap } from 'rxjs/operators'; +import { CoreService } from '../core.service'; + +@Injectable() +export class BusinessInterceptor implements HttpInterceptor { + constructor( + private envSrv: EAEnvironmentService, + private eaUserSrv: EAUserService, + @Optional() + @Inject(DA_SERVICE_TOKEN) + private tokenSrv: ITokenService, + private coreSrv: CoreService + ) {} + intercept(req: HttpRequest, next: HttpHandler): Observable> { + // 构造新的请求URL + req = this.constructNewRequestUrl(req); + // 附加额外的请求头 + req = this.attachAdditionalHeaders(req); + // 后续操作 + return next.handle(req).pipe( + mergeMap(ev => this.handlingBussinessResponseData(ev)), + catchError((err: HttpErrorResponse) => this.handlingBusinessErrors(err)) + ); + } + + /** + * 构造新的请求URL + */ + private constructNewRequestUrl(req: HttpRequest): HttpRequest { + let url = req.url; + if (!url.startsWith('https://') && !url.startsWith('http://')) { + if (!url.startsWith('assets')) { + url = environment.api.baseUrl + url; + } + } + return req.clone({ url }); + } + + /** + * 附加额外的请求头 + */ + private attachAdditionalHeaders(req: HttpRequest): HttpRequest { + let position = {}; + if (this.coreSrv.position.lat && this.coreSrv.position.lng) { + position = { lat: this.coreSrv.position.lat.toString(), lng: this.coreSrv.position.lng.toString() }; + } + // 附加环境变量 + const header: any = { + appId: this.envSrv.env.appId, + tenantId: this.envSrv.env.tenantId, + enterpriseId: this.envSrv.env.enterpriseId, + ...position + }; + + // 附加授权声明 + const token = this.tokenSrv.get()?.token; + if (token) { + header.Authorization = `Bearer ${token}`; + } + return req.clone({ setHeaders: header }); + } + + /** + * 处理业务数据 + */ + private handlingBussinessResponseData(ev: HttpEvent): Observable { + if (ev instanceof HttpResponseBase) { + const body = (ev as HttpResponse).body; + if (body) { + switch (body.status) { + case 505001: + case 505002: + this.eaUserSrv.logout(); + break; + default: + break; + } + } + } + if (ev instanceof HttpErrorResponse) { + return this.handlingBusinessErrors(ev); + } + return of(ev); + } + + /** + * 处理响应错误 + */ + private handlingBusinessErrors(err: HttpErrorResponse): Observable { + /** Http响应异常已在默认拦截器处理完成 ,该处不再处理 */ + + return of(err); + } +} diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts new file mode 100644 index 00000000..7b390379 --- /dev/null +++ b/src/app/core/net/default.interceptor.ts @@ -0,0 +1,59 @@ +import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponseBase } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { catchError, mergeMap } from 'rxjs/operators'; +import { CoreService } from './../core.service'; + +const CODEMESSAGE: { [key: number]: string } = { + 200: '服务器成功返回请求的数据。', + 201: '新建或修改数据成功。', + 202: '一个请求已经进入后台排队(异步任务)。', + 204: '删除数据成功。', + 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', + 401: '用户没有权限(令牌、用户名、密码错误)。', + 403: '用户得到授权,但是访问是被禁止的。', + 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', + 406: '请求的格式不可得。', + 410: '请求的资源被永久删除,且不会再得到的。', + 422: '当创建一个对象时,发生一个验证错误。', + 500: '服务器发生错误,请检查服务器。', + 502: '网关错误。', + 503: '服务不可用,服务器暂时过载或维护。', + 504: '网关超时。' +}; + +@Injectable() +export class DefaultInterceptor implements HttpInterceptor { + constructor(private coreSrv: CoreService) {} + intercept(req: HttpRequest, next: HttpHandler): Observable> { + return next.handle(req).pipe( + mergeMap(ev => this.handlingHttpResponseData(ev)), + catchError((err: HttpErrorResponse) => this.handlingHttpErrorResponse(err)) + ); + } + + /** + * 处理Http响应数据 + */ + private handlingHttpResponseData(ev: HttpEvent): Observable { + if (ev instanceof HttpResponseBase) { + // 正常情况直接返回到下个业务拦截器处理 + if (ev.status >= 200 && ev.status < 300) { + return of(ev); + } + + // 所有状态不是2xx和3xx都当作异常处理 + if (ev instanceof HttpErrorResponse) { + return this.handlingHttpErrorResponse(ev); + } + } + return of(ev); + } + + /** + * 处理默认Http响应错误 + */ + private handlingHttpErrorResponse(err: HttpErrorResponse): Observable { + return of(err); + } +} diff --git a/src/app/core/startup/startup.service.ts b/src/app/core/startup/startup.service.ts new file mode 100644 index 00000000..5a8be33e --- /dev/null +++ b/src/app/core/startup/startup.service.ts @@ -0,0 +1,191 @@ +import { HttpClient } from '@angular/common/http'; +import { Inject, Injectable } from '@angular/core'; +import { cacheConf } from '@conf/cache.conf'; +import { sysConf } from '@conf/sys.conf'; +import { ACLService } from '@delon/acl'; +import { MenuService, SettingsService, TitleService, _HttpClient } from '@delon/theme'; +import { AlainConfigService } from '@delon/util'; +import { environment } from '@env/environment'; +import { AmapService, EACacheService, EAUserService } from '@shared'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { NzIconService } from 'ng-zorro-antd/icon'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, zip } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; + +import { ICONS } from '../../../style-icons'; +import { ICONS_AUTO } from '../../../style-icons-auto'; +import { CoreService } from '../core.service'; + +/** + * Used for application startup + * Generally used to get the basic data of the application, like: Menu Data, User Data, etc. + */ +@Injectable() +export class StartupService { + constructor( + iconSrv: NzIconService, + private menuService: MenuService, + private settingService: SettingsService, + private aclService: ACLService, + private titleService: TitleService, + private httpClient: _HttpClient, + private userSrv: EAUserService, + private amapService: AmapService, + public cacheSrv: EACacheService, + private coreSrv: CoreService, + private nzImageService: NzImageService, + private alainConfigService: AlainConfigService + ) { + iconSrv.addIcon(...ICONS_AUTO, ...ICONS); + this.settingService.setLayout('fixSiderbar', true); + // 全局修改sf图片预览方式 + alainConfigService.set('sf', { + ui: { + preview: (file: NzUploadFile) => { + if (file.url) { + this.nzImageService.preview([{ src: file.url }]); + } + } + } + }); + } + + // TODO: 退出登录时需要清理用户信息 + + load(): Promise { + return new Promise(resolve => { + this.amapService.getCurrentPosition().subscribe(res => { + if (res.position) { + this.coreSrv.position = { lat: res.position.lat, lng: res.position.lng }; + } + }); + + let data; + if (this.coreSrv.loginStatus) { + // 本地菜单 + // data = this.loadMockData(); + // 远程菜单 + data = this.loadRemoteData(); + } else { + data = this.loadMockData(); + } + + data + .pipe( + catchError(res => { + console.warn(`StartupService.load: Network request failed`, res); + resolve(); + return []; + }) + ) + .subscribe( + ([appData, userData, menuData]) => this.initSystem(appData, userData, menuData), + err => { + console.log(err); + }, + () => resolve() + ); + }); + } + + /** + * 系统初始化 + * + * @param langData 翻译数据 + * @param appData App应用数据 + * @param userData 用户数据 + * @param menuData 菜单数据 + */ + private initSystem(appData: NzSafeAny, userData: NzSafeAny, menuData: NzSafeAny): void { + // 应用信息:包括站点名、描述、年份 + this.settingService.setApp(appData); + // 用户信息:包括姓名、头像、邮箱地址 + this.settingService.setUser(userData); + this.cacheSrv.set(cacheConf.env, { + appId: sysConf.appId, + tenantId: userData?.tenantId || sysConf.tenantId, + enterpriseId: userData?.enterpriseId || sysConf.enterpriseId + }); + // ACL:设置权限为全量 + this.aclService.setFull(false); + // 初始化菜单 + if (menuData) { + this.menuService.add(menuData); + } + // 设置页面标题的后缀 + this.titleService.default = ''; + this.titleService.suffix = appData.name; + } + + /** + * @description 加载本地模拟数据 + * @returns 程序初始化数据 + */ + loadMockData(): Observable<[object, object, object]> { + // 登录时调用远程数据, 非登录状态下调用Mock数据 + + // App数据 + const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app)); + + // 用户数据 + const userData = this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user)); + + // 菜单数据 + const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu)); + + return zip(appData, userData, menuData); + } + + /** + * @description 加载远程数据 + * @returns 程序初始化数据 + */ + loadRemoteData(): Observable<[object, object, object]> { + // 登录时调用远程数据, 非登录状态下调用Mock数据 + + // App数据 + const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app)); + + // 用户数据 + const userData = this.httpClient.post(this.userSrv.$api_get_user_by_token, {}).pipe(map((res: any) => res.data)); + + // 菜单数据 + const menuData = this.httpClient + .post(this.coreSrv.$api_get_current_user_menus, { + appId: this.coreSrv.envSrv.getEnvironment().appId + }) + .pipe(map((res: any) => res.data)); + // const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu)); + + return zip(appData, userData, menuData); + } + + // load(): Observable { + // const defaultLang = this.i18n.defaultLang; + // return zip(this.i18n.loadLangData(defaultLang), this.httpClient.get('assets/tmp/app-data.json')).pipe( + // // 接收其他拦截器后产生的异常消息 + // catchError(res => { + // console.warn(`StartupService.load: Network request failed`, res); + // return []; + // }), + // map(([langData, appData]: [Record, NzSafeAny]) => { + // // setting language data + // this.i18n.use(defaultLang, langData); + + // // 应用信息:包括站点名、描述、年份 + // this.settingService.setApp(appData.app); + // // 用户信息:包括姓名、头像、邮箱地址 + // this.settingService.setUser(appData.user); + // // ACL:设置权限为全量 + // this.aclService.setFull(true); + // // 初始化菜单 + // this.menuService.add(appData.menu); + // // 设置页面标题的后缀 + // this.titleService.default = ''; + // this.titleService.suffix = appData.app.name; + // }) + // ); + // } +} diff --git a/src/app/global-config.module.ts b/src/app/global-config.module.ts new file mode 100644 index 00000000..af9999b1 --- /dev/null +++ b/src/app/global-config.module.ts @@ -0,0 +1,79 @@ +/* eslint-disable import/order */ +import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; +import { throwIfAlreadyLoaded } from '@core'; +import { ReuseTabMatchMode, ReuseTabService, ReuseTabStrategy } from '@delon/abc/reuse-tab'; +import { DelonACLModule } from '@delon/acl'; +import { AlainThemeModule } from '@delon/theme'; +import { AlainConfig, ALAIN_CONFIG } from '@delon/util'; +import { environment } from '@env/environment'; + +// Please refer to: https://ng-alain.com/docs/global-config +// #region NG-ALAIN Config + +const alainConfig: AlainConfig = { + st: { + req: { method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' } }, + res: { reName: { list: 'data.records', total: 'data.total' } }, + page: { show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000], toTop: false }, + modal: { size: 'lg' } + }, + sf: { button: { search: '查询' } }, + pageHeader: { homeI18n: 'home', recursiveBreadcrumb: true }, + auth: { login_url: '/passport/login' }, + acl: { guard_url: '/exception/403' }, + chart: { + // 以下是默认配置,如果项目无法外网访问,可以根据 `angular.json` 配置将依赖包直接使用 `./assets***` 路径 + libs: [ + 'https://gw.alipayobjects.com/os/lib/antv/g2/4.1.4/dist/g2.min.js', + 'https://gw.alipayobjects.com/os/lib/antv/data-set/0.11.7/dist/data-set.js' + ] + }, +}; + +const alainModules = [AlainThemeModule.forRoot(), DelonACLModule.forRoot()]; +const alainProvides = [{ provide: ALAIN_CONFIG, useValue: alainConfig }]; + +// #region reuse-tab + +// import { RouteReuseStrategy } from '@angular/router'; +// alainProvides.push({ +// provide: RouteReuseStrategy, +// useClass: ReuseTabStrategy, +// deps: [ReuseTabService] +// } as any); + +// #endregion + +// #endregion + +// Please refer to: https://ng.ant.design/docs/global-config/en#how-to-use +// #region NG-ZORRO Config + +import { NzConfig, NZ_CONFIG } from 'ng-zorro-antd/core/config'; + +const ngZorroConfig: NzConfig = {}; + +const zorroProvides = [{ provide: NZ_CONFIG, useValue: ngZorroConfig }]; + +// #endregion + +@NgModule({ + imports: [...alainModules, ...(environment.modules || [])] +}) +export class GlobalConfigModule { + constructor(@Optional() @SkipSelf() parentModule: GlobalConfigModule, reuseTabService: ReuseTabService) { + throwIfAlreadyLoaded(parentModule, 'GlobalConfigModule'); + // NOTICE: Only valid for menus with reuse property + // Pls refer to the E-Mail demo effect + // reuseTabService.mode = ReuseTabMatchMode.MenuForce; + // Shouled be trigger init, you can ingore when used `reuse-tab` component in layout component + // reuseTabService.init(); + } + + static forRoot(): ModuleWithProviders { + return { + ngModule: GlobalConfigModule, + providers: [...alainProvides, ...zorroProvides] + }; + } +} diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts new file mode 100644 index 00000000..3afd4206 --- /dev/null +++ b/src/app/layout/layout.module.ts @@ -0,0 +1,65 @@ +import { LayoutModule as CDKLayoutModule } from '@angular/cdk/layout'; +import { CommonModule } from '@angular/common'; +import { NgModule, Type } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { GlobalFooterModule } from '@delon/abc/global-footer'; +import { NoticeIconModule } from '@delon/abc/notice-icon'; +import { AlainThemeModule } from '@delon/theme'; +import { ThemeBtnModule } from '@delon/theme/theme-btn'; +import { ScrollbarModule } from '@shared'; +import { NzAlertModule } from 'ng-zorro-antd/alert'; +import { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete'; +import { NzAvatarModule } from 'ng-zorro-antd/avatar'; +import { NzBadgeModule } from 'ng-zorro-antd/badge'; +import { NzButtonModule } from 'ng-zorro-antd/button'; +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzDrawerModule } from 'ng-zorro-antd/drawer'; +import { NzDropDownModule } from 'ng-zorro-antd/dropdown'; +import { NzIconModule } from 'ng-zorro-antd/icon'; +import { NzLayoutModule } from 'ng-zorro-antd/layout'; +import { NzMessageModule } from 'ng-zorro-antd/message'; +import { NzSelectModule } from 'ng-zorro-antd/select'; +import { NzSpinModule } from 'ng-zorro-antd/spin'; +import { NzSwitchModule } from 'ng-zorro-antd/switch'; +import { NzTimelineModule } from 'ng-zorro-antd/timeline'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; +import { NzGridModule } from 'ng-zorro-antd/grid'; +import { LayoutPassportComponent } from './passport/passport.component'; +import { PRO_COMPONENTS } from './pro/index'; + +const COMPONENTS: Array> = [...PRO_COMPONENTS, LayoutPassportComponent]; + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + FormsModule, + AlainThemeModule, + GlobalFooterModule, + CDKLayoutModule, + NzSpinModule, + NzDropDownModule, + NzIconModule, + NzDrawerModule, + NzAutocompleteModule, + NzAvatarModule, + NzSwitchModule, + NzToolTipModule, + NzSelectModule, + NzDividerModule, + NzAlertModule, + NzLayoutModule, + NzButtonModule, + NzBadgeModule, + NzTimelineModule, + NoticeIconModule, + ThemeBtnModule, + ScrollbarModule, + NzGridModule, + NzMessageModule + ], + declarations: COMPONENTS, + exports: COMPONENTS +}) +export class LayoutModule {} diff --git a/src/app/layout/passport/passport.component.html b/src/app/layout/passport/passport.component.html new file mode 100644 index 00000000..0f37d045 --- /dev/null +++ b/src/app/layout/passport/passport.component.html @@ -0,0 +1,15 @@ + + +
+
+ + +
+
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/src/app/layout/passport/passport.component.less b/src/app/layout/passport/passport.component.less new file mode 100644 index 00000000..fc77bde8 --- /dev/null +++ b/src/app/layout/passport/passport.component.less @@ -0,0 +1,22 @@ +@import '~@delon/theme/index'; + +:host { + ::ng-deep { + .layout { + height: 100%; + } + + .ant-layout-header { + background: #ffffff; + box-shadow: 0px 5px 5px #d1d1d1; + } + + + } +} + +.title { + font-size : 18px; + font-weight: 600; + color : #26282A; +} \ No newline at end of file diff --git a/src/app/layout/passport/passport.component.ts b/src/app/layout/passport/passport.component.ts new file mode 100644 index 00000000..8a4ef9da --- /dev/null +++ b/src/app/layout/passport/passport.component.ts @@ -0,0 +1,15 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; + +@Component({ + selector: 'layout-passport', + templateUrl: './passport.component.html', + styleUrls: ['./passport.component.less'] +}) +export class LayoutPassportComponent implements OnInit { + constructor() {} + + ngOnInit(): void { + // this.tokenService.clear(); + } +} diff --git a/src/app/layout/pro/components/footer/footer.component.html b/src/app/layout/pro/components/footer/footer.component.html new file mode 100644 index 00000000..59588807 --- /dev/null +++ b/src/app/layout/pro/components/footer/footer.component.html @@ -0,0 +1,16 @@ + + + Pro 首页 + + + + + + Alain Pro + + Copyright + + {{ year }} + 卡色 + 出品 + \ No newline at end of file diff --git a/src/app/layout/pro/components/footer/footer.component.ts b/src/app/layout/pro/components/footer/footer.component.ts new file mode 100644 index 00000000..0d23aebc --- /dev/null +++ b/src/app/layout/pro/components/footer/footer.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { SettingsService } from '@delon/theme'; + +@Component({ + selector: 'layout-pro-footer', + templateUrl: './footer.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProFooterComponent { + get year(): number { + return this.setting.app.year; + } + + constructor(private setting: SettingsService) {} +} diff --git a/src/app/layout/pro/components/header/header.component.html b/src/app/layout/pro/components/header/header.component.html new file mode 100644 index 00000000..f3b58f4a --- /dev/null +++ b/src/app/layout/pro/components/header/header.component.html @@ -0,0 +1,25 @@ +
+
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
diff --git a/src/app/layout/pro/components/header/header.component.ts b/src/app/layout/pro/components/header/header.component.ts new file mode 100644 index 00000000..659f5ab5 --- /dev/null +++ b/src/app/layout/pro/components/header/header.component.ts @@ -0,0 +1,68 @@ +import { DOCUMENT } from '@angular/common'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, Inject, OnDestroy, OnInit } from '@angular/core'; +import { RTL, RTLService } from '@delon/theme'; +import { combineLatest, fromEvent, Subject } from 'rxjs'; +import { distinctUntilChanged, takeUntil, tap, throttleTime } from 'rxjs/operators'; + +import { BrandService } from '../../pro.service'; + +@Component({ + selector: 'layout-pro-header', + templateUrl: './header.component.html', + host: { + '[class.ant-layout-header]': 'true', + '[class.alain-pro__header-fixed]': 'pro.fixedHeader', + '[class.alain-pro__header-hide]': 'hideHeader', + '[style.padding.px]': '0' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProHeaderComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + hideHeader = false; + + @HostBinding('style.width') + get getHeadWidth(): string { + const { isMobile, fixedHeader, menu, collapsed, width, widthInCollapsed } = this.pro; + if (isMobile || !fixedHeader || menu === 'top') { + return '100%'; + } + return collapsed ? `calc(100% - ${widthInCollapsed}px)` : `calc(100% - ${width}px)`; + } + + get collapsedIcon(): string { + let type = this.pro.collapsed ? 'unfold' : 'fold'; + if (this.rtl.dir === RTL) { + type = this.pro.collapsed ? 'fold' : 'unfold'; + } + return `menu-${type}`; + } + + constructor(public pro: BrandService, @Inject(DOCUMENT) private doc: any, private cdr: ChangeDetectorRef, private rtl: RTLService) {} + + private handScroll(): void { + if (!this.pro.autoHideHeader) { + this.hideHeader = false; + return; + } + setTimeout(() => { + this.hideHeader = this.doc.body.scrollTop + this.doc.documentElement.scrollTop > this.pro.autoHideHeaderTop; + }); + } + + ngOnInit(): void { + combineLatest([ + this.pro.notify.pipe(tap(() => this.cdr.markForCheck())), + fromEvent(window, 'scroll', { passive: false }).pipe(throttleTime(50), distinctUntilChanged()) + ]) + .pipe(takeUntil(this.destroy$)) + .subscribe(() => this.handScroll()); + + this.rtl.change.pipe(takeUntil(this.destroy$)).subscribe(() => this.cdr.detectChanges()); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/src/app/layout/pro/components/logo/logo.component.html b/src/app/layout/pro/components/logo/logo.component.html new file mode 100644 index 00000000..511e16c7 --- /dev/null +++ b/src/app/layout/pro/components/logo/logo.component.html @@ -0,0 +1,4 @@ + + {{ name }} +

{{ name }}

+
diff --git a/src/app/layout/pro/components/logo/logo.component.ts b/src/app/layout/pro/components/logo/logo.component.ts new file mode 100644 index 00000000..ac1366f2 --- /dev/null +++ b/src/app/layout/pro/components/logo/logo.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { SettingsService } from '@delon/theme'; + +@Component({ + selector: 'layout-pro-logo', + templateUrl: './logo.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProLogoComponent { + get name(): string { + return this.setting.app.name!; + } + + constructor(private setting: SettingsService) {} +} diff --git a/src/app/layout/pro/components/menu/menu.component.html b/src/app/layout/pro/components/menu/menu.component.html new file mode 100644 index 00000000..272c43b3 --- /dev/null +++ b/src/app/layout/pro/components/menu/menu.component.html @@ -0,0 +1,67 @@ + + + + + + + + + + + {{ i.text }} +
+ {{ i.badge }} +
+
+ + {{ i.text }} + {{ i.text }} + +
    + +
  • + + + + + + +
  • +
  • + + + + {{ l1.text }} +
    + {{ l1.badge }} +
    +
    +
    +
      + +
    • + +
    • +
    • +
        + +
      • + +
      • +
        +
      +
    • +
      +
    +
  • +
    +
\ No newline at end of file diff --git a/src/app/layout/pro/components/menu/menu.component.ts b/src/app/layout/pro/components/menu/menu.component.ts new file mode 100644 index 00000000..a478429f --- /dev/null +++ b/src/app/layout/pro/components/menu/menu.component.ts @@ -0,0 +1,124 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { MenuService } from '@delon/theme'; +import { InputBoolean } from '@delon/util'; +import { NzMenuModeType } from 'ng-zorro-antd/menu'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; + +import { BrandService } from '../../pro.service'; +import { ProMenu } from '../../pro.types'; + +@Component({ + selector: '[layout-pro-menu]', + templateUrl: './menu.component.html', + host: { + '[class.alain-pro__menu]': 'true', + '[class.alain-pro__menu-only-icon]': 'pro.onlyIcon' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProMenuComponent implements OnInit, OnDestroy { + private unsubscribe$ = new Subject(); + menus?: ProMenu[]; + + @Input() @InputBoolean() disabledAcl = false; + @Input() mode: NzMenuModeType = 'inline'; + + constructor(private menuSrv: MenuService, private router: Router, public pro: BrandService, private cdr: ChangeDetectorRef) {} + + private cd(): void { + this.cdr.markForCheck(); + } + + private genMenus(data: ProMenu[]): void { + const res: ProMenu[] = []; + // ingores category menus + const ingoreCategores = data.reduce((prev, cur) => prev.concat(cur.children as ProMenu[]), [] as ProMenu[]); + this.menuSrv.visit(ingoreCategores, (item: ProMenu, parent: ProMenu | null) => { + if (!item._aclResult) { + if (this.disabledAcl) { + item.disabled = true; + } else { + item._hidden = true; + } + } + if (item._hidden === true) { + return; + } + if (parent === null) { + res.push(item); + } + }); + this.menus = res; + this.openStatus(); + } + + private openStatus(): void { + const inFn = (list: ProMenu[]) => { + for (const i of list) { + i._open = false; + i._selected = false; + if (i.children!.length > 0) { + inFn(i.children!); + } + } + }; + inFn(this.menus!); + + let item = this.menuSrv.getHit(this.menus!, this.router.url, true); + if (!item) { + this.cd(); + return; + } + do { + item._selected = true; + if (!this.pro.isTopMenu && !this.pro.collapsed) { + item._open = true; + } + item = item._parent!; + } while (item); + this.cd(); + } + + openChange(item: ProMenu, statue: boolean): void { + const data = item._parent ? item._parent.children : this.menus; + if (data && data.length <= 1) { + return; + } + data!.forEach(i => (i._open = false)); + item._open = statue; + } + + closeCollapsed(): void { + const { pro } = this; + if (pro.isMobile) { + setTimeout(() => pro.setCollapsed(true), 25); + } + } + + ngOnInit(): void { + const { unsubscribe$, router, pro } = this; + this.menuSrv.change.pipe(takeUntil(unsubscribe$)).subscribe(res => this.genMenus(res)); + + router.events + .pipe( + takeUntil(unsubscribe$), + filter(e => e instanceof NavigationEnd) + ) + .subscribe(() => this.openStatus()); + + pro.notify + .pipe( + takeUntil(unsubscribe$), + filter(() => !!this.menus) + ) + .subscribe(() => this.cd()); + } + + ngOnDestroy(): void { + const { unsubscribe$ } = this; + unsubscribe$.next(); + unsubscribe$.complete(); + } +} diff --git a/src/app/layout/pro/components/notify/notify.component.html b/src/app/layout/pro/components/notify/notify.component.html new file mode 100644 index 00000000..ddd01574 --- /dev/null +++ b/src/app/layout/pro/components/notify/notify.component.html @@ -0,0 +1,4 @@ + + + diff --git a/src/app/layout/pro/components/notify/notify.component.ts b/src/app/layout/pro/components/notify/notify.component.ts new file mode 100644 index 00000000..afa6b61b --- /dev/null +++ b/src/app/layout/pro/components/notify/notify.component.ts @@ -0,0 +1,183 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core'; +import { NoticeIconList, NoticeItem } from '@delon/abc/notice-icon'; +import formatDistanceToNow from 'date-fns/formatDistanceToNow'; +import parse from 'date-fns/parse'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: 'layout-pro-notify', + templateUrl: './notify.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetNotifyComponent { + data: NoticeItem[] = [ + { + title: '通知', + list: [], + emptyText: '你已查看所有通知', + emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg', + clearText: '清空通知' + }, + { + title: '消息', + list: [], + emptyText: '您已读完所有消息', + emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg', + clearText: '清空消息' + }, + { + title: '待办', + list: [], + emptyText: '你已完成所有待办', + emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/HsIsxMZiWKrNUavQUXqx.svg', + clearText: '清空待办' + } + ]; + count = 5; + loading = false; + + constructor(private msg: NzMessageService, private cdr: ChangeDetectorRef) {} + + updateNoticeData(notices: NoticeIconList[]): NoticeItem[] { + const data = this.data.slice(); + data.forEach(i => (i.list = [])); + + notices.forEach(item => { + const newItem = { ...item }; + if (typeof newItem.datetime === 'string') { + newItem.datetime = parse(newItem.datetime, 'yyyy-MM-dd', new Date()); + } + if (newItem.datetime) { + newItem.datetime = formatDistanceToNow(newItem.datetime as Date); + } + if (newItem.extra && newItem.status) { + newItem.color = ( + { + todo: undefined, + processing: 'blue', + urgent: 'red', + doing: 'gold' + } as NzSafeAny + )[newItem.status]; + } + data.find(w => w.title === newItem.type)?.list.push(newItem); + }); + return data; + } + + loadData(): void { + if (this.loading) { + return; + } + this.loading = true; + setTimeout(() => { + this.data = this.updateNoticeData([ + { + id: '000000001', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '你收到了 14 份新周报', + datetime: '2017-08-09', + type: '通知' + }, + { + id: '000000002', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png', + title: '你推荐的 曲妮妮 已通过第三轮面试', + datetime: '2017-08-08', + type: '通知' + }, + { + id: '000000003', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png', + title: '这种模板可以区分多种通知类型', + datetime: '2017-08-07', + read: true, + type: '通知' + }, + { + id: '000000004', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png', + title: '左侧图标用于区分不同的类型', + datetime: '2017-08-07', + type: '通知' + }, + { + id: '000000005', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '内容不要超过两行字,超出时自动截断', + datetime: '2017-08-07', + type: '通知' + }, + { + id: '000000006', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '曲丽丽 评论了你', + description: '描述信息描述信息描述信息', + datetime: '2017-08-07', + type: '消息' + }, + { + id: '000000007', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '朱偏右 回复了你', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: '消息' + }, + { + id: '000000008', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '标题', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: '消息' + }, + { + id: '000000009', + title: '任务名称', + description: '任务需要在 2017-01-12 20:00 前启动', + extra: '未开始', + status: 'todo', + type: '待办' + }, + { + id: '000000010', + title: '第三方紧急代码变更', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '马上到期', + status: 'urgent', + type: '待办' + }, + { + id: '000000011', + title: '信息安全考试', + description: '指派竹尔于 2017-01-09 前完成更新并发布', + extra: '已耗时 8 天', + status: 'doing', + type: '待办' + }, + { + id: '000000012', + title: 'ABCD 版本发布', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '进行中', + status: 'processing', + type: '待办' + } + ]); + + this.loading = false; + + this.cdr.detectChanges(); + }, 1000); + } + + clear(type: string): void { + this.msg.success(`清空了 ${type}`); + } + + select(res: any): void { + this.msg.success(`点击了 ${res.title} 的 ${res.item.title}`); + } +} diff --git a/src/app/layout/pro/components/quick-chat/quick-chat-status.component.html b/src/app/layout/pro/components/quick-chat/quick-chat-status.component.html new file mode 100644 index 00000000..99ce05f6 --- /dev/null +++ b/src/app/layout/pro/components/quick-chat/quick-chat-status.component.html @@ -0,0 +1,4 @@ +
+ + +
diff --git a/src/app/layout/pro/components/quick-chat/quick-chat-status.component.ts b/src/app/layout/pro/components/quick-chat/quick-chat-status.component.ts new file mode 100644 index 00000000..a8650c81 --- /dev/null +++ b/src/app/layout/pro/components/quick-chat/quick-chat-status.component.ts @@ -0,0 +1,42 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { LayoutProWidgetQuickChatService } from './quick-chat.service'; + +@Component({ + selector: 'quick-chat-status', + templateUrl: './quick-chat-status.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetQuickChatStatusComponent implements OnInit, OnDestroy { + private status$!: Subscription; + + status = 'default'; + + constructor(private srv: LayoutProWidgetQuickChatService, private cdr: ChangeDetectorRef) {} + + show(): void { + if (this.srv.showDialog) { + return; + } + this.srv.showDialog = true; + } + + ngOnInit(): void { + this.status$ = this.srv.status.subscribe(res => { + switch (res) { + case 'online': + this.status = 'success'; + break; + default: + this.status = 'default'; + break; + } + this.cdr.detectChanges(); + }); + } + + ngOnDestroy(): void { + this.status$.unsubscribe(); + } +} diff --git a/src/app/layout/pro/components/quick-chat/quick-chat.component.html b/src/app/layout/pro/components/quick-chat/quick-chat.component.html new file mode 100644 index 00000000..21ec6d85 --- /dev/null +++ b/src/app/layout/pro/components/quick-chat/quick-chat.component.html @@ -0,0 +1,47 @@ +
+ +
+ {{ !collapsed && inited ? 'Connecting...' : 'Ng Alain Pro' }} +
+
+ + +
    +
  • Add
  • +
  • Edit
  • +
  • Remove
  • +
+
+ +
+
+
+
+
+ +
+ +
+ +
+
+ {{ m.name }} +
+
+ +
+
+
+
+
+
+
+
+ +
+
diff --git a/src/app/layout/pro/components/quick-chat/quick-chat.component.ts b/src/app/layout/pro/components/quick-chat/quick-chat.component.ts new file mode 100644 index 00000000..db7379d6 --- /dev/null +++ b/src/app/layout/pro/components/quick-chat/quick-chat.component.ts @@ -0,0 +1,131 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + HostBinding, + Input, + OnDestroy, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import { BooleanInput, InputBoolean, InputNumber, NumberInput } from '@delon/util'; +import { ScrollbarDirective } from '@shared'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { LayoutProWidgetQuickChatService } from './quick-chat.service'; + +@Component({ + selector: 'quick-chat', + templateUrl: './quick-chat.component.html', + host: { + '[class.quick-chat]': 'true', + '[class.quick-chat__collapsed]': 'collapsed', + '[class.d-none]': '!showDialog' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetQuickChatComponent implements OnInit, OnDestroy { + static ngAcceptInputType_height: NumberInput; + static ngAcceptInputType_width: BooleanInput; + static ngAcceptInputType_collapsed: BooleanInput; + + private unsubscribe$ = new Subject(); + messages: any[] = [ + { type: 'only-text', msg: '2018-12-12' }, + { + type: 'text', + dir: 'left', + mp: './assets/logo-color.svg', + msg: '请一句话描述您的问题,我们来帮您解决并转到合适的人工服务。😎' + } + ]; + text = ''; + inited?: boolean; + hasMessage = false; + + @ViewChild('messageScrollbar', { static: true }) messageScrollbar?: ScrollbarDirective; + + // #region fileds + @Input() @InputNumber() height = 380; + @Input() @InputNumber() @HostBinding('style.width.px') width = 320; + @Input() @InputBoolean() collapsed = true; + @Output() readonly collapsedChange = new EventEmitter(); + @Output() readonly closed = new EventEmitter(); + // #endregion + + constructor(private srv: LayoutProWidgetQuickChatService, private cdr: ChangeDetectorRef) {} + + get showDialog(): boolean { + return this.srv.showDialog; + } + + private scrollToBottom(): void { + this.cdr.detectChanges(); + setTimeout(() => this.messageScrollbar!.scrollToBottom()); + } + + toggleCollapsed(): void { + this.hasMessage = false; + this.collapsed = !this.collapsed; + this.collapsedChange.emit(this.collapsed); + } + + close(): void { + this.srv.close(); + this.closed.emit(true); + } + + enterSend(e: Event): void { + if ((e as KeyboardEvent).keyCode !== 13) { + return; + } + if (e) { + e.preventDefault(); + e.stopPropagation(); + } + this.send(); + } + + send(): boolean { + if (!this.text) { + return false; + } + + if (typeof this.inited === 'undefined') { + this.inited = true; + } + const item = { + type: 'text', + msg: this.text, + dir: 'right' + }; + this.srv.send(item); + this.messages.push(item); + this.text = ''; + this.scrollToBottom(); + return false; + } + + ngOnInit(): void { + const { srv, messages, unsubscribe$ } = this; + srv.message.pipe(takeUntil(unsubscribe$)).subscribe(res => { + if (this.collapsed) { + this.hasMessage = true; + } + messages.push(res); + this.scrollToBottom(); + }); + srv.status.pipe(takeUntil(unsubscribe$)).subscribe(res => { + this.inited = res === 'online' ? false : undefined; + }); + } + + ngOnDestroy(): void { + const { unsubscribe$ } = this; + unsubscribe$.next(); + unsubscribe$.complete(); + } +} diff --git a/src/app/layout/pro/components/quick-chat/quick-chat.service.ts b/src/app/layout/pro/components/quick-chat/quick-chat.service.ts new file mode 100644 index 00000000..f688b1f3 --- /dev/null +++ b/src/app/layout/pro/components/quick-chat/quick-chat.service.ts @@ -0,0 +1,80 @@ +import { Injectable, OnDestroy } from '@angular/core'; +import { Observable, Subject, Subscription } from 'rxjs'; +import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; + +export type QuickChatStatus = 'online' | 'offline'; + +@Injectable({ providedIn: 'root' }) +export class LayoutProWidgetQuickChatService implements OnDestroy { + private url = 'wss://echo.websocket.org/?encoding=text'; + private _ws!: WebSocketSubject<{}>; + private $statusOrg = new Subject(); + private messageOrg$: Subscription | null = null; + private $status = new Subject(); + private $message = new Subject<{}>(); + showDialog = true; + + constructor() { + this.$statusOrg.subscribe((res: any) => { + this.$status.next(res.type === 'open' ? 'online' : 'offline'); + }); + } + + get ws(): WebSocketSubject<{}> { + return this._ws!; + } + + get message(): Observable<{}> { + return this.$message.asObservable(); + } + + get status(): Observable { + return this.$status.asObservable(); + } + + open(): WebSocketSubject<{}> { + if (this._ws) { + return this._ws; + } + + this._ws = webSocket({ + url: this.url, + serializer: (value: any) => JSON.stringify(value), + deserializer: (e: MessageEvent) => { + const res = JSON.parse(e.data); + res.dir = 'left'; + res.mp = './assets/logo-color.svg'; + return res; + }, + openObserver: this.$statusOrg, + closeObserver: this.$statusOrg + }); + return this._ws; + } + + close(): void { + this.showDialog = false; + if (this.messageOrg$) { + this.messageOrg$.unsubscribe(); + this.messageOrg$ = null; + } + } + + send(msg: {}): void { + if (!this._ws) { + this.open(); + } + if (!this.messageOrg$) { + this.messageOrg$ = this._ws.subscribe(res => this.$message.next(res)); + } + this._ws.next(msg); + } + + ngOnDestroy(): void { + const { $statusOrg, $status, $message } = this; + this.close(); + $statusOrg.complete(); + $status.complete(); + $message.complete(); + } +} diff --git a/src/app/layout/pro/components/quick/quick-panel.component.html b/src/app/layout/pro/components/quick/quick-panel.component.html new file mode 100644 index 00000000..e4d776d1 --- /dev/null +++ b/src/app/layout/pro/components/quick/quick-panel.component.html @@ -0,0 +1,87 @@ +
+ + + +
+ +
+
+ + + +
+ +
+
+
+ {{ i.time }} +
+
{{ i.tags }}
+
+
+
+ +
+ {{ i.title }} +
{{ i.content }}
+
+ + +
+ + + + +
    +
  • Item1
  • +
  • Item2
  • +
  • +
  • Item3
  • +
+
+
+
+ +

Notifications

+
+ Enable notifications: + +
+
+ Enable audit log: + +
+
+ Notify on new orders: + +
+

Orders

+
+ Enable order tracking: + +
+
+ Enable orders reports: + +
+

Customers

+
+ Enable customer singup: + +
+
+ Enable customers reporting: + +
+

Other

+
+ Weak Mode: + +
+
+
+
diff --git a/src/app/layout/pro/components/quick/quick-panel.component.ts b/src/app/layout/pro/components/quick/quick-panel.component.ts new file mode 100644 index 00000000..0dfb458c --- /dev/null +++ b/src/app/layout/pro/components/quick/quick-panel.component.ts @@ -0,0 +1,42 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +import { BrandService } from '../../pro.service'; +import { ProLayout } from '../../pro.types'; + +@Component({ + selector: 'layout-pro-quick-panel', + templateUrl: './quick-panel.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetQuickPanelComponent implements OnInit { + type = 0; + data: any; + get layout(): ProLayout { + return this.pro.layout; + } + + constructor(private pro: BrandService, private http: _HttpClient, private cd: ChangeDetectorRef, public msg: NzMessageService) {} + + ngOnInit(): void { + this.http.get('/quick').subscribe(res => { + this.data = res; + this.changeType(0); + }); + } + + changeType(type: number): void { + this.type = type; + // wait checkbox & switch render + setTimeout(() => this.cd.detectChanges()); + } + + updateSetting(_type: string, _value: any): void { + this.msg.success('Success!'); + } + + setLayout(name: string, value: any): void { + this.pro.setLayout(name, value); + } +} diff --git a/src/app/layout/pro/components/quick/quick.component.html b/src/app/layout/pro/components/quick/quick.component.html new file mode 100644 index 00000000..ba912ab8 --- /dev/null +++ b/src/app/layout/pro/components/quick/quick.component.html @@ -0,0 +1 @@ + diff --git a/src/app/layout/pro/components/quick/quick.component.ts b/src/app/layout/pro/components/quick/quick.component.ts new file mode 100644 index 00000000..a38f1267 --- /dev/null +++ b/src/app/layout/pro/components/quick/quick.component.ts @@ -0,0 +1,51 @@ +import { Direction, Directionality } from '@angular/cdk/bidi'; +import { ChangeDetectionStrategy, Component, HostListener, OnDestroy, OnInit, Optional } from '@angular/core'; +import { DrawerHelper } from '@delon/theme'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { LayoutProWidgetQuickPanelComponent } from './quick-panel.component'; + +@Component({ + selector: 'layout-pro-quick', + templateUrl: './quick.component.html', + host: { + '[class.alain-pro__header-item]': 'true' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetQuickComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + private dir: Direction = 'ltr'; + + constructor(private drawerHelper: DrawerHelper, @Optional() private directionality: Directionality) {} + + @HostListener('click') + show(): void { + this.drawerHelper + .create(``, LayoutProWidgetQuickPanelComponent, null, { + size: 480, + drawerOptions: { + nzTitle: undefined, + nzPlacement: this.dir === 'rtl' ? 'left' : 'right', + nzBodyStyle: { + 'min-height': '100%', + padding: 0 + } + } + }) + .subscribe(); + } + + ngOnInit(): void { + this.dir = this.directionality.value; + this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction: Direction) => { + this.dir = direction; + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/src/app/layout/pro/components/rtl/rtl.component.ts b/src/app/layout/pro/components/rtl/rtl.component.ts new file mode 100644 index 00000000..3b92db96 --- /dev/null +++ b/src/app/layout/pro/components/rtl/rtl.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core'; +import { RTLService } from '@delon/theme'; + +@Component({ + selector: 'layout-pro-rtl', + template: ` + + `, + host: { + '[class.alain-pro__header-item]': 'true' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetRTLComponent { + constructor(public rtl: RTLService) {} + + @HostListener('click') + toggleDirection(): void { + this.rtl.toggle(); + } +} diff --git a/src/app/layout/pro/components/search/search.component.html b/src/app/layout/pro/components/search/search.component.html new file mode 100644 index 00000000..b16ed7ca --- /dev/null +++ b/src/app/layout/pro/components/search/search.component.html @@ -0,0 +1,9 @@ + +
+ +
+ + + {{ item.no }} + + diff --git a/src/app/layout/pro/components/search/search.component.ts b/src/app/layout/pro/components/search/search.component.ts new file mode 100644 index 00000000..6f028f3d --- /dev/null +++ b/src/app/layout/pro/components/search/search.component.ts @@ -0,0 +1,49 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, OnDestroy, ViewChild } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; + +@Component({ + selector: 'layout-pro-search', + templateUrl: 'search.component.html', + host: { + '[class.alain-pro__header-item]': 'true', + '[class.alain-pro__header-search]': 'true', + '[class.alain-pro__header-search-show]': 'show' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetSearchComponent implements OnDestroy { + @ViewChild('ipt', { static: true }) private ipt!: ElementRef; + show = false; + q = ''; + search$ = new Subject(); + list: any[] = []; + + constructor(http: _HttpClient, cdr: ChangeDetectorRef) { + this.search$ + .pipe( + debounceTime(300), + distinctUntilChanged(), + switchMap((q: string) => http.get('/user', { no: q, pi: 1, ps: 5 })) + ) + .subscribe((res: any) => { + this.list = res.list; + cdr.detectChanges(); + }); + } + + onSearch(): void { + this.search$.next(this.ipt.nativeElement.value); + } + + @HostListener('click') + _click(): void { + this.ipt.nativeElement.focus(); + this.show = true; + } + + ngOnDestroy(): void { + this.search$.unsubscribe(); + } +} diff --git a/src/app/layout/pro/components/user/user.component.html b/src/app/layout/pro/components/user/user.component.html new file mode 100644 index 00000000..6d615e26 --- /dev/null +++ b/src/app/layout/pro/components/user/user.component.html @@ -0,0 +1,25 @@ +
+ + {{ settings.user?.realName }} +
+ +
+
+ + 个人中心 +
+ +
  • +
    + + 退出登录 +
    +
    +
    \ No newline at end of file diff --git a/src/app/layout/pro/components/user/user.component.ts b/src/app/layout/pro/components/user/user.component.ts new file mode 100644 index 00000000..9068909a --- /dev/null +++ b/src/app/layout/pro/components/user/user.component.ts @@ -0,0 +1,29 @@ +import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; +import { SettingsService } from '@delon/theme'; + +@Component({ + selector: 'layout-pro-user', + templateUrl: 'user.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProWidgetUserComponent implements OnInit { + constructor(public settings: SettingsService, private router: Router, @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {} + + ngOnInit(): void { + // mock + const token = this.tokenService.get() || { + token: 'nothing', + name: 'Admin', + avatar: './assets/logo-color.svg', + email: 'cipchk@qq.com' + }; + this.tokenService.set(token); + } + + logout(): void { + this.tokenService.clear(); + this.router.navigateByUrl(this.tokenService.login_url!); + } +} diff --git a/src/app/layout/pro/components/widget/widget.component.html b/src/app/layout/pro/components/widget/widget.component.html new file mode 100644 index 00000000..cd3cb9c9 --- /dev/null +++ b/src/app/layout/pro/components/widget/widget.component.html @@ -0,0 +1,24 @@ +客服电话:0755-88393483 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/layout/pro/components/widget/widget.component.ts b/src/app/layout/pro/components/widget/widget.component.ts new file mode 100644 index 00000000..b054f454 --- /dev/null +++ b/src/app/layout/pro/components/widget/widget.component.ts @@ -0,0 +1,20 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { Router } from '@angular/router'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; + +@Component({ + selector: '[layout-pro-header-widget]', + templateUrl: './widget.component.html', + host: { + '[class.alain-pro__header-right]': 'true' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProHeaderWidgetComponent { + constructor(private router: Router, @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {} + + logout(): void { + this.tokenService.clear(); + this.router.navigateByUrl(this.tokenService.login_url!); + } +} diff --git a/src/app/layout/pro/index.md b/src/app/layout/pro/index.md new file mode 100644 index 00000000..764e496b --- /dev/null +++ b/src/app/layout/pro/index.md @@ -0,0 +1 @@ +[Document](https://e.ng-alain.com/theme/pro) diff --git a/src/app/layout/pro/index.ts b/src/app/layout/pro/index.ts new file mode 100644 index 00000000..77f8ba7f --- /dev/null +++ b/src/app/layout/pro/index.ts @@ -0,0 +1,67 @@ +/* eslint-disable import/order */ +// #region exports + +export * from './pro.types'; +export * from './pro.service'; +export * from './pro.component'; + +// #endregion + +// #region widgets + +import { LayoutProFooterComponent } from './components/footer/footer.component'; +import { LayoutProHeaderComponent } from './components/header/header.component'; +import { LayoutProLogoComponent } from './components/logo/logo.component'; +import { LayoutProMenuComponent } from './components/menu/menu.component'; +import { LayoutProWidgetNotifyComponent } from './components/notify/notify.component'; +import { LayoutProWidgetQuickChatStatusComponent } from './components/quick-chat/quick-chat-status.component'; +import { LayoutProWidgetQuickChatComponent } from './components/quick-chat/quick-chat.component'; +import { LayoutProWidgetQuickComponent } from './components/quick/quick.component'; +import { LayoutProWidgetRTLComponent } from './components/rtl/rtl.component'; +import { LayoutProWidgetSearchComponent } from './components/search/search.component'; +import { LayoutProWidgetUserComponent } from './components/user/user.component'; +import { LayoutProHeaderWidgetComponent } from './components/widget/widget.component'; +import { LayoutProWidgetQuickPanelComponent } from './components/quick/quick-panel.component'; +import { ProSettingDrawerComponent } from './setting-drawer/setting-drawer.component'; + +const PRO_WIDGETS = [ + LayoutProHeaderWidgetComponent, + LayoutProWidgetNotifyComponent, + LayoutProWidgetSearchComponent, + LayoutProWidgetUserComponent, + LayoutProWidgetQuickComponent, + LayoutProWidgetQuickChatComponent, + LayoutProWidgetQuickChatStatusComponent, + LayoutProWidgetRTLComponent +]; + +// #endregion + +// #region entry components + +// #endregion + +// #region components + +import { LayoutProComponent } from './pro.component'; + +export const PRO_COMPONENTS: Array> = [ + LayoutProComponent, + LayoutProMenuComponent, + LayoutProLogoComponent, + LayoutProHeaderComponent, + LayoutProFooterComponent, + LayoutProWidgetQuickPanelComponent, + ProSettingDrawerComponent, + ...PRO_WIDGETS +]; + +// #endregion + +// #region shared components + +import { ProPageModule } from './shared/page'; +import { Type } from '@angular/core'; +export const PRO_SHARED_MODULES = [ProPageModule]; + +// #endregion diff --git a/src/app/layout/pro/pro.component.html b/src/app/layout/pro/pro.component.html new file mode 100644 index 00000000..94c8c60b --- /dev/null +++ b/src/app/layout/pro/pro.component.html @@ -0,0 +1,40 @@ + + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    + + +
    + + +
    +
    +
    + + \ No newline at end of file diff --git a/src/app/layout/pro/pro.component.ts b/src/app/layout/pro/pro.component.ts new file mode 100644 index 00000000..983b2377 --- /dev/null +++ b/src/app/layout/pro/pro.component.ts @@ -0,0 +1,167 @@ +import { BreakpointObserver, MediaMatcher } from '@angular/cdk/layout'; +import { DOCUMENT } from '@angular/common'; +import { + AfterViewInit, + Component, + ComponentFactoryResolver, + Inject, + OnDestroy, + OnInit, + Renderer2, + ViewChild, + ViewContainerRef +} from '@angular/core'; +import { NavigationEnd, NavigationError, RouteConfigLoadStart, Router } from '@angular/router'; +import { ReuseTabService } from '@delon/abc/reuse-tab'; +import { RTL, RTLService } from '@delon/theme'; +import { ScrollService, updateHostClass } from '@delon/util/browser'; +import { environment } from '@env/environment'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { BrandService } from './pro.service'; +import { ProSettingDrawerComponent } from './setting-drawer/setting-drawer.component'; + +@Component({ + selector: 'layout-pro', + templateUrl: './pro.component.html' + // NOTICE: If all pages using OnPush mode, you can turn it on and all `cdr.detectChanges()` codes + // changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LayoutProComponent implements OnInit, AfterViewInit, OnDestroy { + private destroy$ = new Subject(); + private queryCls?: string; + @ViewChild('settingHost', { read: ViewContainerRef, static: false }) private settingHost!: ViewContainerRef; + + isFetching = false; + + get isMobile(): boolean { + return this.pro.isMobile; + } + + get getLayoutStyle(): { [key: string]: string } | null { + const { isMobile, fixSiderbar, collapsed, menu, width, widthInCollapsed } = this.pro; + if (fixSiderbar && menu !== 'top' && !isMobile) { + return { + [this.rtl.dir === RTL ? 'paddingRight' : 'paddingLeft']: `${collapsed ? widthInCollapsed : width}px` + }; + } + return null; + } + + get getContentStyle(): { [key: string]: string } { + const { fixedHeader, headerHeight } = this.pro; + return { + margin: '24px 24px 0', + 'padding-top': `${fixedHeader ? headerHeight : 0}px` + }; + } + + private get body(): HTMLElement { + return this.doc.body; + } + + constructor( + bm: BreakpointObserver, + mediaMatcher: MediaMatcher, + router: Router, + msg: NzMessageService, + scroll: ScrollService, + reuseTabSrv: ReuseTabService, + private resolver: ComponentFactoryResolver, + private renderer: Renderer2, + public pro: BrandService, + @Inject(DOCUMENT) private doc: any, + // private cdr: ChangeDetectorRef + private rtl: RTLService + ) { + // scroll to top in change page + router.events.pipe(takeUntil(this.destroy$)).subscribe(evt => { + if (!this.isFetching && evt instanceof RouteConfigLoadStart) { + this.isFetching = true; + scroll.scrollToTop(); + } + if (evt instanceof NavigationError) { + this.isFetching = false; + msg.error(`无法加载${evt.url}路由`, { nzDuration: 1000 * 3 }); + return; + } + if (!(evt instanceof NavigationEnd)) { + return; + } + this.isFetching = false; + // If have already cached router, should be don't need scroll to top + if (!reuseTabSrv.exists(evt.url)) { + scroll.scrollToTop(); + } + }); + + // media + const query: { [key: string]: string } = { + 'screen-xs': '(max-width: 575px)', + 'screen-sm': '(min-width: 576px) and (max-width: 767px)', + 'screen-md': '(min-width: 768px) and (max-width: 991px)', + 'screen-lg': '(min-width: 992px) and (max-width: 1199px)', + 'screen-xl': '(min-width: 1200px)' + }; + bm.observe([ + '(min-width: 1200px)', + '(min-width: 992px) and (max-width: 1199px)', + '(min-width: 768px) and (max-width: 991px)', + '(min-width: 576px) and (max-width: 767px)', + '(max-width: 575px)' + ]).subscribe(() => { + this.queryCls = Object.keys(query).find(key => mediaMatcher.matchMedia(query[key]).matches); + this.setClass(); + }); + } + + private setClass(): void { + const { body, renderer, queryCls, pro } = this; + updateHostClass(body, renderer, { + ['color-weak']: pro.layout.colorWeak, + [`layout-fixed`]: pro.layout.fixed, + [`aside-collapsed`]: pro.collapsed, + ['alain-pro']: true, + [queryCls!]: true, + [`alain-pro__content-${pro.layout.contentWidth}`]: true, + [`alain-pro__fixed`]: pro.layout.fixedHeader, + [`alain-pro__wide`]: pro.isFixed, + [`alain-pro__dark`]: pro.theme === 'dark', + [`alain-pro__light`]: pro.theme === 'light', + [`alain-pro__menu-side`]: pro.isSideMenu, + [`alain-pro__menu-top`]: pro.isTopMenu + }); + } + + ngAfterViewInit(): void { + // Setting componet for only developer + if (!environment.production) { + setTimeout(() => { + const settingFactory = this.resolver.resolveComponentFactory(ProSettingDrawerComponent); + this.settingHost.createComponent(settingFactory); + }, 22); + } + } + + ngOnInit(): void { + const { pro, destroy$ } = this; + pro.notify.pipe(takeUntil(destroy$)).subscribe(() => { + this.setClass(); + }); + } + + ngOnDestroy(): void { + const { destroy$, body, pro } = this; + destroy$.next(); + destroy$.complete(); + body.classList.remove( + `alain-pro__content-${pro.layout.contentWidth}`, + `alain-pro__fixed`, + `alain-pro__wide`, + `alain-pro__dark`, + `alain-pro__light` + ); + } +} diff --git a/src/app/layout/pro/pro.service.ts b/src/app/layout/pro/pro.service.ts new file mode 100644 index 00000000..ba597366 --- /dev/null +++ b/src/app/layout/pro/pro.service.ts @@ -0,0 +1,139 @@ +import { BreakpointObserver } from '@angular/cdk/layout'; +import { Injectable } from '@angular/core'; +import { Layout, SettingsService } from '@delon/theme'; +import { environment } from '@env/environment'; +import { BehaviorSubject, Observable } from 'rxjs'; + +import { ProLayout, ProLayoutContentWidth, ProLayoutMenu, ProLayoutTheme } from './pro.types'; + +@Injectable({ providedIn: 'root' }) +export class BrandService { + private notify$ = new BehaviorSubject(null); + private _isMobile = false; + + // #region fields + + get notify(): Observable { + return this.notify$.asObservable(); + } + + /** + * Specify width of the sidebar, If you change it, muse be synchronize change less parameter: + * ```less + * @alain-pro-sider-menu-width: 256px; + * ``` + */ + readonly width = 205; + + /** + * Specify width of the sidebar after collapsed, If you change it, muse be synchronize change less parameter: + * ```less + * @menu-collapsed-width: 80px; + * ``` + */ + readonly widthInCollapsed = 80; + + /** + * Specify height of the header, If you change it, muse be synchronize change less parameter: + * ```less + * @alain-pro-header-height: 64px; + * ``` + */ + readonly headerHeight = 64; + + /** + * Specify distance from top for automatically hidden header + */ + readonly autoHideHeaderTop = 300; + + get isMobile(): boolean { + return this._isMobile; + } + + get layout(): ProLayout { + return this.settings.layout as ProLayout; + } + + get collapsed(): boolean { + return this.layout.collapsed; + } + + get theme(): ProLayoutTheme { + return this.layout.theme; + } + + get menu(): ProLayoutMenu { + return this.layout.menu; + } + + get contentWidth(): ProLayoutContentWidth { + return this.layout.contentWidth; + } + + get fixedHeader(): boolean { + return this.layout.fixedHeader; + } + + get autoHideHeader(): boolean { + return this.layout.autoHideHeader; + } + + get fixSiderbar(): boolean { + return this.layout.fixSiderbar; + } + + get onlyIcon(): boolean { + return this.menu === 'side' ? false : this.layout.onlyIcon; + } + + /** Whether the top menu */ + get isTopMenu(): boolean { + return this.menu === 'top' && !this.isMobile; + } + + /** Whether the side menu */ + get isSideMenu(): boolean { + return this.menu === 'side' && !this.isMobile; + } + + /** Whether the fixed content */ + get isFixed(): boolean { + return this.contentWidth === 'fixed'; + } + + // #endregion + + constructor(bm: BreakpointObserver, private settings: SettingsService) { + // fix layout data + settings.setLayout({ + theme: 'dark', + menu: 'side', + contentWidth: 'fluid', + fixedHeader: false, + autoHideHeader: false, + fixSiderbar: false, + onlyIcon: true, + ...(environment as any).pro, + ...settings.layout // Browser cache + }); + + const mobileMedia = 'only screen and (max-width: 767.99px)'; + bm.observe(mobileMedia).subscribe(state => this.checkMedia(state.matches)); + this.checkMedia(bm.isMatched(mobileMedia)); + } + + private checkMedia(value: boolean): void { + this._isMobile = value; + this.layout.collapsed = this._isMobile; + this.notify$.next('mobile'); + } + + setLayout(name: string | Layout, value?: any): void { + this.settings.setLayout(name, value); + this.notify$.next('layout'); + } + + setCollapsed(status?: boolean): void { + this.setLayout('collapsed', typeof status !== 'undefined' ? status : !this.collapsed); + } +} diff --git a/src/app/layout/pro/pro.types.ts b/src/app/layout/pro/pro.types.ts new file mode 100644 index 00000000..446a4e88 --- /dev/null +++ b/src/app/layout/pro/pro.types.ts @@ -0,0 +1,43 @@ +import { Layout, MenuInner } from '@delon/theme'; + +export type ProLayoutTheme = 'light' | 'dark'; +export type ProLayoutMenu = 'side' | 'top'; +export type ProLayoutContentWidth = 'fluid' | 'fixed'; + +export interface ProLayout extends Layout { + theme: ProLayoutTheme; + /** + * menu position + */ + menu: ProLayoutMenu; + /** + * layout of content, only works when menu is top + */ + contentWidth: ProLayoutContentWidth; + /** + * sticky header + */ + fixedHeader: boolean; + /** + * auto hide header + */ + autoHideHeader: boolean; + /** + * sticky siderbar + */ + fixSiderbar: boolean; + /** + * Only icon of menu + * Limited to a temporary solution [#2183](https://github.com/NG-ZORRO/ng-zorro-antd/issues/2183) + */ + onlyIcon: boolean; + /** + * Color weak + */ + colorWeak: boolean; +} + +export interface ProMenu extends MenuInner { + _parent?: ProMenu | null; + children?: ProMenu[]; +} diff --git a/src/app/layout/pro/setting-drawer/setting-drawer.component.html b/src/app/layout/pro/setting-drawer/setting-drawer.component.html new file mode 100644 index 00000000..000f9930 --- /dev/null +++ b/src/app/layout/pro/setting-drawer/setting-drawer.component.html @@ -0,0 +1,83 @@ + +
    +
    +

    整体风格设置

    +
    +
    + {{ t.key }} +
    + +
    +
    +
    +
    +
    +

    主题色

    + + + +
    + +
    +

    导航模式

    +
    +
    + {{ t.key }} +
    + +
    +
    +
    +
    + 内容区域宽度 + + + + +
    +
    + 固定 Header + +
    +
    + 下滑时隐藏 Header + +
    +
    + 固定侧边菜单 + +
    +
    + 只显示图标 + +
    +
    + +
    +

    其他设置

    +
    + 色弱模式 + +
    +
    + + + +
    +
    +
    + +
    \ No newline at end of file diff --git a/src/app/layout/pro/setting-drawer/setting-drawer.component.ts b/src/app/layout/pro/setting-drawer/setting-drawer.component.ts new file mode 100644 index 00000000..7423f040 --- /dev/null +++ b/src/app/layout/pro/setting-drawer/setting-drawer.component.ts @@ -0,0 +1,240 @@ +import { Direction, Directionality } from '@angular/cdk/bidi'; +import { DOCUMENT } from '@angular/common'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, NgZone, OnDestroy, OnInit, Optional } from '@angular/core'; +import { copy, LazyService } from '@delon/util'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { BrandService } from '../pro.service'; +import { ProLayout } from '../pro.types'; + +@Component({ + selector: 'pro-setting-drawer', + templateUrl: './setting-drawer.component.html', + preserveWhitespaces: false, + host: { + '[class.setting-drawer]': 'true', + '[class.setting-drawer-rtl]': `dir === 'rtl'` + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProSettingDrawerComponent implements OnInit, OnDestroy { + private loadedLess = false; + private destroy$ = new Subject(); + + get layout(): ProLayout { + return this.brand.layout; + } + + collapse = false; + dir: Direction = 'ltr'; + + themes = [ + { + key: 'dark', + title: '暗色菜单风格', + img: 'https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg' + }, + { + key: 'light', + title: '亮色菜单风格', + img: 'https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg' + } + ]; + + color = '#2F54EB'; + colors = [ + { + key: '薄暮', + color: '#F5222D' + }, + { + key: '火山', + color: '#FA541C' + }, + { + key: '日暮', + color: '#FAAD14' + }, + { + key: '明青', + color: '#13C2C2' + }, + { + key: '极光绿', + color: '#52C41A' + }, + { + key: '拂晓蓝(默认)', + color: '#1890ff' + }, + { + key: '极客蓝', + color: '#2F54EB' + }, + { + key: '酱紫', + color: '#722ED1' + } + ]; + + menuModes = [ + { + key: 'side', + title: '侧边菜单布局', + img: 'https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg' + }, + { + key: 'top', + title: '顶部菜单布局', + img: 'https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg' + } + ]; + + contentWidths = [ + { + key: 'fixed', + title: '定宽', + disabled: false + }, + { + key: 'fluid', + title: '流式', + disabled: false + } + ]; + + constructor( + public brand: BrandService, + private cdr: ChangeDetectorRef, + private msg: NzMessageService, + private lazy: LazyService, + private zone: NgZone, + @Inject(DOCUMENT) private doc: any, + @Optional() private directionality: Directionality + ) { + this.setLayout('menu', this.brand.menu, false); + } + + ngOnInit(): void { + this.dir = this.directionality.value; + this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction: Direction) => { + this.dir = direction; + this.cdr.detectChanges(); + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + private loadLess(): Promise { + if (this.loadedLess) { + return Promise.resolve(); + } + return this.lazy + .loadStyle('./assets/color.less', 'stylesheet/less') + .then(() => { + const lessConfigNode = this.doc.createElement('script'); + lessConfigNode.innerHTML = ` + window.less = { + async: true, + env: 'production', + javascriptEnabled: true + }; + `; + this.doc.body.appendChild(lessConfigNode); + }) + .then(() => this.lazy.loadScript('https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js')) + .then(() => { + this.loadedLess = true; + }); + } + + private runLess(): void { + const { color, zone, msg, cdr: cd } = this; + const msgId = msg.loading(`正在编译主题!`, { nzDuration: 0 }).messageId; + setTimeout(() => { + zone.runOutsideAngular(() => { + this.loadLess().then(() => { + (window as any).less + .modifyVars({ + [`@primary-color`]: color + }) + .then(() => { + msg.success('成功'); + msg.remove(msgId); + zone.run(() => cd.detectChanges()); + }); + }); + }); + }, 200); + } + + toggle(): void { + this.collapse = !this.collapse; + } + + changeColor(color: string): void { + this.color = color; + this.runLess(); + } + + setLayout(name: string, value: any, cd: boolean = true): void { + switch (name) { + case 'menu': + const isTop = value === 'top'; + this.contentWidths.find(w => w.key === 'fixed')!.disabled = !isTop; + const newLayout = { + ...this.brand.layout, + contentWidth: isTop ? 'fixed' : 'fluid', + onlyIcon: isTop, + collapsed: isTop && !this.brand.isMobile ? false : this.brand.layout.collapsed + }; + this.brand.setLayout(newLayout); + break; + case 'fixedHeader': + this.brand.setLayout('autoHideHeader', false); + break; + default: + break; + } + this.brand.setLayout(name, value); + if (cd) { + setTimeout(() => { + // Re-render G2 muse be trigger window resize + window.dispatchEvent(new Event('resize')); + this.cdr.markForCheck(); + }); + } + } + + copy(): void { + const { color, layout } = this; + const vars: { [key: string]: string } = { + [`@primary-color`]: color + }; + const colorVars = Object.keys(vars) + .map(key => `${key}: ${vars[key]};`) + .join('\n'); + const layoutVars = Object.keys(layout) + .filter( + key => ~['theme', 'menu', 'contentWidth', 'fixedHeader', 'autoHideHeader', 'fixSiderbar', 'colorWeak', 'onlyIcon'].indexOf(key) + ) + .map(key => { + const value = layout[key]; + if (typeof value === 'boolean') { + return ` ${key}: ${value},`; + } else { + return ` ${key}: '${value}',`; + } + }) + .join('\n'); + copy( + `在 [src/styles/theme.less] 配置以下:\n{{colorVars}}\n\n在 [src/environments/*] 的 pro 配置以下:\nexport const environment = {\n ...\n pro: {\n{{layoutVars}}\n }\n}` + ); + this.msg.success(`拷贝成功,请根据剪切板内容进行替换`); + } +} diff --git a/src/app/layout/pro/shared/page/index.ts b/src/app/layout/pro/shared/page/index.ts new file mode 100644 index 00000000..d2b48060 --- /dev/null +++ b/src/app/layout/pro/shared/page/index.ts @@ -0,0 +1,3 @@ +export * from './page-grid.component'; +export * from './page-header-wrapper.component'; +export * from './page.module'; diff --git a/src/app/layout/pro/shared/page/page-grid.component.html b/src/app/layout/pro/shared/page/page-grid.component.html new file mode 100644 index 00000000..5f69a5e3 --- /dev/null +++ b/src/app/layout/pro/shared/page/page-grid.component.html @@ -0,0 +1,4 @@ + +
    + +
    diff --git a/src/app/layout/pro/shared/page/page-grid.component.ts b/src/app/layout/pro/shared/page/page-grid.component.ts new file mode 100644 index 00000000..e5312719 --- /dev/null +++ b/src/app/layout/pro/shared/page/page-grid.component.ts @@ -0,0 +1,80 @@ +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + Inject, + Input, + OnDestroy, + Optional, + Renderer2 +} from '@angular/core'; +import { ReuseTabService } from '@delon/abc/reuse-tab'; +import { TitleService } from '@delon/theme'; +import { BooleanInput, InputBoolean } from '@delon/util'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { BrandService } from '../../pro.service'; + +@Component({ + selector: 'page-grid', + templateUrl: './page-grid.component.html', + host: { + '[class.alain-pro__page-grid]': 'true', + '[class.alain-pro__page-grid-no-spacing]': 'noSpacing', + '[class.alain-pro__page-grid-wide]': 'isFixed' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProPageGridComponent implements AfterViewInit, OnDestroy { + static ngAcceptInputType_loading: BooleanInput; + static ngAcceptInputType_noSpacing: BooleanInput; + + private unsubscribe$ = new Subject(); + + @Input() @InputBoolean() loading = false; + @Input() @InputBoolean() noSpacing = false; + @Input() style: NzSafeAny; + @Input() + set title(value: string) { + if (value) { + if (this.titleSrv) { + this.titleSrv.setTitle(value); + } + if (this.reuseSrv) { + this.reuseSrv.title = value; + } + } + } + + get isFixed(): boolean { + return this.pro.isFixed; + } + + constructor( + private el: ElementRef, + private rend: Renderer2, + private pro: BrandService, + @Optional() @Inject(TitleService) private titleSrv: TitleService, + @Optional() @Inject(ReuseTabService) private reuseSrv: ReuseTabService, + private cdr: ChangeDetectorRef + ) {} + + ngAfterViewInit(): void { + if (this.style) { + Object.keys(this.style).forEach((key: string) => { + this.rend.setStyle(this.el.nativeElement, key, this.style[key]); + }); + } + this.pro.notify.pipe(takeUntil(this.unsubscribe$)).subscribe(() => this.cdr.markForCheck()); + } + + ngOnDestroy(): void { + const { unsubscribe$ } = this; + unsubscribe$.next(); + unsubscribe$.complete(); + } +} diff --git a/src/app/layout/pro/shared/page/page-header-wrapper.component.html b/src/app/layout/pro/shared/page/page-header-wrapper.component.html new file mode 100644 index 00000000..b81e1ab9 --- /dev/null +++ b/src/app/layout/pro/shared/page/page-header-wrapper.component.html @@ -0,0 +1,26 @@ + + + +
    + + + +
    +
    diff --git a/src/app/layout/pro/shared/page/page-header-wrapper.component.ts b/src/app/layout/pro/shared/page/page-header-wrapper.component.ts new file mode 100644 index 00000000..0489ca1f --- /dev/null +++ b/src/app/layout/pro/shared/page/page-header-wrapper.component.ts @@ -0,0 +1,74 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, TemplateRef } from '@angular/core'; +import { AlainConfigService, BooleanInput, InputBoolean } from '@delon/util'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { BrandService } from '../../pro.service'; + +@Component({ + selector: 'page-header-wrapper', + templateUrl: './page-header-wrapper.component.html', + host: { + '[class.alain-pro__page-header-wrapper]': 'true' + }, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProPageHeaderWrapperComponent implements AfterViewInit, OnDestroy { + static ngAcceptInputType_loading: BooleanInput; + static ngAcceptInputType_autoBreadcrumb: BooleanInput; + static ngAcceptInputType_autoTitle: BooleanInput; + static ngAcceptInputType_syncTitle: BooleanInput; + static ngAcceptInputType_noSpacing: BooleanInput; + + private unsubscribe$ = new Subject(); + + // #region page-header fields + + @Input() title!: string | null | TemplateRef; + @Input() @InputBoolean() loading = false; + @Input() home!: string; + @Input() homeLink!: string; + @Input() homeI18n!: string; + /** + * 自动生成导航,以当前路由从主菜单中定位 + */ + @Input() @InputBoolean() autoBreadcrumb = true; + /** + * 自动生成标题,以当前路由从主菜单中定位 + */ + @Input() @InputBoolean() autoTitle = true; + /** + * 是否自动将标题同步至 `TitleService`、`ReuseService` 下,仅 `title` 为 `string` 类型时有效 + */ + @Input() @InputBoolean() syncTitle = true; + @Input() breadcrumb!: TemplateRef; + @Input() logo!: TemplateRef; + @Input() action!: TemplateRef; + @Input() content!: TemplateRef; + @Input() extra!: TemplateRef; + @Input() tab!: TemplateRef; + @Input() phContent!: TemplateRef; + // #endregion + + // #region fields + + @Input() top!: TemplateRef; + @Input() @InputBoolean() noSpacing = false; + @Input() style?: {}; + + // #endregion + + constructor(public pro: BrandService, cog: AlainConfigService, private cdr: ChangeDetectorRef) { + cog.attach(this, 'pageHeader', { syncTitle: true }); + } + + ngAfterViewInit(): void { + this.pro.notify.pipe(takeUntil(this.unsubscribe$)).subscribe(() => this.cdr.markForCheck()); + } + + ngOnDestroy(): void { + const { unsubscribe$ } = this; + unsubscribe$.next(); + unsubscribe$.complete(); + } +} diff --git a/src/app/layout/pro/shared/page/page.module.ts b/src/app/layout/pro/shared/page/page.module.ts new file mode 100644 index 00000000..8d712740 --- /dev/null +++ b/src/app/layout/pro/shared/page/page.module.ts @@ -0,0 +1,16 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { PageHeaderModule } from '@delon/abc/page-header'; +import { NzSpinModule } from 'ng-zorro-antd/spin'; + +import { ProPageGridComponent } from './page-grid.component'; +import { ProPageHeaderWrapperComponent } from './page-header-wrapper.component'; + +const COMPONENTS = [ProPageGridComponent, ProPageHeaderWrapperComponent]; + +@NgModule({ + imports: [CommonModule, NzSpinModule, PageHeaderModule], + declarations: COMPONENTS, + exports: COMPONENTS +}) +export class ProPageModule {} diff --git a/src/app/layout/pro/styles/app/_content.less b/src/app/layout/pro/styles/app/_content.less new file mode 100644 index 00000000..00684ab1 --- /dev/null +++ b/src/app/layout/pro/styles/app/_content.less @@ -0,0 +1,58 @@ +@{alain-pro-prefix} { + &__main { + min-height: 100vh; + background-color: @alain-pro-main-bg; + + > .ant-layout-header { + height: @alain-pro-header-height; + line-height: @alain-pro-header-height; + } + + .router-ant(); + } + + &__page { + &-header { + &-wrapper { + position: relative; + display: block; + margin: -@alain-pro-content-margin -@alain-pro-content-margin 0; + } + &-content { + margin: @alain-pro-content-margin @alain-pro-content-margin 0; + } + } + &-grid { + display: block; + width: 100%; + height: 100%; + min-height: 100%; + transition: 0.3s; + &-wide { + max-width: @alain-pro-wide; + margin: 0 auto; + } + &-no-spacing { + width: initial; + margin: -@alain-pro-content-margin -@alain-pro-content-margin 0; + } + } + } +} + +@{alain-pro-prefix}__fetching { + &-icon { + display: none; + } + & { + @{alain-pro-prefix}__fetching-icon { + display: block; + } + } +} + +@media screen and (max-width: @mobile-max) { + @{alain-pro-prefix}__page-header-content { + margin: @alain-pro-content-margin 10px 0; + } +} diff --git a/src/app/layout/pro/styles/app/_footer.less b/src/app/layout/pro/styles/app/_footer.less new file mode 100644 index 00000000..fe2b6742 --- /dev/null +++ b/src/app/layout/pro/styles/app/_footer.less @@ -0,0 +1,3 @@ +@{alain-pro-prefix}__footer { + padding: 0; +} diff --git a/src/app/layout/pro/styles/app/_header.less b/src/app/layout/pro/styles/app/_header.less new file mode 100644 index 00000000..30c81384 --- /dev/null +++ b/src/app/layout/pro/styles/app/_header.less @@ -0,0 +1,104 @@ +@header-prefix: ~'@{alain-pro-prefix}__header'; + +@{header-prefix} { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: space-between; + height: @alain-pro-header-height; + padding: 0 12px 0 0; + background: @alain-pro-header-bg; + box-shadow: @alain-pro-header-box-shadow; + &-logo { + padding: 0 24px; + } + &-right { + display: flex; + align-items: center; + justify-items: center; + } + &-item { + position: relative; + display: flex; + align-items: center; + justify-items: center; + height: @alain-pro-header-height; + padding: 0 12px; + line-height: @alain-pro-header-height; + cursor: pointer; + transition: all 0.3s; + > i, + &-icon { + // fix dropdown + font-size: @alain-pro-header-widgets-icon-fs !important; + transform: none !important; + } + &, + &-icon { + color: @alain-pro-header-color; + } + &:hover { + background: @alain-pro-header-hover-bg; + &, + @{header-prefix}-item-icon { + color: @alain-pro-header-hover-color; + } + } + } + &-trigger { + padding: 0 24px; + @{header-prefix}-item-icon { + font-size: 20px !important; + } + } + &-search { + &:hover { + background: transparent; + } + } + &-fixed { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width 0.2s; + } + &-hide { + opacity: 0; + transition: opacity 0.2s; + } +} + +@media only screen and (max-width: @mobile-max) { + @{header-prefix} { + &-name { + display: none; + } + &-trigger { + padding: 0 12px; + } + &-logo { + position: relative; + padding-right: 12px; + padding-left: 12px; + } + } +} + +layout-pro-header { + z-index: 1; +} + +.layout-pro-header-rtl-mixin(@enabled) when(@enabled=true) { + [dir='rtl'] { + @{header-prefix} { + &-fixed { + right: inherit; + left: 0; + } + } + } +} +.layout-pro-header-rtl-mixin(@rtl-enabled); diff --git a/src/app/layout/pro/styles/app/_menu.less b/src/app/layout/pro/styles/app/_menu.less new file mode 100644 index 00000000..4f548617 --- /dev/null +++ b/src/app/layout/pro/styles/app/_menu.less @@ -0,0 +1,68 @@ +@{alain-pro-prefix} { + &__menu { + display: block; + &-item { + &--disabled { + pointer-events: none; + } + } + &-only-icon { + @{alain-pro-prefix}__menu-item { + padding-right: 8px !important; + padding-left: 8px !important; + &:first-child { + padding-left: 0; + } + } + @{alain-pro-prefix}__menu-icon { + margin-right: 0; + font-size: @alain-pro-top-nav-only-icon-fs; + } + } + &-title { + position: relative; + &-badge { + display: flex; + justify-content: center; + width: 18px; + height: 18px; + padding: 0; + font-size: 12px; + line-height: 18px; + background: @alain-pro-header-title-badge-bg; + border-radius: 50%; + > em { + color: @alain-pro-header-title-badge-color; + font-style: normal; + } + } + } + &-img { + width: @alain-pro-sider-menu-img-wh !important; + height: @alain-pro-sider-menu-img-wh !important; + } + } + &__side-nav { + @{alain-pro-prefix}__menu { + &-title { + display: flex; + align-items: center; + &-text { + flex: 1; + } + } + } + .@{ant-prefix}-menu-inline-collapsed { + @{alain-pro-prefix}__menu-title-badge { + position: absolute; + top: 0; + right: -16px; + width: 8px; + height: 8px; + > em { + display: none; + } + } + } + } +} diff --git a/src/app/layout/pro/styles/app/_sider.less b/src/app/layout/pro/styles/app/_sider.less new file mode 100644 index 00000000..4353cc66 --- /dev/null +++ b/src/app/layout/pro/styles/app/_sider.less @@ -0,0 +1,148 @@ +@sider-prefix: ~'@{alain-pro-prefix}__sider'; + +@{sider-prefix} { + position: relative; + z-index: 10; + display: block; + min-height: 100vh; + overflow: hidden; + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + &-logo { + position: relative; + display: block; + height: @alain-pro-header-height; + padding-left: ((@menu-collapsed-width - 32px) / 2); + overflow: hidden; + line-height: @alain-pro-header-height; + background: @alain-pro-header-logo-bg; + transition: all 0.3s; + img { + display: inline-block; + height: 32px; + vertical-align: middle; + } + h1 { + display: inline-block; + margin: 0 0 0 12px; + color: white; + font-weight: 600; + font-size: @alain-pro-logo-font-size; + font-family: @alain-pro-logo-font-family; + vertical-align: middle; + transition: all 0.3s; + } + } + &-fixed { + position: fixed; + top: 0; + left: 0; + @{alain-pro-prefix}__side-nav-wrap { + height: ~'calc(100vh - @{alain-pro-header-height})'; + padding-bottom: 24px; + overflow-y: scroll; + } + } +} + +// 小屏幕 drawer 配置信息 +@{alain-pro-prefix}__drawer { + .@{ant-prefix}-drawer { + &-wrapper-body { + height: 100%; + overflow: auto; + } + &-body { + height: 100vh; + padding: 0; + overflow-x: hidden; + } + } +} + +// 当缩进时隐藏站点名称 +@{aside-collapsed-prefix} { + @{sider-prefix}-logo { + display: flex; + justify-content: center; + padding: 0; + h1 { + display: none; + } + } +} + +@{alain-pro-prefix}__light { + @{sider-prefix} { + background-color: @alain-pro-light-color; + box-shadow: @alain-pro-light-slider-shadow; + &-logo { + background: @alain-pro-light-color; + box-shadow: 1px 1px 0 0 @border-color-split; + h1 { + color: @primary-color; + } + } + .@{ant-prefix}-menu-light { + border-right-color: transparent; + } + } +} + +.alain-pro-sider-fixed-scroll-mixin(@mode) when(@mode='show') { + .scrollbar-mixin(~'@{ider-prefix}-fixed @{alain-pro-prefix}__side-nav-wrap'); +} + +.alain-pro-sider-fixed-scroll-mixin(@mode) when(@mode='hide') { + @{sider-prefix}-fixed @{alain-pro-prefix}__side-nav-wrap { + -webkit-overflow-scrolling: touch; + // IE + -ms-scroll-chaining: chained; + -ms-content-zooming: zoom; + -ms-scroll-rails: none; + -ms-content-zoom-limit-min: 100%; + -ms-content-zoom-limit-max: 500%; + -ms-scroll-snap-type: proximity; + -ms-scroll-snap-points-x: snaplist(100%, 200%, 300%, 400%, 500%); + -ms-overflow-style: none; + // Firefox + scrollbar-width: none; + // Chrome + &::-webkit-scrollbar { + width: @alain-pro-sider-scrollbar-height; + height: @alain-pro-sider-scrollbar-width; + } + &::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 @alain-pro-sider-scrollbar-width @alain-pro-sider-scrollbar-track-color; + } + &::-webkit-scrollbar-thumb { + background-color: @alain-pro-sider-scrollbar-thumb-color; + } + } +} + +.alain-pro-sider-fixed-scroll-mixin(@alain-pro-sider-fixed-scroll-mode); + +.layout-pro-sider-rtl-mixin(@enabled) when(@enabled=true) { + [dir='rtl'] { + @{sider-prefix} { + &-logo { + padding-right: ((@menu-collapsed-width - 32px) / 2); + padding-left: 0; + h1 { + margin-right: 12px; + margin-left: 0; + } + } + &-fixed { + right: 0; + left: inherit; + } + } + @{aside-collapsed-prefix} { + @{sider-prefix}-logo { + padding: 0; + } + } + } +} +.layout-pro-sider-rtl-mixin(@rtl-enabled); diff --git a/src/app/layout/pro/styles/app/_top-nav.less b/src/app/layout/pro/styles/app/_top-nav.less new file mode 100644 index 00000000..bf2147b8 --- /dev/null +++ b/src/app/layout/pro/styles/app/_top-nav.less @@ -0,0 +1,101 @@ +@top-nav-prefix: ~'@{alain-pro-prefix}__top-nav'; + +@{top-nav-prefix} { + position: relative; + width: 100%; + height: @alain-pro-header-height; + padding: 0 12px 0 0; + box-shadow: @alain-pro-header-box-shadow; + transition: background 0.3s, width 0.2s; + @{alain-pro-prefix}__menu { + .@{ant-prefix}-menu { + display: flex; + align-items: center; + height: @alain-pro-header-height; + border: none; + } + &-wrap { + flex: 1; + padding-right: 8px; + } + &-item { + height: 100%; + .@{ant-prefix}-menu-submenu-title { + height: 100%; + padding: 0 12px; + } + } + } + &-main { + display: flex; + height: @alain-pro-header-height; + padding-left: 24px; + &-wide { + max-width: @alain-pro-wide; + margin: auto; + padding-left: 4px; + } + &-left { + display: flex; + flex: 1; + } + } + &-logo { + width: 165px; + h1 { + margin: 0 0 0 12px; + color: #fff; + font-size: 16px; + } + } + @{alain-pro-prefix}__menu-title-badge { + position: absolute; + top: -16px; + right: -16px; + } +} + +@{alain-pro-prefix} { + &__dark { + @{top-nav-prefix} { + @{alain-pro-prefix}__header-item { + &, + &-icon { + color: @menu-dark-color; + } + &:hover, + .@{ant-prefix}-popover-open { + background: @menu-dark-item-active-bg; + @{alain-pro-prefix}__header-item { + &, + &-icon { + color: @menu-dark-highlight-color; + } + } + } + } + } + } + &__light { + @{top-nav-prefix} { + background-color: #fff; + h1 { + color: #002140; + } + } + } +} + +.layout-pro-top-nav-rtl-mixin(@enabled) when(@enabled=true) { + [dir='rtl'] { + @{top-nav-prefix} { + &-logo { + h1 { + margin-right: 12px; + margin-left: 0; + } + } + } + } +} +.layout-pro-top-nav-rtl-mixin(@rtl-enabled); diff --git a/src/app/layout/pro/styles/app/fix/_antd.less b/src/app/layout/pro/styles/app/fix/_antd.less new file mode 100644 index 00000000..42f15507 --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/_antd.less @@ -0,0 +1,6 @@ +@layout-body-background: #f8f8f8; + +// Remoed card transition +.@{ant-prefix}-card { + transition: none; +} diff --git a/src/app/layout/pro/styles/app/fix/_btn.less b/src/app/layout/pro/styles/app/fix/_btn.less new file mode 100644 index 00000000..e8747b94 --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/_btn.less @@ -0,0 +1,5 @@ +.btn-flat { + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; +} diff --git a/src/app/layout/pro/styles/app/fix/_delon.less b/src/app/layout/pro/styles/app/fix/_delon.less new file mode 100644 index 00000000..46632446 --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/_delon.less @@ -0,0 +1,55 @@ +@{header-prefix}-item { + .@{ant-prefix}-badge-count { + position: absolute; + top: 24px; + right: 12px; + } +} + +// full-content component +@{full-content-prefix} { + &__opened { + layout-pro-header, + @{alain-pro-prefix}__sider, + reuse-tab { + display: none !important; + } + } + &__hidden-title { + page-header { + display: none !important; + } + } +} + +// footer-toolbar component +@{footer-toolbar-prefix} { + z-index: 99; + width: auto; + &__body { + @{alain-pro-prefix}__body { + margin-bottom: @layout-gutter + @footer-toolbar-height !important; + } + } +} +@{alain-pro-prefix}__menu-side { + @{footer-toolbar-prefix} { + left: @alain-pro-sider-menu-width; + } +} +@{alain-pro-prefix}__menu-top { + @{footer-toolbar-prefix} { + left: 0; + } +} + +@{aside-collapsed-prefix} { + @{footer-toolbar-prefix} { + left: @menu-collapsed-width; + } +} + +@{page-header-prefix} { + padding-right: @alain-pro-content-margin; + padding-left: @alain-pro-content-margin; +} diff --git a/src/app/layout/pro/styles/app/fix/_menu.less b/src/app/layout/pro/styles/app/fix/_menu.less new file mode 100644 index 00000000..84765e75 --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/_menu.less @@ -0,0 +1,3 @@ +.@{ant-prefix}-dropdown-menu-item { + outline: none; +} diff --git a/src/app/layout/pro/styles/app/fix/_print.less b/src/app/layout/pro/styles/app/fix/_print.less new file mode 100644 index 00000000..4811f8df --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/_print.less @@ -0,0 +1,3 @@ +@page { + size: a3; +} diff --git a/src/app/layout/pro/styles/app/fix/index.less b/src/app/layout/pro/styles/app/fix/index.less new file mode 100644 index 00000000..8af7a2a5 --- /dev/null +++ b/src/app/layout/pro/styles/app/fix/index.less @@ -0,0 +1,8 @@ +@import './_antd.less'; +@import './_delon.less'; + +// components +@import './_btn.less'; +@import './_menu.less'; + +@import './_print.less'; diff --git a/src/app/layout/pro/styles/app/index.less b/src/app/layout/pro/styles/app/index.less new file mode 100644 index 00000000..d2066f55 --- /dev/null +++ b/src/app/layout/pro/styles/app/index.less @@ -0,0 +1,8 @@ +@import './_menu.less'; +@import './_content.less'; +@import './_header.less'; +@import './_top-nav.less'; +@import './_sider.less'; +@import './_footer.less'; + +@import './fix/index.less'; diff --git a/src/app/layout/pro/styles/index.less b/src/app/layout/pro/styles/index.less new file mode 100644 index 00000000..8d5eaa97 --- /dev/null +++ b/src/app/layout/pro/styles/index.less @@ -0,0 +1,4 @@ +@import './theme-default.less'; + +@import './app/index.less'; +@import './widgets/index.less'; diff --git a/src/app/layout/pro/styles/theme-compact.less b/src/app/layout/pro/styles/theme-compact.less new file mode 100644 index 00000000..72fb7993 --- /dev/null +++ b/src/app/layout/pro/styles/theme-compact.less @@ -0,0 +1,5 @@ +@import '~@delon/theme/theme-compact.less'; +@import './theme-default.less'; + +@alain-pro-header-height: 56px; +@alain-pro-header-widgets-icon-fs: 14px; diff --git a/src/app/layout/pro/styles/theme-dark.less b/src/app/layout/pro/styles/theme-dark.less new file mode 100644 index 00000000..54645892 --- /dev/null +++ b/src/app/layout/pro/styles/theme-dark.less @@ -0,0 +1,9 @@ +@import '~@delon/theme/theme-dark.less'; +@import './theme-default.less'; + +@alain-pro-header-bg: @component-background; +@alain-pro-header-logo-bg: @popover-background; +@alain-pro-header-box-shadow: @shadow-1-down; // 0 1px 4px rgba(0, 21, 41, 0.08); +@alain-pro-header-color: @text-color; +@alain-pro-header-hover-color: #fff; +@alain-pro-header-hover-bg: rgba(0, 0, 0, 0.025); diff --git a/src/app/layout/pro/styles/theme-default.less b/src/app/layout/pro/styles/theme-default.less new file mode 100644 index 00000000..3805df6e --- /dev/null +++ b/src/app/layout/pro/styles/theme-default.less @@ -0,0 +1,53 @@ +@import '~@delon/theme/theme-default.less'; + +// Optimization for NG-ALAIN theme system +// 针对 NG-ALAIN 主题系统的优化 +@badge-enabled: false; + +// PRO +@alain-pro-prefix: ~'.alain-pro'; +@aside-collapsed-prefix: ~'.aside-collapsed'; +@alain-pro-zindex: @zindex-base; +@alain-pro-ease: cubic-bezier(0.25, 0, 0.15, 1); + +@alain-pro-header-height: 64px; +@alain-pro-header-bg: #fff; +@alain-pro-header-logo-bg: #002140; +@alain-pro-header-box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +@alain-pro-header-color: rgba(0, 0, 0, 0.65); +@alain-pro-header-hover-color: #000; +@alain-pro-header-hover-bg: rgba(0, 0, 0, 0.025); +@alain-pro-header-search-width: 210px; +@alain-pro-header-widgets-icon-fs: 16px; +@alain-pro-header-title-badge-bg: @primary-color; +@alain-pro-header-title-badge-color: #fff; + +@alain-pro-main-bg: @layout-body-background; + +@alain-pro-top-nav-only-icon-fs: 16px; + +@alain-pro-light-color: #fff; +@alain-pro-light-slider-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + +@alain-pro-logo-font-size: 17px; +@alain-pro-logo-font-family: 'Myriad Pro', 'Helvetica Neue', Arial, Helvetica, sans-serif; + +@alain-pro-content-margin: 24px; +@alain-pro-wide: 1200px; + +@alain-pro-sider-menu-width: 256px; +@alain-pro-sider-menu-img-wh: 14px; + +/** + * 侧边栏固定时滚动条显示风格: + * - hide: 隐藏滚动条(默认) + * - show: 显示美化后滚动条 + */ +@alain-pro-sider-fixed-scroll-mode: 'hide'; +@alain-pro-sider-scrollbar-width: 0; +@alain-pro-sider-scrollbar-height: 0; +@alain-pro-sider-scrollbar-track-color: transparent; +@alain-pro-sider-scrollbar-thumb-color: transparent; + +@brand-bordered-color: rgba(24, 28, 33, 0.06); +@brand-scroll-width: 20px; diff --git a/src/app/layout/pro/styles/widgets/_bordered.less b/src/app/layout/pro/styles/widgets/_bordered.less new file mode 100644 index 00000000..713b91a9 --- /dev/null +++ b/src/app/layout/pro/styles/widgets/_bordered.less @@ -0,0 +1,34 @@ +.brand { + // 让 `nz-row` & `nz-col` 包含有边框效果 + &-bordered { + overflow: hidden; + border: 1px solid @brand-bordered-color; + + > [class*='ant-col-']::before, + > [class*='ant-col-']::after { + position: absolute; + display: block; + content: ''; + } + + > [class*='ant-col-']::before { + right: 0; + bottom: -1px; + left: 0; + height: 0; + border-top: 1px solid @brand-bordered-color; + } + + > [class*='ant-col-']::after { + top: 0; + bottom: 0; + left: -1px; + width: 0; + border-left: 1px solid @brand-bordered-color; + } + } + // 边框大小为 `2px` + &-border-width-2 { + border-width: 2px !important; + } +} diff --git a/src/app/layout/pro/styles/widgets/_brand.less b/src/app/layout/pro/styles/widgets/_brand.less new file mode 100644 index 00000000..e929e50a --- /dev/null +++ b/src/app/layout/pro/styles/widgets/_brand.less @@ -0,0 +1,27 @@ +.brand { + // 加载容器 + &-page-loading { + position: absolute; + top: 0; + right: 0; + left: 0; + min-height: 200px; + } + // `position: absolute` 定位到右上角 + &-top-right { + position: absolute; + top: 8px; + right: 8px; + } + // `position: absolute` 定位到左上角 + &-top-left { + position: absolute; + top: 8px; + left: 8px; + } + // `nz-range-picker` 日期宽度 + &-range-picker__date { + display: inline-block; + width: 240px; + } +} diff --git a/src/app/layout/pro/styles/widgets/_collapse.less b/src/app/layout/pro/styles/widgets/_collapse.less new file mode 100644 index 00000000..de07b113 --- /dev/null +++ b/src/app/layout/pro/styles/widgets/_collapse.less @@ -0,0 +1,13 @@ +.brand { + // 将 `nz-ollapse` 的 arrow 图标转化为右边 + &-collapse-arrow-reverse { + .@{ant-prefix}-collapse > .@{ant-prefix}-collapse-item > .@{ant-prefix}-collapse-header { + padding-right: 40px; + padding-left: 12px; + .arrow { + right: 16px; + left: unset; + } + } + } +} diff --git a/src/app/layout/pro/styles/widgets/_search.less b/src/app/layout/pro/styles/widgets/_search.less new file mode 100644 index 00000000..4014b5e5 --- /dev/null +++ b/src/app/layout/pro/styles/widgets/_search.less @@ -0,0 +1,51 @@ +@header-search-prefix: ~'@{alain-pro-prefix}__header-search'; + +@{header-search-prefix} { + display: flex; + .anticon-search { + font-size: 16px; + cursor: pointer; + } + &-input { + width: 0; + overflow: hidden; + background: transparent; + border-radius: 0; + transition: width 0.3s, margin-left 0.3s; + .@{ant-prefix}-select-selection { + background: transparent; + } + input { + padding-right: 0; + padding-left: 0; + background: transparent; + border: 0; + outline: none; + box-shadow: none; + } + &, + &:hover, + &:focus { + border-bottom: 1px solid @border-color-base; + } + } + &-show { + &:hover { + background: none !important; + } + @{header-search-prefix}-input { + width: @alain-pro-header-search-width; + margin-left: 8px; + } + } +} + +@{alain-pro-prefix}__dark { + @{alain-pro-prefix}__top-nav { + @{header-search-prefix}-show { + .@{ant-prefix}-input { + color: #fff; + } + } + } +} diff --git a/src/app/layout/pro/styles/widgets/_setting-drawer.less b/src/app/layout/pro/styles/widgets/_setting-drawer.less new file mode 100644 index 00000000..17f763c7 --- /dev/null +++ b/src/app/layout/pro/styles/widgets/_setting-drawer.less @@ -0,0 +1,53 @@ +@{setting-drawer-prefix} { + &__handle-opened { + right: 300px !important; + } + + &__blockChecbox { + display: flex; + &-item { + position: relative; + margin-right: 16px; + // box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + border-radius: @border-radius-base; + cursor: pointer; + img { + width: 48px; + } + } + &-selectIcon { + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + padding-top: 15px; + padding-left: 24px; + color: @primary-color; + font-weight: bold; + font-size: 14px; + } + } + + &__handle { + top: 114px; + width: 32px; + height: 32px; + background: rgba(0, 0, 0, 0.38); + &-icon { + font-size: 16px; + } + } +} + +.layout-pro-setting-drawer-rtl-mixin(@enabled) when(@enabled=true) { + @{setting-drawer-prefix}-rtl { + @{setting-drawer-prefix} { + &__handle-opened { + right: inherit !important; + left: 300px !important; + } + } + } +} +.layout-pro-setting-drawer-rtl-mixin(@rtl-enabled); diff --git a/src/app/layout/pro/styles/widgets/index.less b/src/app/layout/pro/styles/widgets/index.less new file mode 100644 index 00000000..e23af717 --- /dev/null +++ b/src/app/layout/pro/styles/widgets/index.less @@ -0,0 +1,7 @@ +// For pro brand style +@import './_brand.less'; + +@import './_setting-drawer.less'; +@import './_search.less'; +@import './_bordered.less'; +@import './_collapse.less'; diff --git a/src/app/layout/pro/test/components/menu.component.spec.ts b/src/app/layout/pro/test/components/menu.component.spec.ts new file mode 100644 index 00000000..edf966a4 --- /dev/null +++ b/src/app/layout/pro/test/components/menu.component.spec.ts @@ -0,0 +1,89 @@ +import { Component, DebugElement, ViewChild } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { Router } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { createTestContext } from '@delon/testing'; +import { AlainThemeModule, Menu, MenuService } from '@delon/theme'; + +import { LayoutModule } from '../../../layout.module'; +import { LayoutProMenuComponent } from '../../components/menu/menu.component'; +import { BrandService } from '../../pro.service'; + +describe('pro: layout-pro-menu', () => { + let fixture: ComponentFixture; + let dl: DebugElement; + let context: TestComponent; + let srv: BrandService; + let menuSrv: MenuService; + let page: PageObject; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, RouterTestingModule.withRoutes([]), AlainThemeModule.forRoot(), LayoutModule], + declarations: [TestComponent] + }); + ({ fixture, dl, context } = createTestContext(TestComponent)); + srv = TestBed.inject(BrandService); + menuSrv = TestBed.inject(MenuService); + page = new PageObject(); + }); + + describe('#menu', () => { + it('should be ingored category menus', () => { + page.appendMenu([{ text: '1', children: [{ text: '1-1' }, { text: '1-2' }] }]).checkCount(2); + }); + + it('should be ingored menu item when _hidden is true', () => { + page.appendMenu([{ text: '1', children: [{ text: '1-1', hide: true }, { text: '1-2' }] }]).checkCount(1); + }); + + it('should be navigate router', fakeAsync(() => { + const router = TestBed.inject(Router); + spyOn(router, 'navigateByUrl'); + page.appendMenu([{ text: '1', children: [{ text: '1-1', link: '/' }] }]); + page.click(); + tick(100); + fixture.detectChanges(); + expect(router.navigateByUrl).toHaveBeenCalled(); + })); + + it('should be auto closed collapse when router changed of mobile', fakeAsync(() => { + spyOnProperty(srv, 'isMobile').and.returnValue(true); + const setCollapsedSpy = spyOn(srv, 'setCollapsed'); + page.appendMenu([{ text: '1', children: [{ text: '1-1', link: '/' }] }]).click(); + tick(100); + fixture.detectChanges(); + expect(setCollapsedSpy).toHaveBeenCalled(); + expect(setCollapsedSpy.calls.mostRecent().args[0]).toBe(true); + })); + }); + + class PageObject { + appendMenu(menus: Menu[]): this { + menuSrv.add(menus); + fixture.detectChanges(); + return this; + } + checkCount(count: number = 0): this { + expect(context.comp.menus!.length).toBe(count); + return this; + } + click(pos: number = 0): this { + const el = document.querySelectorAll('.alain-pro__menu-item')[pos] as HTMLElement; + el.querySelector('a')!.click(); + fixture.detectChanges(); + return this; + } + whenStable(): Promise { + return fixture.whenStable(); + } + } +}); + +@Component({ + template: `
    ` +}) +class TestComponent { + @ViewChild(LayoutProMenuComponent, { static: true }) comp!: LayoutProMenuComponent; +} diff --git a/src/app/layout/pro/test/pro.component.spec.ts b/src/app/layout/pro/test/pro.component.spec.ts new file mode 100644 index 00000000..4fc9dad9 --- /dev/null +++ b/src/app/layout/pro/test/pro.component.spec.ts @@ -0,0 +1,111 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { Component, DebugElement, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, TestBedStatic } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { RouterTestingModule } from '@angular/router/testing'; +import { createTestContext } from '@delon/testing'; +import { AlainThemeModule } from '@delon/theme'; + +import { LayoutModule } from '../../layout.module'; +import { LayoutProComponent } from '../pro.component'; +import { BrandService } from '../pro.service'; + +describe('pro: layout-pro', () => { + let injector: TestBedStatic; + let fixture: ComponentFixture; + let dl: DebugElement; + let context: TestComponent; + let srv: BrandService; + let page: PageObject; + + beforeEach(() => { + injector = TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + NoopAnimationsModule, + RouterTestingModule.withRoutes([]), + AlainThemeModule.forRoot(), + LayoutModule + ], + declarations: [TestComponent] + }); + }); + + beforeEach(() => { + ({ fixture, dl, context } = createTestContext(TestComponent)); + srv = injector.inject(BrandService); + page = new PageObject(); + }); + + describe('should set the body style', () => { + it('when inited', () => { + srv.setCollapsed(true); + srv.setLayout('theme', 'dark'); + fixture.detectChanges(); + page.checkBodyClass('alain-pro__dark').checkBodyClass('aside-collapsed'); + }); + it('when destroy', () => { + srv.setCollapsed(true); + srv.setLayout('theme', 'dark'); + fixture.detectChanges(); + page.checkBodyClass('alain-pro__dark').checkBodyClass('aside-collapsed'); + context.comp.ngOnDestroy(); + page.checkBodyClass('alain-pro__dark', false); + }); + it('when layout changed', () => { + srv.setLayout('contentWidth', 'fixed'); + fixture.detectChanges(); + page.checkBodyClass('alain-pro__wide'); + srv.setLayout('contentWidth', 'fluid'); + fixture.detectChanges(); + page.checkBodyClass('alain-pro__wide', false); + }); + }); + + describe('#layout', () => { + it('should be hide slider when screen is mobile', () => { + const siderCls = '.alain-pro__sider'; + const isMobile = spyOnProperty(srv, 'isMobile', 'get'); + // Show sider when not mobile + isMobile.and.returnValue(false); + srv.setCollapsed(true); + fixture.detectChanges(); + fixture + .whenStable() + .then(() => { + page.checkCls(siderCls, true); + // Hide sider when is mobile + isMobile.and.returnValue(true); + srv.setCollapsed(true); + fixture.detectChanges(); + return fixture.whenStable(); + }) + .then(() => { + page.checkCls(siderCls, false); + }); + }); + }); + + class PageObject { + checkBodyClass(cls: string, status: boolean = true): this { + expect(document.body.classList.contains(cls)).toBe(status); + return this; + } + checkCls(cls: string, status: boolean = true): this { + const nodes = document.querySelectorAll(cls); + if (status) { + expect(nodes.length).toBe(1); + } else { + expect(nodes.length).toBe(0); + } + return this; + } + } +}); + +@Component({ + template: ` ` +}) +class TestComponent { + @ViewChild('comp', { static: true }) comp!: LayoutProComponent; +} diff --git a/src/app/layout/pro/test/pro.service.spec.ts b/src/app/layout/pro/test/pro.service.spec.ts new file mode 100644 index 00000000..7655f503 --- /dev/null +++ b/src/app/layout/pro/test/pro.service.spec.ts @@ -0,0 +1,81 @@ +import { TestBed, TestBedStatic } from '@angular/core/testing'; +import { AlainThemeModule } from '@delon/theme'; +import { environment } from '@env/environment'; +import { filter } from 'rxjs/operators'; + +import { BrandService } from '../pro.service'; + +describe('pro: BrandService', () => { + let injector: TestBedStatic; + let srv: BrandService; + + beforeEach(() => { + injector = TestBed.configureTestingModule({ + imports: [AlainThemeModule.forRoot()], + providers: [BrandService] + }); + }); + + afterEach(() => ((environment as any).pro = null)); + + describe('should be initialized configuration', () => { + it('with default', () => { + (environment as any).pro = null; + spyOn(localStorage, 'getItem').and.returnValue(`null`); + srv = injector.get(BrandService); + expect(srv.theme).toBe('dark'); + expect(srv.menu).toBe('side'); + expect(srv.contentWidth).toBe('fluid'); + }); + it('with environment', () => { + (environment as any).pro = { theme: 'light' }; + spyOn(localStorage, 'getItem').and.returnValue(`null`); + srv = injector.get(BrandService); + expect(srv.theme).toBe('light'); + }); + it('with settings', () => { + (environment as any).pro = null; + spyOn(localStorage, 'getItem').and.returnValue(JSON.stringify({ theme: 'light', menu: 'top' })); + srv = injector.get(BrandService); + expect(srv.theme).toBe('light'); + expect(srv.menu).toBe('top'); + }); + }); + + describe('should be trigger notify', () => { + beforeEach(() => (srv = injector.get(BrandService))); + + it('when mobile changed in constructor', done => { + srv.notify.pipe(filter(v => v != null && v === 'mobile')).subscribe(type => { + expect(true).toBe(true); + done(); + }); + }); + it('when layout changed', done => { + srv.notify.pipe(filter(v => v != null && v === 'layout')).subscribe(type => { + expect(true).toBe(true); + done(); + }); + srv.setLayout('a', 1); + }); + }); + + it('#setCollapsed', () => { + srv = injector.get(BrandService); + srv.setCollapsed(false); + expect(srv.collapsed).toBe(false); + srv.setCollapsed(); + expect(srv.collapsed).toBe(true); + srv.setCollapsed(); + expect(srv.collapsed).toBe(false); + }); + + it('should be onlyIcon always be false when menu is side', () => { + srv = injector.get(BrandService); + srv.setLayout('menu', 'top'); + srv.setLayout('onlyIcon', true); + expect(srv.onlyIcon).toBe(true); + srv.setLayout('menu', 'side'); + expect(srv.onlyIcon).toBe(false); + }); +}); diff --git a/src/app/routes/account/account-routing.module.ts b/src/app/routes/account/account-routing.module.ts new file mode 100644 index 00000000..8a7ce180 --- /dev/null +++ b/src/app/routes/account/account-routing.module.ts @@ -0,0 +1,31 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 20:15:41 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:14:30 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\account-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AccountComponentsCenterComponent } from './components/center/center.component'; + +const routes: Routes = [ + { path: '', redirectTo: 'center', pathMatch: 'full' }, + { + path: 'center', + component: AccountComponentsCenterComponent, + data: { + title: '账户中心' + } + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AccountRoutingModule {} diff --git a/src/app/routes/account/account.module.ts b/src/app/routes/account/account.module.ts new file mode 100644 index 00000000..96606efa --- /dev/null +++ b/src/app/routes/account/account.module.ts @@ -0,0 +1,30 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-11-29 11:06:01 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:14:34 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\account.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { AccountRoutingModule } from './account-routing.module'; +import { AccountComponentsCenterComponent } from './components/center/center.component'; +import { AccountComponentsEditNameComponent } from './components/edit-name/edit-name.component'; +import { AccountComponentsCenterEditComponent } from './components/edit-password/edit-password.component'; + +const COMPONENTS = [ + AccountComponentsCenterComponent, + AccountComponentsEditNameComponent, + AccountComponentsCenterEditComponent +]; +const COMPONENTS_NOROUNT = [AccountComponentsEditNameComponent]; + +@NgModule({ + imports: [SharedModule, AccountRoutingModule], + declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT], +}) +export class AccountModule {} diff --git a/src/app/routes/account/components/center/center.component.html b/src/app/routes/account/components/center/center.component.html new file mode 100644 index 00000000..d9df68c0 --- /dev/null +++ b/src/app/routes/account/components/center/center.component.html @@ -0,0 +1,48 @@ +
    + +

    个人中心

    + + + + +
    +
    + 手机号码/账号 +
    +
    {{ infoData.phone }}
    +
    + 已绑定 + 未绑定 +
    +
    +
    +
    + +
    + + + +
    +
    + 账户密码 +
    +
    定期更换密码有助于账号安全
    +
    + 已设置 + 未设置 +
    +
    +
    +
    + +
    +
    + +
    +
    diff --git a/src/app/routes/account/components/center/center.component.less b/src/app/routes/account/components/center/center.component.less new file mode 100644 index 00000000..96f8b59c --- /dev/null +++ b/src/app/routes/account/components/center/center.component.less @@ -0,0 +1,46 @@ +:host { + ::ng-deep { + .info-main { + padding: 30px; + } + .info-main h3 { + margin-bottom: 30px; + color: #333; + font-size: 24px; + } + .info { + position: relative; + } + .info-btn { + position: absolute; + top: 20px; + right: 20px; + } + .item-btn { + width: 28px; + text-align: center; + } + .li-label { + color: #333; + font-weight: bold; + font-size: 14px; + } + page-grid { + background-color: #f0f3f7; + + div.container { + width: 80%; + margin: 0 auto; + padding: 1rem; + } + } + } + .info-row { + padding: 24px 0; + .info-icon { + margin-right: 15px; + color: #3875fb; + font-size: 16px; + } + } +} diff --git a/src/app/routes/account/components/center/center.component.spec.ts b/src/app/routes/account/components/center/center.component.spec.ts new file mode 100644 index 00000000..cdcb358d --- /dev/null +++ b/src/app/routes/account/components/center/center.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AccountComponentsCenterComponent } from './center.component'; + +describe('AccountComponentsCenterComponent', () => { + let component: AccountComponentsCenterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AccountComponentsCenterComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AccountComponentsCenterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/account/components/center/center.component.ts b/src/app/routes/account/components/center/center.component.ts new file mode 100644 index 00000000..713b106b --- /dev/null +++ b/src/app/routes/account/components/center/center.component.ts @@ -0,0 +1,202 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { Observable, Observer } from 'rxjs'; +import { AccountService } from '../../services/account.service'; +import { AccountComponentsEditNameComponent } from '../edit-name/edit-name.component'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountComponentsCenterEditComponent } from '../edit-password/edit-password.component'; + +@Component({ + selector: 'app-account-components-center', + templateUrl: './center.component.html', + styleUrls: ['./center.component.less'], +}) +export class AccountComponentsCenterComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('sf', { static: false }) sf!: SFComponent; + i: any; + formDate: any = {}; + schema!: SFSchema; + ui: SFUISchema = {}; + infoData: any = { + appId: '', + appTypeId: 0, + appTypeName: '', + appUserId: 0, + avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png?_allow_anonymous=true', + birthday: '', + cert: 0, + createTime: '', + email: '', + id: 0, + isPwd: true, + lastLoginDate: '', + name: '', + nickName: '', + openId: '', + phone: '', + remark: '', + sex: 0, + state: 0, + stateLocked: true, + token: '', + userType: 0, + }; + tabs = [ + { + name: '基本设置', + }, + { + name: '安全设置', + }, + ]; + idx: any = 0; + constructor(public service: AccountService, private modal: ModalHelper, private http: _HttpClient, private router: Router, private modalService: NzModalService,) {} + + ngOnInit() { + this.initSF(); + this.getInfo(); + } + initSF() { + this.schema = { + properties: { + avatar: { + type: 'string', + title: '头像', + ui: { + action: `/cms/upload/multipartFile/fileModel?_allow_anonymous=true`, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '支持JPG、GIF、PNG、JPEG、BMP格式,文件小于2M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + nickName: { + title: '昵称', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + placeholder: '请输入昵称', + width: 400, + errors: { + required: '请输入昵称', + }, + }, + }, + }, + required: ['nickName', 'avatar'], + }; + this.ui = { + '*': { + spanLabel: 5, + grid: { span: 24 }, + }, + }; + } + getInfo() { + this.service.http.post(this.service.$api_get_current_user_info).subscribe((res) => { + this.infoData = res.data; + }); + } + + edit(tpye: string) { + if (tpye === 'phone') { + const modalRef = this.modalService.create({ + nzTitle: '验证手机号码', + nzContent: AccountComponentsEditNameComponent, + nzComponentParams: { + i: this.infoData + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + if (result === true) { + // this.st.load(1); + } + }); + } + if (tpye === 'password') { + + const modalRef = this.modalService.create({ + nzTitle: '设置/修改登录密码', + nzContent: AccountComponentsCenterEditComponent, + nzComponentParams: { + record: this.infoData + }, + }); + modalRef.afterClose.subscribe((result: any) => { + if (result === true) { + // this.st.load(1); + } + }); + } + // if (tpye === 'info') { + // this.router.navigate(['/account/editInfo'], { + // queryParams: { realName: this.infoData.realName, certificateNumber: this.infoData.certificateNumber }, + // }); + // } + // if (tpye === 'name') { + // this.modal + // .createStatic(AccountComponentsEditNameComponent, { i: { name: this.infoData.name, phone: this.infoData.phone } }) + // .subscribe(() => { + // this.getInfo(); + // // this.st.reload(); + // }); + // } + } + + changeType(type: number): void { + this.idx = type; + } + + formSubmit(value: any): void { + const params = { ...value }; + this.service.request(`${this.service.$api_get_current_user_info}`, params).subscribe((res) => { + if (res === true) { + this.service.msgSrv.success('保存成功'); + this.getInfo(); + // this.initSF(); + } + }); + } +} diff --git a/src/app/routes/account/components/edit-name/edit-name.component.html b/src/app/routes/account/components/edit-name/edit-name.component.html new file mode 100644 index 00000000..a300858e --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.html @@ -0,0 +1,75 @@ + + + + +
    + + +
    +
    +
    + + + + + + + +
    + + +
    +
    +
    +
    + + + + +
    + + + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/account/components/edit-name/edit-name.component.less b/src/app/routes/account/components/edit-name/edit-name.component.less new file mode 100644 index 00000000..2c58b9fb --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.less @@ -0,0 +1,20 @@ +:host { + .valid-code { + position: relative; + } + .btn-code { + position: absolute; + top: 0; + right: 0; + z-index: 9; + } + .valid-code2 { + position: relative; + } + .btn-code2 { + position: absolute; + top: 0; + right: 0; + z-index: 9; + } +} diff --git a/src/app/routes/account/components/edit-name/edit-name.component.spec.ts b/src/app/routes/account/components/edit-name/edit-name.component.spec.ts new file mode 100644 index 00000000..a5f8d13a --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-11-29 11:06:01 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:14:44 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-name\\edit-name.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AccountComponentsEditNameComponent } from './edit-name.component'; + +describe('AccountComponentsEditNameComponent', () => { + let component: AccountComponentsEditNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AccountComponentsEditNameComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AccountComponentsEditNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/account/components/edit-name/edit-name.component.ts b/src/app/routes/account/components/edit-name/edit-name.component.ts new file mode 100644 index 00000000..fdc0d05e --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.ts @@ -0,0 +1,271 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ErrorData, SFComponent, SFSchema, SFStringWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +// import { CaptchaComponent } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { interval, Observable, Observer } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { AccountService } from '../../services/account.service'; + +@Component({ + selector: 'app-account-components-edit-name', + templateUrl: './edit-name.component.html', + styleUrls: ['./edit-name.component.less'], +}) +export class AccountComponentsEditNameComponent implements OnInit, AfterViewInit { + // @ViewChild('dun', { static: false }) + // private dun!: CaptchaComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + record: any = {}; + i: any; + schema!: SFSchema; + schemaView!: SFSchema; + ui!: SFUISchema; + uiView: SFUISchema = {}; + isVisibleView = false; + isVisibleOk = false; + formData: any = {}; + count = 0; + count2 = 0; + oldName: any; + voucher: any; + codeTips: any; + interval$: any; + + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public http: _HttpClient, public service: AccountService,private cdr: ChangeDetectorRef,) {} + ngAfterViewInit(): void { + // this.dun.init(); + } + + ngOnInit() { + this.codeTips = '为了账户安全,需您的手机验证(' + this.i?.phone + ')'; + this.formData.oldName = this.i?.phone; + this.initSF(); + this.initSFNew(); + // this.getInfo(); + } + initSF() { + this.schema = { + properties: { + oldName: { + title: '手机号', + type: 'string', + default: this.formData?.oldName, + ui: { + widget: 'text', + }, + }, + // userName: { + // title: '用户名(新)', + // type: 'string', + // minLength: 3, + // maxLength: 30, + // description: '3-30个字符,支持中英文、数字、符号“_”和“-”,只能修改一次', + // ui: { + // placeholder: '请输入新用户名', + // errors: { + // required: '请输入新用户名', + // }, + // } as SFStringWidgetSchema, + // }, + smsVerifyCode: { + title: '验证码', + type: 'string', + maxLength: 6, + minLength: 6, + description: this.codeTips, + ui: { + widget: 'custom', + placeholder: '请输入验证码', + errors: { + required: '请输入6位数字验证码', + minLength: '请输入6位数字验证码', + }, + }, + }, + }, + required: ['userName', 'smsVerifyCode'], + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 24 }, + }, + }; + } + initSFNew() { + this.schemaView = { + properties: { + phone: { + title: '新手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入新手机号', + errors: { + required: '请输入新手机号', + }, + } as SFStringWidgetSchema, + }, + smsVerifyCode: { + title: '验证码', + type: 'string', + maxLength: 6, + minLength: 6, + ui: { + widget: 'custom', + placeholder: '请输入验证码', + errors: { + required: '请输入6位验证码', + minLength: '请输入6位验证码', + }, + }, + }, + }, + required: ['phone', 'smsVerifyCode'], + }; + this.uiView = { + '*': { + spanLabelFixed: 100, + grid: { span: 24 }, + }, + }; + } + + getCaptcha() { + const params = { + // phoneNumber: phone + }; + this.service.request(this.service.$api_get_current_user_smVerification, params, 'POST', true, 'FORM').subscribe((res) => { + // code==503046 弹出网易盾 + if (res && res.code === '1') { + this.service.msgSrv.success('发送成功'); + this.createInterval(); + } else if (res.code === '503046') { + // this.dun.popUp(); + } else { + this.service.msgSrv.success(res.msg); + } + }); + } + + getCaptcha2() { + const params = { + phoneNumber: this.sfView.value.phone + }; + this.service.request(this.service.$api_get_getSMVerificationCode, params, 'POST', true, 'FORM').subscribe((res) => { + // code==503046 弹出网易盾 + if (res && res.code === '1') { + this.service.msgSrv.success('发送成功'); + this.createInterval2(); + } else if (res.code === '503046') { + // this.dun.popUp(); + } else { + this.service.msgSrv.success(res.msg); + } + }); + } + + // /* code倒计时 */ + // codeCountDown() { + // this.count = 59; + // this.interval$ = setInterval(() => { + // this.count -= 1; + // if (this.count <= 0) { + // clearInterval(this.interval$); + // } + // }, 1000); + // } + private createInterval() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe((x: any) => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } + private createInterval2() { + this.count2 = 59; + interval(1000) + .pipe(take(60)) + .subscribe((x: any) => { + this.count2 = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } + // codeCountDown2() { + // this.count2 = 59; + // this.interval$ = setInterval(() => { + // this.count2 -= 1; + // if (this.count <= 0) { + // clearInterval(this.interval$); + // } + // }, 1000); + // } + /* 网易盾验证通过 */ + captchaDone(validate: any) { + this.createInterval(); + } + + getInfo() { + const params = { + // id: this.i.id, + }; + this.service.http.post(this.service.$api_get_current_user_info, params).subscribe((res) => { + // if (res) { + // this.getCaptcha(res.data.phone); + // } + }); + } + + close() { + this.modal.destroy(); + } + submitForm() { + const params = { + smsVerifyCode: this.sf.value.smsVerifyCode, + }; + + this.service.http.post(this.service.$api_get_verifyPhone, params).subscribe((res) => { + if (res.success) { + // this.modal.close(true); + this.voucher = res.data.voucher + this.isVisibleView = true + } else { + this.service.msgSrv.error(res.msg) + } + }); + } + handleCancel(type: string) { + if(type === '1') { + this.isVisibleView = false + } else if(type === '2') { + console.log(type) + } else if(type === '3') { + this.modal.close() + } + } + handleOK() { + + } + handleNew() { + if(!this.sfView.valid) { + return; + } + const params = { + voucher: this.voucher, + ...this.sfView.value, + } + this.service.http.post(this.service.$api_set_voucherUpdatePhone, params).subscribe((res) => { + if (res.success) { + this.isVisibleOk = true; + } else { + this.service.msgSrv.error(res.msg) + } + }); + } +} diff --git a/src/app/routes/account/components/edit-password/edit-password.component.html b/src/app/routes/account/components/edit-password/edit-password.component.html new file mode 100644 index 00000000..0fd3cc15 --- /dev/null +++ b/src/app/routes/account/components/edit-password/edit-password.component.html @@ -0,0 +1,94 @@ + + + +
    + + 新密码 + + + + + + + + + + + 确认新密码 + + + + + + + + + + + 手机号 + {{this.record?.phone}} + + + + 验证码 + + +
    +
    + +
    +
    + + {{ count > 0 ? '请等待' + count + 's' : '获取验证码' }} +
    +
    +
    +
    +
    +
    + + +
    + + + + + +
    + +
    +
    +
    +
    diff --git a/src/app/routes/account/components/edit-password/edit-password.component.ts b/src/app/routes/account/components/edit-password/edit-password.component.ts new file mode 100644 index 00000000..3f4cd9b7 --- /dev/null +++ b/src/app/routes/account/components/edit-password/edit-password.component.ts @@ -0,0 +1,130 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-27 10:30:56 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:14:54 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-password\\edit-password.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; + +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { NzDrawerRef, NzDrawerService } from 'ng-zorro-antd/drawer'; +import { NzFormTooltipIcon } from 'ng-zorro-antd/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { AccountService } from '../../services/account.service'; + +@Component({ + selector: 'app-account-components-edit', + templateUrl: './edit-password.component.html' +}) +export class AccountComponentsCenterEditComponent implements OnInit { + validateForm!: FormGroup; + record: any; + count = 0; + type = 'create'; + isVisibleView = false + passwordVisible = false; + passwordVisible2 = false; + password: any; + password2: any; + interval$: any; + confirmationValidator = + (control: FormControl): { [s: string]: boolean } => { + if (!control.value) { + return { required: true }; + } else if (control?.value !== this.validateForm?.value?.passWord) { + return { confirm: true, error: true }; + } + return {}; + }; + captchaTooltipIcon: NzFormTooltipIcon = { + type: 'info-circle', + theme: 'twotone' + }; + constructor( + public router: Router, + public ar: ActivatedRoute, + private modalRef: NzModalRef, + private fb: FormBuilder, + public service: AccountService, + @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService + ) {} + + ngOnInit() { + this.initForm(); + } + initForm () { + this.validateForm = this.fb.group({ + passWord: [null, + [ + Validators.required, + Validators.maxLength(16), + Validators.minLength(8), + Validators.pattern('^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z-_]{8,16}$') + ]], + passWordTo: [null, [ Validators.required, Validators.maxLength(16), Validators.minLength(8), this.confirmationValidator,]], + smsVerifyCode: [null, [Validators.required]], + }); +} + destroyModal(): void { + this.modalRef.destroy(); + } + getCaptcha(e: MouseEvent): void { + this.service.request(this.service.$api_get_current_user_smVerification).subscribe(res => { + // code==503046 弹出网易盾 + if (res && res.code === '1') { + this.service.msgSrv.success('发送成功'); + e.preventDefault(); + this.codeCountDown(); + }else { + this.service.msgSrv.success(res.msg); + } + }); + } + save() { + if(!this.validateForm.valid) { + this.service.msgSrv.warning('必填项为空或格式错误,请检查!') + return; + } + const params = { + ...this.validateForm.value + }; + this.service.request(this.service.$api_set_phoneUpdatePassword, params).subscribe((res) => { + if (res) { + this.service.msgSrv.success('修改密码成功!'); + this.isVisibleView = true; + setTimeout(() => { + this.tokenService.clear(); + this.router.navigate(['/passport/login']) + this.modalRef.close() + }, 3000) + } + }); + } + /* code倒计时 */ + codeCountDown() { + this.count = 59; + this.interval$ = setInterval(() => { + this.count -= 1; + if (this.count <= 0) { + clearInterval(this.interval$); + } + }, 1000); + } + handleCancel() { + this.isVisibleView = false + } + handleOK() { + this.modalRef.close() + this.tokenService.clear(); + this.router.navigate(['/passport/login']) + } +} diff --git a/src/app/routes/account/services/account.service.ts b/src/app/routes/account/services/account.service.ts new file mode 100644 index 00000000..69608398 --- /dev/null +++ b/src/app/routes/account/services/account.service.ts @@ -0,0 +1,42 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-27 10:30:56 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:14:59 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\services\\account.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { map } from 'rxjs/operators'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root', +}) +export class AccountService extends BaseService { + + // 获取当前登录用户详情 + $api_get_current_user_info = `/api/mdc/cuc/user/getUserInfo`; + + // 根据当前登录用户绑定的手机号码获取短信验证码 + $api_get_current_user_smVerification = `/api/mdc/pbc/smsSend/getSmVerificationCodeByToken`; + // 获取短信验证码 + $api_get_getSMVerificationCode = `/api/mdc/pbc/smsSend/getSMVerificationCode`; + + // 验证手机号 + $api_get_verifyPhone = `/api/mdc/cuc/userBasicInfo/forgetPassword/verifyPhone`; + + // 凭证修改手机号 + $api_set_voucherUpdatePhone = `/api/mdc/cuc/userBasicInfo/forgetPassword/voucherUpdatePhone`; + // 凭证修改密码 + $api_set_phoneUpdatePassword = `/api/mdc/cuc/userBasicInfo/phoneUpdatePassword`; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/commom/components/basic-table/basic-table.component.ts b/src/app/routes/commom/components/basic-table/basic-table.component.ts new file mode 100644 index 00000000..99def7f4 --- /dev/null +++ b/src/app/routes/commom/components/basic-table/basic-table.component.ts @@ -0,0 +1,40 @@ +import { AfterViewInit, Component, OnInit } from '@angular/core'; +import { fromEvent } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; + +@Component({ + template: '' +}) +export class BasicTableComponent implements AfterViewInit { + scrollY = '400px'; + + constructor() {} + + ngAfterViewInit(): void { + setTimeout(() => { + this.getScrollY(); + }, 100); + fromEvent(window, 'resize') + .pipe(debounceTime(100)) + .subscribe(event => { + this.getScrollY(); + }); + } + + getScrollY() { + const windowHeight = window.innerHeight || Math.max(document.documentElement.clientHeight, document.body.clientHeight); + const header = document.getElementsByTagName('layout-pro-header')?.[0]; + if (windowHeight && header) { + let scrollY = windowHeight - header.clientHeight - 35 - 49; + const headerWrapper = document.getElementsByTagName('page-header-wrapper')?.[0]; + if (headerWrapper) { + scrollY -= headerWrapper.clientHeight; + } + const tabset = document.getElementsByTagName('nz-tabset')?.[0]; + if (tabset) { + scrollY -= tabset.clientHeight; + } + this.scrollY = scrollY + 'px'; + } + } +} diff --git a/src/app/routes/commom/less/basic-board.less b/src/app/routes/commom/less/basic-board.less new file mode 100644 index 00000000..84354724 --- /dev/null +++ b/src/app/routes/commom/less/basic-board.less @@ -0,0 +1,5 @@ +:host::ng-deep { + .ant-form-item { + margin-bottom: 0; + } +} \ No newline at end of file diff --git a/src/app/routes/commom/less/box.less b/src/app/routes/commom/less/box.less new file mode 100644 index 00000000..b4da38e9 --- /dev/null +++ b/src/app/routes/commom/less/box.less @@ -0,0 +1,42 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-right: 16px; + padding-left : 16px; + } + + .text-truncate { + white-space: normal; + } + + .bold { + .ant-statistic-title { + font-weight: 600; + color : #000; + font-size : 16px; + } + } +} + +.total-footer { + position : absolute; + bottom : 25px; + height : 32px; + margin : 16px 0; + line-height: 32px; +} \ No newline at end of file diff --git a/src/app/routes/commom/less/commom-table.less b/src/app/routes/commom/less/commom-table.less new file mode 100644 index 00000000..1eb73d94 --- /dev/null +++ b/src/app/routes/commom/less/commom-table.less @@ -0,0 +1,70 @@ +:host { + ::ng-deep { + nz-card { + margin: -24px -24px 0; + + .ant-tabs-nav { + margin: 0; + } + } + + .ant-tabs-tab { + margin: 0 0 0 16px; + padding: 12px 0; + } + + .ant-table-body { + border-bottom: 1px solid #f0f0f0; + } + + .table-box { + .ant-card-body { + padding: 0; + } + } + + .ant-table-pagination.ant-pagination { + margin: 8px; + } + + .ant-table-thead > tr > th, + .ant-table-tbody > tr > td, + .ant-table tfoot > tr > th, + .ant-table tfoot > tr > td { + padding: 8px; + } + + .ant-table.ant-table-bordered > .ant-table-container { + border-top: 0; + } + + .ant-pagination-item { + min-width: 24px; + height: 24px; + line-height: 21px; + } + + .ant-pagination-total-text { + height: 24px; + line-height: 24px; + } + + .ant-pagination-prev, + .ant-pagination-next, + .ant-pagination-jump-prev, + .ant-pagination-jump-next { + min-width: 24px; + height: 24px; + line-height: 21px; + } + + .ant-select-single:not(.ant-select-customize-input) .ant-select-selector { + height: 24px; + } + + .ant-select-single .ant-select-selector .ant-select-selection-item, + .ant-select-single .ant-select-selector .ant-select-selection-placeholder { + line-height: 21px; + } + } +} diff --git a/src/app/routes/commom/less/expend-but.less b/src/app/routes/commom/less/expend-but.less new file mode 100644 index 00000000..f454e789 --- /dev/null +++ b/src/app/routes/commom/less/expend-but.less @@ -0,0 +1,13 @@ +.expend-options { + margin-top: 0; +} + + +@media (min-width: 1200px) { + .expend-options { + position : absolute; + right : 0; + bottom : 25px; + max-width: 450px; + } +} \ No newline at end of file diff --git a/src/app/routes/commom/less/trajectory.less b/src/app/routes/commom/less/trajectory.less new file mode 100644 index 00000000..17519018 --- /dev/null +++ b/src/app/routes/commom/less/trajectory.less @@ -0,0 +1,48 @@ +:host::ng-deep { + .text-truncate { + white-space: normal; + } + + .map_st { + max-height: 350px; + max-width : 360px; + position : absolute; + top : 20px; + right : 49px; + } + + .map_radio { + position : absolute; + top : 20px; + left : 20px; + background : #F4F4F5; + box-shadow : 0px 2px 8px 1px rgb(0 0 0 / 10%); + border-radius: 4px 4px 4px 4px; + + .ant-radio-button-wrapper { + background: #F4F4F5; + border : unset; + } + + .ant-radio-button-wrapper-checked { + color : #CF3834; + background: #ffffff; + } + + .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before { + background-color: #d9d9d9; + } + } +} + +.detail_title { + font-size : 16px; + font-weight: 500; + color : #252A3D; + line-height: 24px; + + span { + color : #E60012; + font-weight: 700; + } +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-detail/contract-detail.component.html b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.html new file mode 100644 index 00000000..dfdcf8f2 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.html @@ -0,0 +1,26 @@ + + + + + + + + + +
    + +
    +
    +
    +
    diff --git a/src/app/routes/contract-management/components/contract-detail/contract-detail.component.less b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.less new file mode 100644 index 00000000..ed026470 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.less @@ -0,0 +1,4 @@ +.title { +padding-right: 4px; +padding-left: 14px !important; +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-detail/contract-detail.component.spec.ts b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.spec.ts new file mode 100644 index 00000000..e4586857 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-10 14:44:57 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:15:18 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-detail\\contract-detail.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementDetailComponent } from './contract-detail.component'; + +describe('ContractManagementDetailComponent', () => { + let component: ContractManagementDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ContractManagementDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/contract-detail/contract-detail.component.ts b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.ts new file mode 100644 index 00000000..2070a2e2 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-detail/contract-detail.component.ts @@ -0,0 +1,59 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-10 14:44:57 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:15:43 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-detail\\contract-detail.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { DatePipe } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; + +@Component({ + selector: 'app-contract-management-detail-complaint', + templateUrl: './contract-detail.component.html', + styleUrls: ['./contract-detail.component.less'], + providers: [DatePipe] +}) +export class ContractManagementDetailComponent implements OnInit { + constructor( + private nzModalService: NzModalService, + public service: ContractManagementService, + public route: ActivatedRoute, + private datePipe: DatePipe, + private router: Router + ) {} + textStatus = '合同详情'; + name: any; + code: any; + templateHTML: any; + detailList: any = { + templateName: '' + }; + ngOnInit() { + this.initData(this.service.$api_contract_get); + } + goBack() { + window.history.go(-1); + } + + initData(url: string) { + this.service.request(url, { id: this.route.snapshot.params.id }).subscribe(res => { + if (res) { + this.detailList = res; + this.detailList = res; + let value: any = JSON.parse(res.contractParameter); + this.code = value['${code}']; + this.name = value['${name}']; + } + }); + } + cancel() { + window.history.go(-1); + } +} diff --git a/src/app/routes/contract-management/components/contract-frame/contract-frame.component.html b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.html new file mode 100644 index 00000000..37e24dfb --- /dev/null +++ b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.html @@ -0,0 +1,101 @@ + + +
    + +
    + +
    + + + +
    + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + + +
    + + + + {{ item?.contractCode }} + + +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/contract-management/components/contract-frame/contract-frame.component.less b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.less new file mode 100644 index 00000000..7151df68 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.less @@ -0,0 +1,35 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-right: 16px; + padding-left : 16px; + } +} + +.expend-options { + margin-top: 0; +} + + +@media (min-width: 1200px) { + .expend-options { + z-index : -99; + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-frame/contract-frame.component.ts b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.ts new file mode 100644 index 00000000..0a13f444 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-frame/contract-frame.component.ts @@ -0,0 +1,307 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; + +@Component({ + selector: 'app-contract-management-contract-frame', + templateUrl: './contract-frame.component.html', + styleUrls: ['./contract-frame.component.less'], + providers: [DatePipe] +}) +export class ContractManagementFrameComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + _$expand = false; + selectedRows: any[] = []; + isLoading: boolean = false; + constructor( + public service: ContractManagementService, + private nzModalService: NzModalService, + private router: Router, + public shipperservice: ShipperBaseService, + private datePipe: DatePipe, + ) { } + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + /** +* 查询参数 +*/ + get reqParams() { + const params = { + ...this.sf?.value, + } + delete params.signTime; + delete params._$expand; + if (this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')) { + params.signTime = { + start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'), + end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss'), + } + } + if (this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss')) { + params.effectiveEndTime = { + start: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss'), + end: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss'), + } + } + return { + ...params + }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同编号', + width: '100px', + className: 'text-center', + render: 'contractCode' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractTypeLabel' + }, + { + title: '合同名称', + width: '100px', + className: 'text-center', + index: 'contractName' + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '120px', className: 'text-center' }, + { title: '合同对象', index: 'contractObjectName', width: '120px', className: 'text-center' }, + { + title: '有效期至', + className: 'text-center', + width: '120px', + index: 'effectiveEndTime' + }, + { + title: '签署日期', + className: 'text-center', + width: '120px', + index: 'signTime' + }, + { + title: '状态', + className: 'text-center', + width: '120px', + type: 'badge', + index: 'esignFlowStatus', + badge: { + '0': { text: '未发起', color: 'default' }, + '1': { text: '待签章', color: 'default' }, + '2': { text: '已生效', color: 'success' }, + '3': { text: '已撤销', color: 'warning' }, + '4': { text: '已作废', color: 'warning' }, + '5': { text: '已过期', color: 'warning' }, + '7': { text: '已拒签', color: 'warning' } + } + } + ]; + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + contractCode: { + type: 'string', + title: '合同编号' + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 }, + ], + ui: { + widget: 'select', + placeholder: '请选择', + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + containAllLable: true, + } as SFSelectWidgetSchema, + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + contractObjectName: { + type: 'string', + title: '合同对象', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + signTime: { + title: '签署日期', + type: 'string', + ui: { + widget: 'custom', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + effectiveEndTime: { + title: '有效期', + type: 'string', + ui: { + widget: 'custom', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + esignFlowStatus: { + title: '状态', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'esign:flow:status' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFSelectWidgetSchema, + }, + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + approval(): void { } + + add(): void { } + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true; + } + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } +} diff --git a/src/app/routes/contract-management/components/contract-list/contract-list.component.html b/src/app/routes/contract-management/components/contract-list/contract-list.component.html new file mode 100644 index 00000000..0876e5cf --- /dev/null +++ b/src/app/routes/contract-management/components/contract-list/contract-list.component.html @@ -0,0 +1,73 @@ + + + +
    + +
    + +
    + + + +
    + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + + +
    + + + + {{ item?.contractCode }} + + + + + + + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-list/contract-list.component.less b/src/app/routes/contract-management/components/contract-list/contract-list.component.less new file mode 100644 index 00000000..e275a512 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-list/contract-list.component.less @@ -0,0 +1,35 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + z-index : -99; + } + +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-list/contract-list.component.ts b/src/app/routes/contract-management/components/contract-list/contract-list.component.ts new file mode 100644 index 00000000..f2b2d049 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-list/contract-list.component.ts @@ -0,0 +1,297 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; +import { DatePipe } from '@angular/common'; +import { ShipperBaseService } from '@shared'; + +@Component({ + selector: 'app-contract-management-contract-list', + templateUrl: './contract-list.component.html', + styleUrls: ['./contract-list.component.less'], + providers: [DatePipe] +}) +export class ContractManagementContractListComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + _$expand = false; + isLoading: boolean = false; + /** + * 查询参数 + */ + get reqParams() { + const params = { + ...this.sf?.value, + } + delete params.signTime; + delete params._$expand; + if (this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')) { + params.signTime = { + start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'), + end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss'), + } + } + return { + ...params + }; + } + selectedRows: any[] = []; + constructor( + public service: ContractManagementService, + private nzModalService: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router, + private datePipe: DatePipe, + ) { } + + ngOnInit(): void { + this.initST() + this.initSF() + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同编号', + width: '100px', + className: 'text-center', + render: 'contractCode' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractName' + }, + { + title: '业务单号', + className: 'text-center', + width: '120px', + index: 'businessCode' + }, + { + title: '签署日期', + className: 'text-center', + width: '120px', + index: 'signTime' + }, + { + title: '状态', + className: 'text-center', + width: '120px', + type: 'badge', + index: 'esignFlowStatus', + badge: { + '0': { text: '未发起', color: 'default' }, + '1': { text: '待签章', color: 'default' }, + '2': { text: '已生效', color: 'success' }, + '3': { text: '已撤销', color: 'warning' }, + '4': { text: '已作废', color: 'warning' }, + '5': { text: '已过期', color: 'warning' }, + '7': { text: '已拒签', color: 'warning' }, + }, + }, + + ]; + } + /** +* 初始化查询表单 +*/ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + contractCode: { + type: 'string', + title: '合同编号', + }, + businessCode: { + type: 'string', + title: '业务单号' + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + visibleIf: { + _$expand: (value: boolean) => value + }, + containAllLable: true, + } as SFSelectWidgetSchema + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema, + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + contractObjectName: { + type: 'string', + title: '合同对象', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + signTime: { + title: '签署日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + esignFlowStatus: { + title: '状态', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'esign:flow:status' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema, + }, + }, + type: 'object', + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + /** +* 查询字段个数 +*/ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } +} diff --git a/src/app/routes/contract-management/components/contract-partner/contract-partner.component.html b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.html new file mode 100644 index 00000000..4b5e20cd --- /dev/null +++ b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.html @@ -0,0 +1,101 @@ + + +
    + +
    + +
    + + + +
    + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + + +
    + + + + {{ item?.contractCode }} + + +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/contract-management/components/contract-partner/contract-partner.component.less b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.less new file mode 100644 index 00000000..7151df68 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.less @@ -0,0 +1,35 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-right: 16px; + padding-left : 16px; + } +} + +.expend-options { + margin-top: 0; +} + + +@media (min-width: 1200px) { + .expend-options { + z-index : -99; + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-partner/contract-partner.component.ts b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.ts new file mode 100644 index 00000000..5517e3f9 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-partner/contract-partner.component.ts @@ -0,0 +1,305 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; + +@Component({ + selector: 'app-contract-management-contract-partner', + templateUrl: './contract-partner.component.html', + styleUrls: ['./contract-partner.component.less'], + providers: [DatePipe] +}) +export class ContractManagementPartnerComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + _$expand = false; + selectedRows: any[] = []; + constructor( + public service: ContractManagementService, + private nzModalService: NzModalService, + private router: Router, + public shipperservice: ShipperBaseService, + private datePipe: DatePipe, + ) {} + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + /** + * 查询参数 + */ + get reqParams() { + const params = { + ...this.sf?.value, + } + delete params.signTime; + delete params._$expand; + if(this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')) { + params.signTime = { + start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'), + end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss'), + } + } + if(this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss')) { + params.effectiveEndTime = { + start: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss'), + end: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss'), + } + } + return { + ...params + }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同编号', + width: '100px', + className: 'text-center', + render: 'contractCode' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractType' + }, + { title: '合同名称', index: 'contractName', width: '120px', className: 'text-center' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '120px', className: 'text-center' }, + { + title: '合同对象', + className: 'text-center', + width: '120px', + index: 'contractObjectName' + }, + { + title: '有效期至', + className: 'text-center', + width: '120px', + index: 'effectiveEndTime' + }, + { + title: '签署日期', + className: 'text-center', + width: '120px', + index: 'signTime' + }, + { + title: '状态', + className: 'text-center', + width: '120px', + type: 'badge', + index: 'esignFlowStatus', + badge: { + '0': { text: '未发起', color: 'default' }, + '1': { text: '待签章', color: 'default' }, + '2': { text: '已生效', color: 'success' }, + '3': { text: '已撤销', color: 'warning' }, + '4': { text: '已作废', color: 'warning' }, + '5': { text: '已过期', color: 'warning' }, + '7': { text: '已拒签', color: 'warning' } + } + } + ]; + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + contractCode: { + type: 'string', + title: '合同编号' + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + containAllLable: true, + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + contractObjectName: { + type: 'string', + title: '合同对象', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + signTime: { + title: '签署日期', + type: 'string', + ui: { + widget: 'custom', + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + effectiveEndTime: { + title: '有效期', + type: 'string', + ui: { + widget: 'custom', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + esignFlowStatus: { + title: '状态', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'esign:flow:status' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } +} diff --git a/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.html b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.html new file mode 100644 index 00000000..ced6ae5c --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.html @@ -0,0 +1,57 @@ + + + + + + + + +
    +
    + + +
    +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.less b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.less new file mode 100644 index 00000000..ed026470 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.less @@ -0,0 +1,4 @@ +.title { +padding-right: 4px; +padding-left: 14px !important; +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.spec.ts b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.spec.ts new file mode 100644 index 00000000..0dff5ef3 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 11:01:55 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:16:31 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-detail\\contract-template-detail.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementTemplateDetailComponent } from './contract-template-detail.component'; + +describe('ContractManagementTemplateDetailComponent', () => { + let component: ContractManagementTemplateDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ContractManagementTemplateDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementTemplateDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.ts b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.ts new file mode 100644 index 00000000..a942aff9 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-detail/contract-template-detail.component.ts @@ -0,0 +1,248 @@ +import { OnChanges } from '@angular/core'; +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 11:01:55 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-30 10:45:19 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-detail\\contract-template-detail.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; + +@Component({ + selector: 'app-contract-management-template-text-complaint', + templateUrl: './contract-template-detail.component.html', + styleUrls: ['./contract-template-detail.component.less'], + providers: [DatePipe] +}) +export class ContractManagementTemplateTextComponent implements OnInit { + constructor( + private nzModalService: NzModalService, + public service: ContractManagementService, + public route: ActivatedRoute, + private datePipe: DatePipe, + private router: Router, + public shipperservice: ShipperBaseService + ) {} + textStatus = '新建模板'; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; + schema2: SFSchema = {}; + ui!: SFUISchema; + sfdata: any; + sfdata2: any; + title: any; + Types: any; + templateHTML: any; + detailList: any = { + templateName: '' + }; + isUpdate = false; + ngOnInit() { + this.initSF(); + this.initSF2(); + if (this.route.snapshot.queryParams.status == 1) { + // 新建 + this.isUpdate = true; + } else if (this.route.snapshot.queryParams.status == 2) { + // 编辑 + this.textStatus = '编辑模板'; + this.isUpdate = true; + this.initData(this.service.$api_get_contractTemplate); + } else if (this.route.snapshot.queryParams.status == 3) { + // 编辑 + this.textStatus = '查看模板'; + this.isUpdate = false; + this.initData(this.service.$api_get_contractTemplate); + } + } + goBack() { + window.history.go(-1); + } + initSF() { + this.schema = { + properties: { + templateName: { + type: 'string', + title: '模版名称' + }, + templateType: { + title: '模板类型', + type: 'string', + enum: [ + { label: '框架合同', value: 'KJ' }, + { label: '明细合同', value: 'MX' }, + { label: '合伙人合同', value: 'HHR' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (tag: any, org: any) => { + console.log(tag); + switch (tag) { + case 'MX': + this.Types = [ + { label: '订单合同', value: '1' }, + { label: '订单补充协议', value: '2' }, + { label: '运单合同', value: '3' }, + { label: '运单补充协议', value: '4' }, + { label: '委托代收合同', value: '5' }, + { label: '电子提货单', value: '10' }, + { label: '电子卸货单', value: '11' }, + ]; + this.sf.getProperty('/contractType')!.schema.enum = this.Types; + this.sf.getProperty('/contractType')!.widget.reset(this.Types); + this.sf.setValue('/contractType', this.Types); + return; + break; + case 'KJ': + this.Types = [ + { label: '网络货物运输服务合同', value: '6' }, + { label: '运输服务承揽合同', value: '7' } + ]; + this.sf.getProperty('/contractType')!.schema.enum = this.Types; + this.sf.getProperty('/contractType')!.widget.reset(this.Types); + this.sf.setValue('/contractType', this.Types); + return; + break; + case 'HHR': + this.Types = [ + { label: '企业合伙人入驻合同', value: '8' }, + { label: '个人合伙人入驻合同', value: '9' } + ]; + this.sf.getProperty('/contractType')!.schema.enum = this.Types; + this.sf.getProperty('/contractType')!.widget.reset(this.Types); + this.sf.setValue('/contractType', this.Types); + return; + break; + default: + break; + } + } + } + }, + signingObject: { + type: 'string', + title: '承包商对象', + enum: [ + { label: '货主', value: '1' }, + { label: '司机', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + enum: this.Types, + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLable: true, + visibleIf: { + templateType: value => value === 'MX' + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + templateType: value => value === 'KJ' || value === 'HHR' + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + } + }, + required: ['templateName', 'templateType'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 8 } + } + }; + } + initSF2(data?: any) { + this.schema2 = { + properties: { + templateContent: { + type: 'string', + title: '', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 650 + } + }, + default: data?.agreementContent || '' + } + } + }; + } + initData(url: string) { + console.log('编辑'); + + this.service.request(url, { id: this.route.snapshot.params.id }).subscribe(res => { + if (res) { + this.detailList = res; + this.title = this.detailList?.templateName; + this.sfdata = res; + this.sfdata2 = res; + } + }); + } + cancel() { + window.history.go(-1); + } + + save() { + // if (!this.sf.value.templateName || !this.sf.value.templateType || !this.sf2.value.templateContent || !this.title) { + // this.service.msgSrv.error('必填参数为空,请检查再重新保存!'); + // return; + // } + // if (this.sf.value.templateType == 'MX') { + // if (this.sf.value.contractType == '') { + // this.service.msgSrv.error('必填参数为空,请检查再重新保存!'); + // return; + // } + // } + const params = { + ...this.sf.value, + ...this.sf2.value, + templateTitle: this.title || this.detailList.templateName + }; + console.log(params); + this.service.request(this.service.$api_save_contractTemplate, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.router.navigate(['/contract-management/template']); + } + }); + } +} diff --git a/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.html b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.html new file mode 100644 index 00000000..7246f2c3 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.html @@ -0,0 +1,87 @@ + + + + +
    + +
    + +
    + + + +
    + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + +
    +
    + + + {{ item.templateName }} + + + + 货主 + 司机 + + +
    +
    diff --git a/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.less b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.less new file mode 100644 index 00000000..9df98f26 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.less @@ -0,0 +1,4 @@ +.NewBtn{ + float: right; + margin-bottom: 15px; +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.spec.ts b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.spec.ts new file mode 100644 index 00000000..953a80ed --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 09:45:47 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 10:25:58 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementTemplateFrameComponent } from './contract-template-frame.component'; + +describe('ContractManagementTemplateFrameComponent', () => { + let component: ContractManagementTemplateFrameComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ContractManagementTemplateFrameComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementTemplateFrameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.ts b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.ts new file mode 100644 index 00000000..0241608e --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-frame/contract-template-frame.component.ts @@ -0,0 +1,252 @@ +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { ContractManagementService } from '../../services/contract-management.service'; + + +@Component({ + selector: 'app-contract-management-template-frame-complaint', + templateUrl: './contract-template-frame.component.html', + styleUrls: ['./contract-template-frame.component.less'] +}) +export class ContractManagementTemplateFrameComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + _$expand = false; + channelId: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + constructor( + public service: ContractManagementService, + private modal: NzModalService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + templateType: 'kj', + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSTAudit(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + templateName: { + type: 'string', + title: '模板名称', + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + containAllLable: true, + } as SFSelectWidgetSchema + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同模板名称', + className: 'text-center', + render: 'templateName' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractTypeLabel' + }, + { + title: '货源类型', + width: '100px', + className: 'text-center', + index: 'resourceTypeLabel' + }, + { title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' }, + { + title: '创建时间', + className: 'text-center', + index: 'createTime', + width: '200px' + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: (_record) => this.edit(_record), + acl: { ability: ['CONTRACT-TEMPLATE-edit'] }, + }, + { + text: '删除', + click: (_record) => this.delete(_record), + acl: { ability: ['CONTRACT-TEMPLATE-delete'] }, + }, + ], + }, + ]; + } + initSTAudit() { + this.schemaView = { + properties: { + handleResult: { + title: '处理结果', + type: 'string', + maxLength: 50, + ui: { + placeholder: '最多不超过50字', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + }, + }, + }, + required: ['handleResult'] + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + edit(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 2 + } + }) + } + creatTemplate() { + this.router.navigate(['/contract-management/template/text/' + 0], { + queryParams: { + status: 1 + } + }) + } + goBack() { + window.history.go(-1) + } + view(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 3 + } + }) + } + delete(value: any) { + this.modal.confirm({ + nzTitle: '删除确认', + nzOnOk: () => + this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload() + } + }) + }); + } +} diff --git a/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.html b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.html new file mode 100644 index 00000000..235be94d --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.html @@ -0,0 +1,83 @@ + + + + +
    + +
    + +
    + + + +
    + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + +
    +
    + + + {{ item.templateName }} + + + +
    +
    diff --git a/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.less b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.less new file mode 100644 index 00000000..9df98f26 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.less @@ -0,0 +1,4 @@ +.NewBtn{ + float: right; + margin-bottom: 15px; +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.spec.ts b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.spec.ts new file mode 100644 index 00000000..8d20aa3b --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 09:45:47 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 14:09:28 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-partner\\contract-template-partner.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementTemplatePartnerComponent } from './contract-template-partner.component'; + +describe('ContractManagementTemplatePartnerComponent', () => { + let component: ContractManagementTemplatePartnerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ContractManagementTemplatePartnerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementTemplatePartnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.ts b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.ts new file mode 100644 index 00000000..24d93d4e --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template-partner/contract-template-partner.component.ts @@ -0,0 +1,252 @@ +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { ContractManagementService } from '../../services/contract-management.service'; + + +@Component({ + selector: 'app-contract-management-template-partner-complaint', + templateUrl: './contract-template-partner.component.html', + styleUrls: ['./contract-template-partner.component.less'] +}) +export class ContractManagementTemplatePartnerComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + _$expand = false; + channelId: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + constructor( + public service: ContractManagementService, + private modal: NzModalService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + templateType: 'HHR', + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSTAudit(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + templateName: { + type: 'string', + title: '模板名称', + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + containAllLable: true, + } as SFSelectWidgetSchema + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同模板名称', + className: 'text-center', + render: 'templateName' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractTypeLabel' + }, + { + title: '货源类型', + width: '100px', + className: 'text-center', + index: 'resourceTypeLabel' + }, + { title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' }, + { + title: '创建时间', + className: 'text-center', + index: 'createTime', + width: '200px' + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: (_record) => this.edit(_record), + acl: { ability: ['CONTRACT-TEMPLATE-edit'] }, + }, + { + text: '删除', + click: (_record) => this.delete(_record), + acl: { ability: ['CONTRACT-TEMPLATE-delete'] }, + }, + ], + }, + ]; + } + initSTAudit() { + this.schemaView = { + properties: { + handleResult: { + title: '处理结果', + type: 'string', + maxLength: 50, + ui: { + placeholder: '最多不超过50字', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + }, + }, + }, + required: ['handleResult'] + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + edit(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 2 + } + }) + } + creatTemplate() { + this.router.navigate(['/contract-management/template/text/' + 0], { + queryParams: { + status: 1 + } + }) + } + goBack() { + window.history.go(-1) + } + view(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 3 + } + }) + } + delete(value: any) { + this.modal.confirm({ + nzTitle: '删除确认', + nzOnOk: () => + this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload() + } + }) + }); + } +} diff --git a/src/app/routes/contract-management/components/contract-template/contract-template.component.html b/src/app/routes/contract-management/components/contract-template/contract-template.component.html new file mode 100644 index 00000000..1ecef42c --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template/contract-template.component.html @@ -0,0 +1,82 @@ + + + + +
    + +
    + +
    + + + +
    + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + +
    + +
    + +
    diff --git a/src/app/routes/contract-management/components/contract-template/contract-template.component.less b/src/app/routes/contract-management/components/contract-template/contract-template.component.less new file mode 100644 index 00000000..9df98f26 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template/contract-template.component.less @@ -0,0 +1,4 @@ +.NewBtn{ + float: right; + margin-bottom: 15px; +} \ No newline at end of file diff --git a/src/app/routes/contract-management/components/contract-template/contract-template.component.spec.ts b/src/app/routes/contract-management/components/contract-template/contract-template.component.spec.ts new file mode 100644 index 00000000..b7fbac9a --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template/contract-template.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-05 09:45:47 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 10:25:58 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementTemplateDetailComponent } from './contract-template.component'; + +describe('ContractManagementTemplateDetailComponent', () => { + let component: ContractManagementTemplateDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ContractManagementTemplateDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementTemplateDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/contract-template/contract-template.component.ts b/src/app/routes/contract-management/components/contract-template/contract-template.component.ts new file mode 100644 index 00000000..e295eb52 --- /dev/null +++ b/src/app/routes/contract-management/components/contract-template/contract-template.component.ts @@ -0,0 +1,252 @@ +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { ContractManagementService } from '../../services/contract-management.service'; + + +@Component({ + selector: 'app-contract-management-template-detail-complaint', + templateUrl: './contract-template.component.html', + styleUrls: ['./contract-template.component.less'] +}) +export class ContractManagementTemplateDetailComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + _$expand = false; + channelId: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, + ]; + constructor( + public service: ContractManagementService, + private modal: NzModalService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + templateType: 'MX', + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSTAudit(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + templateName: { + type: 'string', + title: '模板名称', + }, + signingObject: { + type: 'string', + title: '签约对象', + enum: [ + { label: '全部', value: '' }, + { label: '货主', value: 1 }, + { label: '司机', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + contractType: { + title: '合同类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'contract:type' }, + containAllLable: true, + } as SFSelectWidgetSchema + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '合同模板名称', + className: 'text-center', + render: 'templateName' + }, + { + title: '签约对象', + width: '100px', + className: 'text-center', + index: 'signingObjectLabel' + }, + { + title: '合同类型', + width: '100px', + className: 'text-center', + index: 'contractTypeLabel' + }, + { + title: '货源类型', + width: '100px', + className: 'text-center', + index: 'resourceTypeLabel' + }, + { title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' }, + { + title: '创建时间', + className: 'text-center', + index: 'createTime', + width: '200px' + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: (_record) => this.edit(_record), + acl: { ability: ['CONTRACT-TEMPLATE-edit'] }, + }, + { + text: '删除', + click: (_record) => this.delete(_record), + acl: { ability: ['CONTRACT-TEMPLATE-delete'] }, + }, + ], + }, + ]; + } + initSTAudit() { + this.schemaView = { + properties: { + handleResult: { + title: '处理结果', + type: 'string', + maxLength: 50, + ui: { + placeholder: '最多不超过50字', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + }, + }, + }, + required: ['handleResult'] + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + edit(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 2 + } + }) + } + creatTemplate() { + this.router.navigate(['/contract-management/template/text/' + 0], { + queryParams: { + status: 1 + } + }) + } + goBack() { + window.history.go(-1) + } + view(value: any) { + this.router.navigate(['/contract-management/template/text/' + value.id],{ + queryParams: { + status: 3 + } + }) + } + delete(value: any) { + this.modal.confirm({ + nzTitle: '删除确认', + nzOnOk: () => + this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + }); + } +} diff --git a/src/app/routes/contract-management/components/index/index.component.html b/src/app/routes/contract-management/components/index/index.component.html new file mode 100644 index 00000000..e8670348 --- /dev/null +++ b/src/app/routes/contract-management/components/index/index.component.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/contract-management/components/index/index.component.spec.ts b/src/app/routes/contract-management/components/index/index.component.spec.ts new file mode 100644 index 00000000..9601ea0c --- /dev/null +++ b/src/app/routes/contract-management/components/index/index.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementIndexComponent } from './index.component'; + +describe('SupplyManagementIndexComponent', () => { + let component: SupplyManagementIndexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementIndexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementIndexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/index/index.component.ts b/src/app/routes/contract-management/components/index/index.component.ts new file mode 100644 index 00000000..dfb5474a --- /dev/null +++ b/src/app/routes/contract-management/components/index/index.component.ts @@ -0,0 +1,27 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-07 13:27:10 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:17:01 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\index\\index.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, OnInit } from '@angular/core'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-supply-management-index', + templateUrl: './index.component.html', +}) +export class ContractManagementIndexComponent implements OnInit { + selectedIndex = 0; + + constructor(private http: _HttpClient, private modal: ModalHelper) { } + + ngOnInit(): void { } + + +} diff --git a/src/app/routes/contract-management/components/policy/policy.component.html b/src/app/routes/contract-management/components/policy/policy.component.html new file mode 100644 index 00000000..dfb762fc --- /dev/null +++ b/src/app/routes/contract-management/components/policy/policy.component.html @@ -0,0 +1,72 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + + + + + +
    +
    + + + {{paramValue}} + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/contract-management/components/policy/policy.component.spec.ts b/src/app/routes/contract-management/components/policy/policy.component.spec.ts new file mode 100644 index 00000000..b369df96 --- /dev/null +++ b/src/app/routes/contract-management/components/policy/policy.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementPolicyComponent } from './policy.component'; + +describe('ContractManagementPolicyComponent', () => { + let component: ContractManagementPolicyComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ContractManagementPolicyComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementPolicyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/policy/policy.component.ts b/src/app/routes/contract-management/components/policy/policy.component.ts new file mode 100644 index 00000000..542a5cbe --- /dev/null +++ b/src/app/routes/contract-management/components/policy/policy.component.ts @@ -0,0 +1,213 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ContractManagementService } from '../../services/contract-management.service'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-contract-management-policy', + templateUrl: './policy.component.html' +}) +export class ContractManagementPolicyComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + @ViewChild('promoterModal', { static: false }) + promoterModal!: any; + _$expand = false; + + selectedRows: any[] = []; + paramValue = ''; + isLoading: boolean = false; + constructor(public service: ContractManagementService, private modal: NzModalService, private router: Router) {} + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value) + }; + delete params.expand; + return params; + } + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + + openDetail(item?: any) { + this.paramValue = item?.paramValue + const modal = this.modal.create({ + nzTitle: '传入值', + nzContent: this.promoterModal, + nzOnOk: () => { + return; + } + }); + + } + + initST() { + this.columns = [ + { title: '', type: 'checkbox', width: '50px', className: 'text-center' }, + { + title: '订单ID', + width: '100px', + className: 'text-center', + index: 'billId' + }, + { + title: '项目ID', + width: '100px', + className: 'text-center', + index: 'enterpriseProjectId' + }, + { + title: '保险公司', + width: '100px', + className: 'text-center', + index: 'insuranceCompany' + }, + { + title: '投保金额', + width: '100px', + className: 'text-center', + index: 'insureAmount' + }, + + { + title: '保单号', + width: '100px', + className: 'text-center', + index: 'policyNo' + }, + { + title: '保单地址', + width: '100px', + className: 'text-center', + index: 'policyUrl' + }, + { + title: '保费', + width: '100px', + className: 'text-center', + index: 'premium' + }, + { + title: '处理消息', + width: '100px', + className: 'text-center', + index: 'processMessage' + }, + { + title: '处理结果', + width: '100px', + className: 'text-center', + index: 'processResult' + }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看传入值', + click: item => { + this.openDetail(item) + }, + acl: { ability: ['CONTRACT-POLICY-view'] }, + } + ] + } + ]; + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billId: { + type: 'string', + title: '订单id' + }, + enterpriseProjectId: { + type: 'string', + title: '项目id' + }, + insuranceCompany: { + type: 'string', + title: '保险公司' + }, + policyNo: { + type: 'string', + title: '保单号', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + }, + } + }, + processResult: { + type: 'string', + title: '处理结果', + enum: [ + { label: '全部', value: '' }, + { label: '成功', value: 1 }, + { label: '失败', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } +} diff --git a/src/app/routes/contract-management/components/template/template.component.html b/src/app/routes/contract-management/components/template/template.component.html new file mode 100644 index 00000000..fefd0d8f --- /dev/null +++ b/src/app/routes/contract-management/components/template/template.component.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/contract-management/components/template/template.component.spec.ts b/src/app/routes/contract-management/components/template/template.component.spec.ts new file mode 100644 index 00000000..f3c8d5d4 --- /dev/null +++ b/src/app/routes/contract-management/components/template/template.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContractManagementTemplateComponent } from './template.component'; + +describe('ContractManagementTemplateComponent', () => { + let component: ContractManagementTemplateComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ContractManagementTemplateComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContractManagementTemplateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/contract-management/components/template/template.component.ts b/src/app/routes/contract-management/components/template/template.component.ts new file mode 100644 index 00000000..9d1cef16 --- /dev/null +++ b/src/app/routes/contract-management/components/template/template.component.ts @@ -0,0 +1,27 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-07 13:27:10 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 10:20:23 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\template\\template.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, OnInit } from '@angular/core'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-supply-management-template', + templateUrl: './template.component.html', +}) +export class ContractManagementTemplateComponent implements OnInit { + selectedIndex = 0; + + constructor(private http: _HttpClient, private modal: ModalHelper) { } + + ngOnInit(): void { } + + +} diff --git a/src/app/routes/contract-management/contract-management-routing.module.ts b/src/app/routes/contract-management/contract-management-routing.module.ts new file mode 100644 index 00000000..35948446 --- /dev/null +++ b/src/app/routes/contract-management/contract-management-routing.module.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-04 21:05:49 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 10:24:16 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\contract-management-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { ContractManagementDetailComponent } from './components/contract-detail/contract-detail.component'; +import { ContractManagementContractListComponent } from './components/contract-list/contract-list.component'; +import { ContractManagementPartnerComponent } from './components/contract-partner/contract-partner.component'; +import { ContractManagementTemplateTextComponent } from './components/contract-template-detail/contract-template-detail.component'; +import { ContractManagementIndexComponent } from './components/index/index.component'; +import { ContractManagementPolicyComponent } from './components/policy/policy.component'; +import { ContractManagementTemplateComponent } from './components/template/template.component'; +const routes: Routes = [ + { path: 'index', component: ContractManagementIndexComponent }, + { path: 'index/detail/:id', component: ContractManagementDetailComponent }, + { path: 'template', component: ContractManagementTemplateComponent }, + { path: 'template/text/:id', component: ContractManagementTemplateTextComponent }, + { path: 'policy', component: ContractManagementPolicyComponent }, + { path: 'partner', component: ContractManagementPartnerComponent }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class ContractManagementManagementRoutingModule {} diff --git a/src/app/routes/contract-management/contract-management.module.ts b/src/app/routes/contract-management/contract-management.module.ts new file mode 100644 index 00000000..497ef5a2 --- /dev/null +++ b/src/app/routes/contract-management/contract-management.module.ts @@ -0,0 +1,47 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-04 21:05:49 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 14:09:24 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\contract-management.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared'; +import { ContractManagementManagementRoutingModule } from './contract-management-routing.module'; +import { ContractManagementContractListComponent } from './components/contract-list/contract-list.component'; +import { ContractManagementPolicyComponent } from './components/policy/policy.component'; +import { ContractManagementTemplateDetailComponent } from './components/contract-template/contract-template.component'; +import { ContractManagementIndexComponent } from './components/index/index.component'; +import { ContractManagementFrameComponent } from './components/contract-frame/contract-frame.component'; +import { ContractManagementDetailComponent } from './components/contract-detail/contract-detail.component'; +import { ContractManagementPartnerComponent } from './components/contract-partner/contract-partner.component'; +import { ContractManagementTemplateComponent } from './components/template/template.component'; +import { ContractManagementTemplateTextComponent } from './components/contract-template-detail/contract-template-detail.component'; +import { ContractManagementTemplateFrameComponent } from './components/contract-template-frame/contract-template-frame.component'; +import { ContractManagementTemplatePartnerComponent } from './components/contract-template-partner/contract-template-partner.component'; + +const COMPONENTS: any = [ + ContractManagementContractListComponent, + ContractManagementPolicyComponent, + ContractManagementTemplateDetailComponent, + ContractManagementTemplateDetailComponent, + ContractManagementIndexComponent, + ContractManagementFrameComponent, + ContractManagementDetailComponent, + ContractManagementPartnerComponent, + ContractManagementTemplateComponent, + ContractManagementTemplateTextComponent, + ContractManagementTemplateFrameComponent, + ContractManagementTemplatePartnerComponent +]; +const NOTROUTECOMPONENTS: any = []; +@NgModule({ + declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, ContractManagementManagementRoutingModule, SharedModule] +}) +export class ContractManagementManagementModule {} diff --git a/src/app/routes/contract-management/services/contract-management.service.ts b/src/app/routes/contract-management/services/contract-management.service.ts new file mode 100644 index 00000000..17cc75ca --- /dev/null +++ b/src/app/routes/contract-management/services/contract-management.service.ts @@ -0,0 +1,41 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-04 21:05:49 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-24 10:00:59 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\services\\contract-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services'; + +@Injectable({ + providedIn: 'root' +}) +export class ContractManagementService extends BaseService { + $api_get_getPremiumInformationPage = `/api/sdc/billOperate/listPremiumInformationPage`; + // 查询投诉列表 + $api_get_operate_listPage = `/api/sdc/complaint/operate/listPage`; + // 新增/更新信息 + $api_save_contractTemplate = `/api/sdc/contractTemplate/save`; + // 查询合同模板表 + $api_get_contractTemplate_page = `/api/sdc/contractTemplate/list/page`; + // 查询合同模板表详情 + $api_get_contractTemplate = `/api/sdc/contractTemplate/get`; + // 删除合同模板 + $api_deletebatch_contractTemplate = `/api/sdc/contractTemplate/deletebatch`; + + // 查询明细合同 + $api_listDetailed_page = `/api/sdc/contract/listDetailed/page`; + // 查询框架合同 + $api_listFrame_page = `/api/sdc/contract/listFrame/page`; + // 查询合伙人合同 + $api_listPartner_page = `/api/sdc/contract/listPartner/page`; + // 获取订单合同表 + $api_contract_get = `/api/sdc/contract/get`; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/dashboard/dashboard.component.html b/src/app/routes/dashboard/dashboard.component.html new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/dashboard/dashboard.component.less b/src/app/routes/dashboard/dashboard.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/dashboard/dashboard.component.ts b/src/app/routes/dashboard/dashboard.component.ts new file mode 100644 index 00000000..fe11f0cf --- /dev/null +++ b/src/app/routes/dashboard/dashboard.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.less'] +}) +export class DashboardComponent {} diff --git a/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.html b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.html new file mode 100644 index 00000000..01b5aed3 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.html @@ -0,0 +1,58 @@ + + + + +
    + +
    + + + + + + +
    + + +
    +
    +
    +
    + +
    + + +
    +
    + + + + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    环比(%) +
    + + + +
    +
    +
    +
    业绩量(元) +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.less b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.less new file mode 100644 index 00000000..af1850ca --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.less @@ -0,0 +1,21 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} +.title{ + display: flex; + align-items: center; + .box{ + width: 8px; + height: 8px; + margin-right: 10px; + border-radius: 100px; + } +} diff --git a/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.spec.ts b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.spec.ts new file mode 100644 index 00000000..00c629be --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableBusiindexComponent } from './busiindex.component'; + +describe('DatatableBusiindexComponent', () => { + let component: DatatableBusiindexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableBusiindexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableBusiindexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.ts b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.ts new file mode 100644 index 00000000..4501e8fd --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/busiindex.component.ts @@ -0,0 +1,148 @@ +import { Component, OnInit, ViewChild, NgZone } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; +import { BusitablePillarComponent } from '../pillar/pillar.component'; +import { BusitableCurveComponent } from './curve/curve.component'; + +@Component({ + selector: 'app-datatable-busiindex', + templateUrl: './busiindex.component.html', + styleUrls: ['./busiindex.component.less'], + providers: [DatePipe] + +}) +export class DatatableBusiindexComponent implements OnInit { + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('curve') private readonly curve!: BusitableCurveComponent; + @ViewChild('pillar') private readonly pillar!: BusitablePillarComponent; + type = 1; + mode = 'year'; + date: any = null; + time: any = ['2022-01-01 00:00:00'] + defineDate = []; + dateNext: any = null; + modeNext = 'year'; + timeNext: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + today = new Date(); + chartData: any = {} + + columns: STColumn[] = [ + { title: '运营主体', index: 'networkTransporterName', className: 'text-center' }, + { title: '合伙人数', index: 'partnerNumber', className: 'text-center' }, + { title: '客户数', index: 'enterpriseNumbe', className: 'text-center' }, + { title: '订单数', index: 'zsl', className: 'text-center' }, + { title: '客户预存款', index: 'czcgje', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.czcgje }) } }, + { title: '业绩量', index: 'yisje', className: 'text-center' }, + { title: '已收附加费', index: 'yisfjf', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yisfjf }) } }, + { title: '平均附加费率', index: 'fjfl', className: 'text-center',format: (item)=> { + return item.fjfl + '%' + } }, + { title: '已开票金额', index: 'ykpje', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ykpje }) } }, + ]; + /** + * 查询参数 + */ + get reqParams() { + if(this.mode === 'year') { + this.type = 1 + } else if(this.mode === 'month') { + this.type = 2 + } else if(this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + time: this.time, + type: this.type + }; + + delete params._$expand; + return { ...params }; + } + + constructor(public service: DataService, private datePipe: DatePipe, private ngZone: NgZone) { } + ngOnInit(): void { + this.initData() + } + initData(flag?: boolean){ + let type = 1 + if(this.mode === 'year') { + type = 1 + } else if(this.mode === 'month') { + type = 2 + } + if(this.modeNext === 'year') { + type = 1 + } else if(this.modeNext === 'month') { + type = 2 + } + const params: any = { + time: this.timeNext, + type + }; + this.service.request(this.service.$api_performanceReportHistogram, params).subscribe(res => { + if (res) { + this.chartData = res + if(flag) { + this.pillar.reRender() + this.curve.reRender() + } + } + }) + } + changeData(){ + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if(this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if(this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else{ + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + ' 00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + + changeDataNext() { + if(this.modeNext === 'year') { + this.dateFormat = 'yyyy' + } else if(this.modeNext === 'month') { + this.dateFormat = 'yyyy-MM' + } + } + onChangeNext(result: any) { + if(result === null) { + return + } + console.log(this.mode); + if(this.modeNext === 'year') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01 00:00:00'] + } else if(this.modeNext === 'month') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01 00:00:00'] + + console.log(this.dateNext); + console.log(this.timeNext); + + } + this.initData(true) + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + exportFun(){ + + } +} diff --git a/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.html b/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.html new file mode 100644 index 00000000..315c4e18 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.less b/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.ts b/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.ts new file mode 100644 index 00000000..764a1747 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/busiindex/curve/curve.component.ts @@ -0,0 +1,72 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-busitable-curve', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class BusitableCurveComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + setTimeout(()=>{ + this.chart.render(true) + }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + this.chart.data(this.chartData); + this.chart.render(); + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 500) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + this.chart.scale({ + year: { + range: [0, 1], + }, + number: { + min: -9999, + nice: true, + }, + }); + const itemTpl = ` +
    + 环比:  {value}% +
    +` + this.chart.tooltip({ + showCrosshairs: true, // 展示 Tooltip 辅助线 + shared: true, + itemTpl: itemTpl + }); + this.chart.line().position('time*number').label('number'); + this.chart.point().position('time*number'); + + this.chart.render(); + } + +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/mantable/mantable.component.html b/src/app/routes/datatable/components/busitable/mantable/mantable.component.html new file mode 100644 index 00000000..d6117749 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/mantable/mantable.component.html @@ -0,0 +1,42 @@ + + + + +
    +
    + + + + + + +
    + + +
    + +
    +
    + +
    + +
    + + +
    +
    + + + + +
    + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/mantable/mantable.component.less b/src/app/routes/datatable/components/busitable/mantable/mantable.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/busitable/mantable/mantable.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/mantable/mantable.component.spec.ts b/src/app/routes/datatable/components/busitable/mantable/mantable.component.spec.ts new file mode 100644 index 00000000..2aa60931 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/mantable/mantable.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableMantableComponent } from './mantable.component'; + +describe('DatatableMantableComponent', () => { + let component: DatatableMantableComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableMantableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableMantableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/busitable/mantable/mantable.component.ts b/src/app/routes/datatable/components/busitable/mantable/mantable.component.ts new file mode 100644 index 00000000..c1f60ff0 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/mantable/mantable.component.ts @@ -0,0 +1,138 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; +import { BusitablePillarComponent } from '../pillar/pillar.component'; + +@Component({ + selector: 'app-datatable-mantable', + templateUrl: './mantable.component.html', + styleUrls: ['./mantable.component.less'], + providers: [DatePipe] + +}) +export class DatatableMantableComponent implements OnInit { + @ViewChild('pillar') private readonly pillar!: BusitablePillarComponent; + @ViewChild('st') private readonly st!: STComponent; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + time: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + today = new Date(); + dateNext: any = null; + modeNext = 'year'; + chartData: any = {} + timeNext: any = ['2022-01-01 00:00:00'] + flag = false; + + columns: STColumn[] = [ + { title: '部门', index: 'bm', className: 'text-center' }, + { title: '业务员', index: 'ywy', className: 'text-center' }, + { title: '合伙人数', index: 'hhrs', className: 'text-center' }, + { title: '客户数', index: 'khs', className: 'text-center' }, + { title: '客户活跃率', index: 'khhyl', className: 'text-center' }, + { title: '客户预存款', index: 'kfyck', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.kfyck }) } }, + { title: '订单数', index: 'dds', className: 'text-center' }, + { title: '订单金额', index: 'ddje', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ddje }) } }, + { title: '业绩量', index: 'yjl', className: 'text-center' }, + { title: '附加费金额', index: 'fjfje', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfje }) } }, + { title: '平均附加费率', index: 'pjfjl', className: 'text-center' }, + { title: '已开票金额', index: 'ykpje', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ykpje }) } }, + ]; + /** + * 查询参数 + */ + get reqParams() { + if(this.mode === 'year') { + this.type = 1 + } else if(this.mode === 'month') { + this.type = 2 + } else if(this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + time: this.time, + type: this.type + }; + + delete params._$expand; + return { ...params }; + } + + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { } + + initData(){ + let type = 1 + if(this.mode === 'year') { + type = 1 + } else if(this.mode === 'month') { + type = 2 + } + const params: any = { + time: this.timeNext, + type + }; + this.service.request(this.service.$api_performanceReportHistogram, params).subscribe(res => { + if (res) { + this.chartData = res + if(this.flag) { + this.pillar.reRender() + } + } + }) + } + changeData(){ + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if(this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if(this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else{ + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + '00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + + changeDataNext() { + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } + } + onChangeNext(result: any) { + if(result === null) { + return + } + if(this.mode === 'year') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01 00:00:00'] + } + this.flag = true + this.initData() + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + exportFun(){ + + } + +} diff --git a/src/app/routes/datatable/components/busitable/pillar/pillar.component.html b/src/app/routes/datatable/components/busitable/pillar/pillar.component.html new file mode 100644 index 00000000..315c4e18 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/pillar/pillar.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/busitable/pillar/pillar.component.less b/src/app/routes/datatable/components/busitable/pillar/pillar.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/busitable/pillar/pillar.component.ts b/src/app/routes/datatable/components/busitable/pillar/pillar.component.ts new file mode 100644 index 00000000..1a5e9ae1 --- /dev/null +++ b/src/app/routes/datatable/components/busitable/pillar/pillar.component.ts @@ -0,0 +1,72 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-06 14:32:03 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-18 14:25:25 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\busitable\\pillar\\pillar.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-busitable-pillar', + templateUrl: './pillar.component.html', + styleUrls: ['./pillar.component.less'] +}) +export class BusitablePillarComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + this.chart.data(this.chartData); + this.chart.render(); + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 500) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + + const itemTpl = ` +
    + 业绩量:  {value} +
    +` + this.chart.tooltip({ + showTitle: true, + showMarkers: false, + itemTpl: itemTpl + }); + this.chart.interval().position('time*number'); + this.chart.render(); + } + +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/customer/customer.component.html b/src/app/routes/datatable/components/compliance/customer/customer.component.html new file mode 100644 index 00000000..f12c62b1 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/customer/customer.component.html @@ -0,0 +1,48 @@ + + + + +
    +
    + + +
    +
    + + + + + + +
    + + +
    +
    +
    +
    +
    +
    +
    + + + {{ item.freightPrice | currency }} + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/customer/customer.component.less b/src/app/routes/datatable/components/compliance/customer/customer.component.less new file mode 100644 index 00000000..d754ef94 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/customer/customer.component.less @@ -0,0 +1,20 @@ +.chooseBox { + display: flex; + float : right; +} + +.timeBox { + display: flex; + margin : 0 0 0 10px; +} + +.dateBox { + display: inline-block; + margin : 0 0 0 10px; +} + +:host::ng-deep { + .ant-form-item-control { + max-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/customer/customer.component.ts b/src/app/routes/datatable/components/compliance/customer/customer.component.ts new file mode 100644 index 00000000..067f73c7 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/customer/customer.component.ts @@ -0,0 +1,153 @@ +import { SFComponent } from '@delon/form'; +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-30 13:55:41 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-19 17:45:44 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\compliance\\customer\\customer.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient, DatePipe } from '@delon/theme'; +import { DataService } from '../../../services/data.service'; +import { differenceInCalendarDays } from 'date-fns'; +import { Placeholder } from '@angular/compiler/src/i18n/i18n_ast'; + +@Component({ + selector: 'app-datatable-compliance-customer', + templateUrl: './customer.component.html', + styleUrls: ['./customer.component.less'], + providers: [DatePipe] +}) +export class DatatableComplianceCustomerComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + mode = 'year'; + type = 1; + date: any = null; + defineDate = []; + time: any = ['2022']; + dateFormat = 'yyyy'; + dateNext: any = null; + modeNext = 'year'; + timeNext: any = ['2022-01-01 00:00:00']; + today = new Date(); + searchSchema: SFSchema = { + properties: { + customerName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入客户名称', + change: (value: any) => { + console.log(value); + this.st.reload({ ...this.reqParams }); + } + }, + + }, + salesmanName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入业务员', + change: (value: any) => { + this.st.reload({ ...this.reqParams }); + } + } + }, + partnerName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入客户名称', + change: (value: any) => { + console.log(value); + this.st.reload({ ...this.reqParams }); + } + } + }, + no4: { + type: 'string', + title: '', + ui: { + class: 'custom', + widget: 'custom', + grid: { xxl: 9, xl: 12, lg: 24, md: 24, sm: 24, xs: 24 } + } + } + } + }; + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = [ + { title: '公司名称',width: '200px', index: 'enterpriseName' ,}, + { title: '注册时间', width: '200px', index: 'registerTime',}, + { title: '客户类型', width: '200px', index: 'customerType' }, + { title: '业务员',width: '200px', index: 'salesmanName' }, + { title: '合伙人',width: '200px', index: 'partnerName' }, + { title: '订单数',width: '200px', index: 'billCounts' }, + { title: '订单不合格数',width: '200px', index: 'billQuaCounts' }, + { title: '订单不合格率',width: '200px', index: 'billQuaCountsPer' }, + { title: '货源单订单数',width: '200px', index: 'gsourceCounts' }, + { title: '合同单数', width: '200px',index: 'billConCounts' }, + { title: '货源单个',width: '200px', index: 'gsourceCounts' }, + { title: '运费直付单数',width: '200px', index: 'freightDirPayCounts' }, + { title: '运费代收单数',width: '200px', index: 'freightRepPayCounts' }, + { title: '手机直付', width: '200px',index: 'updatedAt' }, + { title: '汇款单数',width: '200px', index: 'updatedAt' }, + { title: '及时付款',width: '200px', index: 'timelyPayPer' }, + + ]; + + constructor(private http: _HttpClient, private modal: ModalHelper, public service: DataService, private datePipe: DatePipe) {} + /** + * 查询参数 + */ + get reqParams() { + if (this.mode === 'year') { + this.type = 1; + } else if (this.mode === 'month') { + this.type = 2; + } else if (this.mode === 'date') { + this.type = 3; + } else { + this.type = 4; + } + const params: any = Object.assign({}, this.sf?.value || {}); + params.type = this.type; + params.queryTime = this.time; + delete params._$expand; + return { ...params }; + } + ngOnInit(): void {} + onChange(result: any) { + if (this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy')]; + } else if (this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM')]; + } else if (this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd')]; + } else { + this.time = [ + this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd'), + this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ]; + } + this.st.reload({ ...this.reqParams }); + } + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy'; + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM'; + } else { + this.dateFormat = 'yyyy-MM-dd'; + } + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; +} diff --git a/src/app/routes/datatable/components/compliance/index/curve/curve.component.html b/src/app/routes/datatable/components/compliance/index/curve/curve.component.html new file mode 100644 index 00000000..7ceba0b7 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/index/curve/curve.component.html @@ -0,0 +1,2 @@ + + diff --git a/src/app/routes/datatable/components/compliance/index/curve/curve.component.less b/src/app/routes/datatable/components/compliance/index/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/compliance/index/curve/curve.component.ts b/src/app/routes/datatable/components/compliance/index/curve/curve.component.ts new file mode 100644 index 00000000..0dbacb97 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/index/curve/curve.component.ts @@ -0,0 +1,91 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { G2MiniAreaClickItem } from '@delon/chart/mini-area'; + +// import DataSet from '@antv/data-set'; +const DataSet = require('@antv/data-set'); +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-compliance-curve', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class ComplianceCurveComponent implements OnInit,OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + console.log(this.chartData) + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 1000) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + this.chart.scale({ + time: { + range: [0, 1], + }, + number: { + min: 0, + nice: true, + }, + }); + + this.chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + this.chart.axis('proportion', { + label: { + formatter: (val: any) => { + return val*100+ ' %'; + }, + }, + }); + + this.chart + .line() + .position('situationDate*proportion') + .color('type') + .tooltip('proportion*type', function(name: any, value: any) { + return { + name: name*100+'%', + value: value + }; + }); + + this.chart.render(); + + } +} diff --git a/src/app/routes/datatable/components/compliance/index/index.component.html b/src/app/routes/datatable/components/compliance/index/index.component.html new file mode 100644 index 00000000..5b3c4635 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/index/index.component.html @@ -0,0 +1,67 @@ + + + + +
    +
    + +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    + 合格:{{cardData1?.leftQuantity}} 不合格:{{cardData1?.rightQuantity}} +
    +
    +
    +
    +
    + + +
    + 货源单:{{cardData2?.leftQuantity}} 合同单:{{cardData2?.rightQuantity}} +
    +
    +
    +
    +
    + + +
    + 司机:{{cardData3?.leftQuantity}} 车队长:{{cardData3?.rightQuantity}} +
    +
    +
    +
    +
    + + +
    + 准时:{{cardData4?.leftQuantity}} 逾期:{{cardData4?.rightQuantity}} +
    +
    +
    +
    +
    + + + + + diff --git a/src/app/routes/datatable/components/compliance/index/index.component.less b/src/app/routes/datatable/components/compliance/index/index.component.less new file mode 100644 index 00000000..3d0d3e63 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/index/index.component.less @@ -0,0 +1,17 @@ +.card-f{ + color: #5a5a5a; + .card-f-l{ + margin-right: 24px; + } +} +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/index/index.component.ts b/src/app/routes/datatable/components/compliance/index/index.component.ts new file mode 100644 index 00000000..b545a4f5 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/index/index.component.ts @@ -0,0 +1,263 @@ +import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core'; +import { DatePipe, ModalHelper, _HttpClient } from '@delon/theme'; +import { G2MiniAreaClickItem, G2MiniAreaData } from '@delon/chart/mini-area'; +import { format } from 'date-fns'; +import { SFComponent, SFDateWidgetSchema, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { G2TimelineData, G2TimelineMap } from '@delon/chart/timeline'; +import { Chart } from '@antv/g2'; +import { DataService } from '../../../services/data.service'; +import { ComplianceCurveComponent } from './curve/curve.component'; + +@Component({ + selector: 'app-datatable-compliance-index', + templateUrl: './index.component.html', + styleUrls: ['./index.component.less'], + providers: [DatePipe] +}) +export class DatatableComplianceIndexComponent implements OnInit { + @ViewChild('curve') private readonly curve!: ComplianceCurveComponent; + @ViewChild('sf', { static: false }) + + sf!: SFComponent; + ui!: SFUISchema; + schema: SFSchema = {}; + + mode = 'year'; + date: any = null; + dateFormat = 'yyyy'; + time: any = '2022' + chartData: any = {} + + cardData1:any; + cardData2:any; + cardData3:any; + cardData4:any; + + constructor(private http: _HttpClient, private modal: ModalHelper, private ngZone: NgZone,public service: DataService, private datePipe: DatePipe) {} + + ngOnInit(): void { + this.initSF(); + this.initdData(); + } + + initdData(){ + const params ={ + ...this.sf?.value, + timeType:this.mode ==='month'?'M':'Y', + time:this.time + } + this.service.request(this.service.$api_getBillRateQualified, params).subscribe(res => { + if (res) { + this.cardData1 = res; + this.cardData1.proportion = this.cardData1.proportion*100 +'%' + } + }); + this.service.request(this.service.$api_getBillRateProportion, params).subscribe(res => { + if (res) { + this.cardData2 = res; + this.cardData2.proportion = this.cardData2.proportion*100 +'%' + } + }); + this.service.request(this.service.$api_getBillRateDirectPayment, params).subscribe(res => { + if (res) { + this.cardData3 = res; + this.cardData3.proportion = this.cardData3.proportion*100 +'%' + } + }); + this.service.request(this.service.$api_getBillTimelyPayment, params).subscribe(res => { + if (res) { + this.cardData4 = res; + this.cardData4.proportion = this.cardData4.proportion*100 +'%' + } + }); + + this.service.request(this.service.$api_listMonitorSituation, params).subscribe(res => { + if (res) { + this.chartData = res + this.curve.reRender(); + + } + }) + } + + + changeData(){ + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } + + } + + onChange(result: any) { + if(result === null) { + return + } + if(this.mode === 'year') { + this.time = this.datePipe.transform(this.date, 'yyyy') + } else if(this.mode === 'month') { + this.time = this.datePipe.transform(this.date, 'yyyy-MM') + } + this.initdData(); + } + + initSF() { + this.schema = { + properties: { + enterpriseInfoId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '网络货运人', + asyncData: () => this.service.getNetworkFreightForwarder({}), + change:()=>{ + this.initdData(); + }, + allowClear: true + } + }, + enterpriseProjectId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '部门' + } + }, + salesmanId: { + type: 'string', + title: '', + ui: { + placeholder: '业务员', + enter: () => this.initdData(), + } + } + } + }; + this.ui = { + '*': { + grid: { span: 4 } + } + }; + + } + + + + + render(el: ElementRef) { + this.ngZone.runOutsideAngular(() => this.init(el.nativeElement)); + } + + private init(el: HTMLElement): void { + const chart = new Chart({ + container: el, + autoFit: true, + height: 400 + }); + // 以三组数据为例, 需要展示 91/92/93年中a/b/c数据走势 + const data = [ + { data: '1月', label: '订单合格率', value: 5 }, + { data: '2月', label: '订单合格率', value: 10 }, + { data: '3月', label: '订单合格率', value: 25 }, + { data: '4月', label: '订单合格率', value: 35 }, + { data: '5月', label: '订单合格率', value: 15 }, + { data: '6月', label: '订单合格率', value: 5 }, + { data: '7月', label: '订单合格率', value: 95 }, + { data: '8月', label: '订单合格率', value: 45 }, + + { data: '1月', label: '付款及时率', value: 10 }, + { data: '2月', label: '付款及时率', value: 15 }, + { data: '3月', label: '付款及时率', value: 30 }, + { data: '4月', label: '付款及时率', value: 8 }, + { data: '5月', label: '付款及时率', value: 9 }, + { data: '6月', label: '付款及时率', value: 5 }, + { data: '7月', label: '付款及时率', value: 80 }, + { data: '8月', label: '付款及时率', value: 55 }, + + { data: '1月', label: '货源占比率', value: 90 }, + { data: '2月', label: '货源占比率', value: 30 }, + { data: '3月', label: '货源占比率', value: 45 }, + { data: '4月', label: '货源占比率', value: 35 }, + { data: '5月', label: '货源占比率', value: 95 }, + { data: '6月', label: '货源占比率', value: 35 }, + { data: '7月', label: '货源占比率', value: 65 }, + { data: '8月', label: '货源占比率', value: 63 }, + + { data: '1月', label: '运费直付占比', value: 30 }, + { data: '2月', label: '运费直付占比', value: 60 }, + { data: '3月', label: '运费直付占比', value: 25 }, + { data: '4月', label: '运费直付占比', value: 35 }, + { data: '5月', label: '运费直付占比', value: 15 }, + { data: '6月', label: '运费直付占比', value: 55 }, + { data: '7月', label: '运费直付占比', value: 50 }, + { data: '8月', label: '运费直付占比', value: 30 }, + ]; + + chart.data(data); + //刻度自定义 + chart.scale({ + data: { + range: [0, 1], + }, + value: { + min: 0, + nice: true, + }, + }); + // 图表下方图形文字自定义 + chart.legend({ + items:[ + { + name: '订单合格率', + value: 'node_load1', + marker: { + symbol: 'circle', + style: {fill: '#6193f7'} + }, + }, + { + name: '付款及时率', + value: 'node_load2', + marker: {symbol: 'circle',style: {fill: '#58d3a2'}}, + }, + { + name: '货源占比率', + value: 'node_load13', + marker: {symbol: 'circle',style: {fill: '#5b6d8f'}}, + }, + { + name: '运费直付占比', + value: 'node_load13', + marker: {symbol: 'circle',style: {fill: '#f0b915'}}, + }, + ] + }); + // 提示自定义 + chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + //数据格式化 + chart.axis('value', { + label: { + formatter: (val) => { + return val + ' %'; + }, + }, + }); + // 在x*y的坐标点上按z值绘制线条, 如果z值相同将使用直线连接 + chart.line().position('data*value').color('label').tooltip('label*value', (name:any, value:any) => { + return { + name: name, + value: value + '%' + }; + });; + // 在x*y的坐标上按z值绘制圆点 + chart.point().position('data*value').size(4).color('label').shape('circle'); + chart.render(); + } +} diff --git a/src/app/routes/datatable/components/compliance/salesman/salesman.component.html b/src/app/routes/datatable/components/compliance/salesman/salesman.component.html new file mode 100644 index 00000000..ea425eca --- /dev/null +++ b/src/app/routes/datatable/components/compliance/salesman/salesman.component.html @@ -0,0 +1,46 @@ + + + + + +
    +
    + + +
    +
    + + + + + + +
    + + +
    +
    +
    +
    +
    +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/salesman/salesman.component.less b/src/app/routes/datatable/components/compliance/salesman/salesman.component.less new file mode 100644 index 00000000..d754ef94 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/salesman/salesman.component.less @@ -0,0 +1,20 @@ +.chooseBox { + display: flex; + float : right; +} + +.timeBox { + display: flex; + margin : 0 0 0 10px; +} + +.dateBox { + display: inline-block; + margin : 0 0 0 10px; +} + +:host::ng-deep { + .ant-form-item-control { + max-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/compliance/salesman/salesman.component.ts b/src/app/routes/datatable/components/compliance/salesman/salesman.component.ts new file mode 100644 index 00000000..d8dc8f23 --- /dev/null +++ b/src/app/routes/datatable/components/compliance/salesman/salesman.component.ts @@ -0,0 +1,220 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-datatable-compliance-salesman', + templateUrl: './salesman.component.html', + styleUrls: ['./salesman.component.less'], + providers: [DatePipe] + +}) +export class DatatableComplianceSalesmanComponent implements OnInit { + url = `/user`; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + time: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + today = new Date(); + ui: SFUISchema = {}; + schema: SFSchema = {}; + isLoading: boolean = false; + searchSchema: SFSchema = { + properties: { + department: { + type: 'string', + title: '', + ui: { + placeholder: '请选择部门', + change: (value: any) => { + console.log(value); + this.st.reload({ ...this.reqParams }); + } + }, + + }, + customerName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入业务员', + change: (value: any) => { + console.log(value); + this.st.reload({ ...this.reqParams }); + } + }, + }, + salesmanName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入客户名称', + change: (value: any) => { + this.st.reload({ ...this.reqParams }); + } + } + }, + no4: { + type: 'string', + title: '', + ui: { + class: 'custom', + widget: 'custom', + grid: { xxl: 9, xl: 10, lg: 12, md: 24, sm: 24, xs: 24 } + + } + } + }, + + }; + columns: STColumn[] = [ + { title: '部门', index: 'department', className: 'text-center', width: '200px' }, + { title: '业务员', index: 'salesmen', className: 'text-center', width: '100px' }, + { title: '客户数', index: 'cusCount', className: 'text-right', width: '100px', }, + { title: '订单数', index: 'billCount', className: 'text-center', width: '120px' }, + { title: '订单合格率', index: 'billComPer', className: 'text-right', width: '100px',format: (item: any) => {return ((item?.billComPer)*100).toFixed(2) + '%' }}, + { title: '付款及时率', index: 'payTimePer', className: 'text-center', width: '130px',format: (item: any) => {return ((item?.payTimePer)*100).toFixed(2) + '%'  } }, + { title: '货源单占比', index: 'goodResPer', className: 'text-right', width: '120px',format: (item: any) => {return ((item?.goodResPer)*100).toFixed(2) + '%'  } }, + { title: '运费直付占比', index: 'feightPayPer', className: 'text-right', width: '100px', format: (item: any) => {return ((item?.feightPayPer)*100).toFixed(2) + '%'  } }, + ]; + /** + * 查询参数 + */ + get reqParams() { + if(this.mode === 'year') { + this.type = 1 + } else if(this.mode === 'month') { + this.type = 2 + } else if(this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + time: this.time, + type: this.type, + ...this.sf?.value + }; + + delete params._$expand; + return { ...params }; + } + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { + this.initSF(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + type: 'string', + title: '货主名称', + ui: { + placeholder: '请输入', + } + }, + customerType: { + type: 'string', + title: '客户类型', + ui: { + widget: 'select', + placeholder: '请选择', + }, + enum: [ + {label: '直客', value: 2}, + {label: '渠道客户', value: 3}, + {label: '平台客户', value: 1}, + ] + }, + customerStatus: { + type: 'string', + title: '客户状态', + ui: { + widget: 'select', + placeholder: '请选择', + }, + enum: [ + {label: '未激活', value: 1}, + {label: '沉默', value: 2}, + {label: '流失', value: 3}, + {label: '活跃', value: 4}, + ] + }, + registerTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to', type: 'date', format: 'yyyy-MM-dd', visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + changeData(){ + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if(result === null) { + return + } + if(this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if(this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else{ + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + '00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + + export() { + // this.service.downloadFile(this.service.$api_exportUploadBill, this.sf.value, {}); + } + search() { + this.st?.load(1) + + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } +} diff --git a/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.html b/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.html new file mode 100644 index 00000000..0640a4d4 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.less b/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.ts b/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.ts new file mode 100644 index 00000000..ff90b80c --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/curve/curve.component.ts @@ -0,0 +1,92 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-06 13:43:29 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-06 19:20:24 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\customtable\\customindex\\curve\\curve.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-datatable-customindex-curve', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class DatatableCustomindexCurveComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + },500) + console.log(this.chartData); + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + this.chart.scale({ + time: { + range: [0, 1], + }, + number: { + nice: true, + }, + }); + + this.chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + this.chart.axis('number', { + label: { + formatter: (val: any) => { + return val; + }, + }, + }); + + this.chart + .line() + .position('time*number') + .color('name') + + + this.chart.render(); + + } + +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/customindex/customindex.component.html b/src/app/routes/datatable/components/customtable/customindex/customindex.component.html new file mode 100644 index 00000000..b41b90b2 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/customindex.component.html @@ -0,0 +1,99 @@ + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + + + + +
    + + +
    +
    +
    +
    + + +
    货主
    +
    合伙人
    +
    司机
    +
    车辆
    +
    +
    +
    + + +
    +
    + + + + +
    + +
    +
    +
    +
    + +
    diff --git a/src/app/routes/datatable/components/customtable/customindex/customindex.component.less b/src/app/routes/datatable/components/customtable/customindex/customindex.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/customindex.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/customindex/customindex.component.spec.ts b/src/app/routes/datatable/components/customtable/customindex/customindex.component.spec.ts new file mode 100644 index 00000000..09bf44a2 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/customindex.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableCustomindexComponent } from './customindex.component'; + +describe('DatatableCustomindexComponent', () => { + let component: DatatableCustomindexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableCustomindexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableCustomindexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/customtable/customindex/customindex.component.ts b/src/app/routes/datatable/components/customtable/customindex/customindex.component.ts new file mode 100644 index 00000000..7f9d4954 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/customindex/customindex.component.ts @@ -0,0 +1,236 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent } from '@delon/form'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; +import { DatatableCustomindexCurveComponent } from './curve/curve.component'; + +@Component({ + selector: 'app-datatable-customindex', + templateUrl: './customindex.component.html', + styleUrls: ['./customindex.component.less'], + providers: [DatePipe] +}) +export class DatatableCustomindexComponent implements OnInit { + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('curve') private readonly curve!: DatatableCustomindexCurveComponent; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + timeStart: any = '2022-01-01'; + timeEnd: any = '2022-12-31'; + dateFormat = 'yyyy'; + today = new Date(); + dateNext: any = null; + modeNext = 'year'; + timeNext: any = ['2022-01-01 00:00:00']; + chartData: any = []; + flag = false; + + columns: STColumn[] = [ + { title: '用户类型', render: 'type', className: 'text-center' }, + { title: '用户总数', index: 'total', className: 'text-center' }, + { title: '已认证数量', index: 'auditPassTotal', className: 'text-center' }, + { title: '活跃用户数', index: 'activeTotal', className: 'text-center' }, + { title: '未激活用户数', index: 'notActivationTotal', className: 'text-center' }, + { title: '沉默用户数', index: 'silentTotal', className: 'text-center' }, + { title: '流失用户数', index: 'drainTotal', className: 'text-center' }, + { title: '流失率', index: 'drainRate', className: 'text-center',format: (item: any) => {return ((item?.drainRate)*100).toFixed(2) + '%' }} + ]; + hzData: any; + hhrData: any = { + total: 0 + }; + sjData: any; + clData: any; + reportData: any = []; + + constructor(public service: DataService, private datePipe: DatePipe) {} + ngOnInit(): void { + this.initCurveData(); + } + initCurveData() { + this.cardData(); + this.listData(); + this.addData('year', '2022-01-01'); + } + listData(type?: string, stime?: any, etime?: any) { + this.reportData = []; + this.service + .request(this.service.$api_statistics_totalDetail, { + dateStart: stime || this.timeStart, + dateEnd: etime || this.timeEnd, + type: 1 //用户角色类型 1:货主 2:合伙人 3:司机 4:车辆 + }) + .subscribe(res => { + if (res) { + this.reportData.push(res); + this.st.reload(); + } + }); + this.service + .request(this.service.$api_statistics_totalDetail, { + dateStart: stime || this.timeStart, + dateEnd: etime || this.timeEnd, + type: 2 + }) + .subscribe(res => { + if (res) { + this.reportData.push(res); + this.st.reload(); + } + }); + this.service + .request(this.service.$api_statistics_totalDetail, { + dateStart: stime || this.timeStart, + dateEnd: etime || this.timeEnd, + type: 3 + }) + .subscribe(res => { + if (res) { + this.reportData.push(res); + this.st.reload(); + } + }); + this.service + .request(this.service.$api_statistics_totalDetail, { + dateStart: stime || this.timeStart, + dateEnd: etime || this.timeEnd, + type: 4 + }) + .subscribe(res => { + if (res) { + this.reportData.push(res); + this.st.reload(); + } + }); + } + cardData() { + this.service.request(this.service.$api_statistics_total, { type: 1 }).subscribe(res => { + if (res) { + this.hzData = res; + } + }); + this.service.request(this.service.$api_statistics_total, { type: 2 }).subscribe(res => { + if (res) { + + this.hhrData = res; + console.log(this.hhrData); + + } + }); + this.service.request(this.service.$api_statistics_total, { type: 3 }).subscribe(res => { + if (res) { + this.sjData = res; + } + }); + this.service.request(this.service.$api_statistics_total, { type: 4 }).subscribe(res => { + if (res) { + this.clData = res; + } + }); + } + addData(type?: string, time?: any) { + this.chartData = [] + this.service + .request(this.service.$api_statistics_totalAdd, { + date: time, + dateType: type === 'month' ? 2 : 1, //日期类型 1:年 2:月 + type: 1 + }) + .subscribe(res => { + if (res) { + this.chartData.push(...res); + console.log(this.curve); + this.curve.reRender(); + } + }); + this.service + .request(this.service.$api_statistics_totalAdd, { + date: time, + dateType: type === 'month' ? 2 : 1, //日期类型 1:年 2:月 + type: 2 + }) + .subscribe(res => { + if (res) { + this.chartData.push(...res); + this.curve.reRender(); + } + }); + this.service + .request(this.service.$api_statistics_totalAdd, { + date: time, + dateType: type === 'month' ? 2 : 1, //日期类型 1:年 2:月 + type: 3 + }) + .subscribe(res => { + if (res) { + this.chartData.push(...res); + this.curve.reRender(); + } + }); + this.service + .request(this.service.$api_statistics_totalAdd, { + date: time, + dateType: type === 'month' ? 2 : 1, //日期类型 1:年 2:月 + type: 4 + }) + .subscribe(res => { + if (res) { + this.chartData.push(...res); + this.curve.reRender(); + } + }); + } + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy'; + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM'; + } else { + this.dateFormat = 'yyyy-MM-dd'; + } + } + onChange(result: any) { + if (this.mode === 'year') { + this.timeStart = this.datePipe.transform(this.date, 'yyyy') + '-01-01'; + this.timeEnd = this.datePipe.transform(this.date, 'yyyy') + '-12-31'; + + } else if (this.mode === 'month') { + this.timeStart = this.datePipe.transform(this.date, 'yyyy-MM') + '-01' ; + this.timeEnd = this.datePipe.transform(this.date, 'yyyy-MM') + '-31'; + } else if (this.mode === 'date') { + this.timeStart=this.datePipe.transform(this.date, 'yyyy-MM-dd'); + this.timeEnd = this.datePipe.transform(this.date, 'yyyy-MM-dd') ; + } else { + this.timeStart = this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') ; + this.timeEnd = this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd'); + } + this.listData(this.mode, this.timeStart, this.timeEnd); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + + changeDataNext2() { + if (this.modeNext === 'year') { + this.dateFormat = 'yyyy'; + } else if (this.modeNext === 'month') { + this.dateFormat = 'yyyy-MM'; + } + } + onChangeNext(result: any) { + if (result === null) { + return; + } + if (this.modeNext === 'year') { + this.timeNext = this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01'; + } else if (this.modeNext === 'month') { + this.timeNext = this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01'; + } + this.addData(this.modeNext, this.timeNext); + } +} diff --git a/src/app/routes/datatable/components/customtable/driver/driver.component.html b/src/app/routes/datatable/components/customtable/driver/driver.component.html new file mode 100644 index 00000000..e636c1a1 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/driver/driver.component.html @@ -0,0 +1,46 @@ + + + + +
    + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + + + + + + +
    + + +
    + +
    +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/driver/driver.component.less b/src/app/routes/datatable/components/customtable/driver/driver.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/customtable/driver/driver.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/driver/driver.component.spec.ts b/src/app/routes/datatable/components/customtable/driver/driver.component.spec.ts new file mode 100644 index 00000000..6a2084a2 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/driver/driver.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableDriverComponent } from './driver.component'; + +describe('DatatableDriverComponent', () => { + let component: DatatableDriverComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableDriverComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableDriverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/customtable/driver/driver.component.ts b/src/app/routes/datatable/components/customtable/driver/driver.component.ts new file mode 100644 index 00000000..e24a58c5 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/driver/driver.component.ts @@ -0,0 +1,178 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-datatable-driver', + templateUrl: './driver.component.html', + styleUrls: ['./driver.component.less'], + providers: [DatePipe] +}) +export class DatatableDriverComponent implements OnInit { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + queryTime: any = [new Date().getFullYear()] + dateFormat = 'yyyy'; + today = new Date(); + ui: SFUISchema = {}; + schema: SFSchema = {}; + + columns: STColumn[] = [ + { title: '司机姓名', index: 'driverName', className: 'text-center' }, + { title: '手机号', index: 'driverPhone', className: 'text-center' }, + { title: '注册时间', index: 'driverRegisterTime', className: 'text-center' }, + { + title: '司机状态', index: 'driverStatus', className: 'text-center', type: 'enum', enum: { + 0: '未激活', + 1: '活跃', + 2: '沉默', + 3: '流失', + } + }, + { title: '运单数', index: 'wbAllCount', className: 'text-center' }, + { title: '待接单运单', index: 'wbWaitCount', className: 'text-center' }, + { title: '已完成运单', index: 'wbOverCount', className: 'text-center' }, + { title: '运费金额', index: 'wbAllAmount', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.wbAllAmount }) } }, + { title: '已收运费金额', index: 'wbGetAmount', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.wbGetAmount }) } }, + { title: '待收运费金额', index: 'wbWaitAmount', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.wbWaitAmount }) } }, + ]; + isLoading: boolean = false; + /** + * 查询参数 + */ + get reqParams() { + if (this.mode === 'year') { + this.type = 1 + } else if (this.mode === 'month') { + this.type = 2 + } else if (this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + queryTime: this.queryTime, + ...this.sf?.value + }; + + delete params._$expand; + return { ...params }; + } + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { + this.initSF(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + driverName: { + type: 'string', + title: '司机姓名', + ui: { + placeholder: '请输入', + } + }, + driverPhone: { + type: 'string', + title: '手机号', + ui: { + placeholder: '请选择', + } + }, + driverStatus: { + type: 'string', + title: '司机状态', + ui: { + widget: 'select', + placeholder: '请选择', + }, + enum: [ + { label: '未激活', value: 0 }, + { label: '活跃', value: 1 }, + { label: '沉默', value: 2 }, + { label: '流失', value: 3 }, + ] + }, + driverRegisterTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to', type: 'date', format: 'yyyy-MM-dd', visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } + } + onChange(result: any) { + if(result === null) { + return + } + // if (this.mode === 'year') { + // this.queryTime = this.datePipe.transform(this.date, 'yyyy') + // } else if (this.mode === 'month') { + // this.queryTime = this.datePipe.transform(this.date, 'yyyy-MM') + // } + + if(this.mode === 'year') { + this.queryTime = [this.datePipe.transform(this.date, 'yyyy')] + } else if(this.mode === 'month') { + this.queryTime = [this.datePipe.transform(this.date, 'yyyy-MM')] + } else if(this.mode === 'date') { + this.queryTime = [this.datePipe.transform(this.date, 'yyyy-MM-dd')] + } else{ + this.queryTime = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd'), this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd')] + } + + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + + export() { + // this.service.downloadFile(this.service.$api_exportUploadBill, this.sf.value, {}); + } + search() { + this.st?.load(1) + + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } +} diff --git a/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.html b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.html new file mode 100644 index 00000000..8fd0ca34 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.html @@ -0,0 +1,51 @@ + + + + + + + + + +
    +
    + + +
    +
    + + + + + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.less b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.less new file mode 100644 index 00000000..d754ef94 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.less @@ -0,0 +1,20 @@ +.chooseBox { + display: flex; + float : right; +} + +.timeBox { + display: flex; + margin : 0 0 0 10px; +} + +.dateBox { + display: inline-block; + margin : 0 0 0 10px; +} + +:host::ng-deep { + .ant-form-item-control { + max-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.spec.ts b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.spec.ts new file mode 100644 index 00000000..8df0f556 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableMancustomtableComponent } from './mancustomtable.component'; + +describe('DatatableMancustomtableComponent', () => { + let component: DatatableMancustomtableComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableMancustomtableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableMancustomtableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.ts b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.ts new file mode 100644 index 00000000..d6d5b692 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/mancustomtable/mancustomtable.component.ts @@ -0,0 +1,345 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-datatable-mancustomtable', + templateUrl: './mancustomtable.component.html', + styleUrls: ['./mancustomtable.component.less'], + providers: [DatePipe] +}) +export class DatatableMancustomtableComponent implements OnInit { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + columns: STColumn[] = []; + resourceStatus: number = 1; + time: any = ['2022-01-01 00:00:00']; + dateFormat = 'yyyy'; + today = new Date(); + ui: SFUISchema = {}; + schema: SFSchema = {}; + isLoading: boolean = false; + searchSchema: SFSchema = { + properties: { + customerName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入客户名称', + change: (value: any) => { + console.log(value); + this.st.reload({ ...this.reqParams }); + } + } + }, + salesmanName: { + type: 'string', + title: '', + ui: { + placeholder: '请输入业务员', + change: (value: any) => { + this.st.reload({ ...this.reqParams }); + } + } + }, + no4: { + type: 'string', + title: '', + ui: { + class: 'custom', + widget: 'custom', + grid: { xxl: 12, xl: 12, lg: 24, md: 24, sm: 24, xs: 24 } + } + } + } + }; + initST() { + this.columns = [ + { title: '部门', index: 'department', className: 'text-center', width: '150px' }, + { title: '业务员', index: 'salesmen', className: 'text-center', width: '150px' }, + { + title: '已认证货主数', + index: 'certifiedCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '已认证合伙人', + index: 'certifiedCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '新增合伙人数', + index: 'addCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '合伙人活跃率', + index: 'alivePer', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '活跃合伙人数', + index: 'aliveCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '沉默合伙人数', + index: 'silentCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '流失合伙人数', + index: 'drainCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + { + title: '未激活合伙人数', + index: 'notActiveCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 2 ? false : true; + } + }, + + { + title: '新增货主数', + index: 'addCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '货主活跃率', + index: 'alivePer', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '活跃货主数', + index: 'aliveCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '沉默货主数', + index: 'silentCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '流失货主数', + index: 'drainCount', + className: 'text-right', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + }, + { + title: '未激活货主数', + index: 'notActiveCount', + className: 'text-center', + width: '150px', + iif: () => { + return this?.resourceStatus !== 1 ? false : true; + } + } + ]; + } + /** + * 查询参数 + */ + get reqParams() { + if (this.mode === 'year') { + this.type = 1; + } else if (this.mode === 'month') { + this.type = 2; + } else if (this.mode === 'date') { + this.type = 3; + } else { + this.type = 4; + } + let params: any = { + time: this.time, + type: this.type, + parType: this.resourceStatus, + ...this.sf?.value + }; + + delete params._$expand; + delete params.sort; + return { ...params }; + } + constructor(public service: DataService, private datePipe: DatePipe) {} + ngOnInit(): void { + this.initSF(); + this.initST(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + type: 'string', + title: '货主名称', + ui: { + placeholder: '请输入' + } + }, + customerType: { + type: 'string', + title: '客户类型', + ui: { + widget: 'select', + placeholder: '请选择' + }, + enum: [ + { label: '直客', value: 2 }, + { label: '渠道客户', value: 3 }, + { label: '平台客户', value: 1 } + ] + }, + customerStatus: { + type: 'string', + title: '客户状态', + ui: { + widget: 'select', + placeholder: '请选择' + }, + enum: [ + { label: '未激活', value: 1 }, + { label: '沉默', value: 2 }, + { label: '流失', value: 3 }, + { label: '活跃', value: 4 } + ] + }, + registerTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy'; + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM'; + } else { + this.dateFormat = 'yyyy-MM-dd'; + } + } + onChange(result: any) { + if (result === null) { + return; + } + if (this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00']; + } else if (this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00']; + } else if (this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00']; + } else { + this.time = [ + this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + '00:00:00', + this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00' + ]; + } + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + + export() { + // this.service.downloadFile(this.service.$api_exportUploadBill, this.sf.value, {}); + } + search() { + this.st?.load(1); + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true; + } + selectChange(e: number) { + console.log(e); + this.resourceStatus = e + 1; + setTimeout(() => { + this.st?.resetColumns(); + this.st?.load(1); + }, 500); + } +} diff --git a/src/app/routes/datatable/components/customtable/owner/owner.component.html b/src/app/routes/datatable/components/customtable/owner/owner.component.html new file mode 100644 index 00000000..6fee7fe0 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/owner/owner.component.html @@ -0,0 +1,46 @@ + + + + +
    + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + + + + + + +
    + + +
    + +
    +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/owner/owner.component.less b/src/app/routes/datatable/components/customtable/owner/owner.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/customtable/owner/owner.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/owner/owner.component.spec.ts b/src/app/routes/datatable/components/customtable/owner/owner.component.spec.ts new file mode 100644 index 00000000..8c518688 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/owner/owner.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableOwnerComponent } from './owner.component'; + +describe('DatatableOwnerComponent', () => { + let component: DatatableOwnerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableOwnerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableOwnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/customtable/owner/owner.component.ts b/src/app/routes/datatable/components/customtable/owner/owner.component.ts new file mode 100644 index 00000000..54549d42 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/owner/owner.component.ts @@ -0,0 +1,190 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { differenceInCalendarDays } from 'date-fns'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-datatable-owner', + templateUrl: './owner.component.html', + styleUrls: ['./owner.component.less'], + providers: [DatePipe] +}) +export class DatatableOwnerComponent implements OnInit { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + time: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + today = new Date(); + ui: SFUISchema = {}; + schema: SFSchema = {}; + isLoading: boolean = false; + + columns: STColumn[] = [ + { title: '货主名称', index: 'enterpriseName', className: 'text-center', width: '200px' }, + { title: '注册时间', index: 'registerTime', className: 'text-center', width: '200px' }, + { title: '客户类型', index: 'customerType', className: 'text-center', width: '100px', type: 'enum', enum: { + 1: '平台客户', + 2: '直客', + 3: '渠道客户' + } + }, + { title: '业务员', index: 'salesmanName', className: 'text-center', width: '100px' }, + { title: '合伙人', index: 'partnerName', className: 'text-center', width: '100px' }, + { title: '客户状态', index: 'customerStatus', className: 'text-center', width: '100px', type: 'enum', enum: { + 1: '未激活', + 2: '流失', + 3: '活跃', + 4: '沉默' + } }, + { title: '订单数', index: 'zsl', className: 'text-center', width: '100px' }, + { title: '订单金额', index: 'ddje', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ddje }) } }, + { title: '应收订单数', index: 'ysdds', className: 'text-center', width: '120px' }, + { title: '应收金额', index: 'yingsje', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yingsje }) } }, + { title: '待开票订单数', index: 'yifyf', className: 'text-center', width: '130px' }, + { title: '待开票金额', index: 'dkpdds', className: 'text-right', width: '120px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.dkpdds }) } }, + { title: '已收金额', index: 'yisje', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yisje }) } }, + { title: '应收附加费', index: 'yingsfjf', className: 'text-right', width: '120px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yingsfjf }) } }, + { title: '已收附加费', index: 'yisfjf', className: 'text-right', width: '120px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yisfjf }) } }, + { title: '附加费率', index: 'fjfl', className: 'text-center', width: '100px' }, + { title: '已开票金额', index: 'ykpje', className: 'text-right', width: '100px', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ykpje }) } }, + ]; + /** + * 查询参数 + */ + get reqParams() { + if(this.mode === 'year') { + this.type = 1 + } else if(this.mode === 'month') { + this.type = 2 + } else if(this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + time: this.time, + type: this.type, + ...this.sf?.value + }; + + delete params._$expand; + return { ...params }; + } + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { + this.initSF(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + type: 'string', + title: '货主名称', + ui: { + placeholder: '请输入', + } + }, + customerType: { + type: 'string', + title: '客户类型', + ui: { + widget: 'select', + placeholder: '请选择', + }, + enum: [ + {label: '直客', value: 2}, + {label: '渠道客户', value: 3}, + {label: '平台客户', value: 1}, + ] + }, + customerStatus: { + type: 'string', + title: '客户状态', + ui: { + widget: 'select', + placeholder: '请选择', + }, + enum: [ + {label: '未激活', value: 1}, + {label: '流失', value: 2}, + {label: '活跃', value: 3}, + {label: '沉默', value: 4}, + ] + }, + registerTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to', type: 'date', format: 'yyyy-MM-dd', visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + changeData(){ + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if(result === null) { + return + } + if(this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if(this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else{ + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + ' 00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + + export() { + // this.service.downloadFile(this.service.$api_exportUploadBill, this.sf.value, {}); + } + search() { + this.st?.load(1) + + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } +} diff --git a/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.html b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.html new file mode 100644 index 00000000..253a8460 --- /dev/null +++ b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.html @@ -0,0 +1,43 @@ + + + +
    + +
    + + + + +
    + + + +
    + +
    +
    + + + +
    +
    +
    + +
    + +
    + +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.spec.ts b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.spec.ts new file mode 100644 index 00000000..69ae8c3b --- /dev/null +++ b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatablePartnertableComponent } from './partnertable.component'; + +describe('DatatablePartnertableComponent', () => { + let component: DatatablePartnertableComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatablePartnertableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatablePartnertableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.ts b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.ts new file mode 100644 index 00000000..1d50eaea --- /dev/null +++ b/src/app/routes/datatable/components/customtable/partnertable/partnertable.component.ts @@ -0,0 +1,151 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-datatable-partnertable', + templateUrl: './partnertable.component.html' +}) +export class DatatablePartnertableComponent implements OnInit { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + phone = ''; + columns!: STColumn[]; + isLoading: boolean = false; + + constructor( + public service: DataService, + private modalSrv: NzModalService, + private modal: ModalHelper, + private envSrv: EAEnvironmentService + ) {} + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + title: '合伙人名称', + type: 'string', + ui: { placeholder: '请输入' }, + readOnly: false + }, + phone: { + title: '合伙人类型', + type: 'string', + ui: { + widget: 'select', + placeholder: '请输入' + }, + readOnly: false + }, + phone01: { + title: '合伙人状态', + type: 'string', + ui: { + widget: 'select', + placeholder: '请输入' + }, + readOnly: false + }, + createTime: { + type: 'string', + title: '注册时间', + ui: { widget: 'sl-from-to', type: 'date', format: 'yyyy-MM-dd', visibleIf: { + _$expand: (value: boolean) => value, + }, } as SFDateWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.st?.load(1) } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '合伙人名称', index: 'networkTransporterName', className: 'text-center' }, + { title: '注册时间', index: 'telephone', className: 'text-center' }, + { title: '注册时间', index: 'roleName', className: 'text-center' }, + { title: '业务员', index: 'lastLoginDate', className: 'text-center' }, + { + title: '合伙人状态', + index: 'stateLocked', + className: 'text-center', + type: 'enum', + enum: { 0: '正常', 1: '冻结' } + }, + { title: '客户数', index: 'lastLoginDate', className: 'text-center' }, + { title: '收益额', index: 'lastLoginDate', className: 'text-center' }, + { title: '已提现金额', index: 'lastLoginDate', className: 'text-center' }, + { title: '订单数', index: 'lastLoginDate', className: 'text-center' }, + { title: '订单金额', index: 'lastLoginDate', className: 'text-center' }, + { title: '应收订单数', index: 'lastLoginDate', className: 'text-center' } + ]; + } + + /** + * 数据列表状态变化事件 + */ + change(change: STChange) { + // console.log(change); + } +} diff --git a/src/app/routes/datatable/components/dataindex/dataindex.component.html b/src/app/routes/datatable/components/dataindex/dataindex.component.html new file mode 100644 index 00000000..3f148bfd --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex.component.html @@ -0,0 +1,69 @@ + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    +
    +
    + + + +
    +
    + + + +
    +
    +
    +
    + + + + +
    +
    + + + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/dataindex/dataindex.component.less b/src/app/routes/datatable/components/dataindex/dataindex.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/dataindex/dataindex.component.spec.ts b/src/app/routes/datatable/components/dataindex/dataindex.component.spec.ts new file mode 100644 index 00000000..cd009e56 --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableDataindexComponent } from './dataindex.component'; + +describe('DatatableDataindexComponent', () => { + let component: DatatableDataindexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableDataindexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableDataindexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/dataindex/dataindex.component.ts b/src/app/routes/datatable/components/dataindex/dataindex.component.ts new file mode 100644 index 00000000..0881c73c --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex.component.ts @@ -0,0 +1,249 @@ +import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { G2MiniAreaClickItem, G2MiniAreaData } from '@delon/chart/mini-area'; +import { G2PieClickItem, G2PieComponent, G2PieData } from '@delon/chart/pie'; +import { format } from 'date-fns'; +import { DataService } from '../../services/data.service'; +import { Chart, registerShape, Util } from '@antv/g2'; +import { G2TimelineClickItem, G2TimelineData } from '@delon/chart/timeline'; + +@Component({ + selector: 'app-datatable-dataindex', + templateUrl: './dataindex.component.html', + styleUrls: ['./dataindex.component.less'] +}) +export class DatatableDataindexComponent implements OnInit { + @ViewChild('pie', { static: false }) pie!: G2PieComponent; + chartData: G2TimelineData[] = []; + visitData = this.genData(); + salesData = this.genData(); + salesPieData: G2PieData[] = []; + total = ''; + + constructor(private service: DataService, private ngZone: NgZone) { + + } + + ngOnInit(): void { + this.refreshPie(); + this.initLineData() + } + initLineData(){ + for (let i = 0; i < 20; i += 1) { + this.chartData.push({ + time: new Date().getTime() + 1000 * 60 * 60 * 24 * i, + y1: Math.floor(Math.random() * 100) + 1000, + y2: Math.floor(Math.random() * 100) + 10, + }); + } + } + private genData(): G2MiniAreaData[] { + const beginDay = new Date().getTime(); + const res: G2MiniAreaData[] = []; + for (let i = 0; i < 20; i += 1) { + res.push({ + x: format(new Date(beginDay + 1000 * 60 * 60 * 24 * i), 'yyyy-MM-dd'), + y: Math.floor(Math.random() * 100) + 10, + }); + } + return res; + } + + refresh(): void { + this.visitData = this.genData(); + } + refreshPie(): void { + const rv = (min: number = 0, max: number = 5000) => Math.floor(Math.random() * (max - min + 1) + min); + this.salesPieData = [ + { + x: '家用电器', + y: rv(), + }, + { + x: '食用酒水', + y: rv(), + }, + { + x: '个护健康', + y: rv(), + }, + { + x: '服饰箱包', + y: rv(), + }, + { + x: '母婴产品', + y: rv(), + }, + ]; + if (Math.random() > 0.5) { + this.salesPieData.push({ + x: '其他', + y: rv(), + }); + } + this.total = `¥ ${this.salesPieData.reduce((pre, now) => now.y + pre, 0).toFixed(2)}`; + if (this.pie) { + // 等待组件渲染 + setTimeout(() => { + console.log('a') + this.pie.changeData() + }); + } + } + + handleClick(data: G2MiniAreaClickItem): void { + this.service.msgSrv.info(`${data.item.x} - ${data.item.y}`); + } + format(val: number): string { + return `¥ ${val.toFixed(2)}`; + } + render(el: ElementRef): void { + this.ngZone.runOutsideAngular(() => this.init(el.nativeElement)); + } + private init(el: HTMLElement): void { + const data = [ + { item: '货源单', count: 40, percent: 0.4 }, + { item: '合同单', count: 21, percent: 0.21 }, + { item: '事例三', count: 17, percent: 0.17 }, + { item: '事例四', count: 13, percent: 0.13 }, + { item: '事例五', count: 9, percent: 0.09 }, + ]; + const chart = new Chart({ + container: el, + autoFit: true, + height: 400, + }); + // 新建一个 view 用来单独渲染Annotation + const innerView = chart.createView(); + chart.coordinate('theta', { + radius: 0.6, + innerRadius: 0.7, + }); + + chart.data(data); + + chart.scale('percent', { + formatter: val => { + val = val * 100 + '%'; + return val; + }, + }); + + chart.tooltip(false); + + // 声明需要进行自定义图例字段: 'item' + chart.legend('item', { + position: 'right', // 配置图例显示位置 + custom: true, // 关键字段,告诉 G2,要使用自定义的图例 + items: data.map((obj, index) => { + return { + name: obj.item, // 对应 itemName + value: obj.percent, // 对应 itemValue + marker: { + symbol: 'square', // marker 的形状 + style: { + r: 5, // marker 图形半径 + fill: chart.getTheme().colors10[index], // marker 颜色,使用默认颜色,同图形对应 + }, + }, // marker 配置 + }; + }), + itemValue: { + style: { + fill: '#999', + }, // 配置 itemValue 样式 + formatter: (val: any) => `${val * 100}%` // 格式化 itemValue 内容 + }, + }); + + chart + .interval() + .adjust('stack') + .position('percent') + .color('item') + .style({ + fillOpacity: 1, + stroke: 'white', + lineWidth: 8, + }) + .state({ + active: { + style: element => { + const shape = element.shape; + return { + lineWidth: 1, + stroke: 'white', + strokeOpacity: shape.attr('fillOpacity'), + }; + }, + }, + }); + + // 移除图例点击过滤交互 + chart.removeInteraction('legend-filter'); + chart.interaction('element-active'); + + chart.render(); + + // 监听 element 上状态的变化来动态更新 Annotation 信息 + chart.on('element:statechange', (ev: any) => { + const { state, stateStatus, element } = ev.gEvent.originalEvent; + + // 本示例只需要监听 active 的状态变化 + if (state === 'active') { + const data = element.getData(); + if (stateStatus) { + // 更新 Annotation + updateAnnotation(data); + } else { + // 隐藏 Annotation + clearAnnotation(); + } + } + }); + + // 绘制 annotation + let lastItem: any; + function updateAnnotation(data: any) { + if (data.item !== lastItem) { + innerView.annotation().clear(true); + innerView + .annotation() + .text({ + position: ['50%', '50%'], + content: data.item, + style: { + fontSize: 20, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetY: -20, + }) + .text({ + position: ['50%', '50%'], + content: data.count, + style: { + fontSize: 28, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetX: -10, + offsetY: 20, + }) + innerView.render(true); + lastItem = data.item; + } + } + + // 清空 annotation + function clearAnnotation() { + innerView.annotation().clear(true); + innerView.render(true); + lastItem = null; + } + + } +} + + diff --git a/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.html b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.html new file mode 100644 index 00000000..3f148bfd --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.html @@ -0,0 +1,69 @@ + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    + + + + + + +
    +
    +
    +
    + + + +
    +
    + + + +
    +
    +
    +
    + + + + +
    +
    + + + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.less b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.spec.ts b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.spec.ts new file mode 100644 index 00000000..cd009e56 --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableDataindexComponent } from './dataindex.component'; + +describe('DatatableDataindexComponent', () => { + let component: DatatableDataindexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableDataindexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableDataindexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.ts b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.ts new file mode 100644 index 00000000..eb15c985 --- /dev/null +++ b/src/app/routes/datatable/components/dataindex/dataindex_line/dataindex_line.component.ts @@ -0,0 +1,249 @@ +import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { G2MiniAreaClickItem, G2MiniAreaData } from '@delon/chart/mini-area'; +import { G2PieClickItem, G2PieComponent, G2PieData } from '@delon/chart/pie'; +import { format } from 'date-fns'; +import { DataindexService } from '../services/dataindex.service'; +import { Chart, registerShape, Util } from '@antv/g2'; +import { G2TimelineClickItem, G2TimelineData } from '@delon/chart/timeline'; + +@Component({ + selector: 'app-datatable-dataindex', + templateUrl: './dataindex.component.html', + styleUrls: ['./dataindex.component.less'] +}) +export class DatatableDataindexComponent implements OnInit { + @ViewChild('pie', { static: false }) pie!: G2PieComponent; + chartData: G2TimelineData[] = []; + visitData = this.genData(); + salesData = this.genData(); + salesPieData: G2PieData[] = []; + total = ''; + + constructor(private service: DataindexService, private ngZone: NgZone) { + + } + + ngOnInit(): void { + this.refreshPie(); + this.initLineData() + } + initLineData(){ + for (let i = 0; i < 20; i += 1) { + this.chartData.push({ + time: new Date().getTime() + 1000 * 60 * 60 * 24 * i, + y1: Math.floor(Math.random() * 100) + 1000, + y2: Math.floor(Math.random() * 100) + 10, + }); + } + } + private genData(): G2MiniAreaData[] { + const beginDay = new Date().getTime(); + const res: G2MiniAreaData[] = []; + for (let i = 0; i < 20; i += 1) { + res.push({ + x: format(new Date(beginDay + 1000 * 60 * 60 * 24 * i), 'yyyy-MM-dd'), + y: Math.floor(Math.random() * 100) + 10, + }); + } + return res; + } + + refresh(): void { + this.visitData = this.genData(); + } + refreshPie(): void { + const rv = (min: number = 0, max: number = 5000) => Math.floor(Math.random() * (max - min + 1) + min); + this.salesPieData = [ + { + x: '家用电器', + y: rv(), + }, + { + x: '食用酒水', + y: rv(), + }, + { + x: '个护健康', + y: rv(), + }, + { + x: '服饰箱包', + y: rv(), + }, + { + x: '母婴产品', + y: rv(), + }, + ]; + if (Math.random() > 0.5) { + this.salesPieData.push({ + x: '其他', + y: rv(), + }); + } + this.total = `¥ ${this.salesPieData.reduce((pre, now) => now.y + pre, 0).toFixed(2)}`; + if (this.pie) { + // 等待组件渲染 + setTimeout(() => { + console.log('a') + this.pie.changeData() + }); + } + } + + handleClick(data: G2MiniAreaClickItem): void { + this.service.msgSrv.info(`${data.item.x} - ${data.item.y}`); + } + format(val: number): string { + return `¥ ${val.toFixed(2)}`; + } + render(el: ElementRef): void { + this.ngZone.runOutsideAngular(() => this.init(el.nativeElement)); + } + private init(el: HTMLElement): void { + const data = [ + { item: '货源单', count: 40, percent: 0.4 }, + { item: '合同单', count: 21, percent: 0.21 }, + { item: '事例三', count: 17, percent: 0.17 }, + { item: '事例四', count: 13, percent: 0.13 }, + { item: '事例五', count: 9, percent: 0.09 }, + ]; + const chart = new Chart({ + container: el, + autoFit: true, + height: 400, + }); + // 新建一个 view 用来单独渲染Annotation + const innerView = chart.createView(); + chart.coordinate('theta', { + radius: 0.6, + innerRadius: 0.7, + }); + + chart.data(data); + + chart.scale('percent', { + formatter: val => { + val = val * 100 + '%'; + return val; + }, + }); + + chart.tooltip(false); + + // 声明需要进行自定义图例字段: 'item' + chart.legend('item', { + position: 'right', // 配置图例显示位置 + custom: true, // 关键字段,告诉 G2,要使用自定义的图例 + items: data.map((obj, index) => { + return { + name: obj.item, // 对应 itemName + value: obj.percent, // 对应 itemValue + marker: { + symbol: 'square', // marker 的形状 + style: { + r: 5, // marker 图形半径 + fill: chart.getTheme().colors10[index], // marker 颜色,使用默认颜色,同图形对应 + }, + }, // marker 配置 + }; + }), + itemValue: { + style: { + fill: '#999', + }, // 配置 itemValue 样式 + formatter: (val: any) => `${val * 100}%` // 格式化 itemValue 内容 + }, + }); + + chart + .interval() + .adjust('stack') + .position('percent') + .color('item') + .style({ + fillOpacity: 1, + stroke: 'white', + lineWidth: 8, + }) + .state({ + active: { + style: element => { + const shape = element.shape; + return { + lineWidth: 1, + stroke: 'white', + strokeOpacity: shape.attr('fillOpacity'), + }; + }, + }, + }); + + // 移除图例点击过滤交互 + chart.removeInteraction('legend-filter'); + chart.interaction('element-active'); + + chart.render(); + + // 监听 element 上状态的变化来动态更新 Annotation 信息 + chart.on('element:statechange', (ev: any) => { + const { state, stateStatus, element } = ev.gEvent.originalEvent; + + // 本示例只需要监听 active 的状态变化 + if (state === 'active') { + const data = element.getData(); + if (stateStatus) { + // 更新 Annotation + updateAnnotation(data); + } else { + // 隐藏 Annotation + clearAnnotation(); + } + } + }); + + // 绘制 annotation + let lastItem: any; + function updateAnnotation(data: any) { + if (data.item !== lastItem) { + innerView.annotation().clear(true); + innerView + .annotation() + .text({ + position: ['50%', '50%'], + content: data.item, + style: { + fontSize: 20, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetY: -20, + }) + .text({ + position: ['50%', '50%'], + content: data.count, + style: { + fontSize: 28, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetX: -10, + offsetY: 20, + }) + innerView.render(true); + lastItem = data.item; + } + } + + // 清空 annotation + function clearAnnotation() { + innerView.annotation().clear(true); + innerView.render(true); + lastItem = null; + } + + } +} + + diff --git a/src/app/routes/datatable/components/datascreen/curve/curve.component.html b/src/app/routes/datatable/components/datascreen/curve/curve.component.html new file mode 100644 index 00000000..f47cc41a --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/curve/curve.component.html @@ -0,0 +1,2 @@ + + diff --git a/src/app/routes/datatable/components/datascreen/curve/curve.component.less b/src/app/routes/datatable/components/datascreen/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/datascreen/curve/curve.component.ts b/src/app/routes/datatable/components/datascreen/curve/curve.component.ts new file mode 100644 index 00000000..b6cd6e92 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/curve/curve.component.ts @@ -0,0 +1,132 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-07 17:57:23 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-13 10:22:35 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\datascreen\\curve\\curve.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { G2MiniAreaClickItem } from '@delon/chart/mini-area'; +import { DataService } from '../../../services/data.service'; +// import DataSet from '@antv/data-set'; +const DataSet = require('@antv/data-set'); +import { Chart } from '@antv/g2'; +@Component({ + selector: 'app-financetable-curve-min', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class DatatableCustomindexCurveMinComponent implements OnInit,OnChanges { + el: any; + @Input() chartData: any; + chart: any; + data = [ + { time: '01', type: '订单数', temperature: 7 }, + { time: '02', type: '运单数', temperature: 3.9 }, + { time: '03', type: '订单数', temperature: 6.9 }, + { time: '04', type: '订单数', temperature: 4.2 }, + { time: '05', type: '订单数', temperature: 9.5 }, + { time: '06', type: '订单数', temperature: 5.7 }, + { time: '06', type: '运单数', temperature: 5.7 }, + { time: '07', type: '运单数', temperature: 14.5 }, + { time: '08', type: '订单数', temperature: 8.5 }, + { time: '09', type: '订单数', temperature: 18.4 }, + { time: '10', type: '订单数', temperature: 11.9 }, + { time: '11', type: '订单数', temperature: 21.5 }, + { time: '12', type: '订单数', temperature: 15.2 }, + { time: '08', type: '运单数', temperature: 8.5 }, + { time: '09', type: '运单数', temperature: 18.4 }, + { time: '10', type: '运单数', temperature: 11.9 }, + { time: '11', type: '运单数', temperature: 21.5 }, + { time: '12', type: '订单数', temperature: 15.2 }, + ]; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 1000) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 320, + }); + let value: any = [] + this.service.request(this.service.$api_getTradingTrend).subscribe((res: any) => { + if(res) { + res.forEach((element: any) => { + value.push({ + time: element?.time, + type: element?.type == 'DD' ? '订单数' : '运单数', + temperature: element?.value, + }); + }); + console.log(value); + this.chartData = value + this.chart.data(this.chartData); + this.chart.scale({ + time: { + range: [0, 1], + }, + number: { + nice: true, + }, + }); + + this.chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + + this.chart.axis('temperature', { + label: { + formatter: (val: any) => { + return val + '万'; + }, + }, + }); + this.chart + .line() + .position('time*temperature') + .color('type') + .shape('smooth'); + + this.chart + .point() + .position('time*temperature') + .color('type') + .shape('circle'); + this.chart.render(); + }; + }); + + + } +} diff --git a/src/app/routes/datatable/components/datascreen/datascreen.component.html b/src/app/routes/datatable/components/datascreen/datascreen.component.html new file mode 100644 index 00000000..e66a7862 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/datascreen.component.html @@ -0,0 +1,177 @@ + + + +
    +
    +

    运多星网络货运平台

    +
    +   + {{ todayTime }} +
    +
    + +

    实时交易监控

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + {{ index + 1 }} + + + {{ item.weight ? item.weight + '吨' : '' }} + {{ item.volume ? item.volume + '方' : '' }} + + + {{ item.weight ? item.weight + '吨' : '' }} + {{ item.volume ? item.volume + '方' : '' }} + + + +
    +
    + + + + + + + + + + + + + +
    + +
    + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + + + + {{ item?.driverName }}{{ item?.carNo ? '/' + item?.carNo : '' }} + + + +
    +
    diff --git a/src/app/routes/datatable/components/datascreen/datascreen.component.less b/src/app/routes/datatable/components/datascreen/datascreen.component.less new file mode 100644 index 00000000..b6591429 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/datascreen.component.less @@ -0,0 +1,15 @@ +:host{ + ::ng-deep { + .ant-statistic-content-value{ + color: #399ffd; + font-weight: bold; + } + .nz-statistic-number,.ant-statistic-content-value { + font-size: 14px; + } + .ant-table-thead > tr > th, .ant-table-tbody > tr > td, .ant-table tfoot > tr > th, .ant-table tfoot > tr > td { + padding: 0; + font-size: 12px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/datascreen/datascreen.component.spec.ts b/src/app/routes/datatable/components/datascreen/datascreen.component.spec.ts new file mode 100644 index 00000000..78be800e --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/datascreen.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableDatascreenComponent } from './datascreen.component'; + +describe('DatatableDatascreenComponent', () => { + let component: DatatableDatascreenComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableDatascreenComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableDatascreenComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/datascreen/datascreen.component.ts b/src/app/routes/datatable/components/datascreen/datascreen.component.ts new file mode 100644 index 00000000..26545ef6 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/datascreen.component.ts @@ -0,0 +1,151 @@ +import { map } from 'rxjs/operators'; +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-06 10:57:56 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-14 16:21:00 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\datascreen\\datascreen.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { DataService } from '../../services/data.service'; +import { DatatableCustomindexMapComponent } from './map/map.component'; +import { G2TimelineComponent, G2TimelineData } from '@delon/chart/timeline'; +import { G2MiniAreaClickItem, G2MiniAreaData } from '@delon/chart/mini-area'; +import { FinanceTableCurveComponent } from '../financetable/curve/curve.component'; + + +@Component({ + selector: 'app-datatable-datascreen', + templateUrl: './datascreen.component.html', + styleUrls: ['./datascreen.component.less'] +}) +export class DatatableDatascreenComponent implements OnInit { + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('orderSt') private readonly orderSt!: STComponent; + @ViewChild('map') private readonly map!: DatatableCustomindexMapComponent; + @ViewChild('timeline', { static: false }) timeline!: G2TimelineComponent; + @ViewChild('curve') private readonly curve!: FinanceTableCurveComponent; + + columns: STColumn[] = []; + chartData: any[] = []; + orderColumns: STColumn[] = []; + chartData2: any = {} + allDeal: any; + headDeal: any; + classifyDeal: any; + todaysDeal: any; + todayTime: string = ''; + + monthData: G2TimelineData[] = []; + monthData2:G2TimelineData[] =[]; + salesData2: Array = []; + constructor(public service: DataService) {} + ngOnChanges(changes: any): void { + console.log(changes); + } + /** + * 查询参数 + */ + get reqOrderParams() { + const params = {}; + return { ...params }; + } + get reqParams() { + const params = {}; + return { ...params }; + } + ngOnInit(): void { + setInterval(() => { + this.setTime(); + }, 1000); + this.initST(); + this.initOrderST(); + this.initData(); + // this.initLineData(); + } + setTime() { + var myDate = new Date(); + var mytime = myDate.toLocaleTimeString(); //获取当前时间 + myDate.getFullYear(); //获取完整的年份(4位,1970-????) + myDate.getMonth(); //获取当前月份(0-11,0代表1月) + myDate.getDate(); //获取当前日(1-31) + this.todayTime = myDate.getFullYear() + '-' + myDate.getMonth() + 1 + '-' + myDate.getDate() + ' ' + mytime; + } + initData() { + this.service.request(this.service.$api_getAnnualTransactions).subscribe((res: any) => { + this.allDeal = res; + }); + this.initPillarData() + this.service.request(this.service.$api_getTransactionAmount).subscribe((res: any) => { + this.headDeal = res; + }); + this.service.request(this.service.$api_getCustomerStatistics).subscribe((res: any) => { + this.classifyDeal = res; + }); + this.service.request(this.service.$api_getTradingToday).subscribe((res: any) => { + this.todaysDeal = res; + }); + let value: any = []; + this.service.request(this.service.$api_getTransactionDistribution).subscribe((res: any) => { + if (res) { + res.forEach((element: any) => { + value.push({ + name: element.province, + value: element.weight + }); + }); + console.log(value); + this.chartData = value; + this.map.reRender(); + } + }); + } + genData(): any{ + let value: any = []; + this.service.request(this.service.$api_getShipmentRanking).subscribe((res: any) => { + console.log(res); + res.forEach((element: any) => { + value.push({ + x: element.city, + y: element.weight + }); + }); + this.salesData2 = value + }); + } + initPillarData(){ + // this.curve.reRender() + this.genData(); + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '序号', render: 'index', className: 'text-center', }, + { title: '发货地', index: 'loadAddress', className: 'text-center', }, + { title: '卸货地', index: 'dischargeAddress', className: 'text-center',}, + { title: '货物', index: 'goodsName', className: 'text-center', }, + { title: '数量', render: 'weight', className: 'text-center',} + ]; + } + initOrderST() { + this.orderColumns = [ + { title: '运单号', index: 'wayCode', className: 'text-center', }, + { title: '司机/车辆', index: 'carNo', className: 'text-center', }, + { title: '货主', index: 'shipperName', className: 'text-center', }, + { title: '时间', index: 'createTime', className: 'text-center', }, + { title: '异常预警', index: 'warningTypeLabel', className: 'text-center',} + ]; + } + + handleClick(data: G2MiniAreaClickItem): void { + this.service.msgSrv.info(`${data.item.x} - ${data.item.y}`); + } +} diff --git a/src/app/routes/datatable/components/datascreen/map/map.component.html b/src/app/routes/datatable/components/datascreen/map/map.component.html new file mode 100644 index 00000000..1ff87c79 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/map/map.component.html @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/src/app/routes/datatable/components/datascreen/map/map.component.less b/src/app/routes/datatable/components/datascreen/map/map.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/datascreen/map/map.component.ts b/src/app/routes/datatable/components/datascreen/map/map.component.ts new file mode 100644 index 00000000..90927785 --- /dev/null +++ b/src/app/routes/datatable/components/datascreen/map/map.component.ts @@ -0,0 +1,145 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild, AfterViewInit } from '@angular/core'; +import { Chart } from '@antv/g2'; +import DataSet from '@antv/data-set'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-datatable-customindex-map', + templateUrl: './map.component.html', + styleUrls: ['./map.component.less'] +}) +export class DatatableCustomindexMapComponent implements OnInit, OnChanges, AfterViewInit { + el: any; + @Input() chartData: any; + @ViewChild('auditModal', { static: false }) auditModal!: any; + @ViewChild('map',{static: false}) map!: any; + chart: any; + mapData: any; + ds!: DataSet ; + worldMap: any; + userView: any; + userDv: any; + userData: any = []; + constructor(private service: DataService, private ngZone: NgZone) {} + ngAfterViewInit(): void { + this.map.el.nativeElement.style.height = this.map.el.nativeElement.clientWidth + 'px' + this.chart?.render(); + } + + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + } + } + + ngOnInit(): void {} + reRender() { + setTimeout(() => { + this.chart.render(); + }, 1000); + } + render(el: ElementRef): void { + this.el = el.nativeElement; + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 500); + } + + private init(el: HTMLElement): void { + fetch('https://gw.alipayobjects.com/os/antvdemo/assets/data/china.json') + .then(res => res.json()) + .then(mapData => { + this.mapData =mapData + this.chart = new Chart({ + container: el, + autoFit: true, + padding: [0, 0] + }); + this.chart.tooltip({ + showTitle: false, + showMarkers: false, + shared: true + }); + // 同步度量 + this.chart.scale({ + longitude: { + sync: true + }, + latitude: { + sync: true + } + }); + this.chart.axis(false); + this.chart.legend('trend', { + position: 'left' + }); + + // 绘制世界地图背景 + this.ds = new DataSet(); + this.worldMap = this.ds.createView('back').source(this.mapData, { + type: 'GeoJSON' + }); + const worldMapView = this.chart.createView(); + worldMapView.data(this.worldMap.rows); + worldMapView.tooltip(false); + worldMapView.polygon().position('longitude*latitude').style({ + fill: '#fff', + stroke: '#ccc', + lineWidth: 1 + }); + let value: any = [] + this.service.request(this.service.$api_getTransactionDistribution).subscribe((res: any) => { + if(res) { + res.forEach((element: any) => { + value.push({ + '省份': element.province, + '订单数': element.weight, + }); + }); + this.userData = value + +if (!(this.userData instanceof Array) || this.userData.length === 0) { + return; + } + this.userDv = this.ds.createView().source(this.userData).transform({ + geoDataView: this.worldMap, + field: '省份', + type: 'geo.region', + as: ['longitude', 'latitude'] + }).transform({ + type: 'map', + callback: (obj: { trend: string; 订单数: number }) => { + + if(obj.订单数 < 500) { + obj.trend = '500以下'; + } else if(obj.订单数 >= 500 && obj.订单数 < 1000){ + obj.trend = '500-1000'; + } else if(obj.订单数 >= 1000 ){ + obj.trend = '>1000'; + } + return obj; + } + }); + this.userView = this.chart.createView(); + this.userView.data(this.userDv.rows); + this.userView.scale({ + trend: { + alias: '订单交易数量' + } + }); + this.userView.polygon().position('longitude*latitude').color('trend', ['#0a3f80', '#1b6aca', '#5d93d4']).tooltip('省份*订单数').style({fillOpacity: 0.85 }) + .animate({ + leave: { + animation: 'fade-out' + } + }); + this.userView.interaction('element-active'); + this.chart.render(); + + } + }) + }); + } + +} diff --git a/src/app/routes/datatable/components/financetable/curve/curve.component.html b/src/app/routes/datatable/components/financetable/curve/curve.component.html new file mode 100644 index 00000000..7ceba0b7 --- /dev/null +++ b/src/app/routes/datatable/components/financetable/curve/curve.component.html @@ -0,0 +1,2 @@ + + diff --git a/src/app/routes/datatable/components/financetable/curve/curve.component.less b/src/app/routes/datatable/components/financetable/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/financetable/curve/curve.component.ts b/src/app/routes/datatable/components/financetable/curve/curve.component.ts new file mode 100644 index 00000000..66ef76b1 --- /dev/null +++ b/src/app/routes/datatable/components/financetable/curve/curve.component.ts @@ -0,0 +1,89 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { G2MiniAreaClickItem } from '@delon/chart/mini-area'; +import { DataService } from '../../../services/data.service'; +// import DataSet from '@antv/data-set'; +const DataSet = require('@antv/data-set'); +import { Chart } from '@antv/g2'; +@Component({ + selector: 'app-financetable-curve', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class FinanceTableCurveComponent implements OnInit,OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 1000) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + this.chart.scale({ + time: { + range: [0, 1], + }, + number: { + nice: true, + }, + }); + + this.chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + this.chart.axis('number', { + label: { + formatter: (val: any) => { + return val*100+ ' %'; + }, + }, + }); + + + this.chart + .line() + .position('time*number') + .color('name') + .tooltip('name*number', (name:any, value:any) => { + return { + name: name, + value: value*100 + '%' + }; + }); + + this.chart.render(); + + } +} diff --git a/src/app/routes/datatable/components/financetable/financetable.component.html b/src/app/routes/datatable/components/financetable/financetable.component.html new file mode 100644 index 00000000..4d0c7d04 --- /dev/null +++ b/src/app/routes/datatable/components/financetable/financetable.component.html @@ -0,0 +1,94 @@ + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    +
    + +
    + + + {{item.czcgje | currency}} + + + {{item.yingsje | currency}} + + + {{item.yisje | currency}} + + + {{item.yingfyf | currency}} + + + {{item.yifyf | currency}} + + + {{item.ykpje | currency}} + + + {{item.dkpje | currency}} + + + {{item.yingsfjf | currency}} + + + {{item.yisfjf | currency}} + + + {{item.fjfl + '%'}} + + +
    + + +
    + + + +
    + + + + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/financetable/financetable.component.less b/src/app/routes/datatable/components/financetable/financetable.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/financetable/financetable.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/financetable/financetable.component.ts b/src/app/routes/datatable/components/financetable/financetable.component.ts new file mode 100644 index 00000000..5201e4cb --- /dev/null +++ b/src/app/routes/datatable/components/financetable/financetable.component.ts @@ -0,0 +1,160 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { DatePipe, ModalHelper, _HttpClient } from '@delon/theme'; +import { DataService } from '../../services/data.service'; +import { differenceInCalendarDays } from 'date-fns'; +import { OperationCurveComponent } from '../operationtable/curve/curve.component'; +import { OperationPillarComponent } from '../operationtable/pillar/pillar.component'; +import { FinanceTableCurveComponent } from './curve/curve.component'; +import { FinancetablePillarComponent } from './pillar/pillar.component'; + +@Component({ + selector: 'app-datatable-financetable', + templateUrl: './financetable.component.html', + styleUrls: ['./financetable.component.less'], + providers: [DatePipe] +}) +export class DatatableFinancetableComponent implements OnInit { + @ViewChild('curve') private readonly curve!: FinanceTableCurveComponent; + @ViewChild('pillar') private readonly pillar!: FinancetablePillarComponent; + @ViewChild('st') private readonly st!: STComponent; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + time: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + dateNext: any = null; + modeNext = 'year'; + timeNext: any = ['2022-01-01 00:00:00'] + today = new Date(); + enterpriseInfoId = '' + interManlist: any = [] + chartData: any = {} + flag = false; + columns: STColumn[] = [ + { title: '运营主体', index: 'networkTransporterName', className: 'text-center' ,width: 200}, + { title: '客户预存款', index: 'czcgje',render: 'czcgje', className: 'text-center',width: 200 }, + { title: '应收金额', index: 'yingsje',render: 'yingsje', className: 'text-center' ,width: 200}, + { title: '已收金额', index: 'yisje',render: 'yisje', className: 'text-center',width: 200 }, + { title: '应付运费', index: 'yingfyf', render: 'yingfyf',className: 'text-center' ,width: 200}, + { title: '已付运费', index: 'yifyf',render: 'yifyf', className: 'text-center' ,width: 200}, + { title: '已开票金额', index: 'ykpje',render: 'ykpje', className: 'text-center' ,width: 200}, + { title: '待开票金额', index: 'dkpje',render: 'dkpje', className: 'text-center' ,width: 200}, + { title: '应收附加费', index: 'yingsfjf',render: 'yingsfjf', className: 'text-center' ,width: 200}, + { title: '已收附加费', index: 'yisfjf',render: 'yisfjf', className: 'text-center' ,width: 200}, + { title: '平均附加费率', index: 'fjfl', render: 'fjfl',className: 'text-center',width: 200 } + ]; + /** + * 查询参数 + */ + get reqParams() { + if (this.mode === 'year') { + this.type = 1 + } else if (this.mode === 'month') { + this.type = 2 + } else if (this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + + let params: any = { + time: this.time, + type: this.type + }; + + delete params._$expand; + return { ...params }; + } + + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { + this.initData(); + this.initPillarData(); + } + + initPillarData(){ + let type = 1 + if (this.modeNext === 'year') { + this.type = 1 + } else if (this.modeNext === 'month') { + this.type = 2 + } + const params: any = { + time: this.timeNext, + type, + enterpriseInfoId: this.enterpriseInfoId + }; + this.flag = true + this.service.request(this.service.$api_financialReportHistogram, params).subscribe(res => { + if (res) { + this.chartData = res + if(this.flag) { + this.pillar.reRender() + this.curve.reRender() + } + } + }) + } + initData() { + this.service.getNetworkFreightForwarder().subscribe(res => { + this.interManlist = res + this.enterpriseInfoId = res[0].value + }) + } + + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if (this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if (this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if (this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else { + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + ' 00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + exportFun() { + + } + changeCurve(){ + + } + changePie(){ + + } + changeDataNext() { + if(this.modeNext === 'year') { + this.dateFormat = 'yyyy' + } else if(this.modeNext === 'month') { + this.dateFormat = 'yyyy-MM' + } + } + onChangeNext(result: any) { + if(result === null) { + return + } + if(this.modeNext === 'year') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01 00:00:00'] + } else if(this.modeNext === 'month') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01 00:00:00'] + } + this.initPillarData(); + } + +} diff --git a/src/app/routes/datatable/components/financetable/pillar/pillar.component.html b/src/app/routes/datatable/components/financetable/pillar/pillar.component.html new file mode 100644 index 00000000..0640a4d4 --- /dev/null +++ b/src/app/routes/datatable/components/financetable/pillar/pillar.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/financetable/pillar/pillar.component.less b/src/app/routes/datatable/components/financetable/pillar/pillar.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/financetable/pillar/pillar.component.ts b/src/app/routes/datatable/components/financetable/pillar/pillar.component.ts new file mode 100644 index 00000000..32f36a91 --- /dev/null +++ b/src/app/routes/datatable/components/financetable/pillar/pillar.component.ts @@ -0,0 +1,95 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-01 13:16:39 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-11 16:00:12 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\components\\financetable\\pillar\\pillar.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-financetable-pillar', + templateUrl: './pillar.component.html', + styleUrls: ['./pillar.component.less'] +}) +export class FinancetablePillarComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + console.log(this.chartData) + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + },1000) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + + this.chart.scale('number', { + nice: true, + // ticks: + }); + this.chart.tooltip({ + showMarkers: false, + shared: true, + }); + this.chart.axis('number', { + label: { + formatter: (val: any) => { + return '¥' + this.toThousands(val) ; + }, + }, + }); + this.chart + .interval() + .position('time*number') + .color('name') + .adjust([ + { + type: 'dodge', + marginRatio: 0, + }, + ]); + + this.chart.interaction('active-region'); + + this.chart.render(); + } + toThousands(num: string) { + const str = num.toString() + return str.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') + } +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/invoicetable/invoicetable.component.html b/src/app/routes/datatable/components/invoicetable/invoicetable.component.html new file mode 100644 index 00000000..fd37f657 --- /dev/null +++ b/src/app/routes/datatable/components/invoicetable/invoicetable.component.html @@ -0,0 +1,26 @@ + + + + + + {{item.totalInvoicedAmount | currency}} + + + {{item.invAmountMonth | currency}} + + + {{item.applyWaitInvAmount | currency}} + + + {{item.unInvoicedAmountHistory | currency}} + + + {{item.unInvoicedAmountCurMonth | currency}} + + + {{item.invoicedAmount | currency}} + + + \ No newline at end of file diff --git a/src/app/routes/datatable/components/invoicetable/invoicetable.component.ts b/src/app/routes/datatable/components/invoicetable/invoicetable.component.ts new file mode 100644 index 00000000..fc71aab6 --- /dev/null +++ b/src/app/routes/datatable/components/invoicetable/invoicetable.component.ts @@ -0,0 +1,103 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { DataService } from '../../services/data.service'; + +@Component({ + selector: 'app-datatable-invoicetable', + templateUrl: './invoicetable.component.html' +}) +export class DatatableInvoicetableComponent implements OnInit { + @ViewChild('st', { static: false }) + st!: STComponent; + columns!: STColumn[]; + + data = [{ name1: 1111 }]; + constructor(private http: _HttpClient, private modal: ModalHelper, public service: DataService) {} + + /** + * 查询参数 + */ + get reqParams() { + return {}; + } + ngOnInit(): void { + this.initST(); + } + initST() { + this.columns = [ + { + title: '运营主体', + index: 'operationName', + width: 220 + }, + { + title: '已开票总金额', + index: 'totalInvoicedAmount', + render: 'totalInvoicedAmount', + className: 'text-right', + width: 150 + }, + { + title: '当月已开票金额', + index: 'invAmountMonth', + render: 'invAmountMonth', + className: 'text-right', + width: 150 + }, + { + title: '当月已开票张数', + index: 'numInvAmountMonth', + className: 'text-right', + width: 150 + }, + { + title: '已申请待开金额', + index: 'applyWaitInvAmount', + render: 'applyWaitInvAmount', + className: 'text-right', + width: 150 + }, + { + title: '申请待开客户', + index: 'applyWaitCustomer', + className: 'text-right', + width: 150 + }, + { + title: '已开票金额', + index: 'invoicedAmount', + render: 'invoicedAmount', + className: 'text-right', + width: 150 + }, + { + title: '未申请开票金额(历史)', + index: 'unInvoicedAmountHistory', + render: 'unInvoicedAmountHistory', + className: 'text-right', + width: 200 + }, + { + title: '未申请开票金额(当月)', + index: 'unInvoicedAmountCurMonth', + render: 'unInvoicedAmountCurMonth', + className: 'text-right', + width: 200 + }, + { + title: '当月发票张数', + index: 'unInvoicedAmountHistory1', + className: 'text-right', + width: 150 + }, + { + title: '剩余发票张数', + index: 'unInvoicedAmountCurMonth1', + className: 'text-right', + width: 150 + } + ]; + } +} diff --git a/src/app/routes/datatable/components/operationtable/curve/curve.component.html b/src/app/routes/datatable/components/operationtable/curve/curve.component.html new file mode 100644 index 00000000..0640a4d4 --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/curve/curve.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/curve/curve.component.less b/src/app/routes/datatable/components/operationtable/curve/curve.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/operationtable/curve/curve.component.ts b/src/app/routes/datatable/components/operationtable/curve/curve.component.ts new file mode 100644 index 00000000..265190af --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/curve/curve.component.ts @@ -0,0 +1,83 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-operation-curve', + templateUrl: './curve.component.html', + styleUrls: ['./curve.component.less'] +}) +export class OperationCurveComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + },500) + console.log(this.chartData); + + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + this.chart.scale({ + time: { + range: [0, 1], + }, + number: { + nice: true, + }, + }); + + this.chart.tooltip({ + showCrosshairs: true, + shared: true, + }); + + this.chart.axis('number', { + label: { + formatter: (val: any) => { + return val; + }, + }, + }); + + this.chart + .line() + .position('time*number') + .color('name') + + + this.chart.render(); + + } + +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/operationtable.component.html b/src/app/routes/datatable/components/operationtable/operationtable.component.html new file mode 100644 index 00000000..2d0201a7 --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/operationtable.component.html @@ -0,0 +1,55 @@ + + + + +
    + +
    + + + + + + +
    + + +
    + +
    +
    + +
    + +
    + + +
    + + + +
    + + + + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + + diff --git a/src/app/routes/datatable/components/operationtable/operationtable.component.less b/src/app/routes/datatable/components/operationtable/operationtable.component.less new file mode 100644 index 00000000..6b4b1cba --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/operationtable.component.less @@ -0,0 +1,11 @@ +.chooseBox{ + display: flex; +} +.timeBox{ + display: flex; + margin: 0 0 0 10px; +} +.dateBox{ + display: inline-block; + margin: 0 0 0 10px; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/operationtable.component.spec.ts b/src/app/routes/datatable/components/operationtable/operationtable.component.spec.ts new file mode 100644 index 00000000..3b100f2c --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/operationtable.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableOperationtableComponent } from './operationtable.component'; + +describe('DatatableOperationtableComponent', () => { + let component: DatatableOperationtableComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableOperationtableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableOperationtableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/components/operationtable/operationtable.component.ts b/src/app/routes/datatable/components/operationtable/operationtable.component.ts new file mode 100644 index 00000000..15a0571c --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/operationtable.component.ts @@ -0,0 +1,155 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { DataService } from '../../services/data.service'; +import { differenceInCalendarDays } from 'date-fns'; +import { OperationCurveComponent } from './curve/curve.component'; +import { OperationPillarComponent } from './pillar/pillar.component'; + +@Component({ + selector: 'app-datatable-operationtable', + templateUrl: './operationtable.component.html', + styleUrls: ['./operationtable.component.less'], + providers: [DatePipe] + +}) +export class DatatableOperationtableComponent implements OnInit { + @ViewChild('curve') private readonly curve!: OperationCurveComponent; + @ViewChild('pillar') private readonly pillar!: OperationPillarComponent; + @ViewChild('st') private readonly st!: STComponent; + type = 1; + mode = 'year'; + date: any = null; + defineDate = []; + time: any = ['2022-01-01 00:00:00'] + dateFormat = 'yyyy'; + dateNext: any = null; + modeNext = 'year'; + timeNext: any = ['2022-01-01 00:00:00'] + today = new Date(); + enterpriseInfoId = '' + + interManlist: any = [] + chartData: any = {} + columns: STColumn[] = [ + { title: '运营主体', index: 'networkTransporterName', className: 'text-center' }, + { title: '订单数', index: 'zsl', className: 'text-center' }, + { title: '应收金额', index: 'yingsje', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yingsje }) } }, + { title: '承运数', index: 'cys', className: 'text-center' }, + { title: '应付运费', index: 'yingfyf', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yingfyf }) } }, + { title: '运量(吨)', index: 'yl', className: 'text-center' }, + { title: '待接单数', index: 'djd', className: 'text-center' }, + { title: '在途数', index: 'ysz', className: 'text-center' }, + { title: '运输完成', index: 'yswc', className: 'text-center' }, + { title: '已收金额', index: 'yisje', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yisje }) } }, + { title: '已付运费', index: 'yifyf', className: 'text-center', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yifyf }) } }, + ]; + /** + * 查询参数 + */ + get reqParams() { + if (this.mode === 'year') { + this.type = 1 + } else if (this.mode === 'month') { + this.type = 2 + } else if (this.mode === 'date') { + this.type = 3 + } else { + this.type = 4 + } + let params: any = { + time: this.time, + type: this.type + }; + + delete params._$expand; + return { ...params }; + } + + constructor(public service: DataService, private datePipe: DatePipe) { } + ngOnInit(): void { + this.initData() + this.initPillarData() + } + initPillarData(flag?: boolean){ + let type = 1 + if(this.mode === 'year') { + type = 1 + } else if(this.mode === 'month') { + type = 2 + } + const params: any = { + time: this.timeNext, + type, + enterpriseInfoId: this.enterpriseInfoId + }; + this.service.request(this.service.$api_operationalReportHistogram, params).subscribe(res => { + if (res) { + this.chartData = res + if(flag) { // 除第一次加载外 + this.pillar.reRender() + this.curve.reRender() + } + } + }) + } + initData() { + + this.service.getNetworkFreightForwarder().subscribe(res => { + this.interManlist = res + this.enterpriseInfoId = res[0].value + }) + } + + changeData() { + if (this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if (this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } else { + this.dateFormat = 'yyyy-MM-dd' + } + } + onChange(result: any) { + if (this.mode === 'year') { + this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] + } else if (this.mode === 'month') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] + } else if (this.mode === 'date') { + this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00'] + } else { + this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + ' 00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00'] + } + this.st.reload({ ...this.reqParams }); + } + disabledDate = (current: Date): boolean => + // Can not select days before today and today + differenceInCalendarDays(current, this.today) > 0; + exportFun() { + + } + changeCurve(){ + + } + changePie(){ + + } + changeDataNext() { + if(this.mode === 'year') { + this.dateFormat = 'yyyy' + } else if(this.mode === 'month') { + this.dateFormat = 'yyyy-MM' + } + } + onChangeNext(result: any) { + if(result === null) { + return + } + if(this.mode === 'year') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01 00:00:00'] + } else if(this.mode === 'month') { + this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01 00:00:00'] + } + this.initPillarData(true) + } +} diff --git a/src/app/routes/datatable/components/operationtable/pie/pie.component.html b/src/app/routes/datatable/components/operationtable/pie/pie.component.html new file mode 100644 index 00000000..373a4b03 --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/pie/pie.component.html @@ -0,0 +1,8 @@ + + + + +
    + +
    +
    \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/pie/pie.component.less b/src/app/routes/datatable/components/operationtable/pie/pie.component.less new file mode 100644 index 00000000..567be99f --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/pie/pie.component.less @@ -0,0 +1,5 @@ +.box{ + width: 50%; + margin:0 auto; + overflow: hidden; +} \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/pie/pie.component.ts b/src/app/routes/datatable/components/operationtable/pie/pie.component.ts new file mode 100644 index 00000000..cc358bd7 --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/pie/pie.component.ts @@ -0,0 +1,198 @@ +import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core'; +import { G2PieComponent, G2PieData } from '@delon/chart/pie'; +import { format } from 'date-fns'; +import { Chart } from '@antv/g2'; +import { DataService } from '../../../services/data.service'; + +@Component({ + selector: 'app-opeationtable-pie', + templateUrl: './pie.component.html', + styleUrls: ['./pie.component.less'] +}) +export class OperationtablePieComponent implements OnInit { + @ViewChild('pie', { static: false }) pie!: G2PieComponent; + chartData: any = []; + el: any; + chart: any; + enterpriseInfoIdPie = '' + interManlist: any = [] + innerView: any =[]; + constructor(private service: DataService, private ngZone: NgZone) { + } + + ngOnInit(): void { + this.initData() + this.initManData() + } + initData(){ + this.service.request(this.service.$api_operationalReportWaybillStatusDistribution, {id: this.enterpriseInfoIdPie}).subscribe(res => { + if (res) { + this.chartData = res + // this.ngZone.runOutsideAngular(() => this.init(this.el)); + setTimeout(() => { + this.chart?.data(this.chartData); + this.chart?.render(); + }, 1000) + } + }) + } + initManData() { + this.service.getNetworkFreightForwarder().subscribe(res => { + this.interManlist = res + this.enterpriseInfoIdPie = res[0].value + }) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 500) + } + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 400, + }); + // 新建一个 view 用来单独渲染Annotation + // const innerView = chart.createView(); + + this.innerView = this.chart.createView(); + this.chart.coordinate('theta', { + radius: 0.6, + innerRadius: 0.7, + }); + + // this.chart.data(this.chartData); + + // chart.scale('percent', { + // formatter: val => { + // val = val * 100 + '%'; + // return val; + // }, + // }); + + this.chart.tooltip(false); + + // 声明需要进行自定义图例字段: 'item' + this.chart.legend('item', { + position: 'right', // 配置图例显示位置 + custom: true, // 关键字段,告诉 G2,要使用自定义的图例 + items: this.chartData.map((obj: any, index: any) => { + return { + name: obj.item, // 对应 itemName + value: obj.percent+ '% ' + obj.count, + count: obj.count, // 对应 itemValue + marker: { + symbol: 'square', // marker 的形状 + style: { + r: 5, // marker 图形半径 + fill: this.chart.getTheme().colors10[index], // marker 颜色,使用默认颜色,同图形对应 + }, + }, // marker 配置 + }; + }), + itemValue: { + style: { + fill: '#999', + }, // 配置 itemValue 样式 + formatter: (val: any) => `${val}` // 格式化 itemValue 内容 + }, + }); + + const interval = this.chart + .interval() + .adjust('stack') + .position('percent') + .color('item') + .style({ + fillOpacity: 1, + stroke: 'white', + lineWidth: 8, + }) + .state({ + active: { + style: (element: any) => { + const shape = element.shape; + return { + lineWidth: 1, + stroke: 'white', + strokeOpacity: shape.attr('fillOpacity'), + }; + }, + }, + }); + + // 移除图例点击过滤交互 + this.chart.removeInteraction('legend-filter'); + this.chart.interaction('element-active'); + + this.chart.render(true); + // 默认选择 + interval.elements[0].setState('selected', true); + const ele = interval.elements[0].getData(); + + + // 监听 element 上状态的变化来动态更新 Annotation 信息 + this.chart.on('element:statechange', (ev: any) => { + const { state, stateStatus, element } = ev.gEvent.originalEvent; + + // 本示例只需要监听 active 的状态变化 + if (state === 'active') { + const data = element.getData(); + if (stateStatus) { + // 更新 Annotation + updateAnnotation(data); + } else { + // 隐藏 Annotation + clearAnnotation(); + } + } + }); + + // 绘制 annotation + let lastItem: any; + const updateAnnotation = (data: any) => { + if (data.item !== lastItem) { + this.innerView.annotation().clear(true); + this.innerView + .annotation() + .text({ + position: ['50%', '50%'], + content: data.item, + style: { + fontSize: 20, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetY: -20, + }) + .text({ + position: ['50%', '50%'], + content: data.count, + style: { + fontSize: 28, + fill: '#8c8c8c', + textAlign: 'center', + }, + offsetX: -10, + offsetY: 20, + }) + this.innerView.render(true); + + + lastItem = data.item; + } + } + + // 清空 annotation + function clearAnnotation(this: any) { + this.innerView?.annotation()?.clear(true); + this.innerView.render(true); + lastItem = null; + } + + } +} + + diff --git a/src/app/routes/datatable/components/operationtable/pillar/pillar.component.html b/src/app/routes/datatable/components/operationtable/pillar/pillar.component.html new file mode 100644 index 00000000..0640a4d4 --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/pillar/pillar.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/datatable/components/operationtable/pillar/pillar.component.less b/src/app/routes/datatable/components/operationtable/pillar/pillar.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/datatable/components/operationtable/pillar/pillar.component.ts b/src/app/routes/datatable/components/operationtable/pillar/pillar.component.ts new file mode 100644 index 00000000..b78f500f --- /dev/null +++ b/src/app/routes/datatable/components/operationtable/pillar/pillar.component.ts @@ -0,0 +1,74 @@ +import { Component, ElementRef, Input, NgZone, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; +import { Chart } from '@antv/g2'; +import { DataService } from 'src/app/routes/datatable/services/data.service'; +@Component({ + selector: 'app-operation-pillar', + templateUrl: './pillar.component.html', + styleUrls: ['./pillar.component.less'] +}) +export class OperationPillarComponent implements OnInit, OnChanges { + el: any; + @Input() chartData: any; + chart: any; + constructor(private service: DataService, private ngZone: NgZone) { + + } + ngOnChanges(changes: SimpleChanges): void { + if (this.chartData) { + // setTimeout(()=>{ + // this.chart.render(true) + // }, 1000) + + } + } + + ngOnInit(): void { + + } + reRender() { + setTimeout(() => { + this.chart.data(this.chartData); + this.chart.render(); + }, 1000) + } + render(el: ElementRef): void { + this.el = el.nativeElement + setTimeout(() => { + this.ngZone.runOutsideAngular(() => this.init(this.el)); + }, 500) + } + + private init(el: HTMLElement): void { + this.chart = new Chart({ + container: el, + autoFit: true, + height: 500, + }); + + this.chart.data(this.chartData); + + this.chart.scale('number', { + nice: true, + }); + this.chart.tooltip({ + showMarkers: false, + shared: true, + }); + + this.chart + .interval() + .position('time*number') + .color('name') + .adjust([ + { + type: 'dodge', + marginRatio: 0, + }, + ]); + + this.chart.interaction('active-region'); + + this.chart.render(); + } + +} \ No newline at end of file diff --git a/src/app/routes/datatable/datatable-routing.module.ts b/src/app/routes/datatable/datatable-routing.module.ts new file mode 100644 index 00000000..8298fdf5 --- /dev/null +++ b/src/app/routes/datatable/datatable-routing.module.ts @@ -0,0 +1,48 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { DatatableCustomindexComponent } from './components/customtable/customindex/customindex.component'; +import { DatatableOwnerComponent } from './components/customtable/owner/owner.component'; +import { DatatableDriverComponent } from './components/customtable/driver/driver.component'; +import { DatatableOperationtableComponent } from './components/operationtable/operationtable.component'; +import { DatatableOrderReportingComponent } from './reporting/components/order-reporting/order-reporting.component'; +import { DatatableDataindexComponent } from './components/dataindex/dataindex.component'; +import { DatatableComplianceIndexComponent } from './components/compliance/index/index.component'; +import { DatatableFinancetableComponent } from './components/financetable/financetable.component'; +import { DatatableInvoicetableComponent } from './components/invoicetable/invoicetable.component'; +import { DatatableComplianceSalesmanComponent } from './components/compliance/salesman/salesman.component'; +import { DatatableComplianceCustomerComponent } from './components/compliance/customer/customer.component'; +import { DatatableFundReportingComponent } from './reporting/components/fund-reporting/fund-reporting.component'; +import { DatatableMancustomtableComponent } from './components/customtable/mancustomtable/mancustomtable.component'; +import { DatatablePartnertableComponent } from './components/customtable/partnertable/partnertable.component'; +import { DatatableBusiindexComponent } from './components/busitable/busiindex/busiindex.component'; +import { DatatableMantableComponent } from './components/busitable/mantable/mantable.component'; +import { DatatableReportingFundInfoComponent } from './reporting/components/fund-info/fund-info.component'; +import { DatatableDatascreenComponent } from './components/datascreen/datascreen.component'; + +const routes: Routes = [ + { path: 'dataindex', component: DatatableDataindexComponent }, + { path: 'customtable/customindex', component: DatatableCustomindexComponent }, + { path: 'customtable/owner', component: DatatableOwnerComponent }, + { path: 'customtable/driver', component: DatatableDriverComponent }, + { path: 'customtable/mancustomtable', component: DatatableMancustomtableComponent }, + { path: 'customtable/partnertable', component: DatatablePartnertableComponent }, + { path: 'operationtable', component: DatatableOperationtableComponent }, + { path: 'reporting/order', component: DatatableOrderReportingComponent }, + { path: 'compliancetabel/index', component: DatatableComplianceIndexComponent }, + { path: 'compliancetabel/salesman', component: DatatableComplianceSalesmanComponent }, + { path: 'compliancetabel/customer', component: DatatableComplianceCustomerComponent }, + { path: 'financetable', component: DatatableFinancetableComponent }, + { path: 'invoicetable', component: DatatableInvoicetableComponent }, + { path: 'reporting/fund', component: DatatableFundReportingComponent }, + { path: 'busitable/busiindex', component: DatatableBusiindexComponent }, + { path: 'busitable/mantable', component: DatatableMantableComponent }, + { path: 'reporting/fund', component: DatatableFundReportingComponent }, + { path: 'fund-info', component: DatatableReportingFundInfoComponent }, + { path: 'datascreen', component: DatatableDatascreenComponent }]; + + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class DatatableRoutingModule { } diff --git a/src/app/routes/datatable/datatable.module.ts b/src/app/routes/datatable/datatable.module.ts new file mode 100644 index 00000000..7a1fe2be --- /dev/null +++ b/src/app/routes/datatable/datatable.module.ts @@ -0,0 +1,93 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-04-06 11:02:17 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-07 18:29:39 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\datatable.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule, Type } from '@angular/core'; +import { SharedModule, SHARED_G2_MODULES } from '@shared'; +import { DatatableRoutingModule } from './datatable-routing.module'; +import { DatatableCustomindexComponent } from './components/customtable/customindex/customindex.component'; +import { DatatableOwnerComponent } from './components/customtable/owner/owner.component'; +import { DatatableDriverComponent } from './components/customtable/driver/driver.component'; +import { DatatableOperationtableComponent } from './components/operationtable/operationtable.component'; +import { OperationtablePieComponent } from './components/operationtable/pie/pie.component'; +import { DatatableOrderReportingComponent } from './reporting/components/order-reporting/order-reporting.component'; +import { DatatableDataindexComponent } from './components/dataindex/dataindex.component'; +import { DatatableComplianceIndexComponent } from './components/compliance/index/index.component'; +import { DatatableFinancetableComponent } from './components/financetable/financetable.component'; +import { DatatableInvoicetableComponent } from './components/invoicetable/invoicetable.component'; +import { DatatableComplianceSalesmanComponent } from './components/compliance/salesman/salesman.component'; +import { DatatableComplianceCustomerComponent } from './components/compliance/customer/customer.component'; +import { DatatableReportingUploadSettingComponent } from './reporting/components/upload-setting/upload-setting.component'; +import { DatatableReportingVerifyResultComponent } from './reporting/components/verify-result/verify-result.component'; +import { DatatableFundReportingComponent } from './reporting/components/fund-reporting/fund-reporting.component'; +import { DatatableMancustomtableComponent } from './components/customtable/mancustomtable/mancustomtable.component'; +import { DatatablePartnertableComponent } from './components/customtable/partnertable/partnertable.component'; +import { DatatableBusiindexComponent } from './components/busitable/busiindex/busiindex.component'; +import { DatatableMantableComponent } from './components/busitable/mantable/mantable.component'; +import { BusitablePillarComponent } from './components/busitable/pillar/pillar.component'; +import { DatatableReportingFundInfoComponent } from './reporting/components/fund-info/fund-info.component'; +import { OperationPillarComponent } from './components/operationtable/pillar/pillar.component'; +import { OperationCurveComponent } from './components/operationtable/curve/curve.component'; +import { FinanceTableCurveComponent } from './components/financetable/curve/curve.component'; +import { DatatableDatascreenComponent } from './components/datascreen/datascreen.component'; +import { FinancetablePillarComponent } from './components/financetable/pillar/pillar.component'; +import { ComplianceCurveComponent } from './components/compliance/index/curve/curve.component'; +import { BusitableCurveComponent } from './components/busitable/busiindex/curve/curve.component'; +import { DatatableCustomindexCurveComponent } from './components/customtable/customindex/curve/curve.component'; +import { DatatableCustomindexMapComponent } from './components/datascreen/map/map.component'; +import { DatatableCustomindexCurveMinComponent } from './components/datascreen/curve/curve.component'; +import { DatatableReportingvViewTrackComponent } from './reporting/components/view-track/view-track.component'; + +const COMPONENTS: Type[] = [ + DatatableDataindexComponent, + DatatableCustomindexComponent, + DatatableOwnerComponent, + DatatableDriverComponent, + DatatableOperationtableComponent, + OperationtablePieComponent, + DatatableOrderReportingComponent, + DatatableComplianceIndexComponent, + DatatableFinancetableComponent, + DatatableInvoicetableComponent, + DatatableComplianceSalesmanComponent, + DatatableComplianceCustomerComponent, + DatatableReportingUploadSettingComponent, + DatatableReportingVerifyResultComponent, + DatatableFundReportingComponent, + DatatableMancustomtableComponent, + DatatablePartnertableComponent, + DatatableBusiindexComponent, + DatatableMantableComponent, + BusitablePillarComponent, + DatatableFundReportingComponent, + DatatableReportingFundInfoComponent, + OperationPillarComponent, + OperationCurveComponent, + DatatableReportingFundInfoComponent, + FinanceTableCurveComponent, + DatatableDatascreenComponent, + FinancetablePillarComponent, + ComplianceCurveComponent, + BusitableCurveComponent, + DatatableCustomindexCurveComponent, + DatatableCustomindexMapComponent, + DatatableCustomindexCurveMinComponent, + DatatableReportingvViewTrackComponent +] + + +@NgModule({ + imports: [ + SharedModule, + DatatableRoutingModule, + SHARED_G2_MODULES + ], + declarations: COMPONENTS, +}) +export class DatatableModule { } diff --git a/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.html b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.html new file mode 100644 index 00000000..b8bbd698 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.html @@ -0,0 +1,14 @@ +
    + + + + {{filterCheckStatus(item?.checkStatus)}} + + +
    + + diff --git a/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.spec.ts b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.spec.ts new file mode 100644 index 00000000..09d9ac30 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingFundInfoComponent } from './fund-info.component'; + +describe('DatatableReportingFundInfoComponent', () => { + let component: DatatableReportingFundInfoComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingFundInfoComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingFundInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.ts b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.ts new file mode 100644 index 00000000..2e120e63 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-info/fund-info.component.ts @@ -0,0 +1,115 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { ReportingService } from '../../services/reporting.service'; + +@Component({ + selector: 'app-datatable-fund-info', + templateUrl: './fund-info.component.html', +}) +export class DatatableReportingFundInfoComponent implements OnInit { + url = `/user`; + searchSchema!: SFSchema; + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = []; + record: any = {} + + + get reqParams() { + return { capitalCode: this?.record?.serialNumberCode }; + } + + beforeReq(requestOptions: STRequestOptions) { + delete requestOptions?.body?.pageSize; + delete requestOptions?.body?.pageIndex; + return requestOptions; + } + constructor(public service: ReportingService, private modalRef: NzModalRef, public router: Router) { + + } + + ngOnInit(): void { + this.initST(); + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '序号', type: 'no', className: 'text-center', width: '10%', }, + { title: '监管平台字段', index: 'thirdPartyFieldName', className: 'text-center', width: '15%', }, + { title: '系统字段', index: 'checkFieldName', className: 'text-center', width: '15%', }, + { title: '归属模块', index: 'orderStatus', className: 'text-center', width: '15%', }, + { + title: '是否必填', + index: 'orderStatus', + className: 'text-center', + width: '10%', + type: 'enum', + enum: { + 0: '否', + 1: '是', + }, + }, + { title: '上传值', index: 'fieldValue', className: 'text-center', width: '15%', }, + { + title: '本地校验', + render: 'checkStatus', + className: 'text-center', + // type: 'enum', + // enum: { + // '0': '校验中', + // '1': '通过', + // '2': '不通过' + // }, + width: '10%', + }, + { title: '错误内容', index: 'remark', className: 'text-center', width: '20%', }, + ] + } + + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + + selectTab(e: any) { + + } + + update() { + if (this.record?.billType === '1') { + window.open(location.origin + `/#/order-management/vehicle-detailChange/${this.record?.id}`) + + } else if (this.record.billType === '2') { + window.open(location.origin + `/#/order-management/bulk-detailChange/${this.record?.id}`); + } + + + } + close(): void { + this.modalRef.destroy(); + } + + filterCheckStatus(status: number) { + switch (status) { + case 0: + return '校验中'; + case 1: + return '通过'; + case 2: + return '不通过'; + default: + return ''; + + } + } + + +} diff --git a/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.html b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.html new file mode 100644 index 00000000..e13fbf66 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.html @@ -0,0 +1,65 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + {{item?.uploadStatusLabel}} + + + {{item?.verifyStatusLabel}} + {{item?.verifyStatusLabel}} + + + {{item?.orderCode}} + + + {{item?.wayBillCode}} + + +
    {{item?.tolalAmount | currency }}
    +
    + +
    {{item?.payAmount | currency }}
    +
    +
    +
    + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + +
    +
    diff --git a/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.less b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.less new file mode 100644 index 00000000..6009fbbf --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.less @@ -0,0 +1,5 @@ +:host { + .text-black { + color: #000; + } +} diff --git a/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.spec.ts b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.spec.ts new file mode 100644 index 00000000..fb500388 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableFundReportingComponent } from './fund-reporting.component'; + +describe('DatatableFundReportingComponent', () => { + let component: DatatableFundReportingComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableFundReportingComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableFundReportingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.ts b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.ts new file mode 100644 index 00000000..fa6f9e4d --- /dev/null +++ b/src/app/routes/datatable/reporting/components/fund-reporting/fund-reporting.component.ts @@ -0,0 +1,487 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ReportingService } from '../../services/reporting.service'; +import { DatatableReportingFundInfoComponent } from '../fund-info/fund-info.component'; + +@Component({ + selector: 'app-datatable-fund-reporting', + templateUrl: './fund-reporting.component.html', + styleUrls: ['./fund-reporting.component.less'] +}) +export class DatatableFundReportingComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType!: string; + tabs: any[] = [ + { name: '待上传', value: '1' }, + { name: '上传中', value: '2' }, + { name: '已上传', value: '3' }, + { name: '异常', value: '4' }, + { name: '全部', value: '' } + ]; + selectedIndex = '1'; //选择的项目 + serviceTel = ''; + selectedRows: any[] = []; + isLoading: boolean = false; + constructor( + public service: ReportingService, + private router: Router, + private ar: ActivatedRoute, + private modal: NzModalService, + public shipperSrv: ShipperBaseService + ) { + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}, { + uploadStatus: this.selectedIndex + }); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + // get selectedRows() { + // return this.st?.list.filter((item: any) => item.checked) || []; + // } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + orderCode: { title: '订单号', type: 'string', ui: { placeholder: '请输入' } }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入', + }, + }, + serialNumberCode: { + type: 'string', + title: '流水单号', + ui: { + placeholder: '请输入', + }, + }, + carrier: { + title: '承运司机', + type: 'string', + ui: { + placeholder: '请输入司机姓名', visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + carNumber: { + title: '车牌号', + type: 'string', + maxLength: 9, + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + payee: { + title: '车队长', + type: 'string', + maxLength: 9, + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + // uploadStatus: { + // title: '上传状态', + // type: 'string', + // enum: [ + // { label: '待上传', value: 0 }, + // { label: '已上传', value: 1 }, + // { label: '异常', value: 2 } + // ], + // ui: { + // placeholder: '请选择', + // widget: 'select', + // allowClear: true, + // visibleIf: { + // _$expand: (value: boolean) => value, + // }, + // } + // }, + verifyStatus: { + title: '本地校验', + type: 'string', + enum: [ + { label: '检测中', value: '0' }, + { label: '通过', value: '1' }, + { label: '不通过', value: '2' } + ], + ui: { + placeholder: '请选择', + allowClear: true, + widget: 'select', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + ltdId: { + title: '网络货运人', + type: 'string', + ui: { + placeholder: '请选择', + widget: 'select', + asyncData: () => this.shipperSrv.getNetworkFreightForwarder({}, false), + visibleIf: { + _$expand: (value: boolean) => value, + }, + allowClear: true + } + }, + transactionTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + uploadTime: { + title: '上传时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + }, + }; + this.ui = { + '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.search() }, + $time: { grid: { span: 24 } }, + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px', }, + { title: '上传状态', render: 'uploadStatus', className: 'text-center', width: '120px', }, + { title: '本地校验', render: 'verifyStatus', className: 'text-center', width: '120px', }, + { title: '流水单号', index: 'serialNumberCode', className: 'text-center', width: '190px', }, + { + title: '订单号', + render: 'orderCode', + className: 'text-center', + width: '180px', + }, + { title: '运单号', render: 'wayBillCode', className: 'text-center', width: '180px', }, + { + title: '网络货运人', + index: 'ltdName', + className: 'text-center', + width: '180px', + }, + { title: '实际承运人名称', index: 'carrier', className: 'text-center', width: '150px' }, + { title: '实际承运人证件号码', index: 'cardId', className: 'text-center', width: '200px' }, + { title: '车牌号', index: 'carNumber', className: 'text-center', width: '180px' }, + { title: '车牌颜色', index: 'carColorLabel', className: 'text-center', width: '180px' }, + { title: '总金额', render: 'tolalAmount', className: 'text-center', width: '120px' }, + + { title: '付款方式', index: 'payType', className: 'text-center', width: '150px' }, + { title: '车队长', index: 'payee', className: 'text-center', width: '150px' }, + { title: '收款账户', index: 'collectionAccount', className: 'text-center', width: '180px' }, + + { title: '收款银行', index: 'bankTypeLabel', className: 'text-center', width: '150px' }, + + { title: '银行流水号', index: 'bankSerialNumber', className: 'text-center', width: '180px' }, + { title: '实际支付金额', render: 'payAmount', className: 'text-center', width: '150px' }, + { title: '交易时间', index: 'transactionTime', className: 'text-center', width: '180px' }, + { title: '上传次数', index: 'uploadFrequency', className: 'text-center', width: '120px' }, + { title: '上传时间', index: 'uploadTime', className: 'text-center', width: '180px' }, + ]; + } + + + + /** + *撤销 + * @param record 记录实例 + */ + recall() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要撤回的数据'); + return; + } + this.modal.confirm({ + nzTitle: '撤回提示', + nzContent: ' 撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + nzOkText: '确定', + nzCancelText: '取消', + nzOnOk: () => { + const ids = this.selectedRows.map(i => i?.id); + this.service.request(this.service.$api_fund_reporting_recall, ids).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('撤销成功'); + + this.search(); + } + }) + } + }); + + + } + + selectChange(item: any) { + this.selectedIndex = item?.value || ''; + + setTimeout(() => { + this.selectedRows = []; + this.st.load(1); + }) + } + + /** + * 查看当行数据 + */ + view(record: STData) { + // this.router.navigate(['../view', record.uuid], { relativeTo: this.ar }); + this.router.navigate(['../detail'], { + queryParams: { + id: record.id, + }, + relativeTo: this.ar + }); + } + + // appeal(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '申诉', + // nzWidth: '40%', + // nzContent: CtcAppealComponent, + // nzComponentParams: { + // i: item, + // status: 'add' + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe(res => { + // if (res) { + // this.search({ representationsStatus: '' }); + // } + // }) + // } + + /** + * 上传 + */ + upload() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要上传的数据'); + return; + } + const ids = this.selectedRows.map(i => i?.id); + this.service.request(this.service.$api_fund_reporting_upload, ids).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('上传成功'); + this.search(); + } + }) + } + + + + + /** + * 查看校验结果 + */ + viewResult(record: any) { + const modalRef = this.modal.create({ + nzTitle: '校验结果', + nzWidth: 1200, + + nzContent: DatatableReportingFundInfoComponent, + nzComponentParams: { + record + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + }) + } + + + + /** + * 查看监管审核结果 + */ + viewAuditResult(record: any) { + if (record?.verifyStatus !== '2') { + return; + } + this.openWainingModal('监管审核结果', record?.uploadResult) + } + + /** + * 更新数据 + */ + updateData() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要更新的数据'); + return; + } + const ids = this.selectedRows.map(i => i?.id); + this.service.request(this.service.$api_update_fund_data, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.selectedRows = []; + this.st.reload(); + + } + }) + } + + + search() { + this.selectedRows = []; + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_export_fund_reporting); + } + + openWainingModal(content: string, title = '提示') { + this.modal.warning({ + nzMask: false, + nzTitle: title, + nzContent: content, + }) + } + + changeSt(e: STChange): void { + + if (e.type === 'checkbox') { + const checkRows = (e.checkbox as STData[]) || []; + //判断当前页是否有选中的行 + if (checkRows.length === 0) { + // 当前页没有存在已勾选的行,移除之前所记录的当前页的行 + const stList = this.st.list; + stList.forEach(item => { + this.selectedRows = this.selectedRows.filter((e: any) => e.id !== item.id); + }) + } else { + //添加新增的行 + checkRows.forEach((item: any) => { + const newSelectedList = this.selectedRows.filter((r: any) => r.id === item.id); + if (newSelectedList.length === 0) { + this.selectedRows.push(item); + + } + }) + // 移除取消选中的行 + const stList = this.st.list; + stList.forEach(item => { + if (!item.checked) { + const index = this.selectedRows.findIndex(_item => item.id === _item.id); + if (index !== -1) this.selectedRows.splice(index, 1); + } + }) + } + } else if (e.type === 'loaded') { + // 页面加载时勾选 + (e?.loaded || []).forEach((r: any) => { + this.selectedRows.forEach((x) => { + if (x.id === r.id) { + r.checked = true; + } + }); + }); + } + } + + routeToOrder(item: any) { + if (item.orderType === '1') { + window.open(location.origin + `/#/order-management/vehicle/vehicle-detail/${item.orderId}`); + } else { + window.open(location.origin + `/#/order-management/bulk/bulk-detail/${item.orderId}`); + } + } + + routeTowaybill(item: any) { + if (item.orderType === '1') { + window.open(location.origin + `/#/waybill-management/vehicle/vehicle-detail/${item.wayBillId}`); + + } else { + window.open(location.origin + `/#/waybill-management/bulk/bulk-detail/${item.wayBillId}`); + + } + } + + +} diff --git a/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.html b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.html new file mode 100644 index 00000000..ef60a6e7 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.html @@ -0,0 +1,90 @@ + + + + +
    +
    + +
    +
    +
    + + + + +
    +
    + + + + + + + + + + {{filterStatus(item?.billPutStatus)}} + {{filterStatus(item?.billPutStatus)}} + + + {{filterStatus(item?.driverPutStatus)}} + {{filterStatus(item?.driverPutStatus)}} + + + {{filterStatus(item?.carPutStatus)}} + {{filterStatus(item?.carPutStatus)}} + + + + {{filterCheckStatus(item?.checkStatus)}} + {{filterCheckStatus(item?.checkStatus)}} + + + + {{item?.billCode}} + + + {{item?.wayBillCode}} + + + +
    {{item?.freightAmount | currency }}
    +
    + +
    + {{_item?.goodsTypeName}}/{{_item?.goodsName}}/{{_item?.weight}}吨/{{_item?.volume}}m³ +
    +
    + + + 查看轨迹 + + + 查看轨迹 + +
    +
    + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + + +
    +
    diff --git a/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.less b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.less new file mode 100644 index 00000000..6009fbbf --- /dev/null +++ b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.less @@ -0,0 +1,5 @@ +:host { + .text-black { + color: #000; + } +} diff --git a/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.spec.ts b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.spec.ts new file mode 100644 index 00000000..2c07610f --- /dev/null +++ b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableOrderReportingComponent } from './order-reporting.component'; + +describe('DatatableOrderReportingComponent', () => { + let component: DatatableOrderReportingComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableOrderReportingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableOrderReportingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.ts b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.ts new file mode 100644 index 00000000..9e87d018 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/order-reporting/order-reporting.component.ts @@ -0,0 +1,617 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ReportingService } from '../../services/reporting.service'; +import { DatatableReportingUploadSettingComponent } from '../upload-setting/upload-setting.component'; +import { DatatableReportingVerifyResultComponent } from '../verify-result/verify-result.component'; +import { DatatableReportingvViewTrackComponent } from '../view-track/view-track.component'; + +@Component({ + selector: 'app-datatable-order-reporting', + templateUrl: './order-reporting.component.html', + styleUrls: ['./order-reporting.component.less'] +}) +export class DatatableOrderReportingComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType!: string; + tabs: any[] = [ + { name: '待上传', value: '0' }, + { name: '上传中', value: '3' }, + { name: '已上传', value: '1' }, + { name: '异常', value: '2' }, + { name: '全部', value: '' } + ]; + selectedIndex = '0'; + isLoading: boolean = false; + selectedRows: any[] = []; + constructor( + public service: ReportingService, + private router: Router, + private ar: ActivatedRoute, + private modal: NzModalService, + public shipperSrv: ShipperBaseService + ) { + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}, { + billPutStatus: this.selectedIndex, + }); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + // get selectedRows() { + // return this.st?.list.filter((item: any) => item.checked) || []; + // } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { title: '订单号', type: 'string', ui: { placeholder: '请输入' } }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入', + }, + }, + networkTransporter: { + title: '网络货运人', + type: 'string', + ui: { + placeholder: '请选择', + widget: 'select', + asyncData: () => this.shipperSrv.getNetworkFreightForwarder({}, false), + allowClear: true + } + }, + shipperName: { + title: '货主', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + placeholder: '请输入司机姓名/手机号', visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + carNo: { + title: '车牌号', + type: 'string', + maxLength: 9, + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + // putStatus: { + // title: '上传状态', + // type: 'string', + // default: 0, + // enum: [ + // { label: '待上传', value: 0 }, + // { label: '已上传', value: 1 }, + // { label: '异常', value: 2 } + // ], + + // ui: { + // placeholder: '请选择', + // widget: 'select', + // allowClear: true, + // visibleIf: { + // _$expand: (value: boolean) => value, + // }, + // } + // }, + checkStatus: { + title: '本地校验', + type: 'string', + enum: [ + { label: '检测中', value: 0 }, + { label: '通过', value: 1 }, + { label: '不通过', value: 2 } + ], + ui: { + placeholder: '请选择', + widget: 'select', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + recentlyPutTime: { + title: '上传时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + orderReceivingTime: { + title: '运单生成时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + dispatchedDate: { + title: '发货时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + receivingDate: { + title: '收货时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + + trajectoryDataAppStatus: { + title: '车辆轨迹', + type: 'string', + enum: [ + { label: '全部', value: '' }, + { label: '有', value: '1' }, + { label: '无', value: '0' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + trajectoryDataStatus: { + title: '司机轨迹', + type: 'string', + enum: [ + { label: '全部', value: '' }, + { label: '有', value: '1' }, + { label: '无', value: '0' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + }, + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { + lg: 12, + xl: 8 + }, enter: () => this.search() + }, + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px', }, + { title: '订单状态', index: 'billPutStatusLabel', className: 'text-center', width: '120px', }, + { title: '司机状态', index: 'driverPutStatusLabel', className: 'text-center', width: '120px', }, + { title: '车辆状态', index: 'carPutStatusLabel', className: 'text-center', width: '120px', }, + { title: '本地校验', render: 'checkStatus', className: 'text-center', width: '120px', }, + { + title: '订单号', + render: 'billCode', + className: 'text-center', + width: '180px', + }, + { title: '运单号', render: 'wayBillCode', className: 'text-center', width: '180px', }, + + { + title: '网络货运人', + index: 'enterpriseInfoName', + className: 'text-center', + width: '180px', + }, + { title: '统一社会信用代码', index: 'unifiedSocialCreditCode', className: 'text-center', width: '200px' }, + { title: '运单生成时间', index: 'wayBillCreateTime', className: 'text-center', width: '180px' }, + { title: '发货时间', index: 'dispatchedDate', className: 'text-center', width: '180px' }, + { title: '收货时间', index: 'receivingDate', className: 'text-center', width: '180px' }, + { title: '托运人名称', index: 'shipperName', className: 'text-center', width: '250px' }, + { title: '托运人统一社会信用代码', index: 'shipperCreditCode', className: 'text-center', width: '200px' }, + { title: '装货地址', index: 'loadingAddress', className: 'text-center', width: '200px' }, + { title: '收货方名称', index: 'receivingName', className: 'text-center', width: '150px' }, + { title: '收货地址', index: 'consigneeAddress', className: 'text-center', width: '150px' }, + { title: '运费金额', render: 'freightAmount', className: 'text-center', width: '130px' }, + { title: '车牌号', index: 'carNo', className: 'text-center', width: '150px' }, + { + title: '车牌颜色', + index: 'carNoColor', + className: 'text-center', + width: '250px', + type: 'enum', + enum: { + "4": "绿色", + "3": "黄绿色", + "2": "黄色", + "1": "蓝色" + } + + }, + { title: '司机姓名', index: 'driverName', className: 'text-center', width: '150px' }, + { title: '司机手机号码', index: 'driverPhone', className: 'text-center', width: '200px' }, + { title: '司机身份证号', index: 'driverIdentityNo', className: 'text-center', width: '150px' }, + { title: '货物信息', index: 'goodsName', className: 'text-center', width: '180px' }, + { title: '实际承运人名称', index: 'carrierName', className: 'text-center', width: '150px' }, + { title: '实际承运人证件号码', index: 'carrierIdentityNo', className: 'text-center', width: '200px' }, + + { title: '实际承运人道路运输许可证号', index: 'roadTransportNo', className: 'text-center', width: '150px' }, + + { title: '车辆轨迹', render: 'car', className: 'text-center', width: '250px' }, + { title: '司机轨迹', render: 'driver', className: 'text-center', width: '150px' }, + { title: '上传次数', index: 'putNumber', className: 'text-center', width: '150px' }, + { title: '上传时间', index: 'recentlyPutTime', className: 'text-center', width: '180px' }, + ]; + } + + + + /** + *撤销 + * @param record 记录实例 + */ + recall() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要撤回的数据'); + return; + } + this.modal.confirm({ + nzTitle: '撤回提示', + nzContent: '撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + nzOkText: '确定', + nzCancelText: '取消', + nzOnOk: () => { + const ids = this.selectedRows.map(i => i?.id); + this.service.request(this.service.$api_recall_order_reporting, ids).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('撤销成功'); + this.search(); + } + }) + } + }); + + } + + changeSt(e: STChange): void { + + if (e.type === 'checkbox') { + const checkRows = (e.checkbox as STData[]) || []; + //判断当前页是否有选中的行 + if (checkRows.length === 0) { + // 当前页没有存在已勾选的行,移除之前所记录的当前页的行 + const stList = this.st.list; + stList.forEach(item => { + this.selectedRows = this.selectedRows.filter((e: any) => e.id !== item.id); + }) + } else { + //添加新增的行 + checkRows.forEach((item: any) => { + const newSelectedList = this.selectedRows.filter((r: any) => r.id === item.id); + if (newSelectedList.length === 0) { + this.selectedRows.push(item); + + } + }) + // 移除取消选中的行 + const stList = this.st.list; + stList.forEach(item => { + if (!item.checked) { + const index = this.selectedRows.findIndex(_item => item.id === _item.id); + if (index !== -1) this.selectedRows.splice(index, 1); + } + }) + } + } else if (e.type === 'loaded') { + // 页面加载时勾选 + (e?.loaded || []).forEach((r: any) => { + this.selectedRows.forEach((x) => { + if (x.id === r.id) { + r.checked = true; + } + }); + }); + } + } + + selectChange(item: any) { + this.selectedIndex = item?.value || ''; + setTimeout(() => { + this.selectedRows = []; + this.st.load(1); + }) + } + + /** + * 查看当行数据 + */ + view(record: STData) { + // this.router.navigate(['../view', record.uuid], { relativeTo: this.ar }); + this.router.navigate(['../detail'], { + queryParams: { + id: record.id, + }, + relativeTo: this.ar + }); + } + + // appeal(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '申诉', + // nzWidth: '40%', + // nzContent: CtcAppealComponent, + // nzComponentParams: { + // i: item, + // status: 'add' + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe(res => { + // if (res) { + // this.search({ representationsStatus: '' }); + // } + // }) + // } + + /** + * 上传 + */ + upload() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要上传的数据'); + return; + } + const ids = this.selectedRows.map(i => i?.id); + this.service.request(this.service.$api_upload_order_reporting, ids).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('上传成功'); + this.search(); + } + }) + } + + + /** + * + * @param params 上传设置 + */ + uploadSetting() { + const modalRef = this.modal.create({ + nzTitle: '上传设置', + nzWidth: 600, + nzContent: DatatableReportingUploadSettingComponent, + nzComponentParams: {}, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + }) + } + + /** + * 查看校验结果 + */ + viewResult(item: any) { + const modalRef = this.modal.create({ + nzTitle: '校验结果', + nzWidth: 1200, + nzContent: DatatableReportingVerifyResultComponent, + nzComponentParams: { + record: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + }) + } + + /** + * 查看监管审核结果 + */ + viewAuditResult(record: any) { + if (record?.billStatus !== '2') { + return; + } + this.openWainingModal('监管审核结果', record?.result) + } + + + search() { + this.selectedRows = []; + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart({ ...this.sf?.value, pageSize: -1 }, this.service.$api_export_reporting_order); + } + + openWainingModal(content: string, title = '提示') { + this.modal.warning({ + nzMask: false, + nzTitle: title, + nzContent: content, + }) + } + + /** + * 查看轨迹 + */ + viewTrack(_record: any, trajectory: string) { + const title = trajectory === 'car' ? '车辆' : '司机' + const modalRef = this.modal.create({ + nzTitle: `查看${title}轨迹`, + nzWidth: 1000, + nzContent: DatatableReportingvViewTrackComponent, + nzComponentParams: { + id: _record?.orderId, + trajectory + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + }) + } + + /** + * 更新数据 + */ + updateData() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要更新的数据'); + return; + } + const ids = this.selectedRows.map(i => i?.orderId); + this.service.request(this.service.$api_update_order_data, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.selectedRows = []; + this.st.reload(); + } + }) + } + + filterStatus(status: number) { + switch (status) { + case 0: + return '待上传'; + case 1: + return '已上传'; + case 2: + return '上传异常'; + default: + return ''; + + } + } + + filterCheckStatus(status: string | number) { + switch (status) { + case '0': + return '检测中'; + case '1': + return '通过'; + case '2': + return '不通过'; + default: + return ''; + + } + } + + routeToOrder(item: any) { + if (item.billType === '1') { + window.open(location.origin + `/#/order-management/vehicle/vehicle-detail/${item.orderId}`); + } else { + window.open(location.origin + `/#/order-management/bulk/bulk-detail/${item.orderId}`); + } + } + + routeTowaybill(item: any) { + if (item.billType === '1') { + window.open(location.origin + `/#/waybill-management/vehicle/vehicle-detail/${item.waybillId}`); + + } else { + window.open(location.origin + `/#/waybill-management/bulk/bulk-detail/${item.waybillId}`); + + } + } + +} diff --git a/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.html b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.html new file mode 100644 index 00000000..967041a5 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.spec.ts b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.spec.ts new file mode 100644 index 00000000..aeb5cf2c --- /dev/null +++ b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingUploadSettingComponent } from './upload-setting.component'; + +describe('DatatableReportingUploadSettingComponent', () => { + let component: DatatableReportingUploadSettingComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingUploadSettingComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingUploadSettingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.ts b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.ts new file mode 100644 index 00000000..0258f230 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/upload-setting/upload-setting.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { ReportingService } from '../../services/reporting.service'; + +@Component({ + selector: 'app-datatable-upload-setting', + templateUrl: './upload-setting.component.html', +}) +export class DatatableReportingUploadSettingComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + + constructor( + private modal: NzModalRef, + public service: ReportingService + ) { } + + ngOnInit(): void { + this.initSF(); + this.loadData(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + orderPushType: { + type: 'string', + title: '订单数据', + enum: [ + { + label: '手动上传', + value: 1 + }, + { + label: '自动上传', + value: 2 + } + ], + description: '开启自动上传后,订单将在支付完成且风险单校验通过后自动上传', + ui: { + widget: 'radio', + + } + }, + capitalPushType: { + type: 'string', + title: '资金数据', + enum: [ + { + label: '手动上传', + value: 1 + }, + { + label: '自动上传', + value: 2 + } + ], + description: '开启自动上传后,订单将在支付完成且风险单校验通过后自动上传', + ui: { + widget: 'radio', + + } + }, + }, + required: ['orderPushType', 'capitalPushType'], + } + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 24 }, + }, + }; + } + + /** + * 获取设置数据 + */ + loadData() { + this.service.request(this.service.$api_get_upload_setting, {}).subscribe(res => { + if (res) { + this.i = res; + } + }) + } + + /** + * 修改 + * @param value + */ + save(value: any): void { + if (this.sf?.valid) + this.service.request(this.service.$api_upload_setting_save, { ...value }).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.modal.close(true); + } + }) + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.html b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.html new file mode 100644 index 00000000..2ed32290 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.html @@ -0,0 +1,21 @@ +
    +
    + + + +
    +
    + + + {{filterCheckStatus(item?.checkStatus)}} + + +
    +
    + diff --git a/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.spec.ts b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.spec.ts new file mode 100644 index 00000000..48b1e9e5 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingVerifyResultComponent } from './verify-result.component'; + +describe('DatatableReportingVerifyResultComponent', () => { + let component: DatatableReportingVerifyResultComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingVerifyResultComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingVerifyResultComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.ts b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.ts new file mode 100644 index 00000000..15ef42f2 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/verify-result/verify-result.component.ts @@ -0,0 +1,138 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { ReportingService } from '../../services/reporting.service'; + +@Component({ + selector: 'app-datatable-verify-result', + templateUrl: './verify-result.component.html', +}) +export class DatatableReportingVerifyResultComponent implements OnInit { + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = []; + record: any = {}; + + tabs: any[] = [ + { name: '订单信息', value: 3 }, + { name: '司机信息', value: 2 }, + { name: '车辆信息', value: 4 }, + ]; + subjectType = 3; + subjectId = ''; + get reqParams() { + return { + subjectType: this.subjectType, + subjectId: this.record?.orderId, + + }; + } + + constructor(public service: ReportingService, private modalRef: NzModalRef, public router: Router) { + + } + + beforeReq(requestOptions: STRequestOptions) { + delete requestOptions?.body?.pageSize; + delete requestOptions?.body?.pageIndex; + return requestOptions; + } + + ngOnInit(): void { + this.initST(); + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '序号', type: 'no', className: 'text-center', width: '60px', }, + { title: '监管平台字段', index: 'thirdPartyFieldName', className: 'text-center', width: '120px', }, + { title: '系统字段', index: 'checkFieldName', className: 'text-center', width: '100px', }, + { title: '归属模块', index: 'orderStatus', className: 'text-center', width: '120px', }, + { + title: '是否必填', + index: 'requiredStatus', + className: 'text-center', + width: '100px', + type: 'enum', + enum: { + 0: '否', + 1: '是' + } + }, + { title: '上传值', index: 'fieldValue', className: 'text-center', width: '150px', }, + { + title: '本地校验', render: 'checkStatus', className: 'text-center', width: '100px', + // type: 'enum', + // enum: { + // 0: '校验中', + // 1: '通过', + // 2: '不通过' + // } + }, + { title: '错误内容', index: 'remark', className: 'text-center', width: '150px', }, + ] + } + + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + + selectTab(e: any) { + this.subjectType = e?.value; + setTimeout(() => { + this.st.load(1); + }) + } + + update() { + switch (this?.subjectType) { + case 2: + this.openNewPage(`/usercenter/driver/detail/${this.record?.driverId}`); + break; + case 3: + if (this.record?.billType === '1') { + this.openNewPage(`/order-management/vehicle-detailChange/${this.record?.orderId}`); + } else if (this.record.billType === '2') { + this.openNewPage(`/order-management/bulk-detailChange/${this.record?.orderId}`); + } + break; + case 4: + this.openNewPage(`/vehicle/list/detail/${this.record?.carId}`); + break; + default: + break; + } + + + + } + + + close(): void { + this.modalRef.destroy(); + } + filterCheckStatus(status: number) { + switch (status) { + case 0: + return '检测中'; + case 1: + return '通过'; + case 2: + return '不通过'; + default: + return ''; + + } + } + + openNewPage(url: string) { + window.open(location.origin + `/#` + url); + } + +} diff --git a/src/app/routes/datatable/reporting/components/view-track/view-track.component.html b/src/app/routes/datatable/reporting/components/view-track/view-track.component.html new file mode 100644 index 00000000..cc66c9c3 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/view-track/view-track.component.html @@ -0,0 +1,5 @@ +
    + + + +
    diff --git a/src/app/routes/datatable/reporting/components/view-track/view-track.component.spec.ts b/src/app/routes/datatable/reporting/components/view-track/view-track.component.spec.ts new file mode 100644 index 00000000..c32eb107 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/view-track/view-track.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingvViewTrackComponent } from './view-track.component'; + +describe('DatatableReportingvViewTrackComponent', () => { + let component: DatatableReportingvViewTrackComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingvViewTrackComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingvViewTrackComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/datatable/reporting/components/view-track/view-track.component.ts b/src/app/routes/datatable/reporting/components/view-track/view-track.component.ts new file mode 100644 index 00000000..f78e3b56 --- /dev/null +++ b/src/app/routes/datatable/reporting/components/view-track/view-track.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import format from 'date-fns/format'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from 'src/app/routes/order-management/services/order-management.service'; + +@Component({ + selector: 'app-datatable-view-track', + templateUrl: './view-track.component.html' +}) +export class DatatableReportingvViewTrackComponent implements OnInit { + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + trajectory = 'car'; + pois: any[] = []; + id = ''; + constructor(public service: OrderManagementService, private modalRef: NzModalRef, public router: Router) {} + + ngOnInit(): void { + if (this.trajectory === 'car') { + this.getTrajectory(); + } else if (this.trajectory === 'driver') { + this.getDriverTrajectory(); + } + } + + selectTab(e: any) {} + + close(): void { + this.modalRef.destroy(); + } + + // 车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))] + }); + }); + this.mapList = list; + this.addressItems = [...res.parkArray]; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))] + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/datatable/reporting/services/reporting.service.ts b/src/app/routes/datatable/reporting/services/reporting.service.ts new file mode 100644 index 00000000..86da8648 --- /dev/null +++ b/src/app/routes/datatable/reporting/services/reporting.service.ts @@ -0,0 +1,30 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class ReportingService extends BaseService { + + $api_get_order_reporting_page = `/api/sdc/regulation/list/queryPage`; // 订单上报-列表 + $api_upload_order_reporting = `/api/sdc/regulation/push`; // 上传订单上报 + $api_recall_order_reporting = `/api/sdc/regulation/withdraw`; // 撤回上传订单上报 + $api_async_export_order_reporting_list = ``; // 导出订单上报 + $api_get_upload_setting = `/api/sdc/regulation/getPushConfig`; // 获取上传设置 + $api_upload_setting_save = `/api/sdc/regulation/setPushConfig`; // 保存上传设置 + $api_get_order_valid_result = `/api/sdc/regulation/queryPage/checkRes`;//订单上报-校验结果 + $api_update_order_data = `/api/sdc/regulation/renewalOrderById`;//订单批量更新订单数据 + $api_export_reporting_order = `/api/sdc/regulation/asyncExportBillReportList`; // 订单上报导出 + + $api_get_fund_reporting_page = `/api/fcc/fundUploadHead/list/page`; // 资金上报列表 + $api_fund_reporting_upload = `/api/fcc/fundUploadHead/uploadFundNumber`; // 资金批量上传 + $api_fund_reporting_recall = `/api/fcc/fundUploadHead/recallUploadFundNumber`; //资金批量撤回 + $api_get_fund_valid_result = `/api/fcc/capitalFieldCheck/getCapitalFieldCheckList`; // 查询资金校验表 + $api_update_fund_data = `/api/fcc/fundUploadHead/updateUploadFundNumber`;//资金批量更新数据 + $api_export_fund_reporting = `/api/fcc/fundUploadHead/exportFundUpload`; // 导出资金上传 + + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/datatable/services/data.service.ts b/src/app/routes/datatable/services/data.service.ts new file mode 100644 index 00000000..609ed1b6 --- /dev/null +++ b/src/app/routes/datatable/services/data.service.ts @@ -0,0 +1,139 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-27 10:30:56 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-18 16:37:20 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\datatable\\services\\data.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { map } from 'rxjs/operators'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root', +}) +export class DataService extends BaseService { + + // 查询运营报表 + $api_listOperationalReportPage = `/api/sdc/report/listOperationalReportPage`; + // 查询业绩报表 + $api_listPerformanceReportPage = `/api/sdc/report/listPerformanceReportPage`; + // 运营报表运单状态分布 + $api_operationalReportWaybillStatusDistribution = `/api/sdc/report/operationalReportWaybillStatusDistribution`; + // 运营报表柱状图 + $api_operationalReportHistogram = `/api/sdc/report/operationalReportHistogram`; + // 获取网络货运人 + $api_get_network_freight_forwarder_list = `/api/mdc/cuc/networkTransporter/findAll`; + // 业绩报表柱状图 + $api_performanceReportHistogram = `/api/sdc/report/performanceReportHistogram`; + + // 查询开票数据报表 + $api_findInvoiceReport = `/api/fcc/invoiceReport/findInvoiceReport`; + // 查询开票数据报表 + $api_listFinancialReportPage = `/api/sdc/report/listFinancialReportPage`; + + + // 查询货主报表 + $api_listShipperReportPage = `/api/sdc/report/listShipperReportPage`; + // 司机报表 + $api_listDriverReportPage = `/api/sdc/report/listDriverReportPage`; + // 财务报表柱状图 + $api_financialReportHistogram = `/api/sdc/report/financialReportHistogram`; + // 合规监控报表-运费直付占比 + $api_getBillRateDirectPayment = `/api/sdc/reportComplianceMonitor/getBillRateDirectPayment`; + // 合规监控报表-货源单占比 + $api_getBillRateProportion = `/api/sdc/reportComplianceMonitor/getBillRateProportion`; + // 合规监控报表-订单合格率 + $api_getBillRateQualified = `/api/sdc/reportComplianceMonitor/getBillRateQualified`; + // 合规监控报表-付款及时率 + $api_getBillTimelyPayment = `/api/sdc/reportComplianceMonitor/getBillTimelyPayment`; + // 合规监控报表-监控报表(折线图) + $api_listMonitorSituation = `/api/sdc/reportComplianceMonitor/listMonitorSituation`; + + + // 客户报表-根据类型获取统计信息(card) + $api_statistics_total = `/api/mdc/cuc/statistics/total`; + // 客户报表-根据类型获取统计明细信息(table) + $api_statistics_totalDetail = `/api/mdc/cuc/statistics/totalDetail`; + // 客户报表-根据类型获取统计图表信息 + $api_statistics_totalAdd = `/api/mdc/cuc/statistics/totalAdd`; + + + // 数据大屏-本年全年交易情况 + $api_getAnnualTransactions = `/api/sdc/reportDataLargeScreen/getAnnualTransactions`; + // 数据大屏-客户统计(货主,合伙人,司机,车辆) + $api_getCustomerStatistics = `/api/sdc/reportDataLargeScreen/getCustomerStatistics`; + // 数据大屏-实时货源 + $api_getRealTimeSupply = `/api/sdc/reportDataLargeScreen/getRealTimeSupply`; + // 数据大屏-实时运单风控 + $api_getRealTimeWaybillRiskControl = `/api/sdc/reportDataLargeScreen/getRealTimeWaybillRiskControl`; + // 数据大屏-本月发货量排名 + $api_getShipmentRanking = `/api/sdc/reportDataLargeScreen/getShipmentRanking`; + // 数据大屏-今日交易情况 + $api_getTradingToday = `/api/sdc/reportDataLargeScreen/getTradingToday`; + // 数据大屏-本月交易趋势 + $api_getTradingTrend = `/api/sdc/reportDataLargeScreen/getTradingTrend`; + // 数据大屏-交易额(今日,本月,累计) + $api_getTransactionAmount = `/api/sdc/reportDataLargeScreen/getTransactionAmount`; + // 数据大屏-交易分布 + $api_getTransactionDistribution = `/api/sdc/reportDataLargeScreen/getTransactionDistribution`; + + // 客户-合规报表 + $api_listCusComplianceReportPage = `/api/sdc/report/listCusComplianceReportPage`; + + // 查询业务员报表-客户、合伙人 + $api_listPartBusinessReportPage = `/api/sdc/report/listPartBusinessReportPage`; + // 业务员-合规报表 + $api_listPartComplianceReportPage = `/api/sdc/report/listPartComplianceReportPage`; + + // 数据报表-订单类型比例 + $api_getBillTypeProportion = `/api/sdc/reportData/getBillTypeProportion`; + // 数据报表-运单直付比例 + $api_getWayBillDirectProportion = `/api/sdc/reportData/getWayBillDirectProportion`; + // 数据报表-统计订单金额-趋势 + $api_getBillAmount = `/api/sdc/reportData/getBillAmount`; + // // 数据报表-统计订单金额-趋势 + // $api_getBillAmount = `/api/sdc/reportData/getBillAmount`; + + + + constructor(public injector: Injector) { + super(injector); + } + + /** +* 获取网络货运人 +* @returns +*/ + getNetworkFreightForwarder(params = {}, containerAll = false) { + return this.request(this.$api_get_network_freight_forwarder_list, params).pipe( + map((res: any) => { + if (!res) { + return []; + } + const list = res.map((item: any) => { + return { + label: item.enterpriseName, + value: item.id + }; + }); + const obj = []; + if (containerAll) { + obj.push({ label: '全部', value: '' }); + } + return [...obj, ...list]; + }) + ); + } + + getPerformanceReportHistogram(params = {}) { + return this.request(this.$api_performanceReportHistogram, params) + } +} diff --git a/src/app/routes/download/components/list/list.component.html b/src/app/routes/download/components/list/list.component.html new file mode 100644 index 00000000..40d662a6 --- /dev/null +++ b/src/app/routes/download/components/list/list.component.html @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/download/components/list/list.component.ts b/src/app/routes/download/components/list/list.component.ts new file mode 100644 index 00000000..05f38c4c --- /dev/null +++ b/src/app/routes/download/components/list/list.component.ts @@ -0,0 +1,128 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { DownloadService } from '../../services/download.service'; + +@Component({ + selector: 'app-download-center-components-list', + templateUrl: './list.component.html' +}) +export class DownloadComponentsListComponent implements OnInit { + ui: SFUISchema = {}; + schema: SFSchema = {}; + columns: STColumn[] = []; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + constructor(public service: DownloadService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { ...params, createTime: params?.createTime?.start, applyEndTime: params?.createTime?.end }; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { + type: 'boolean', + ui: { hidden: true } + }, + createTime: { + type: 'string', + title: '创建时间', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + this.ui = { '*': { spanLabelFixed: 80, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '文件名称', index: 'dataSourcesDetail', className: 'text-center' }, + { title: '文件来源', index: 'dataSources', className: 'text-center' }, + { title: '文件大小', index: 'dataSize', width: '120px', className: 'text-center' }, + { + title: '生成状态', + index: 'status', + width: '120px', + className: 'text-center', + type: 'enum', + enum: { + 0: '生成中', + 1: '已完成', + 2: '失败' + } + }, + { title: '下载次数', index: 'downloadCount', width: '120px', className: 'text-center' }, + { title: '创建时间', index: 'createTime', width: '120px', className: 'text-center' }, + { title: '生成时间', index: 'completeTime', width: '180px', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + width: '170px', + className: 'text-center', + buttons: [{ text: '下载', click: _record => this.download(_record) }] + } + ]; + } + + /** + * 删除单个实例 + * @param record 记录实例 + */ + delOne(record: STData) { + const headers = [{ key: 'Content-Type', value: 'application/json' }]; + this.modal.confirm({ + nzTitle: '删除确认', + nzContent: `即将删除 当前行数据,请仔细核对,避免误操作!
    是否删除?
    `, + nzOnOk: () => + this.service.request(this.service.encodeUrlHeader(this.service.$api_del_many, headers), { fileKey: record.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('数据删除成功!'); + this.st?.reload(); + } + }) + }); + } + download(record: STData) { + const headers = [{ key: 'Content-Type', value: 'application/json' }]; + this.service.downloadFile( + this.service.encodeUrlHeader(this.service.$api_download_file, headers), + {}, + { fileKey: record.fileUniqueKey }, + 'POST' + ); + } +} diff --git a/src/app/routes/download/download-routing.module.ts b/src/app/routes/download/download-routing.module.ts new file mode 100644 index 00000000..6cd311bb --- /dev/null +++ b/src/app/routes/download/download-routing.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { DownloadComponentsListComponent } from './components/list/list.component'; + +const routes: Routes = [ + { path: '', redirectTo: 'list', pathMatch: 'full' }, + { path: 'list', component: DownloadComponentsListComponent, data: { reuse: true } }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class DownloadRoutingModule {} diff --git a/src/app/routes/download/download.module.ts b/src/app/routes/download/download.module.ts new file mode 100644 index 00000000..a6b86c99 --- /dev/null +++ b/src/app/routes/download/download.module.ts @@ -0,0 +1,12 @@ +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; +import { DownloadComponentsListComponent } from './components/list/list.component'; +import { DownloadRoutingModule } from './download-routing.module'; + +const COMPONENTS: Type[] = [DownloadComponentsListComponent]; + +@NgModule({ + imports: [SharedModule, DownloadRoutingModule], + declarations: COMPONENTS, +}) +export class DownloadModule {} diff --git a/src/app/routes/download/services/download.service.ts b/src/app/routes/download/services/download.service.ts new file mode 100644 index 00000000..12fcb323 --- /dev/null +++ b/src/app/routes/download/services/download.service.ts @@ -0,0 +1,18 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class DownloadService extends BaseService { + // 删除多个实例接口地址 + $api_del_many = '/scm/cms/cms/deleteRecordInfo/file'; + // 获取实例分页数据接口地址 + $api_get_page = '/api/mdc/pbc/asynExportInfo/getAsynExportInfoListPage'; + // 下载文件 + $api_download_file = '/api/mdc/pbc/download/file'; + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/exception/403.component.ts b/src/app/routes/exception/403.component.ts new file mode 100644 index 00000000..166a6a49 --- /dev/null +++ b/src/app/routes/exception/403.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'exception-403', + template: ` ` +}) +export class Exception403Component {} diff --git a/src/app/routes/exception/404.component.ts b/src/app/routes/exception/404.component.ts new file mode 100644 index 00000000..f644917b --- /dev/null +++ b/src/app/routes/exception/404.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'exception-404', + template: ` ` +}) +export class Exception404Component {} diff --git a/src/app/routes/exception/500.component.ts b/src/app/routes/exception/500.component.ts new file mode 100644 index 00000000..c04c556a --- /dev/null +++ b/src/app/routes/exception/500.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'exception-500', + template: ` ` +}) +export class Exception500Component {} diff --git a/src/app/routes/exception/exception-routing.module.ts b/src/app/routes/exception/exception-routing.module.ts new file mode 100644 index 00000000..db62c1c0 --- /dev/null +++ b/src/app/routes/exception/exception-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { Exception403Component } from './403.component'; +import { Exception404Component } from './404.component'; +import { Exception500Component } from './500.component'; +import { ExceptionTriggerComponent } from './trigger.component'; + +const routes: Routes = [ + { path: '403', component: Exception403Component }, + { path: '404', component: Exception404Component }, + { path: '500', component: Exception500Component }, + { path: 'trigger', component: ExceptionTriggerComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class ExceptionRoutingModule {} diff --git a/src/app/routes/exception/exception.module.ts b/src/app/routes/exception/exception.module.ts new file mode 100644 index 00000000..88fbbe3b --- /dev/null +++ b/src/app/routes/exception/exception.module.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { ExceptionModule as DelonExceptionModule } from '@delon/abc/exception'; +import { NzButtonModule } from 'ng-zorro-antd/button'; +import { NzCardModule } from 'ng-zorro-antd/card'; + +import { Exception403Component } from './403.component'; +import { Exception404Component } from './404.component'; +import { Exception500Component } from './500.component'; +import { ExceptionRoutingModule } from './exception-routing.module'; +import { ExceptionTriggerComponent } from './trigger.component'; + +const COMPONENTS = [Exception403Component, Exception404Component, Exception500Component, ExceptionTriggerComponent]; + +@NgModule({ + imports: [CommonModule, DelonExceptionModule, NzButtonModule, NzCardModule, ExceptionRoutingModule], + declarations: [...COMPONENTS] +}) +export class ExceptionModule {} diff --git a/src/app/routes/exception/trigger.component.ts b/src/app/routes/exception/trigger.component.ts new file mode 100644 index 00000000..5a0c373d --- /dev/null +++ b/src/app/routes/exception/trigger.component.ts @@ -0,0 +1,35 @@ +import { Component, Inject } from '@angular/core'; +import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; +import { _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'exception-trigger', + template: ` +
    + + + + +
    + ` +}) +export class ExceptionTriggerComponent { + types = [401, 403, 404, 500]; + + constructor(private http: _HttpClient, @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {} + + go(type: number): void { + this.http.get(`/api/${type}`).subscribe(); + } + + refresh(): void { + this.tokenService.set({ token: 'invalid-token' }); + // 必须提供一个后端地址,无法通过 Mock 来模拟 + this.http.post(`https://localhost:5001/auth`).subscribe( + res => console.warn('成功', res), + err => { + console.log('最后结果失败', err); + } + ); + } +} diff --git a/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.html b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.html new file mode 100644 index 00000000..f5f453b1 --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.html @@ -0,0 +1,55 @@ + + + + + + + +
    + + {{formData?.ltdName}} + + + {{formData?.bankTypeLabel}} + + + {{formData?.virtualAccount}} + + + {{formData?.transferBankAccount}} + + + {{formData?.rechargeAmount | currency}} + + + {{formData?.transferBankOpenName}} + + + {{formData?.rechargeStatusLabel}} + + + {{formData?.rechargeRemark}} + + + {{formData?.createTime}} + + + {{formData?.refundTime}} + + + {{formData?.paySerialNumber}} + + + {{formData?.paySerialNumber2}} + + +
    + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.less b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.ts b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.ts new file mode 100644 index 00000000..af5d81dd --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-abnormal-gold-detail', + templateUrl: './abnormal-gold-detail.component.html', + styleUrls: ['./abnormal-gold-detail.component.less'] +}) +export class AbnormalGoldDetailComponent implements OnInit { + formData: any = {}; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + const id = route.snapshot.params.id; + this.loadRefundDetail(id); + } + + ngOnInit(): void {} + + loadRefundDetail(id: string) { + this.service.request(this.service.$api_get_getAbnormalAmount_detail, { id }).subscribe(res => { + if (res) { + this.formData = res; + } + }); + } + + downBack(bussType: string, receiptUrl: string) { + if (this.formData?.refundStatus !== '3') { + return; + } + this.service.getReceiptUrl(receiptUrl, { + bankType: this.formData.bankType, + rmYll: this.formData.userId, + snglFlgCd: this.formData.coreSerNo, + bussType, + ltdId: this.formData.ltdId, + accountType: this.formData.accountType + }); + } + + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.html b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.html new file mode 100644 index 00000000..593c1e97 --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.html @@ -0,0 +1,52 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + diff --git a/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.ts b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.ts new file mode 100644 index 00000000..55817107 --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/abnormal-gold.component.ts @@ -0,0 +1,203 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; +import { ClearingModalComponent } from './clearing-modal/clearing-modal.component'; + +@Component({ + selector: 'app-abnormal-gold', + templateUrl: './abnormal-gold.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class AbnormalGoldComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + rechargeStatus = '1'; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { rechargeStatus: this.rechargeStatus }); + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + return requestOptions; + }; + + changePaymentStatus(status: string) { + this.rechargeStatus = status; + this.st.load(1); + } + + refund(item: any) { + this.nzModalService.warning({ + nzTitle: '确定要将该笔款项原路退回?', + nzOnOk: () => {} + }); + } + + clearingAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '清分', + nzContent: ClearingModalComponent, + nzOnOk: com => { + return false; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + paySerialNumber: { + type: 'string', + title: '银行流水号', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: '' }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + transferBankAccount: { + type: 'string', + title: '付款账户', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + transferBankCardNumber: { + type: 'string', + title: '付款账号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + transferBankOpenName: { + type: 'string', + title: '付款银行', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + transferDate: { + title: '转账时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '银行流水号', index: 'paySerialNumber', width: 180 }, + { title: '网络货运人', index: 'ltdName', width: 220 }, + { title: '银行类型', index: 'bankTypeLabel', width: 100 }, + { title: '资金总账号', index: 'virtualAccount', width: 180 }, + { + title: '充值金额', + index: 'rechargeAmount', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.rechargeAmount }) } + }, + { title: '付款账户', index: 'transferBankAccount', width: 180 }, + { title: '付款账号', index: 'transferBankCardNumber', width: 180 }, + { title: '付款银行', index: 'transferBankOpenName', width: 220 }, + { title: '转账时间', index: 'createTime', type: 'date', width: 150 }, + { title: '转账备注', index: 'rechargeRemark', width: 180 }, + { title: '退款时间', index: 'refundTime', type: 'date', width: 150 }, + // { title: '操作人', index: 'rechargeName', width: 140 }, + // { title: '操作时间', index: 'callNo', type: 'date', width: 160 }, + { title: '状态', index: 'rechargeStatusLabel', width: 110 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { + text: '查看', + click: item => this.router.navigate(['/financial-management/abnormal-gold/detail/' + item.id]) + } + ] + } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportAbnormalAmountPage); + } +} diff --git a/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.html b/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.html new file mode 100644 index 00000000..fd8c045d --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.less b/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.ts b/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.ts new file mode 100644 index 00000000..592e7bc4 --- /dev/null +++ b/src/app/routes/financial-management/components/abnormal-gold/clearing-modal/clearing-modal.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { SFComponent, SFSchema, SFTextWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +const IMAGECONFIG = { + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + name: 'multipartFile', + multiple: false, + listType: 'picture-card' +}; + +@Component({ + selector: 'app-clearing-modal', + templateUrl: './clearing-modal.component.html', + styleUrls: ['./clearing-modal.component.less'] +}) +export class ClearingModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 18 } + } + }; + + constructor( + private modal: NzModalRef, + public service: FreightAccountService, + public shipperservice: ShipperBaseService, + ) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '入账金额', + type: 'string', + ui: { + widget: 'text' + } as SFTextWidgetSchema, + default: '10000.00' + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + }, + }, + name3: { + title: '银行类型', + type: 'string', + ui: { + widget: 'text' + } as SFTextWidgetSchema, + default: '平安银行' + }, + receiveName: { + type: 'string', + title: '分配对象', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + licensePhotoWatermark: { + type: 'string', + title: '上传凭证', + ui: { + ...IMAGECONFIG, + change: args => { + if (args.type === 'success') { + this.sf.setValue('/licensePhoto', args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + } + }, + required: ['name', 'name2', 'name3', 'receiveName'] + }; + } +} diff --git a/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.html b/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.html new file mode 100644 index 00000000..f61ad33d --- /dev/null +++ b/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.html @@ -0,0 +1,86 @@ + + + + + + + +
    +
    + + 基本信息 + + {{ costInfo?.ltdName }} + + + {{ costInfo?.banktypeLabel }} + + + {{ costInfo?.artoname }} + + + {{ costInfo?.cnoName }} + + + {{ costInfo?.ltdaccountId }} + + + {{ costInfo?.brmmoney |currency }} + + + {{ costInfo?.brmtypeLabel }} + + +
    +
    +
    + + + + + + + + {{index+1}} + + + + + + + + {{index+1}} + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.ts b/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.ts new file mode 100644 index 00000000..0ddf08f4 --- /dev/null +++ b/src/app/routes/financial-management/components/advance-collection/advance-collection-detail/advance-collection-detail.component.ts @@ -0,0 +1,150 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-advance-collection-detail', + templateUrl: './advance-collection-detail.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/basic-board.less'] +}) +export class AdvanceCollectionDetailComponent implements OnInit { + @ViewChild('inputST', { static: true }) + inputST!: STComponent; + columns: { [key: string]: STColumn[] } = this.initST(); + @ViewChild('infoST', { static: true }) + infoST!: STComponent; + costInfo: any = {}; + id: any = null; + + @ViewChild('sf', { static: false }) + inputSF!: SFComponent; + @ViewChild('sf', { static: false }) + infoSF!: SFComponent; + inputSearchSchema: SFSchema = this.initInputSF(); + infoSearchSchema: SFSchema = this.initInfoSF(); + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + this.loadDetail(this.id); + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + id: this.id + }); + return requestOptions; + }; + + loadDetail(id: any) { + this.service.request(this.service.$api_get_advance_collection_header, { id }).subscribe(res => { + if (res) { + this.costInfo = res; + } + }); + } + + /** + * 重置表单 + */ + resetInputSF() { + this.inputSF.reset(); + } + /** + * 重置表单 + */ + resetInfoSF() { + this.infoSF.reset(); + } + + goBack() { + history.go(-1); + } + + private initInputSF(): SFSchema { + return { + properties: { + feedate: { + title: '到账日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + billHCode: { + type: 'string', + title: '收款单号', + ui: { + placeholder: '请输入' + } + } + } + }; + } + + private initInfoSF(): SFSchema { + return { + properties: { + feedate: { + title: '核销日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + billHCode: { + type: 'string', + title: '核销单号', + ui: { + placeholder: '请输入' + } + } + } + }; + } + + private initST(): { [key: string]: STColumn[] } { + return { + input: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '收款单号', index: 'brmHCode', className: 'text-left', width: 200 }, + // { title: '到账日期', index: 'billHId', className: 'text-center', width: 150 }, + { + title: '到账金额', + index: 'yskmoney', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, + width: 140 + }, + { + title: '转预收金额', + index: 'yskmoney', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, + width: 140 + }, + // { title: '预收备注', index: 'callNo', width: 200 } + ], + info: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '核销单号', index: 'ahxcode', className: 'text-left', width: 200 }, + { title: '核销日期', index: 'ahxdate', className: 'text-center', width: 150 }, + { + title: '核销金额', + index: 'ahxmoney', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ahxmoney }) }, + width: 200 + }, + { title: '核销备注', index: 'remarks', className: 'text-left', width: 200 } + ] + }; + } +} diff --git a/src/app/routes/financial-management/components/advance-collection/advance-collection.component.html b/src/app/routes/financial-management/components/advance-collection/advance-collection.component.html new file mode 100644 index 00000000..065f29b2 --- /dev/null +++ b/src/app/routes/financial-management/components/advance-collection/advance-collection.component.html @@ -0,0 +1,28 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/advance-collection/advance-collection.component.ts b/src/app/routes/financial-management/components/advance-collection/advance-collection.component.ts new file mode 100644 index 00000000..1462a5cd --- /dev/null +++ b/src/app/routes/financial-management/components/advance-collection/advance-collection.component.ts @@ -0,0 +1,164 @@ +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; + +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-advance-collection', + templateUrl: './advance-collection.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class AdvanceCollectionComponent { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + _$expand = false; + + constructor(public service: FreightAccountService, private router: Router, private modal: NzModalService) {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + this.service.exportStart( { ...this.sf.value, pageSize: -1 }, this.service.$api_get_reportYskBla,); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount() + } + }, + arto: { + type: 'string', + title: '付款人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }) + } + }, + brmtype: { + type: 'string', + title: '收款类型', + enum: [{ label: '全部', value: null }], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: null + }, + banktype: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: null }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: null + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '网络货运人', width: 160, index: 'ltdName' }, + { title: '银行类型', width: 120, index: 'banktypeLabel' }, + { title: '收款账户', width: 150, index: 'ltdaccountId' }, + { title: '收款类型', width: 120, index: 'brmtypeLabel' }, + { + title: '预收余额', + index: 'yskmoney', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) } + }, + { title: '付款人', index: 'artoName', width: 180 }, + { title: '结算客户', index: 'cnoName', width: 150 }, + { + title: '操作', + width: 120, + className: 'text-center', + fixed: 'right', + buttons: [ + { + text: '浏览', + click: item => this.router.navigate([`/financial-management/advance-collection/detail/${item.id}`]) + } + // { + // text: '核销' + // }, + // { + // text: '退款' + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.html b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.html new file mode 100644 index 00000000..976d3b4a --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.html @@ -0,0 +1,150 @@ + + + + + + + +
    +
    + + 基本信息(应收费用) + + {{ costInfo?.ltdName }} + + + {{ costInfo?.feetypeLabel }} + + + {{ costInfo?.arremarks }} + + + {{ costInfo?.artoname }} + + + {{ costInfo?.arvattypeLabel }} + + + {{ costInfo?.armoeny | currency }} + + + {{ costInfo?.armoeny | currency }} + + + {{ costInfo?.armoeny | currency }} + + + + 基本信息(应付费用) + + {{ costInfo?.ltdName }} + + + {{ costInfo?.feetypeLabel }} + + {{ costInfo?.hrmoney | currency}} + + {{ costInfo?.hrremarks }} + + + {{ costInfo?.hrtoname }} + + + {{ costInfo?.hrvattypeLabel }} + + + {{ costInfo?.hrmoney | currency}} + + + {{ (costInfo?.hrvatmoney || 0) | currency }} + + + {{ costInfo?.hrmoney | currency}} + + +
    +
    +
    + + + + + + + {{ index + 1 }} + + + {{ costInfo?.artocode}}/{{ costInfo?.artonames}} + + + {{ item.armoney | currency}} + {{ item.hrmoney | currency}} + + + + {{ item.armoney | currency}} + {{ item.hrmoney | currency}} + + + {{ item.arkpmoney | currency}} + + + + {{costInfo.billTime}} + + + {{costInfo.cnoName}} + + + + + + + {{ item.armoney | currency}} + + + {{ item.vatmoney | currency}} + + + {{ index + 1 }} + + + + + + + {{ item.ahxmoney | currency}} + + + {{ item.ahxmoney | currency}} + + + {{ index + 1 }} + + 已核销 + + + + + + + + + {{ index + 1 }} + + + {{ item.phxmoney | currency}} + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.less b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.less new file mode 100644 index 00000000..aa2721f6 --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.less @@ -0,0 +1,24 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + + .text-truncate { + white-space: normal; + } + + .ant-form-item { + margin-bottom: 0; + } + + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.ts b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.ts new file mode 100644 index 00000000..981f1776 --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/cost-management-detail/cost-management-detail.component.ts @@ -0,0 +1,109 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn } from '@delon/abc/st'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-cost-management-detail', + templateUrl: './cost-management-detail.component.html', + styleUrls: ['./cost-management-detail.component.less'] +}) +export class CostManagementDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + columns: { [key: string]: STColumn[] } = this.initST(); + data = []; + textStatus: boolean = false; + costInfo: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + const id = route.snapshot.params.id; + this.loadDetail(id); + } + + ngOnInit(): void { + if (this.route.snapshot?.queryParams?.status === '应收') { + this.textStatus = false; + } else { + this.textStatus = true; + } + } + + loadDetail(id: any) { + this.service.request(this.service.$api_get_cost_detail, { id }).subscribe(res => { + if (res) { + this.costInfo = res; + } + }); + } + + goBack() { + history.go(-1); + } + + private initST(): { [key: string]: STColumn[] } { + return { + cost: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '费用明细号', index: 'feeHId', className: 'text-left', width: 200 }, + { title: '订单号', index: 'billHCode', className: 'text-left', width: 200 }, + { title: '订单日期', render: 'billTime', className: 'text-left', width: 200 }, + { title: '运单号', index: 'waybillHCode', className: 'text-left', width: 200 }, + { title: '运单日期', index: 'waybillDate', className: 'text-left', width: 200, format: _ => this.costInfo.billTime }, + { title: '结算客户', render: 'cnoName', className: 'text-left', width: 200 }, + { title: '订单费用类型', index: 'billLTypeLabel', className: 'text-left', width: 200 }, + { title: '费用科目', index: 'feeSubName', className: 'text-left', width: 200 }, + { + title: '税率', + index: 'arvatrate', + className: 'text-right', + width: 200, + format: item => `${item.arvatrate ? ((item.arvatrate as number) * 100).toFixed(2) : 0}%` + }, + { title: '费用金额', render: 'hrvatmoney', className: 'text-right', width: 200 }, + { title: '收/付款金额', render: 'armoney', className: 'text-right', width: 200 }, + { title: '开/收票金额', render: 'arkpmoney', className: 'text-right', width: 200 } + ], + requested: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '费用明细号', index: 'feeLId', className: 'text-left', width: 200 }, + { title: '发票申请', index: 'vatinvcode', className: 'text-left', width: 200 }, + { title: '发票类型', index: 'invoicetypeLabel', className: 'text-left', width: 200 }, + { title: '发票号', index: 'invoiceno', className: 'text-left', width: 200 }, + { title: '发票日期', index: 'invoicedate', className: 'text-left', width: 200 }, + { title: '发票状态', index: 'stsLabel', className: 'text-left', width: 200 }, + { title: '应收金额', render: 'armoney', className: 'text-left', width: 200 }, + { title: '开票金额', render: 'vatmoney', className: 'text-left', width: 200 } + ], + collection: [ + { title: '序号', render: 'no', width: 70 }, + { title: '费用明细号', index: 'feeLId', className: 'text-left', width: 200 }, + { title: '收款单号', index: 'ahxHId', className: 'text-left', width: 200 }, + { title: '收款日期', index: 'feedate', className: 'text-left', width: 200 }, + { title: '收款状态', render: 'status', className: 'text-left', width: 150 }, + { title: '应收金额', render: 'ahxmoney', className: 'text-left', width: 120 }, + { title: '收款金额', render: 'ahxmoney', className: 'text-left', width: 120 } + ], + ticket: [ + { title: '序号', render: 'no', width: 70 }, + { title: '费用明细号', index: 'callNo' }, + { title: '进项发票号', index: 'callNo' }, + { title: '发票类型', index: 'callNo' }, + { title: '发票日期', index: 'callNo' }, + { title: '认证日期', index: 'callNo' }, + { title: '发票状态', index: 'callNo' }, + { title: '应付金额', index: 'callNo' }, + { title: '收票金额', index: 'callNo' } + ], + payment: [ + { title: '序号', render: 'no', width: 70 }, + { title: '费用明细号', index: 'feeHCode' }, + { title: '付款单号', index: 'phxHId' }, + { title: '要求日期', index: 'billTime' }, + { title: '确认日期', index: 'feedate' }, + // { title: '付款状态', index: 'callNo' }, + { title: '应付金额', render: 'phxmoney' }, + { title: '付款金额', render: 'phxmoney' } + ] + }; + } +} diff --git a/src/app/routes/financial-management/components/cost-management/cost-management.component.html b/src/app/routes/financial-management/components/cost-management/cost-management.component.html new file mode 100644 index 00000000..c9d36bdd --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/cost-management.component.html @@ -0,0 +1,70 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    +
    + +
    +
    + + + {{ item.armoeny | currency }} + + + {{ item.hrmoney | currency }} + + {{ item.cnoCode }}/{{ item.cnoName }} + + {{ item.hrpaymoney | currency }} + + + {{ item.hrvatmoney | currency }} + + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/cost-management.component.ts b/src/app/routes/financial-management/components/cost-management/cost-management.component.ts new file mode 100644 index 00000000..57203a7e --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/cost-management.component.ts @@ -0,0 +1,325 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFSelectWidgetSchema, SFSchemaEnum } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-cost-management', + templateUrl: './cost-management.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class CostManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + searchSchema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + + selectedRows: any[] = []; + + _$expand = false; + + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + feedate: { + start: this.sf.value.feedate?.[0] || '', + end: this.sf.value.feedate?.[1] || '' + }, + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + this.service.exportStart( { ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportPlatformAccountBalanceByOperator,); + } + + routeTo(url: string, params?: any, status?: any) { + this.router.navigate([url], { queryParams: params }); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + feecode: { + type: 'string', + title: '费用单号', + ui: { placeholder: '请输入' } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { placeholder: '请输入' } + }, + waybillHCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入' + } + }, + feedate: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + feetype: { + type: 'string', + title: '费用类型', + enum: [ + { label: '全部', value: '' }, + { label: '应收', value: 1 }, + { label: '应付', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + feeSubId: { + type: 'string', + title: '费用科目', + enum: [ + { label: '全部', value: '全部' }, + { label: '运输费', value: '1475197820443299842' }, + { label: '附加费', value: '1476197820443299842 ' }, + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + hrto: { + type: 'string', + title: '应付对象', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_crm_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.enterpriseId } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + visibleIf: { + expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + arto: { + type: 'string', + title: '应收对象', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_crm_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.crmUserId } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + visibleIf: { + expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + ishrhx: { + type: 'string', + title: '应付核销', + enum: [ + { label: '全部', value: '' }, + { label: '否', value: 0 }, + { label: '是', value: 1 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '费用单号', fixed: 'left', index: 'feecode', width: 200, className: 'text-left' }, + { title: '网络货运人', index: 'ltdName', width: 220, className: 'text-left' }, + { title: '订单号', index: 'billHCode', width: 200, className: 'text-left' }, + { title: '运单号', index: 'waybillHCode', width: 200, className: 'text-left' }, + { title: '费用日期', index: 'feedate', width: 200, className: 'text-left' }, + { title: '费用类型', index: 'feetypeLabel', width: 150, className: 'text-center' }, + { title: '应付核销', index: 'ishrhx', width: 200, type: 'enum', enum: { 0: '否', 1: '是' }, className: 'text-left' }, + { title: '结算客户', render: 'artocode', width: 200, className: 'text-left' }, + { title: '应收对象', index: 'artoname', width: 200, className: 'text-left' }, + { title: '应付对象', index: 'hrtoname', width: 200, className: 'text-left' }, + { title: '应收金额', render: 'armoeny', width: 150, className: 'text-right' }, + { title: '应付金额', render: 'hrmoney', width: 150, className: 'text-right' }, + { title: '收/付款金额', render: 'hrpaymoney', width: 150, className: 'text-right' }, + { title: '开/收票金额', render: 'hrvatmoney', width: 150, className: 'text-right' }, + { title: '创建时间', index: 'createTime', type: 'date', width: 200, className: 'text-center' }, + { title: '状态', index: 'stsLabel', width: 120, className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: '110px', + buttons: [ + { + text: '浏览', + click: item => this.routeTo('/financial-management/cost-management/detail/' + item.id, { status: item?.feetypeLabel }), + acl: { ability: ['FINANCIAL-COST-view'] } + }, + { + text: '审核', + click: item => this.auditAction(item), + iif: item => item.sts === 2, + acl: { ability: ['FINANCIAL-COST-audit'] } + } + // { + // text: '修改', + // click: item => this.router.navigate(['/financial-management/cost-management/expenses-receivable/1'], { queryParams: { id: 1 } }) + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.html b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.html new file mode 100644 index 00000000..dcfc2646 --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.html @@ -0,0 +1,56 @@ + + + + + + + + + + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.less b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.less new file mode 100644 index 00000000..23d2c4ba --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.ts b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.ts new file mode 100644 index 00000000..7706a93f --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-payable/expenses-payable.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-expenses-payable', + templateUrl: './expenses-payable.component.html', + styleUrls: ['./expenses-payable.component.less'] +}) +export class ExpensesPayableComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + schema!: SFSchema; + columns: STColumn[] = this.initST(); + + id = null; + data: any[] = [ + { + id: 1, + description1: '', + description2: '', + description3: '', + num: null, + description5: '' + } + ]; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.queryParams.id; + if (this.id) { + this.schema = this.initSF({ page2: '天津怡亚通物流科技有限公司', pag2e21: '茅台集团' }); + } else { + this.schema = this.initSF(); + } + } + + ngOnInit(): void {} + + addRow() { + this.data.push({ + id: this.data.length + 1, + description1: '', + description2: '', + description3: '', + num: null, + description5: '' + }); + this.st.reload(); + } + + goBack() { + history.go(-1); + } + + private initSF(data?: any): SFSchema { + return { + properties: { + page2: { + type: 'string', + title: '网络货运人', + enum: [], + ui: { + widget: data ? 'text' : 'select', + placeholder: '请选择' + }, + default: data?.page2 || '' + }, + pag2e21: { + title: '应付对象', + type: 'string', + enum: [], + ui: { + widget: data ? 'text' : 'select', + placeholder: '请选择' + }, + default: data?.pag2e21 || '' + }, + dee: { + title: '', + type: 'string', + ui: { + widget: 'text' + }, + default: ' ' + }, + createTi2me: { + title: '费用日期', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema, + default: data?.createTi2me || '' + }, + pa2ge2: { + type: 'string', + title: '收票方式', + enum: [], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: data?.pa2ge2 || '' + }, + page: { + type: 'string', + title: '应付备注', + ui: { + placeholder: '请输入' + }, + default: data?.page || '' + } + }, + required: ['page2', 'pag2e21', 'createTi2me', 'pa2ge2'] + }; + } + + private initST(): STColumn[] { + return [ + { title: '结算客户', render: 'description1', width: 150 }, + { title: '费用科目', render: 'description2', width: 120 }, + { + title: '税率', + render: 'description3', + width: 120, + format: item => `${item.description3 ? ((item.description3 as number) * 100).toFixed(2) : 0}%` + }, + { title: '应付金额', render: 'num', width: 120 }, + { title: '备注', render: 'description5', width: 150 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 90, + buttons: [ + { + text: '删除', + click: item => { + this.st.removeRow(item); + this.data = this.data.filter(i => i.id !== item.id); + } + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.html b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.html new file mode 100644 index 00000000..1fbc355f --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.less b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.less new file mode 100644 index 00000000..23d2c4ba --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.ts b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.ts new file mode 100644 index 00000000..b049fed3 --- /dev/null +++ b/src/app/routes/financial-management/components/cost-management/expenses-receivable/expenses-receivable.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-expenses-receivable', + templateUrl: './expenses-receivable.component.html', + styleUrls: ['./expenses-receivable.component.less'] +}) +export class ExpensesReceivableComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + schema!: SFSchema; + columns: STColumn[] = this.initST(); + + id = null; + data: any[] = [ + { + id: 1, + description1: '', + description2: '', + description3: '', + num: null, + description5: '' + } + ]; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.queryParams.id; + if (this.id) { + this.schema = this.initSF({ page2: '天津怡亚通物流科技有限公司', pag2e21: '茅台集团' }); + } else { + this.schema = this.initSF(); + } + } + + ngOnInit(): void {} + + addRow() { + this.data.push({ + id: this.data.length + 1, + description1: '', + description2: '', + description3: '', + num: null, + description5: '' + }); + this.st.reload(); + } + + goBack() { + history.go(-1); + } + + private initSF(data?: any): SFSchema { + return { + properties: { + page2: { + type: 'string', + title: '网络货运人', + enum: [], + ui: { + widget: data ? 'text' : 'select', + placeholder: '请选择' + }, + default: data?.page2 || '' + }, + pag2e21: { + title: '应收对象', + type: 'string', + enum: [], + ui: { + widget: data ? 'text' : 'select', + placeholder: '请选择' + }, + default: data?.pag2e21 || '' + }, + dee: { + title: '', + type: 'string', + ui: { + widget: 'text' + }, + default: ' ' + }, + createTi2me: { + title: '费用日期', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema, + default: data?.createTi2me || '' + }, + pa2ge2: { + type: 'string', + title: '开票方式', + enum: [], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: data?.pa2ge2 || '' + }, + page: { + type: 'string', + title: '应收备注', + ui: { + placeholder: '请输入' + }, + default: data?.page || '' + } + }, + required: ['page2', 'pag2e21', 'createTi2me', 'pa2ge2'] + }; + } + + private initST(): STColumn[] { + return [ + { title: '结算客户', render: 'description1', width: 150 }, + { title: '费用科目', render: 'description2', width: 120 }, + { + title: '税率', + render: 'description3', + width: 120, + format: item => `${item.description3 ? ((item.description3 as number) * 100).toFixed(2) : 0}%` + }, + { title: '应收金额', render: 'num', width: 120 }, + { title: '备注', render: 'description5', width: 150 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 90, + buttons: [ + { + text: '删除', + click: item => { + this.st.removeRow(item); + this.data = this.data.filter(i => i.id !== item.id); + } + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html new file mode 100644 index 00000000..3bef51eb --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts new file mode 100644 index 00000000..bc954a6c --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts @@ -0,0 +1,210 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-driver-account-detail', + templateUrl: './driver-account-detail.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class DriverAccountDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + info: any = {}; + params: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.params = route.snapshot.queryParams; + } + + ngOnInit(): void { + this.loadInfo(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId, + bankType: this.params.bankType + }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value?.createTime?.[0] || '', + end: this.sf.value?.createTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + loadInfo() { + this.service + .request(this.service.$api_get_driver_account_balance_detail, { + ...this.sf?.value, + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId, + pageIndex: this.st.pi, + pageSize: this.st.ps, + bankType: this.params.bankType, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }) + .subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + stChange(e: STChange): void {} + + exportList() { + this.service.exportStart( + { + ...this.sf.value, + pageSize: -1, + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId, + bankType: this.params.bankType, + createTime: { + start: this.sf.value?.createTime?.[0] || '', + end: this.sf.value?.createTime?.[1] || '' + } + }, + this.service.$api_get_exportAccountBalanceDriverByOperatorPage + ); + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + transactionNumber: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入' + } + }, + businessNumber: { + type: 'string', + title: '关联单号', + ui: { + placeholder: '请输入' + } + }, + tradeType: { + type: 'string', + title: '交易类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'trade:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + incomeType: { + type: 'string', + title: '收支类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'income:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '交易时间', index: 'createTime', type: 'date', width: 150 }, + { title: '流水号', index: 'channelPaySn', width: 170 }, + { title: '交易类型', index: 'tradeTypeLabel', className: 'text-center', width: 150 }, + { title: '交易单号', index: 'businessNumber', width: 190 }, + { title: '订单号', index: 'orderSn', width: 190 }, + { title: '运单号', index: 'transportSn', width: 190 }, + { title: '收支类型', index: 'incomeTypeLabel', className: 'text-center', width: 150 }, + { + title: '交易金额', + index: 'amount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '账户余额', + index: 'accountBalance', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.accountBalance }) } + }, + { title: '付款方', index: 'payName', width: 150 }, + { title: '收款方', index: 'incomeName', width: 150 }, + { title: '备注', index: 'tradeContent', width: 150 } + ]; + } +} diff --git a/src/app/routes/financial-management/components/driver-account/driver-account.component.html b/src/app/routes/financial-management/components/driver-account/driver-account.component.html new file mode 100644 index 00000000..325369c1 --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account.component.html @@ -0,0 +1,43 @@ + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + {{ + (parseFloat(item.availableBalance) + parseFloat(item.freezeBalance)).toFixed(2) | currency + }} + + + diff --git a/src/app/routes/financial-management/components/driver-account/driver-account.component.ts b/src/app/routes/financial-management/components/driver-account/driver-account.component.ts new file mode 100644 index 00000000..4892f27a --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account.component.ts @@ -0,0 +1,237 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-driver-account', + templateUrl: './driver-account.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class DriverAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + loading: boolean = true; + searchSchema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + _$expand = false; + + constructor(public service: FreightAccountService, private router: Router, private modal: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { accountType: 2 }); + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data) + this.loading = false + return data.map(item => ({ + ...item, + })); + }; + showAccountDetail(item: any) { + this.modal.create({ + nzTitle: '账户明细', + nzContent: AccountDetailComponent, + nzNoAnimation: true, + nzWidth: 600, + nzComponentParams: { + params: { accountType: 2, roleId: item.roleId }, + url: '/api/fcc/accountBalance/getDriverAccountBalanceDetailByOperator' + }, + nzFooter: null + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + console.log(this.sf.value); + + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_export_driver_account_page); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + userName: { + type: 'string', + title: '司机姓名', + ui: { placeholder: '请输入' } + }, + certificateNumber: { + type: 'string', + title: '证件号码', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '手机号', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: null }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: null + }, + virtualAccount: { + type: 'string', + title: '虚拟账户', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '司机姓名', width: 140, index: 'name' }, + { title: '证件号码', width: 140, index: 'idNo' }, + { title: '手机号', width: 140, index: 'phone' }, + { title: '网络货运人', width: 180, index: 'ltdName' }, + { title: '银行类型', width: 120, index: 'bankTypeLabel' }, + { title: '虚拟账户', width: 140, index: 'virtualAccount' }, + { + title: '可用余额', + index: 'availableBalance', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.availableBalance }) } + }, + { + title: '冻结余额', + index: 'freezeBalance', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.freezeBalance }) } + }, + { + title: '本月累计提现金额', + index: 'withdrawBalance', + width: 160, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.withdrawBalance }) } + }, + { title: '账户总余额', render: 'availableBalance', className: 'text-right', width: 180 }, + { title: '创建时间', index: 'createTime', type: 'date', width: 150 }, + { title: '状态', index: 'stateDeletedLabel', width: 120 }, + { + title: '操作', + width: 120, + className: 'text-center', + fixed: 'right', + buttons: [ + { + text: '查看明细', + click: item => + this.router.navigate(['/financial-management/driver-account/detail/' + item.id], { + queryParams: { + name: item.name, + phone: item.phone, + ltdName: item.ltdName, + bankType: item.bankType, + projectId: item.projectId, + availableBalance: item.availableBalance, + enterpriseId: item.enterpriseId, + roleId: item.roleId, + ltdId: item.ltdId + } + }) + } + ] + } + ]; + } + + parseFloat(num: any) { + return parseFloat(num); + } +} diff --git a/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html new file mode 100644 index 00000000..af8a0b5b --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts new file mode 100644 index 00000000..dd2fa6ca --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts @@ -0,0 +1,242 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-freight-account-detail', + templateUrl: './freight-account-detail.component.html', + styleUrls: ['../../../../commom/less/box.less'] +}) +export class FreightAccountDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + info: any = {}; + params: any = {}; + static: any = {}; + _$expand = false; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private route: ActivatedRoute) { + this.params = route.snapshot.queryParams; + } + + ngOnInit(): void { + this.loadInfo(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId + }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf?.value.createTime?.[0] || '', + end: this.sf?.value.createTime?.[1] || '' + } + }); + } + this.loadStatistics(requestOptions.body); + return requestOptions; + }; + + loadInfo() { + this.service + .request(this.service.$api_get_shipper_account_balance_detail, { + ...this.sf?.value, + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId, + pageIndex: this.st.pi, + pageSize: this.st.ps, + createTime: { + start: this.sf?.value.createTime?.[0] || '', + end: this.sf?.value.createTime?.[1] || '' + } + }) + .subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + loadStatistics(params: any) { + this.service.request(this.service.$api_get_shipper_account_balance_detail, params).subscribe(res => { + if (res) { + this.static = res; + } + }); + } + + stChange(e: STChange): void {} + + exportList() { + this.service.exportStart( + { + ...this.sf.value, + pageSize: -1, + ltdId: this.params.ltdId, + projectId: this.params.projectId, + enterpriseId: this.params.enterpriseId, + roleId: this.params.roleId, + createTime: { + start: this.sf?.value.createTime?.[0] || '', + end: this.sf?.value.createTime?.[1] || '' + } + }, + this.service.$api_get_exportAccountBalanceShipperByOperatorPage + ); + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + transactionNumber: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入' + } + }, + businessNumber: { + type: 'string', + title: '交易单号', + ui: { + placeholder: '请输入' + } + }, + tradeType: { + type: 'string', + title: '交易类型', + enum: [ + { label: '全部', value: '' }, + { label: '整车订单退款', value: '1' }, + { label: '整车订单支付', value: '2' }, + { label: '提现失败退回', value: '3' }, + { label: '提现', value: '4' }, + { label: '充值', value: '5' }, + { label: '运货订单结算F', value: '5' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + incomeType: { + type: 'string', + title: '收支类型', + enum: [ + { label: '全部', value: '' }, + { label: '收入', value: '1' }, + { label: '支出', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + projectId: { + title: '所属项目', + type: 'string', + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getEnterpriseProject() + } as SFSelectWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '交易时间', index: 'createTime', type: 'date', width: 170 }, + { title: '流水号', index: 'transactionNumber', width: 170 }, + { title: '交易类型', index: 'tradeTypeLabel', className: 'text-center', width: 140 }, + { title: '交易单号', index: 'businessNumber', width: 170 }, + { title: '订单号', index: 'orderSn', width: 170 }, + { title: '运单号', index: 'transportSn', width: 170 }, + { title: '货主', index: 'enterpriseName', width: 170 }, + { title: '所属项目', index: 'projectName', width: 170 }, + { title: '收支类型', index: 'incomeTypeLabel', className: 'text-center', width: 140 }, + { + title: '交易金额', + index: 'amount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '账户余额', + index: 'accountBalance', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.accountBalance }) } + }, + { title: '付款方', index: 'payName', width: 170 }, + { title: '收款方', index: 'incomeName', width: 170 }, + { title: '备注', index: 'tradeContent', width: 170 } + ]; + } +} diff --git a/src/app/routes/financial-management/components/freight-account/freight-account.component.html b/src/app/routes/financial-management/components/freight-account/freight-account.component.html new file mode 100644 index 00000000..5dba1c89 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account.component.html @@ -0,0 +1,32 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + {{ (parseFloat(item.availableBalance) + + parseFloat(item.freezeBalance)).toFixed(2) | currency}} + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account.component.ts b/src/app/routes/financial-management/components/freight-account/freight-account.component.ts new file mode 100644 index 00000000..5abfbe19 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account.component.ts @@ -0,0 +1,234 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { CurrencyService } from '@delon/util'; +import { CurrencyCNYPipe } from '@delon/util/pipes/currency/cny.pipe'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { parse } from 'path'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-freight-account', + templateUrl: './freight-account.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class FreightAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + searchSchema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + + selectedRows: any[] = []; + + _$expand = false; + + constructor(public service: FreightAccountService, private router: Router, private modal: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { accountType: 1 }); + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + return requestOptions; + }; + + showAccountDetail(item: any) { + this.modal.create({ + nzTitle: '账户明细', + nzContent: AccountDetailComponent, + nzNoAnimation: true, + nzWidth: 600, + nzComponentParams: { + params: { accountType: 1, roleId: item.roleId }, + url: '/api/fcc/accountBalance/getShipperAccountBalanceDetailByOperator' + }, + nzFooter: null + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportShipperAccountBalanceByOperator); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + tenantName: { + type: 'string', + title: '企业名称', + ui: { placeholder: '请输入' } + }, + userName: { + type: 'string', + title: '联系人', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '联系人电话', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: null }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: null + }, + virtualAccount: { + type: 'string', + title: '虚拟账户', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '企业名称', width: 170, index: 'tenantName' }, + { title: '联系人', width: 120, index: 'name' }, + { title: '联系人电话', width: 140, index: 'phone' }, + { title: '网络货运人', width: 170, index: 'ltdName' }, + { title: '银行类型', width: 120, index: 'bankTypeLabel' }, + { title: '虚拟账户', width: 140, index: 'virtualAccount' }, + { + title: '可用余额', + index: 'availableBalance', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.availableBalance }) } + }, + { + title: '冻结余额', + index: 'freezeBalance', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.freezeBalance }) } + }, + { + title: '账户总余额', + render: 'description', + width: 140, + className: 'text-right' + }, + { title: '创建时间', index: 'createTime', type: 'date', width: 150 }, + { + title: '状态', + index: 'stateDeletedLabel', + width: 80 + }, + { + title: '操作', + width: 120, + className: 'text-center', + fixed: 'right', + buttons: [ + { + text: '查看明细', + click: item => + this.router.navigate(['/financial-management/freight-account/detail/' + item.id], { + queryParams: { + tenantName: item.tenantName, + ltdName: item.ltdName, + bankType: item.bankType, + availableBalance: item.availableBalance, + projectId: item.projectId, + enterpriseId: item.enterpriseId, + roleId: item.roleId, + ltdId: item.ltdId + } + }) + } + ] + } + ]; + } + + parseFloat(num: any) { + return parseFloat(num); + } +} diff --git a/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.html b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.html new file mode 100644 index 00000000..b0b74755 --- /dev/null +++ b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.html @@ -0,0 +1,95 @@ + + + + + + + + +
    +
    + + {{headerInfo?.ltdName}} + + + {{headerInfo?.cnoName}} + + + {{headerInfo?.shipperaccount}} + + + {{headerInfo?.phxmoney | currency}} + +
    +
    + + {{headerInfo?.phxdate}} + + + {{headerInfo?.driver2IdName}} + + + {{headerInfo?.ltdaccountId}} + + + {{headerInfo?.prmoney | currency}} + +
    +
    + + {{headerInfo?.banktype==='1'?'平安':'浦发'}} + + + {{headerInfo?.brmtypeLabel}} + + + {{headerInfo?.bankreceipt}} + + + {{headerInfo?.remarks}} + +
    +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + {{index+1}} + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.less b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.less new file mode 100644 index 00000000..aebf12ee --- /dev/null +++ b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.ts b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.ts new file mode 100644 index 00000000..939ea639 --- /dev/null +++ b/src/app/routes/financial-management/components/payable-order/payable-order-detail/payable-order-detail.component.ts @@ -0,0 +1,179 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-payable-order-detail', + templateUrl: './payable-order-detail.component.html', + styleUrls: ['./payable-order-detail.component.less', '../../../../commom/less/expend-but.less', '../../../../commom/less/box.less'], + providers: [CurrencyPipe] +}) +export class PayableOrderDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + id = null; + billHId = null; + headerInfo: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute, private currencyPipe: CurrencyPipe) { + this.id = route.snapshot.params.id; + this.billHId = route.snapshot.queryParams.billHId; + this.loadHeadInfo(); + } + + ngOnInit(): void {} + + loadHeadInfo() { + this.service.request(this.service.$api_get_fico_ph_header, { id: this.id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { phxHId: this.billHId }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + billTime: { + start: this.sf.value.billTime?.[0] || null, + end: this.sf.value.billTime?.[1] || null + }, + feedate: { + start: this.sf.value.feedate?.[0] || null, + end: this.sf.value.feedate?.[1] || null + } + }); + if (this.sf.value.billTime) { + Object.assign(requestOptions.body, { + billTime: { + start: this.sf.value.billTime?.[0] || null, + end: this.sf.value.billTime?.[1] || null + } + }); + } + if (this.sf.value.feedate) { + Object.assign(requestOptions.body, { + feedate: { + start: this.sf.value.feedate?.[0] || null, + end: this.sf.value.feedate?.[1] || null + } + }); + } + } + return requestOptions; + }; + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + feeHCode: { + type: 'string', + title: '费用单', + ui: { + placeholder: '请输入' + } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + feedate: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + billTime: { + title: '订单日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '序号', render: 'no', width: 80 }, + { title: '费用号', index: 'feeHCode', width: 140 }, + { title: '费用日期', index: 'feedate', type: 'date', width: 150 }, + { title: '订单号', index: 'billHCode', width: 140 }, + { title: '订单日期', index: 'billTime', width: 150 }, + { title: '费用类型', index: 'feetype', width: 90 }, + { title: '订单费用科目', index: 'billLTypeLabel', width: 100 }, + { title: '费用科目', index: 'feeSubIdName', width: 140 }, + { title: '结算客户', index: 'cnoName', width: 140 }, + { + title: '已收金额', + index: 'phxmoney', + width: 100, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.armoney || 0)}` + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/payable-order/payable-order.component.html b/src/app/routes/financial-management/components/payable-order/payable-order.component.html new file mode 100644 index 00000000..ed91bd00 --- /dev/null +++ b/src/app/routes/financial-management/components/payable-order/payable-order.component.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payable-order/payable-order.component.ts b/src/app/routes/financial-management/components/payable-order/payable-order.component.ts new file mode 100644 index 00000000..f5fac6ee --- /dev/null +++ b/src/app/routes/financial-management/components/payable-order/payable-order.component.ts @@ -0,0 +1,283 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-payable-order', + templateUrl: './payable-order.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'], + providers: [CurrencyPipe] +}) +export class PayableOrderComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + info: any = {}; + constructor( + public service: FreightAccountService, + private nzModalService: NzModalService, + private router: Router, + private currencyPipe: CurrencyPipe + ) {} + + ngOnInit(): void { + } + + loadInfo() { + this.service.request(this.service.$api_get_fico_ph_sum).subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value?.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + if (this.sf.value?.phxdate) { + Object.assign(requestOptions.body, { + phxdate: { + start: this.sf.value.phxdate?.[0] || '', + end: this.sf.value.phxdate?.[1] || '' + } + }); + } + } + this.loadInfo(); + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + phxcode: { + type: 'string', + title: '核销单号', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + bankreceipt: { + type: 'string', + title: '银行水单', + ui: { + placeholder: '请输入' + } + }, + brmtype: { + type: 'string', + title: '付款类型', + enum: [{ value: '1', label: '费用款项' }], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + driver2IdName: { + type: 'string', + title: '收款人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + type: 'string', + title: '核销状态', + enum: [ + { value: 1, label: '已核销' }, + { value: 0, label: '待核销' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + phxdate: { + title: '核销日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + feeHCode: { + type: 'string', + title: '费用号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + remarks: { + type: 'string', + title: '核销备注', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '核销单号', index: 'phxcode', type: 'link', width: 140 }, + { title: '网络货运人', index: 'ltdName', width: 220 }, + { title: '核销日期', index: 'phxdate', type: 'date', width: 160 }, + { title: '付款账户', index: 'shipperaccount', width: 170 }, + { title: '收款账户', index: 'ltdaccountId', width: 190 }, + { + title: '核销金额', + index: 'phxmoney', + width: 140, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.phxmoney || 0)}` + }, + { + title: '应付金额', + index: 'prmoney', + width: 140, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.prmoney || 0)}` + }, + { title: '银行类型', index: 'banktype', type: 'enum', enum: { '1': '平安', '2': '浦发' }, width: 120 }, + { title: '付款类型', index: 'brmtype', type: 'enum', enum: { '1': '费用款项' }, width: 120 }, + { title: '收款人', index: 'driver2IdName', width: 120 }, + { title: '结算客户', index: 'cnoName', width: 180 }, + { title: '银行水单', index: 'bankreceipt', width: 190 }, + { title: '创建时间', index: 'createTime', width: 180 }, + // { title: '创建人', index: 'createUserIdLabel', width: 120 }, + { title: '核销状态', index: 'sts', type: 'enum', enum: { 0: '待核销', 1: '已核销' }, width: 120 }, + { title: '核销备注', index: 'remarks', width: 120 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { + text: '浏览', + click: item => + this.router.navigate(['/financial-management/payable-order/detail/' + item.id], { queryParams: { billHId: item.id } }) + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.html b/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.html new file mode 100644 index 00000000..3c575c32 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.html @@ -0,0 +1,92 @@ + + + + + + + + +
    +
    + + {{headerInfo?.ltdName}} + + + {{headerInfo?.hrToLabel}} + + + {{headerInfo?.ltdAccountId}} + + + {{headerInfo?.ishrhxLabel}} + +
    +
    + + {{headerInfo?.payDate}} + + + {{headerInfo?.hrBankName}} - {{headerInfo?.hrBankNo}} + + + {{headerInfo?.payDate}} + + + {{headerInfo?.payRemarks}} + +
    +
    + + {{headerInfo?.payModeLabel}} + + + {{headerInfo?.payTypeLabel}} + + + {{headerInfo?.payMoney |currency}} + +
    +
    +
    + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.less b/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.ts b/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.ts new file mode 100644 index 00000000..c78211b7 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-order/payment-order-detail/payment-order-detail.component.ts @@ -0,0 +1,174 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-payment-order-detail', + templateUrl: './payment-order-detail.component.html', + styleUrls: ['./payment-order-detail.component.less'] +}) +export class PaymentOrderDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + id = null; + headerInfo: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + this.loadHeadInfo(); + } + + ngOnInit(): void {} + + loadHeadInfo() { + this.service.request(this.service.$api_get_payment_header, { id: this.id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + payHId: this.id, + billTime: { + start: this.sf.value.billTime?.[0] || null, + end: this.sf.value.billTime?.[1] || null + }, + feedate: { + start: this.sf.value.feedate?.[0] || null, + end: this.sf.value.feedate?.[1] || null + } + }); + } else { + Object.assign(requestOptions.body, { + payHId: this.id, + }); + } + return requestOptions; + }; + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + // feeHCode: { + // type: 'string', + // title: '费用单号', + // ui: { + // placeholder: '请输入' + // } + // }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + waybillHCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入' + } + }, + // feedate: { + // title: '费用日期', + // type: 'string', + // ui: { + // widget: 'sl-from-to-search', + // format: 'yyyy-MM-dd', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } as SFDateWidgetSchema + // }, + billTime: { + title: '订单日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + } as SFDateWidgetSchema + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '序号', render: 'billHCode', width: 80 }, + // { title: '费用号', index: 'feeHCode', width: 100 }, + // { title: '费用日期', index: 'feedate', type: 'date', width: 150 }, + { title: '订单号', index: 'billHCode', width: 100 }, + { title: '订单日期', index: 'billTime', width: 150 }, + { title: '结算客户', index: 'cnoName', width: 90 }, + { title: '费用科目', index: 'feeSubId', width: 100 }, + { + title: '收票金额', + index: 'paymoney', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.paymoney }) } + }, + { + title: '收票税额', + index: 'invtax', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.invtax }) } + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/payment-order/payment-order.component.html b/src/app/routes/financial-management/components/payment-order/payment-order.component.html new file mode 100644 index 00000000..aec490c7 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-order/payment-order.component.html @@ -0,0 +1,39 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 张单 + 清空 +
    +
    + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payment-order/payment-order.component.ts b/src/app/routes/financial-management/components/payment-order/payment-order.component.ts new file mode 100644 index 00000000..21a19041 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-order/payment-order.component.ts @@ -0,0 +1,275 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AddCollectionInvoiceModalComponent } from 'src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component'; +import { TicketService } from 'src/app/routes/ticket-management/services/ticket.service'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-payment-order', + templateUrl: './payment-order.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class PaymentOrderComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + let params = { ...this.sf.value }; + if (params.payDate) { + const payDate = { start: this.sf?.value?.payDate?.[0], end: this.sf?.value?.payDate?.[1] }; + params.payDate = payDate; + } + if (params.payDate2) { + const payDate2 = { start: this.sf?.value?.payDate2?.[0], end: this.sf?.value?.payDate2?.[1] }; + params.payDate2 = payDate2; + } + if (params.createTime) { + const createTime = { start: this.sf?.value?.createTime?.[0] || '', end: this.sf?.value?.createTime?.[1] || '' }; + params.createTime = createTime; + } + Object.assign(requestOptions.body, params); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + addInvoice() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择付款单'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '付款单', + nzContent: AddCollectionInvoiceModalComponent, + nzComponentParams: { i: { userId: 0 } }, + nzFooter: null + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + paycode: { + type: 'string', + title: '付款单号' + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: null + }, + // orderS2n: { + // type: 'string', + // title: '付款状态', + // ui: { + // widget: 'dict-select', + // containsAllLable: true, + // params: { dictKey: 'refund:apply:status' }, + // placeholder: '请选择' + // } + // }, + paytype: { + type: 'string', + title: '付款类型', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'pay:type' }, + placeholder: '请选择' + } + }, + paymode: { + type: 'string', + title: '付款方式', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'pay:mode' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + arto: { + type: 'string', + title: '收款人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + payDate: { + title: '要求付款日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + payDate2: { + title: '确认日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + waybillCode: { + type: 'string', + title: '运单号', + ui: { + visibleIf: { + expand: (value: boolean) => value + } + } + }, + // feeCode: { + // type: 'string', + // title: '费用号', + // ui: { + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + payRemarks: { + type: 'string', + title: '付款备注', + ui: { + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', fixed: 'left', className: 'text-center' }, + { title: '付款单号', index: 'payCode', type: 'link', width: 180 }, + { title: '网络货运人', index: 'ltdName', width: 180 }, + { title: '运单号', index: 'waybillCode', width: 180 }, + // { title: '费用号', index: 'feeCode', width: 180 }, + { title: '要求付款日期', index: 'payDate', type: 'date', className: 'text-center', width: 150 }, + { + title: '付款金额', + index: 'payMoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.payMoney }) } + }, + { title: '付款类型', index: 'payTypeLabel', width: 130 }, + { title: '付款方式', index: 'payBankTypeLabel', width: 130 }, + { title: '结算客户', index: 'cnoName', width: 160 }, + { title: '收款人', index: 'hrToLabel', width: 150 }, + { title: '应付已核销', index: 'ishrhxLabel', width: 150 }, + { title: '确认日期', index: 'payDate2', type: 'date', className: 'text-center', width: 150 }, + { title: '创建时间', index: 'payDate', type: 'date', className: 'text-center', width: 150 }, + { title: '创建人', index: 'createUserIdLabel', width: 160 }, + { title: '付款备注', index: 'payRemarks', width: 200 }, + { + title: '操作', + className: 'text-center', + fixed: 'right', + width: '110px', + buttons: [ + { + text: '浏览', + click: item => this.router.navigate(['/financial-management/payment-order/detail/' + item.id]) + } + // { + // text: '修改', + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/payment-record/payment-record.component.html b/src/app/routes/financial-management/components/payment-record/payment-record.component.html new file mode 100644 index 00000000..ecea67f6 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-record/payment-record.component.html @@ -0,0 +1,66 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + {{ item?.orderPaymentCode }}
    {{ item?.paymentStatusLabel }} +
    + + + {{detail.costName}}:{{ detail.price | currency }}
    +
    +
    + + {{ item?.billCode }}
    {{item?.billStatusLabel }} +
    + + {{ item?.wayBillCode }}
    {{item?.wayBillStatusLabel }} +
    + + {{ item?.driverName }}
    {{ item?.driverTelephone }} {{ item?.driverLicencePlate }} +
    + + {{ item?.captainName }}
    {{ item?.captainTelephone }} +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payment-record/payment-record.component.less b/src/app/routes/financial-management/components/payment-record/payment-record.component.less new file mode 100644 index 00000000..cd8c3436 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-record/payment-record.component.less @@ -0,0 +1,41 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } + + .text-truncate { + white-space: normal; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + max-width: 400px; + position : absolute; + right : 0; + bottom : 25px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/payment-record/payment-record.component.ts b/src/app/routes/financial-management/components/payment-record/payment-record.component.ts new file mode 100644 index 00000000..ea8e8968 --- /dev/null +++ b/src/app/routes/financial-management/components/payment-record/payment-record.component.ts @@ -0,0 +1,306 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; +import { ClearingModalComponent } from '../abnormal-gold/clearing-modal/clearing-modal.component'; + +@Component({ + selector: 'app-payment-record', + templateUrl: './payment-record.component.html', + styleUrls: ['./payment-record.component.less'] +}) +export class PaymentRecordComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + paymentStatus: any = ''; + + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + applyDate: { + start: this.sf.value.applyDate?.[0] || '', + end: this.sf.value.applyDate?.[1] || '' + }, + handlerDate: { + start: this.sf.value.handlerDate?.[0] || '', + end: this.sf.value.handlerDate?.[1] || '' + }, + paymentStatus: this.paymentStatus || null + }); + } + return requestOptions; + }; + + changePaymentStatus(status?: string) { + this.paymentStatus = status || null; + this.st.load(1); + } + + refund(item: any) { + this.nzModalService.warning({ + nzTitle: '确定要关闭所选支付记录?', + nzOnOk: () => {} + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderPaymentCode: { + type: 'string', + title: '支付编号', + ui: { + placeholder: '请输入' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + resourceCode: { + type: 'string', + title: '货源编号', + ui: { + placeholder: '请输入' + } + }, + serviceType: { + type: 'string', + title: '服务类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + driver: { + type: 'string', + title: '承运司机', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + driverLicensePlate: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + captain: { + type: 'string', + title: '收款人', + ui: { + placeholder: '请输入收款人姓名/手机号', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + isCaptain: { + type: 'string', + title: '车队长收款', + enum: [ + { label: '全部', value: '' }, + { label: '否', value: '0' }, + { label: '是', value: '1' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + payType: { + type: 'string', + title: '支付类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'paybill:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + applyDate: { + title: '申请时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + handlerDate: { + title: '处理时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: '' }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '支付编号', render: 'orderPaymentCode', width: 200 }, + { + title: '支付金额', + render: 'payAmount', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.payAmount }) } + }, + { + title: '运费明细', + render: 'amountDetails', + width: 160 + // format: item => { + // (item.amountDetails as Array).forEach(detail => { + // detail.surcharge = detail.price + (detail.surcharge || 0); + // }); + // console.log(item.amountDetails); + + // return ''; + // } + }, + { + title: '支付类型', + index: 'payTypeLabel', + width: 140 + }, + { title: '货主', index: 'enterpriseInfoName', width: 180 }, + { title: '订单号', render: 'billCode', width: 170 }, + { title: '运单号', render: 'wayBillCode', width: 170 }, + { title: '货源编号', index: 'resourceCode', width: 160 }, + { + title: '服务类型', + index: 'serviceTypeLabel', + width: 150 + }, + { title: '承运司机', render: 'driverId', width: 140 }, + { title: '收款人', render: 'captainName', width: 140 }, + { title: '银行类型', index: 'bankType', width: 150, type: 'enum', enum: { 1: '平安银行', 2: '浦发银行' } }, + { title: '网络货运人', index: 'ltdName', width: 160 }, + { title: '申请时间', index: 'applyTime', width: 160 }, + { title: '申请人', index: 'applyUserName', width: 90 }, + { title: '处理时间', index: 'handlerTime', width: 180 }, + { title: '处理人', index: 'handlerUserName', width: 90 }, + { title: '退款状态', index: 'refundStatusLabel', width: 220 }, + { title: '备注', index: 'failCause', width: 250 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { + text: '关闭', + iif: item => item.paymentStatus === '4', + click: item => this.refund(item) + } + ] + } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_asyncExportBillPaymentApplicationList); + } +} diff --git a/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.html b/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.html new file mode 100644 index 00000000..2f7d6102 --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.html @@ -0,0 +1,67 @@ + + + + + + + +

    {{params?.ltdName}}

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.ts b/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.ts new file mode 100644 index 00000000..43e46e5b --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/platform-account-detail/platform-account-detail.component.ts @@ -0,0 +1,249 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; + +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-platform-account-detail', + templateUrl: './platform-account-detail.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class PlatformAccountDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + info: any = {}; + params: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.params = route.snapshot.queryParams; + } + + ngOnInit(): void { + this.loadInfo(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { ...this.params }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value?.createTime?.[0] || '', + end: this.sf.value?.createTime?.[1] || '' + } + }); + } + } + return requestOptions; + }; + + loadInfo() { + this.service + .request(this.service.$api_get_platform_account_header, { + ...this.sf?.value, + ...this.params, + pageIndex: this.st.pi, + pageSize: this.st.ps + }) + .subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + stChange(e: STChange): void {} + + exportList() { + this.service.exportStart( + { + ...this.sf.value, + ...this.params, + createTime: { + start: this.sf.value?.createTime?.[0] || '', + end: this.sf.value?.createTime?.[1] || '' + }, + pageSize: -1 + }, + this.service.$api_get_exportAccountBalanceByPage + ); + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + businessNumber: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入' + } + }, + transactionNumber: { + type: 'string', + title: '交易单号', + ui: { + placeholder: '请输入' + } + }, + tradeType: { + type: 'string', + title: '交易类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'trade:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + channelSource: { + type: 'string', + title: '账户类型', + enum: [ + { value: '', label: '全部' }, + { value: '1', label: '货主账户' }, + { value: '2', label: '司机账户' }, + { value: '3', label: '运营商账户' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + roleName: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + incomeType: { + type: 'string', + title: '收支类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'income:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + enterpriseName: { + type: 'string', + title: '货主', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + projectName: { + type: 'string', + title: '所属项目', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '交易时间', index: 'createTime', type: 'date', width: 150 }, + { title: '流水号', index: 'channelPaySn', width: 170 }, + { title: '交易类型', index: 'tradeTypeLabel', className: 'text-center', width: 130 }, + { title: '交易单号', index: 'transactionNumber', width: 190 }, + { title: '订单号', index: 'orderSn', width: 170 }, + { title: '运单号', index: 'businessNumber', width: 190 }, + { title: '账户类型', index: 'accountTypeLabel', className: 'text-center', width: 130 }, + { title: '账户名称', index: 'roleName', className: 'text-center', width: 150 }, + { title: '所属项目', index: 'projectName', className: 'text-center', width: 150 }, + { title: '收支类型', index: 'incomeTypeLabel', className: 'text-center', width: 130 }, + { + title: '交易金额', + index: 'amount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '账户余额', + index: 'accountBalance', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.accountBalance }) } + }, + { title: '付款方', index: 'payName', className: 'text-center', width: 150 }, + { title: '收款方', index: 'incomeName', className: 'text-center', width: 150 }, + { title: '备注', index: 'tradeContent', className: 'text-center', width: 150 } + ]; + } +} diff --git a/src/app/routes/financial-management/components/platform-account/platform-account.component.html b/src/app/routes/financial-management/components/platform-account/platform-account.component.html new file mode 100644 index 00000000..e1928689 --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/platform-account.component.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/platform-account/platform-account.component.ts b/src/app/routes/financial-management/components/platform-account/platform-account.component.ts new file mode 100644 index 00000000..f6d7c52d --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/platform-account.component.ts @@ -0,0 +1,200 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-platform-account', + templateUrl: './platform-account.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class PlatformAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + searchSchema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + + info: any = {}; + + static: any = {}; + constructor(public service: FreightAccountService, private router: Router, private nzModalService: NzModalService) {} + + ngOnInit(): void { + this.loadInfo(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + this.loadStatistics(requestOptions.body); + return requestOptions; + }; + + loadInfo() { + const params = {}; + if (this.sf) { + Object.assign(params, { ...this.sf.value }); + } + this.service.request(this.service.$api_get_platform_account_header, params).subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + loadStatistics(params: any) { + this.service.request(this.service.$api_get_platform_account_statistics, params).subscribe(res => { + if (res) { + this.static = res; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + private initSF(): SFSchema { + return { + properties: { + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: null }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: null + }, + virtualAccount: { + type: 'string', + title: '虚拟账户', + ui: { + placeholder: '请输入' + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '网络货运人', index: 'ltdName', width: 180 }, + { title: '银行类型', index: 'bankTypeLabel', width: 120 }, + { title: '虚拟账户', index: 'virtualAccount', width: 160 }, + { + title: '平台账户可用余额', + index: 'availableBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.availableBalance }) } + }, + { + title: '平台账户冻结余额', + index: 'freezeBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.freezeBalance }) } + }, + { + title: '货主账户可用余额', + index: 'shipperAvailableBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.shipperAvailableBalance }) } + }, + { + title: '货主账户冻结余额', + index: 'shipperFreezeBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.shipperFreezeBalance }) } + }, + { + title: '司机账户可用余额', + index: 'driverAvailableBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.driverAvailableBalance }) } + }, + { + title: '司机账户冻结余额', + index: 'driverFreezeBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.driverFreezeBalance }) } + }, + { + title: '累计充值金额', + index: 'rechargeBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.rechargeBalance }) } + }, + { + title: '货主累计提现金额', + index: 'shipperWithdrawBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.shipperWithdrawBalance }) } + }, + { + title: '司机累计提现金额', + index: 'driverWithdrawBalance', + width: 180, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.driverWithdrawBalance }) } + }, + { + title: '操作', + width: 100, + className: 'text-center', + fixed: 'right', + buttons: [ + { + text: '查看明细', + click: item => + this.router.navigate(['/financial-management/platform-account/detail/' + item.id], { + queryParams: { ltdId: item.ltdId, bankType: item.bankType, ltdName: `${item.ltdName}(${item.bankTypeLabel})` } + }) + } + ] + } + ]; + } + exportList() { + this.service.exportStart( { ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportPlatformAccountBalanceByOperator,); + } +} diff --git a/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.html b/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.html new file mode 100644 index 00000000..10785fb6 --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.html @@ -0,0 +1,11 @@ + +
    + + +
    + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.less b/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.ts b/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.ts new file mode 100644 index 00000000..27193906 --- /dev/null +++ b/src/app/routes/financial-management/components/platform-account/setting-financial/setting-financial.component.ts @@ -0,0 +1,112 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; + +@Component({ + selector: 'app-setting-financial', + templateUrl: './setting-financial.component.html', + styleUrls: ['./setting-financial.component.less'] +}) +export class SettingFinancialComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + roleList = []; + roleNames: any = []; + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public service: SystemService) {} + + ngOnInit(): void { + if (this.i?.id !== 0) { + this.i.roleIds = this.i.roleId !== '' ? this.i.roleId.split(',') : []; + } + + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '公司名称', + type: 'string', + ui: { widget: 'string', placeholder: '请输入公司名称' }, + default: staff.name + }, + phone: { + title: '纳税人识别号', + type: 'string', + ui: { widget: 'string', placeholder: '请输入纳税人识别号' }, + default: staff.phone + }, + phone2: { + title: '税收分类编码', + type: 'string', + ui: { widget: 'string', placeholder: '请输入税收分类编码' }, + default: staff.phone + }, + phone3: { + title: '发票税率', + type: 'string', + ui: { widget: 'string', placeholder: '请输入发票税率' }, + default: staff.phone + }, + phone4: { + title: '附加费比例', + type: 'string', + ui: { widget: 'string', placeholder: '请输入附加费比例' }, + default: staff.phone + } + }, + required: ['name', 'phone', 'phone2', 'phone3', 'phone4'] + }; + } + + sure() { + if (!this.sf.value.roleIds || this.sf.value.roleIds.length === 0) { + this.service.msgSrv.error('员工角色不能为空!'); + return; + } + this.roleNames = []; + this.roleList.forEach((item: { id: any; roleName: string }) => { + this.sf.value.roleIds.forEach((ele: any) => { + if (ele === item.id) { + this.roleNames.push(item.roleName); + } + }); + }); + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleIds, + roleNames: this.roleNames.join(','), + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleIds, + telephone: this.i.telephone + }; + // this.service.request(this.service.$api_editorStaff, params).subscribe((res) => { + // this.service.msgSrv.success('编辑成功!'); + // this.modal.close(true); + // }); + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.html b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.html new file mode 100644 index 00000000..ab154074 --- /dev/null +++ b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.html @@ -0,0 +1,95 @@ + + + + + + + +
    +
    + + 基本信息 + + {{ costInfo?.ltdName }} + + + {{ costInfo?.brmdate }} + + + {{ costInfo?.brmModeLabel }} + + + {{ costInfo?.banktypeLabel }} + + + {{ costInfo?.artoname }} + + + {{ costInfo?.brmtypeLabel }} + + + {{ costInfo?.ltdaccountId }} + + + {{ costInfo?.recnopay |currency }} + + + {{ 0 |currency }} + + + {{ costInfo?.brmmoney |currency }} + + + {{ costInfo?.brmmoney |currency }} + + + {{ costInfo?.bankreceipt }} + + + {{ costInfo?.brmmoney |currency }} + + + {{ costInfo?.remarks }} + + +
    +
    +
    + + + + + + + + {{ item.vatnotax | currency}} + + + {{ item.vatmoney | currency}} + + + {{ index + 1 }} + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.less b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.less new file mode 100644 index 00000000..aa2721f6 --- /dev/null +++ b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.less @@ -0,0 +1,24 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + + .text-truncate { + white-space: normal; + } + + .ant-form-item { + margin-bottom: 0; + } + + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.ts b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.ts new file mode 100644 index 00000000..17dd85b2 --- /dev/null +++ b/src/app/routes/financial-management/components/receipt-order/receipt-order-detail/receipt-order-detail.component.ts @@ -0,0 +1,89 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-20 10:00:39 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-25 15:40:10 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\financial-management\\components\\receipt-order\\receipt-order-detail\\receipt-order-detail.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-receipt-order-detail', + templateUrl: './receipt-order-detail.component.html', + styleUrls: ['./receipt-order-detail.component.less'], +}) +export class ReceiptOrderDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + columns: { [key: string]: STColumn[] } = this.initST(); + costInfo: any = {}; + id: any = null; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + this.loadDetail(this.id); + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + id: this.id + }); + return requestOptions; + }; + + loadDetail(id: any) { + this.service.request(this.service.$api_get_receipt_header, { id }).subscribe(res => { + if (res) { + this.costInfo = res; + } + }); + } + + goBack() { + history.go(-1); + } + + private initST(): { [key: string]: STColumn[] } { + return { + cost: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '费用号', index: 'feeHId', className: 'text-left', width: 200 }, + { title: '费用日期', index: 'billHId', className: 'text-center', width: 150 }, + { title: '订单号', index: 'callNo', className: 'text-left', width: 200 }, + { title: '订单日期', index: 'waybillHId', className: 'text-center', width: 150 }, + { title: '订单费用类型', index: 'waybillDate', className: 'text-center', width: 160 }, + { title: '费用类型', index: 'callNo', className: 'text-center', width: 160 }, + { title: '费用科目', index: 'billLType', className: 'text-left', width: 160 }, + { title: '结算客户', index: 'feeSubId', className: 'text-left', width: 150 }, + { + title: '已收金额', + index: 'hrvatrate', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, + width: 140 + } + ], + requested: [ + { title: '序号', render: 'no', width: 70, className: 'text-left' }, + { title: '结算客户', index: 'cnoName', className: 'text-left', width: 200 }, + { + title: '预收金额', + index: 'yskmoney', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, + width: 200 + }, + { title: '预收备注', index: 'vatapptype', className: 'text-left', width: 200 } + ] + }; + } +} diff --git a/src/app/routes/financial-management/components/receipt-order/receipt-order.component.html b/src/app/routes/financial-management/components/receipt-order/receipt-order.component.html new file mode 100644 index 00000000..58f7732c --- /dev/null +++ b/src/app/routes/financial-management/components/receipt-order/receipt-order.component.html @@ -0,0 +1,46 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    + +
    + 已选择 + {{ selectedRows.length }} 张单 + 清空 +
    +
    + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receipt-order/receipt-order.component.ts b/src/app/routes/financial-management/components/receipt-order/receipt-order.component.ts new file mode 100644 index 00000000..bf8006d6 --- /dev/null +++ b/src/app/routes/financial-management/components/receipt-order/receipt-order.component.ts @@ -0,0 +1,291 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AddCollectionInvoiceModalComponent } from 'src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-receipt-order', + templateUrl: './receipt-order.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class ReceiptOrderComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.brmdate) { + Object.assign(requestOptions.body, { + brmdate: { + start: this.sf.value.brmdate?.[0] || '', + end: this.sf.value.brmdate?.[1] || '' + } + }); + } + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + addInvoice() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择收款单'); + return; + } + // const modal = this.nzModalService.create({ + // nzTitle: '收款单', + // nzContent: AddCollectionInvoiceModalComponent, + // nzComponentParams: { i: { userId: 0 } }, + // nzFooter: null + // }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + brmcode: { + type: 'string', + title: '收款单号', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: null + }, + bankreceipt: { + type: 'string', + title: '银行水单', + ui: { + placeholder: '请输入' + } + }, + brmtype: { + type: 'string', + title: '收款类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'driverrecord:receive:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + brmmode: { + type: 'string', + title: '收款方式', + ui: { + widget: 'dict-select', + params: { dictKey: 'receive:mode' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + arto: { + type: 'string', + title: '付款人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + type: 'string', + title: '收款状态', + ui: { + widget: 'dict-select', + params: { dictKey: 'write:off:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + brmdate: { + title: '到账日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + // billHCode: { + // type: 'string', + // title: '订单号', + // ui: { + // placeholder: '请输入', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + // feeHCodes: { + // type: 'string', + // title: '费用号', + // ui: { + // placeholder: '请输入', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + remarks: { + type: 'string', + title: '收款备注', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: 60, fixed: 'left', className: 'text-center' }, + { title: '收款单号', index: 'brmcode', type: 'link', width: 180, className: 'text-left' }, + // { title: '订单号', index: 'billHCode', width: 180, className: 'text-left' }, + // { title: '费用号', index: 'feeCode', width: 180, className: 'text-left' }, + { title: '网络货运人', index: 'ltdName', width: 200, className: 'text-left' }, + { title: '到账日期', index: 'brmdate', type: 'date', width: 200, className: 'text-left' }, + { title: '收款账户', index: 'ltdaccountId', width: 200, className: 'text-left' }, + { + title: '到账金额', + index: 'brmmoney', + width: 200, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.brmmoney }) } + }, + { + title: '核销金额', + index: 'brmmoney', + width: 200, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.brmmoney }) } + }, + { + title: '预收金额', + index: 'yskmoney', + width: 200, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) } + }, + { title: '银行类型', index: 'banktypeLabel', width: 200, className: 'text-left' }, + { title: '收款类型', index: 'brmtypeLabel', width: 150, className: 'text-left' }, + { title: '收款方式', index: 'brmModeLabel', width: 150, className: 'text-left' }, + { title: '付款人', index: 'artoname', width: 200, className: 'text-left' }, + { title: '银行水单', index: 'bankreceipt', width: 200, className: 'text-left' }, + { title: '创建时间', index: 'createTime', type: 'date', width: 200, className: 'text-left' }, + // { title: '创建人', index: 'createUserName', width: 150, className: 'text-left' }, + { title: '收款状态', index: 'stsLabel', width: 200, className: 'text-left' }, + { title: '收款备注', index: 'remarks', width: 200, className: 'text-left' }, + { + title: '操作', + width: '110px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '浏览', + click: item => this.router.navigate(['/financial-management/receipt-order/detail/' + item.id]) + } + // { + // text: '核销' + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.html b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.html new file mode 100644 index 00000000..0c48f68d --- /dev/null +++ b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.html @@ -0,0 +1,85 @@ + + + + + + + +
    +
    + + {{headerInfo?.ltdName}} + + + {{headerInfo?.cnoName}} + + + {{headerInfo?.ltdaccountId}} + + + {{headerInfo?.ahxmoney | currency}} + +
    +
    + + {{headerInfo?.ahxdate}} + + + {{headerInfo?.artoname}} + + + + {{headerInfo?.armoney | currency}} + +
    +
    + + {{headerInfo?.banktypeLabel}} + + + {{headerInfo?.brmtypeLabel}} + + + {{headerInfo?.bankreceipt}} + + + {{headerInfo?.remarks}} + +
    +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + {{index+1}} + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.less b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.less new file mode 100644 index 00000000..aebf12ee --- /dev/null +++ b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.ts b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.ts new file mode 100644 index 00000000..d630043c --- /dev/null +++ b/src/app/routes/financial-management/components/receivable-order/receivable-order-detail/receivable-order-detail.component.ts @@ -0,0 +1,161 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { TicketService } from 'src/app/routes/ticket-management/services/ticket.service'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-receivable-order-detail', + templateUrl: './receivable-order-detail.component.html', + styleUrls: ['./receivable-order-detail.component.less', '../../../../commom/less/expend-but.less', '../../../../commom/less/box.less'], + providers: [CurrencyPipe] +}) +export class ReceivableOrderDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + id = null; + billHId = null; + headerInfo: any = {}; + constructor(public service: FreightAccountService, private route: ActivatedRoute, private currencyPipe: CurrencyPipe) { + this.id = route.snapshot.params.id; + this.billHId = route.snapshot.queryParams.billHId; + this.loadHeadInfo(); + } + + ngOnInit(): void {} + + loadHeadInfo() { + this.service.request(this.service.$api_get_fico_header, { id: this.id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { ahxHId: this.id }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.feedate?.[0]) { + Object.assign(requestOptions.body, { + feedate: { + start: this.sf.value.feedate?.[0] || '', + end: this.sf.value.feedate?.[1] || '' + } + }); + } + } + return requestOptions; + }; + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + feeHCode: { + type: 'string', + title: '费用单', + ui: { + placeholder: '请输入' + } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount() + }, + default: '' + }, + feedate: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + // billTime: { + // title: '订单日期', + // type: 'string', + // ui: { + // widget: 'sl-from-to-search', + // format: 'yyyy-MM-dd', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } as SFDateWidgetSchema + // } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '序号', render: 'no', width: 80 }, + { title: '费用号', index: 'feeLId', width: 100 }, + { title: '费用日期', index: 'feedate', type: 'date', width: 150 }, + { title: '订单号', index: 'billHCode', width: 100 }, + // { title: '订单日期', index: 'billTime', width: 150 }, + // { title: '费用类型', index: 'cnoName', width: 90 }, + { title: '订单费用科目', index: 'billLTypeLabel', width: 100 }, + { title: '费用科目', index: 'feeSubName', width: 140 }, + { title: '结算客户', index: 'cnoName', width: 100 }, + { + title: '已收金额', + index: 'ahxmoney', + width: 100, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.ahxmoney)}` + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/receivable-order/receivable-order.component.html b/src/app/routes/financial-management/components/receivable-order/receivable-order.component.html new file mode 100644 index 00000000..0755a3f3 --- /dev/null +++ b/src/app/routes/financial-management/components/receivable-order/receivable-order.component.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/receivable-order/receivable-order.component.ts b/src/app/routes/financial-management/components/receivable-order/receivable-order.component.ts new file mode 100644 index 00000000..38da87bb --- /dev/null +++ b/src/app/routes/financial-management/components/receivable-order/receivable-order.component.ts @@ -0,0 +1,324 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from 'src/app/routes/ticket-management/services/ticket.service'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-receivable-order', + templateUrl: './receivable-order.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'], + providers: [CurrencyPipe] +}) +export class ReceivableOrderComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + + info: any = {}; + constructor( + public service: FreightAccountService, + private nzModalService: NzModalService, + private router: Router, + private currencyPipe: CurrencyPipe + ) {} + + ngOnInit(): void { + } + + loadInfo() { + this.service.request(this.service.$api_get_fico_sum).subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value?.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + if (this.sf.value?.ahxdate) { + Object.assign(requestOptions.body, { + ahxdate: { + start: this.sf.value.ahxdate?.[0] || '', + end: this.sf.value.ahxdate?.[1] || '' + } + }); + } + } + this.loadInfo(); + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + ahxcode: { + type: 'string', + title: '核销单号', + ui: { + placeholder: '请输入' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + bankreceipt: { + type: 'string', + title: '银行水单', + ui: { + placeholder: '请输入' + } + }, + brmtype: { + type: 'string', + title: '收款类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'driverrecord:receive:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + arvattype: { + type: 'string', + title: '付款类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'pay:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + arto: { + type: 'string', + title: '付款人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + type: 'string', + title: '核销状态', + enum: [ + { value: 1, label: '已核销' }, + { value: 0, label: '待核销' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + banktype: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: '' }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + ahxdate: { + title: '核销日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + // orderS3: { + // type: 'string', + // title: '费用号', + // ui: { + // placeholder: '请输入', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + remarks: { + type: 'string', + title: '核销备注', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '核销单号', index: 'ahxcode', type: 'link', width: 210 }, + { title: '订单号', index: 'billHCode', type: 'link', width: 180 }, + { title: '网络货运人', index: 'ltdName', width: 220 }, + { title: '核销日期', index: 'ahxdate', type: 'date', width: 160 }, + { title: '收款账户', index: 'ltdaccountId', width: 200 }, + { title: '核销类型', index: 'ahxType', type: 'enum', enum: { '1': '预收款' }, width: 120 }, + { + title: '核销金额', + index: 'ahxmoney', + width: 140, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.ahxmoney)}` + }, + { + title: '应收金额', + index: 'armoney', + width: 140, + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.armoney)}` + }, + { title: '银行类型', index: 'banktype', type: 'enum', enum: { '1': '平安', '2': '浦发' }, width: 120 }, + { title: '收款类型', index: 'arvattype', type: 'enum', enum: { '1': '费用款项' }, width: 120 }, + { title: '付款人', index: 'artoname', width: 200 }, + { title: '付款账户', index: 'shipperaccount', width: 170 }, + { title: '结算客户', index: 'cnoName', width: 120 }, + { title: '银行水单', index: 'bankreceipt', width: 200 }, + { title: '创建时间', index: 'createTime', width: 180 }, + // { title: '收款人', index: 'driver2IdName', width: 120 }, + // { title: '创建人', index: 'createUserIdLabel', width: 120 }, + { title: '核销状态', index: 'sts', type: 'enum', enum: { 0: '待核销', 1: '已核销' }, width: 120 }, + { title: '核销备注', index: 'remarks', width: 120 }, + { + title: '操作', + fixed: 'right', + width: 120, + className: 'text-center', + buttons: [ + { + text: '浏览', + click: item => + this.router.navigate(['/financial-management/receivable-order/detail/' + item.id], { queryParams: { billHId: item.billHId } }) + } + // { + // text: '核销' + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html new file mode 100644 index 00000000..8c7c5d10 --- /dev/null +++ b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html @@ -0,0 +1,56 @@ + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + {{ item.transferBankOpenName }}
    {{ item.transferBankCardNumber }} +
    +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts new file mode 100644 index 00000000..f06bc8cb --- /dev/null +++ b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts @@ -0,0 +1,245 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-recharge-record', + templateUrl: './recharge-record.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class RechargeRecordComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + @ViewChild('remarkodal', { static: true }) + remarkodal!: any; + rechargeRemark = ''; + + _$expand = false; + constructor(public service: FreightAccountService, private modal: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + return requestOptions; + }; + + addRemark(item: any) { + this.rechargeRemark = item.remark; + const modal = this.modal.create({ + nzTitle: this.rechargeRemark ? '修改备注' : '添加备注', + nzContent: this.remarkodal, + nzFooter: [ + { + type: 'primary', + label: '确认', + loading: () => this.service.http.loading, + onClick: () => { + this.service.request(this.service.$api_edit_remark, { id: item.id, remark: this.rechargeRemark }).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.st.load(1); + modal.destroy(); + } + }); + return false; + } + } + ] + }); + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportPageByOperator); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + rechargeNo: { + type: 'string', + title: '充值单号', + ui: { + placeholder: '请输入' + } + }, + rechargeStatus: { + type: 'string', + title: '充值状态', + enum: [ + { label: '全部', value: '' }, + { label: '充值中', value: '1' }, + { label: '充值失败', value: '2' }, + { label: '充值成功', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + createTime: { + title: '充值时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + roleName: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + autocomplete: 'off', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + accountType: { + type: 'string', + title: '账户类型', + enum: [ + { label: '全部', value: '' }, + { label: '货主账户', value: '1' }, + { label: '司机账户', value: '2' }, + { label: '营商商账户', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + } + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: '' }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '充值时间', index: 'createTime', type: 'date', width: 180 }, + { title: '充值单号', index: 'rechargeNo', width: 140 }, + { title: '网络货运人', index: 'ltdName', width: 160 }, + { title: '银行类型', index: 'bankTypeLabel', width: 100 }, + { title: '账户类型', index: 'accountTypeLabel', width: 100 }, + { title: '账户名称', index: 'roleName', width: 160 }, + { title: '虚拟账户', index: 'virtualAccount', width: 100 }, + { + title: '充值金额', + index: 'rechargeAmount', + width: 160, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.rechargeAmount }) } + }, + { title: '充值银行账户', render: 'transferBankAccount', width: 200 }, + { title: '充值方式', index: 'payChannelLabel', width: 100 }, + { title: '充值状态', index: 'rechargeStatusLabel', width: 100 }, + { title: '银行流水号', index: 'paySerialNumber', width: 120 }, + { + title: '操作', + width: 120, + fixed: 'right', + className: 'text-center', + buttons: [ + { type: 'divider' }, + { + text: '查看回单
    ', + click: item => + this.service.getReceiptUrl(item.receiptUrl, { + bankType: item.bankType, + rmYll: item.roleId, + snglFlgCd: item.paySerialNumber2, + bussType: '05', + ltdId: item.ltdId, + accountType: item.accountType + }) + }, + { + text: '添加备注', + click: item => this.addRemark(item) + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/refund-record/refund-record.component.html b/src/app/routes/financial-management/components/refund-record/refund-record.component.html new file mode 100644 index 00000000..251eff68 --- /dev/null +++ b/src/app/routes/financial-management/components/refund-record/refund-record.component.html @@ -0,0 +1,66 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + {{ item.orderRefundCode }}
    {{ item.refundStatusLabel }} +
    + + + {{cost.costName}}:{{ cost.refundAmount |currency }}
    +
    +
    + + + {{ bill.paymentApplicationCode }}
    +
    +
    + + {{ item.driverName }}
    {{ item.driverTelephone }}
    {{ item.driverLicencePlate }} +
    + + {{ item.captainName }}
    {{ item.captainTelephone }} +
    +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/refund-record/refund-record.component.ts b/src/app/routes/financial-management/components/refund-record/refund-record.component.ts new file mode 100644 index 00000000..6074f36b --- /dev/null +++ b/src/app/routes/financial-management/components/refund-record/refund-record.component.ts @@ -0,0 +1,293 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-refund-record', + templateUrl: './refund-record.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class RefundRecordComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + refundStatus: any = ''; + + msg = ''; + + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { refundStatus: this.refundStatus || null }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + refundExecuteTime: { + start: this.sf.value.refundExecuteTime?.[0] || '', + end: this.sf.value.refundExecuteTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + changeRefundStatus(status?: string) { + this.refundStatus = status || null; + this.st.load(1); + } + + auditAction(item?: any) { + this.msg = ''; + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + if (!this.msg) { + this.service.msgSrv.warning('请填写原因'); + return false; + } + this.service + .request(this.service.$api_disagree_refund_record, { + applicationId: item.id, + remark: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核拒绝成功'); + modal.destroy(true); + this.st.load(1); + } + }); + return false; + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + this.service + .request(this.service.$api_agree_refund_record, { + applicationId: item.id, + remark: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核通过成功'); + modal.destroy(true); + this.st.load(1); + } + }); + return false; + } + } + ] + }); + } + + reApply(item: any) { + const modal = this.nzModalService.warning({ + nzTitle: '确定要重新发起退款?', + nzOnOk: () => { + this.service + .request(this.service.$api_rebulid_refund_record, { + applicationId: item.id + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('发起成功'); + modal.destroy(true); + this.st.load(1); + } + }); + return false; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderRefundCode: { + type: 'string', + title: '退款单号', + ui: { + placeholder: '请输入' + } + }, + refundType: { + type: 'string', + title: '退款类型', + enum: [ + { value: '1', label: '平台退款货主' }, + { value: '2', label: '司机退款平台' }, + { value: '3', label: '车队长退款司机' }, + { value: '4', label: '车队长退款平台' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + enterpriseInfoName: { + type: 'string', + title: '货主', + ui: { + placeholder: '请输入' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + visibleIf: { + expand: (value: boolean) => value + }, + placeholder: '请输入' + } + }, + enterpriseProjectName: { + type: 'string', + title: '所属项目', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + resourceCode: { + type: 'string', + title: '货源号', + ui: { + visibleIf: { + expand: (value: boolean) => value + }, + placeholder: '请输入' + } + }, + refundExecuteTime: { + title: '退款时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + }, + nzShowTime: true + } as SFDateWidgetSchema + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + bankType: { + type: 'string', + title: '银行类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bankname:type' }, + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '退款单号', render: 'orderRefundCode', width: 190 }, + { title: '退款类型', index: 'refundTypeLabel', width: 140 }, + { title: '退款金额', render: 'refundAmount', className: 'text-right', width: 180 }, + { title: '退款时间', index: 'refundExecuteTime', width: 170 }, + { title: '货主', index: 'enterpriseInfoName', width: 150 }, + { title: '所属项目', index: 'enterpriseProjectName', width: 140 }, + { title: '支付单', render: 'billRefundPaymentVOS', width: 150 }, + { title: '订单号', index: 'billCode', width: 150 }, + { title: '货源号', index: 'resourceCode', width: 150 }, + { title: '司机', render: 'driver', width: 150 }, + { title: '收款人', render: 'captain', width: 150 }, + { title: '网络货运人', index: 'ltdName', width: 180 }, + { title: '银行类型', index: 'bankTypeLabel', width: 120 }, + { title: '退款原因', index: 'reason', width: 170 }, + { title: '失败原因', index: 'failCause', width: 170 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: '150px', + buttons: [ + { + text: '审核', + iif: item => item.refundStatus === '1', + click: item => this.auditAction(item) + }, + { + text: '重新发起', + iif: item => item.refundStatus === '5', + click: item => this.reApply(item) + } + // { + // text: '关闭', + // click: item => this.router.navigate(['/financial-management/withdrawals-record/detail/' + item.id]) + // } + ] + } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_asyncExportBillRefundApplicationList); + } +} diff --git a/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.html b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.html new file mode 100644 index 00000000..bd7fb2aa --- /dev/null +++ b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.html @@ -0,0 +1,30 @@ + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.less b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.less new file mode 100644 index 00000000..cd8c3436 --- /dev/null +++ b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.less @@ -0,0 +1,41 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } + + .text-truncate { + white-space: normal; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + max-width: 400px; + position : absolute; + right : 0; + bottom : 25px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.ts b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.ts new file mode 100644 index 00000000..0e7987e9 --- /dev/null +++ b/src/app/routes/financial-management/components/transaction-flow/transaction-flow.component.ts @@ -0,0 +1,278 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; + +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-transaction-flow', + templateUrl: './transaction-flow.component.html', + styleUrls: ['./transaction-flow.component.less'], + providers: [CurrencyPipe] +}) +export class TransactionFlowComponent { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + constructor( + public service: FreightAccountService, + private nzModalService: NzModalService, + private router: Router, + private currencyPipe: CurrencyPipe + ) {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择' + } as SFDateWidgetSchema + }, + transactionNumber: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入' + } + }, + businessNumber: { + type: 'string', + title: '关联单号', + ui: { + placeholder: '请输入' + } + }, + orderSn: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + tradeType: { + type: 'string', + title: '交易类型', + enum: [ + { label: '全部', value: '' }, + { label: '运费支付', value: 1 }, + { label: '附加费支付', value: 2 }, + { label: '运费退款', value: 3 }, + { label: '附加费退款', value: 4 }, + { label: '保费支付', value: 5 }, + { label: '保费退款', value: 6 }, + { label: '余额充值', value: 7 }, + { label: '余额提现', value: 8 }, + { label: '资金分配', value: 9 }, + { label: '资金回收', value: 10 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + incomeType: { + type: 'string', + title: '收支类型', + enum: [ + { label: '全部', value: '' }, + { label: '收入', value: 2 }, + { label: '支出', value: 1 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + channelSource: { + type: 'string', + title: '账户类型', + enum: [ + { label: '全部', value: '' }, + { label: '货主账户', value: '1' }, + { label: '司机账户', value: '2' }, + { label: '运营商账户', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + roleName: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + projectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getEnterpriseProject() + }, + default: '' + }, + bankType: { + type: 'string', + title: '银行类型', + enum: [ + { label: '全部', value: '' }, + { label: '平安银行', value: '1' }, + { label: '浦发银行', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '交易时间', index: 'createTime', width: 180 }, + { title: '流水号', index: 'transactionNumber', width: 180 }, + { title: '交易类型', index: 'tradeTypeLabel', width: 120 }, + { title: '关联单号', index: 'businessNumber', width: 150 }, + { title: '订单号', index: 'orderSn', width: 150 }, + { title: '账户类型', index: 'accountTypeLabel', width: 130 }, + { title: '账户名称', index: 'roleName', width: 180 }, + { title: '所属项目', index: 'projectName', width: 140 }, + { title: '收支类型', index: 'incomeTypeLabel', width: 100, className: 'text-center' }, + { + title: '交易金额', + index: 'amount', + width: 100, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '账户余额', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.accountBalance }) } + }, + { title: '网络货运人', index: 'ltdName', width: 180 }, + { title: '银行类型', index: 'bankTypeLabel', width: 100 }, + { title: '银行流水号', index: 'channelPaySn', width: 170 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { + text: '查看回单', + iif: item => item.tradeType !== '9' && item.tradeType !== '10', + click: item => + this.service.getReceiptUrl(item.receiptUrl, { + bankType: item.bankType, + rmYll: item.roleId, + snglFlgCd: item.channelPaySn, + bussType: item.tradeType === '7' ? '05' : item.tradeType === '8' ? '06' : '07', + ltdId: item.ltdId, + accountType: item.accountType + }) + } + ] + } + ]; + } + exportList() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_exportAccountBalanceDetailPage); + } +} diff --git a/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.html b/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.html new file mode 100644 index 00000000..bdf26c72 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.html @@ -0,0 +1,66 @@ + + + + + + + + +
    + 记账凭证 + + + + {{info?.vcltdcode}} - {{info?.vcltdname}} + + + {{info?.vctype}} + + + {{info?.vctime}} + +
    + + + + +
    +
    合计:
    +
    {{info?.drmoney | currency}}
    +
    {{info?.crmoney | currency}}
    +
    +
    +
    + + + + {{ auxVO.auxLabel }}: {{ auxVO.auxValue }}
    +
    +
    +
    + + + + {{info?.remarks}} + + + {{info?.id}} + + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.ts b/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.ts new file mode 100644 index 00000000..1c4f072c --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-management/voucher-detail/voucher-detail.component.ts @@ -0,0 +1,57 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STData, STColumn, STRequestOptions } from '@delon/abc/st'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-voucher-detail', + templateUrl: './voucher-detail.component.html' +}) +export class VoucherDetailComponent implements OnInit { + columns: STColumn[] = [ + { title: '摘要', index: 'remarks' }, + { title: '会计科目', index: 'subname' }, + { title: '辅助核算', render: 'auxVOList' }, + { title: '币种', index: 'currency', className: 'text-center' }, + { + title: '借方金额', + index: 'drlocalmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.drlocalmoney }) } + }, + { + title: '贷方金额', + index: 'crlocalmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.crlocalmoney }) } + } + ]; + id!: string; + + info: any = { faShowVOList: [] }; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + } + + ngOnInit(): void { + this.loadDetail(this.id); + } + + loadDetail(id: string) { + this.service.request(this.service.$api_get_fico_vch__detail, { id }).subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/financial-management/components/voucher-management/voucher-management.component.html b/src/app/routes/financial-management/components/voucher-management/voucher-management.component.html new file mode 100644 index 00000000..30ea85a7 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-management/voucher-management.component.html @@ -0,0 +1,39 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/voucher-management/voucher-management.component.ts b/src/app/routes/financial-management/components/voucher-management/voucher-management.component.ts new file mode 100644 index 00000000..014bde06 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-management/voucher-management.component.ts @@ -0,0 +1,362 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-18 15:57:44 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-09 16:36:42 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\financial-management\\components\\voucher-management\\voucher-management.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-voucher-management', + templateUrl: './voucher-management.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class VoucherManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || null, + end: this.sf.value.createTime?.[1] || null + } + }); + } + if (this.sf.value.vctime) { + Object.assign(requestOptions.body, { + vctime: { + start: this.sf.value.vctime?.[0] || null, + end: this.sf.value.vctime?.[1] || null + } + }); + } + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + vccode: { + type: 'string', + title: '凭证号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount() + }, + default: '' + }, + vctime: { + title: '凭证时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + sourceCode: { + type: 'string', + title: '原始单号', + ui: { + autocomplete: 'off', + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sourceType: { + type: 'string', + title: '原始单类型', + enum: [ + { value: '', label: '全部' }, + { value: 1, label: '收款' }, + { value: 2, label: '收款(退款)' }, + { value: 3, label: '应收费用' }, + { value: 4, label: '应收费用(负数)' }, + { value: 5, label: '应收核销' }, + { value: 6, label: '应收核销(负数)' }, + { value: 7, label: '应付费用' }, + { value: 8, label: '应付费用(负数)' }, + { value: 9, label: '应付核销' }, + { value: 10, label: '应付核销(负数)' }, + { value: 11, label: '分票开票' }, + { value: 12, label: '删除分票' }, + { value: 13, label: '付款' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + remarks: { + type: 'string', + title: '凭证摘要', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vctype: { + type: 'string', + title: '凭证类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'credential:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + // subid: { + // type: 'string', + // title: '科目', + // ui: { + // widget: 'dict-select', + // params: { dictKey: 'refund:apply:status' }, + // placeholder: '请选择', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + drmoney: { + type: 'string', + title: '借方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + crmoney: { + type: 'string', + title: '贷方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vcltdid: { + type: 'string', + title: '帐套', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + type: 'string', + title: '凭证状态', + ui: { + widget: 'dict-select', + params: { dictKey: 'credential:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + importncnotes: { + type: 'string', + title: 'NC凭证', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vc2code: { + type: 'string', + title: '汇总凭证号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + importnc: { + type: 'string', + title: '导入NC', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + isvc2: { + type: 'string', + title: '是否汇总', + enum: [ + { value: null, label: '全部' }, + { value: 0, label: '否' }, + { value: 1, label: '是' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: 60, className: 'text-center', fixed: 'left' }, + { title: '凭证号', index: 'vccode', type: 'link', width: 200 }, + { title: '帐套', index: 'ltdId', width: 200, format: item => `${item.vcltdcode}-${item.vcltdname}` }, + { title: '凭证时间', index: 'vctime', type: 'date', width: 200 }, + { title: '凭证类型', index: 'vctype', width: 200 }, + // { title: '序号', index: 'invmoney', width: 200, format: _ => '1' }, + { title: '摘要', index: 'remarks', width: 300 }, + { title: '币种', index: 'currency', width: 100 }, + { + title: '借方金额', + index: 'drmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.drmoney }) } + }, + { + title: '贷方金额', + index: 'crmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.crmoney }) } + }, + { title: 'NC凭证', index: 'importncnotes', width: 150 }, + { title: '汇总凭证号', index: 'vc2code', width: 150 }, + { title: '凭证状态', index: 'stsLabel', width: 120 }, + { title: '创建时间', index: 'createTime', width: 140 }, + // { title: '创建人', index: 'createUserId', width: 150 }, + { + title: '操作', + width: '130px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '浏览', + click: (item: any) => this.router.navigate(['/financial-management/voucher-management/detail/' + item.id]), + acl: { ability: ['FINANCIAL-VOUCHER-view'] } + } + // { + // text: '修改' + // }, + // { + // text: '删除' + // }, + // { + // text: '提交' + // } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.html b/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.html new file mode 100644 index 00000000..49cf138c --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.html @@ -0,0 +1,53 @@ + + + + + + + +
    + 记账凭证 + + + + {{info?.vcltdcode}} + + + {{info?.vctype}} + + + {{info?.vctime}} + +
    + + + + +
    +
    合计:
    +
    {{info?.drmoney | currency}}
    +
    {{info?.crmoney | currency}}
    +
    +
    +
    + + + + {{ auxVO.auxLabel }}: {{ auxVO.auxValue }}
    +
    +
    +
    + + + + {{info?.remarks}} + + + {{info?.createUserId}} + + + +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.ts b/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.ts new file mode 100644 index 00000000..0f931738 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/summary-detail/summary-detail.component.ts @@ -0,0 +1,60 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STData, STColumn, STRequestOptions } from '@delon/abc/st'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-summary-detail', + templateUrl: './summary-detail.component.html' +}) +export class SummaryDetailComponent implements OnInit { + columns: STColumn[] = [ + { title: '摘要', index: 'remarks' }, + { title: '会计科目', index: 'subname' }, + { title: '辅助核算', render: 'auxVOList' }, + { title: '币种', index: 'currency', className: 'text-center' }, + { + title: '借方金额', + index: 'drlocalmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.drlocalmoney }) } + }, + { + title: '贷方金额', + index: 'crlocalmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.crlocalmoney }) } + } + ]; + id!: string; + + info: any = { faShowVOList: [] }; + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + } + + ngOnInit(): void { + this.loadDetail(this.id); + } + + loadDetail(id: string) { + this.service.request(this.service.$api_get_fico_vch__detail, { id }).subscribe(res => { + if (res) { + this.info = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + return requestOptions; + }; + + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.html b/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.html new file mode 100644 index 00000000..09835d0d --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.html @@ -0,0 +1,31 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.ts b/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.ts new file mode 100644 index 00000000..d65f5669 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/voucher-list/voucher-list.component.ts @@ -0,0 +1,226 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-voucher-list', + templateUrl: './voucher-list.component.html', + styleUrls: ['../../../../commom/less/box.less'] +}) +export class VoucherListComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + vc2code = null; + constructor(public service: FreightAccountService, private route: ActivatedRoute, private router: Router) { + this.vc2code = route.snapshot.params.id; + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { vc2code: this.vc2code }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || null, + end: this.sf.value.createTime?.[1] || null + } + }); + } + if (this.sf.value.vctime) { + Object.assign(requestOptions.body, { + vctime: { + start: this.sf.value.vctime?.[0] || null, + end: this.sf.value.vctime?.[1] || null + } + }); + } + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + vccode: { + type: 'string', + title: '凭证号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + vctime: { + title: '凭证时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + sourceCode: { + type: 'string', + title: '原始单号', + ui: { + autocomplete: 'off', + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sourceType: { + type: 'string', + title: '原始单类型', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + drmoney: { + type: 'string', + title: '借方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + inpinvcosde: { + type: 'string', + title: '凭证摘要', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + subid: { + type: 'string', + title: '科目', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + crmoney: { + type: 'string', + title: '贷方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '凭证号', index: 'id', type: 'link', width: 150 }, + { title: '帐套', index: 'vcltdid', width: 150 }, + { title: '凭证时间', index: 'vctime', type: 'date', width: 150 }, + { title: '凭证类型', index: 'vctype', width: 150 }, + { title: '序号', index: 'invmoney', width: 150, format: _ => '1' }, + { title: '摘要', index: 'remarks', width: 300 }, + { title: '币种', index: 'currency', width: 100 }, + { + title: '借方金额', + index: 'drmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.drmoney }) } + }, + { + title: '贷方金额', + index: 'crmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.crmoney }) } + }, + { title: '凭证状态', index: 'stsLabel', width: 120 }, + { title: '创建时间', index: 'createTime', width: 140 }, + { title: '创建人', index: 'createUserId', width: 150 }, + { + title: '操作', + width: '130px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '浏览', + click: (item: any) => this.router.navigate(['/financial-management/voucher-summary/list/detail/' + item.id]) + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.html b/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.html new file mode 100644 index 00000000..5f5f53c7 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.html @@ -0,0 +1,40 @@ + + + + + +
    +
    + +
    +
    + + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.ts b/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.ts new file mode 100644 index 00000000..ca64fd91 --- /dev/null +++ b/src/app/routes/financial-management/components/voucher-summary/voucher-summary.component.ts @@ -0,0 +1,349 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { DateHelperByDatePipe } from 'ng-zorro-antd/i18n'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AddCollectionInvoiceModalComponent } from 'src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component'; +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-voucher-summary', + templateUrl: './voucher-summary.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class VoucherSummaryComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor( + public service: FreightAccountService, + private nzModalService: NzModalService, + private router: Router, + private dateHelperByDatePipe: DateHelperByDatePipe + ) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { isvc2: 1 }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createtime: { + start: this.sf.value.createtime?.[0] || '', + end: this.sf.value.createtime?.[1] || '' + }, + vctime: { + start: this.sf.value.vctime?.[0] || '', + end: this.sf.value.vctime?.[1] || '' + } + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + addInvoice() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择申请记录'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '收票信息', + nzContent: AddCollectionInvoiceModalComponent, + nzComponentParams: { i: { userId: 0 } }, + nzFooter: null + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_export_fico_vch_page); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + vc2code: { + type: 'string', + title: '汇总凭证号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + vctime: { + title: '凭证时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + sourceCode: { + type: 'string', + title: '原始单号', + ui: { + autocomplete: 'off', + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sourceType: { + type: 'string', + title: '原始单类型', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + remarks: { + type: 'string', + title: '凭证摘要', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vctype: { + type: 'string', + title: '凭证类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'credential:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + s2ts: { + type: 'string', + title: '科目', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + drmoney: { + type: 'string', + title: '借方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + crmoney: { + type: 'string', + title: '贷方金额', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vcltdid: { + type: 'string', + title: '帐套', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + type: 'string', + title: '凭证状态', + ui: { + widget: 'dict-select', + params: { dictKey: 'credential:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + feecode: { + type: 'string', + title: 'NC凭证', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + vccode: { + type: 'string', + title: '凭证号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + s22t2ss: { + type: 'string', + title: '导入NC', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createt1im2e: { + title: '统计时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: 60, className: 'text-center', fixed: 'left' }, + { title: '汇总凭证号', index: 'vc2code', type: 'link', width: 200 }, + { title: '帐套', index: 'vcltdcode', width: 180 }, + { title: '凭证时间', index: 'createTime', type: 'date', width: 150 }, + { + title: '统计区间', + index: 'invdate', + type: 'date', + width: 200, + format: item => + `${this.dateHelperByDatePipe.format(item.vctime2start, 'yyyy-MM-dd')} | ${this.dateHelperByDatePipe.format( + item.vctime2end, + 'yyyy-MM-dd' + )}` + }, + { title: '凭证类型', index: 'vctype', width: 120 }, + { title: '序号', index: 'invmoney', width: 100, format: _ => '1' }, + { title: '摘要', index: 'remarks', width: 220 }, + { title: '币种', index: 'currency', width: 100 }, + { + title: '借方金额', + index: 'drmoney', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.drmoney }) } + }, + { + title: '贷方金额', + index: 'crmoney', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.crmoney }) } + }, + { title: 'NC凭证', index: 'importncnotes', width: 180 }, + { title: '凭证状态', index: 'stsLabel', width: 120 }, + { title: '创建时间', index: 'createTime', width: 180 }, + { title: '创建人', index: 'createUserName', width: 120 }, + { + title: '操作', + width: '130px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '浏览', + click: (item: any) => this.router.navigate(['/financial-management/voucher-summary/detail/' + item.id]) + }, + { + text: '列表', + click: (item: any) => this.router.navigate(['/financial-management/voucher-summary/list/' + item.vc2code]) + } + ] + } + ]; + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html new file mode 100644 index 00000000..aa167bec --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html @@ -0,0 +1,109 @@ + + + + + + + + + +
    + + {{formData?.ltdName}} + + + {{formData?.bankType==='1'?'平安银行':'浦发银行'}} + + + {{formData?.refundApplyCode}} + + + {{formData?.bankAccountName}} + + + {{formData?.createTime}} + + + {{formData?.virtualAccount}} + + + {{formData?.refundStatusLabel}} + + + {{formData?.amount | currency}} + + + {{formData?.bankSerialNumber}} + + + {{formData?.bankCardNumber}} + + + {{formData?.refundStatus==='3'?'下载回单':'暂无回单'}} + +
    + + + +
    +
    + +
    +
    + + + + +
    +
    + + + + {{detail.costName}}:{{detail.price |currency}} + + + + {{item.billCode}}
    + {{item.billStatusLabel}}
    +
    + + {{item.wayBillCode}}
    + {{item.wayBillStatusLabel}}
    +
    + + {{item.driverName}}
    + {{item.driverTelephone}}
    + {{item.driverLicencePlate}}
    +
    + + {{item.captainName}}
    + {{item.captainTelephone}}
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less new file mode 100644 index 00000000..627355a5 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less @@ -0,0 +1,23 @@ +:host::ng-deep { + + .ant-alert-info { + background-color: #f3f3f3; + border : 1px solid #dbdbdb; + + .ant-alert-message { + color : rgba(0, 0, 0, 0.85); + font-weight: 600; + font-size : 16px; + } + } + + .ant-form-item { + margin-bottom: 15px; + } + + nz-tabs-nav { + background-color: #f3f3f3; + border : 1px solid #dbdbdb; + padding-left : 18px; + } +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts new file mode 100644 index 00000000..c91b3e29 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts @@ -0,0 +1,249 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { FreightAccountService } from '../../../services/freight-account.service'; + +@Component({ + selector: 'app-withdrawals-detail', + templateUrl: './withdrawals-detail.component.html', + styleUrls: ['./withdrawals-detail.component.less'] +}) +export class WithdrawalsDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: Component; + @ViewChild('sf', { static: false }) + inputSF!: SFComponent; + columns: STColumn[] = this.initST(); + inputSearchSchema: SFSchema = this.initInputSF(); + _$expand = false; + + formData: any = {}; + + timeLineData: any = []; + + accountType = '1'; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + const id = route.snapshot.params.id; + this.accountType = route.snapshot.queryParams.type; + this.loadRefundDetail(id); + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.inputSF?.value) { + Object.assign(requestOptions.body, { + ...this.inputSF.value + }); + } + Object.assign(requestOptions.body, { refundApplicationId: this.route.snapshot.params.id }); + return requestOptions; + }; + + loadRefundDetail(id: string) { + this.service.request(this.service.$api_get_refund_detail, { id }).subscribe(res => { + if (res) { + this.formData = res; + // 处理流程节点数据 + // 流程是否结束 + let isEnd = false; + if (res.successTime) { + isEnd = true; + if (res.refundStatus === '3') { + this.timeLineData.push({ time: res.successTime, value: `到账成功`, color: 'green' }); + } else { + this.timeLineData.push({ time: res.successTime, value: `提现失败`, color: 'red' }); + } + } + if (res.agreeTime && res.refundStatus !== '4') { + this.timeLineData.push({ time: res.agreeTime, value: `银行处理中`, color: 'gray' }); + } + if (res.agreeTime) { + if (res.refundStatus === '4') { + isEnd = true; + this.timeLineData.push({ + time: res.agreeTime, + value: `拒绝提现
    操作人员:${res.handlerUserIdLabel}`, + color: 'red' + }); + } else { + this.timeLineData.push({ + time: res.agreeTime, + value: `审核通过
    操作人员:${res.handlerUserIdLabel}`, + color: 'gray' + }); + } + } + if (res.createTime) { + this.timeLineData.push({ + time: res.createTime, + value: `提交提现申请
    提现${res.amount}元至${res.bankName}(${res.bankCardNumber})
    操作人员:${res.userIdLabel}`, + color: 'gray' + }); + } + if (this.timeLineData?.length > 0 && !isEnd) { + this.timeLineData[0].color = 'green'; + } + } + }); + } + + downBack() { + if (this.formData?.refundStatus !== '3') { + return; + } + this.service.getReceiptUrl(this.formData.receiptUrl, { + bankType: this.formData.bankType, + rmYll: this.formData.userId, + snglFlgCd: this.formData.coreSerNo, + bussType: '06', + ltdId: this.formData.ltdId, + accountType: this.formData.accountType + }); + } + + /** + * 重置表单 + */ + resetInputSF() { + this.inputSF.reset(); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.inputSF?.setValue('/expand', this._$expand); + } + + goBack() { + history.go(-1); + } + + // 导出 + exprot() { + this.service.exportStart( + { ...this.inputSF.value, pageSize: -1, refundApplicationId: this.route.snapshot.params.id }, + this.service.$api_export_refund_detail_page + ); + } + + private initInputSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + billHCode: { + type: 'string', + title: '支付编号', + ui: { + placeholder: '请输入' + } + }, + billHCod1e: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + billHCo1de: { + type: 'string', + title: '货源编号', + ui: { + placeholder: '请输入' + } + }, + billHC1ode: { + type: 'string', + title: '服务类型', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billHCo11de: { + type: 'string', + title: '承运司机', + ui: { + placeholder: '请输入司机姓名/手机号', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billHCo111de: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billHC1o11de: { + type: 'string', + title: '收款人', + ui: { + placeholder: '请输入收款人姓名/手机号', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billHC1o111de: { + type: 'string', + title: '车队长收款', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '支付编号', index: 'orderPaymentCode', className: 'text-left', width: 200 }, + { + title: '支付金额', + index: 'payAmount', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.payAmount }) }, + width: 140 + }, + { title: '运费明细', render: 'amountDetails', className: 'text-right', width: 150 }, + { title: '货主', index: 'ltdName', className: 'text-left', width: 200 }, + { title: '订单号', render: 'billId', width: 200 }, + { title: '运单号', render: 'wayBillId', width: 200 }, + { title: '货源编号', index: 'resourceCode', width: 200 }, + { + title: '服务类型', + index: 'serviceType', + className: 'text-center', + width: 150, + type: 'enum', + enum: { '1': '抢单', '2': '指派', '3': '二维码', '4': '手工单' } + }, + { title: '承运司机', render: 'driverId', width: 150 }, + { title: '收款人', render: 'captainName', className: 'text-left', width: 150 }, + { title: '银行类型', index: 'bankTypeLabel', className: 'text-center', width: 150 } + ]; + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html new file mode 100644 index 00000000..a4db6171 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html @@ -0,0 +1,84 @@ + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据   累计提现 {{ + totalCallNo }} + 清空 +
    + +
    +
    + + + + {{ item.bankName }}
    {{ item.bankCardNumber }} +
    +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts new file mode 100644 index 00000000..75a921ef --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts @@ -0,0 +1,309 @@ +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; + +import { FreightAccountService } from '../../services/freight-account.service'; + +@Component({ + selector: 'app-withdrawals-record', + templateUrl: './withdrawals-record.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class WithdrawalsRecordComponent { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + refundStatus: any = ''; + + msg = ''; + constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + }, + refundStatus: this.refundStatus || null + }); + } + delete requestOptions?.body?.expand; + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + data = data.map(node => ({ ...node, disabled: node.refundStatus !== '1' })); + return data; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.amount, 0).toFixed(2); + break; + } + } + + changeRefundStatus(status?: string) { + this.refundStatus = status || null; + this.st.load(1); + } + + auditAction(item?: any) { + this.msg = ''; + let params: string[] = []; + if (item) { + params = [item.id]; + } else { + params = this.selectedRows.map(node => node.id); + } + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + disabled: () => this.service.http.loading, + type: 'default', + onClick: () => { + if (!this.msg || this.msg.trim().length === 0) { + this.service.msgSrv.warning('请填写拒绝原因 '); + return false; + } + this.service + .request(this.service.$api_disagree_refund, { + refundApplicationId: params, + msg: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核拒绝成功'); + modal.destroy(); + this.st.load(1); + } + }); + return false; + } + }, + { + label: '通过', + disabled: () => this.service.http.loading, + type: 'primary', + onClick: () => { + this.service + .request(this.service.$api_agree_refund, { + refundApplicationId: params, + msg: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核通过成功'); + modal.destroy(); + this.st.load(1); + } + }); + return false; + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + refundApplyCode: { + type: 'string', + title: '提现单号', + ui: { + placeholder: '请输入' + } + }, + // refundStatus: { + // type: 'string', + // title: '提现状态', + // ui: { + // widget: 'dict-select', + // params: { dictKey: 'refund:apply:status' }, + // placeholder: '请选择' + // } + // }, + createTime: { + title: '提现时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + bankAccountName: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入' + } + }, + accountType: { + type: 'string', + title: '账户类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bank:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + bankType: { + type: 'string', + title: '银行类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bankname:type' }, + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '提现时间', index: 'createTime', width: 180 }, + { title: '提现单号', index: 'refundApplyCode', width: 120 }, + { title: '网络货运人', index: 'ltdName', width: 140 }, + { title: '银行类型', index: 'bankTypeLabel', width: 100 }, + { title: '账户类型', index: 'accountTypeLabel', width: 100 }, + { title: '账户名称', index: 'bankAccountName', width: 140 }, + { title: '虚拟账户', index: 'virtualAccount', width: 100 }, + { + title: '提现金额', + index: 'amount', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { title: '提现银行账户', render: 'bankCardNumber', width: 180 }, + { title: '提现状态', index: 'refundStatusLabel', width: 100 }, + { title: '银行流水号', index: 'bankSerialNumber', width: 120 }, + { title: '核心交易流水', index: 'coreSerNo', width: 130 }, + { title: '备注', index: 'rejectionCause', width: 150, format: item => item.failCause || item.rejectionCause }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '审核', + iif: item => item.refundStatus === '1', + click: item => this.auditAction(item) + }, + { + text: '详情
    ', + click: item => + this.router.navigate([`/financial-management/withdrawals-record/detail/${item.id}`], { + queryParams: { type: item.accountType } + }) + }, + { + text: '查看回单', + iif: item => item.refundStatus === '3', + click: item => + this.service.getReceiptUrl(item.receiptUrl, { + bankType: item.bankType, + rmYll: item.userId, + snglFlgCd: item.coreSerNo, + bussType: '06', + ltdId: item.ltdId, + accountType: item.accountType + }) + } + ] + } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_asyncExportRefundApplicationList); + } +} diff --git a/src/app/routes/financial-management/financial-managemen-routing.module.ts b/src/app/routes/financial-management/financial-managemen-routing.module.ts new file mode 100644 index 00000000..cd54afa6 --- /dev/null +++ b/src/app/routes/financial-management/financial-managemen-routing.module.ts @@ -0,0 +1,78 @@ +import { FreightAccountComponent } from './components/freight-account/freight-account.component'; +import { DriverAccountComponent } from './components/driver-account/driver-account.component'; +import { RechargeRecordComponent } from './components/recharge-record/recharge-record.component'; +import { WithdrawalsRecordComponent } from './components/withdrawals-record/withdrawals-record.component'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; +import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; +import { WithdrawalsDetailComponent } from './components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; +import { CostManagementComponent } from './components/cost-management/cost-management.component'; +import { AbnormalGoldComponent } from './components/abnormal-gold/abnormal-gold.component'; +import { PaymentRecordComponent } from './components/payment-record/payment-record.component'; +import { TransactionFlowComponent } from './components/transaction-flow/transaction-flow.component'; +import { CostManagementDetailComponent } from './components/cost-management/cost-management-detail/cost-management-detail.component'; +import { ExpensesReceivableComponent } from './components/cost-management/expenses-receivable/expenses-receivable.component'; +import { ExpensesPayableComponent } from './components/cost-management/expenses-payable/expenses-payable.component'; +import { PaymentOrderComponent } from './components/payment-order/payment-order.component'; +import { ReceiptOrderComponent } from './components/receipt-order/receipt-order.component'; +import { VoucherManagementComponent } from './components/voucher-management/voucher-management.component'; +import { VoucherSummaryComponent } from './components/voucher-summary/voucher-summary.component'; +import { ReceivableOrderComponent } from './components/receivable-order/receivable-order.component'; +import { PayableOrderComponent } from './components/payable-order/payable-order.component'; +import { ReceivableOrderDetailComponent } from './components/receivable-order/receivable-order-detail/receivable-order-detail.component'; +import { PayableOrderDetailComponent } from './components/payable-order/payable-order-detail/payable-order-detail.component'; +import { VoucherDetailComponent } from './components/voucher-management/voucher-detail/voucher-detail.component'; +import { SummaryDetailComponent } from './components/voucher-summary/summary-detail/summary-detail.component'; +import { VoucherListComponent } from './components/voucher-summary/voucher-list/voucher-list.component'; +import { ReceiptOrderDetailComponent } from './components/receipt-order/receipt-order-detail/receipt-order-detail.component'; +import { PaymentOrderDetailComponent } from './components/payment-order/payment-order-detail/payment-order-detail.component'; +import { PlatformAccountComponent } from './components/platform-account/platform-account.component'; +import { PlatformAccountDetailComponent } from './components/platform-account/platform-account-detail/platform-account-detail.component'; +import { AdvanceCollectionComponent } from './components/advance-collection/advance-collection.component'; +import { AdvanceCollectionDetailComponent } from './components/advance-collection/advance-collection-detail/advance-collection-detail.component'; +import { RefundRecordComponent } from './components/refund-record/refund-record.component'; +import { AbnormalGoldDetailComponent } from './components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component'; + +const routes: Routes = [ + { path: 'freight-account', component: FreightAccountComponent, data: { guard: { ability: ['FINANCIAL-FREIGHT-ACOUNT-list'] } } }, + { path: 'freight-account/detail/:id', component: FreightAccountDetailComponent }, + { path: 'driver-account', component: DriverAccountComponent }, + { path: 'driver-account/detail/:id', component: DriverAccountDetailComponent }, + { path: 'platform-account', component: PlatformAccountComponent }, + { path: 'platform-account/detail/:id', component: PlatformAccountDetailComponent }, + { path: 'recharge-record', component: RechargeRecordComponent }, + { path: 'withdrawals-record', component: WithdrawalsRecordComponent }, + { path: 'withdrawals-record/detail/:id', component: WithdrawalsDetailComponent }, + { path: 'refund-record', component: RefundRecordComponent }, + { path: 'voucher-management', component: VoucherManagementComponent }, + { path: 'voucher-management/detail/:id', component: VoucherDetailComponent }, + { path: 'voucher-summary', component: VoucherSummaryComponent }, + { path: 'voucher-summary/detail/:id', component: SummaryDetailComponent }, + { path: 'voucher-summary/list/:id', component: VoucherListComponent }, + { path: 'voucher-summary/list/detail/:id', component: VoucherDetailComponent }, + { path: 'cost-management', component: CostManagementComponent }, + { path: 'cost-management/detail/:id', component: CostManagementDetailComponent }, + { path: 'cost-management/expenses-receivable/:id', component: ExpensesReceivableComponent }, + { path: 'cost-management/expenses-payable/:id', component: ExpensesPayableComponent }, + { path: 'abnormal-gold', component: AbnormalGoldComponent }, + { path: 'abnormal-gold/detail/:id', component: AbnormalGoldDetailComponent }, + { path: 'payment-record', component: PaymentRecordComponent }, + { path: 'transaction-flow', component: TransactionFlowComponent }, + { path: 'payment-order', component: PaymentOrderComponent }, + { path: 'payment-order/detail/:id', component: PaymentOrderDetailComponent }, + { path: 'receipt-order', component: ReceiptOrderComponent }, + { path: 'receipt-order/detail/:id', component: ReceiptOrderDetailComponent }, + { path: 'advance-collection', component: AdvanceCollectionComponent }, + { path: 'advance-collection/detail/:id', component: AdvanceCollectionDetailComponent }, + { path: 'receivable-order', component: ReceivableOrderComponent }, + { path: 'receivable-order/detail/:id', component: ReceivableOrderDetailComponent }, + { path: 'payable-order', component: PayableOrderComponent }, + { path: 'payable-order/detail/:id', component: PayableOrderDetailComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class FinancialManagementRoutingModule {} diff --git a/src/app/routes/financial-management/financial-management.module.ts b/src/app/routes/financial-management/financial-management.module.ts new file mode 100644 index 00000000..c17c335d --- /dev/null +++ b/src/app/routes/financial-management/financial-management.module.ts @@ -0,0 +1,80 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FreightAccountComponent } from './components/freight-account/freight-account.component'; +import { DriverAccountComponent } from './components/driver-account/driver-account.component'; +import { RechargeRecordComponent } from './components/recharge-record/recharge-record.component'; +import { WithdrawalsRecordComponent } from './components/withdrawals-record/withdrawals-record.component'; +import { SharedModule } from '@shared'; +import { FinancialManagementRoutingModule } from './financial-managemen-routing.module'; +import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; +import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; +import { WithdrawalsDetailComponent } from './components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; +import { CostManagementComponent } from './components/cost-management/cost-management.component'; +import { AbnormalGoldComponent } from './components/abnormal-gold/abnormal-gold.component'; +import { PaymentRecordComponent } from './components/payment-record/payment-record.component'; +import { TransactionFlowComponent } from './components/transaction-flow/transaction-flow.component'; +import { ClearingModalComponent } from './components/abnormal-gold/clearing-modal/clearing-modal.component'; +import { CostManagementDetailComponent } from './components/cost-management/cost-management-detail/cost-management-detail.component'; +import { ExpensesReceivableComponent } from './components/cost-management/expenses-receivable/expenses-receivable.component'; +import { ExpensesPayableComponent } from './components/cost-management/expenses-payable/expenses-payable.component'; +import { PaymentOrderComponent } from './components/payment-order/payment-order.component'; +import { ReceiptOrderComponent } from './components/receipt-order/receipt-order.component'; +import { VoucherManagementComponent } from './components/voucher-management/voucher-management.component'; +import { VoucherSummaryComponent } from './components/voucher-summary/voucher-summary.component'; +import { ReceivableOrderComponent } from './components/receivable-order/receivable-order.component'; +import { PayableOrderComponent } from './components/payable-order/payable-order.component'; +import { ReceivableOrderDetailComponent } from './components/receivable-order/receivable-order-detail/receivable-order-detail.component'; +import { PayableOrderDetailComponent } from './components/payable-order/payable-order-detail/payable-order-detail.component'; +import { VoucherDetailComponent } from './components/voucher-management/voucher-detail/voucher-detail.component'; +import { SummaryDetailComponent } from './components/voucher-summary/summary-detail/summary-detail.component'; +import { PaymentOrderDetailComponent } from './components/payment-order/payment-order-detail/payment-order-detail.component'; +import { VoucherListComponent } from './components/voucher-summary/voucher-list/voucher-list.component'; +import { ReceiptOrderDetailComponent } from './components/receipt-order/receipt-order-detail/receipt-order-detail.component'; +import { PlatformAccountComponent } from './components/platform-account/platform-account.component'; +import { PlatformAccountDetailComponent } from './components/platform-account/platform-account-detail/platform-account-detail.component'; +import { AdvanceCollectionComponent } from './components/advance-collection/advance-collection.component'; +import { AdvanceCollectionDetailComponent } from './components/advance-collection/advance-collection-detail/advance-collection-detail.component'; +import { RefundRecordComponent } from './components/refund-record/refund-record.component'; +import { AbnormalGoldDetailComponent } from './components/abnormal-gold/abnormal-gold-detail/abnormal-gold-detail.component'; + +const ROUTESCOMPONENTS = [ + FreightAccountComponent, + DriverAccountComponent, + RechargeRecordComponent, + WithdrawalsRecordComponent, + WithdrawalsDetailComponent, + AbnormalGoldComponent, + PaymentRecordComponent, + TransactionFlowComponent, + CostManagementComponent, + CostManagementDetailComponent, + ExpensesReceivableComponent, + ExpensesPayableComponent, + PaymentOrderComponent, + ReceiptOrderComponent, + VoucherManagementComponent, + VoucherDetailComponent, + VoucherSummaryComponent, + SummaryDetailComponent, + ReceivableOrderComponent, + PayableOrderComponent, + ReceivableOrderDetailComponent, + PayableOrderDetailComponent, + PlatformAccountComponent, + PlatformAccountDetailComponent, + PaymentOrderDetailComponent, + VoucherListComponent, + ReceiptOrderDetailComponent, + AdvanceCollectionComponent, + AdvanceCollectionDetailComponent, + RefundRecordComponent, + AbnormalGoldDetailComponent +]; + +const NOTROUTECOMPONENTS = [DriverAccountDetailComponent, FreightAccountDetailComponent, ClearingModalComponent]; + +@NgModule({ + declarations: [...ROUTESCOMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, FinancialManagementRoutingModule, SharedModule] +}) +export class FinancialManagementModule {} diff --git a/src/app/routes/financial-management/services/freight-account.service.ts b/src/app/routes/financial-management/services/freight-account.service.ts new file mode 100644 index 00000000..e6b17887 --- /dev/null +++ b/src/app/routes/financial-management/services/freight-account.service.ts @@ -0,0 +1,237 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-18 15:57:44 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-11 14:26:38 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\financial-management\\services\\freight-account.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService, EACacheService, ShipperBaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class FreightAccountService extends ShipperBaseService { + $mock_url = '/rule?_allow_anonymous=true'; + + // 运营端获取货主账户信息 + $api_get_shipper_account_page = '/api/fcc/accountBalance/getShipperAccountBalanceByOperator'; + // 运营端获取司机账户信息 + $api_get_driver_account_page = '/api/fcc/accountBalance/getDriverAccountBalanceByOperator'; + + // 运营端获取平台余额 + $api_get_platform_account_header = '/api/fcc/accountBalance/getPlatformBalanceByOperator'; + // 运营端获取平台余额 + $api_get_platform_account_statistics = '/api/fcc/accountBalanceDetail/getAccountBalancePlatformIncomeDetailByOperator'; + // 运营端获取平台余额 + $api_get_platform_account_page = '/api/fcc/accountBalance/getPlatformAccountBalanceByOperator'; + // 运营端获取账户余额交易明细 + $api_get_platform_account_detail_page = '/api/fcc/accountBalanceDetail/getAccountBalanceByPage'; + + // 运营端获取货主账户明细信息 + $api_get_shipper_account_detail = '/api/fcc/accountBalanceDetail/getAccountBalanceShipperByOperatorPage'; + // 运营端获取司机账户明细信息 + $api_get_driver_account_detail = '/api/fcc/accountBalanceDetail/getAccountBalanceDriverByOperatorPage'; + // 运营端端获取货主交易收入与支出金额 + $api_get_shipper_account_balance_detail = '/api/fcc/accountBalanceDetail/getAccountBalanceShipperIncomeDetailByOperator'; + // 运营端端获取司机交易收入与支出金额 + $api_get_driver_account_balance_detail = '/api/fcc/accountBalanceDetail/getAccountBalanceDriverIncomeDetailByOperator'; + // 运营端导出司机账户明细信息 + $api_export_driver_account_page = '/api/fcc/accountBalance/exportDriverAccountBalanceByOperator'; + + // 货主端获取账户余额交易明细 + $api_get_balance_by_shipper = '/api/fcc/accountBalanceDetail/getAccountBalanceByShipperPage'; + // 运营端导出货主账户明细信息 + $api_export_shipper = '/api/fcc/accountBalance/reportShipperAccountBalanceByOperator'; + + // 查询订单支付申请表 + $api_get_order_payment_page = '/api/fcc/billPaymentApplicationOBC/list/page'; + + // 查询提现申请表 + $api_get_refund_page = '/api/fcc/refundApplicationOBC/list/page'; + // 获取提现申请表详情 + $api_get_refund_detail = '/api/fcc/refundApplicationOBC/get'; + // 获取提现支付详情 + $api_get_refund_detail_page = '/api/fcc/refundApplicationOBC/get/getPayList'; + // 提现支付详情导出 + $api_export_refund_detail_page = '/api/fcc/refundApplicationOBC/asyncExportPayList'; + // 同意提现 + $api_agree_refund = '/api/fcc/refundApplicationOBC/agreeRefund'; + // 拒绝提现 + $api_disagree_refund = '/api/fcc/refundApplicationOBC/disagreeRefund'; + + // 查询订单退款申请表 + $api_get_refund_record_page = '/api/fcc/billRefundApplication/list/page'; + // 同意退款 + $api_agree_refund_record = '/api/fcc/billRefundApplication/agreeRefund'; + // 不同意退款 + $api_disagree_refund_record = '/api/fcc/billRefundApplication/disagreeRefund'; + // 重新发起 + $api_rebulid_refund_record = '/api/fcc/billRefundApplication/rebulid'; + + // 查询充值信息表 + $api_get_recharge_page = '/api/fcc/rechargeInfo/list/getPageByOperator'; + // 查询异常入金 + $api_get_abnormal_gold_page = '/api/fcc/rechargeInfo/list/page'; + // 运营端获取账户余额交易明细 + $api_get_account_blance = '/api/fcc/accountBalanceDetail/getAccountBalanceByPage'; + // 添加备注 + $api_edit_remark = '/api/fcc/rechargeInfo/addRemark'; + + // 查询费用单抬头 + $api_get_cost_page = '/api/fcc/ficoFeeH/list/page'; + // 根据费用头ID查询费用单及开票明细 + $api_get_cost_detail = '/api/fcc/ficoFeeL/detail'; + // 费用关联的应收核销明细 + $api_get_cost_ahxl_detail = '/api/fcc/ficoAhxL/getListByFeeLId'; + + // 查询应收核销抬头 + $api_get_fico_page = '/api/fcc/ficoAhxH/list/page'; + // 应收核销汇总 + $api_get_fico_sum = '/api/fcc/ficoAhxH/getSum'; + // 获取应收核销抬头 + $api_get_fico_header = '/api/fcc/ficoAhxH/get'; + // 查询应收核销明细 + $api_get_fico_detail_header = '/api/fcc/ficoAhxL/list/page'; + + // 查询应付核销抬头 + $api_get_fico_ph_page = '/api/fcc/ficoPhxH/list/page'; + // 应付核销汇总 + $api_get_fico_ph_sum = '/api/fcc/ficoPhxH/getSum'; + // 获取应付核销抬头 + $api_get_fico_ph_header = '/api/fcc/ficoPhxH/get'; + // 查询应付核销明细 + $api_get_fico_ph_detail_header = '/api/fcc/ficoPhxL/list/page'; + + // 查询总账凭证表 + $api_get_fico_vch_page = '/api/fcc/ficoVcH/list/page'; + // 导出总账凭证表 + $api_export_fico_vch_page = '/api/fcc/ficoVcH/reportVchListPage'; + // 获取总账凭证表详情信息 + $api_get_fico_vch__detail = '/api/fcc/ficoVcH/getDetail'; + + // 查询付款单抬头 + $api_get_payment_page = '/api/fcc/ficoPayH/listFicoPayHPage'; + // 查询付款单明细 + $api_get_payment_detail = '/api/fcc/ficoPayL/list/page'; + // 付款单抬头信息 + $api_get_payment_header = '/api/fcc/ficoPayH/getFicoPayHById'; + + // 查询收款单抬头 + $api_get_receipt_page = '/api/fcc/ficoBrmH/list/page'; + // 收款单抬头信息 + $api_get_receipt_header = '/api/fcc/ficoBrmH/get'; + // 获取收款单抬头 + $api_get_receipt_detail = '/api/fcc/ficoBrmYsk/getListByBrmHid'; + + // 收款单浏览抬头 + $api_get_ficoInpinvL_page = '/api/fcc/ficoBrmH/get'; + // 收款单浏览表格明细 + $api_get_ficoInpinvL_getListByBrmHid = '/api/fcc/ficoBrmYsk/getListByBrmHid'; + + // 下载银行回单请求 + $api_download_receipt_apply = '/api/fcc/spd/callback/receiptApply'; + $api_download_receipt_apply_byte = '/api/fcc/spd/callback/receiptApplyByte'; + + // 查询预收款余额 + $api_get_advance_collection_page = '/api/fcc/ficoYskBla/list/page'; + // 根据预收款ID获取收款单抬头 + $api_get_advance_collection_header = '/api/fcc/ficoBrmH/getByYskblaId'; + // 根据预收款ID获取收款单明细 + $api_get_advance_collection_detail = '/api/fcc/ficoBrmYsk/getBrmYskByYskblaId'; + // 根据预收款ID获取核销信息明细 + $api_get_advance_collection_hrxiao = '/api/fcc/ficoAhxH/getAhxHByYskblaId'; + + // 运营导出充值信息 充值记录导出 + $api_get_exportPageByOperator = '/api/fcc/rechargeInfo/exportPageByOperator'; + // 运营端导出交易流水明细 + $api_get_exportAccountBalanceDetailPage = '/api/fcc/accountBalanceDetail/exportAccountBalanceDetailPage'; + // 运营端导出平台账户余额交易明细 + $api_get_exportAccountBalanceByPage = '/api/fcc/accountBalanceDetail/exportAccountBalanceByPage'; + // 运营端导出司机账户余额交易明细 + $api_get_exportAccountBalanceDriverByOperatorPage = '/api/fcc/accountBalanceDetail/exportAccountBalanceDriverByOperatorPage'; + // 运营端导出货主账户余额交易明细 + $api_get_exportAccountBalanceShipperByOperatorPage = '/api/fcc/accountBalanceDetail/exportAccountBalanceShipperByOperatorPage'; + // 运营端导出导出货主账户 + $api_get_exportShipperAccountBalanceByOperator = '/api/fcc/accountBalance/exportShipperAccountBalanceByOperator'; + // 运营端导出导出平台账户信息 + $api_get_exportPlatformAccountBalanceByOperator = '/api/fcc/accountBalance/exportPlatformAccountBalanceByOperator'; + // 导出预收款余额 + $api_get_reportYskBla = '/api/fcc/ficoYskBla/reportYskBla'; + + // 查询异常入金充值信息 + $api_get_getAbnormalAmountPage = '/api/fcc/rechargeInfo/list/getAbnormalAmountPage'; + // 查询异常入金充值信息详情 + $api_get_getAbnormalAmount_detail = '/api/fcc/rechargeInfo/get'; + + // 异步导出运营后台异常入金列表 + $api_get_exportAbnormalAmountPage = '/api/fcc/rechargeInfo/exportAbnormalAmountPage'; + // 异步导出运营后台退款记录列表 + $api_get_asyncExportBillRefundApplicationList = '/api/fcc/billRefundApplication/asyncExportBillRefundApplicationList'; + // 异步导出运营后台支付记录列表 + $api_get_asyncExportBillPaymentApplicationList = '/api/fcc/billPaymentApplicationOBC/asyncExportBillPaymentApplicationList'; + // 异步导出运营后台提现记录 + $api_get_asyncExportRefundApplicationList = '/api/fcc/refundApplicationOBC/asyncExportRefundApplicationList'; + + constructor(public injector: Injector) { + super(injector); + } + + getReceiptUrl(url: string, params: any) { + const { bankType, snglFlgCd } = params; + if (url) { + if (params?.bankType === '1') { + window.open(url); + } else if (params?.bankType === '2') { + window.open(url); + // this.exportFile({ bankType, receiptUrl: url, bankSerialNumber: snglFlgCd }, this.$api_download_receipt_apply_byte); + } + } else { + this.request(this.$api_download_receipt_apply, { ...params }).subscribe(res => { + if (res?.receiptUrl) { + if (bankType === '1') { + window.open(res?.receiptUrl); + } else if (bankType === '2') { + window.open(res?.receiptUrl); + // this.downloadFile(this.$api_download_receipt_apply_byte, { + // bankType, + // receiptUrl: res.receiptUrl, + // bankSerialNumber: snglFlgCd + // }); + } + } else { + this.msgSrv.warning(res.statusMsg || '获取回单失败'); + } + }); + } + } + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + // 获取企业CRM信息 + public $api_crm_enterpriceList = '/api/mdc/cuc/enterprise/getCrmSelectList'; + reviewPDF(url: string) { + if (!url) { + return; + } + this.openURL(url); + // const uA = window.navigator.userAgent; // 判断浏览器内核 + // const isIE = + // /msie\s|trident\/|edge\//i.test(uA) && + // !!('uniqueID' in document || 'documentMode' in document || 'ActiveXObject' in window || 'MSInputMethodContext' in window); + // const objectUrl = url; + // const a = document.createElement('a'); + // document.body.appendChild(a); + // a.href = objectUrl; + // a.download = `回单.pdf`; + // if (isIE) { + // // 兼容IE11无法触发下载的问题 + // (navigator as any).msSaveBlob(url, a.download); + // } else { + // a.click(); + // } + // a.remove(); + } +} diff --git a/src/app/routes/insurance-management/components/list/list.component.html b/src/app/routes/insurance-management/components/list/list.component.html new file mode 100644 index 00000000..6392b20b --- /dev/null +++ b/src/app/routes/insurance-management/components/list/list.component.html @@ -0,0 +1,133 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + +
    + + + {{ item.resourceCode | currency }} + + + {{ item.practicalPremium | currency }} + + + {{ item.insureAmount | currency }} + + + {{ item.premium | currency }} + + + {{ item.processResult == '2' ? item.processMessage : '' }} + + +
    {{ item?.driverName }}/{{ item?.driverTelephone }}/{{ item?.carNo }}
    +
    + +
    + {{ item?.distance ? ((item?.distance)/1000).toFixed(4) + '公里' : '' }} +
    +
    + +
    + {{ item?.billCode }} +
    +
    + +
    + {{ item?.resourceCode }} +
    +
    + {{ item?.resourceStatusLabel }} +
    +
    + +
    {{ item.insureCode }}
    +
    + {{ item?.insureStatusLabel }} +
    +
    + +
    {{ item?.goodsInfoName }}
    +
    + {{ item?.weight ? item?.weight + '吨/' : '' }} + {{ item?.volume ? item?.volume + '方' : '' }} + {{ item?.number ? item?.number + '件' : '' }} +
    +
    + +
    +

    + {{ data.expenseName }}:{{ data.price | currency }} + {{ data.paymentStatusLabel }} +

    +
    +
    +
    +
    +
    + + +
    + +
    +
    diff --git a/src/app/routes/insurance-management/components/list/list.component.less b/src/app/routes/insurance-management/components/list/list.component.less new file mode 100644 index 00000000..149a0bc9 --- /dev/null +++ b/src/app/routes/insurance-management/components/list/list.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/insurance-management/components/list/list.component.spec.ts b/src/app/routes/insurance-management/components/list/list.component.spec.ts new file mode 100644 index 00000000..1cb2cef1 --- /dev/null +++ b/src/app/routes/insurance-management/components/list/list.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:03:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-25 17:22:11 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\insurance-management\\components\\list\\list.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { insuranceManagementListComponent } from './list.component'; + +describe('insuranceManagementListComponent', () => { + let component: insuranceManagementListComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ insuranceManagementListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(insuranceManagementListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/insurance-management/components/list/list.component.ts b/src/app/routes/insurance-management/components/list/list.component.ts new file mode 100644 index 00000000..4655ee58 --- /dev/null +++ b/src/app/routes/insurance-management/components/list/list.component.ts @@ -0,0 +1,574 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { Router } from '@angular/router'; +import { InsuranceManagementService } from '../../services/insurance-management.service'; +import { VehicleImgViewComponent } from 'src/app/routes/vehicle/components/list/img-view/img-view.component'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; + +@Component({ + selector: 'app-insurance-management-list', + templateUrl: './list.component.html', + styleUrls: ['./list.component.less'] +}) +export class insuranceManagementListComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + demoValue: any; + resourceStatus: any; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + } + ]; + tabs = { + totalCount: 0, + receivedQuantity: 0, + stayQuantity: 0, + GoingQuantity: 0, + cancelQuantity: 0 + }; + constructor( + public service: InsuranceManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router, + private modale: ModalHelper, + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.insureStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + }, + recordTime: { + start: this.sf?.value?.recordTime?.[0] || '', + end: this.sf?.value?.recordTime?.[1] || '' + }, + insureTime: { + start: this.sf?.value?.insureTime?.[0] || '', + end: this.sf?.value?.insureTime?.[1] || '' + }, + }; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + getGoodsSourceStatistical() { + this.tabs = { + totalCount: 0, + receivedQuantity: 0, + stayQuantity: 0, + GoingQuantity: 0, + cancelQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.insureStatus; + this.service.request(this.service.$api_listStatisticalStatus, params).subscribe((res: any) => { + if (res) { + let totalCount = 0; + res.forEach((element: any) => { + if (element.insureStatusLabel === '待投保') { + this.tabs.receivedQuantity = element.quantity; + } else if (element.insureStatusLabel === '已投保') { + this.tabs.stayQuantity = element.quantity; + } else if (element.insureStatusLabel === '投保失败') { + this.tabs.GoingQuantity = element.quantity; + } else if (element.insureStatusLabel === '已取消') { + this.tabs.cancelQuantity = element.quantity; + } + totalCount += element.quantity; + }); + this.tabs.totalCount = totalCount; + } + }); + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + ngOnInit(): void { + this.getGoodsSourceStatistical(); + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + insureCode: { + type: 'string', + title: '投保编号' + }, + billCode: { + type: 'string', + title: '订单号' + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + policyNo: { + type: 'string', + title: '保单号', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + }, + } + }, + insureType: { + title: '类型', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'insure:type' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + startAddress: { + type: 'string', + title: '始发地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + endAddress: { + type: 'string', + title: '目的地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema + }, + + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + insureStatus: { + title: '投保状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'insure:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + insureRefundStatus: { + title: '退款状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'insure:refund:status' }, + containsAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + insureTime: { + title: '投保时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + recordTime: { + title: '录单时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '投保编号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'insureCode' + }, + { + title: '保单号', + width: '250px', + className: 'text-right', + index: 'policyNo' + }, + { title: '类型', index: 'insureTypeLabel', width: '220px', className: 'text-left' }, + { title: '始发地', index: 'startAddress', width: '220px', className: 'text-left' }, + { title: '目的地', index: 'endAddress', width: '220px', className: 'text-left' }, + { title: '距离', render: 'distance', width: '180px', className: 'text-left' }, + { title: '保额(元)', render: 'insureAmount', width: '180px', className: 'text-right' }, + { title: '保费(元)', render: 'premium', width: '180px', className: 'text-right' }, + // { + // title: '实际保费(元)', + // className: 'text-right', + // width: '180px', + // render: 'practicalPremium' + // }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsName' + }, + { + title: '承运司机', + className: 'text-right', + width: '250px', + render: 'driverName' + }, + { + title: '关联订单号', + className: 'text-right', + render: 'goodsNumber', + width: '180px' + }, + { + title: '货源编号', + className: 'text-right', + render: 'resourceCode', + width: '150px' + }, + { + title: '网络货运人', + className: 'text-left', + width: '250px', + index: 'enterpriseInfoName' + }, + { + title: '货主', + className: 'text-left', + width: '250px', + index: 'shipperAppUserName' + }, + { + title: '所属项目', + width: '250px', + className: 'text-left', + index: 'enterpriseProjectName' + }, + { + title: '投保时间', + width: '180px', + className: 'text-left', + index: 'insureTime' + }, + { + title: '生效时间', + width: '180px', + className: 'text-left', + index: 'effectTime' + }, + { + title: '录单时间', + width: '180px', + className: 'text-left', + index: 'recordTime' + }, + { + title: '创建时间', + width: '180px', + className: 'text-left', + index: 'createTime' + }, + { + title: '失败原因', + width: '180px', + className: 'text-left', + render: 'processMessage', + // processResult=2 + }, + { + title: '退款状态', + width: '180px', + className: 'text-left', + index: 'insureRefundStatusLabel', + // processResult=2 + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '查看保单', + click: _record => this.showImg(_record), + iif: item => item.insureStatus == '2' + // acl: { ability: ['VEHICLE-LIST-view'] }, + // iif: item => + // item.billStatus == '4' || item.billStatus == '5' || item.billStatus == '2' || item.billStatus == '3' || item.billStatus == '1' + }, + { + text: '退保费', + click: _record => this.retreatPrice(_record), + iif: item => item.insureStatus == '2' + // acl: { ability: ['VEHICLE-LIST-view'] }, + } + ] + } + ]; + } + showImg(_record: any) { + // var newUrl=_record.policyUrl.replace('http','https') + // console.log(newUrl); + + // window.open(newUrl,'_self'); + window.open(`${_record.newPolicyUrl}`); + // this.service.downloadFile(`${_record.newPolicyUrl}`) + + + // const params = { + // imgList: [_record.policyUrl], + // index: 0 + // }; + // this.modal.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + // 退保费 + retreatPrice(value: any) { + this.modal.warning({ + nzTitle: '确认退还保费吗?', + nzClosable: true, + nzContent: '退还后不可撤销,请谨慎操作!', + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_get_addINPBillRefundApplication, {id: value.id}).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除菜单成功'); + } + }); + } + }); + } + // 再次投保 + retreatNext(value: any) { + this.modal.warning({ + nzTitle: '确认再次投保吗?', + nzClosable: true, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_del_many, [value.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除菜单成功'); + } + }); + } + }); + } + // 保险配置 + changeOrder() { + this.router.navigate(['/insurance-management/list-set', 1]); + } + exprot() { + this.service.downloadFile(this.service.$api_get_asyncExport, { ...this.reqParams, pageSize: -1 }); + } +} diff --git a/src/app/routes/insurance-management/components/set/set.component.html b/src/app/routes/insurance-management/components/set/set.component.html new file mode 100644 index 00000000..e803c987 --- /dev/null +++ b/src/app/routes/insurance-management/components/set/set.component.html @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/src/app/routes/insurance-management/components/set/set.component.less b/src/app/routes/insurance-management/components/set/set.component.less new file mode 100644 index 00000000..1d17aeb7 --- /dev/null +++ b/src/app/routes/insurance-management/components/set/set.component.less @@ -0,0 +1,94 @@ +:host { + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .source-info { + p { + margin-bottom: .5em; + } + } + + .freight-info-box { + width: 95%; + } + + .freigth-label { + display : inline-block; + width : 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width : 70%; + margin: 0 auto; + } + } + + // .ant-tabs-top>.ant-tabs-nav, + // .ant-tabs-bottom>.ant-tabs-nav, + // .ant-tabs-top>div>.ant-tabs-nav, + // .ant-tabs-bottom>div>.ant-tabs-nav { + // margin: 0; + // } + + // .ant-anchor-ink::before { + // width: 0; + // } + + // .ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab { + // margin-left: 40px + // } + } + + .leftPadding { + padding-right: 100px; + } + .handling-info { + min-height: 100px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/insurance-management/components/set/set.component.spec.ts b/src/app/routes/insurance-management/components/set/set.component.spec.ts new file mode 100644 index 00000000..42437440 --- /dev/null +++ b/src/app/routes/insurance-management/components/set/set.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { insuranceManagementSetComponent } from './set.component'; + +describe('insuranceManagementSetComponent', () => { + let component: insuranceManagementSetComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ insuranceManagementSetComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(insuranceManagementSetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/insurance-management/components/set/set.component.ts b/src/app/routes/insurance-management/components/set/set.component.ts new file mode 100644 index 00000000..7e1055a0 --- /dev/null +++ b/src/app/routes/insurance-management/components/set/set.component.ts @@ -0,0 +1,45 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:20:26 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-25 20:43:37 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\insurance-management\\components\\set\\set.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { InsuranceManagementService } from '../../services/insurance-management.service'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +@Component({ + selector: 'app-insurance-management-set', + templateUrl: './set.component.html', + styleUrls: ['./set.component.less'] +}) +export class insuranceManagementSetComponent implements OnInit { + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private service: InsuranceManagementService, + ) { + + } + + ngOnInit(): void { + this.initData() + } + initData() { + + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/insurance-management/insurance-management-routing.module.ts b/src/app/routes/insurance-management/insurance-management-routing.module.ts new file mode 100644 index 00000000..845a621d --- /dev/null +++ b/src/app/routes/insurance-management/insurance-management-routing.module.ts @@ -0,0 +1,25 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-06 09:24:00 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-25 17:21:54 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\insurance-management\\insurance-management-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { insuranceManagementListComponent } from './components/list/list.component'; +import { insuranceManagementSetComponent } from './components/set/set.component'; + + +const routes: Routes = [ + { path: 'list', component: insuranceManagementListComponent }, + { path: 'list-set/:id', component: insuranceManagementSetComponent }, +] +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class InsuranceManagementRoutingModule { } diff --git a/src/app/routes/insurance-management/insurance-management.module.ts b/src/app/routes/insurance-management/insurance-management.module.ts new file mode 100644 index 00000000..00103336 --- /dev/null +++ b/src/app/routes/insurance-management/insurance-management.module.ts @@ -0,0 +1,23 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-06 09:24:00 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-25 20:45:45 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\insurance-management\\insurance-management.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule, Type } from '@angular/core'; +import { InsuranceTableModule, SharedModule } from '@shared'; +import { insuranceManagementListComponent } from './components/list/list.component'; +import { insuranceManagementSetComponent } from './components/set/set.component'; +import { InsuranceManagementRoutingModule } from './insurance-management-routing.module'; +const COMPONENTS: Type[] = [insuranceManagementListComponent, insuranceManagementSetComponent]; + +@NgModule({ + imports: [SharedModule, InsuranceManagementRoutingModule, InsuranceTableModule], + declarations: COMPONENTS +}) +export class InsuranceManagementModule {} diff --git a/src/app/routes/insurance-management/services/insurance-management.service.ts b/src/app/routes/insurance-management/services/insurance-management.service.ts new file mode 100644 index 00000000..cd35b120 --- /dev/null +++ b/src/app/routes/insurance-management/services/insurance-management.service.ts @@ -0,0 +1,72 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 15:31:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-14 11:43:13 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\insurance-management\\services\\insurance-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { EACacheService, ShipperBaseService } from '@shared'; +import { map } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class InsuranceManagementService extends ShipperBaseService { + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + // 查询保险费信息表 + public $api_premiumInfo_list = '/api/sdc/premiumInfo/list/page'; + // 统计保险单状态数量 + public $api_listStatisticalStatus = '/api/sdc/premiumInfo/listStatisticalStatus'; + + // 保险费公司认证 + $api_get_submitAuthInfo = `/api/sdc/premiumInfo/submitAuthInfo`; + // 退保费 + $api_get_addINPBillRefundApplication = `/billRefundApplication/addINPBillRefundApplication`; + // 保险费列表数据导出接口 + $api_get_asyncExport = `/api/sdc/premiumInfo/asyncExport`; + + public reviewPDF(url: string) { + if (!url) { + return; + } + this.openURL(url); + // const uA = window.navigator.userAgent; // 判断浏览器内核 + // const isIE = + // /msie\s|trident\/|edge\//i.test(uA) && + // !!('uniqueID' in document || 'documentMode' in document || 'ActiveXObject' in window || 'MSInputMethodContext' in window); + // const objectUrl = url; + // const a = document.createElement('a'); + // document.body.appendChild(a); + // console.log('5555'); + + // a.href = objectUrl; + // a.download = '保单.pdf'; + // if (isIE) { + // // 兼容IE11无法触发下载的问题 + // (navigator as any).msSaveBlob(url, a.download); + // } else { + // a.click(); + // } + // a.remove(); + } + getReceiptUrl(url: string, params: any) { + const { bankType, snglFlgCd } = params; + if (url) { + if (params?.bankType === '1') { + window.open(params?.receiptUrl); + } else if (params?.bankType === '2') { + window.open(url); + // this.exportFile({ bankType, receiptUrl: url, bankSerialNumber: snglFlgCd }, this.$api_download_receipt_apply_byte); + } + } + } + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/logs/components/system-logs/system-logs.component.html b/src/app/routes/logs/components/system-logs/system-logs.component.html new file mode 100644 index 00000000..ebbf215b --- /dev/null +++ b/src/app/routes/logs/components/system-logs/system-logs.component.html @@ -0,0 +1,30 @@ + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + diff --git a/src/app/routes/logs/components/system-logs/system-logs.component.ts b/src/app/routes/logs/components/system-logs/system-logs.component.ts new file mode 100644 index 00000000..90caac95 --- /dev/null +++ b/src/app/routes/logs/components/system-logs/system-logs.component.ts @@ -0,0 +1,112 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { LogsService } from '../../services/logs.service'; + +@Component({ + selector: 'app-system-logs', + templateUrl: './system-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class SystemLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + operator: { + type: 'string', + title: '操作人', + ui: { placeholder: '请输入' } + }, + telephone: { + type: 'string', + title: '手机号码', + ui: { placeholder: '请输入' } + }, + operatePage: { + type: 'string', + title: '操作页面', + ui: { + placeholder: '请输入' + } + }, + operationContent: { + type: 'string', + title: '操作内容', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + time: { + title: '操作时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '操作时间', index: 'operatorTimestamp' }, + { title: '操作人', index: 'operator' }, + { title: '操作人手机号码', index: 'telephone' }, + { title: '操作页面', index: 'operatePage' }, + { title: '操作内容', index: 'operationContent' } + ]; + + _$expand = false; + + constructor(public service: LogsService) {} + + ngOnInit(): void { + } + + beforeReq = (requestOptions: STRequestOptions) => { + requestOptions.body.operateType = '1'; + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + operateType: '1', + endTime: this.sf.value.time?.[1] || null, + startTime: this.sf.value.time?.[0] || null + }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.html b/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.html new file mode 100644 index 00000000..a1b61545 --- /dev/null +++ b/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.html @@ -0,0 +1,31 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.ts b/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.ts new file mode 100644 index 00000000..53edd71b --- /dev/null +++ b/src/app/routes/logs/components/system-supply-logs/system-supply-logs.component.ts @@ -0,0 +1,91 @@ +/* + * @Author: your name + * @Date: 2022-01-04 14:42:30 + * @LastEditTime: 2022-01-04 16:04:46 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\sys-setting\components\system-supply-logs\system-supply-logs.component.ts + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { LogsService } from '../../services/logs.service'; + +@Component({ + selector: 'app-system-logs', + templateUrl: './system-supply-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class SystemSupplyLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + operateObject: { + type: 'string', + title: '货源编码', + ui: { + placeholder: '请输入', + } + }, + time: { + title: '操作时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + + { title: 'ID', index: 'id' }, + { title: '货源编码', index: 'operateObject' }, + { title: '说明', index: 'operationContent' }, + { title: '操作人', index: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp', type: 'date' }, + ]; + + _$expand = false; + + constructor(public service: LogsService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + requestOptions.body.operateType = '4' + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + operateType: '4', + endTime: this.sf.value.time?.[1] || null, + startTime: this.sf.value.time?.[0] || null + }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.html b/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.html new file mode 100644 index 00000000..c51c7fa9 --- /dev/null +++ b/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.html @@ -0,0 +1,34 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.ts b/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.ts new file mode 100644 index 00000000..f394883f --- /dev/null +++ b/src/app/routes/logs/components/system-waybill-logs/system-waybill-logs.component.ts @@ -0,0 +1,90 @@ +/* + * @Author: your name + * @Date: 2022-01-04 14:44:59 + * @LastEditTime: 2022-01-04 16:05:27 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\sys-setting\components\system-waybill-logs\system-waybill-logs.component.ts + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { LogsService } from '../../services/logs.service'; + +@Component({ + selector: 'app-system-logs', + templateUrl: './system-waybill-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class SystemWaybillLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + operateObject: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + } + }, + time: { + title: '登录时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: 'ID', index: 'id' }, + { title: '订单号', index: 'operateObject' }, + { title: '说明', index: 'operationContent' }, + { title: '操作人', index: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp', type: 'date' }, + ]; + + _$expand = false; + + constructor(public service: LogsService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + requestOptions.body.operateType = '3' + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + operateType: '3', + endTime: this.sf.value.time?.[1] || null, + startTime: this.sf.value.time?.[0] || null + }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/logs/components/user-logs/user-logs.component.html b/src/app/routes/logs/components/user-logs/user-logs.component.html new file mode 100644 index 00000000..ea2aff40 --- /dev/null +++ b/src/app/routes/logs/components/user-logs/user-logs.component.html @@ -0,0 +1,27 @@ + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/logs/components/user-logs/user-logs.component.ts b/src/app/routes/logs/components/user-logs/user-logs.component.ts new file mode 100644 index 00000000..70bf123f --- /dev/null +++ b/src/app/routes/logs/components/user-logs/user-logs.component.ts @@ -0,0 +1,123 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { LogsService } from '../../services/logs.service'; + +@Component({ + selector: 'app-user-logs', + templateUrl: './user-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class UserLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + roleName: { + type: 'string', + title: '登录端口', + ui: { placeholder: '请输入' } + }, + loginType: { + type: 'string', + title: '登录方式', + enum: [ + { label: '全部', value: null }, + { label: 'PC', value: '1' }, + { label: 'APP', value: '2' }, + { label: '小程序', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: null + }, + address: { + type: 'string', + title: '位置', + ui: { + placeholder: '请输入' + } + }, + terminalIp: { + type: 'string', + title: 'ip', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + time: { + title: '登录时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '登录时间', index: 'createTime', type: 'date' }, + { title: '登录端口', index: 'roleName' }, + { title: '姓名', index: 'userName' }, + { title: '登录方式', index: 'loginType', enum: { '1': 'PC', '2': 'APP', '3': '小程序' }, type: 'enum' }, + { title: '位置', index: 'address' }, + { title: 'ip', index: 'terminalIp' } + ]; + + _$expand = false; + + constructor(public service: LogsService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + time: { + start: this.sf.value.time?.[0] || null, + end: this.sf.value.time?.[1] || null + } + }); + } + return requestOptions; + }; + + roleAction(item?: any) {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/logs/components/version-logs/version-logs.component.html b/src/app/routes/logs/components/version-logs/version-logs.component.html new file mode 100644 index 00000000..3eff1b25 --- /dev/null +++ b/src/app/routes/logs/components/version-logs/version-logs.component.html @@ -0,0 +1,40 @@ + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + diff --git a/src/app/routes/logs/components/version-logs/version-logs.component.ts b/src/app/routes/logs/components/version-logs/version-logs.component.ts new file mode 100644 index 00000000..d53bad68 --- /dev/null +++ b/src/app/routes/logs/components/version-logs/version-logs.component.ts @@ -0,0 +1,124 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { LogsService } from '../../services/logs.service'; + +@Component({ + selector: 'app-version-logs', + templateUrl: './version-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class VersionLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + publishPort: { + type: 'string', + title: '端口', + enum: [ + { label: '全部', value: null }, + { label: '司机', value: '1' }, + { label: '货主', value: '2' }, + { label: '运营平台', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: null + }, + publishType: { + type: 'string', + title: '端口方式', + enum: [ + { label: '全部', value: null }, + { label: 'PC ', value: '1' }, + { label: 'APP', value: '2' }, + { label: '小程序', value: '3' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: null + }, + publishVersion: { + type: 'string', + title: '版本号', + ui: { + placeholder: '请输入' + } + }, + time: { + title: '发布时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '端口', index: 'publishPort', type: 'enum', enum: { 1: '司机', 2: '货主', 3: '运营平台' } }, + { title: '端口方式', index: 'publishType', type: 'enum', enum: { 1: 'PC', 2: 'APP', 3: '小程序' } }, + { title: '版本号', index: 'publishVersion' }, + { + title: '发布时间', + index: 'createTime', + type: 'date' + }, + { title: '更新内容', index: 'publicshContext' } + ]; + + _$expand = false; + + constructor(public service: LogsService, private nzModalService: NzModalService) {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + publishTime: { + start: this.sf.value.time?.[0] || null, + end: this.sf.value.time?.[1] || null + } + }); + } + return requestOptions; + }; + + ngOnInit(): void {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/logs/logs-routing.module.ts b/src/app/routes/logs/logs-routing.module.ts new file mode 100644 index 00000000..40e2ccb5 --- /dev/null +++ b/src/app/routes/logs/logs-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { SystemLogsComponent } from './components/system-logs/system-logs.component'; +import { SystemSupplyLogsComponent } from './components/system-supply-logs/system-supply-logs.component'; +import { SystemWaybillLogsComponent } from './components/system-waybill-logs/system-waybill-logs.component'; +import { UserLogsComponent } from './components/user-logs/user-logs.component'; +import { VersionLogsComponent } from './components/version-logs/version-logs.component'; + +const routes: Routes = [ + { path: 'system-logs', component: SystemLogsComponent }, + { path: 'user-logs', component: UserLogsComponent }, + { path: 'version-logs', component: VersionLogsComponent }, + { path: 'system-supply-logs', component: SystemSupplyLogsComponent }, + { path: 'system-waybill-logs', component: SystemWaybillLogsComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class LogsRoutingModule {} diff --git a/src/app/routes/logs/logs.module.ts b/src/app/routes/logs/logs.module.ts new file mode 100644 index 00000000..6454841b --- /dev/null +++ b/src/app/routes/logs/logs.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared'; +import { LogsRoutingModule } from './logs-routing.module'; +import { SystemLogsComponent } from './components/system-logs/system-logs.component'; +import { SystemSupplyLogsComponent } from './components/system-supply-logs/system-supply-logs.component'; +import { SystemWaybillLogsComponent } from './components/system-waybill-logs/system-waybill-logs.component'; +import { UserLogsComponent } from './components/user-logs/user-logs.component'; +import { VersionLogsComponent } from './components/version-logs/version-logs.component'; + +const COMPONENTS = [SystemLogsComponent, UserLogsComponent, VersionLogsComponent, SystemSupplyLogsComponent, SystemWaybillLogsComponent]; +@NgModule({ + declarations: [...COMPONENTS], + imports: [CommonModule, LogsRoutingModule, SharedModule] +}) +export class LogsModule {} diff --git a/src/app/routes/logs/services/logs.service.ts b/src/app/routes/logs/services/logs.service.ts new file mode 100644 index 00000000..1c0a9489 --- /dev/null +++ b/src/app/routes/logs/services/logs.service.ts @@ -0,0 +1,19 @@ +import { Injectable, Injector } from '@angular/core'; +import { Menu } from '@delon/theme'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class LogsService extends BaseService { + // 查询用户登录记录表 + public $api_user_login_logs = '/api/mdc/userLoginLog/list/page'; + // 获取操作日志列表 + public $api_get_systemt_logs = '/api/mdc/pbc/operationLogRecords/getOperationLogRecordsList'; + // 查询版本发布表 + public $api_get_version_logs = '/api/mdc/versionPublish/list/page'; + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/menu-manager/components/api-auth/api-auth.component.html b/src/app/routes/menu-manager/components/api-auth/api-auth.component.html new file mode 100644 index 00000000..f1d7c7f0 --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/api-auth.component.html @@ -0,0 +1,75 @@ + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + + + + + + + + + + 菜单名称 + 菜单编号 + 路由地址 + 菜单图标 + 菜单排序 + 操作 + + + + + + + + + {{ item.text }} + + {{ item.keyCode }} + {{ item.link }} + + + + {{ item.sorted }} + + 权限配置 + + + + + + + \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/api-auth/api-auth.component.less b/src/app/routes/menu-manager/components/api-auth/api-auth.component.less new file mode 100644 index 00000000..b83ce9ee --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/api-auth.component.less @@ -0,0 +1,17 @@ +:host { + ::ng-deep { + .pane-content-left { + padding-right: 12px; + + nz-select { + width: 100%; + margin-bottom: 1rem; + border-bottom: 2px solid #15408e; + } + } + .pane-content-right { + padding-left: 12px; + } + } + } + \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/api-auth/api-auth.component.ts b/src/app/routes/menu-manager/components/api-auth/api-auth.component.ts new file mode 100644 index 00000000..c61cab04 --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/api-auth.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema } from '@delon/form'; +import { EAEnvironmentService } from '@shared'; +import { NzDrawerService } from 'ng-zorro-antd/drawer'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { MenuManagerService } from '../../services/menu-manager.service'; +import { MenuModalComponent } from '../index/menu-modal/menu-modal.component'; +import { AuthDrawerComponent } from './auth-drawer/auth-drawer.component'; + +@Component({ + selector: 'app-api-auth', + templateUrl: './api-auth.component.html', + styleUrls: ['./api-auth.component.less', '../../../commom/less/box.less'] +}) +export class ApiAuthComponent implements OnInit { + selectedPlatform!: { name: string; appId: string; enName: string }; + platforms: Array = [ + { name: '货主PC', appId: 'A48F72F0A304427F921794BAD86B3522', enName: 'tms-smc-web' }, + { name: '运营后台', appId: this.envSrv.env.appId, enName: 'tms-obc-web' } + ]; + + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + roleName: { + type: 'string', + title: '菜单名称', + ui: { placeholder: '请输入' } + } + } + }; + + mapOfExpandedData: { [key: string]: any[] } = {}; + listOfMapData: any[] = []; + constructor(private envSrv: EAEnvironmentService, public service: MenuManagerService, private drawer: NzDrawerService) { + this.initData(); + } + + ngOnInit(): void {} + + initData(): void { + this.selectedPlatform = this.platforms[0]; + this.loadMemu(this.selectedPlatform.appId); + } + + loadMemu(appId: string) { + this.service.request(this.service.$api_get_all, { appId }, 'POST', false).subscribe(res => { + if (res) { + this.listOfMapData = res; + this.listOfMapData.forEach(item => { + this.mapOfExpandedData[item.key] = this.service.convertTreeToList(item); + }); + // console.log(this.listOfMapData, this.mapOfExpandedData); + } + }); + } + + changeMemu(key: number) { + this.selectedPlatform = this.platforms[key]; + this.loadMemu(this.selectedPlatform.appId); + } + + openDrawer(item: any) { + this.drawer.create({ + nzTitle: `接口权限配置(${item.text})`, + nzContent: AuthDrawerComponent, + nzWidth: 900, + nzContentParams: { id: item.id, appId: this.selectedPlatform.appId, code: item.keyCode } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.html b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.html new file mode 100644 index 00000000..935bee97 --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.html @@ -0,0 +1,38 @@ +
    +
    + +
    +
    + + +
    +
    + +
    + +
    + + + +

    + {{code}}-{{item.permissionsCode}}

    +
    +
    + + + +
    + + + + + + + + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.less b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.less new file mode 100644 index 00000000..40e50505 --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.less @@ -0,0 +1,6 @@ +:host:ng-deep { + st-td { + word-break: break-all; + word-wrap : break-word; + } +} \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.ts b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.ts new file mode 100644 index 00000000..a2895ba9 --- /dev/null +++ b/src/app/routes/menu-manager/components/api-auth/auth-drawer/auth-drawer.component.ts @@ -0,0 +1,154 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { MenuManagerService } from '../../../services/menu-manager.service'; + +@Component({ + selector: 'app-auth-drawer', + templateUrl: './auth-drawer.component.html', + styleUrls: ['./auth-drawer.component.less'] +}) +export class AuthDrawerComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('configTypeItemModal', { static: false }) + configTypeItemModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + id = null; + appId = ''; + code = ''; + + functionInfo: any = {}; + functions: any[] = []; + isDisabled = false; + + constructor(public service: MenuManagerService, private modal: NzModalService) {} + + ngOnInit(): void { + // this.loadFunctions(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { id: this.id }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + return requestOptions; + }; + + loadFunctions() { + this.service.request(this.service.$api_get_functions, { appId: this.appId }, 'POST', false).subscribe(res => { + if (res) { + this.functions = res; + } + }); + } + + functionAction(item?: any, isDisabled = false) { + if (item) { + this.functionInfo = { ...item, id: item.functionButtonId }; + } else { + this.functionInfo = {}; + } + this.isDisabled = isDisabled; + const modal = this.modal.create({ + nzTitle: item ? '编辑' : '新增', + nzContent: this.configTypeItemModal, + nzWidth: 800, + nzCancelText: '取消', + nzOkText: '保存', + nzOnOk: () => { + this.service.request(this.service.$api_save_menu_function, { ...this.functionInfo, functionId: this.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success(item ? '编辑成功' : '新增成功'); + this.st.load(1); + modal.destroy(); + } + }); + return false; + } + }); + } + + deleteAuth(item: any) { + const modal = this.modal.warning({ + nzTitle: '是否确定删除该权限', + nzOnOk: () => { + this.service.request(this.service.$api_delete_menu_function, [item.functionButtonId]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功'); + this.st.load(1); + modal.destroy(); + } else { + this.service.msgSrv.error('删除失败'); + } + }); + return false; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + private initSF(): SFSchema { + return { + properties: { + vc2code: { + type: 'string', + title: '权限名称', + ui: { + autocomplete: 'off', + placeholder: '请输入权限名称' + } + }, + vc2c2ode: { + type: 'string', + title: '权限编号', + ui: { + autocomplete: 'off', + placeholder: '请输入权限编号' + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '权限名称', index: 'permissionsName', width: 120 }, + { title: '权限编码', render: 'permissionsCode' }, + { title: '权限路径', index: 'permissionsUrl', className: 'break-word-all', width: 200 }, + { + title: '操作', + width: '150px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: item => this.functionAction(item, true) + }, + { + text: '编辑', + click: item => this.functionAction(item) + }, + { + text: '删除', + click: item => this.deleteAuth(item) + } + ] + } + ]; + } +} diff --git a/src/app/routes/menu-manager/components/index/index.component.html b/src/app/routes/menu-manager/components/index/index.component.html new file mode 100644 index 00000000..8b1acd73 --- /dev/null +++ b/src/app/routes/menu-manager/components/index/index.component.html @@ -0,0 +1,101 @@ + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + + 菜单名称 + 菜单编号 + 路由地址 + 菜单图标 + 菜单排序 + 操作 + + + + + + + + + {{ item.title }} + + {{ item.keyCode }} + {{ item.link }} + + + + + + + {{ item.sorted }} + + 查看 + + 编辑 + + 删除 + + + 新增子项 + + + + + + + +
    \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/index/index.component.less b/src/app/routes/menu-manager/components/index/index.component.less new file mode 100644 index 00000000..c801e37d --- /dev/null +++ b/src/app/routes/menu-manager/components/index/index.component.less @@ -0,0 +1,16 @@ +:host { + ::ng-deep { + .pane-content-left { + padding-right: 12px; + + nz-select { + width: 100%; + margin-bottom: 1rem; + border-bottom: 2px solid #15408e; + } + } + .pane-content-right { + padding-left: 12px; + } + } +} diff --git a/src/app/routes/menu-manager/components/index/index.component.ts b/src/app/routes/menu-manager/components/index/index.component.ts new file mode 100644 index 00000000..2f9b1306 --- /dev/null +++ b/src/app/routes/menu-manager/components/index/index.component.ts @@ -0,0 +1,140 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { Menu, ModalHelper } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SettingRoleEditComponent } from 'src/app/routes/sys-setting/components/role-management/edit/edit.component'; +import { MenuManagerMenusortComponent } from '../menusort/menusort.component'; +import { MenuManagerService } from './../../services/menu-manager.service'; +import { MenuModalComponent } from './menu-modal/menu-modal.component'; + +@Component({ + selector: 'app-menu-manager-components-index', + templateUrl: './index.component.html', + styleUrls: ['./index.component.less', '../../../commom/less/box.less'] +}) +export class MenuManagerComponentsIndexComponent implements OnInit { + selectedPlatform!: { name: string; appId: string; enName: string }; + platforms: Array = [ + { name: '货主PC', appId: 'A48F72F0A304427F921794BAD86B3522', enName: 'tms-smc-web' }, + { name: '运营后台', appId: this.envSrv.env.appId, enName: 'tms-obc-web' } + ]; + + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + roleName: { + type: 'string', + title: '菜单名称', + ui: { placeholder: '请输入' } + } + } + }; + + mapOfExpandedData: { [key: string]: any[] } = {}; + listOfMapData: any[] = []; + constructor(private envSrv: EAEnvironmentService, public service: MenuManagerService, private modal: NzModalService, private modalHelper: ModalHelper,) { + this.initData(); + } + + ngOnInit(): void {} + + initData(): void { + this.selectedPlatform = this.platforms[0]; + this.loadMemu(this.selectedPlatform.appId); + } + + loadMemu(appId: string) { + this.service.request(this.service.$api_get_all, { appId }, 'POST', false).subscribe(res => { + if (res) { + this.listOfMapData = res; + this.listOfMapData.forEach(item => { + this.mapOfExpandedData[item.key] = this.service.convertTreeToList(item); + }); + // console.log(this.listOfMapData, this.mapOfExpandedData); + } + }); + } + + changeMemu(key: number) { + this.selectedPlatform = this.platforms[key]; + this.loadMemu(this.selectedPlatform.appId); + } + + menuAction(nzTitle: string, item?: any, parentId?: string, isDisabled = false) { + const modal = this.modal.create({ + nzTitle, + nzContent: MenuModalComponent, + nzWidth: 900, + nzComponentParams: item + ? { formData: { ...item }, isDisabled, params: { parentId, appId: this.selectedPlatform.appId } } + : { formData: { id: null }, params: { parentId, appId: this.selectedPlatform.appId } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.loadMemu(this.selectedPlatform.appId); + } + }); + } + + deleteAction(item: any) { + this.modal.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_del_many, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除菜单成功'); + this.loadMemu(this.selectedPlatform.appId); + } + }); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + menuImport(index: number) { + if (this.listOfMapData?.length > 0) { + this.service.msgSrv.warning('请先清空菜单'); + return; + } + if (!this.selectedPlatform) { + return; + } + + this.service.menuImport(this.selectedPlatform.enName, this.selectedPlatform.appId); + } + + delMenu(type: number) { + this.modal.confirm({ + nzTitle: '删除确认', + nzContent: `是否确认删除?`, + nzOnOk: () => { + this.service.getMenuByAppID(type === 0 ? 'A48F72F0A304427F921794BAD86B3522' : this.envSrv.env.appId); + } + }); + } + menuSort(){ + const dialogData = { + appId: this.selectedPlatform.appId + }; + this.modalHelper.create(MenuManagerMenusortComponent, { i: dialogData }, { size: 900 }).subscribe((res:any) => { + if(res) { + console.log('a') + this.loadMemu(this.selectedPlatform.appId); + } + }); + } +} diff --git a/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.html b/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.html new file mode 100644 index 00000000..31848fe4 --- /dev/null +++ b/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.html @@ -0,0 +1,8 @@ +
    + +
    + + \ No newline at end of file diff --git a/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.less b/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.ts b/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.ts new file mode 100644 index 00000000..b55bde12 --- /dev/null +++ b/src/app/routes/menu-manager/components/index/menu-modal/menu-modal.component.ts @@ -0,0 +1,151 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { SettingMenuComponent } from 'src/app/routes/sys-setting/components/role-management/menu/menu.component'; +import { MenuManagerService } from '../../../services/menu-manager.service'; + +@Component({ + selector: 'app-menu-modal', + templateUrl: './menu-modal.component.html', + styleUrls: ['./menu-modal.component.less'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MenuModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + formData: any; + schema!: SFSchema; + ui!: SFUISchema; + isDisabled = false; + + params = {}; + + constructor(public service: MenuManagerService, private modal: NzModalRef, private cdr: ChangeDetectorRef) {} + + ngOnInit(): void { + if (this.formData.id) { + this.loadMenu(); + } else { + this.initSF(); + } + } + + initSF(data?: any) { + this.schema = { + properties: { + title: { + title: '菜单名称', + type: 'string', + default: this.formData.text, + maxLength: 20, + ui: { + widget: this.isDisabled ? 'text' : 'string', + placeholder: '请输入菜单名称' + } + }, + keyCode: { + title: '菜单编码', + type: 'string', + default: this.formData.keyCode, + ui: { + widget: this.isDisabled ? 'text' : 'string', + placeholder: '请输入菜单编码' + } + }, + isLeaf: { + title: '是否叶子节点', + type: 'boolean', + default: this.formData.isLeaf || true, + enum: [true, false], + readOnly: this.isDisabled, + ui: { + widget: 'radio' + } + }, + hide: { + title: '是否隐藏', + type: 'boolean', + default: this.formData.hide || false, + enum: [true, false], + readOnly: this.isDisabled, + ui: { + widget: 'radio' + } + }, + link: { + title: '菜单路由', + type: 'string', + default: this.formData.link, + ui: { + widget: this.isDisabled ? 'text' : 'string', + placeholder: '请输入菜单路由' + } + }, + icon: { + title: '菜单图标', + type: 'string', + default: this.formData.icon, + ui: { + widget: this.isDisabled ? 'text' : 'string', + placeholder: '请输入菜单图标' + } + }, + sortId: { + title: '排序', + type: 'number', + default: this.formData.sortId, + ui: { + widget: this.isDisabled ? 'text' : 'number' + } + } + }, + required: ['title'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 12 } + } + }; + this.cdr.detectChanges(); + } + + loadMenu() { + this.service.request(this.service.$api_get_menu_by_id, { id: this.formData.id }).subscribe(res => { + if (res) { + this.formData = res; + this.initSF(this.formData); + } + }); + } + + close() { + this.modal.destroy(); + } + + sure() { + if (!this.sf.valid) { + this.service.msgSrv.warning('表单验证错误'); + return; + } + const params = { + ...this.sf.value, + ...this.params, + i18n: null, + // i18n: this.sf.value.keyCode, + menuType: 0, + reuse: 0, + shortcut: 0, + hideInBreadcrumb: 0, + functionType: 0, + sortId: this.sf.value.sortId?.toString() || null, + text: this.sf.value.title + }; + this.service.request(this.service.$api_add_one, params).subscribe(res => { + if (res) { + this.service.msgSrv.success(this.formData.id ? '修改菜单成功' : '新增菜单成功'); + this.modal.destroy(true); + } + }); + } +} diff --git a/src/app/routes/menu-manager/components/menusort/menusort.component.html b/src/app/routes/menu-manager/components/menusort/menusort.component.html new file mode 100644 index 00000000..35e4f397 --- /dev/null +++ b/src/app/routes/menu-manager/components/menusort/menusort.component.html @@ -0,0 +1,18 @@ + +
    + + +
    + diff --git a/src/app/routes/menu-manager/components/menusort/menusort.component.spec.ts b/src/app/routes/menu-manager/components/menusort/menusort.component.spec.ts new file mode 100644 index 00000000..dd867bb3 --- /dev/null +++ b/src/app/routes/menu-manager/components/menusort/menusort.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MenuManagerMenusortComponent } from './menusort.component'; + +describe('MenuManagerMenusortComponent', () => { + let component: MenuManagerMenusortComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ MenuManagerMenusortComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MenuManagerMenusortComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/menu-manager/components/menusort/menusort.component.ts b/src/app/routes/menu-manager/components/menusort/menusort.component.ts new file mode 100644 index 00000000..9e4dd21b --- /dev/null +++ b/src/app/routes/menu-manager/components/menusort/menusort.component.ts @@ -0,0 +1,77 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzTreeComponent } from 'ng-zorro-antd/tree'; +import { MenuManagerService } from '../../services/menu-manager.service'; + +@Component({ + selector: 'app-menu-manager-menusort', + templateUrl: './menusort.component.html', +}) +export class MenuManagerMenusortComponent implements OnInit { + @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; + record: any = {}; + i: any; + functionList: any[] = []; + menuList: any[] = []; + + constructor( + private modal: NzModalRef, + public service: MenuManagerService, + ) { } + + ngOnInit(): void { + this.getAllFunction() + } + getAllFunction() { + this.service.request(this.service.$api_get_all, { appId: this.i.appId }, 'POST', false).subscribe(res => { + this.functionList = res; + this.menuList = res[0].children; + }); + } + nzEvent(event: any): void { + console.log(event) + } + dragEnd(event: any){ + const functionId = event.node.key + let sortNumber = 0 + const newMenuList = this.nzTreeComponent.getTreeNodes() + newMenuList.forEach((item, index) => { + if(event.node.level === 0 && item.children) { + + if(functionId === item.key) { + sortNumber = index + } + } else if(event.node.level === 1 && item.children) { + item.children.forEach((subItem: any, subIndex: number) => { + if(functionId === subItem.key) { + sortNumber = subIndex + } + }) + } else if(event.node.level === 2 && item.children) { + item.children.forEach((thirdItem: any, thirdIndex: number) => { + if(functionId === thirdItem.key) { + sortNumber = thirdIndex + } + }) + } + }) + const params: any = { + parentId: event.node.level === 0 ? this.functionList[0].id : event.node.parentNode.key, + functionId, + sortNumber + } + this.service.request(this.service.$api_alterFunctionsParent, params).subscribe(res => { + if (res) { + } + }) + + } + sure(){ + this.modal.close(true) + } + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/menu-manager/menu-manager-routing.module.ts b/src/app/routes/menu-manager/menu-manager-routing.module.ts new file mode 100644 index 00000000..d46c398f --- /dev/null +++ b/src/app/routes/menu-manager/menu-manager-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { ApiAuthComponent } from './components/api-auth/api-auth.component'; +import { MenuManagerComponentsIndexComponent } from './components/index/index.component'; + +const routes: Routes = [ + { path: '', redirectTo: 'index', pathMatch: 'full' }, + { path: 'index', component: MenuManagerComponentsIndexComponent }, + { path: 'auth', component: ApiAuthComponent }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MenuManagerRoutingModule {} diff --git a/src/app/routes/menu-manager/menu-manager.module.ts b/src/app/routes/menu-manager/menu-manager.module.ts new file mode 100644 index 00000000..7d243d84 --- /dev/null +++ b/src/app/routes/menu-manager/menu-manager.module.ts @@ -0,0 +1,16 @@ +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; +import { MenuManagerComponentsIndexComponent } from './components/index/index.component'; +import { MenuManagerRoutingModule } from './menu-manager-routing.module'; +import { MenuModalComponent } from './components/index/menu-modal/menu-modal.component'; +import { ApiAuthComponent } from './components/api-auth/api-auth.component'; +import { AuthDrawerComponent } from './components/api-auth/auth-drawer/auth-drawer.component'; +import { MenuManagerMenusortComponent } from './components/menusort/menusort.component'; + +const COMPONENTS: Type[] = [MenuManagerComponentsIndexComponent, ApiAuthComponent]; +const COMPONENTS_NOROUNT: Type[] = [MenuModalComponent, AuthDrawerComponent, MenuManagerMenusortComponent]; +@NgModule({ + imports: [SharedModule, MenuManagerRoutingModule], + declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT] +}) +export class MenuManagerModule {} diff --git a/src/app/routes/menu-manager/services/menu-manager.service.ts b/src/app/routes/menu-manager/services/menu-manager.service.ts new file mode 100644 index 00000000..b8a7c259 --- /dev/null +++ b/src/app/routes/menu-manager/services/menu-manager.service.ts @@ -0,0 +1,157 @@ +import { Injectable, Injector } from '@angular/core'; +import { Menu } from '@delon/theme'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class MenuManagerService extends BaseService { + // 新增/更新菜单 + $api_add_one = `/api/mdc/cuc/functionInfo/saveFunctionInfo`; + // 根据应用ID获取所有菜单 + $api_get_all = `/api/mdc/cuc/functionInfo/getAllFunctionInfoByAppId`; + // 获取菜单详情 + $api_get_menu_by_id = `/api/mdc/cuc/functionInfo/getFunctionInfo`; + // 根据应用ID获取菜单 + $api_get_one = `/api/mdc/cuc/functionInfo/getAllFunctionInfoByAppId?_allow_badcode=true`; + // 删除多个菜单 + $api_del_many = `/api/mdc/cuc/functionInfo/deletebatchFunctionInfo`; + + // 获取菜单下按钮权限列表 + $api_get_functions_by_id = `/api/mdc/cuc/functionButton/getFunctionButtonByFunctionId`; + // 获取所有按钮信息 + $api_get_functions = `/api/mdc/cuc/buttonInfo/getButtonInfoList`; + // 保存菜单按钮关联 + $api_save_menu_function = `/api/mdc/cuc/functionButton/saveFunctionButton`; + // 删除菜单按钮关联表 + $api_delete_menu_function = `/api/mdc/cuc/functionButton/deletebatch`; + // 排序菜单 + $api_alterFunctionsParent = `/api/mdc/cuc/functionInfo/alterFunctionsParent`; + + constructor(public injector: Injector) { + super(injector); + } + + getMenuByAppID(appId: string) { + this.request(this.$api_get_one, { appId }, 'POST', false).subscribe(res => { + if (res) { + const menus = res.data; + if (res.data?.length > 0) { + this.deleteMenuByAppID(res.data); + } else { + this.msgSrv.success('菜单已清空'); + } + } + }); + } + + deleteMenuByAppID(arr: Array) { + let ids: any[] = arr?.map(item => item.id) || []; + arr.forEach(item => { + if (item.children?.length > 0) { + this.deleteMenuByAppID(item.children); + } + }); + this.request(this.$api_del_many, ids).subscribe(res => {}); + } + + menuImport(enName: string, appId: string) { + this.http.request('GET', `assets/mocks/platform/${enName}.json`).subscribe((res: any) => { + this.addMenu(res.menu, appId); + }); + } + + addMenu(menus: Array, appId: string, parentId: string = '') { + menus.forEach(r => { + if (parentId !== '') { + r.parentId = parentId; + } + this.request(this.$api_get_one, { appId }, 'POST', false).subscribe(res => { + // 如果res.data存在,则更新菜单 + if (res.data) { + r.id = res.data.id; + } + this.addOne({ appId, ...r, isLeaf: !(r.children && r.children.length > 0) }).subscribe(result => { + if (result) { + if (r.children && r.children.length > 0) { + this.addMenu(r.children, appId, result.id); + } + } + }); + }); + }); + + // this.loadMenus(this.selectedPlatform.appId); + } + + collapse(array: TreeNodeInterface[], data: TreeNodeInterface, $event: boolean): void { + if (!$event) { + if (data.children) { + data.children.forEach(d => { + const target = array.find(a => a.key === d.key)!; + target.expand = false; + this.collapse(array, target, false); + }); + } else { + return; + } + } + } + + convertTreeToList(root: TreeNodeInterface): TreeNodeInterface[] { + const stack: TreeNodeInterface[] = []; + const array: TreeNodeInterface[] = []; + const hashMap = {}; + stack.push({ ...root, level: 0, expand: true }); + + while (stack.length !== 0) { + const node = stack.pop()!; + this.visitNode(node, hashMap, array); + if (node.children) { + for (let i = node.children.length - 1; i >= 0; i--) { + stack.push({ + ...node.children[i], + level: node.level! + 1, + expand: false, + parent: node, + ...this.formatIcon(node.children[i].icon) + }); + } + } + } + + return array; + } + + visitNode(node: TreeNodeInterface, hashMap: { [key: string]: boolean }, array: TreeNodeInterface[]): void { + if (!hashMap[node.key]) { + hashMap[node.key] = true; + array.push(node); + } + } + + private formatIcon(icon: any): { iconType: string; value: string } { + let value = icon; + let type = 'icon'; + // compatible `anticon anticon-user` + if (~icon.indexOf(`anticon-`)) { + value = value.split('-').slice(1).join('-'); + } + if (~icon.indexOf(`iconfont`)) { + type = 'iconfont'; + } + return { iconType: type, value }; + } +} + +export interface TreeNodeInterface { + key: string; + name: string; + age?: number; + level?: number; + expand?: boolean; + address?: string; + children?: TreeNodeInterface[]; + parent?: TreeNodeInterface; + [key: string]: any; +} diff --git a/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.html b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.html new file mode 100644 index 00000000..9c9d31eb --- /dev/null +++ b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.html @@ -0,0 +1,94 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    + + + + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : '' }}
    +
    + +
    {{ item?.longitude }} + {{ item?.latitude ? "," + item?.latitude : '' }}
    +
    + + +
    + {{ item?.billStatusLabel }} +
    +
    + {{item?.billTypeLabel}}{{item?.serviceTypeLabel === item?.billTypeLabel ? '':item?.serviceTypeLabel}} +
    +
    +
    +
    +
    + + diff --git a/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.less b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.less new file mode 100644 index 00000000..149a0bc9 --- /dev/null +++ b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.spec.ts b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.spec.ts new file mode 100644 index 00000000..c2659773 --- /dev/null +++ b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:03:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-07 09:43:16 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\abnormal-warning\\abnormal-warning.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementAbnormalWarningComponent } from './abnormal-warning.component'; + +describe('OrderManagementAbnormalWarningComponent', () => { + let component: OrderManagementAbnormalWarningComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementAbnormalWarningComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementAbnormalWarningComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.ts b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.ts new file mode 100644 index 00000000..70043520 --- /dev/null +++ b/src/app/routes/order-management/components/abnormal-warning/abnormal-warning.component.ts @@ -0,0 +1,290 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; +import { UpdateFreightComponent } from '../../modal/bulk/update-freight/update-freight.component'; +import { ConfirReceiptComponent } from '../../modal/bulk/confir-receipt/confir-receipt.component'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { Router } from '@angular/router'; +import { OneCarOrderAppealComponent } from '../../modal/audit/appeal/appeal.component'; + +@Component({ + selector: 'app-order-management-abnormal-warning', + templateUrl: './abnormal-warning.component.html', + styleUrls: ['./abnormal-warning.component.less'] +}) +export class OrderManagementAbnormalWarningComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + changeId: any; // 主页面查看运费变更记录id - 用于运费变更记录 + changeViewId: any; // 查看运费变更记录id - 用于查看 + auditId: any; + auditIdR: any; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + isVisibleRE = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + ViewCause: any; // 变更运费查看数据 + constructor( + public service: OrderManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + warningTime: { + start: this.sf?.value?.warningTime?.[0] || '', + end: this.sf?.value?.warningTime?.[1] || '' + } + }; + } + get changeParams() { + return { + id: this.changeId + }; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + get changeViewParams() { + return { + id: this.changeViewId + }; + } + search() { + this.st?.load(1); + } + + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + } + }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + containsAllLabel: true, + } as SFSelectWidgetSchema + }, + resourceType: { + title: '货源类型', + type: 'string', + default: '', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + }, + widget: 'dict-select', + params: { dictKey: 'goodresource:type' }, + containsAllLabel: true, + } as SFSelectWidgetSchema + }, + shipperId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + warningTime: { + title: '预警时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '订单号', + width: '180px', + fixed: 'left', + className: 'text-left', + index: 'billCode' + }, + { + title: '运单号', + width: '180px', + fixed: 'left', + className: 'text-left', + index: 'wayCode' + }, + { title: '服务类型', index: 'serviceTypeLabel', width: '220px', className: 'text-left',format: (item) => { + return item?.resourceTypeLabel + item?.serviceTypeLabel + } }, + { title: '货主', index: 'shipperName', width: '220px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '220px', className: 'text-left' }, + { title: '卸货地', index: 'unloadingAddressArr', width: '220px', className: 'text-left' }, + { title: '司机', render: 'driverName', width: '180px', className: 'text-left' }, + { title: '车牌号', index: 'carNo', width: '180px', className: 'text-left' }, + { title: '预警类型', index: 'warningTypeLabel', width: '180px', className: 'text-left' }, + { + title: '预警时间', + className: 'text-left', + width: '180px', + index: 'warningTime' + }, + { + title: '位置描述', + className: 'text-left', + width: '250px', + render: 'longitude' + }, + { + title: '提醒内容', + className: 'text-left', + width: '250px', + index: 'warningContent', + }, + + ]; + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_abnormalWarning_asyncExport); + } +} diff --git a/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.html b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.html new file mode 100644 index 00000000..edfb57a6 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.html @@ -0,0 +1,312 @@ + + + + + + + + +
    + +

    订单号: {{ i?.billCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.goodsResource?.enterpriseInfoName }} + {{ i?.goodsResource?.shipperAppUserName }} + {{i?.goodsResource?.enterpriseProjectName}} + {{i?.goodsResource?.serviceTypeLabel}} + {{i?.createUserName}} {{ i?.createUserPhone ? "/" + i?.createUserPhone : ''}} + {{i?.goodsResource?.dispatchName}}{{ i?.goodsResource?.dispatchPhone ? "/" + + i?.goodsResource?.dispatchPhone : ''}} +
    + + + + + + + + + + + + +
    +
    +
    + +
    +
    +   +   +   +   +
    +
    +
    + + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    + +
    +
    +
    +
    + + 装货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    + + +
    +
    + + + + + {{i?.goodsInfoList?.[0]?.weight}}吨,{{i?.goodsInfoList?.[0]?.volume}}方,{{i?.goodsInfoList?.[0]?.number}}件 + + + + + + + + + + + + + + + {{ i?.carModel }}{{ i?.carLength ? "/" + i?.carLength : ''}} + + + {{i?.driverName}}{{ i?.driverPhone ? "/" + i?.driverPhone : ''}}{{ i?.carNo ? "/" + i?.carNo : ''}} + + + {{ i?.driverCarModelLabel }},{{ i?.driverCarLengthLabel }}米,{{ i?.driverCarWeight }}吨 + + + + + + + + + + + + + + + 运费信息到货后{{i?.goodsResource?.paymentDays}}天内支付运费 + +
    + {{ i?.freightPrice }}{{ i?.freightTypeLabel }} ({{ + i?.settlementBasisLabel }},{{ + i?.ruleLabel + }}) +
    + + + {{ item.price + item.surcharge | currency }} + + 到付 + {{item.price | currency}} + {{item.surcharge | currency}} + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ i?.totalRate * 100 | number: '0.2-2' }}%) +
    +
    车队长:{{ i?.payeeName }}/{{ i?.payeePhone }}/{{ i?.payeeIdNo }} +
    +
    + + + + + 查看附件      + 补充协议 + + + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + {{ + i?.supplementaryInformationVO?.receiptUserName }} / {{ i?.supplementaryInformationVO?.phon }} + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + + + + +
    + +
    请上传图片
    +
    +
    + +
    + + {{i?.goodsResource?.remarks}} + +
    +
    + + + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + +
    暂无附件信息
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.less b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.less new file mode 100644 index 00000000..a59b9526 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.less @@ -0,0 +1,33 @@ +:host { + + .tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; + } + + .card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; + } + + .align-center { + display: flex; + align-items: center; + justify-content: center; + } + .align-center2 { + display: flex; + align-items: center; + } + #container { + width: 300px; + height: 180px; + } + :host { + ::ng-deep { + nz-input-number{width: 100%;} + } + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.spec.ts b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.spec.ts new file mode 100644 index 00000000..94efd41a --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkDetailChangeComponent } from './bulk-detail-change.component'; + +describe('OrderManagementBulkDetailChangeComponent', () => { + let component: OrderManagementBulkDetailChangeComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkDetailChangeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkDetailChangeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.ts b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.ts new file mode 100644 index 00000000..e2fd7084 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail-change/bulk-detail-change.component.ts @@ -0,0 +1,1052 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-24 16:58:02 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-11 19:26:19 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\bulk-detail-change\\bulk-detail-change.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { ViewChild } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFNumberWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { AmapPoiPickerComponent, AmapService, EAEnvironmentService, ShipperBaseService } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer } from 'rxjs'; +import { apiConf } from '@conf/api.conf'; +import { OrderManagementService } from '../../services/order-management.service'; +import format from 'date-fns/format'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { map } from 'rxjs/operators'; +function getBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); +} +@Component({ + selector: 'app-supply-management-bulk-detail-change', + templateUrl: './bulk-detail-change.component.html', + styleUrls: ['./bulk-detail-change.component.less', '../../../commom/less/trajectory.less'] +}) +export class OrderManagementBulkDetailChangeComponent implements OnInit { + validateForm1: FormGroup; + id = this.route.snapshot.params.id; + @ViewChild('distannce3', { static: false }) + i: any = { unLoadingPlaceList: [] }; + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + startInfo: any = []; // 装货信息 + endInfo: any = []; // 卸货信息 + unloadTime: any; // 货源单设置回显 + loadTime: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + dirverPhone: any; // 货源单设置回显 + dirverBankCard: any; // 货源单设置回显 + listImagUrls: any[] = []; // 货源单设置回显 + dirvingMessage = []; + modalcontent: any; + modalTitle: string = ''; + imges: any; + totalObj: any; + attObj: any; + previewImage1 = ''; + previewVisible1 = false; + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + @ViewChild('st') st!: STComponent; + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + isVisible = false; + billExpenses: any[] = []; //运费信息表格信息 + ui4!: SFUISchema; + formData: any; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + logColumns: STColumn[] = [ + { title: '款项', index: 'expenseCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatus', + type: 'badge', + width: '120px', + badge: { + '1': { text: '待申请', color: 'warning' }, + '2': { text: '已支付', color: 'success' }, + '3': { text: '已拒绝', color: 'warning' }, + '4': { text: '申请中', color: 'warning' } + } + } + ]; + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + constructor( + private route: ActivatedRoute, + private router: Router, + private msgSrv: NzMessageService, + public service: OrderManagementService, + private modalService: NzModalService, + private amapService: AmapService, + public shipperservice: ShipperBaseService, + fb: FormBuilder, + private envSrv: EAEnvironmentService, + private ar: ActivatedRoute + ) { + this.validateForm1 = fb.group({ + loadTime: [null, []], + unloadTime: [null, []] + }); + } + + ngOnInit(): void { + this.initData(); + this.initSF3(); + this.initSF4(); + this.getTrajectory(); + } + initSF() { + this.schema = { + properties: { + loadingLadingBillFilePath: { + type: 'string', + title: '装货凭证', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + loadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no7: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + }, + unloadingLadingBillFilePath: { + type: 'string', + title: '卸货凭证', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + unloadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no5: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + }, + no6: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + } + }, + required: ['loadingLadingBillFilePath', 'unloadingLadingBillFilePath'] + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + }, + $unloadingLadingBillFilePath: { grid: { span: 12 } }, + $unloadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + $loadingLadingBillFilePath: { grid: { span: 12 } }, + $loadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + $no5: { grid: { span: 24 } } + }; + } + initData() { + this.service.request(this.service.$api_getBulkBillDetail, { id: this.id }).subscribe(res => { + if (res) { + this.i = res; + this.billExpenses = this.i?.billExpenseDetails?.filter((data: any) => data.expenseCode === 'TRA'); + this.initSF(); + // 对装货凭证进行初始化 + let arr: any = []; + res?.receiptFilePath.forEach((element: any, index: any) => { + arr.push({ + url: element, + status: 'done', + uid: index + }); + }); + this.sf4data; + this.listImagUrls = arr; + // this.sf4data = res?.goodsInfoList?.[0] + this.sf4data = { + ...res, + ...res?.goodsInfoList?.[0] + }; + this.sf3data = { + goodsTypeId: res?.goodsInfoList[0]?.goodsTypeId || '', + goodsTypeName: res?.goodsInfoList[0]?.goodsTypeName || '', + goodsNameId: res?.goodsInfoList[0]?.goodsNameId || '', + goodsName: res?.goodsInfoList[0]?.goodsName || '' + }; + if (this.sf3data.goodsTypeName === '其它') { + this.sf3data.goodsName1 = res?.goodsInfoList[0]?.goodsName || ''; + } + this.changeGoodsType(this.sf3data.goodsTypeId, { label: this.sf3data.goodsTypeName, value: this.sf3data.goodsTypeId }); + // 对装卸货信息进行初始化 + res?.unLoadingPlaceList.forEach((element: any) => { + if (element.type === 1 || element.type === '1') { + const controlId = this.startInfo.length; + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required)); + } else if (element.type === 2 || element.type === '2') { + const controlId = this.endInfo.length; + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required)); + } + }); + // 对装货凭证进行初始化 + this.formData = { + loadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.loadingLadingBillFilePath, + response: { + url: res?.loadingLadingBillFilePath + } + } + ], + loadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.loadingPeopleVehiclesGoodsFilePath, + response: { + url: res?.loadingPeopleVehiclesGoodsFilePath + } + } + ], + unloadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.unloadingLadingBillFilePath, + response: { + url: res?.unloadingLadingBillFilePath + } + } + ], + unloadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.unloadingPeopleVehiclesGoodsFilePath, + response: { + url: res?.unloadingPeopleVehiclesGoodsFilePath + } + } + ] + }; + // 发车时间到车时间初始化 + this.loadTime = res?.loadTime; + this.unloadTime = res?.unloadTime; + this.dirvingMessage = res?.billExpenseDetails; + // 计算里程,时间 + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + // 取消修改 + cancelChange() { + window.history.go(-1); + } + // 保存修改 + save() { + Object.keys(this.validateForm1.controls).forEach(key => { + this.validateForm1.controls[key].markAsDirty(); + this.validateForm1.controls[key].updateValueAndValidity(); + }); + this.sf3.validator({ emitError: true }); + this.sf4.validator({ emitError: true }); + if (this.validateForm1.invalid || !this.sf3.valid || !this.sf4.valid) { + this.service.msgSrv.warning('请完善必填项!'); + return; + } + if ( + this.sf4.value?.acceptWeight > this.i?.goodsInfoList?.[0]?.weight || + this.sf4.value?.settlementWeight.settlementWeight > this.i?.goodsInfoList?.[0]?.weight + ) { + this.service.msgSrv.warning('装货重量/卸货重量不能大于货物重量!'); + return; + } + let imgList: any = []; + if (this.listImagUrls.length > 0) { + this.listImagUrls?.forEach((res: any) => { + if (res?.url) { + imgList.push(res?.url); + } + }); + } + if (typeof this.unloadTime !== 'string') { + var c = new Date(this.unloadTime); + this.unloadTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + } + if (typeof this.loadTime !== 'string') { + var c = new Date(this.loadTime); + this.loadTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + } + const params = { + id: this.id, + unLoadingPlaceDTOList: [...this.startInfo, ...this.endInfo], + receiptFilePath: imgList, + goodsInfoDTOList: [ + { + id: this.i?.goodsInfoList?.[0].id, + goodsName: this.sf3.value?.goodsName, + ...this.sf4.value + } + ], + // 运费信息 + // 车队长 + payeeId: this.dirverPhone, + dirverBankCard: this.dirverBankCard, // 银行卡 + // 发车时间 + loadTime: this.loadTime, + // 到车时间 + unloadTime: this.unloadTime, + acceptWeight: this.sf4.value?.acceptWeight, + acceptVolume: this.sf4.value?.acceptVolume, + settlementWeight: this.sf4.value?.settlementWeight, + settlementVolume: this.sf4.value?.settlementVolume, + loadingLadingBillFilePath: this.sf.value?.loadingLadingBillFilePath?.data + ? this.sf.value?.loadingLadingBillFilePath.data.fullFilePath + : this.sf.value?.loadingLadingBillFilePath?.url, + + loadingPeopleVehiclesGoodsFilePath: this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.data + ? this.sf.value?.loadingPeopleVehiclesGoodsFilePath.data.fullFilePath + : this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.url, + + unloadingLadingBillFilePath: this.sf.value?.unloadingLadingBillFilePath?.data + ? this.sf.value?.unloadingLadingBillFilePath.data.fullFilePath + : this.sf.value?.unloadingLadingBillFilePath?.url, + + unloadingPeopleVehiclesGoodsFilePath: this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.data + ? this.sf.value?.unloadingPeopleVehiclesGoodsFilePath.data.fullFilePath + : this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.url + }; + this.service.request(this.service.$api_set_modifyBulkOrder, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('修改成功!'); + this.router.navigate(['/order-management/bulk/bulk-detail/', this.id]); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + } + addPreZero(num: any) { + if (num < 10) { + return '0' + num; + } else { + return num; + } + } + // -------------------装卸货信息处理 + // 打开地图 + // 打开地图 + // 打开地图 + openMap(type: string, index: number, address: string) { + console.log(type); + console.log(index); + + const modalRef = this.modalService.create({ + nzTitle: '', + nzComponentParams: { selectedAddress: address }, + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + if (item?.poi) { + const poi = item.poi; + const locList = poi.pois; + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.formattedAddress; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.addressComponent.province; + this.startInfo[index].city = poi.addressComponent.city; + this.startInfo[index].area = poi.addressComponent.district; + this.startInfo[index].address = poi.formattedAddress; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.formattedAddress; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.addressComponent.province; + this.endInfo[index].city = poi.addressComponent.city; + this.endInfo[index].area = poi.addressComponent.district; + this.endInfo[index].address = poi.formattedAddress; + break; + default: + break; + } + + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe((res: any) => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + return true + } else { + this.service.msgSrv.warning('请重新手动选择地址!') + return false + } + } + }); + } + initSF3() { + this.schema3 = { + properties: { + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物类型' }, + asyncData: () => + this.service.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (_value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 110, + grid: { span: 12 } + } + }; + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget?.reset(res); + if (this.sf3data.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId); + } + } + }); + } + initSF4() { + this.schema4 = { + properties: { + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '必填项' } + } + }, + carmand: { + type: 'string', + title: '用车需求', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + drivers: { + type: 'string', + title: '承运司机', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + weightModel: { + type: 'string', + title: '车型车长承重', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + loadTime: { + type: 'string', + title: '发车时间', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + unloadTime: { + type: 'string', + title: '到车时间', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + acceptWeight: { + type: 'number', + title: '装货重量', + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true + } as SFNumberWidgetSchema + }, + acceptVolume: { + type: 'number', + title: '装货体积', + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true + } as SFNumberWidgetSchema + }, + settlementWeight: { + type: 'number', + title: '卸货重量', + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true + } as SFNumberWidgetSchema + }, + settlementVolume: { + type: 'number', + title: '卸货体积', + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true + } as SFNumberWidgetSchema + } + }, + required: ['loadTime', 'unloadTime'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 110, + grid: { span: 24 } + }, + $weight: { + grid: { span: 24 } + }, + $carmand: { + grid: { span: 24 } + }, + $weightModel: { + spanLabelFixed: 120, + grid: { span: 12 } + }, + $drivers: { + grid: { span: 12 } + }, + $loadTime: { + grid: { span: 12 } + }, + $unloadTime: { + grid: { span: 12 } + } + }; + } + // 处理上传图片 + handlePreview1 = async (file: NzUploadFile) => { + if (!file.url && !file.preview) { + file.preview = await getBase64(file.originFileObj!); + } + this.previewImage1 = file.url || file.preview; + this.previewVisible1 = true; + }; + + handleChange1(info: NzUploadChangeParam): void { + switch (info.file.status) { + case 'uploading': + break; + case 'done': + let fileList = [...info.fileList]; + // 2. Read from response and show file link + fileList = fileList.map((file: any) => { + if (file.response) { + file.url = file.response.data.fullFilePath; + } + return file; + }); + break; + case 'error': + this.service.msgSrv.error('网络错误'); + break; + } + } + beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => { + return new Observable((observer: Observer) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/bmp'; + if (!isJpgOrPng) { + this.service.msgSrv.warning('只能上传图片!'); + observer.complete(); + return; + } + // tslint:disable-next-line: no-non-null-assertion + const isLt2M = file.size! / 1024 / 1024 < 3; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过3兆!'); + observer.complete(); + return; + } + observer.next(isJpgOrPng && isLt2M); + observer.complete(); + }); + }; + agreement(value: any) { + if (value === '1') { + this.modalTitle = '附件信息'; + this.modalcontent = this.i?.contractContent?.contractContent; + + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + } + this.isVisible = true; + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + } + } + // 装卸货地址互换 + swapAddress() { + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any) => { + element.type = '1'; + }); + this.endInfo.forEach((element: any) => { + element.type = '2'; + }); + + // 计算里程,时间 + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + } + + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res?.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res?.parkArray; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res?.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html new file mode 100644 index 00000000..e7e55124 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html @@ -0,0 +1,266 @@ + + + + + + +
    + +

    订单号: {{ i?.billCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.goodsResource?.enterpriseInfoName }} + {{ i?.goodsResource?.shipperAppUserName }} + {{ i?.goodsResource?.enterpriseProjectName }} + {{ i?.goodsResource?.serviceTypeLabel }} + {{ i?.createUserName }} {{ i?.createUserPhone ? "/" + i?.createUserPhone : ''}} + {{ i?.goodsResource?.dispatchName }}{{ i?.goodsResource?.dispatchPhone ? "/" + + i?.goodsResource?.dispatchPhone : ''}} + {{ i?.goodsResource?.resourceCode }} + {{ i?.wayBill?.wayBillCode }} + {{ i?.goodsResource?.paymentDays }} +
    + + + + + + + +
    +
    +
    + +
    +
    +   + + + +
    +
    +
    + + + + + {{i?.goodsInfoList?.[0]?.goodsName}} + + + + + {{i?.goodsInfoList?.[0]?.weight}}吨,{{i?.goodsInfoList?.[0]?.volume}}方,{{i?.goodsInfoList?.[0]?.number}}件 + {{ i?.carModel }}{{ i?.carLength ? "/" + i?.carLength : ''}} + {{ i?.driverName }}{{i?.driverPhone ? "/" + i?.driverPhone : ''}}{{ i?.carNo ? "/" + i?.carNo : + ''}} + {{ i?.driverCarModelLabel }},{{ i?.driverCarLengthLabel }}米,{{ i?.driverCarWeight }}吨 + + {{ i?.acceptWeight }}吨,{{ i?.acceptVolume }}方 + {{ i?.loadWeight }}吨,{{ + i?.loadVolume }}方 + {{ i?.settlementWeight }}吨,{{ + i?.settlementVolume }}方 + +
    +

    装货卸货信息 + ( + + + + ) +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{ item?.province }}{{ item.city }}{{ item.area }}{{ item.detailedAddress }}

    +

    联系人:{{ item.appUserName }}{{ item.contractTelephone ? "/" + item.contractTelephone : '' }}

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{ item?.province }}{{ item.city }}{{ item.area }}{{ item.detailedAddress }}

    +

    联系人:{{ item.appUserName }}{{ item.contractTelephone ? "/" + item.contractTelephone : ''}}

    +
    +
    +
    +
    +
    +
    +
    +
    + + + + 运费信息到货后{{i?.goodsResource.paymentDays}}天内支付运费 + +
    + {{ i?.freightPrice }}{{ i?.freightTypeLabel }} ({{ + i?.settlementBasisLabel }},{{ + i?.ruleLabel + }}) +
    + + + {{ item.price + item.surcharge | currency }} + + 到付 + {{item.price | currency}} + {{item.surcharge | currency}} + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ i?.totalRate * 100 | number: '0.2-2' }}%) +
    +
    车队长:{{ i?.payeeName }}/{{ i?.payeePhone }}/{{ i?.payeeIdNo }}
    +
    + + + + + 查看附件      + 补充协议 + + + + + + + + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + {{ + i?.supplementaryInformationVO?.receiptUserName }} / {{ i?.supplementaryInformationVO?.phon }} + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + + + + + + {{ i?.goodsResource?.remarks }} + + + + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + + +
    +
    + 您的订单可能存在交易风险,请及时提交申诉材料,提交成功后,平台将及时完成审核并通知您! +
    +
    如果您的运单没有问题,可以提出申诉,并提供相关资料,我们将24小时内审核反馈
    +
      +
    • 系统识别:{{item?.complianceTypeName}}
    • +
    • {{item?.determineDetails}}
    • +
    +
    +
    + + + + + + + +
    +
    + + + +
    暂无附件信息
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less new file mode 100644 index 00000000..1d17aeb7 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less @@ -0,0 +1,94 @@ +:host { + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .source-info { + p { + margin-bottom: .5em; + } + } + + .freight-info-box { + width: 95%; + } + + .freigth-label { + display : inline-block; + width : 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width : 70%; + margin: 0 auto; + } + } + + // .ant-tabs-top>.ant-tabs-nav, + // .ant-tabs-bottom>.ant-tabs-nav, + // .ant-tabs-top>div>.ant-tabs-nav, + // .ant-tabs-bottom>div>.ant-tabs-nav { + // margin: 0; + // } + + // .ant-anchor-ink::before { + // width: 0; + // } + + // .ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab, + // .ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab { + // margin-left: 40px + // } + } + + .leftPadding { + padding-right: 100px; + } + .handling-info { + min-height: 100px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts new file mode 100644 index 00000000..8556cf2d --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkeDetailComponent } from './bulk-detail.component'; + +describe('OrderManagementBulkeDetailComponent', () => { + let component: OrderManagementBulkeDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkeDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkeDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts new file mode 100644 index 00000000..a54ddc67 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts @@ -0,0 +1,265 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:20:26 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-13 19:52:18 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\bulk-detail\\bulk-detail.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../services/order-management.service'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import format from 'date-fns/format'; + +@Component({ + selector: 'app-supply-management-bulk-detail', + templateUrl: './bulk-detail.component.html', + styleUrls: ['./bulk-detail.component.less', '../../../commom/less/trajectory.less'] +}) +export class OrderManagementBulkeDetailComponent implements OnInit { + MapList: any[] = []; + @ViewChild('logSt') logSt!: STComponent; + id = this.route.snapshot.params.id; + billExpenses: any[] = []; //运费信息表格信息 + pois: any[] = []; + abnormalList: any[] = []; + operationList: any; + i: any; + imges: any; + totalObj: any; + attObj: any; + modalcontent: any; + modalTitle: string = ''; + isVisible = false; + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + logColumns3: STColumn[] = [ + { title: '时间', index: 'warningTime' }, + { title: '异常预警类型', index: 'warningTypeLabel' } + ]; + operateLogColums: STColumn[] = [ + { title: '内容', index: 'operationContent' }, + { title: '操作人', render: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp' } + ]; + logColumns: STColumn[] = [ + { title: '款项', index: 'expenseCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatus', + type: 'badge', + width: '120px', + badge: { + '1': { text: '待申请', color: 'warning' }, + '2': { text: '已支付', color: 'success' }, + '3': { text: '已拒绝', color: 'warning' }, + '4': { text: '申请中', color: 'warning' } + } + } + ]; + get logParams() { + return { operateObject: this.i?.billCode, operateTypeList: ['3', '8'] }; + } + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + warringList: any[] = []; //打点地址数据组 + constructor( + public route: ActivatedRoute, + private msgSrv: NzMessageService, + public service: OrderManagementService, + private router: Router, + private modal: NzModalService + ) {} + + ngOnInit(): void { + console.log(this.route?.snapshot?.queryParams?.sts); + this.initData(); + this.getTrajectory(); + } + + initData() { + this.service.request(this.service.$api_getBulkBillDetail, { id: this.id }).subscribe(res => { + if (res) { + this.i = res; + this.billExpenses = this.i?.billExpenseDetails?.filter((data: any) => data.expenseCode === 'TRA'); + this.i.scheduleVOList = this.i?.scheduleVOList?.filter((data: any) => data.displayStatus !== 'HIDE'); + this.pois = [ + { + markerLabel: '装', + color: 'blue', + position: [res.startingPoint.longitude, res.startingPoint.latitude], + title: `发货地:${res.startingPoint.province}${res.startingPoint.city}${res.startingPoint.area || ''}${ + res.startingPoint.detailedAddress + }`, + time: '计划出发时间:' + res.loadPlanTime + }, + { + markerLabel: '卸', + color: 'red', + position: [res.endPoint.longitude, res.endPoint.latitude], + title: `卸货地:${res.endPoint.province}${res.endPoint.city}${res.endPoint.area}${res.endPoint.detailedAddress}`, + time: '计划卸货时间:' + res.unloadPlanTime + } + ]; + this.service + .request(this.service.$api_get_log_list, { operateObject: this.i?.billCode, operateTypeList: ['3', '8'] }) + .subscribe(res => { + if (res) { + console.log('操作日志'); + console.log(res); + let a: any = []; + res.records.forEach((item: any) => { + a.push({ + value: `操作人: ${item.operator}
    操作内容: ${item.operationContent}`, + time: item.operatorTimestamp, + color: 'green' + }); + }); + console.log(a); + this.operationList = a; + } + }); + } + }); + this.service.request(this.service.$api_listBillComplianceAbnormalByBillId, { id: this.id }).subscribe(res => { + if (res) { + console.log('风险详情'); + console.log(res); + this.abnormalList = res; + } + }); + + this.service.request(this.service.$api_getAbnormalWarningByBillId, { id: this.id }).subscribe(res => { + if (res) { + console.log('异常预警'); + console.log(res); + this.warringList = res; + } + }); + } + + goBack() { + window.history.go(-1); + } + // 修改订单 + changeOrder() { + this.router.navigate(['order-management/bulk-detailChange', this.id]); + } + agreement(value: any) { + if (value === '1') { + this.modalTitle = '附件信息'; + // this.modalcontent = this.i?.contractContent?.contractContent; + // this.service.reviewPDF(this.i?.contractContent?.contractFilePath) + this.service.openURL(this.i?.contractContent?.contractFilePath); + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + this.isVisible = true; + } + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + } + } + // 取消订单 + cancellation() { + // api_get_cancelAnOrder + this.modal.confirm({ + nzTitle: '确定取消该订单吗?', + nzContent: `取消后无法恢复,请确认`, + nzOnOk: () => + this.service.request(this.service.$api_get_cancelAnOrder, { id: this.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.initData(); + } + }) + }); + } + + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res.parkArray; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/order-management/components/bulk/bulk.component.html b/src/app/routes/order-management/components/bulk/bulk.component.html new file mode 100644 index 00000000..bced8f7d --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.html @@ -0,0 +1,264 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + + + +
    + + + {{ item.freightPrice | currency }} + + +
    装 | {{ item?.loadTime }}
    +
    卸 | {{ item?.unloadTime }}
    +
    + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : '' }}{{ item?.carNo ? "/" + item?.carNo : ''}}
    +
    + +
    {{ item.settlementWeight ? item.settlementWeight + '吨/ ': ''}} {{ item.settlementVolume ? item.settlementVolume + '方 ': ''}}
    +
    + +
    {{ item?.payeeName }}{{ item?.payeePhone ? "/" + item?.payeePhone : '' }}
    +
    + +
    {{ item?.createUserName }}{{ item?.createUserPhone ? "/" + item?.createUserPhone : '' }}
    +
    + + {{ item.billCode }} +
    + {{ item?.billTypeLabel }}{{ item?.serviceTypeLabel }} +
    +
    + {{ item?.billStatusLabel }} +
    +
    + +
    {{ item?.goodsName }}
    +
    + {{ item?.weight ? item?.weight + '吨/' : '' }} + {{ item?.volume ? item?.volume + '方/' : '' }} + {{ item?.goodsNumber ? item?.goodsNumber + '件' : '' }} +
    +
    + +
    +

    + {{ data.expenseName }}:{{ data.price | currency }} + {{ data.expenseName }}:{{ (data.price * 100).toFixed(2) + '%' }} + {{ data.paymentStatusLabel }} +

    +
    +
    +
    +
    +
    + + + + + + {{ index + 1 }} + + +
    + 待确认 + 已确认 + 已撤销 + 拒绝 +
    +
    +
    +
    + + + + +
    + + + + + +
    + +
    元/吨
    +
    +
    +
    + + + {{ item.amountBeforeChange | currency }} + + ¥{{ item.amountchangeValue | number: '0.2-2' }} + + {{ item.amountAfterChange | currency }} + + +
    变更原因:{{ ViewCause?.changeCause }}
    +
    拒绝原因:{{ ViewCause?.refuseCause }}
    +
    注:附加费依据调整后的运输费用重新计算
    +
    + + + + +
    + + + + + + + + + + +
    暂无评价内容
    +
    + + + + + + +
    暂无评价内容
    +
    +
    +
    + + + + +
    + +
    + +
    已选择{{ selectedRows?.length || 0 }}条订单,确认批量签收吗? +
    +
    签收后不可再修改运费,请确保运费等信息准确无误后,再进行签收。
    +
    +
    + +
    + +
    +
    diff --git a/src/app/routes/order-management/components/bulk/bulk.component.less b/src/app/routes/order-management/components/bulk/bulk.component.less new file mode 100644 index 00000000..149a0bc9 --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk/bulk.component.spec.ts b/src/app/routes/order-management/components/bulk/bulk.component.spec.ts new file mode 100644 index 00000000..e78deb02 --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:03:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:18:06 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\bulk\\bulk.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkComponent } from './bulk.component'; + +describe('OrderManagementBulkComponent', () => { + let component: OrderManagementBulkComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/bulk/bulk.component.ts b/src/app/routes/order-management/components/bulk/bulk.component.ts new file mode 100644 index 00000000..15ba339a --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.ts @@ -0,0 +1,865 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; +import { UpdateFreightComponent } from '../../modal/bulk/update-freight/update-freight.component'; +import { ConfirReceiptComponent } from '../../modal/bulk/confir-receipt/confir-receipt.component'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { Router, ActivatedRoute } from '@angular/router'; +import { OneCarOrderCancelConfirmComponent } from '../../modal/vehicle/cancel-confirm/cancel-confirm.component'; + +@Component({ + selector: 'app-supply-management-bulk', + templateUrl: './bulk.component.html', + styleUrls: ['./bulk.component.less'] +}) +export class OrderManagementBulkComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + _$expand = false; + loading: boolean = true; + changeId: any; // 主页面查看运费变更记录id - 用于运费变更记录 + changeViewId: any; // 查看运费变更记录id - 用于查看 + ViewCause: any; // 变更运费查看数据 + sfViewFormData: any; // 变更运费查看的sf 数据 + shipList: any; // 货主评价 数据 + diverList: any; // 司机评价 数据 + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + demoValue: any; + resourceStatus: any; + tabs = { + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + signQuantity: 0, + compolatelQuantity: 0, + GoingQuantity: 0, + totalCount: 0 + }; + constructor( + public service: OrderManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router, + private ar: ActivatedRoute, + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.billStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const a: any = {}; + if (this.resourceStatus) { + a.billStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + console.log(params); + + if (this.sf) { + Object.assign(requestOptions.body, { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }); + } + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data) + this.loading = false + return data.map(item => ({ + ...item, + disabled: item.billStatus !== '4' + })); + }; + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + get changeParams() { + return { + id: this.changeId + }; + } + search() { + this.st?.load(); + this.getGoodsSourceStatistical(); + } + getGoodsSourceStatistical() { + this.tabs = { + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + signQuantity: 0, + compolatelQuantity: 0, + GoingQuantity: 0, + totalCount: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.billStatus; + this.service.request(this.service.$api_getBulkStatistical, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((element: any) => { + if (element.billStatusLabel === '待发车') { + this.tabs.stayQuantity = element.quantity; + } else if (element.billStatusLabel === '待接单') { + this.tabs.receivedQuantity = element.quantity; + } else if (element.billStatusLabel === '待签收') { + this.tabs.signQuantity = element.quantity; + } else if (element.billStatusLabel === '已完成') { + this.tabs.compolatelQuantity = element.quantity; + } else if (element.billStatusLabel === '已取消') { + this.tabs.cancelQuantity = element.quantity; + } else if (element.billStatusLabel === '运输中') { + this.tabs.GoingQuantity = element.quantity; + } + totalCount += element.quantity; + }); + this.tabs.totalCount = totalCount; + } + }); + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + ngOnInit(): void { + this.getGoodsSourceStatistical(); + this.initSF(); + this.initST(); + this.initSTFloat(); + this.initSTFloatView(); + this.initSFView(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '最多100个单号,空号隔开', + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '最多100个单号,空号隔开', + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + paymentStatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + riskStatus: { + type: 'string', + title: '是否风险单', + enum: [ + { label: '全部', value: '' }, + { label: '是', value: '3' }, + { label: '否', value: '1' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkEnterpriseName() + } + }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + settlementBasis: { + title: '结算依据', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'goodresource:settlement:type' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + /** + * 初始化查询表单 + */ + initSFView() { + this.schemaView = { + properties: { + freightPrice: { + type: 'string', + title: '运费单价' + }, + rule: { + title: '', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:rounding:rules' }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + settlementBasis: { + type: 'string', + title: '结算重量', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:settlement:type' }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + } + } + }; + this.uiView = { '*': { spanLabelFixed: 80, grid: { span: 12, gutter: 4 } } }; + } + // 获取所属项目 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '订单号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'billCode' + }, + { + title: '运费明细', + width: '250px', + className: 'text-right', + render: 'mybidDetailInfo' + }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '250px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '250px', className: 'text-left' }, + { title: '所属项目', index: 'enterpriseProjectName', width: '250px', className: 'text-left' }, + { title: '关联运单号', index: 'wayBillCode', width: '180px', className: 'text-left' }, + { title: '货源编号', index: 'resourceCode', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '180px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '180px', + index: 'unloadingAddressArr' + }, + // { + // title: '货物信息', + // className: 'text-left', + // width: '250px', + // render: 'goodsName' + // }, + { + title: '货物信息', + index: 'goodsName', + width: '180px', + className: 'text-left', + format: (item: any) => + `${item?.goodsName}/ + ${item?.weight || '0'}吨/ + ${item?.volume || '0'}方/ + ${item?.goodsNumber || '0'}件` + }, + { + title: '运费单价', + className: 'text-right', + width: '180px', + render: 'freightPrice' + }, + { + title: '接单数量', + render: 'receveOrderCountInfo', + width: '170px', + className: 'text-left', + format: (item: any) => + `${item.loadWeight || '0'}吨/ + ${item.loadVolume || '0'}方` + }, + { + title: '结算数量', + render: 'settlementWeight', + width: '170px', + className: 'text-left', + // format: (item: any) => + // `${item.settlementWeight || '0'}吨/ + // ${item.settlementVolume || '0'}方` + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + index: 'driverName', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '180px', + index: 'payeeName', + render: 'payeeName' + }, + { + title: '装卸货时间', + width: '200px', + className: 'text-left', + render: 'loadingTime' + }, + { + title: '录单时间', + className: 'text-left', + index: 'recordTime', + width: '170px' + }, + { + title: '创建时间', + width: '180px', + className: 'text-left', + index: 'createTime' + }, + { + title: '操作', + fixed: 'right', + width: '130px', + className: 'text-left block-td', + buttons: [ + { + text: '运费变更记录', + click: _record => this.OpenPrice(_record), + iif: item => + item.billStatus == '4' || item.billStatus == '5' || item.billStatus == '2' || item.billStatus == '3' || item.billStatus == '6', + acl: { ability: ['ORDER-BULK-listChangeApply'] }, + }, + { + text: '查看评价', + click: _record => this.viewEvaluate(_record), + iif: item => item.billStatus == '5', + acl: { ability: ['ORDER-BULK-evaluation'] }, + }, + { + text: '查看详情', + click: (item: any) => { + this.router.navigate(['./bulk-detail', item.id], { relativeTo: this.ar }); + }, + acl: { ability: ['USERCENTER-FREIGHT-USER-view'] }, + }, + { + text: '变更运费', + click: _record => this.updateFreight(_record), + iif: _record => { + const flag = _record.mybidDetailInfo.find((item: any) => item?.expenseCode === 'TRA' && item?.paymentStatus === '4'); + return _record.billStatus !== '1' && _record.billStatus !== '6' && !flag; + }, + acl: { ability: ['ORDER-BULK-FreightChangeBulkDetail'] }, + }, + { + text: '确认签收', + click: _record => this.confirmReceipt(_record), + iif: item => item.billStatus == '4', + acl: { ability: ['VEHICLE-LIST-view'] }, + }, + { + text: '取消订单', + click: _record => this.cancellation(_record), + iif: item => + item.billStatus == '4' || item.billStatus == '5' || item.billStatus == '2' || item.billStatus == '3' || item.billStatus == '1', + acl: { ability: ['ORDER-BULK-signBulkOrder'] }, + }, + { + text: '申请退款', + click: (_record) => this.applyRefund(_record), + iif: item => item.isApplyForRefund, + acl: { ability: ['ORDER-VEHICLE-modificationOrder'] }, + }, + { + text: '修改订单', + click: _record => this.changeOrder(_record), + iif: item => item.billStatus == '4' || item.billStatus == '5' || item.billStatus == '2' || item.billStatus == '3', + acl: { ability: ['ORDER-BULK-BulkBillDetail'] }, + } + ] + } + ]; + } + initSTFloat() { + this.columnsFloat = [ + { + title: '序号', + className: 'text-center', + render: 'order' + }, + { + title: '操作时间', + className: 'text-center', + index: 'applyTime' + }, + { + title: '操作人', + className: 'text-center', + index: 'applyUserName' + }, + { title: '状态', index: 'handleStatusLabel', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '查看', + click: _record => this.FloatView(_record) + }, + // { + // text: '查看协议', + // click: (_record, _modal, _instance) => this.view(_record) + // }, + { + text: '撤销', + click: _record => this.revoke(_record), + iif: item => item.handleStatus === '1' || item.handleStatus === 1 + } + ] + } + ]; + } + initSTFloatView() { + this.columnsFloatView = [ + { + title: '费用名称', + width: '100px', + className: 'text-center', + index: 'costName' + }, + { + title: '变更前', + width: '100px', + className: 'text-center', + index: 'amountAfterChange', + render: 'amountAfterChange' + }, + { title: '变更值', index: 'amountchangeValue', width: '120px', className: 'text-center', render: 'amountchangeValue' }, + { title: '变更后', index: 'amountBeforeChange', render: 'amountBeforeChange', width: '120px', className: 'text-center' } + ]; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + get changeViewParams() { + return { + id: this.changeViewId + }; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + /** + * 导入货源 + */ + importGoodsSource() { } + audit(item: any) { } + + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + if (type === '0') { + this.isVisible = false; + } else if (type === '1') { + console.log(type); + this.isVisibleView = false; + } else if (type === '2') { + this.isVisibleEvaluate = false; + } + } + /** + * 审核通过按钮 + */ + handleOK() { } + OpenPrice(item: any) { + this.changeId = item.id; + this.isVisible = true; + } + /** + * 浮动费用查看 + */ + FloatView(item: any) { + this.changeViewId = item.id; + this.service.request(this.service.$api_getChangeRecordBulkDetail, { id: this.changeViewId }).subscribe(res => { + this.ViewCause = res; + }); + this.isVisibleView = true; + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item); + this.isVisibleEvaluate = true; + const params = { + businessCode: item.billCode, + evaluateUserId: item.shipperAppUserId + }; + const params2 = { + businessCode: item.billCode, + evaluateUserId: item.shipperAppUserId + }; + this.service.request(this.service.$api_getBillEvaluateByShipper, params).subscribe(res => { + console.log(res); + console.log(res.evaluateInfos); + this.shipList = res.evaluateInfos; + }); + this.service.request(this.service.$api_getBillEvaluateDriverByShipper, params2).subscribe(res => { + console.log(res); + this.diverList = res.evaluateInfos; + }); + } + /** + *变更运费 + */ + updateFreight(item: any) { + this.service.request(this.service.$api_getFreightChangeBulkDetail, { id: item.id }).subscribe(data => { + if (data) { + const modal = this.modal.create({ + nzTitle: '变更运费', + nzWidth: 580, + nzContent: UpdateFreightComponent, + nzComponentParams: { data: { ...data, billId: item.id } }, + nzFooter: null + }); + modal.afterClose.subscribe((res: any) => { + if (res) { + this.st.reload(1); + this.getGoodsSourceStatistical(); + } + }); + } + }); + } + + // *确认签收 + + confirmReceipt(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认签收', + nzWidth: '50%', + nzContent: ConfirReceiptComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical(); + }); + } + userAction() { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('请选择订单!'); + return; + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + this.service.request(this.service.$api_get_batchSignBulkOrder, params).subscribe(res => { + if (res) { + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + } + // 取消订单 + cancellation(item: any) { + // api_get_cancelAnOrder + this.modal.confirm({ + nzTitle: '确定取消该订单吗?', + nzContent: `取消后无法恢复,请确认`, + nzOnOk: () => + this.service.request(this.service.$api_get_cancelAnOrder, { id: item.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.st?.reload(1); + this.getGoodsSourceStatistical(); + this.initST(); + } + this.st?.reload(1); + this.getGoodsSourceStatistical(); + }) + }); + } + revoke(item: any) { + this.modal.confirm({ + nzTitle: '是否确定立即撤销费用变更!', + nzOnOk: () => + this.service.request(this.service.$api_get_revokeChangeRecord, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('撤销成功!'); + this.stFloat.reload(); + this.st?.reload(1); + this.getGoodsSourceStatistical(); + } + }) + }); + } + // 修改订单 + changeOrder(value: any) { + this.router.navigate(['order-management/bulk-detailChange', value.id]); + } + /** +*申请退款 +*/ + applyRefund(item: any) { + const modalRef = this.modal.create({ + nzTitle: '申请退款', + nzContent: OneCarOrderCancelConfirmComponent, + nzComponentParams: { + i: item, + sts: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: boolean) => { + if (res) { + this.resetSF; + this.st.load(); + } + }); + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_get_asyncExportBulkList); + } +} diff --git a/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.html b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.html new file mode 100644 index 00000000..a9a97694 --- /dev/null +++ b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

    投诉单号:{{datailList?.complaintCode}}

    + + + + + + + + +
    + + + + + +
    {{i?.nodeNameLabel}}
    +

    + {{i?.timeLabel}}:{{i?.time}} +

    +

    + {{i?.resultLabel}}:{{i?.result}} +

    +
    +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.less b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.less new file mode 100644 index 00000000..0df0abc9 --- /dev/null +++ b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.less @@ -0,0 +1,10 @@ +.info{ + color: #666; +} +:host{ + ::ng-deep{ + .dealBox .ant-card-body{ + width: 500px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.spec.ts b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.spec.ts new file mode 100644 index 00000000..8939201f --- /dev/null +++ b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-04 17:29:18 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:19:01 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\complaint-detail\\complaint-detail.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementComplaintDetailComponent } from './complaint-detail.component'; + +describe('OrderManagementComplaintDetailComponent', () => { + let component: OrderManagementComplaintDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementComplaintDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementComplaintDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.ts b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.ts new file mode 100644 index 00000000..0c311e0e --- /dev/null +++ b/src/app/routes/order-management/components/complaint-detail/complaint-detail.component.ts @@ -0,0 +1,259 @@ +import { Component, OnInit, ViewChild, ɵɵsetComponentScope } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../services/order-management.service'; +// import { RiskOrderService } from '../../services/risk-order.service'; +// import { CtcAppealComponent } from '../appeal/appeal.component'; + +@Component({ + selector: 'app-oder-management-component-risk-detail', + templateUrl: './complaint-detail.component.html', + styleUrls: ['./complaint-detail.component.less'] +}) +export class OrderManagementComplaintDetailComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + isVisibleRE = false; + channelId: any; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + i: any; + datailList: any = { + complainantName: '', + complainantPartyLabel: '' + }; + complaint: any; + complaintStatus = false + id: string = ''; + constructor(private modal: NzModalService, public service: OrderManagementService, public ar: ActivatedRoute) { + this.id = this.ar.snapshot.params.id; + } + + ngOnInit(): void { + if (this.id) + { + this.getDetail(this.id); + console.log(this.ar.snapshot.queryParams.sts); + + this.initSF(); + this.initSTAudit() + } + + } + initSTAudit() { + this.schemaView = { + properties: { + handleResult: { + title: '处理结果', + type: 'string', + maxLength: 50, + ui: { + placeholder: '最多不超过50字', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + }, + }, + }, + required: ['handleResult'] + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + initSF() { + this.schema = { + properties: { + shpComplaintCauseLabel: { + title: '投诉原因', + type: 'string', + maxLength: 30, + ui: { + hidden: this.ar.snapshot.queryParams.sts == 2, + widget: 'text', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, + }, + drvComplaintCauseLabel: { + title: '投诉原因', + type: 'string', + maxLength: 30, + ui: { + hidden: this.ar.snapshot.queryParams.sts == 1, + widget: 'text', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, + }, + complainantName: { + title: '托运方', + type: 'string', + maxLength: 30, + ui: { + widget: 'text', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, + }, + complainantIdLabel: { + title: '司机', + type: 'string', + maxLength: 30, + ui: { + widget: 'text', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, + }, + complaintDetails: { + title: '投诉详情', + type: 'string', + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { + minRows: 4, + maxRows: 4 + } + }, + readOnly: true + } as SFTextareaWidgetSchema, + imgUrls: { + type: 'string', + title: '上传凭证', + ui: { + widget: 'custom' + } + }, + }, + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $title1: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $unit: { + spanLabelFixed: 20, + grid: { span: 3 }, + }, + }; + } + getDetail(id: string) { + this.service.request(this.service.$api_get_getComplaintDriverDetails, { id }).subscribe(res => { + if (res) { + this.datailList = res; + this.complaint = JSON.parse(this.ar.snapshot.queryParams.detail) + this.datailList.complainantName = this.complaint?.shipperAppUserName + this.datailList.complainantPartyLabel = this.complaint?.driverIdLabel + } + }) + } + + edit(item: any): void { + const modalRef = this.modal.create({ + nzTitle: '申诉', + nzWidth: '40%', + // nzContent: CtcAppealComponent, + nzComponentParams: { + i: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + if (res) { + + } + }) + } + goBack() { + window.history.go(-1) + } + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + if(!this.sfView.valid) { + this.service.msgSrv.error('请填写处理结果!') + return + } + const paramsa = { + ...this.sfView.value, + handleStatus: 0, + id: this.channelId + } + this.service.request(this.service.$api_get_dealWithComplaint, paramsa).subscribe((res: any) =>{ + if(res) { + this.service.msgSrv.success('已拒绝!') + this.isVisibleRE = false + this.getDetail(this.id); + this.complaintStatus = true; + } else{ + this.service.msgSrv.error(res?.msg) + } + }) + this.isVisibleRE = false + } + Cancel() { + this.isVisibleRE = false + } + handleCancel2() { + if(!this.sfView.valid) { + this.service.msgSrv.error('请填写处理结果!') + return + } + const paramsa = { + id: this.channelId + } + this.service.request(this.service.$api_get_canelComplaint, paramsa).subscribe((res: any) =>{ + if(res) { + this.service.msgSrv.success('已拒绝!') + this.isVisibleRE = false + this.getDetail(this.id); + this.complaintStatus = true; + } else{ + this.service.msgSrv.error(res?.msg) + } + }) + this.isVisibleRE = false + } + /** + * 审核通过按钮 + */ + handleOK() { + if(!this.sfView.valid) { + this.service.msgSrv.error('请填写处理结果!') + return + } + const paramsa = { + ...this.sfView.value, + handleStatus: 1, + id: this.channelId + } + this.service.request(this.service.$api_get_dealWithComplaint, paramsa).subscribe((res: any) =>{ + if(res) { + this.service.msgSrv.success('已通过!') + this.isVisibleRE = false + this.complaintStatus = true; + this.getDetail(this.id); + } else{ + this.service.msgSrv.error(res?.msg) + } + }) + } + viewEvaluate() { + this.isVisibleRE = true + this.channelId = this.id; + } +} diff --git a/src/app/routes/order-management/components/complaint/complaint.component.html b/src/app/routes/order-management/components/complaint/complaint.component.html new file mode 100644 index 00000000..da667180 --- /dev/null +++ b/src/app/routes/order-management/components/complaint/complaint.component.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +
    +
    + + + + + + +
    + + + {{item.complaintCode}} + + +
    {{item?.drvComplaintCauseLabel}}
    +
    {{item?.complaintCauseLabel}}
    +
    +
    +
    +
    + + + + + + + + + + + + + + diff --git a/src/app/routes/order-management/components/complaint/complaint.component.less b/src/app/routes/order-management/components/complaint/complaint.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/order-management/components/complaint/complaint.component.spec.ts b/src/app/routes/order-management/components/complaint/complaint.component.spec.ts new file mode 100644 index 00000000..361a453a --- /dev/null +++ b/src/app/routes/order-management/components/complaint/complaint.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-07 14:46:19 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:18:47 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\complaint\\complaint.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementComplaintComponent } from './complaint.component'; + +describe('OrderManagementComplaintComponent', () => { + let component: OrderManagementComplaintComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementComplaintComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementComplaintComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/complaint/complaint.component.ts b/src/app/routes/order-management/components/complaint/complaint.component.ts new file mode 100644 index 00000000..a0e077a1 --- /dev/null +++ b/src/app/routes/order-management/components/complaint/complaint.component.ts @@ -0,0 +1,393 @@ +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; + +@Component({ + selector: 'app-supply-management-complaint', + templateUrl: './complaint.component.html', + styleUrls: ['./complaint.component.less'] +}) +export class OrderManagementComplaintComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + isVisibleRE = false; + _$expand = false; + channelId: any; + resourceStatus: any; + selectedMainTabStatus = '2'; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + selectedIndex: number = 0; + isLoading: boolean = false; + mainTabs = [ + { name: '司机投诉', status: '2' }, + { name: '货主投诉', status: '1' } + ]; + tabs = [ + { + name: '全部', + type: 0 + }, + { + name: '待处理', + type: 1 + }, + { + name: '已处理', + type: 2 + }, + { + name: '已撤销', + type: 3 + } + ]; + constructor(public service: OrderManagementService, private modal: NzModalService, private router: Router) { + // console.log(this.selectedIndex); + // if (this.selectedIndex === 0) { + // this.selectedMainTabStatus = '2'; + // } else if (this.selectedIndex === 1) { + // this.selectedMainTabStatus = '1'; + // } + } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.complaintStatus = this.resourceStatus; + } + if (this.selectedMainTabStatus) { + a.complainantParty = this.selectedMainTabStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params + }; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSTAudit(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + complaintCode: { + type: 'string', + title: '投诉单号' + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + } + }, + complaintCause: { + title: '投诉原因', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'drvcomplaint:cause' }, + hidden: this.selectedMainTabStatus == '1', + containsAllLabel: true + } as SFSelectWidgetSchema + }, + shpComplaintCause: { + title: '投诉原因', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'drvcomplaint:cause' }, + hidden: this.selectedMainTabStatus == '2', + containsAllLabel: true + } as SFSelectWidgetSchema + }, + complainantTime: { + type: 'string', + + title: '投诉时间', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFDateWidgetSchema + } + } + }; + this.ui = { + '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 8 } } + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '投诉单号', + width: '200px', + fixed: 'left', + className: 'text-center', + render: 'complaintCode' + }, + { + title: '运单号', + width: '200px', + className: 'text-center', + index: 'wayBillCode' + }, + { + title: '投诉时间', + width: '170px', + index: 'complainantTime', + className: 'text-center' + }, + { title: '托运方', index: 'shipperAppUserName', width: '200px', className: 'text-center' }, + { title: '司机', index: 'driverName', width: '120px', className: 'text-center' }, + // { + // title: '投诉原因', + // className: 'text-center', + // width: '170px', + // render: 'complaintCauseLabel' + // }, + { + title: '投诉原因', + iif: value => this.selectedMainTabStatus == '1', + index: 'shpComplaintCauseLabel', + className: 'text-center', + width: '170px' + }, + { + title: '投诉原因', + iif: value => this.selectedMainTabStatus == '2', + index: 'drvComplaintCauseLabel', + className: 'text-center', + width: '170px' + }, + { + title: '投诉状态', + className: 'text-center', + width: '120px', + index: 'complaintStatusLabel' + }, + { + title: '处理人', + className: 'text-center', + width: '200px', + index: 'handlerName' + }, + { + title: '处理时间', + className: 'text-center', + width: '200px', + index: 'handleTime' + }, + { + title: '处理结果', + className: 'text-center', + width: '170px', + index: 'handleResult' + }, + { + title: '投诉方', + className: 'text-center', + width: '120px', + index: 'complainantPartyLabel' + }, + { + title: '投诉人', + className: 'text-center', + width: '120px', + index: 'complainantName' + }, + { + title: '操作', + fixed: 'right', + width: '100px', + className: 'text-center', + buttons: [ + // { + // text: '处理', + // click: (_record) => this.viewEvaluate(_record), + // iif: (item) => item.complaintStatus == 1 + // }, + { + text: '查看', + click: _record => this.view(_record), + acl: { ability: ['ORDER-COMPLAINT-view'] } + } + ] + } + ]; + } + initSTAudit() { + this.schemaView = { + properties: { + handleResult: { + title: '处理结果', + type: 'string', + maxLength: 50, + ui: { + placeholder: '最多不超过50字', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } + } + }, + required: ['handleResult'] + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) {} + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this.isLoading = true; + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + /** + * 切换投诉与被投诉tab + */ + selectMainTab(e: any) { + this.selectedMainTabStatus = e?.status; + this.resourceStatus = ''; + this.initST(); + this.initSF(); + setTimeout(() => { + this.st.load(1); + }); + } + + /** + * 导入货源 + */ + importGoodsSource() {} + audit(item: any) {} + + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + const paramsa = { + ...this.sfView.value, + handleStatus: 0, + id: this.channelId + }; + this.service.request(this.service.$api_get_dealWithComplaint, paramsa).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('已拒绝!'); + this.isVisibleRE = false; + this.st.reload(1); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + this.isVisibleRE = false; + } + Cancel() { + this.isVisibleRE = false; + } + handleCancel2() { + const paramsa = { + id: this.channelId + }; + this.service.request(this.service.$api_get_canelComplaint, paramsa).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('已拒绝!'); + this.isVisibleRE = false; + this.st.reload(1); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + this.isVisibleRE = false; + } + /** + * 审核通过按钮 + */ + handleOK() { + const paramsa = { + ...this.sfView.value, + handleStatus: 1, + id: this.channelId + }; + this.service.request(this.service.$api_get_dealWithComplaint, paramsa).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('已通过!'); + this.isVisibleRE = false; + this.st.reload(1); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + this.isVisibleRE = true; + this.channelId = item.id; + } + view(value: any) { + this.router.navigate(['/order-management/complaint-detail/' + value.id], { + queryParams: { + detail: JSON.stringify(value), + sts: this.selectedMainTabStatus + } + }); + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_asyncExportComplaintListDrv); + } +} diff --git a/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.html b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.html new file mode 100644 index 00000000..0803df06 --- /dev/null +++ b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.html @@ -0,0 +1,197 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + +
    + + + {{ item.freightPrice | currency }} + + +
    装 | {{ item?.loadingTime }}
    +
    卸 | {{ item?.unloadingTime }}
    +
    + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : '' }}{{ item?.carNo ? "/" + item?.carNo : '' }}
    +
    + +
    {{ item?.payeeName }}{{ item?.payeePhone ? "/" + item?.payeePhone : '' }}
    +
    + + {{ item.billCode }} + {{ item.billCode }} + {{ item.billCode }} +
    + {{ item?.billStatusLabel }} +
    +
    + {{item?.billTypeLabel}}{{item?.serviceTypeLabel === item?.billTypeLabel ? '':item?.serviceTypeLabel}} +
    +
    + +
    {{ item?.goodsName }}
    +
    + {{ item?.weight ? item?.weight + '吨/' : '' }} + {{ item?.volume ? item?.volume + '方/' : '' }} + {{ item?.goodsNumber ? item?.goodsNumber + '吨' : '' }} +
    +
    + +
    +

    + {{ data.expenseName }}:{{ data.price | currency }} + {{ data.paymentStatusLabel }} +

    +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + {{ index + 1 }} + + + + + + + + + + + + + + {{ item.amountBeforeChange | currency }} + + ¥{{ item.amountchangeValue | number: '0.2-2' }} + + {{ item.amountAfterChange | currency }} + + +
    变更原因:{{ ViewCause?.changeCause }}
    +
    拒绝原因:{{ ViewCause?.refuseCause }}
    +
    注:附加费依据调整后的运输费用重新计算
    +
    + + + + +
    diff --git a/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.less b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.less new file mode 100644 index 00000000..149a0bc9 --- /dev/null +++ b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.spec.ts b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.spec.ts new file mode 100644 index 00000000..2baa9abc --- /dev/null +++ b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:03:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-19 16:47:34 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\receipts-audit\\receipts-audit.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementReceiptsAuditComponent } from './compliance-audit.component'; + +describe('OrderManagementReceiptsAuditComponent', () => { + let component: OrderManagementReceiptsAuditComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementReceiptsAuditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementReceiptsAuditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.ts b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.ts new file mode 100644 index 00000000..9009e89a --- /dev/null +++ b/src/app/routes/order-management/components/compliance-audit/compliance-audit.component.ts @@ -0,0 +1,701 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; +import { UpdateFreightComponent } from '../../modal/bulk/update-freight/update-freight.component'; +import { ConfirReceiptComponent } from '../../modal/bulk/confir-receipt/confir-receipt.component'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { Router } from '@angular/router'; +import { OneCarOrderAppealComponent } from '../../modal/audit/appeal/appeal.component'; + +@Component({ + selector: 'app-order-management-compliance-audit', + templateUrl: './compliance-audit.component.html', + styleUrls: ['./compliance-audit.component.less'] +}) +export class OrderManagementComplianceAuditComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + changeId: any; // 主页面查看运费变更记录id - 用于运费变更记录 + changeViewId: any; // 查看运费变更记录id - 用于查看 + auditId: any; + auditIdR: any; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + isVisibleRE = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + ViewCause: any; // 变更运费查看数据 + resourceStatus: any; + tabs = { + totalCount: 0, + qualifiedtity: 0, + spotQuantity: 0, + unstayQuantity: 0 + }; + constructor( + public service: OrderManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus >= 0) { + a.complianceStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }; + } + get changeParams() { + return { + id: this.changeId + }; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + get changeViewParams() { + return { + id: this.changeViewId + }; + } + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + getGoodsSourceStatistical() { + this.tabs = { + totalCount: 0, + qualifiedtity: 0, + spotQuantity: 0, + unstayQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.complianceStatus + this.service.request(this.service.$api_get_getComplianceStatisticalStatus, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((element: any) => { + if (element.complianceStatusLabel === '待抽查') { + this.tabs.spotQuantity = element.quantity; + } else if (element.complianceStatusLabel === '合格') { + this.tabs.qualifiedtity = element.quantity; + } else if (element.complianceStatusLabel === '不合格') { + this.tabs.qualifiedtity = element.quantity; + } + totalCount += element.quantity; + }); + this.tabs.totalCount = totalCount; + } + }); + } + selectChange(e: number) { + this.resourceStatus = e - 1; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + ngOnInit(): void { + this.getGoodsSourceStatistical(); + this.initSF(); + this.initST(); + this.initSTFloat(); + this.initSTFloatView(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + paymentStatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '订单号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'billCode' + }, + { + title: '费用明细', + width: '250px', + className: 'text-right', + render: 'mybidDetailInfo' + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '220px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '220px', className: 'text-left' }, + { title: '所属项目', index: 'enterpriseProjectName', width: '220px', className: 'text-left' }, + { title: '关联运单号', index: 'wayBillCode', width: '220px', className: 'text-left' }, + { title: '货源编号', index: 'resourceCode', width: '180px', className: 'text-left' }, + { title: '服务类型', index: 'serviceTypeLabel', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '180px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '180px', + index: 'unloadingAddressArr' + }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsName' + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + index: 'driverName', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '180px', + index: 'payeeName', + render: 'payeeName' + }, + { + title: '装卸货时间', + width: '200px', + className: 'text-left', + render: 'loadingTime' + }, + { + title: '创建时间', + width: '180px', + className: 'text-left', + index: 'createTime' + }, + { + title: '审核人', + width: '180px', + className: 'text-left', + index: 'complianceName' + }, + { + title: '审核时间', + width: '180px', + className: 'text-left', + index: 'complianceTime' + }, + { + title: '状态', + width: '180px', + className: 'text-left', + index: 'complianceStatusLabel' + }, + { + title: '操作', + fixed: 'right', + width: '140px', + className: 'text-center block-td', + buttons: [ + { + text: '查看申诉记录', + click: _record => this.appeal(_record), + // iif: item => item.billStatus == '5' + }, + { + text: '运费变更记录', + click: _record => this.OpenPrice(_record), + // iif: item => item.billStatus == '4', + acl: { ability: ['ORDER-COMPLIANCE-AUDIT-listChangeApply'] }, + }, + { + text: '合规抽查', + click: _record => this.audit(_record), + iif: item => item.complianceStatus == '0', + acl: { ability: ['ORDER-COMPLIANCE-AUDIT-updateBillByCompliance'] }, + }, + ] + } + ]; + } + initSTFloat() { + this.columnsFloat = [ + { + title: '序号', + className: 'text-center', + render: 'order' + }, + { + title: '操作时间', + className: 'text-center', + index: 'applyTime' + }, + { + title: '操作人', + className: 'text-center', + index: 'applyUserName' + }, + { title: '状态', index: 'handleStatusLabel', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (_record) => this.FloatView(_record), + }, + { + text: '撤销', + click: (_record) => this.revoke(_record), + iif: item => item.handleStatus === '1' || item.handleStatus === 1, + }, + ], + }, + ]; + } + initSTFloatView() { + this.columnsFloatView = [ + { + title: '费用名称', + width: '100px', + className: 'text-center', + index: 'costName' + }, + { + title: '变更前', + width: '100px', + className: 'text-center', + index: 'amountAfterChange', + render: 'amountAfterChange' + }, + { + title: '变更值', + index: 'amountchangeValue', + render: 'amountchangeValue', + width: '120px', + className: 'text-center' + }, + { + title: '变更后', + index: 'amountBeforeChange', + render: 'amountBeforeChange', + width: '120px', + className: 'text-center' + } + ]; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + // 申诉记录 + appeal(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '申诉', + // nzContent: OneCarOrderAppealComponent, + // nzComponentParams: { + // i: item + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe((res) => { + // if(res){ + // this.resetSF; + // this.st.load(); + // } + // }); + this.router.navigate(['/order-management/risk-detail', item.id]); + } + /** +* 浮动费用查看 +*/ + FloatView(item: any) { + console.log(item) + this.changeViewId = item.id; + this.service.request(this.service.$api_getChangeRecordWholeDetail, { id: this.changeViewId }).subscribe((res) => { + this.ViewCause = res; + }) + this.isVisibleView = true + } + revoke(item: any) { + this.modal.confirm({ + nzTitle: '是否确定立即撤销费用变更!', + nzOnOk: () => + this.service.request(this.service.$api_get_revokeChangeRecord, { id: item.id }).subscribe((res) => { + console.log(res) + if (res) { + this.service.msgSrv.success('撤销成功!') + this.stFloat.reload() + } + }) + }); + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + /** + * 导入货源 + */ + importGoodsSource() { } + OpenPrice(item: any) { + this.changeId = item.id; + this.isVisible = true; + } + + initSTAudit(value: number) { + if (value == 1) { + this.schemaView = { + properties: { + billCode: { + title: '订单号', + type: 'string', + default: this.auditId, + ui: { + widget: 'text' + } + }, + complianceRemark: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '合格可以不用填写原因 ,不合格必须说明原因', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } + } + } + }; + } else { + this.schemaView = { + properties: { + billCode: { + title: '', + type: 'string', + default: `已选${this.selectedRows?.length}条订单`, + ui: { + widget: 'text' + } + }, + complianceRemark: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '合格可以不用填写原因 ,不合格必须说明原因', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } + } + } + }; + } + + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /* + * 审核关闭弹窗 + */ + handleCancel(value?: string) { + if (value === '0') { + this.isVisible = false; + } else if (value === '1') { + this.isVisibleRE = false; + } else if (value === '2') { + this.isVisibleView = false; + } + } + /** +* 审核通过按钮 +*/ + handleOK() { + let idList: any[] = []; + if (this.selectedRows.length > 0) { + this.selectedRows.forEach(item => { + idList.push(item.id); + }); + } else { + idList.push(this?.auditIdR) + } + const parms = { + ids: idList, + complianceRemark: this.sfView.value.complianceRemark, + complianceStatus: 1, + }; + this.service.request(this.service.$api_get_updateBillByCompliance, parms).subscribe(res => { + if (res) { + this.service.msgSrv.success('提交成功!'); + this.isVisibleRE = false; + this.st?.load(1); + this.getGoodsSourceStatistical() + } + }); + } + /** + * 审核拒绝按钮 + */ + reject() { + if (!this.sfView.value.complianceRemark) { + this.service.msgSrv.error('备注不能为空!'); + return; + } + let idList: any[] = []; + if (this.selectedRows.length > 0) { + this.selectedRows.forEach(item => { + idList.push(item.id); + }); + } else { + idList.push(this.sfView.value.billCode) + } + const parms = { + ids: idList, + complianceRemark: this.sfView.value.complianceRemark, + complianceStatus: 2, + }; + this.service.request(this.service.$api_get_updateBillByCompliance, parms).subscribe(res => { + if (res) { + this.service.msgSrv.success('提交成功!'); + this.isVisibleRE = false; + this.st?.load(1); + this.getGoodsSourceStatistical() + } + }); + } + /** +*合规抽查 +*/ + audit(item?: any) { + if (item) { + this.isVisibleRE = true; + this.auditId = item.billCode; + this.auditIdR = item.id; + this.initSTAudit(1); + } else { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('请选择订单!') + return; + } else { + this.isVisibleRE = true; + this.initSTAudit(2); + } + } + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_get_asyncExportSpotCheckList); + } +} diff --git a/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.html b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.html new file mode 100644 index 00000000..cabacf83 --- /dev/null +++ b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.html @@ -0,0 +1,137 @@ +billCode + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + +
    + + + {{ item.freightPrice | currency }} + + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    装 | {{ item?.loadingTime }}
    +
    卸 | {{ item?.unloadingTime }}
    +
    + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : ''}}{{ item?.carNo ? "/" + item?.carNo : '' }}
    +
    + +
    {{ item?.payeeName }}{{item?.payeePhone ? "/" + item?.payeePhone : '' }}
    +
    + + + {{ item.billCode }} + {{ item.billCode }} + {{ item.billCode }} +
    + {{item?.billStatusLabel}} +
    +
    + {{item?.resourceTypeLabel}}{{item?.serviceTypeLabel === item?.resourceTypeLabel ? '':item?.serviceTypeLabel}} +
    +
    + +
    {{ item?.goodsName }}
    +
    + {{ item?.weight ? item?.weight + '吨/' : '' }} + {{ item?.volume ? item?.volume + '方/' : '' }} + {{ item?.goodsNumber ? item?.goodsNumber + '件' : '' }} +
    +
    + +
    +

    + {{ data.expenseName }}:{{ data.price | currency }} + {{ data.paymentStatusLabel }} +

    +
    +
    +
    +
    +
    + + +
    + + +
    +
    diff --git a/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.less b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.less new file mode 100644 index 00000000..3b21fa16 --- /dev/null +++ b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.less @@ -0,0 +1,22 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + ::ng-deep { + .imgBox { + display: flex; + img { + width: 60px !important; + } + } + } + } + \ No newline at end of file diff --git a/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.spec.ts b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.spec.ts new file mode 100644 index 00000000..9c92d180 --- /dev/null +++ b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.spec.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 20:03:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-19 16:47:34 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\receipts-audit\\receipts-audit.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementReceiptsAuditComponent } from './receipts-audit.component'; + +describe('OrderManagementReceiptsAuditComponent', () => { + let component: OrderManagementReceiptsAuditComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementReceiptsAuditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementReceiptsAuditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.ts b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.ts new file mode 100644 index 00000000..5588a7b0 --- /dev/null +++ b/src/app/routes/order-management/components/receipts-audit/receipts-audit.component.ts @@ -0,0 +1,583 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; +import { UpdateFreightComponent } from '../../modal/bulk/update-freight/update-freight.component'; +import { ConfirReceiptComponent } from '../../modal/bulk/confir-receipt/confir-receipt.component'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { Router } from '@angular/router'; +import { orderManagementVoucherViewComponent } from '../../modal/audit/voucher-view/voucher-view.component'; + +@Component({ + selector: 'app-order-management-receipts-audit', + templateUrl: './receipts-audit.component.html', + styleUrls: ['./receipts-audit.component.less'] +}) +export class OrderManagementReceiptsAuditComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + loading: boolean = true; + resourceStatus: any; + tabs = { + receivedQuantity: 0, + stayQuantity: 0, + totalCount: 0 + }; + constructor( + public service: OrderManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + private router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.auditStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const a: any = {}; + if (this.resourceStatus) { + a.auditStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + if (this.sf) { + Object.assign(requestOptions.body, { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }); + } + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data) + this.loading = false + return data.map(item => ({ + ...item, + // disabled: item.billStatus !== '4' + })); + }; + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + getGoodsSourceStatistical() { + this.tabs = { + receivedQuantity: 0, + stayQuantity: 0, + totalCount: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.auditStatus + this.service.request(this.service.$api_get_getAuditStatistical, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((element: any) => { + if (element.auditStatus == '1') { + this.tabs.receivedQuantity = element.quantity; + } else if (element.auditStatus == '2') { + this.tabs.stayQuantity = element.quantity; + } + totalCount += element.quantity; + }); + this.tabs.totalCount = totalCount; + } + }); + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + this.getGoodsSourceStatistical(); + }, 500); + } + ngOnInit(): void { + this.getGoodsSourceStatistical(); + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入' + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + paymentStatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + billStatus: { + title: '运输状态', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'bill:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + loadingDocuments: { + type: 'string', + title: '装卸货凭证', + enum:[ + {label: '全部',value: ''}, + {label: '无装卸货凭证',value: '1'}, + {label: '装卸货凭证齐全',value: '2'}, + {label: '只有装货凭证',value: '3'}, + {label: '只有卸货凭证',value: '4'}, + ], + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + } + }, + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '订单号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'billCode' + }, + { + title: '运费明细', + width: '250px', + className: 'text-right', + render: 'mybidDetailInfo' + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '250px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '250px', className: 'text-left' }, + { title: '所属项目', index: 'enterpriseProjectName', width: '250px', className: 'text-left' }, + { title: '货源编号', index: 'resourceCode', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '180px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '180px', + index: 'unloadingAddressArr' + }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsName' + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + index: 'driverName', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '180px', + index: 'payeeName', + render: 'payeeName' + }, + { + title: '装卸货时间', + width: '200px', + className: 'text-left', + render: 'loadingTime' + }, + { + title: '装货凭证', + width: '180px', + className: 'text-left', + render: 'loadingLadingBillFilePath' + }, + { + title: '卸货凭证', + width: '180px', + className: 'text-left', + render: 'unloadingLadingBillFilePath' + }, + { + title: '操作', + fixed: 'right', + width: '136px', + className: 'text-center block-td', + buttons: [ + { + text: '生成电子单据', + click: _record => this.generate(_record, 2), + iif: item => !item?.loadingElectronicsLadingBillFilePath, + acl: { ability: ['ORDER-RECEIPTS-electronicBillingOne'] }, + }, + { + text: '通过', + click: _record => this.sign(_record), + iif: item => !item?.loadingElectronicsLadingBillFilePath, + acl: { ability: ['ORDER-RECEIPTS-billAuditPassBatch'] }, + }, + { + text: '修改', + click: _record => this.modification(_record), + iif: item => !item?.loadingElectronicsLadingBillFilePath, + acl: { ability: ['ORDER-RECEIPTS-updateBillExamine'] }, + }, + { + text: '查看凭证', + click: _record => this.generate(_record, 3), + iif: item => item?.loadingElectronicsLadingBillFilePath, + acl: { ability: ['ORDER-RECEIPTS-view'] }, + }, + ] + } + ]; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + /** + * 导入货源 + */ + importGoodsSource() { } + audit(item: any) { } + + /** + * 审核通过按钮 + */ + handleOK() { } + OpenPrice(item: any) { + this.isVisible = true; + } + // 修改 + modification(item: any) { + const modalRef = this.modal.create({ + nzTitle: '修改', + nzWidth: '50%', + nzContent: orderManagementVoucherViewComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical() + }); + } + // 生成电子单据 + generate(item: any, sts?: number) { + let text = '查看凭证'; + if (sts == 2) { + text = '生成电子单据'; + } + const modalRef = this.modal.create({ + nzTitle: text, + nzWidth: '50%', + nzContent: orderManagementVoucherViewComponent, + nzComponentParams: { + i: item, + Status: sts + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + if(result) { + this.st.load(); + this.getGoodsSourceStatistical() + } + }); + } + // 通过 + sign(item?: any) { + let params: any = [] + let text = ''; + if (item === '1') { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('请选择订单!') + return + } + this.selectedRows.forEach(ite => { + params.push(ite.id); + }); + text = `已选择${this.selectedRows.length}条订单,确认批量通过审核吗?` + } else { + text = `确认通过审核吗?` + params.push(item.id); + } + console.log(this.selectedRows) + console.log(params) + this.modal.confirm({ + nzTitle: text, + nzContent: `通过后不可修改,可以再生成电子单据。`, + nzOnOk: () => + this.service.request(this.service.$api_get_billAuditPass, params).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.st?.reload(1); + this.getGoodsSourceStatistical(); + this.initST(); + } + this.st?.reload(1); + this.getGoodsSourceStatistical(); + }) + }); + } + // 批量生成电子单据 + sign1(item?: any) { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.error('请选择订单!') + return + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item?.id); + }); + this.modal.confirm({ + nzTitle: `已选择${this.selectedRows.length}条订单,确认批量生成电子单据吗?`, + nzContent: `确认后单据不可修改,请谨慎操作。`, + nzOnOk: () => + { + this.service.downloadFile(this.service.$api_createBillTakeGoods,params) + this.service.downloadFile(this.service.$api_createBillDischargeGoods,params) + this.service.msgSrv.success('生成成功!'); + this.st?.reload() + // this.getGoodsSourceStatistical(); + } + }) + } + // 获取所属项目 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_get_asyncExportExamineBillList); + } +} diff --git a/src/app/routes/order-management/components/risk-detail/risk-detail.component.html b/src/app/routes/order-management/components/risk-detail/risk-detail.component.html new file mode 100644 index 00000000..1ec6ca16 --- /dev/null +++ b/src/app/routes/order-management/components/risk-detail/risk-detail.component.html @@ -0,0 +1,64 @@ + + + + + + + + + {{i?.billCode}} + + {{i?.representationsStatusLabel}} + + {{i?.driverName ? i?.driverName + '/': ''}} {{i?.driverPhone ?i?.driverPhone + '/': '' }} {{i?.carNo}} + {{i?.carCaptainName ? i?.carCaptainName+ '/' : ''}}{{i?.carCaptainPhone}} + {{i?.loadTime}} + {{i?.unloadTime}} + {{i?.loadingPlace}} + {{i?.dischargePlace}} + +
    +
    +
    {{items.complianceName}}
    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    {{item?.operationContent}}
    +
    驳回原因:{{i?.auditRemark}}
    +
    操作人:{{item?.operator}}
    +
    +
    +
    diff --git a/src/app/routes/order-management/components/risk-detail/risk-detail.component.less b/src/app/routes/order-management/components/risk-detail/risk-detail.component.less new file mode 100644 index 00000000..0df0abc9 --- /dev/null +++ b/src/app/routes/order-management/components/risk-detail/risk-detail.component.less @@ -0,0 +1,10 @@ +.info{ + color: #666; +} +:host{ + ::ng-deep{ + .dealBox .ant-card-body{ + width: 500px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/risk-detail/risk-detail.component.spec.ts b/src/app/routes/order-management/components/risk-detail/risk-detail.component.spec.ts new file mode 100644 index 00000000..02ad6800 --- /dev/null +++ b/src/app/routes/order-management/components/risk-detail/risk-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementRiskDetailComponent } from './risk-detail.component'; + +describe('OrderManagementRiskDetailComponent', () => { + let component: OrderManagementRiskDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementRiskDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementRiskDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/risk-detail/risk-detail.component.ts b/src/app/routes/order-management/components/risk-detail/risk-detail.component.ts new file mode 100644 index 00000000..d982d8f4 --- /dev/null +++ b/src/app/routes/order-management/components/risk-detail/risk-detail.component.ts @@ -0,0 +1,160 @@ +import { Component, OnInit, ViewChild, ɵɵsetComponentScope } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../services/order-management.service'; +// import { RiskOrderService } from '../../services/risk-order.service'; +// import { CtcAppealComponent } from '../appeal/appeal.component'; + +@Component({ + selector: 'app-oder-management-component-risk-detail', + templateUrl: './risk-detail.component.html', + styleUrls: ['./risk-detail.component.less'] +}) +export class OrderManagementRiskDetailComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + ui: SFUISchema = {}; + schema: SFSchema = {}; + // abnormalReason = [ + // '司机装货轨迹异常', + // '司机卸货轨迹异常', + // '车辆装货轨迹异常', + // '司机位置未移动,或运输途中未打开APP', + // '运单轨迹严重异常' + // ] + i: any; + logList: any = []; + id: string = ''; + constructor(private modal: NzModalService, public service: OrderManagementService, public ar: ActivatedRoute) { + this.id = this.ar.snapshot.params.id; + } + + ngOnInit(): void { + if (this.id) + { + this.getDetail(this.id); + this.initSF(); + } + + } + initSF() { + this.schema = { + properties: { + representationsCauseLabel: { + title: '申诉原因', + type: 'string', + maxLength: 30, + ui: { + widget: 'text', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, + }, + representationsDescribe: { + title: '申诉描述', + type: 'string', + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { + minRows: 4, + maxRows: 4 + } + }, + + readOnly: true + + } as SFTextareaWidgetSchema, + uploadVanchor: { + type: 'string', + title: '上传凭证', + ui: { + widget: 'custom' + } + }, + }, + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $title1: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $unit: { + spanLabelFixed: 20, + grid: { span: 3 }, + }, + }; + } + /** + * 获取详情 + * @param id + */ + getDetail(id: string) { + this.service.request(this.service.$api_get_getRiskDetail, { id }).subscribe(res => { + if (res) { + this.i = Object.assign({}, res); + console.log(this.i); + let list: any = []; + this.i.fileArr.map((item: any, index: number) => { + const obj = { + uid: index, + name: '文件' + (index + 1), + status: 'done', + url: item, + }; + list.push(obj); + }); + this.i.uploadVanchor = list; + this.initSF(); + this.getLog(this.i?.billCode); + } + }) + } + // getDetail(id: string) { + + // this.service.request(this.service.$api_get_getRiskDetail, { id }).subscribe(res => { + // if (res) { + // this.i = res; + // } + // }) + // } + + edit(item: any): void { + const modalRef = this.modal.create({ + nzTitle: '申诉', + nzWidth: '40%', + // nzContent: CtcAppealComponent, + nzComponentParams: { + i: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + if (res) { + + } + }) + } + goBack() { + window.history.go(-1) + } + /** + * 获取操作日志 + */ + getLog(operateObject: any) { + this.service.request(this.service.$api_get_risk_order_log, { operateObject, operateType: '8', size: 100 }).subscribe(res => { + this.logList = res?.records; + }) + } +} diff --git a/src/app/routes/order-management/components/risk/risk.component.html b/src/app/routes/order-management/components/risk/risk.component.html new file mode 100644 index 00000000..6236f606 --- /dev/null +++ b/src/app/routes/order-management/components/risk/risk.component.html @@ -0,0 +1,145 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + +
    + + + + + {{ item.billCode }} + {{ item.billCode }} + {{ item.billCode }} +
    + {{ item?.representationsStatusLabel }} +
    +
    + {{item?.billTypeLabel}}{{item?.billTypeLabel === item?.serviceTypeLabel ? '' : item?.serviceTypeLabel}} +
    +
    + +

    创建时间:{{ item?.createTime }}

    +

    装货时间:{{ item?.loadTime }}

    +

    卸货时间:{{ item?.unloadTime }}

    +
    + +
    +
    {{items.complianceName}}
    +
    +
    + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : '' }}{{ item?.carNo ? "/" + item?.carNo : ''}}
    +
    + +
    +
    {{item.payeeName}}
    +
    {{item.payeePhone}}
    +
    +
    -
    +
    + +
    +

    {{ data.expenseName }}:{{ data.price | currency }}

    +
    +
    + +
    +

    货物名称:{{ i?.goodsName }}

    +

    重量/体积:{{ i?.weight ? i?.weight + '吨' : '' }}{{ i?.volume ? "/" + i?.volume + '方' : ''}}

    +

    车型/车长:{{ i?.carModelLabel }} {{ i?.carLengthLabel ? "/" + i?.carLengthLabel : ''}}

    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    + +
    +
    diff --git a/src/app/routes/order-management/components/risk/risk.component.less b/src/app/routes/order-management/components/risk/risk.component.less new file mode 100644 index 00000000..987664d0 --- /dev/null +++ b/src/app/routes/order-management/components/risk/risk.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/risk/risk.component.spec.ts b/src/app/routes/order-management/components/risk/risk.component.spec.ts new file mode 100644 index 00000000..7885a90c --- /dev/null +++ b/src/app/routes/order-management/components/risk/risk.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-07 14:27:59 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:19:18 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\risk\\risk.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementRiskComponent } from './risk.component'; + +describe('OrderManagementRiskComponent', () => { + let component: OrderManagementRiskComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementRiskComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementRiskComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/risk/risk.component.ts b/src/app/routes/order-management/components/risk/risk.component.ts new file mode 100644 index 00000000..400d1fb0 --- /dev/null +++ b/src/app/routes/order-management/components/risk/risk.component.ts @@ -0,0 +1,552 @@ +import { registerLocaleData } from '@angular/common'; +import { Router } from '@angular/router'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { OrderManagementService } from '../../services/order-management.service'; + +@Component({ + selector: 'app-supply-management-risk', + templateUrl: './risk.component.html', + styleUrls: ['./risk.component.less'] +}) +export class OrderManagementRiskComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + loading: boolean = true; + auditId: any; + auditIdR: any; + isVisibleRE = false; + resourceStatus: any; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + tabs = { + underwayQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0 + }; + constructor( + public service: OrderManagementService, + public shipperservice: ShipperBaseService, + private modal: NzModalService, + public router: Router + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.representationsStatus = this.resourceStatus + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '', + }, + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const a: any = {}; + if (this.resourceStatus) { + a.representationsStatus = this.resourceStatus + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + if (this.sf) { + Object.assign(requestOptions.body, { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '', + }, + }); + } + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data) + this.loading = false + return data.map(item => ({ + ...item, + disabled: item.representationsStatus !== '2' + })); + }; + search() { + this.st?.load(1); + this.getGoodsSourceStatistical() + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + ngOnInit(): void { + this.getGoodsSourceStatistical() + this.initSF(); + this.initST(); + } + getGoodsSourceStatistical() { + this.service.request(this.service.$api_get_listStatisticalStatus, this.reqParams).subscribe(res => { + if (res) { + res.forEach((element: any) => { + console.log(element.representationsStatus); + if(element.representationsStatus === '1') { + this.tabs.stayQuantity = element.quantity + } else if (element.representationsStatus == '4') { + this.tabs.cancelQuantity = element.quantity + } else if (element.representationsStatus == '3') { + this.tabs.receivedQuantity = element.quantity + }else if (element.representationsStatus == '2') { + this.tabs.underwayQuantity = element.quantity + } + }); + console.log(this.tabs) + } + }) + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入订单号' + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + externalResourceCode: { + type: 'string', + title: '外部订单号' + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + payeeName: { + type: 'string', + title: '车队长', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + wayBillType: { + title: '运单类型', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'bill:type' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + shipperAppUserName: { + type: 'string', + title: '托运人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.enterpriseName } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + }, + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', width: '50px', className: 'text-center' }, + { + title: '订单号', + width: '200px', + className: 'text-left', + render: 'billCode' + }, + { + title: '申诉状态', + width: '180px', + className: 'text-left', + index: 'representationsStatusLabel' + }, + { + title: '货源编号', + width: '200px', + className: 'text-left', + index: 'resourceCode' + }, + { + title: '异常信息', + width: '200px', + className: 'text-left', + render: 'billComplianceVOS' + }, + { title: '托运人', index: 'shipperName', width: '200px', className: 'text-left' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '250px', className: 'text-left' }, + { + title: '运费明细', + className: 'text-right', + width: '200px', + render: 'freightDetails' + }, + { + title: '服务类型', + className: 'text-left', + width: '100px', + index: 'serviceTypeLabel' + }, + { + title: '装货地', + className: 'text-left', + width: '250px', + index: 'loadingPlace' + }, + { + title: '卸货地', + className: 'text-left', + width: '250px', + index: 'dischargePlace' + }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsInfoVOList' + }, + { + title: '承运司机', + className: 'text-left', + width: '200px', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '200px', + render: 'payeeName' + }, + { + title: '运输信息', + className: 'text-left', + width: '280px', + render: 'timeer' + }, + { + title: '操作', + fixed: 'right', + width: '90px', + className: 'text-center block-td', + buttons: [ + { + text: '审核', + click: _record => this.audit(_record), + iif: item => item.representationsStatus == '2' , + acl: { ability: ['ORDER-RISK-audit'] }, + }, + { + text: '详情', + click: _record => this.viewEvaluate(_record), + iif: item => item.representationsStatus !== '1' , + acl: { ability: ['ORDER-RISK-riskDetail'] }, + } + ] + } + ]; + } + initSTAudit(value: number) { + if (value == 1) { + this.schemaView = { + properties: { + billCode: { + title: '订单号', + type: 'string', + default: this.auditId, + ui: { + widget: 'text' + } + }, + id: { + title: '', + type: 'string', + default: this.auditIdR, + ui: { + hidden: true + } + }, + representationsCause: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '通过可以不用填写原因 ,拒绝必须说明原因', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } + } + } + }; + } else { + this.schemaView = { + properties: { + billCode: { + title: '', + type: 'string', + default: `已选${this.selectedRows?.length}条订单`, + ui: { + widget: 'text' + } + }, + representationsCause: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '通过可以不用填写原因 ,拒绝必须说明原因', + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } + } + } + }; + } + + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item); + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + /** + * 导入货源 + */ + importGoodsSource() { } + + /* + * 审核关闭弹窗 + */ + handleCancel() { + this.isVisibleRE = false; + } + /** + * 审核通过按钮 + */ + handleOK() { + let idList: any[] = []; + if (this.selectedRows.length > 0) { + this.selectedRows.forEach(item => { + idList.push(item.id); + }); + } else { + idList.push(this.sfView.value.id) + } + const parms = { + ids: idList, + auditRemark: this.sfView.value.representationsCause, + representationsStatus: 3, + auditStatus: 2, + }; + this.service.request(this.service.$api_get_listRisk_audit, parms).subscribe(res => { + if (res) { + this.service.msgSrv.success('审核通过成功!'); + this.isVisibleRE = false; + this.st?.load(1); + this.getGoodsSourceStatistical() + } + }); + } + /** + * 审核拒绝按钮 + */ + reject() { + let idList: any[] = []; + if (this.selectedRows.length > 0) { + this.selectedRows.forEach(item => { + idList.push(item.id); + }); + } else { + idList.push(this.sfView.value.id) + } + if (!this.sfView.value.representationsCause) { + this.service.msgSrv.error('拒绝原因为空!'); + return; + } + const parms = { + ids: idList, + auditRemark: this.sfView.value.representationsCause, + representationsStatus: 4, + auditStatus: 3, + }; + this.service.request(this.service.$api_get_listRisk_audit, parms).subscribe(res => { + if (res) { + this.service.msgSrv.success('审核拒绝成功!'); + this.isVisibleRE = false; + this.st?.load(1); + this.getGoodsSourceStatistical() + } + }); + } + /** + *审核 + */ + audit(item?: any) { + if (item) { + this.auditId = item.billCode; + this.auditIdR = item.id; + this.initSTAudit(1); + this.isVisibleRE = true; + } else { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('请选择订单!') + return; + } else { + this.initSTAudit(2); + this.isVisibleRE = true; + } + } + } + /** + *查看详情 + */ + viewEvaluate(item: any) { + this.router.navigate(['/order-management/risk-detail', item.id]); + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_get_asyncExportRiskBillList); + } +} diff --git a/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.html b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.html new file mode 100644 index 00000000..aa888e78 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.html @@ -0,0 +1,345 @@ + + + + + + + +
    + +

    订单号: {{ i?.billCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.goodsResource?.enterpriseInfoName }} + {{ i?.goodsResource?.shipperAppUserName }} + {{ i?.goodsResource?.enterpriseProjectName }} + {{ i?.goodsResource?.serviceTypeLabel }} + {{ i?.createUserName }} {{ i?.createUserPhone ? '/' + i?.createUserPhone : '' }} + {{ i?.goodsResource?.dispatchName }}{{ i?.goodsResource?.dispatchPhone ? '/' + i?.goodsResource?.dispatchPhone : '' }} + + {{ i?.externalBillCode }} + {{ i?.goodsResource?.resourceCode }} + {{ i?.wayBillId }} + {{ i?.goodsResource?.paymentDays }} +
    + + + + + + + + +
    +
    +
    + +
    +
    +   +   +   +   +
    +
    +
    + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    +
    +
    +
    +
    + + 装货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + {{ i?.carModel }}{{ i?.carLength ? '/' + i?.carLength : '' }} + + + {{ i?.driverName }}{{i?.driverPhone ? "/" + i?.driverPhone : ''}}{{ i?.carNo ? "/" + i?.carNo : ''}} + + + + {{ i?.driverCarModelLabel }},{{ i?.driverCarLengthLabel }}米,{{ i?.driverCarWeight }}吨 + + + + + + + + + + + + + + + {{ item.price | currency }} + + + {{ item.price + item.surcharge | currency }} + + + {{ item.surcharge | currency }} + + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ (i?.totalRate * 100).toFixed(2) }}% ) +
    +
    车队长:{{ i?.payeeName }}{{ i?.payeePhone ? '/' + + i?.payeePhone : '' }}/{{ i?.payeeIdNo }}
    +
    + + + + + 查看附件      + 补充协议 + + + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + {{ i?.supplementaryInformationVO?.receiptUserName }} / {{ i?.supplementaryInformationVO?.phon }} + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + + + + +
    + +
    请上传图片
    +
    +
    + +
    + + {{ i?.goodsResource?.remarks }} + +
    +
    + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + +
    暂无附件信息
    +
    +
    + + + + +
    diff --git a/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.less b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.less new file mode 100644 index 00000000..a59b9526 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.less @@ -0,0 +1,33 @@ +:host { + + .tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; + } + + .card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; + } + + .align-center { + display: flex; + align-items: center; + justify-content: center; + } + .align-center2 { + display: flex; + align-items: center; + } + #container { + width: 300px; + height: 180px; + } + :host { + ::ng-deep { + nz-input-number{width: 100%;} + } + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.spec.ts b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.spec.ts new file mode 100644 index 00000000..e9236973 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementVehicleDetailChangeComponent } from './vehicle-detail-change.component'; + +describe('OrderManagementVehicleDetailChangeComponent', () => { + let component: OrderManagementVehicleDetailChangeComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementVehicleDetailChangeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementVehicleDetailChangeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.ts b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.ts new file mode 100644 index 00000000..48c2c347 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail-change/vehicle-detail-change.component.ts @@ -0,0 +1,1007 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-23 13:39:58 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-11 19:26:34 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\vehicle-detail-change\\vehicle-detail-change.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { AmapPoiPickerComponent, AmapService, EACacheService, EAEnvironmentService, ShipperBaseService } from '@shared'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer } from 'rxjs'; +import { map } from 'rxjs/operators'; +import format from 'date-fns/format'; +import { OrderManagementService } from '../../services/order-management.service'; +function getBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); +} +@Component({ + selector: 'app-supply-management-vehicle-detail-change', + templateUrl: './vehicle-detail-change.component.html', + styleUrls: ['./vehicle-detail-change.component.less', '../../../commom/less/trajectory.less'] +}) +export class OrderManagementVehicleDetailChangeComponent implements OnInit { + validateForm1: FormGroup; + id = this.route.snapshot.params.id; + @ViewChild('distannce3', { static: false }) + i: any = { unLoadingPlaceList: [] }; + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + startInfo: any = []; // 装货信息 + endInfo: any = []; // 卸货信息 + unloadTime: any; // 货源单设置回显 + loadTime: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + dirverPhone: any; // 货源单设置回显 + dirverBankCard: any; // 货源单设置回显 + listImagUrls: any[] = []; // 货源单设置回显 + billExpenses: any[] = []; //运费信息表格信息 + dirvingMessage = []; + modalcontent: any; + modalTitle: string = ''; + attObj: any; + totalObj: any; + approvalLsit: any; + imges: any; + previewImage1 = ''; + previewVisible1 = false; + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + @ViewChild('st') st!: STComponent; + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + isVisible = false; + ui4!: SFUISchema; + formData: any; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + logColumns: STColumn[] = [ + { title: '款项', index: 'expenseCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatusLabel', + } + ]; + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + constructor( + private route: ActivatedRoute, + private router: Router, + private msgSrv: NzMessageService, + public service: OrderManagementService, + private modalService: NzModalService, + private amapService: AmapService, + public shipperservice: ShipperBaseService, + private ar: ActivatedRoute, + fb: FormBuilder, + private envSrv: EAEnvironmentService + ) { + this.validateForm1 = fb.group({ + loadTime: [null, []], + unloadTime: [null, []] + }); + } + + ngOnInit(): void { + this.initData(); + this.initSF3(); + this.initSF4(); + this.initSF(); + } + initSF() { + this.schema = { + properties: { + loadingLadingBillFilePath: { + type: 'string', + title: '装货凭证', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + loadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no7: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + }, + unloadingLadingBillFilePath: { + type: 'string', + title: '卸货凭证', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + unloadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`, + `上传位置:${this.i?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no5: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + }, + no6: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '' + } + }, + required: ['loadingLadingBillFilePath', 'unloadingLadingBillFilePath'] + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + }, + $unloadingLadingBillFilePath: { grid: { span: 12 } }, + $unloadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + $loadingLadingBillFilePath: { grid: { span: 12 } }, + $loadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + $no4: { grid: { span: 24 } } + }; + } + initData() { + this.service.request(this.service.$api_get_getWholeBillDetail, { id: this.id }).subscribe(res => { + // console.log(res); + // console.log(JSON.stringify(res)); + if (res) { + this.i = res; + // this.initSF(); + this.approvalLsit = res?.scheduleVOList; + this.billExpenses = this.i?.billExpenseDetails?.filter( + (data: any) => data.expenseCode === 'PRE' || data.expenseCode === 'RECE' || data.expenseCode === 'BACK' + ); + this.approvalLsit.map((item: any, key: any) => { + if (item.displayStatus === 'HIDE') { + delete this?.approvalLsit?.[key]; + } + }); + // 对装货凭证进行初始化 + let arr: any = []; + res?.receiptFilePath.forEach((element: any, index: any) => { + arr.push({ + url: element, + status: 'done', + uid: index + }); + }); + this.listImagUrls = arr; + this.sf4data = res?.goodsInfoList?.[0]; + this.sf3data = { + goodsTypeId: res?.goodsInfoList[0]?.goodsTypeId || '', + goodsTypeName: res?.goodsInfoList[0]?.goodsTypeName || '', + goodsNameId: res?.goodsInfoList[0]?.goodsNameId || '', + goodsName: res?.goodsInfoList[0]?.goodsName || '' + }; + if (this.sf3data.goodsTypeName === '其它') { + this.sf3data.goodsName1 = res?.goodsInfoList[0]?.goodsName || ''; + } + this.changeGoodsType(this.sf3data?.goodsTypeId, { label: this.sf3data?.goodsTypeName, value: this.sf3data?.goodsTypeId }); + // 对装卸货信息进行初始化 + res?.unLoadingPlaceList.forEach((element: any) => { + if (element.type === 1 || element.type === '1') { + const controlId = this.startInfo.length; + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required)); + } else if (element.type === 2 || element.type === '2') { + const controlId = this.endInfo.length; + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required)); + } + }); + // 对装货凭证进行初始化 + this.formData = { + loadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.loadingLadingBillFilePath, + response: { + url: res?.loadingLadingBillFilePath + } + } + ], + loadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.loadingPeopleVehiclesGoodsFilePath, + response: { + url: res?.loadingPeopleVehiclesGoodsFilePath, + } + } + ], + unloadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.unloadingLadingBillFilePath, + response: { + url: res?.unloadingLadingBillFilePath + } + } + ], + unloadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res?.unloadingPeopleVehiclesGoodsFilePath, + response: { + url: res?.unloadingPeopleVehiclesGoodsFilePath + } + } + ] + }; + // 发车时间到车时间初始化 + this.loadTime = res?.loadTime; + this.unloadTime = res?.unloadTime; + this.dirvingMessage = res?.billExpenseDetails; + // 计算里程,时间 + if (this.startInfo?.[0]?.area && this.endInfo?.[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + // 取消修改 + cancelChange() { + window.history.go(-1); + } + // 保存修改 + save() { + let imgList: any = []; + if (this.listImagUrls.length > 0) { + this.listImagUrls?.forEach((res: any) => { + if (res?.url) { + imgList.push(res?.url); + } + }); + } + if (typeof this.unloadTime !== 'string') { + var c = new Date(this.unloadTime); + this.unloadTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + } + if (typeof this.loadTime !== 'string') { + var c = new Date(this.loadTime); + this.loadTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + } + const params = { + id: this.id, + unLoadingPlaceDTOList: [...this.startInfo, ...this.endInfo], + receiptFilePath: imgList, + goodsInfoDTOList: [ + { + id: this.i?.goodsInfoList?.[0].id, + goodsName: this.sf3.value?.goodsName, + ...this.sf4.value + } + ], + // 运费信息 + billExpenseDetailDTOList: this.st._data, + // 车队长 + payeeId: this.dirverPhone, + dirverBankCard: this.dirverBankCard, // 银行卡 + // 发车时间 + loadTime: this.loadTime, + // 到车时间 + unloadTime: this.unloadTime, + loadingLadingBillFilePath: this.sf.value?.loadingLadingBillFilePath?.data + ? this.sf.value?.loadingLadingBillFilePath.data.fullFilePath + : this.sf.value?.loadingLadingBillFilePath?.url, + + loadingPeopleVehiclesGoodsFilePath: this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.data + ? this.sf.value?.loadingPeopleVehiclesGoodsFilePath.data.fullFilePath + : this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.url, + + unloadingLadingBillFilePath: this.sf.value?.unloadingLadingBillFilePath?.data + ? this.sf.value?.unloadingLadingBillFilePath.data.fullFilePath + : this.sf.value?.unloadingLadingBillFilePath?.url, + + unloadingPeopleVehiclesGoodsFilePath: this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.data + ? this.sf.value?.unloadingPeopleVehiclesGoodsFilePath.data.fullFilePath + : this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.url + }; + this.service.request(this.service.$api_set_modifyWholeOrder, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('修改成功!'); + this.router.navigate(['/order-management/vehicle/vehicle-detail/', this.id], { relativeTo: this.ar }); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + } + addPreZero(num: any) { + if (num < 10) { + return '0' + num; + } else { + return num; + } + } + // -------------------装卸货信息处理 + // 打开地图 + openMap(type: string, index: number, address: string) { + const modalRef = this.modalService.create({ + nzTitle: '', + nzComponentParams: { selectedAddress: address }, + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + if (item?.poi) { + const poi = item.poi; + const locList = poi.pois; + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.formattedAddress; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.addressComponent.province; + this.startInfo[index].city = poi.addressComponent.city; + this.startInfo[index].area = poi.addressComponent.district; + this.startInfo[index].address = poi.formattedAddress; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.formattedAddress; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.addressComponent.province; + this.endInfo[index].city = poi.addressComponent.city; + this.endInfo[index].area = poi.addressComponent.district; + this.endInfo[index].address = poi.formattedAddress; + break; + default: + break; + } + + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe((res: any) => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + return true + } else { + this.service.msgSrv.warning('请重新手动选择地址!') + return false + } + } + }); + } + initSF3() { + this.schema3 = { + properties: { + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物类型' }, + asyncData: () => + this.shipperservice.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value: any, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (_value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 110, + grid: { span: 12 } + } + }; + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget?.reset(res); + if (this.sf3data.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId); + } + } + }); + } + initSF4() { + this.schema4 = { + properties: { + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '必填项' } + } + }, + volume: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + number: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + carmand: { + type: 'string', + title: '用车需求', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + drivers: { + type: 'string', + title: '承运司机', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + weightModel: { + type: 'string', + title: '车型车长承重', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + loadTime: { + type: 'string', + title: '发车时间', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + unloadTime: { + type: 'string', + title: '到车时间', + ui: { + widget: 'custom', + placeholder: '请输入' + } + } + }, + required: ['weight', 'loadPlanTime', 'unloadPlanTime'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 110, + grid: { span: 24 } + }, + $weight: { + grid: { span: 8 } + }, + $volume: { + grid: { span: 8 } + }, + $number: { + grid: { span: 8 } + }, + $carmand: { + grid: { span: 24 } + }, + $weightModel: { + spanLabelFixed: 120, + grid: { span: 12 } + }, + $drivers: { + grid: { span: 12 } + }, + $loadPlanTime: { + grid: { span: 12 } + }, + $unloadPlanTime: { + grid: { span: 12 } + } + }; + } + // 处理上传图片 + handlePreview1 = async (file: NzUploadFile) => { + if (!file.url && !file.preview) { + file.preview = await getBase64(file.originFileObj!); + } + console.log('888888888'); + + this.previewImage1 = file.url || file.preview; + this.previewVisible1 = true; + }; + + handleChange1(info: NzUploadChangeParam): void { + switch (info.file.status) { + case 'uploading': + break; + case 'done': + let fileList = [...info.fileList]; + // 2. Read from response and show file link + fileList = fileList.map((file: any) => { + if (file.response) { + file.url = file.response.data.fullFilePath; + } + return file; + }); + break; + case 'error': + this.service.msgSrv.error('网络错误'); + break; + } + } + beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => { + return new Observable((observer: Observer) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/bmp'; + if (!isJpgOrPng) { + this.service.msgSrv.warning('只能上传图片!'); + observer.complete(); + return; + } + // tslint:disable-next-line: no-non-null-assertion + const isLt2M = file.size! / 1024 / 1024 < 3; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过3兆!'); + observer.complete(); + return; + } + observer.next(isJpgOrPng && isLt2M); + observer.complete(); + }); + }; + agreement(value: any) { + if (value === '1') { + this.modalTitle = '附件信息'; + this.modalcontent = this.i?.contractContent?.contractContent; + + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + } + this.isVisible = true; + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + // elf['elementRef'].nativeElement.className = 'target-fix' + } + } + // 装卸货地址互换 + swapAddress() { + this.startInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + }); + this.endInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + }); + + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any, index: any) => { + element.type = '1'; + this.validateForm1.addControl(`loadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + this.endInfo.forEach((element: any, index: any) => { + element.type = '2'; + this.validateForm1.addControl(`unloadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + // 计算里程,时间 + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res?.distance; + this.totalTime = res?.time; + }); + } + } + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res?.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res?.parkArray; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res?.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/order-management/components/vehicle-detail/rs.ts b/src/app/routes/order-management/components/vehicle-detail/rs.ts new file mode 100644 index 00000000..aea038b3 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail/rs.ts @@ -0,0 +1,25283 @@ +export const RS = [ + { + gtm: '20220317/224613', + mil: '780559.5', + hgt: '76', + spd: '10.2', + agl: '330', + lon: '66498483', + lat: '13141860' + }, + { + gtm: '20220317/224643', + mil: '780559.7', + hgt: '51', + spd: '10.7', + agl: '2', + lon: '66498269', + lat: '13142367' + }, + { + gtm: '20220317/224705', + mil: '780559.7', + hgt: '47', + spd: '16.3', + agl: '11', + lon: '66498339', + lat: '13142830' + }, + { + gtm: '20220317/224713', + mil: '780559.8', + hgt: '51', + spd: '14.9', + agl: '14', + lon: '66498393', + lat: '13143025' + }, + { + gtm: '20220317/224713', + mil: '780559.8', + hgt: '51', + spd: '14.9', + agl: '14', + lon: '66498393', + lat: '13143025' + }, + { + gtm: '20220317/224729', + mil: '780559.9', + hgt: '45', + spd: '15.3', + agl: '6', + lon: '66498445', + lat: '13143426' + }, + { + gtm: '20220317/224743', + mil: '780559.9', + hgt: '51', + spd: '15.0', + agl: '30', + lon: '66498546', + lat: '13143728' + }, + { + gtm: '20220317/224813', + mil: '780560.1', + hgt: '44', + spd: '21.1', + agl: '31', + lon: '66498997', + lat: '13144461' + }, + { + gtm: '20220317/224843', + mil: '780560.2', + hgt: '35', + spd: '16.4', + agl: '28', + lon: '66499512', + lat: '13145220' + }, + { + gtm: '20220317/224900', + mil: '780560.3', + hgt: '30', + spd: '17.7', + agl: '39', + lon: '66499728', + lat: '13145520' + }, + { + gtm: '20220317/224900', + mil: '780560.3', + hgt: '30', + spd: '17.7', + agl: '39', + lon: '66499728', + lat: '13145520' + }, + { + gtm: '20220317/224905', + mil: '780560.3', + hgt: '28', + spd: '21.9', + agl: '41', + lon: '66499830', + lat: '13145637' + }, + { + gtm: '20220317/224906', + mil: '780560.3', + hgt: '28', + spd: '21.4', + agl: '47', + lon: '66499854', + lat: '13145659' + }, + { + gtm: '20220317/224913', + mil: '780560.4', + hgt: '25', + spd: '21.1', + agl: '47', + lon: '66500028', + lat: '13145823' + }, + { + gtm: '20220317/224914', + mil: '780560.4', + hgt: '24', + spd: '20.0', + agl: '47', + lon: '66500052', + lat: '13145842' + }, + { + gtm: '20220317/224915', + mil: '780560.4', + hgt: '24', + spd: '19.5', + agl: '46', + lon: '66500074', + lat: '13145862' + }, + { + gtm: '20220317/224927', + mil: '780560.4', + hgt: '22', + spd: '16.7', + agl: '40', + lon: '66500253', + lat: '13146115' + }, + { + gtm: '20220317/224943', + mil: '780560.5', + hgt: '36', + spd: '27.1', + agl: '69', + lon: '66500775', + lat: '13146328' + }, + { + gtm: '20220317/224948', + mil: '780560.6', + hgt: '40', + spd: '27.0', + agl: '68', + lon: '66501021', + lat: '13146424' + }, + { + gtm: '20220317/225005', + mil: '780560.7', + hgt: '61', + spd: '7.1', + agl: '80', + lon: '66501525', + lat: '13146588' + }, + { + gtm: '20220317/225013', + mil: '780560.7', + hgt: '56', + spd: '0.0', + agl: '84', + lon: '66501565', + lat: '13146581' + }, + { + gtm: '20220317/225018', + mil: '780560.7', + hgt: '56', + spd: '0.0', + agl: '84', + lon: '66501565', + lat: '13146581' + }, + { + gtm: '20220317/225043', + mil: '780560.7', + hgt: '56', + spd: '0.0', + agl: '84', + lon: '66501565', + lat: '13146581' + }, + { + gtm: '20220317/225113', + mil: '780560.7', + hgt: '56', + spd: '0.0', + agl: '84', + lon: '66501565', + lat: '13146581' + }, + { + gtm: '20220317/225121', + mil: '780560.7', + hgt: '56', + spd: '0.0', + agl: '84', + lon: '66501565', + lat: '13146581' + }, + { + gtm: '20220317/225143', + mil: '780560.7', + hgt: '55', + spd: '16.2', + agl: '91', + lon: '66501933', + lat: '13146576' + }, + { + gtm: '20220317/225213', + mil: '780560.9', + hgt: '59', + spd: '22.0', + agl: '92', + lon: '66502924', + lat: '13146576' + }, + { + gtm: '20220317/225215', + mil: '780560.9', + hgt: '59', + spd: '24.1', + agl: '92', + lon: '66503001', + lat: '13146577' + }, + { + gtm: '20220317/225217', + mil: '780561.0', + hgt: '58', + spd: '24.3', + agl: '90', + lon: '66503080', + lat: '13146581' + }, + { + gtm: '20220317/225243', + mil: '780561.1', + hgt: '74', + spd: '21.6', + agl: '93', + lon: '66504141', + lat: '13146549' + }, + { + gtm: '20220317/225313', + mil: '780561.3', + hgt: '56', + spd: '28.0', + agl: '89', + lon: '66505386', + lat: '13146502' + }, + { + gtm: '20220317/225336', + mil: '780561.5', + hgt: '48', + spd: '26.2', + agl: '94', + lon: '66506431', + lat: '13146441' + }, + { + gtm: '20220317/225343', + mil: '780561.6', + hgt: '43', + spd: '22.6', + agl: '93', + lon: '66506718', + lat: '13146421' + }, + { + gtm: '20220317/225413', + mil: '780561.6', + hgt: '49', + spd: '0.0', + agl: '94', + lon: '66507154', + lat: '13146403' + }, + { + gtm: '20220317/225443', + mil: '780561.6', + hgt: '49', + spd: '0.0', + agl: '94', + lon: '66507154', + lat: '13146403' + }, + { + gtm: '20220317/225505', + mil: '780561.6', + hgt: '49', + spd: '0.0', + agl: '94', + lon: '66507154', + lat: '13146403' + }, + { + gtm: '20220317/225513', + mil: '780561.6', + hgt: '36', + spd: '7.9', + agl: '94', + lon: '66507165', + lat: '13146387' + }, + { + gtm: '20220317/225543', + mil: '780561.8', + hgt: '35', + spd: '19.3', + agl: '93', + lon: '66507985', + lat: '13146337' + }, + { + gtm: '20220317/225613', + mil: '780561.9', + hgt: '28', + spd: '14.1', + agl: '103', + lon: '66508750', + lat: '13146279' + }, + { + gtm: '20220317/225619', + mil: '780561.9', + hgt: '25', + spd: '14.0', + agl: '95', + lon: '66508894', + lat: '13146262' + }, + { + gtm: '20220317/225643', + mil: '780562.0', + hgt: '15', + spd: '0.0', + agl: '99', + lon: '66509109', + lat: '13146249' + }, + { + gtm: '20220317/225713', + mil: '780562.0', + hgt: '15', + spd: '0.0', + agl: '99', + lon: '66509109', + lat: '13146249' + }, + { + gtm: '20220317/225732', + mil: '780562.0', + hgt: '15', + spd: '0.0', + agl: '99', + lon: '66509109', + lat: '13146249' + }, + { + gtm: '20220317/225743', + mil: '780562.0', + hgt: '4', + spd: '7.5', + agl: '94', + lon: '66509184', + lat: '13146234' + }, + { + gtm: '20220317/225813', + mil: '780562.1', + hgt: '24', + spd: '24.2', + agl: '95', + lon: '66510111', + lat: '13146198' + }, + { + gtm: '20220317/225830', + mil: '780562.3', + hgt: '33', + spd: '26.9', + agl: '94', + lon: '66510832', + lat: '13146153' + }, + { + gtm: '20220317/225831', + mil: '780562.3', + hgt: '33', + spd: '25.8', + agl: '95', + lon: '66510876', + lat: '13146150' + }, + { + gtm: '20220317/225832', + mil: '780562.3', + hgt: '33', + spd: '25.9', + agl: '96', + lon: '66510919', + lat: '13146148' + }, + { + gtm: '20220317/225833', + mil: '780562.3', + hgt: '34', + spd: '26.2', + agl: '95', + lon: '66510964', + lat: '13146147' + }, + { + gtm: '20220317/225843', + mil: '780562.4', + hgt: '37', + spd: '27.2', + agl: '92', + lon: '66511410', + lat: '13146120' + }, + { + gtm: '20220317/225913', + mil: '780562.6', + hgt: '91', + spd: '25.7', + agl: '70', + lon: '66512685', + lat: '13146300' + }, + { + gtm: '20220317/225932', + mil: '780562.7', + hgt: '75', + spd: '28.5', + agl: '54', + lon: '66513418', + lat: '13146673' + }, + { + gtm: '20220317/225933', + mil: '780562.7', + hgt: '74', + spd: '29.2', + agl: '54', + lon: '66513457', + lat: '13146698' + }, + { + gtm: '20220317/225934', + mil: '780562.7', + hgt: '73', + spd: '27.7', + agl: '53', + lon: '66513495', + lat: '13146723' + }, + { + gtm: '20220317/225936', + mil: '780562.8', + hgt: '71', + spd: '27.4', + agl: '50', + lon: '66513565', + lat: '13146777' + }, + { + gtm: '20220317/225943', + mil: '780562.8', + hgt: '66', + spd: '30.7', + agl: '53', + lon: '66513816', + lat: '13146969' + }, + { + gtm: '20220317/225944', + mil: '780562.8', + hgt: '66', + spd: '31.9', + agl: '52', + lon: '66513858', + lat: '13147000' + }, + { + gtm: '20220317/225949', + mil: '780562.9', + hgt: '65', + spd: '35.5', + agl: '53', + lon: '66514063', + lat: '13147179' + }, + { + gtm: '20220317/225958', + mil: '780562.9', + hgt: '56', + spd: '19.8', + agl: '61', + lon: '66514438', + lat: '13147428' + }, + { + gtm: '20220317/225958', + mil: '780562.9', + hgt: '56', + spd: '19.8', + agl: '61', + lon: '66514438', + lat: '13147428' + }, + { + gtm: '20220317/225958', + mil: '780562.9', + hgt: '56', + spd: '19.8', + agl: '61', + lon: '66514438', + lat: '13147428' + }, + { + gtm: '20220317/230013', + mil: '780563.0', + hgt: '35', + spd: '22.4', + agl: '55', + lon: '66514874', + lat: '13147705' + }, + { + gtm: '20220317/230014', + mil: '780563.0', + hgt: '34', + spd: '23.0', + agl: '56', + lon: '66514906', + lat: '13147728' + }, + { + gtm: '20220317/230021', + mil: '780563.1', + hgt: '31', + spd: '11.9', + agl: '101', + lon: '66515097', + lat: '13147786' + }, + { + gtm: '20220317/230027', + mil: '780563.1', + hgt: '31', + spd: '12.6', + agl: '132', + lon: '66515218', + lat: '13147738' + }, + { + gtm: '20220317/230043', + mil: '780563.2', + hgt: '37', + spd: '18.8', + agl: '139', + lon: '66515529', + lat: '13147413' + }, + { + gtm: '20220317/230105', + mil: '780563.3', + hgt: '41', + spd: '22.7', + agl: '13', + lon: '66515956', + lat: '13147611' + }, + { + gtm: '20220317/230109', + mil: '780563.3', + hgt: '41', + spd: '23.8', + agl: '12', + lon: '66515988', + lat: '13147747' + }, + { + gtm: '20220317/230113', + mil: '780563.3', + hgt: '41', + spd: '25.0', + agl: '13', + lon: '66516024', + lat: '13147896' + }, + { + gtm: '20220317/230136', + mil: '780563.5', + hgt: '43', + spd: '28.4', + agl: '47', + lon: '66516330', + lat: '13148760' + }, + { + gtm: '20220317/230143', + mil: '780563.6', + hgt: '41', + spd: '29.7', + agl: '50', + lon: '66516582', + lat: '13148959' + }, + { + gtm: '20220317/230213', + mil: '780563.8', + hgt: '43', + spd: '29.6', + agl: '47', + lon: '66517686', + lat: '13149825' + }, + { + gtm: '20220317/230243', + mil: '780564.1', + hgt: '40', + spd: '30.4', + agl: '44', + lon: '66518746', + lat: '13150832' + }, + { + gtm: '20220317/230313', + mil: '780564.3', + hgt: '42', + spd: '30.1', + agl: '43', + lon: '66519807', + lat: '13151869' + }, + { + gtm: '20220317/230343', + mil: '780564.6', + hgt: '36', + spd: '29.2', + agl: '44', + lon: '66520805', + lat: '13152862' + }, + { + gtm: '20220317/230346', + mil: '780564.6', + hgt: '36', + spd: '28.9', + agl: '45', + lon: '66520902', + lat: '13152961' + }, + { + gtm: '20220317/230413', + mil: '780564.7', + hgt: '35', + spd: '0.0', + agl: '45', + lon: '66521376', + lat: '13153359' + }, + { + gtm: '20220317/230443', + mil: '780564.7', + hgt: '35', + spd: '0.0', + agl: '45', + lon: '66521376', + lat: '13153359' + }, + { + gtm: '20220317/230507', + mil: '780564.7', + hgt: '35', + spd: '0.0', + agl: '45', + lon: '66521376', + lat: '13153359' + }, + { + gtm: '20220317/230513', + mil: '780564.7', + hgt: '6', + spd: '6.8', + agl: '45', + lon: '66521403', + lat: '13153368' + }, + { + gtm: '20220317/230543', + mil: '780564.9', + hgt: '18', + spd: '28.5', + agl: '44', + lon: '66522042', + lat: '13154023' + }, + { + gtm: '20220317/230613', + mil: '780565.1', + hgt: '31', + spd: '35.1', + agl: '44', + lon: '66523083', + lat: '13155045' + }, + { + gtm: '20220317/230643', + mil: '780565.4', + hgt: '47', + spd: '37.1', + agl: '32', + lon: '66524071', + lat: '13156396' + }, + { + gtm: '20220317/230713', + mil: '780565.7', + hgt: '60', + spd: '38.7', + agl: '33', + lon: '66525061', + lat: '13157840' + }, + { + gtm: '20220317/230743', + mil: '780566.1', + hgt: '60', + spd: '39.1', + agl: '45', + lon: '66526254', + lat: '13159194' + }, + { + gtm: '20220317/230743', + mil: '780566.1', + hgt: '60', + spd: '39.1', + agl: '45', + lon: '66526254', + lat: '13159194' + }, + { + gtm: '20220317/230743', + mil: '780566.1', + hgt: '60', + spd: '39.1', + agl: '45', + lon: '66526254', + lat: '13159194' + }, + { + gtm: '20220317/230813', + mil: '780566.4', + hgt: '53', + spd: '37.6', + agl: '54', + lon: '66527692', + lat: '13160305' + }, + { + gtm: '20220317/230843', + mil: '780566.7', + hgt: '54', + spd: '38.4', + agl: '48', + lon: '66529095', + lat: '13161396' + }, + { + gtm: '20220317/230913', + mil: '780567.0', + hgt: '64', + spd: '34.6', + agl: '86', + lon: '66530649', + lat: '13162082' + }, + { + gtm: '20220317/230915', + mil: '780567.0', + hgt: '65', + spd: '35.4', + agl: '89', + lon: '66530763', + lat: '13162086' + }, + { + gtm: '20220317/230919', + mil: '780567.1', + hgt: '65', + spd: '36.3', + agl: '94', + lon: '66530993', + lat: '13162077' + }, + { + gtm: '20220317/230921', + mil: '780567.1', + hgt: '65', + spd: '35.5', + agl: '96', + lon: '66531108', + lat: '13162066' + }, + { + gtm: '20220317/230929', + mil: '780567.2', + hgt: '64', + spd: '36.1', + agl: '98', + lon: '66531582', + lat: '13162005' + }, + { + gtm: '20220317/230931', + mil: '780567.2', + hgt: '64', + spd: '35.7', + agl: '97', + lon: '66531696', + lat: '13161990' + }, + { + gtm: '20220317/230938', + mil: '780567.2', + hgt: '63', + spd: '34.2', + agl: '93', + lon: '66532104', + lat: '13161951' + }, + { + gtm: '20220317/230943', + mil: '780567.3', + hgt: '63', + spd: '33.1', + agl: '87', + lon: '66532371', + lat: '13161951' + }, + { + gtm: '20220317/231013', + mil: '780567.6', + hgt: '61', + spd: '37.2', + agl: '60', + lon: '66533866', + lat: '13162488' + }, + { + gtm: '20220317/231043', + mil: '780567.9', + hgt: '60', + spd: '38.5', + agl: '60', + lon: '66535446', + lat: '13163319' + }, + { + gtm: '20220317/231113', + mil: '780568.2', + hgt: '55', + spd: '42.8', + agl: '45', + lon: '66537104', + lat: '13164381' + }, + { + gtm: '20220317/231143', + mil: '780568.6', + hgt: '45', + spd: '43.8', + agl: '32', + lon: '66538313', + lat: '13165994' + }, + { + gtm: '20220317/231213', + mil: '780568.9', + hgt: '40', + spd: '43.3', + agl: '52', + lon: '66539695', + lat: '13167453' + }, + { + gtm: '20220317/231213', + mil: '780568.9', + hgt: '40', + spd: '43.3', + agl: '52', + lon: '66539695', + lat: '13167453' + }, + { + gtm: '20220317/231243', + mil: '780569.3', + hgt: '40', + spd: '39.8', + agl: '51', + lon: '66541329', + lat: '13168653' + }, + { + gtm: '20220317/231313', + mil: '780569.6', + hgt: '42', + spd: '42.3', + agl: '52', + lon: '66542914', + lat: '13169811' + }, + { + gtm: '20220317/231343', + mil: '780570.0', + hgt: '40', + spd: '42.2', + agl: '48', + lon: '66544515', + lat: '13171008' + }, + { + gtm: '20220317/231343', + mil: '780570.0', + hgt: '40', + spd: '42.2', + agl: '48', + lon: '66544515', + lat: '13171008' + }, + { + gtm: '20220317/231413', + mil: '780570.3', + hgt: '39', + spd: '39.0', + agl: '61', + lon: '66546042', + lat: '13172172' + }, + { + gtm: '20220317/231443', + mil: '780570.6', + hgt: '41', + spd: '39.7', + agl: '60', + lon: '66547695', + lat: '13173061' + }, + { + gtm: '20220317/231513', + mil: '780571.0', + hgt: '39', + spd: '38.4', + agl: '76', + lon: '66549426', + lat: '13173825' + }, + { + gtm: '20220317/231539', + mil: '780571.2', + hgt: '40', + spd: '39.1', + agl: '77', + lon: '66551091', + lat: '13174203' + }, + { + gtm: '20220317/231543', + mil: '780571.3', + hgt: '40', + spd: '36.4', + agl: '76', + lon: '66551327', + lat: '13174256' + }, + { + gtm: '20220317/231544', + mil: '780571.3', + hgt: '41', + spd: '34.7', + agl: '77', + lon: '66551382', + lat: '13174269' + }, + { + gtm: '20220317/231548', + mil: '780571.3', + hgt: '41', + spd: '32.0', + agl: '76', + lon: '66551586', + lat: '13174315' + }, + { + gtm: '20220317/231613', + mil: '780571.4', + hgt: '45', + spd: '0.0', + agl: '67', + lon: '66552084', + lat: '13174474' + }, + { + gtm: '20220317/231614', + mil: '780571.4', + hgt: '45', + spd: '0.0', + agl: '67', + lon: '66552084', + lat: '13174474' + }, + { + gtm: '20220317/231643', + mil: '780571.5', + hgt: '48', + spd: '15.4', + agl: '143', + lon: '66552511', + lat: '13174467' + }, + { + gtm: '20220317/231712', + mil: '780571.6', + hgt: '49', + spd: '18.5', + agl: '127', + lon: '66553162', + lat: '13173912' + }, + { + gtm: '20220317/231713', + mil: '780571.6', + hgt: '49', + spd: '18.0', + agl: '128', + lon: '66553185', + lat: '13173895' + }, + { + gtm: '20220317/231716', + mil: '780571.7', + hgt: '49', + spd: '15.7', + agl: '134', + lon: '66553245', + lat: '13173845' + }, + { + gtm: '20220317/231743', + mil: '780571.7', + hgt: '51', + spd: '0.0', + agl: '117', + lon: '66553477', + lat: '13173657' + }, + { + gtm: '20220317/231804', + mil: '780571.7', + hgt: '55', + spd: '5.0', + agl: '118', + lon: '66553642', + lat: '13173589' + }, + { + gtm: '20220317/231813', + mil: '780571.7', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231816', + mil: '780571.7', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231817', + mil: '780571.7', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231843', + mil: '780571.7', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231913', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231941', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231943', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/231943', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232013', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232020', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232043', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232113', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232121', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232122', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232143', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232203', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232205', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232207', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232213', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232213', + mil: '780571.8', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232216', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232243', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232303', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232313', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232329', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232343', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232359', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232401', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232410', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232413', + mil: '780571.9', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232443', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232513', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232543', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232613', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232643', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232701', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232705', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232710', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232713', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232713', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232717', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232718', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232721', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '113', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/232727', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/233227', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/233727', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/234227', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/234727', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/235227', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220317/235727', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220318/000227', + mil: '780572.0', + hgt: '56', + spd: '0.0', + agl: '0', + lon: '66553663', + lat: '13173575' + }, + { + gtm: '20220318/000704', + mil: '780572.0', + hgt: '0', + spd: '0.0', + agl: '121', + lon: '66553495', + lat: '13173439' + }, + { + gtm: '20220318/000726', + mil: '780572.0', + hgt: '152', + spd: '0.0', + agl: '106', + lon: '66553600', + lat: '13173413' + }, + { + gtm: '20220318/000756', + mil: '780572.0', + hgt: '52', + spd: '0.0', + agl: '97', + lon: '66553632', + lat: '13173574' + }, + { + gtm: '20220318/000804', + mil: '780572.0', + hgt: '60', + spd: '0.0', + agl: '103', + lon: '66553687', + lat: '13173552' + }, + { + gtm: '20220318/000826', + mil: '780572.0', + hgt: '94', + spd: '0.0', + agl: '75', + lon: '66553767', + lat: '13173543' + }, + { + gtm: '20220318/000847', + mil: '780572.0', + hgt: '64', + spd: '0.0', + agl: '307', + lon: '66553752', + lat: '13173535' + }, + { + gtm: '20220318/000856', + mil: '780572.1', + hgt: '61', + spd: '6.3', + agl: '113', + lon: '66553755', + lat: '13173528' + }, + { + gtm: '20220318/000856', + mil: '780572.1', + hgt: '61', + spd: '6.3', + agl: '113', + lon: '66553755', + lat: '13173528' + }, + { + gtm: '20220318/000857', + mil: '780572.1', + hgt: '61', + spd: '7.5', + agl: '113', + lon: '66553765', + lat: '13173523' + }, + { + gtm: '20220318/000858', + mil: '780572.1', + hgt: '61', + spd: '9.0', + agl: '112', + lon: '66553778', + lat: '13173519' + }, + { + gtm: '20220318/000926', + mil: '780572.2', + hgt: '66', + spd: '24.4', + agl: '113', + lon: '66554515', + lat: '13173276' + }, + { + gtm: '20220318/000930', + mil: '780572.2', + hgt: '67', + spd: '25.3', + agl: '113', + lon: '66554663', + lat: '13173220' + }, + { + gtm: '20220318/000930', + mil: '780572.2', + hgt: '67', + spd: '25.3', + agl: '113', + lon: '66554663', + lat: '13173220' + }, + { + gtm: '20220318/000932', + mil: '780572.2', + hgt: '68', + spd: '25.6', + agl: '114', + lon: '66554739', + lat: '13173190' + }, + { + gtm: '20220318/000939', + mil: '780572.3', + hgt: '71', + spd: '23.7', + agl: '110', + lon: '66555007', + lat: '13173096' + }, + { + gtm: '20220318/000956', + mil: '780572.4', + hgt: '74', + spd: '26.6', + agl: '102', + lon: '66555685', + lat: '13172874' + }, + { + gtm: '20220318/001021', + mil: '780572.6', + hgt: '66', + spd: '37.5', + agl: '59', + lon: '66556981', + lat: '13173084' + }, + { + gtm: '20220318/001025', + mil: '780572.7', + hgt: '66', + spd: '34.2', + agl: '47', + lon: '66557160', + lat: '13173222' + }, + { + gtm: '20220318/001026', + mil: '780572.7', + hgt: '66', + spd: '33.5', + agl: '44', + lon: '66557196', + lat: '13173258' + }, + { + gtm: '20220318/001056', + mil: '780573.0', + hgt: '71', + spd: '33.7', + agl: '332', + lon: '66556494', + lat: '13174359' + }, + { + gtm: '20220318/001126', + mil: '780573.3', + hgt: '67', + spd: '49.6', + agl: '350', + lon: '66556135', + lat: '13176163' + }, + { + gtm: '20220318/001156', + mil: '780573.8', + hgt: '68', + spd: '58.4', + agl: '343', + lon: '66555525', + lat: '13178537' + }, + { + gtm: '20220318/001226', + mil: '780574.3', + hgt: '69', + spd: '64.7', + agl: '344', + lon: '66554608', + lat: '13181169' + }, + { + gtm: '20220318/001256', + mil: '780574.8', + hgt: '68', + spd: '71.2', + agl: '351', + lon: '66553833', + lat: '13184215' + }, + { + gtm: '20220318/001326', + mil: '780575.4', + hgt: '78', + spd: '69.0', + agl: '358', + lon: '66553462', + lat: '13187322' + }, + { + gtm: '20220318/001356', + mil: '780576.0', + hgt: '68', + spd: '79.8', + agl: '4', + lon: '66553497', + lat: '13190706' + }, + { + gtm: '20220318/001426', + mil: '780576.6', + hgt: '67', + spd: '73.2', + agl: '12', + lon: '66554002', + lat: '13194109' + }, + { + gtm: '20220318/001456', + mil: '780577.2', + hgt: '66', + spd: '68.1', + agl: '12', + lon: '66554749', + lat: '13197175' + }, + { + gtm: '20220318/001526', + mil: '780577.8', + hgt: '63', + spd: '76.6', + agl: '5', + lon: '66555256', + lat: '13200381' + }, + { + gtm: '20220318/001556', + mil: '780578.4', + hgt: '65', + spd: '67.8', + agl: '4', + lon: '66555477', + lat: '13203663' + }, + { + gtm: '20220318/001626', + mil: '780579.0', + hgt: '69', + spd: '66.8', + agl: '14', + lon: '66556000', + lat: '13206663' + }, + { + gtm: '20220318/001656', + mil: '780579.5', + hgt: '67', + spd: '70.6', + agl: '24', + lon: '66557139', + lat: '13209660' + }, + { + gtm: '20220318/001726', + mil: '780580.1', + hgt: '73', + spd: '66.8', + agl: '28', + lon: '66558714', + lat: '13212381' + }, + { + gtm: '20220318/001756', + mil: '780580.6', + hgt: '73', + spd: '66.1', + agl: '13', + lon: '66559910', + lat: '13215187' + }, + { + gtm: '20220318/001826', + mil: '780581.2', + hgt: '68', + spd: '73.5', + agl: '357', + lon: '66560211', + lat: '13218387' + }, + { + gtm: '20220318/001856', + mil: '780581.8', + hgt: '76', + spd: '64.9', + agl: '350', + lon: '66559732', + lat: '13221462' + }, + { + gtm: '20220318/001926', + mil: '780582.4', + hgt: '72', + spd: '71.4', + agl: '351', + lon: '66559194', + lat: '13224492' + }, + { + gtm: '20220318/001956', + mil: '780582.9', + hgt: '80', + spd: '64.9', + agl: '351', + lon: '66558636', + lat: '13227636' + }, + { + gtm: '20220318/002026', + mil: '780583.4', + hgt: '89', + spd: '65.0', + agl: '356', + lon: '66558246', + lat: '13230429' + }, + { + gtm: '20220318/002056', + mil: '780584.0', + hgt: '78', + spd: '76.8', + agl: '7', + lon: '66558343', + lat: '13233717' + }, + { + gtm: '20220318/002126', + mil: '780584.6', + hgt: '91', + spd: '66.3', + agl: '16', + lon: '66559017', + lat: '13236819' + }, + { + gtm: '20220318/002156', + mil: '780585.2', + hgt: '94', + spd: '71.0', + agl: '19', + lon: '66560107', + lat: '13239711' + }, + { + gtm: '20220318/002226', + mil: '780585.8', + hgt: '96', + spd: '70.3', + agl: '3', + lon: '66560802', + lat: '13242900' + }, + { + gtm: '20220318/002256', + mil: '780586.3', + hgt: '105', + spd: '69.4', + agl: '348', + lon: '66560511', + lat: '13245954' + }, + { + gtm: '20220318/002326', + mil: '780586.9', + hgt: '102', + spd: '72.7', + agl: '353', + lon: '66559830', + lat: '13249140' + }, + { + gtm: '20220318/002356', + mil: '780587.5', + hgt: '104', + spd: '67.9', + agl: '6', + lon: '66559827', + lat: '13252311' + }, + { + gtm: '20220318/002426', + mil: '780588.1', + hgt: '91', + spd: '76.8', + agl: '16', + lon: '66560608', + lat: '13255495' + }, + { + gtm: '20220318/002449', + mil: '780588.6', + hgt: '76', + spd: '84.9', + agl: '16', + lon: '66561501', + lat: '13258257' + }, + { + gtm: '20220318/002452', + mil: '780588.7', + hgt: '75', + spd: '84.7', + agl: '17', + lon: '66561621', + lat: '13258626' + }, + { + gtm: '20220318/002452', + mil: '780588.7', + hgt: '75', + spd: '84.7', + agl: '17', + lon: '66561621', + lat: '13258626' + }, + { + gtm: '20220318/002456', + mil: '780588.8', + hgt: '74', + spd: '81.9', + agl: '16', + lon: '66561774', + lat: '13259103' + }, + { + gtm: '20220318/002526', + mil: '780589.5', + hgt: '64', + spd: '83.7', + agl: '14', + lon: '66562886', + lat: '13262700' + }, + { + gtm: '20220318/002556', + mil: '780590.1', + hgt: '69', + spd: '75.1', + agl: '8', + lon: '66563619', + lat: '13266167' + }, + { + gtm: '20220318/002626', + mil: '780590.7', + hgt: '69', + spd: '72.5', + agl: '3', + lon: '66563966', + lat: '13269460' + }, + { + gtm: '20220318/002656', + mil: '780591.3', + hgt: '68', + spd: '76.7', + agl: '359', + lon: '66563982', + lat: '13272837' + }, + { + gtm: '20220318/002726', + mil: '780591.9', + hgt: '81', + spd: '68.4', + agl: '359', + lon: '66563877', + lat: '13276108' + }, + { + gtm: '20220318/002756', + mil: '780592.5', + hgt: '84', + spd: '77.4', + agl: '358', + lon: '66563779', + lat: '13279431' + }, + { + gtm: '20220318/002826', + mil: '780593.1', + hgt: '88', + spd: '69.8', + agl: '6', + lon: '66563838', + lat: '13282770' + }, + { + gtm: '20220318/002856', + mil: '780593.7', + hgt: '96', + spd: '67.9', + agl: '11', + lon: '66564460', + lat: '13285803' + }, + { + gtm: '20220318/002926', + mil: '780594.2', + hgt: '107', + spd: '68.9', + agl: '356', + lon: '66564597', + lat: '13288881' + }, + { + gtm: '20220318/002956', + mil: '780594.8', + hgt: '120', + spd: '72.0', + agl: '6', + lon: '66564583', + lat: '13292042' + }, + { + gtm: '20220318/003026', + mil: '780595.4', + hgt: '113', + spd: '70.9', + agl: '18', + lon: '66565341', + lat: '13295259' + }, + { + gtm: '20220318/003052', + mil: '780595.9', + hgt: '107', + spd: '0.0', + agl: '15', + lon: '66566215', + lat: '13297821' + }, + { + gtm: '20220318/003053', + mil: '780595.9', + hgt: '107', + spd: '66.7', + agl: '15', + lon: '66566271', + lat: '13298013' + }, + { + gtm: '20220318/003054', + mil: '780595.9', + hgt: '107', + spd: '0.0', + agl: '15', + lon: '66566271', + lat: '13298013' + }, + { + gtm: '20220318/003056', + mil: '780596.0', + hgt: '107', + spd: '0.0', + agl: '15', + lon: '66566271', + lat: '13298013' + }, + { + gtm: '20220318/003121', + mil: '780596.4', + hgt: '107', + spd: '61.8', + agl: '336', + lon: '66566778', + lat: '13300656' + }, + { + gtm: '20220318/003127', + mil: '780596.5', + hgt: '59', + spd: '58.3', + agl: '345', + lon: '66566703', + lat: '13301091' + }, + { + gtm: '20220318/003157', + mil: '780597.0', + hgt: '111', + spd: '51.2', + agl: '4', + lon: '66567076', + lat: '13303638' + }, + { + gtm: '20220318/003227', + mil: '780597.4', + hgt: '124', + spd: '57.8', + agl: '4', + lon: '66567270', + lat: '13306014' + }, + { + gtm: '20220318/003257', + mil: '780597.9', + hgt: '129', + spd: '65.9', + agl: '358', + lon: '66567375', + lat: '13308861' + }, + { + gtm: '20220318/003327', + mil: '780598.5', + hgt: '128', + spd: '70.7', + agl: '348', + lon: '66566964', + lat: '13311831' + }, + { + gtm: '20220318/003357', + mil: '780599.1', + hgt: '117', + spd: '76.4', + agl: '336', + lon: '66565755', + lat: '13315165' + }, + { + gtm: '20220318/003427', + mil: '780599.7', + hgt: '134', + spd: '60.9', + agl: '331', + lon: '66564295', + lat: '13317898' + }, + { + gtm: '20220318/003457', + mil: '780600.1', + hgt: '137', + spd: '55.2', + agl: '328', + lon: '66562897', + lat: '13320084' + }, + { + gtm: '20220318/003527', + mil: '780600.6', + hgt: '139', + spd: '54.8', + agl: '334', + lon: '66561519', + lat: '13322196' + }, + { + gtm: '20220318/003557', + mil: '780601.1', + hgt: '133', + spd: '70.1', + agl: '3', + lon: '66560961', + lat: '13324887' + }, + { + gtm: '20220318/003627', + mil: '780601.7', + hgt: '123', + spd: '78.6', + agl: '4', + lon: '66561713', + lat: '13328312' + }, + { + gtm: '20220318/003657', + mil: '780602.3', + hgt: '136', + spd: '65.5', + agl: '330', + lon: '66560892', + lat: '13331394' + }, + { + gtm: '20220318/003727', + mil: '780602.9', + hgt: '135', + spd: '67.2', + agl: '327', + lon: '66559135', + lat: '13333887' + }, + { + gtm: '20220318/003727', + mil: '780602.9', + hgt: '135', + spd: '67.2', + agl: '327', + lon: '66559135', + lat: '13333887' + }, + { + gtm: '20220318/003755', + mil: '780603.4', + hgt: '120', + spd: '79.1', + agl: '345', + lon: '66557575', + lat: '13336623' + }, + { + gtm: '20220318/003757', + mil: '780603.5', + hgt: '119', + spd: '80.2', + agl: '348', + lon: '66557517', + lat: '13336857' + }, + { + gtm: '20220318/003759', + mil: '780603.5', + hgt: '118', + spd: '81.8', + agl: '350', + lon: '66557469', + lat: '13337100' + }, + { + gtm: '20220318/003803', + mil: '780603.6', + hgt: '115', + spd: '83.4', + agl: '355', + lon: '66557409', + lat: '13337597' + }, + { + gtm: '20220318/003812', + mil: '780603.8', + hgt: '109', + spd: '84.4', + agl: '8', + lon: '66557451', + lat: '13338756' + }, + { + gtm: '20220318/003817', + mil: '780603.9', + hgt: '105', + spd: '86.5', + agl: '13', + lon: '66557582', + lat: '13339390' + }, + { + gtm: '20220318/003823', + mil: '780604.1', + hgt: '101', + spd: '87.2', + agl: '15', + lon: '66557800', + lat: '13340158' + }, + { + gtm: '20220318/003825', + mil: '780604.1', + hgt: '100', + spd: '87.5', + agl: '15', + lon: '66557871', + lat: '13340413' + }, + { + gtm: '20220318/003827', + mil: '780604.2', + hgt: '99', + spd: '88.2', + agl: '14', + lon: '66557940', + lat: '13340673' + }, + { + gtm: '20220318/003827', + mil: '780604.2', + hgt: '99', + spd: '88.2', + agl: '14', + lon: '66557940', + lat: '13340673' + }, + { + gtm: '20220318/003831', + mil: '780604.3', + hgt: '97', + spd: '87.0', + agl: '9', + lon: '66558051', + lat: '13341192' + }, + { + gtm: '20220318/003832', + mil: '780604.3', + hgt: '96', + spd: '86.8', + agl: '8', + lon: '66558071', + lat: '13341321' + }, + { + gtm: '20220318/003857', + mil: '780604.8', + hgt: '101', + spd: '72.5', + agl: '352', + lon: '66557922', + lat: '13344294' + }, + { + gtm: '20220318/003927', + mil: '780605.4', + hgt: '106', + spd: '68.0', + agl: '4', + lon: '66557783', + lat: '13347393' + }, + { + gtm: '20220318/003957', + mil: '780606.0', + hgt: '105', + spd: '72.8', + agl: '7', + lon: '66558174', + lat: '13350598' + }, + { + gtm: '20220318/004027', + mil: '780606.5', + hgt: '110', + spd: '66.5', + agl: '15', + lon: '66558664', + lat: '13353667' + }, + { + gtm: '20220318/004057', + mil: '780607.1', + hgt: '115', + spd: '65.0', + agl: '33', + lon: '66559928', + lat: '13356331' + }, + { + gtm: '20220318/004127', + mil: '780607.6', + hgt: '119', + spd: '68.2', + agl: '39', + lon: '66561888', + lat: '13358701' + }, + { + gtm: '20220318/004157', + mil: '780608.2', + hgt: '124', + spd: '67.1', + agl: '27', + lon: '66563731', + lat: '13361280' + }, + { + gtm: '20220318/004227', + mil: '780608.7', + hgt: '127', + spd: '66.9', + agl: '12', + lon: '66564776', + lat: '13364113' + }, + { + gtm: '20220318/004327', + mil: '780610.1', + hgt: '104', + spd: '90.2', + agl: '13', + lon: '66565446', + lat: '13371393' + }, + { + gtm: '20220318/004357', + mil: '780610.8', + hgt: '92', + spd: '88.6', + agl: '11', + lon: '66566649', + lat: '13375296' + }, + { + gtm: '20220318/004403', + mil: '780610.9', + hgt: '90', + spd: '86.8', + agl: '7', + lon: '66566784', + lat: '13376082' + }, + { + gtm: '20220318/004403', + mil: '780610.9', + hgt: '90', + spd: '86.8', + agl: '7', + lon: '66566784', + lat: '13376082' + }, + { + gtm: '20220318/004427', + mil: '780611.5', + hgt: '94', + spd: '77.5', + agl: '3', + lon: '66566860', + lat: '13379016' + }, + { + gtm: '20220318/004452', + mil: '780612.0', + hgt: '108', + spd: '64.2', + agl: '29', + lon: '66567586', + lat: '13381569' + }, + { + gtm: '20220318/004457', + mil: '780612.0', + hgt: '110', + spd: '62.2', + agl: '33', + lon: '66567849', + lat: '13381975' + }, + { + gtm: '20220318/004527', + mil: '780612.5', + hgt: '122', + spd: '60.2', + agl: '50', + lon: '66569868', + lat: '13383834' + }, + { + gtm: '20220318/004557', + mil: '780613.0', + hgt: '126', + spd: '68.7', + agl: '46', + lon: '66572155', + lat: '13385710' + }, + { + gtm: '20220318/004559', + mil: '780613.1', + hgt: '126', + spd: '69.9', + agl: '46', + lon: '66572315', + lat: '13385856' + }, + { + gtm: '20220318/004607', + mil: '780613.2', + hgt: '124', + spd: '70.1', + agl: '44', + lon: '66572955', + lat: '13386459' + }, + { + gtm: '20220318/004627', + mil: '780613.6', + hgt: '116', + spd: '72.7', + agl: '39', + lon: '66574488', + lat: '13388082' + }, + { + gtm: '20220318/004629', + mil: '780613.7', + hgt: '115', + spd: '72.8', + agl: '39', + lon: '66574636', + lat: '13388253' + }, + { + gtm: '20220318/004632', + mil: '780613.7', + hgt: '114', + spd: '72.6', + agl: '39', + lon: '66574860', + lat: '13388508' + }, + { + gtm: '20220318/004657', + mil: '780614.2', + hgt: '113', + spd: '67.7', + agl: '38', + lon: '66576570', + lat: '13390575' + }, + { + gtm: '20220318/004727', + mil: '780614.8', + hgt: '118', + spd: '67.1', + agl: '43', + lon: '66578703', + lat: '13392896' + }, + { + gtm: '20220318/004757', + mil: '780615.4', + hgt: '114', + spd: '76.7', + agl: '49', + lon: '66581241', + lat: '13395154' + }, + { + gtm: '20220318/004827', + mil: '780616.0', + hgt: '119', + spd: '71.8', + agl: '49', + lon: '66584051', + lat: '13397439' + }, + { + gtm: '20220318/004857', + mil: '780616.6', + hgt: '121', + spd: '73.9', + agl: '28', + lon: '66586273', + lat: '13399813' + }, + { + gtm: '20220318/004927', + mil: '780617.2', + hgt: '127', + spd: '70.3', + agl: '359', + lon: '66587022', + lat: '13403033' + }, + { + gtm: '20220318/004957', + mil: '780617.7', + hgt: '139', + spd: '64.6', + agl: '14', + lon: '66587299', + lat: '13406055' + }, + { + gtm: '20220318/005027', + mil: '780618.2', + hgt: '148', + spd: '66.2', + agl: '12', + lon: '66588162', + lat: '13408804' + }, + { + gtm: '20220318/005057', + mil: '780618.9', + hgt: '138', + spd: '81.0', + agl: '354', + lon: '66588372', + lat: '13412167' + }, + { + gtm: '20220318/005127', + mil: '780619.5', + hgt: '144', + spd: '73.7', + agl: '332', + lon: '66587199', + lat: '13415451' + }, + { + gtm: '20220318/005157', + mil: '780620.1', + hgt: '137', + spd: '74.5', + agl: '337', + lon: '66585507', + lat: '13418397' + }, + { + gtm: '20220318/005227', + mil: '780620.7', + hgt: '144', + spd: '66.2', + agl: '345', + lon: '66584472', + lat: '13421572' + }, + { + gtm: '20220318/005257', + mil: '780621.2', + hgt: '152', + spd: '64.2', + agl: '333', + lon: '66583389', + lat: '13424241' + }, + { + gtm: '20220318/005327', + mil: '780621.8', + hgt: '155', + spd: '66.2', + agl: '340', + lon: '66582018', + lat: '13426907' + }, + { + gtm: '20220318/005357', + mil: '780622.3', + hgt: '147', + spd: '72.8', + agl: '357', + lon: '66581517', + lat: '13430025' + }, + { + gtm: '20220318/005427', + mil: '780622.9', + hgt: '139', + spd: '74.7', + agl: '344', + lon: '66581068', + lat: '13433376' + }, + { + gtm: '20220318/005457', + mil: '780623.5', + hgt: '134', + spd: '71.1', + agl: '355', + lon: '66580149', + lat: '13436533' + }, + { + gtm: '20220318/005527', + mil: '780624.1', + hgt: '133', + spd: '69.8', + agl: '2', + lon: '66580186', + lat: '13439692' + }, + { + gtm: '20220318/005557', + mil: '780624.7', + hgt: '136', + spd: '66.3', + agl: '2', + lon: '66580287', + lat: '13442754' + }, + { + gtm: '20220318/005622', + mil: '780625.1', + hgt: '125', + spd: '70.0', + agl: '2', + lon: '66580359', + lat: '13445334' + }, + { + gtm: '20220318/005623', + mil: '780625.2', + hgt: '125', + spd: '70.2', + agl: '2', + lon: '66580362', + lat: '13445440' + }, + { + gtm: '20220318/005627', + mil: '780625.2', + hgt: '122', + spd: '71.4', + agl: '2', + lon: '66580375', + lat: '13445869' + }, + { + gtm: '20220318/005657', + mil: '780625.9', + hgt: '114', + spd: '78.0', + agl: '342', + lon: '66579952', + lat: '13449236' + }, + { + gtm: '20220318/005727', + mil: '780626.5', + hgt: '122', + spd: '71.4', + agl: '339', + lon: '66578683', + lat: '13452330' + }, + { + gtm: '20220318/005757', + mil: '780627.0', + hgt: '139', + spd: '61.5', + agl: '342', + lon: '66577515', + lat: '13455162' + }, + { + gtm: '20220318/005827', + mil: '780627.4', + hgt: '155', + spd: '50.5', + agl: '1', + lon: '66577113', + lat: '13457515' + }, + { + gtm: '20220318/005857', + mil: '780627.9', + hgt: '171', + spd: '54.6', + agl: '15', + lon: '66577533', + lat: '13459832' + }, + { + gtm: '20220318/005927', + mil: '780628.3', + hgt: '184', + spd: '57.6', + agl: '9', + lon: '66578158', + lat: '13462257' + }, + { + gtm: '20220318/005957', + mil: '780628.9', + hgt: '180', + spd: '68.2', + agl: '358', + lon: '66578235', + lat: '13465123' + }, + { + gtm: '20220318/010027', + mil: '780629.4', + hgt: '191', + spd: '62.6', + agl: '6', + lon: '66578220', + lat: '13468103' + }, + { + gtm: '20220318/010057', + mil: '780629.9', + hgt: '197', + spd: '63.2', + agl: '25', + lon: '66579009', + lat: '13470771' + }, + { + gtm: '20220318/010127', + mil: '780630.4', + hgt: '208', + spd: '51.7', + agl: '35', + lon: '66580546', + lat: '13473040' + }, + { + gtm: '20220318/010157', + mil: '780630.8', + hgt: '222', + spd: '53.1', + agl: '13', + lon: '66581551', + lat: '13475157' + }, + { + gtm: '20220318/010227', + mil: '780631.3', + hgt: '222', + spd: '64.7', + agl: '349', + lon: '66581479', + lat: '13477791' + }, + { + gtm: '20220318/010257', + mil: '780631.9', + hgt: '217', + spd: '69.5', + agl: '333', + lon: '66580377', + lat: '13480726' + }, + { + gtm: '20220318/010327', + mil: '780632.4', + hgt: '229', + spd: '61.0', + agl: '329', + lon: '66578677', + lat: '13483221' + }, + { + gtm: '20220318/010357', + mil: '780632.9', + hgt: '233', + spd: '62.0', + agl: '358', + lon: '66577858', + lat: '13485760' + }, + { + gtm: '20220318/010427', + mil: '780633.4', + hgt: '236', + spd: '62.9', + agl: '27', + lon: '66578586', + lat: '13488601' + }, + { + gtm: '20220318/010457', + mil: '780633.9', + hgt: '249', + spd: '54.6', + agl: '28', + lon: '66579930', + lat: '13490964' + }, + { + gtm: '20220318/010527', + mil: '780634.4', + hgt: '260', + spd: '53.8', + agl: '11', + lon: '66580836', + lat: '13493269' + }, + { + gtm: '20220318/010557', + mil: '780634.8', + hgt: '261', + spd: '58.6', + agl: '350', + lon: '66580815', + lat: '13495798' + }, + { + gtm: '20220318/010620', + mil: '780635.2', + hgt: '257', + spd: '58.5', + agl: '335', + lon: '66580102', + lat: '13497744' + }, + { + gtm: '20220318/010627', + mil: '780635.3', + hgt: '257', + spd: '54.6', + agl: '335', + lon: '66579820', + lat: '13498290' + }, + { + gtm: '20220318/010628', + mil: '780635.3', + hgt: '256', + spd: '52.6', + agl: '335', + lon: '66579784', + lat: '13498362' + }, + { + gtm: '20220318/010657', + mil: '780635.7', + hgt: '254', + spd: '57.6', + agl: '341', + lon: '66578799', + lat: '13500421' + }, + { + gtm: '20220318/010727', + mil: '780636.3', + hgt: '245', + spd: '70.7', + agl: '2', + lon: '66578337', + lat: '13503306' + }, + { + gtm: '20220318/010757', + mil: '780636.9', + hgt: '249', + spd: '65.4', + agl: '17', + lon: '66579075', + lat: '13506477' + }, + { + gtm: '20220318/010827', + mil: '780637.4', + hgt: '263', + spd: '56.4', + agl: '11', + lon: '66579906', + lat: '13509178' + }, + { + gtm: '20220318/010857', + mil: '780637.8', + hgt: '276', + spd: '45.2', + agl: '359', + lon: '66580020', + lat: '13511359' + }, + { + gtm: '20220318/010927', + mil: '780638.2', + hgt: '286', + spd: '52.1', + agl: '359', + lon: '66579977', + lat: '13513533' + }, + { + gtm: '20220318/010957', + mil: '780638.7', + hgt: '282', + spd: '67.7', + agl: '359', + lon: '66579909', + lat: '13516213' + }, + { + gtm: '20220318/011027', + mil: '780639.2', + hgt: '271', + spd: '73.6', + agl: '8', + lon: '66580006', + lat: '13519480' + }, + { + gtm: '20220318/011057', + mil: '780639.8', + hgt: '268', + spd: '73.0', + agl: '14', + lon: '66580809', + lat: '13522684' + }, + { + gtm: '20220318/011127', + mil: '780640.4', + hgt: '276', + spd: '67.9', + agl: '5', + lon: '66581520', + lat: '13525774' + }, + { + gtm: '20220318/011157', + mil: '780641.0', + hgt: '275', + spd: '76.9', + agl: '344', + lon: '66581194', + lat: '13528991' + }, + { + gtm: '20220318/011208', + mil: '780641.2', + hgt: '273', + spd: '78.8', + agl: '342', + lon: '66580767', + lat: '13530225' + }, + { + gtm: '20220318/011212', + mil: '780641.3', + hgt: '271', + spd: '78.7', + agl: '344', + lon: '66580612', + lat: '13530682' + }, + { + gtm: '20220318/011214', + mil: '780641.4', + hgt: '271', + spd: '78.2', + agl: '345', + lon: '66580542', + lat: '13530910' + }, + { + gtm: '20220318/011217', + mil: '780641.4', + hgt: '269', + spd: '78.8', + agl: '346', + lon: '66580444', + lat: '13531255' + }, + { + gtm: '20220318/011217', + mil: '780641.4', + hgt: '269', + spd: '78.8', + agl: '346', + lon: '66580444', + lat: '13531255' + }, + { + gtm: '20220318/011222', + mil: '780641.6', + hgt: '267', + spd: '79.8', + agl: '350', + lon: '66580311', + lat: '13531842' + }, + { + gtm: '20220318/011226', + mil: '780641.6', + hgt: '265', + spd: '81.0', + agl: '352', + lon: '66580231', + lat: '13532323' + }, + { + gtm: '20220318/011227', + mil: '780641.7', + hgt: '265', + spd: '81.2', + agl: '353', + lon: '66580213', + lat: '13532445' + }, + { + gtm: '20220318/011240', + mil: '780642.0', + hgt: '259', + spd: '84.5', + agl: '355', + lon: '66580046', + lat: '13534065' + }, + { + gtm: '20220318/011244', + mil: '780642.1', + hgt: '257', + spd: '85.2', + agl: '355', + lon: '66579999', + lat: '13534575' + }, + { + gtm: '20220318/011248', + mil: '780642.1', + hgt: '255', + spd: '84.9', + agl: '355', + lon: '66579948', + lat: '13535083' + }, + { + gtm: '20220318/011251', + mil: '780642.2', + hgt: '254', + spd: '84.9', + agl: '355', + lon: '66579912', + lat: '13535466' + }, + { + gtm: '20220318/011252', + mil: '780642.2', + hgt: '253', + spd: '83.7', + agl: '355', + lon: '66579900', + lat: '13535592' + }, + { + gtm: '20220318/011253', + mil: '780642.3', + hgt: '253', + spd: '83.1', + agl: '355', + lon: '66579887', + lat: '13535718' + }, + { + gtm: '20220318/011254', + mil: '780642.3', + hgt: '252', + spd: '83.2', + agl: '355', + lon: '66579876', + lat: '13535842' + }, + { + gtm: '20220318/011255', + mil: '780642.3', + hgt: '252', + spd: '83.4', + agl: '355', + lon: '66579864', + lat: '13535967' + }, + { + gtm: '20220318/011257', + mil: '780642.4', + hgt: '251', + spd: '83.8', + agl: '355', + lon: '66579840', + lat: '13536219' + }, + { + gtm: '20220318/011327', + mil: '780643.1', + hgt: '242', + spd: '84.1', + agl: '8', + lon: '66579707', + lat: '13540113' + }, + { + gtm: '20220318/011357', + mil: '780643.6', + hgt: '250', + spd: '67.4', + agl: '15', + lon: '66580567', + lat: '13543314' + }, + { + gtm: '20220318/011418', + mil: '780644.0', + hgt: '252', + spd: '0.0', + agl: '14', + lon: '66581160', + lat: '13545381' + }, + { + gtm: '20220318/011419', + mil: '780644.1', + hgt: '252', + spd: '34.0', + agl: '13', + lon: '66581211', + lat: '13545580' + }, + { + gtm: '20220318/011419', + mil: '780644.1', + hgt: '252', + spd: '0.0', + agl: '13', + lon: '66581211', + lat: '13545580' + }, + { + gtm: '20220318/011427', + mil: '780644.2', + hgt: '252', + spd: '0.0', + agl: '13', + lon: '66581211', + lat: '13545580' + }, + { + gtm: '20220318/011433', + mil: '780644.3', + hgt: '252', + spd: '59.8', + agl: '18', + lon: '66581599', + lat: '13546852' + }, + { + gtm: '20220318/011458', + mil: '780644.8', + hgt: '255', + spd: '68.1', + agl: '8', + lon: '66582171', + lat: '13549189' + }, + { + gtm: '20220318/011528', + mil: '780645.3', + hgt: '259', + spd: '69.4', + agl: '357', + lon: '66582155', + lat: '13552377' + }, + { + gtm: '20220318/011532', + mil: '780645.4', + hgt: '259', + spd: '68.8', + agl: '357', + lon: '66582129', + lat: '13552794' + }, + { + gtm: '20220318/011540', + mil: '780645.6', + hgt: '257', + spd: '69.3', + agl: '357', + lon: '66582076', + lat: '13553625' + }, + { + gtm: '20220318/011540', + mil: '780645.6', + hgt: '257', + spd: '69.3', + agl: '357', + lon: '66582076', + lat: '13553625' + }, + { + gtm: '20220318/011543', + mil: '780645.6', + hgt: '256', + spd: '69.3', + agl: '356', + lon: '66582054', + lat: '13553938' + }, + { + gtm: '20220318/011543', + mil: '780645.6', + hgt: '256', + spd: '0.0', + agl: '356', + lon: '66582054', + lat: '13553938' + }, + { + gtm: '20220318/011547', + mil: '780645.7', + hgt: '256', + spd: '0.0', + agl: '356', + lon: '66582054', + lat: '13553938' + }, + { + gtm: '20220318/011558', + mil: '780645.9', + hgt: '256', + spd: '0.0', + agl: '356', + lon: '66582054', + lat: '13553938' + }, + { + gtm: '20220318/011606', + mil: '780646.1', + hgt: '256', + spd: '0.0', + agl: '356', + lon: '66582054', + lat: '13553938' + }, + { + gtm: '20220318/011607', + mil: '780646.1', + hgt: '256', + spd: '79.3', + agl: '12', + lon: '66582151', + lat: '13556769' + }, + { + gtm: '20220318/011608', + mil: '780646.1', + hgt: '239', + spd: '79.3', + agl: '12', + lon: '66582151', + lat: '13556769' + }, + { + gtm: '20220318/011628', + mil: '780646.6', + hgt: '233', + spd: '75.4', + agl: '27', + lon: '66583089', + lat: '13558915' + }, + { + gtm: '20220318/011658', + mil: '780647.1', + hgt: '236', + spd: '65.4', + agl: '9', + lon: '66584166', + lat: '13561837' + }, + { + gtm: '20220318/011701', + mil: '780647.2', + hgt: '236', + spd: '0.0', + agl: '6', + lon: '66584208', + lat: '13562130' + }, + { + gtm: '20220318/011713', + mil: '780647.4', + hgt: '236', + spd: '33.6', + agl: '357', + lon: '66584226', + lat: '13563429' + }, + { + gtm: '20220318/011729', + mil: '780647.6', + hgt: '240', + spd: '64.6', + agl: '2', + lon: '66584307', + lat: '13564773' + }, + { + gtm: '20220318/011747', + mil: '780648.0', + hgt: '237', + spd: '72.0', + agl: '2', + lon: '66584376', + lat: '13566615' + }, + { + gtm: '20220318/011751', + mil: '780648.1', + hgt: '235', + spd: '72.7', + agl: '2', + lon: '66584394', + lat: '13567050' + }, + { + gtm: '20220318/011756', + mil: '780648.2', + hgt: '233', + spd: '36.3', + agl: '3', + lon: '66584425', + lat: '13567597' + }, + { + gtm: '20220318/011757', + mil: '780648.2', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011759', + mil: '780648.2', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011800', + mil: '780648.2', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011803', + mil: '780648.3', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011806', + mil: '780648.4', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011808', + mil: '780648.4', + hgt: '233', + spd: '0.0', + agl: '3', + lon: '66584433', + lat: '13567707' + }, + { + gtm: '20220318/011808', + mil: '780648.4', + hgt: '233', + spd: '83.6', + agl: '14', + lon: '66584676', + lat: '13569135' + }, + { + gtm: '20220318/011812', + mil: '780648.5', + hgt: '229', + spd: '77.6', + agl: '13', + lon: '66584757', + lat: '13569469' + }, + { + gtm: '20220318/011817', + mil: '780648.6', + hgt: '226', + spd: '78.4', + agl: '16', + lon: '66584913', + lat: '13570018' + }, + { + gtm: '20220318/011829', + mil: '780648.9', + hgt: '220', + spd: '81.6', + agl: '23', + lon: '66585417', + lat: '13571361' + }, + { + gtm: '20220318/011843', + mil: '780649.2', + hgt: '215', + spd: '82.0', + agl: '29', + lon: '66586257', + lat: '13572895' + }, + { + gtm: '20220318/011844', + mil: '780649.2', + hgt: '215', + spd: '82.1', + agl: '29', + lon: '66586321', + lat: '13573003' + }, + { + gtm: '20220318/011848', + mil: '780649.3', + hgt: '214', + spd: '82.8', + agl: '27', + lon: '66586576', + lat: '13573440' + }, + { + gtm: '20220318/011859', + mil: '780649.5', + hgt: '215', + spd: '78.3', + agl: '18', + lon: '66587142', + lat: '13574673' + }, + { + gtm: '20220318/011959', + mil: '780650.8', + hgt: '219', + spd: '82.7', + agl: '13', + lon: '66587791', + lat: '13581405' + }, + { + gtm: '20220318/012003', + mil: '780650.9', + hgt: '217', + spd: '84.0', + agl: '15', + lon: '66587923', + lat: '13581897' + }, + { + gtm: '20220318/012003', + mil: '780650.9', + hgt: '217', + spd: '84.0', + agl: '15', + lon: '66587923', + lat: '13581897' + }, + { + gtm: '20220318/012008', + mil: '780651.0', + hgt: '214', + spd: '81.9', + agl: '16', + lon: '66588109', + lat: '13582505' + }, + { + gtm: '20220318/012012', + mil: '780651.1', + hgt: '212', + spd: '78.2', + agl: '17', + lon: '66588253', + lat: '13582962' + }, + { + gtm: '20220318/012014', + mil: '780651.1', + hgt: '211', + spd: '79.0', + agl: '15', + lon: '66588323', + lat: '13583191' + }, + { + gtm: '20220318/012017', + mil: '780651.2', + hgt: '210', + spd: '78.2', + agl: '13', + lon: '66588415', + lat: '13583535' + }, + { + gtm: '20220318/012020', + mil: '780651.2', + hgt: '208', + spd: '78.2', + agl: '10', + lon: '66588492', + lat: '13583881' + }, + { + gtm: '20220318/012021', + mil: '780651.3', + hgt: '208', + spd: '77.3', + agl: '9', + lon: '66588511', + lat: '13583995' + }, + { + gtm: '20220318/012024', + mil: '780651.3', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012025', + mil: '780651.3', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012028', + mil: '780651.4', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012029', + mil: '780651.4', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012029', + mil: '780651.4', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012029', + mil: '780651.4', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012032', + mil: '780651.5', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012035', + mil: '780651.6', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012037', + mil: '780651.6', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012039', + mil: '780651.6', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012044', + mil: '780651.8', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012045', + mil: '780651.8', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012053', + mil: '780651.9', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012054', + mil: '780652.0', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012056', + mil: '780652.0', + hgt: '206', + spd: '0.0', + agl: '5', + lon: '66588550', + lat: '13584333' + }, + { + gtm: '20220318/012057', + mil: '780652.0', + hgt: '206', + spd: '76.6', + agl: '337', + lon: '66587539', + lat: '13588150' + }, + { + gtm: '20220318/012059', + mil: '780652.1', + hgt: '180', + spd: '76.6', + agl: '337', + lon: '66587539', + lat: '13588150' + }, + { + gtm: '20220318/012109', + mil: '780652.3', + hgt: '175', + spd: '80.6', + agl: '351', + lon: '66587131', + lat: '13589371' + }, + { + gtm: '20220318/012114', + mil: '780652.4', + hgt: '175', + spd: '80.7', + agl: '2', + lon: '66587088', + lat: '13590001' + }, + { + gtm: '20220318/012116', + mil: '780652.4', + hgt: '174', + spd: '80.0', + agl: '6', + lon: '66587106', + lat: '13590249' + }, + { + gtm: '20220318/012120', + mil: '780652.5', + hgt: '174', + spd: '80.1', + agl: '14', + lon: '66587199', + lat: '13590731' + }, + { + gtm: '20220318/012122', + mil: '780652.6', + hgt: '174', + spd: '79.0', + agl: '19', + lon: '66587271', + lat: '13590963' + }, + { + gtm: '20220318/012122', + mil: '780652.6', + hgt: '174', + spd: '79.0', + agl: '19', + lon: '66587271', + lat: '13590963' + }, + { + gtm: '20220318/012122', + mil: '780652.6', + hgt: '174', + spd: '79.0', + agl: '19', + lon: '66587271', + lat: '13590963' + }, + { + gtm: '20220318/012123', + mil: '780652.6', + hgt: '174', + spd: '78.9', + agl: '21', + lon: '66587315', + lat: '13591077' + }, + { + gtm: '20220318/012129', + mil: '780652.7', + hgt: '173', + spd: '78.4', + agl: '33', + lon: '66587664', + lat: '13591713' + }, + { + gtm: '20220318/012134', + mil: '780652.8', + hgt: '173', + spd: '78.1', + agl: '36', + lon: '66588024', + lat: '13592202' + }, + { + gtm: '20220318/012135', + mil: '780652.9', + hgt: '173', + spd: '77.6', + agl: '36', + lon: '66588099', + lat: '13592296' + }, + { + gtm: '20220318/012137', + mil: '780652.9', + hgt: '172', + spd: '76.7', + agl: '35', + lon: '66588244', + lat: '13592487' + }, + { + gtm: '20220318/012140', + mil: '780653.0', + hgt: '172', + spd: '75.6', + agl: '34', + lon: '66588453', + lat: '13592772' + }, + { + gtm: '20220318/012142', + mil: '780653.0', + hgt: '172', + spd: '75.3', + agl: '32', + lon: '66588585', + lat: '13592964' + }, + { + gtm: '20220318/012159', + mil: '780653.3', + hgt: '172', + spd: '73.3', + agl: '359', + lon: '66589099', + lat: '13594773' + }, + { + gtm: '20220318/012229', + mil: '780653.9', + hgt: '178', + spd: '71.8', + agl: '7', + lon: '66588657', + lat: '13597923' + }, + { + gtm: '20220318/012251', + mil: '780654.4', + hgt: '172', + spd: '73.6', + agl: '7', + lon: '66589215', + lat: '13600263' + }, + { + gtm: '20220318/012252', + mil: '780654.4', + hgt: '171', + spd: '74.3', + agl: '7', + lon: '66589230', + lat: '13600374' + }, + { + gtm: '20220318/012259', + mil: '780654.5', + hgt: '169', + spd: '76.5', + agl: '7', + lon: '66589327', + lat: '13601166' + }, + { + gtm: '20220318/012329', + mil: '780655.1', + hgt: '169', + spd: '71.6', + agl: '33', + lon: '66590665', + lat: '13604293' + }, + { + gtm: '20220318/012359', + mil: '780655.7', + hgt: '166', + spd: '70.5', + agl: '21', + lon: '66592158', + lat: '13606993' + }, + { + gtm: '20220318/012429', + mil: '780656.3', + hgt: '168', + spd: '69.7', + agl: '29', + lon: '66593466', + lat: '13610028' + }, + { + gtm: '20220318/012459', + mil: '780656.8', + hgt: '173', + spd: '65.2', + agl: '42', + lon: '66595492', + lat: '13612224' + }, + { + gtm: '20220318/012559', + mil: '780657.9', + hgt: '183', + spd: '66.4', + agl: '4', + lon: '66596489', + lat: '13617990' + }, + { + gtm: '20220318/012605', + mil: '780658.0', + hgt: '185', + spd: '61.3', + agl: '7', + lon: '66596548', + lat: '13618563' + }, + { + gtm: '20220318/012610', + mil: '780658.1', + hgt: '186', + spd: '56.6', + agl: '14', + lon: '66596629', + lat: '13618995' + }, + { + gtm: '20220318/012629', + mil: '780658.3', + hgt: '191', + spd: '15.5', + agl: '11', + lon: '66596889', + lat: '13620072' + }, + { + gtm: '20220318/012629', + mil: '780658.3', + hgt: '191', + spd: '15.5', + agl: '11', + lon: '66596889', + lat: '13620072' + }, + { + gtm: '20220318/012631', + mil: '780658.3', + hgt: '190', + spd: '0.0', + agl: '12', + lon: '66596895', + lat: '13620102' + }, + { + gtm: '20220318/012659', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012729', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012759', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012829', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012841', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012844', + mil: '780658.3', + hgt: '191', + spd: '0.0', + agl: '84', + lon: '66596893', + lat: '13620102' + }, + { + gtm: '20220318/012859', + mil: '780658.3', + hgt: '189', + spd: '10.7', + agl: '7', + lon: '66596905', + lat: '13620174' + }, + { + gtm: '20220318/012902', + mil: '780658.3', + hgt: '189', + spd: '10.3', + agl: '9', + lon: '66596913', + lat: '13620221' + }, + { + gtm: '20220318/012929', + mil: '780658.4', + hgt: '191', + spd: '21.9', + agl: '10', + lon: '66597060', + lat: '13620902' + }, + { + gtm: '20220318/012959', + mil: '780658.7', + hgt: '192', + spd: '36.7', + agl: '7', + lon: '66597288', + lat: '13622235' + }, + { + gtm: '20220318/013029', + mil: '780659.1', + hgt: '184', + spd: '68.0', + agl: '358', + lon: '66597370', + lat: '13624630' + }, + { + gtm: '20220318/013059', + mil: '780659.7', + hgt: '191', + spd: '69.9', + agl: '336', + lon: '66596707', + lat: '13627704' + }, + { + gtm: '20220318/013129', + mil: '780660.3', + hgt: '194', + spd: '70.3', + agl: '322', + lon: '66594879', + lat: '13630277' + }, + { + gtm: '20220318/013159', + mil: '780660.9', + hgt: '188', + spd: '70.6', + agl: '4', + lon: '66593695', + lat: '13633324' + }, + { + gtm: '20220318/013229', + mil: '780661.4', + hgt: '198', + spd: '62.3', + agl: '8', + lon: '66594397', + lat: '13636200' + }, + { + gtm: '20220318/013259', + mil: '780661.8', + hgt: '213', + spd: '50.5', + agl: '356', + lon: '66594348', + lat: '13638687' + }, + { + gtm: '20220318/013329', + mil: '780662.2', + hgt: '221', + spd: '43.7', + agl: '2', + lon: '66594225', + lat: '13640779' + }, + { + gtm: '20220318/013359', + mil: '780662.6', + hgt: '231', + spd: '40.4', + agl: '22', + lon: '66594658', + lat: '13642641' + }, + { + gtm: '20220318/013429', + mil: '780662.9', + hgt: '242', + spd: '32.5', + agl: '24', + lon: '66595389', + lat: '13644162' + }, + { + gtm: '20220318/013449', + mil: '780663.1', + hgt: '245', + spd: '0.0', + agl: '20', + lon: '66595839', + lat: '13645107' + }, + { + gtm: '20220318/013449', + mil: '780663.1', + hgt: '245', + spd: '0.0', + agl: '20', + lon: '66595839', + lat: '13645107' + }, + { + gtm: '20220318/013459', + mil: '780663.1', + hgt: '245', + spd: '0.0', + agl: '20', + lon: '66595839', + lat: '13645107' + }, + { + gtm: '20220318/013529', + mil: '780663.4', + hgt: '245', + spd: '0.0', + agl: '20', + lon: '66595839', + lat: '13645107' + }, + { + gtm: '20220318/013559', + mil: '780663.7', + hgt: '245', + spd: '0.0', + agl: '20', + lon: '66595839', + lat: '13645107' + }, + { + gtm: '20220318/013606', + mil: '780663.8', + hgt: '245', + spd: '38.9', + agl: '25', + lon: '66597795', + lat: '13648962' + }, + { + gtm: '20220318/013630', + mil: '780664.1', + hgt: '259', + spd: '43.7', + agl: '22', + lon: '66598399', + lat: '13650261' + }, + { + gtm: '20220318/013700', + mil: '780664.5', + hgt: '262', + spd: '57.0', + agl: '16', + lon: '66599190', + lat: '13652426' + }, + { + gtm: '20220318/013730', + mil: '780665.0', + hgt: '259', + spd: '59.0', + agl: '45', + lon: '66600414', + lat: '13654796' + }, + { + gtm: '20220318/013800', + mil: '780665.5', + hgt: '259', + spd: '58.7', + agl: '65', + lon: '66602911', + lat: '13655998' + }, + { + gtm: '20220318/013830', + mil: '780666.0', + hgt: '255', + spd: '64.3', + agl: '48', + lon: '66605403', + lat: '13657513' + }, + { + gtm: '20220318/013900', + mil: '780666.6', + hgt: '246', + spd: '72.9', + agl: '47', + lon: '66607833', + lat: '13659625' + }, + { + gtm: '20220318/013919', + mil: '780667.0', + hgt: '237', + spd: '78.4', + agl: '58', + lon: '66609681', + lat: '13660945' + }, + { + gtm: '20220318/013927', + mil: '780667.1', + hgt: '234', + spd: '79.5', + agl: '59', + lon: '66610569', + lat: '13661433' + }, + { + gtm: '20220318/013930', + mil: '780667.2', + hgt: '233', + spd: '79.2', + agl: '59', + lon: '66610899', + lat: '13661619' + }, + { + gtm: '20220318/014000', + mil: '780667.8', + hgt: '234', + spd: '69.1', + agl: '26', + lon: '66613398', + lat: '13664045' + }, + { + gtm: '20220318/014030', + mil: '780668.3', + hgt: '245', + spd: '66.2', + agl: '10', + lon: '66614140', + lat: '13666968' + }, + { + gtm: '20220318/014100', + mil: '780668.9', + hgt: '255', + spd: '63.1', + agl: '34', + lon: '66615403', + lat: '13669611' + }, + { + gtm: '20220318/014130', + mil: '780669.4', + hgt: '268', + spd: '59.8', + agl: '21', + lon: '66616974', + lat: '13672003' + }, + { + gtm: '20220318/014200', + mil: '780669.8', + hgt: '283', + spd: '46.1', + agl: '345', + lon: '66617100', + lat: '13674306' + }, + { + gtm: '20220318/014230', + mil: '780670.2', + hgt: '298', + spd: '44.4', + agl: '324', + lon: '66616026', + lat: '13676044' + }, + { + gtm: '20220318/014300', + mil: '780670.5', + hgt: '314', + spd: '45.6', + agl: '333', + lon: '66614851', + lat: '13677711' + }, + { + gtm: '20220318/014500', + mil: '780672.1', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014530', + mil: '780672.5', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014600', + mil: '780673.0', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014630', + mil: '780673.4', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014700', + mil: '780673.8', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014730', + mil: '780674.2', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014800', + mil: '780674.6', + hgt: '319', + spd: '0.0', + agl: '341', + lon: '66614184', + lat: '13679221' + }, + { + gtm: '20220318/014825', + mil: '780675.0', + hgt: '319', + spd: '54.4', + agl: '341', + lon: '66606726', + lat: '13700943' + }, + { + gtm: '20220318/014830', + mil: '780675.0', + hgt: '323', + spd: '55.3', + agl: '342', + lon: '66606609', + lat: '13701274' + }, + { + gtm: '20220318/014900', + mil: '780675.6', + hgt: '304', + spd: '72.4', + agl: '354', + lon: '66605841', + lat: '13704066' + }, + { + gtm: '20220318/014902', + mil: '780675.6', + hgt: '303', + spd: '73.2', + agl: '357', + lon: '66605826', + lat: '13704282' + }, + { + gtm: '20220318/014907', + mil: '780675.7', + hgt: '300', + spd: '74.4', + agl: '5', + lon: '66605845', + lat: '13704837' + }, + { + gtm: '20220318/014907', + mil: '780675.7', + hgt: '300', + spd: '74.4', + agl: '5', + lon: '66605845', + lat: '13704837' + }, + { + gtm: '20220318/014909', + mil: '780675.8', + hgt: '299', + spd: '74.0', + agl: '8', + lon: '66605877', + lat: '13705056' + }, + { + gtm: '20220318/014920', + mil: '780676.0', + hgt: '290', + spd: '74.5', + agl: '26', + lon: '66606289', + lat: '13706214' + }, + { + gtm: '20220318/014922', + mil: '780676.0', + hgt: '289', + spd: '75.1', + agl: '30', + lon: '66606407', + lat: '13706412' + }, + { + gtm: '20220318/014930', + mil: '780676.2', + hgt: '284', + spd: '75.8', + agl: '42', + lon: '66607006', + lat: '13707147' + }, + { + gtm: '20220318/014931', + mil: '780676.2', + hgt: '284', + spd: '75.7', + agl: '43', + lon: '66607091', + lat: '13707229' + }, + { + gtm: '20220318/014933', + mil: '780676.3', + hgt: '282', + spd: '76.3', + agl: '45', + lon: '66607266', + lat: '13707393' + }, + { + gtm: '20220318/014942', + mil: '780676.4', + hgt: '277', + spd: '76.4', + agl: '58', + lon: '66608171', + lat: '13708033' + }, + { + gtm: '20220318/014943', + mil: '780676.5', + hgt: '276', + spd: '76.0', + agl: '59', + lon: '66608277', + lat: '13708092' + }, + { + gtm: '20220318/014948', + mil: '780676.6', + hgt: '273', + spd: '76.9', + agl: '64', + lon: '66608829', + lat: '13708363' + }, + { + gtm: '20220318/014949', + mil: '780676.6', + hgt: '272', + spd: '76.5', + agl: '64', + lon: '66608943', + lat: '13708413' + }, + { + gtm: '20220318/014950', + mil: '780676.6', + hgt: '272', + spd: '76.1', + agl: '65', + lon: '66609054', + lat: '13708462' + }, + { + gtm: '20220318/014954', + mil: '780676.7', + hgt: '269', + spd: '77.0', + agl: '66', + lon: '66609507', + lat: '13708653' + }, + { + gtm: '20220318/015000', + mil: '780676.8', + hgt: '266', + spd: '75.8', + agl: '61', + lon: '66610182', + lat: '13708953' + }, + { + gtm: '20220318/015003', + mil: '780676.9', + hgt: '264', + spd: '75.2', + agl: '56', + lon: '66610494', + lat: '13709133' + }, + { + gtm: '20220318/015006', + mil: '780676.9', + hgt: '263', + spd: '75.5', + agl: '50', + lon: '66610787', + lat: '13709337' + }, + { + gtm: '20220318/015009', + mil: '780677.0', + hgt: '261', + spd: '76.0', + agl: '45', + lon: '66611058', + lat: '13709569' + }, + { + gtm: '20220318/015012', + mil: '780677.1', + hgt: '260', + spd: '75.1', + agl: '39', + lon: '66611301', + lat: '13709823' + }, + { + gtm: '20220318/015020', + mil: '780677.2', + hgt: '256', + spd: '74.3', + agl: '24', + lon: '66611796', + lat: '13710598' + }, + { + gtm: '20220318/015025', + mil: '780677.3', + hgt: '253', + spd: '73.9', + agl: '18', + lon: '66612004', + lat: '13711119' + }, + { + gtm: '20220318/015030', + mil: '780677.4', + hgt: '252', + spd: '73.8', + agl: '17', + lon: '66612186', + lat: '13711653' + }, + { + gtm: '20220318/015032', + mil: '780677.5', + hgt: '251', + spd: '72.9', + agl: '18', + lon: '66612258', + lat: '13711864' + }, + { + gtm: '20220318/015041', + mil: '780677.7', + hgt: '248', + spd: '73.7', + agl: '23', + lon: '66612624', + lat: '13712799' + }, + { + gtm: '20220318/015045', + mil: '780677.7', + hgt: '246', + spd: '73.4', + agl: '27', + lon: '66612828', + lat: '13713202' + }, + { + gtm: '20220318/015100', + mil: '780678.0', + hgt: '241', + spd: '74.5', + agl: '33', + lon: '66613750', + lat: '13714635' + }, + { + gtm: '20220318/015109', + mil: '780678.2', + hgt: '238', + spd: '75.2', + agl: '23', + lon: '66614269', + lat: '13715527' + }, + { + gtm: '20220318/015111', + mil: '780678.3', + hgt: '237', + spd: '75.6', + agl: '20', + lon: '66614355', + lat: '13715740' + }, + { + gtm: '20220318/015126', + mil: '780678.6', + hgt: '232', + spd: '76.8', + agl: '354', + lon: '66614544', + lat: '13717425' + }, + { + gtm: '20220318/015130', + mil: '780678.7', + hgt: '230', + spd: '77.9', + agl: '347', + lon: '66614454', + lat: '13717884' + }, + { + gtm: '20220318/015130', + mil: '780678.7', + hgt: '230', + spd: '77.9', + agl: '347', + lon: '66614454', + lat: '13717884' + }, + { + gtm: '20220318/015132', + mil: '780678.7', + hgt: '229', + spd: '78.8', + agl: '343', + lon: '66614385', + lat: '13718112' + }, + { + gtm: '20220318/015138', + mil: '780678.8', + hgt: '225', + spd: '80.3', + agl: '333', + lon: '66614091', + lat: '13718775' + }, + { + gtm: '20220318/015141', + mil: '780678.9', + hgt: '223', + spd: '79.9', + agl: '327', + lon: '66613890', + lat: '13719084' + }, + { + gtm: '20220318/015151', + mil: '780679.1', + hgt: '217', + spd: '79.3', + agl: '311', + lon: '66613008', + lat: '13719978' + }, + { + gtm: '20220318/015153', + mil: '780679.2', + hgt: '215', + spd: '79.7', + agl: '309', + lon: '66612806', + lat: '13720129' + }, + { + gtm: '20220318/015154', + mil: '780679.2', + hgt: '215', + spd: '80.2', + agl: '309', + lon: '66612705', + lat: '13720205' + }, + { + gtm: '20220318/015155', + mil: '780679.2', + hgt: '214', + spd: '81.0', + agl: '308', + lon: '66612600', + lat: '13720281' + }, + { + gtm: '20220318/015200', + mil: '780679.3', + hgt: '210', + spd: '80.4', + agl: '308', + lon: '66612073', + lat: '13720653' + }, + { + gtm: '20220318/015204', + mil: '780679.4', + hgt: '207', + spd: '77.5', + agl: '309', + lon: '66611673', + lat: '13720948' + }, + { + gtm: '20220318/015207', + mil: '780679.5', + hgt: '204', + spd: '77.3', + agl: '314', + lon: '66611392', + lat: '13721181' + }, + { + gtm: '20220318/015216', + mil: '780679.6', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610683', + lat: '13721981' + }, + { + gtm: '20220318/015217', + mil: '780679.7', + hgt: '199', + spd: '38.2', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015217', + mil: '780679.7', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015224', + mil: '780679.8', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015228', + mil: '780679.9', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015230', + mil: '780679.9', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015231', + mil: '780679.9', + hgt: '199', + spd: '0.0', + agl: '328', + lon: '66610551', + lat: '13722171' + }, + { + gtm: '20220318/015232', + mil: '780679.9', + hgt: '199', + spd: '73.6', + agl: '350', + lon: '66609960', + lat: '13723735' + }, + { + gtm: '20220318/015233', + mil: '780680.0', + hgt: '197', + spd: '73.6', + agl: '350', + lon: '66609960', + lat: '13723735' + }, + { + gtm: '20220318/015234', + mil: '780680.0', + hgt: '197', + spd: '71.3', + agl: '354', + lon: '66609951', + lat: '13723838' + }, + { + gtm: '20220318/015239', + mil: '780680.1', + hgt: '194', + spd: '71.6', + agl: '4', + lon: '66609976', + lat: '13724463' + }, + { + gtm: '20220318/015248', + mil: '780680.3', + hgt: '187', + spd: '74.0', + agl: '16', + lon: '66610179', + lat: '13725309' + }, + { + gtm: '20220318/015253', + mil: '780680.4', + hgt: '183', + spd: '74.8', + agl: '24', + lon: '66610404', + lat: '13725832' + }, + { + gtm: '20220318/015254', + mil: '780680.4', + hgt: '182', + spd: '75.1', + agl: '25', + lon: '66610456', + lat: '13725936' + }, + { + gtm: '20220318/015301', + mil: '780680.5', + hgt: '176', + spd: '74.0', + agl: '29', + lon: '66610866', + lat: '13726636' + }, + { + gtm: '20220318/015303', + mil: '780680.6', + hgt: '175', + spd: '72.8', + agl: '29', + lon: '66610983', + lat: '13726830' + }, + { + gtm: '20220318/015309', + mil: '780680.7', + hgt: '174', + spd: '75.0', + agl: '27', + lon: '66611340', + lat: '13727412' + }, + { + gtm: '20220318/015312', + mil: '780680.8', + hgt: '173', + spd: '75.9', + agl: '26', + lon: '66611507', + lat: '13727718' + }, + { + gtm: '20220318/015317', + mil: '780680.9', + hgt: '171', + spd: '76.6', + agl: '22', + lon: '66611754', + lat: '13728243' + }, + { + gtm: '20220318/015322', + mil: '780681.0', + hgt: '169', + spd: '77.1', + agl: '18', + lon: '66611964', + lat: '13728789' + }, + { + gtm: '20220318/015331', + mil: '780681.2', + hgt: '166', + spd: '77.1', + agl: '9', + lon: '66612223', + lat: '13729803' + }, + { + gtm: '20220318/015340', + mil: '780681.3', + hgt: '164', + spd: '75.8', + agl: '3', + lon: '66612346', + lat: '13730835' + }, + { + gtm: '20220318/015344', + mil: '780681.4', + hgt: '163', + spd: '73.5', + agl: '1', + lon: '66612363', + lat: '13731283' + }, + { + gtm: '20220318/015346', + mil: '780681.5', + hgt: '163', + spd: '71.7', + agl: '1', + lon: '66612363', + lat: '13731499' + }, + { + gtm: '20220318/015354', + mil: '780681.6', + hgt: '160', + spd: '60.5', + agl: '1', + lon: '66612369', + lat: '13732410' + }, + { + gtm: '20220318/015401', + mil: '780681.7', + hgt: '159', + spd: '57.6', + agl: '1', + lon: '66612374', + lat: '13732938' + }, + { + gtm: '20220318/015402', + mil: '780681.7', + hgt: '158', + spd: '57.1', + agl: '1', + lon: '66612374', + lat: '13733024' + }, + { + gtm: '20220318/015408', + mil: '780681.8', + hgt: '157', + spd: '43.8', + agl: '0', + lon: '66612375', + lat: '13733494' + }, + { + gtm: '20220318/015409', + mil: '780681.8', + hgt: '157', + spd: '41.1', + agl: '0', + lon: '66612375', + lat: '13733556' + }, + { + gtm: '20220318/015413', + mil: '780681.9', + hgt: '155', + spd: '37.6', + agl: '350', + lon: '66612352', + lat: '13733787' + }, + { + gtm: '20220318/015417', + mil: '780681.9', + hgt: '153', + spd: '38.7', + agl: '334', + lon: '66612268', + lat: '13733998' + }, + { + gtm: '20220318/015420', + mil: '780681.9', + hgt: '152', + spd: '41.1', + agl: '320', + lon: '66612157', + lat: '13734146' + }, + { + gtm: '20220318/015422', + mil: '780682.0', + hgt: '151', + spd: '40.4', + agl: '312', + lon: '66612063', + lat: '13734229' + }, + { + gtm: '20220318/015424', + mil: '780682.0', + hgt: '150', + spd: '41.4', + agl: '302', + lon: '66611953', + lat: '13734299' + }, + { + gtm: '20220318/015431', + mil: '780682.1', + hgt: '146', + spd: '46.0', + agl: '276', + lon: '66611475', + lat: '13734402' + }, + { + gtm: '20220318/015501', + mil: '780682.5', + hgt: '133', + spd: '61.8', + agl: '285', + lon: '66608932', + lat: '13735203' + }, + { + gtm: '20220318/015531', + mil: '780683.1', + hgt: '130', + spd: '68.1', + agl: '274', + lon: '66605754', + lat: '13735491' + }, + { + gtm: '20220318/015531', + mil: '780683.1', + hgt: '130', + spd: '68.1', + agl: '274', + lon: '66605754', + lat: '13735491' + }, + { + gtm: '20220318/015557', + mil: '780683.6', + hgt: '136', + spd: '66.1', + agl: '275', + lon: '66602844', + lat: '13735695' + }, + { + gtm: '20220318/015559', + mil: '780683.6', + hgt: '136', + spd: '65.1', + agl: '271', + lon: '66602631', + lat: '13735702' + }, + { + gtm: '20220318/015601', + mil: '780683.6', + hgt: '137', + spd: '64.2', + agl: '272', + lon: '66602421', + lat: '13735710' + }, + { + gtm: '20220318/015631', + mil: '780684.2', + hgt: '138', + spd: '65.7', + agl: '273', + lon: '66599338', + lat: '13735927' + }, + { + gtm: '20220318/015701', + mil: '780684.7', + hgt: '129', + spd: '71.4', + agl: '294', + lon: '66595980', + lat: '13736523' + }, + { + gtm: '20220318/015731', + mil: '780685.3', + hgt: '131', + spd: '60.6', + agl: '320', + lon: '66593529', + lat: '13738335' + }, + { + gtm: '20220318/015801', + mil: '780685.7', + hgt: '138', + spd: '58.3', + agl: '303', + lon: '66591486', + lat: '13740187' + }, + { + gtm: '20220318/015831', + mil: '780686.2', + hgt: '134', + spd: '58.6', + agl: '276', + lon: '66588787', + lat: '13741029' + }, + { + gtm: '20220318/015901', + mil: '780686.8', + hgt: '126', + spd: '67.6', + agl: '277', + lon: '66585689', + lat: '13741135' + }, + { + gtm: '20220318/015931', + mil: '780687.3', + hgt: '132', + spd: '57.6', + agl: '297', + lon: '66582708', + lat: '13741969' + }, + { + gtm: '20220318/015952', + mil: '780687.6', + hgt: '139', + spd: '51.9', + agl: '303', + lon: '66581079', + lat: '13742865' + }, + { + gtm: '20220318/020000', + mil: '780687.7', + hgt: '141', + spd: '46.5', + agl: '300', + lon: '66580535', + lat: '13743174' + }, + { + gtm: '20220318/020001', + mil: '780687.7', + hgt: '142', + spd: '45.9', + agl: '300', + lon: '66580470', + lat: '13743210' + }, + { + gtm: '20220318/020031', + mil: '780688.0', + hgt: '147', + spd: '38.9', + agl: '323', + lon: '66578865', + lat: '13744260' + }, + { + gtm: '20220318/020101', + mil: '780688.4', + hgt: '143', + spd: '49.4', + agl: '354', + lon: '66578192', + lat: '13746194' + }, + { + gtm: '20220318/020131', + mil: '780688.9', + hgt: '131', + spd: '66.5', + agl: '4', + lon: '66578264', + lat: '13748902' + }, + { + gtm: '20220318/020201', + mil: '780689.4', + hgt: '137', + spd: '61.7', + agl: '12', + lon: '66578509', + lat: '13751730' + }, + { + gtm: '20220318/020231', + mil: '780689.9', + hgt: '137', + spd: '58.9', + agl: '60', + lon: '66580185', + lat: '13753827' + }, + { + gtm: '20220318/020301', + mil: '780690.4', + hgt: '132', + spd: '63.3', + agl: '69', + lon: '66582900', + lat: '13754857' + }, + { + gtm: '20220318/020316', + mil: '780690.7', + hgt: '119', + spd: '76.7', + agl: '69', + lon: '66584496', + lat: '13755430' + }, + { + gtm: '20220318/020316', + mil: '780690.7', + hgt: '119', + spd: '76.7', + agl: '69', + lon: '66584496', + lat: '13755430' + }, + { + gtm: '20220318/020317', + mil: '780690.7', + hgt: '118', + spd: '77.7', + agl: '68', + lon: '66584613', + lat: '13755474' + }, + { + gtm: '20220318/020331', + mil: '780691.1', + hgt: '108', + spd: '86.2', + agl: '65', + lon: '66586362', + lat: '13756155' + }, + { + gtm: '20220318/020401', + mil: '780691.7', + hgt: '105', + spd: '74.9', + agl: '56', + lon: '66589746', + lat: '13757959' + }, + { + gtm: '20220318/020431', + mil: '780692.3', + hgt: '111', + spd: '59.2', + agl: '56', + lon: '66592551', + lat: '13759710' + }, + { + gtm: '20220318/020501', + mil: '780692.6', + hgt: '124', + spd: '39.3', + agl: '57', + lon: '66594490', + lat: '13760910' + }, + { + gtm: '20220318/020531', + mil: '780692.9', + hgt: '131', + spd: '34.7', + agl: '45', + lon: '66595812', + lat: '13761837' + }, + { + gtm: '20220318/020601', + mil: '780693.2', + hgt: '139', + spd: '36.1', + agl: '15', + lon: '66596658', + lat: '13763229' + }, + { + gtm: '20220318/020631', + mil: '780693.5', + hgt: '145', + spd: '39.1', + agl: '1', + lon: '66596802', + lat: '13765015' + }, + { + gtm: '20220318/020701', + mil: '780693.9', + hgt: '144', + spd: '41.0', + agl: '1', + lon: '66596847', + lat: '13766734' + }, + { + gtm: '20220318/020801', + mil: '780694.7', + hgt: '145', + spd: '56.1', + agl: '340', + lon: '66596474', + lat: '13770987' + }, + { + gtm: '20220318/020831', + mil: '780695.1', + hgt: '151', + spd: '54.3', + agl: '329', + lon: '66595183', + lat: '13773216' + }, + { + gtm: '20220318/020901', + mil: '780695.5', + hgt: '161', + spd: '39.5', + agl: '4', + lon: '66594519', + lat: '13775359' + }, + { + gtm: '20220318/020931', + mil: '780695.7', + hgt: '174', + spd: '24.6', + agl: '21', + lon: '66594858', + lat: '13776583' + }, + { + gtm: '20220318/021001', + mil: '780695.9', + hgt: '182', + spd: '25.9', + agl: '23', + lon: '66595350', + lat: '13777633' + }, + { + gtm: '20220318/021031', + mil: '780696.2', + hgt: '188', + spd: '31.9', + agl: '22', + lon: '66595891', + lat: '13778802' + }, + { + gtm: '20220318/021101', + mil: '780696.5', + hgt: '194', + spd: '38.1', + agl: '7', + lon: '66596355', + lat: '13780332' + }, + { + gtm: '20220318/021131', + mil: '780696.8', + hgt: '197', + spd: '40.6', + agl: '358', + lon: '66596313', + lat: '13782153' + }, + { + gtm: '20220318/021139', + mil: '780696.9', + hgt: '199', + spd: '39.8', + agl: '359', + lon: '66596295', + lat: '13782640' + }, + { + gtm: '20220318/021145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/021645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/022145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/022645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/023145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/023645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/024145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/024645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/025145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/025645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/030145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/030645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/031645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/032145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/032645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/033145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/033645', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/034145', + mil: '780697.0', + hgt: '200', + spd: '0.0', + agl: '0', + lon: '66596298', + lat: '13783003' + }, + { + gtm: '20220318/034703', + mil: '780697.7', + hgt: '0', + spd: '0.0', + agl: '0', + lon: '66673090', + lat: '14299429' + }, + { + gtm: '20220318/034723', + mil: '780698.1', + hgt: '132', + spd: '68.7', + agl: '5', + lon: '66672666', + lat: '14300944' + }, + { + gtm: '20220318/034753', + mil: '780698.6', + hgt: '136', + spd: '52.9', + agl: '2', + lon: '66673241', + lat: '14303685' + }, + { + gtm: '20220318/034823', + mil: '780699.0', + hgt: '137', + spd: '56.7', + agl: '329', + lon: '66672474', + lat: '14306029' + }, + { + gtm: '20220318/034853', + mil: '780699.5', + hgt: '144', + spd: '62.7', + agl: '328', + lon: '66670908', + lat: '14308314' + }, + { + gtm: '20220318/034923', + mil: '780700.1', + hgt: '146', + spd: '71.8', + agl: '346', + lon: '66669594', + lat: '14311024' + }, + { + gtm: '20220318/034944', + mil: '780700.5', + hgt: '142', + spd: '75.2', + agl: '6', + lon: '66669378', + lat: '14313375' + }, + { + gtm: '20220318/034947', + mil: '780700.6', + hgt: '142', + spd: '74.9', + agl: '9', + lon: '66669432', + lat: '14313710' + }, + { + gtm: '20220318/034953', + mil: '780700.7', + hgt: '140', + spd: '74.4', + agl: '15', + lon: '66669591', + lat: '14314368' + }, + { + gtm: '20220318/035023', + mil: '780701.3', + hgt: '138', + spd: '67.6', + agl: '320', + lon: '66669285', + lat: '14317452' + }, + { + gtm: '20220318/035053', + mil: '780701.8', + hgt: '142', + spd: '66.5', + agl: '300', + lon: '66666294', + lat: '14318713' + }, + { + gtm: '20220318/035123', + mil: '780702.3', + hgt: '148', + spd: '58.6', + agl: '350', + lon: '66664878', + lat: '14321093' + }, + { + gtm: '20220318/035142', + mil: '780702.6', + hgt: '148', + spd: '0.0', + agl: '351', + lon: '66664600', + lat: '14322640' + }, + { + gtm: '20220318/035353', + mil: '780704.7', + hgt: '148', + spd: '0.0', + agl: '351', + lon: '66664600', + lat: '14322640' + }, + { + gtm: '20220318/035423', + mil: '780705.2', + hgt: '148', + spd: '0.0', + agl: '351', + lon: '66664600', + lat: '14322640' + }, + { + gtm: '20220318/035453', + mil: '780705.8', + hgt: '148', + spd: '0.0', + agl: '351', + lon: '66664600', + lat: '14322640' + }, + { + gtm: '20220318/035459', + mil: '780705.9', + hgt: '148', + spd: '66.2', + agl: '337', + lon: '66660993', + lat: '14340156' + }, + { + gtm: '20220318/035524', + mil: '780706.3', + hgt: '109', + spd: '72.0', + agl: '318', + lon: '66659455', + lat: '14342232' + }, + { + gtm: '20220318/035554', + mil: '780707.0', + hgt: '94', + spd: '83.8', + agl: '317', + lon: '66656784', + lat: '14344764' + }, + { + gtm: '20220318/035612', + mil: '780707.4', + hgt: '84', + spd: '89.6', + agl: '336', + lon: '66655365', + lat: '14346724' + }, + { + gtm: '20220318/035618', + mil: '780707.6', + hgt: '82', + spd: '87.8', + agl: '341', + lon: '66655044', + lat: '14347482' + }, + { + gtm: '20220318/035624', + mil: '780707.7', + hgt: '80', + spd: '86.6', + agl: '348', + lon: '66654829', + lat: '14348241' + }, + { + gtm: '20220318/035626', + mil: '780707.8', + hgt: '79', + spd: '87.0', + agl: '350', + lon: '66654777', + lat: '14348500' + }, + { + gtm: '20220318/035634', + mil: '780707.9', + hgt: '77', + spd: '83.0', + agl: '2', + lon: '66654704', + lat: '14349537' + }, + { + gtm: '20220318/035654', + mil: '780708.4', + hgt: '71', + spd: '81.5', + agl: '32', + lon: '66655512', + lat: '14351868' + }, + { + gtm: '20220318/035724', + mil: '780709.0', + hgt: '66', + spd: '79.1', + agl: '26', + lon: '66657654', + lat: '14354871' + }, + { + gtm: '20220318/035724', + mil: '780709.0', + hgt: '66', + spd: '79.1', + agl: '26', + lon: '66657654', + lat: '14354871' + }, + { + gtm: '20220318/035725', + mil: '780709.1', + hgt: '66', + spd: '78.7', + agl: '24', + lon: '66657708', + lat: '14354979' + }, + { + gtm: '20220318/035754', + mil: '780709.6', + hgt: '75', + spd: '69.8', + agl: '350', + lon: '66657957', + lat: '14358090' + }, + { + gtm: '20220318/035824', + mil: '780710.2', + hgt: '82', + spd: '77.1', + agl: '349', + lon: '66657265', + lat: '14361255' + }, + { + gtm: '20220318/035854', + mil: '780710.9', + hgt: '71', + spd: '86.0', + agl: '349', + lon: '66656473', + lat: '14364910' + }, + { + gtm: '20220318/035917', + mil: '780711.4', + hgt: '74', + spd: '83.8', + agl: '11', + lon: '66656244', + lat: '14367784' + }, + { + gtm: '20220318/035920', + mil: '780711.5', + hgt: '75', + spd: '83.2', + agl: '16', + lon: '66656341', + lat: '14368153' + }, + { + gtm: '20220318/035924', + mil: '780711.6', + hgt: '73', + spd: '80.9', + agl: '23', + lon: '66656521', + lat: '14368617' + }, + { + gtm: '20220318/035954', + mil: '780712.2', + hgt: '66', + spd: '74.8', + agl: '32', + lon: '66658543', + lat: '14371716' + }, + { + gtm: '20220318/040024', + mil: '780712.8', + hgt: '85', + spd: '65.1', + agl: '345', + lon: '66659268', + lat: '14374471' + }, + { + gtm: '20220318/040054', + mil: '780713.3', + hgt: '90', + spd: '71.2', + agl: '355', + lon: '66658215', + lat: '14377455' + }, + { + gtm: '20220318/040124', + mil: '780713.9', + hgt: '90', + spd: '77.4', + agl: '42', + lon: '66659463', + lat: '14380471' + }, + { + gtm: '20220318/040154', + mil: '780714.6', + hgt: '84', + spd: '80.8', + agl: '45', + lon: '66662175', + lat: '14382969' + }, + { + gtm: '20220318/040224', + mil: '780715.2', + hgt: '91', + spd: '78.7', + agl: '45', + lon: '66664860', + lat: '14385441' + }, + { + gtm: '20220318/040254', + mil: '780715.9', + hgt: '85', + spd: '83.3', + agl: '23', + lon: '66667263', + lat: '14388426' + }, + { + gtm: '20220318/040324', + mil: '780716.5', + hgt: '93', + spd: '73.5', + agl: '1', + lon: '66667843', + lat: '14391931' + }, + { + gtm: '20220318/040354', + mil: '780717.1', + hgt: '104', + spd: '68.2', + agl: '12', + lon: '66667965', + lat: '14395027' + }, + { + gtm: '20220318/040424', + mil: '780717.7', + hgt: '101', + spd: '77.2', + agl: '67', + lon: '66670368', + lat: '14397204' + }, + { + gtm: '20220318/040454', + mil: '780718.3', + hgt: '97', + spd: '72.7', + agl: '27', + lon: '66673008', + lat: '14399404' + }, + { + gtm: '20220318/040522', + mil: '780718.9', + hgt: '99', + spd: '81.7', + agl: '28', + lon: '66674613', + lat: '14402338' + }, + { + gtm: '20220318/040524', + mil: '780719.0', + hgt: '99', + spd: '81.8', + agl: '28', + lon: '66674739', + lat: '14402556' + }, + { + gtm: '20220318/040525', + mil: '780719.0', + hgt: '98', + spd: '81.7', + agl: '29', + lon: '66674802', + lat: '14402664' + }, + { + gtm: '20220318/040554', + mil: '780719.6', + hgt: '90', + spd: '78.5', + agl: '53', + lon: '66677194', + lat: '14405316' + }, + { + gtm: '20220318/040624', + mil: '780720.2', + hgt: '106', + spd: '67.3', + agl: '70', + lon: '66680442', + lat: '14406744' + }, + { + gtm: '20220318/040654', + mil: '780720.7', + hgt: '120', + spd: '66.4', + agl: '50', + lon: '66683300', + lat: '14408049' + }, + { + gtm: '20220318/040724', + mil: '780721.3', + hgt: '116', + spd: '76.4', + agl: '14', + lon: '66685023', + lat: '14410804' + }, + { + gtm: '20220318/040742', + mil: '780721.7', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040747', + mil: '780721.8', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040754', + mil: '780722.0', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040755', + mil: '780722.0', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040755', + mil: '780722.0', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040757', + mil: '780722.0', + hgt: '110', + spd: '0.0', + agl: '9', + lon: '66685401', + lat: '14412869' + }, + { + gtm: '20220318/040800', + mil: '780722.1', + hgt: '110', + spd: '78.8', + agl: '23', + lon: '66686086', + lat: '14414996' + }, + { + gtm: '20220318/040801', + mil: '780722.1', + hgt: '128', + spd: '78.8', + agl: '23', + lon: '66686086', + lat: '14414996' + }, + { + gtm: '20220318/040825', + mil: '780722.6', + hgt: '102', + spd: '74.2', + agl: '22', + lon: '66686683', + lat: '14417649' + }, + { + gtm: '20220318/040855', + mil: '780723.2', + hgt: '99', + spd: '71.0', + agl: '38', + lon: '66688407', + lat: '14420388' + }, + { + gtm: '20220318/040925', + mil: '780723.8', + hgt: '102', + spd: '70.8', + agl: '69', + lon: '66691146', + lat: '14422276' + }, + { + gtm: '20220318/040955', + mil: '780724.3', + hgt: '105', + spd: '68.4', + agl: '62', + lon: '66694351', + lat: '14423292' + }, + { + gtm: '20220318/041025', + mil: '780724.9', + hgt: '103', + spd: '67.0', + agl: '76', + lon: '66697390', + lat: '14424690' + }, + { + gtm: '20220318/041055', + mil: '780725.4', + hgt: '114', + spd: '53.5', + agl: '72', + lon: '66700252', + lat: '14425293' + }, + { + gtm: '20220318/041125', + mil: '780725.8', + hgt: '125', + spd: '56.0', + agl: '47', + lon: '66702499', + lat: '14426602' + }, + { + gtm: '20220318/041129', + mil: '780725.9', + hgt: '127', + spd: '56.0', + agl: '46', + lon: '66702763', + lat: '14426835' + }, + { + gtm: '20220318/041145', + mil: '780726.1', + hgt: '135', + spd: '53.3', + agl: '50', + lon: '66703845', + lat: '14427720' + }, + { + gtm: '20220318/041153', + mil: '780726.3', + hgt: '141', + spd: '48.6', + agl: '56', + lon: '66704370', + lat: '14428093' + }, + { + gtm: '20220318/041155', + mil: '780726.3', + hgt: '142', + spd: '47.4', + agl: '55', + lon: '66704497', + lat: '14428176' + }, + { + gtm: '20220318/041225', + mil: '780726.6', + hgt: '157', + spd: '35.6', + agl: '56', + lon: '66705959', + lat: '14429130' + }, + { + gtm: '20220318/041255', + mil: '780726.9', + hgt: '170', + spd: '41.9', + agl: '50', + lon: '66707490', + lat: '14430178' + }, + { + gtm: '20220318/041322', + mil: '780727.3', + hgt: '159', + spd: '68.7', + agl: '45', + lon: '66709277', + lat: '14431677' + }, + { + gtm: '20220318/041325', + mil: '780727.4', + hgt: '156', + spd: '72.6', + agl: '44', + lon: '66709521', + lat: '14431905' + }, + { + gtm: '20220318/041331', + mil: '780727.5', + hgt: '149', + spd: '73.6', + agl: '46', + lon: '66710016', + lat: '14432382' + }, + { + gtm: '20220318/041334', + mil: '780727.6', + hgt: '146', + spd: '75.9', + agl: '48', + lon: '66710283', + lat: '14432611' + }, + { + gtm: '20220318/041340', + mil: '780727.7', + hgt: '141', + spd: '77.2', + agl: '58', + lon: '66710892', + lat: '14433029' + }, + { + gtm: '20220318/041344', + mil: '780727.8', + hgt: '139', + spd: '77.2', + agl: '64', + lon: '66711335', + lat: '14433253' + }, + { + gtm: '20220318/041347', + mil: '780727.8', + hgt: '139', + spd: '76.1', + agl: '67', + lon: '66711678', + lat: '14433396' + }, + { + gtm: '20220318/041355', + mil: '780728.0', + hgt: '141', + spd: '69.9', + agl: '68', + lon: '66712570', + lat: '14433717' + }, + { + gtm: '20220318/041412', + mil: '780728.3', + hgt: '142', + spd: '67.2', + agl: '35', + lon: '66714051', + lat: '14434729' + }, + { + gtm: '20220318/041419', + mil: '780728.4', + hgt: '138', + spd: '68.6', + agl: '18', + lon: '66714382', + lat: '14435377' + }, + { + gtm: '20220318/041421', + mil: '780728.5', + hgt: '137', + spd: '69.4', + agl: '13', + lon: '66714435', + lat: '14435580' + }, + { + gtm: '20220318/041424', + mil: '780728.5', + hgt: '135', + spd: '70.3', + agl: '5', + lon: '66714480', + lat: '14435892' + }, + { + gtm: '20220318/041425', + mil: '780728.5', + hgt: '135', + spd: '70.6', + agl: '3', + lon: '66714486', + lat: '14435998' + }, + { + gtm: '20220318/041445', + mil: '780728.9', + hgt: '129', + spd: '70.1', + agl: '344', + lon: '66713910', + lat: '14438064' + }, + { + gtm: '20220318/041449', + mil: '780729.0', + hgt: '129', + spd: '67.9', + agl: '351', + lon: '66713809', + lat: '14438472' + }, + { + gtm: '20220318/041455', + mil: '780729.1', + hgt: '128', + spd: '66.2', + agl: '3', + lon: '66713779', + lat: '14439069' + }, + { + gtm: '20220318/041502', + mil: '780729.2', + hgt: '127', + spd: '66.7', + agl: '17', + lon: '66713917', + lat: '14439757' + }, + { + gtm: '20220318/041504', + mil: '780729.3', + hgt: '127', + spd: '66.6', + agl: '20', + lon: '66713988', + lat: '14439946' + }, + { + gtm: '20220318/041508', + mil: '780729.4', + hgt: '126', + spd: '66.1', + agl: '22', + lon: '66714142', + lat: '14440317' + }, + { + gtm: '20220318/041512', + mil: '780729.4', + hgt: '125', + spd: '65.8', + agl: '23', + lon: '66714307', + lat: '14440686' + }, + { + gtm: '20220318/041525', + mil: '780729.7', + hgt: '121', + spd: '65.6', + agl: '28', + lon: '66714915', + lat: '14441851' + }, + { + gtm: '20220318/041543', + mil: '780730.0', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041555', + mil: '780730.2', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041625', + mil: '780730.6', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041655', + mil: '780731.1', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041725', + mil: '780731.6', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041725', + mil: '780731.6', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041755', + mil: '780732.0', + hgt: '121', + spd: '0.0', + agl: '34', + lon: '66715890', + lat: '14443338' + }, + { + gtm: '20220318/041818', + mil: '780732.4', + hgt: '121', + spd: '55.2', + agl: '38', + lon: '66724555', + lat: '14454092' + }, + { + gtm: '20220318/041825', + mil: '780732.5', + hgt: '157', + spd: '55.1', + agl: '36', + lon: '66724893', + lat: '14454516' + }, + { + gtm: '20220318/041855', + mil: '780733.0', + hgt: '173', + spd: '53.6', + agl: '29', + lon: '66726403', + lat: '14456580' + }, + { + gtm: '20220318/041908', + mil: '780733.1', + hgt: '178', + spd: '0.0', + agl: '28', + lon: '66726876', + lat: '14457429' + }, + { + gtm: '20220318/041925', + mil: '780733.4', + hgt: '178', + spd: '0.0', + agl: '28', + lon: '66726876', + lat: '14457429' + }, + { + gtm: '20220318/041931', + mil: '780733.4', + hgt: '178', + spd: '44.9', + agl: '10', + lon: '66727393', + lat: '14459052' + }, + { + gtm: '20220318/041956', + mil: '780733.7', + hgt: '184', + spd: '47.3', + agl: '358', + lon: '66727503', + lat: '14460727' + }, + { + gtm: '20220318/041958', + mil: '780733.8', + hgt: '185', + spd: '0.0', + agl: '358', + lon: '66727494', + lat: '14460873' + }, + { + gtm: '20220318/042010', + mil: '780733.9', + hgt: '185', + spd: '54.4', + agl: '356', + lon: '66727360', + lat: '14461974' + }, + { + gtm: '20220318/042027', + mil: '780734.1', + hgt: '196', + spd: '47.4', + agl: '355', + lon: '66727314', + lat: '14462952' + }, + { + gtm: '20220318/042057', + mil: '780734.6', + hgt: '190', + spd: '64.3', + agl: '359', + lon: '66727144', + lat: '14465358' + }, + { + gtm: '20220318/042127', + mil: '780735.2', + hgt: '180', + spd: '69.0', + agl: '28', + lon: '66728043', + lat: '14468341' + }, + { + gtm: '20220318/042157', + mil: '780735.7', + hgt: '175', + spd: '70.2', + agl: '5', + lon: '66729183', + lat: '14471264' + }, + { + gtm: '20220318/042227', + mil: '780736.3', + hgt: '163', + spd: '74.3', + agl: '359', + lon: '66729135', + lat: '14474631' + }, + { + gtm: '20220318/042257', + mil: '780736.9', + hgt: '164', + spd: '69.8', + agl: '358', + lon: '66729031', + lat: '14477752' + }, + { + gtm: '20220318/042327', + mil: '780737.5', + hgt: '164', + spd: '75.7', + agl: '359', + lon: '66728922', + lat: '14481051' + }, + { + gtm: '20220318/042357', + mil: '780738.1', + hgt: '160', + spd: '73.4', + agl: '11', + lon: '66729234', + lat: '14484366' + }, + { + gtm: '20220318/042427', + mil: '780738.7', + hgt: '156', + spd: '76.8', + agl: '357', + lon: '66729607', + lat: '14487741' + }, + { + gtm: '20220318/042427', + mil: '780738.7', + hgt: '156', + spd: '76.8', + agl: '357', + lon: '66729607', + lat: '14487741' + }, + { + gtm: '20220318/042457', + mil: '780739.3', + hgt: '159', + spd: '71.3', + agl: '356', + lon: '66729114', + lat: '14491037' + }, + { + gtm: '20220318/042527', + mil: '780740.0', + hgt: '157', + spd: '80.8', + agl: '8', + lon: '66729543', + lat: '14494450' + }, + { + gtm: '20220318/042557', + mil: '780740.6', + hgt: '166', + spd: '73.9', + agl: '348', + lon: '66729186', + lat: '14498041' + }, + { + gtm: '20220318/042627', + mil: '780741.2', + hgt: '182', + spd: '59.7', + agl: '3', + lon: '66728862', + lat: '14501017' + }, + { + gtm: '20220318/042657', + mil: '780741.6', + hgt: '195', + spd: '55.2', + agl: '4', + lon: '66729028', + lat: '14503414' + }, + { + gtm: '20220318/042727', + mil: '780742.1', + hgt: '192', + spd: '68.0', + agl: '4', + lon: '66729234', + lat: '14506161' + }, + { + gtm: '20220318/042757', + mil: '780742.7', + hgt: '189', + spd: '73.0', + agl: '18', + lon: '66729815', + lat: '14509366' + }, + { + gtm: '20220318/042827', + mil: '780743.3', + hgt: '196', + spd: '62.0', + agl: '32', + lon: '66731280', + lat: '14512110' + }, + { + gtm: '20220318/042857', + mil: '780743.8', + hgt: '203', + spd: '62.8', + agl: '33', + lon: '66732952', + lat: '14514439' + }, + { + gtm: '20220318/042927', + mil: '780744.3', + hgt: '203', + spd: '67.3', + agl: '31', + lon: '66734659', + lat: '14516838' + }, + { + gtm: '20220318/042957', + mil: '780744.8', + hgt: '202', + spd: '66.2', + agl: '1', + lon: '66735687', + lat: '14519721' + }, + { + gtm: '20220318/043027', + mil: '780745.4', + hgt: '212', + spd: '66.1', + agl: '328', + lon: '66734872', + lat: '14522427' + }, + { + gtm: '20220318/043045', + mil: '780745.7', + hgt: '205', + spd: '76.7', + agl: '312', + lon: '66733462', + lat: '14523838' + }, + { + gtm: '20220318/043054', + mil: '780745.9', + hgt: '198', + spd: '79.7', + agl: '307', + lon: '66732540', + lat: '14524512' + }, + { + gtm: '20220318/043057', + mil: '780746.0', + hgt: '196', + spd: '79.5', + agl: '308', + lon: '66732230', + lat: '14524731' + }, + { + gtm: '20220318/043100', + mil: '780746.0', + hgt: '195', + spd: '81.1', + agl: '308', + lon: '66731916', + lat: '14524953' + }, + { + gtm: '20220318/043108', + mil: '780746.2', + hgt: '191', + spd: '76.8', + agl: '309', + lon: '66731080', + lat: '14525545' + }, + { + gtm: '20220318/043127', + mil: '780746.6', + hgt: '190', + spd: '73.1', + agl: '309', + lon: '66729277', + lat: '14526834' + }, + { + gtm: '20220318/043157', + mil: '780747.2', + hgt: '188', + spd: '74.7', + agl: '337', + lon: '66726852', + lat: '14529339' + }, + { + gtm: '20220318/043227', + mil: '780747.8', + hgt: '183', + spd: '72.8', + agl: '21', + lon: '66726825', + lat: '14532600' + }, + { + gtm: '20220318/043257', + mil: '780748.4', + hgt: '189', + spd: '64.9', + agl: '61', + lon: '66729099', + lat: '14534881' + }, + { + gtm: '20220318/043327', + mil: '780748.9', + hgt: '195', + spd: '68.9', + agl: '68', + lon: '66732162', + lat: '14536069' + }, + { + gtm: '20220318/043357', + mil: '780749.5', + hgt: '200', + spd: '70.2', + agl: '29', + lon: '66734740', + lat: '14537993' + }, + { + gtm: '20220318/043427', + mil: '780750.1', + hgt: '215', + spd: '64.0', + agl: '13', + lon: '66735636', + lat: '14540919' + }, + { + gtm: '20220318/043457', + mil: '780750.6', + hgt: '224', + spd: '60.1', + agl: '12', + lon: '66736281', + lat: '14543613' + }, + { + gtm: '20220318/043527', + mil: '780751.1', + hgt: '229', + spd: '63.2', + agl: '5', + lon: '66736836', + lat: '14546412' + }, + { + gtm: '20220318/043548', + mil: '780751.4', + hgt: '229', + spd: '0.0', + agl: '351', + lon: '66736725', + lat: '14548386' + }, + { + gtm: '20220318/043557', + mil: '780751.6', + hgt: '229', + spd: '0.0', + agl: '351', + lon: '66736725', + lat: '14548386' + }, + { + gtm: '20220318/043600', + mil: '780751.7', + hgt: '229', + spd: '41.9', + agl: '343', + lon: '66736348', + lat: '14549814' + }, + { + gtm: '20220318/043627', + mil: '780752.2', + hgt: '215', + spd: '82.2', + agl: '341', + lon: '66735219', + lat: '14552352' + }, + { + gtm: '20220318/043655', + mil: '780752.9', + hgt: '204', + spd: '85.4', + agl: '8', + lon: '66734904', + lat: '14555874' + }, + { + gtm: '20220318/043657', + mil: '780752.9', + hgt: '204', + spd: '84.9', + agl: '9', + lon: '66734944', + lat: '14556129' + }, + { + gtm: '20220318/043657', + mil: '780752.9', + hgt: '204', + spd: '84.9', + agl: '9', + lon: '66734944', + lat: '14556129' + }, + { + gtm: '20220318/043659', + mil: '780753.0', + hgt: '203', + spd: '83.5', + agl: '9', + lon: '66734988', + lat: '14556379' + }, + { + gtm: '20220318/043727', + mil: '780753.6', + hgt: '199', + spd: '79.4', + agl: '10', + lon: '66735653', + lat: '14559723' + }, + { + gtm: '20220318/043827', + mil: '780754.7', + hgt: '208', + spd: '74.3', + agl: '332', + lon: '66735123', + lat: '14565963' + }, + { + gtm: '20220318/043857', + mil: '780755.4', + hgt: '205', + spd: '71.9', + agl: '340', + lon: '66733449', + lat: '14568969' + }, + { + gtm: '20220318/043927', + mil: '780755.9', + hgt: '206', + spd: '64.6', + agl: '356', + lon: '66732914', + lat: '14571945' + }, + { + gtm: '20220318/043957', + mil: '780756.4', + hgt: '216', + spd: '64.4', + agl: '348', + lon: '66732453', + lat: '14574834' + }, + { + gtm: '20220318/044027', + mil: '780757.0', + hgt: '226', + spd: '65.0', + agl: '358', + lon: '66731958', + lat: '14577669' + }, + { + gtm: '20220318/044057', + mil: '780757.6', + hgt: '224', + spd: '75.9', + agl: '354', + lon: '66731960', + lat: '14580897' + }, + { + gtm: '20220318/044057', + mil: '780757.6', + hgt: '224', + spd: '75.9', + agl: '354', + lon: '66731960', + lat: '14580897' + }, + { + gtm: '20220318/044127', + mil: '780758.1', + hgt: '226', + spd: '67.6', + agl: '325', + lon: '66730713', + lat: '14583870' + }, + { + gtm: '20220318/044157', + mil: '780758.7', + hgt: '238', + spd: '62.5', + agl: '319', + lon: '66728592', + lat: '14586139' + }, + { + gtm: '20220318/044227', + mil: '780759.1', + hgt: '252', + spd: '41.5', + agl: '323', + lon: '66726946', + lat: '14587944' + }, + { + gtm: '20220318/044257', + mil: '780759.4', + hgt: '262', + spd: '45.5', + agl: '336', + lon: '66725877', + lat: '14589603' + }, + { + gtm: '20220318/044316', + mil: '780759.7', + hgt: '269', + spd: '0.0', + agl: '345', + lon: '66725416', + lat: '14590837' + }, + { + gtm: '20220318/044327', + mil: '780759.8', + hgt: '269', + spd: '0.0', + agl: '345', + lon: '66725416', + lat: '14590837' + }, + { + gtm: '20220318/044354', + mil: '780760.2', + hgt: '269', + spd: '45.7', + agl: '6', + lon: '66725217', + lat: '14593524' + }, + { + gtm: '20220318/044358', + mil: '780760.2', + hgt: '284', + spd: '47.5', + agl: '8', + lon: '66725226', + lat: '14593735' + }, + { + gtm: '20220318/044428', + mil: '780760.6', + hgt: '283', + spd: '57.1', + agl: '24', + lon: '66725943', + lat: '14595938' + }, + { + gtm: '20220318/044458', + mil: '780761.2', + hgt: '278', + spd: '68.9', + agl: '46', + lon: '66727785', + lat: '14598282' + }, + { + gtm: '20220318/044528', + mil: '780761.8', + hgt: '272', + spd: '73.0', + agl: '52', + lon: '66730447', + lat: '14600297' + }, + { + gtm: '20220318/044552', + mil: '780762.3', + hgt: '259', + spd: '81.8', + agl: '52', + lon: '66732816', + lat: '14601964' + }, + { + gtm: '20220318/044553', + mil: '780762.3', + hgt: '258', + spd: '82.6', + agl: '52', + lon: '66732924', + lat: '14602041' + }, + { + gtm: '20220318/044557', + mil: '780762.4', + hgt: '255', + spd: '85.3', + agl: '50', + lon: '66733350', + lat: '14602361' + }, + { + gtm: '20220318/044558', + mil: '780762.4', + hgt: '255', + spd: '86.0', + agl: '49', + lon: '66733457', + lat: '14602446' + }, + { + gtm: '20220318/044601', + mil: '780762.5', + hgt: '252', + spd: '88.0', + agl: '47', + lon: '66733774', + lat: '14602711' + }, + { + gtm: '20220318/044602', + mil: '780762.5', + hgt: '251', + spd: '88.8', + agl: '46', + lon: '66733879', + lat: '14602804' + }, + { + gtm: '20220318/044604', + mil: '780762.5', + hgt: '249', + spd: '90.2', + agl: '43', + lon: '66734083', + lat: '14602999' + }, + { + gtm: '20220318/044606', + mil: '780762.6', + hgt: '248', + spd: '91.5', + agl: '40', + lon: '66734280', + lat: '14603206' + }, + { + gtm: '20220318/044610', + mil: '780762.7', + hgt: '244', + spd: '92.8', + agl: '33', + lon: '66734637', + lat: '14603658' + }, + { + gtm: '20220318/044615', + mil: '780762.8', + hgt: '241', + spd: '93.3', + agl: '25', + lon: '66734995', + lat: '14604271' + }, + { + gtm: '20220318/044622', + mil: '780763.0', + hgt: '238', + spd: '90.1', + agl: '13', + lon: '66735318', + lat: '14605196' + }, + { + gtm: '20220318/044628', + mil: '780763.1', + hgt: '238', + spd: '86.6', + agl: '6', + lon: '66735445', + lat: '14605980' + }, + { + gtm: '20220318/044658', + mil: '780763.8', + hgt: '237', + spd: '79.2', + agl: '15', + lon: '66735834', + lat: '14609592' + }, + { + gtm: '20220318/044701', + mil: '780763.9', + hgt: '236', + spd: '79.7', + agl: '16', + lon: '66735937', + lat: '14609940' + }, + { + gtm: '20220318/044702', + mil: '780763.9', + hgt: '235', + spd: '79.9', + agl: '16', + lon: '66735972', + lat: '14610055' + }, + { + gtm: '20220318/044703', + mil: '780763.9', + hgt: '235', + spd: '80.2', + agl: '15', + lon: '66736008', + lat: '14610171' + }, + { + gtm: '20220318/044708', + mil: '780764.0', + hgt: '233', + spd: '81.0', + agl: '16', + lon: '66736185', + lat: '14610756' + }, + { + gtm: '20220318/044728', + mil: '780764.5', + hgt: '225', + spd: '83.8', + agl: '9', + lon: '66736828', + lat: '14613153' + }, + { + gtm: '20220318/044748', + mil: '780764.9', + hgt: '220', + spd: '84.0', + agl: '338', + lon: '66736435', + lat: '14615632' + }, + { + gtm: '20220318/044753', + mil: '780765.0', + hgt: '219', + spd: '83.1', + agl: '330', + lon: '66736119', + lat: '14616190' + }, + { + gtm: '20220318/044758', + mil: '780765.1', + hgt: '218', + spd: '82.4', + agl: '322', + lon: '66735732', + lat: '14616698' + }, + { + gtm: '20220318/044814', + mil: '780765.5', + hgt: '212', + spd: '86.1', + agl: '307', + lon: '66734080', + lat: '14618038' + }, + { + gtm: '20220318/044817', + mil: '780765.6', + hgt: '211', + spd: '86.8', + agl: '307', + lon: '66733737', + lat: '14618271' + }, + { + gtm: '20220318/044828', + mil: '780765.8', + hgt: '205', + spd: '89.3', + agl: '306', + lon: '66732454', + lat: '14619144' + }, + { + gtm: '20220318/044858', + mil: '780766.5', + hgt: '203', + spd: '77.9', + agl: '308', + lon: '66729100', + lat: '14621430' + }, + { + gtm: '20220318/044928', + mil: '780767.2', + hgt: '201', + spd: '79.8', + agl: '322', + lon: '66726294', + lat: '14623911' + }, + { + gtm: '20220318/044958', + mil: '780767.9', + hgt: '194', + spd: '83.9', + agl: '328', + lon: '66724021', + lat: '14627095' + }, + { + gtm: '20220318/044959', + mil: '780767.9', + hgt: '194', + spd: '83.8', + agl: '328', + lon: '66723948', + lat: '14627203' + }, + { + gtm: '20220318/045003', + mil: '780768.0', + hgt: '193', + spd: '81.9', + agl: '326', + lon: '66723649', + lat: '14627623' + }, + { + gtm: '20220318/045004', + mil: '780768.0', + hgt: '193', + spd: '80.7', + agl: '326', + lon: '66723575', + lat: '14627724' + }, + { + gtm: '20220318/045012', + mil: '780768.2', + hgt: '191', + spd: '73.9', + agl: '322', + lon: '66722961', + lat: '14628484' + }, + { + gtm: '20220318/045013', + mil: '780768.2', + hgt: '191', + spd: '72.2', + agl: '321', + lon: '66722887', + lat: '14628570' + }, + { + gtm: '20220318/045016', + mil: '780768.3', + hgt: '191', + spd: '69.9', + agl: '319', + lon: '66722664', + lat: '14628814' + }, + { + gtm: '20220318/045028', + mil: '780768.4', + hgt: '190', + spd: '46.9', + agl: '319', + lon: '66721862', + lat: '14629611' + }, + { + gtm: '20220318/045031', + mil: '780768.5', + hgt: '190', + spd: '40.0', + agl: '323', + lon: '66721729', + lat: '14629762' + }, + { + gtm: '20220318/045058', + mil: '780768.7', + hgt: '202', + spd: '31.6', + agl: '30', + lon: '66721660', + lat: '14630943' + }, + { + gtm: '20220318/045106', + mil: '780768.8', + hgt: '203', + spd: '37.9', + agl: '48', + lon: '66721960', + lat: '14631264' + }, + { + gtm: '20220318/045128', + mil: '780769.1', + hgt: '203', + spd: '46.4', + agl: '60', + lon: '66723256', + lat: '14632053' + }, + { + gtm: '20220318/045158', + mil: '780769.5', + hgt: '204', + spd: '59.3', + agl: '66', + lon: '66725580', + lat: '14633212' + }, + { + gtm: '20220318/045228', + mil: '780770.0', + hgt: '206', + spd: '60.6', + agl: '82', + lon: '66728490', + lat: '14633926' + }, + { + gtm: '20220318/045258', + mil: '780770.5', + hgt: '209', + spd: '61.9', + agl: '83', + lon: '66731532', + lat: '14634267' + }, + { + gtm: '20220318/045328', + mil: '780771.0', + hgt: '214', + spd: '63.9', + agl: '83', + lon: '66734632', + lat: '14634607' + }, + { + gtm: '20220318/045358', + mil: '780771.5', + hgt: '222', + spd: '59.4', + agl: '83', + lon: '66737716', + lat: '14634942' + }, + { + gtm: '20220318/045428', + mil: '780772.0', + hgt: '231', + spd: '53.7', + agl: '66', + lon: '66740259', + lat: '14635527' + }, + { + gtm: '20220318/045458', + mil: '780772.4', + hgt: '242', + spd: '57.1', + agl: '61', + lon: '66742678', + lat: '14636722' + }, + { + gtm: '20220318/045528', + mil: '780772.9', + hgt: '249', + spd: '60.3', + agl: '61', + lon: '66745179', + lat: '14637999' + }, + { + gtm: '20220318/045554', + mil: '780773.3', + hgt: '243', + spd: '61.2', + agl: '66', + lon: '66747408', + lat: '14639010' + }, + { + gtm: '20220318/045557', + mil: '780773.4', + hgt: '241', + spd: '63.1', + agl: '67', + lon: '66747690', + lat: '14639122' + }, + { + gtm: '20220318/045558', + mil: '780773.4', + hgt: '241', + spd: '63.8', + agl: '67', + lon: '66747786', + lat: '14639160' + }, + { + gtm: '20220318/045558', + mil: '780773.4', + hgt: '241', + spd: '63.8', + agl: '67', + lon: '66747786', + lat: '14639160' + }, + { + gtm: '20220318/045612', + mil: '780773.7', + hgt: '230', + spd: '67.2', + agl: '71', + lon: '66749230', + lat: '14639670' + }, + { + gtm: '20220318/045613', + mil: '780773.7', + hgt: '230', + spd: '67.0', + agl: '71', + lon: '66749334', + lat: '14639703' + }, + { + gtm: '20220318/045621', + mil: '780773.8', + hgt: '225', + spd: '67.3', + agl: '73', + lon: '66750184', + lat: '14639962' + }, + { + gtm: '20220318/045622', + mil: '780773.9', + hgt: '224', + spd: '66.3', + agl: '73', + lon: '66750288', + lat: '14639991' + }, + { + gtm: '20220318/045623', + mil: '780773.9', + hgt: '223', + spd: '65.5', + agl: '74', + lon: '66750391', + lat: '14640021' + }, + { + gtm: '20220318/045628', + mil: '780774.0', + hgt: '221', + spd: '65.6', + agl: '76', + lon: '66750915', + lat: '14640147' + }, + { + gtm: '20220318/045638', + mil: '780774.1', + hgt: '217', + spd: '52.1', + agl: '79', + lon: '66751844', + lat: '14640330' + }, + { + gtm: '20220318/045639', + mil: '780774.1', + hgt: '217', + spd: '51.1', + agl: '79', + lon: '66751927', + lat: '14640345' + }, + { + gtm: '20220318/045647', + mil: '780774.2', + hgt: '215', + spd: '42.6', + agl: '91', + lon: '66752553', + lat: '14640414' + }, + { + gtm: '20220318/045651', + mil: '780774.3', + hgt: '213', + spd: '44.0', + agl: '107', + lon: '66752832', + lat: '14640370' + }, + { + gtm: '20220318/045652', + mil: '780774.3', + hgt: '213', + spd: '44.1', + agl: '110', + lon: '66752899', + lat: '14640348' + }, + { + gtm: '20220318/045658', + mil: '780774.4', + hgt: '211', + spd: '45.6', + agl: '135', + lon: '66753262', + lat: '14640117' + }, + { + gtm: '20220318/045658', + mil: '780774.4', + hgt: '211', + spd: '45.6', + agl: '135', + lon: '66753262', + lat: '14640117' + }, + { + gtm: '20220318/045701', + mil: '780774.4', + hgt: '211', + spd: '45.8', + agl: '144', + lon: '66753402', + lat: '14639956' + }, + { + gtm: '20220318/045705', + mil: '780774.4', + hgt: '211', + spd: '44.0', + agl: '138', + lon: '66753583', + lat: '14639748' + }, + { + gtm: '20220318/045708', + mil: '780774.5', + hgt: '211', + spd: '43.2', + agl: '125', + lon: '66753745', + lat: '14639620' + }, + { + gtm: '20220318/045709', + mil: '780774.5', + hgt: '211', + spd: '40.9', + agl: '120', + lon: '66753804', + lat: '14639589' + }, + { + gtm: '20220318/045720', + mil: '780774.6', + hgt: '212', + spd: '34.9', + agl: '61', + lon: '66754432', + lat: '14639604' + }, + { + gtm: '20220318/045728', + mil: '780774.7', + hgt: '213', + spd: '35.2', + agl: '27', + lon: '66754719', + lat: '14639913' + }, + { + gtm: '20220318/045728', + mil: '780774.7', + hgt: '213', + spd: '35.2', + agl: '27', + lon: '66754719', + lat: '14639913' + }, + { + gtm: '20220318/045740', + mil: '780774.8', + hgt: '215', + spd: '36.7', + agl: '344', + lon: '66754719', + lat: '14640542' + }, + { + gtm: '20220318/045758', + mil: '780775.0', + hgt: '213', + spd: '44.6', + agl: '326', + lon: '66754095', + lat: '14641476' + }, + { + gtm: '20220318/045811', + mil: '780775.2', + hgt: '208', + spd: '52.8', + agl: '339', + lon: '66753585', + lat: '14642325' + }, + { + gtm: '20220318/045828', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643063' + }, + { + gtm: '20220318/045831', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643064' + }, + { + gtm: '20220318/045858', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643064' + }, + { + gtm: '20220318/045928', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643064' + }, + { + gtm: '20220318/045958', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643064' + }, + { + gtm: '20220318/050028', + mil: '780775.3', + hgt: '204', + spd: '0.0', + agl: '353', + lon: '66753345', + lat: '14643064' + }, + { + gtm: '20220318/050058', + mil: '780775.4', + hgt: '209', + spd: '26.7', + agl: '351', + lon: '66753219', + lat: '14643516' + }, + { + gtm: '20220318/050128', + mil: '780775.7', + hgt: '204', + spd: '50.9', + agl: '352', + lon: '66752916', + lat: '14645349' + }, + { + gtm: '20220318/050158', + mil: '780776.2', + hgt: '201', + spd: '63.5', + agl: '359', + lon: '66752602', + lat: '14647875' + }, + { + gtm: '20220318/050228', + mil: '780776.8', + hgt: '197', + spd: '80.0', + agl: '22', + lon: '66753222', + lat: '14651109' + }, + { + gtm: '20220318/050258', + mil: '780777.5', + hgt: '189', + spd: '82.6', + agl: '35', + lon: '66755439', + lat: '14654289' + }, + { + gtm: '20220318/050328', + mil: '780778.1', + hgt: '188', + spd: '75.8', + agl: '5', + lon: '66756587', + lat: '14657602' + }, + { + gtm: '20220318/050358', + mil: '780778.8', + hgt: '188', + spd: '79.8', + agl: '20', + lon: '66757435', + lat: '14661108' + }, + { + gtm: '20220318/050412', + mil: '780779.1', + hgt: '189', + spd: '79.6', + agl: '11', + lon: '66757901', + lat: '14662719' + }, + { + gtm: '20220318/050415', + mil: '780779.2', + hgt: '188', + spd: '78.9', + agl: '7', + lon: '66757960', + lat: '14663073' + }, + { + gtm: '20220318/050428', + mil: '780779.4', + hgt: '187', + spd: '79.6', + agl: '5', + lon: '66758109', + lat: '14664591' + }, + { + gtm: '20220318/050458', + mil: '780780.1', + hgt: '185', + spd: '80.0', + agl: '15', + lon: '66758826', + lat: '14668220' + }, + { + gtm: '20220318/050528', + mil: '780780.8', + hgt: '191', + spd: '82.3', + agl: '5', + lon: '66759774', + lat: '14671770' + }, + { + gtm: '20220318/050558', + mil: '780781.5', + hgt: '190', + spd: '88.4', + agl: '353', + lon: '66759432', + lat: '14675593' + }, + { + gtm: '20220318/050628', + mil: '780782.2', + hgt: '190', + spd: '86.6', + agl: '16', + lon: '66759519', + lat: '14679429' + }, + { + gtm: '20220318/050658', + mil: '780782.9', + hgt: '189', + spd: '84.7', + agl: '48', + lon: '66761763', + lat: '14682630' + }, + { + gtm: '20220318/050728', + mil: '780783.6', + hgt: '190', + spd: '75.8', + agl: '52', + lon: '66764955', + lat: '14684923' + }, + { + gtm: '20220318/050758', + mil: '780784.2', + hgt: '199', + spd: '75.2', + agl: '27', + lon: '66767343', + lat: '14687353' + }, + { + gtm: '20220318/050828', + mil: '780784.8', + hgt: '187', + spd: '87.2', + agl: '10', + lon: '66768234', + lat: '14690881' + }, + { + gtm: '20220318/050858', + mil: '780785.6', + hgt: '169', + spd: '95.4', + agl: '9', + lon: '66768999', + lat: '14695032' + }, + { + gtm: '20220318/050906', + mil: '780785.8', + hgt: '166', + spd: '95.0', + agl: '8', + lon: '66769198', + lat: '14696166' + }, + { + gtm: '20220318/050923', + mil: '780786.2', + hgt: '162', + spd: '91.7', + agl: '349', + lon: '66769179', + lat: '14698554' + }, + { + gtm: '20220318/050928', + mil: '780786.4', + hgt: '162', + spd: '90.4', + agl: '343', + lon: '66768989', + lat: '14699214' + }, + { + gtm: '20220318/050958', + mil: '780787.1', + hgt: '163', + spd: '88.8', + agl: '325', + lon: '66766758', + lat: '14702593' + }, + { + gtm: '20220318/050958', + mil: '780787.1', + hgt: '163', + spd: '88.8', + agl: '325', + lon: '66766758', + lat: '14702593' + }, + { + gtm: '20220318/051028', + mil: '780787.7', + hgt: '177', + spd: '79.0', + agl: '343', + lon: '66764850', + lat: '14705880' + }, + { + gtm: '20220318/051028', + mil: '780787.7', + hgt: '177', + spd: '79.0', + agl: '343', + lon: '66764850', + lat: '14705880' + }, + { + gtm: '20220318/051058', + mil: '780788.4', + hgt: '179', + spd: '81.6', + agl: '327', + lon: '66763293', + lat: '14709183' + }, + { + gtm: '20220318/051126', + mil: '780789.1', + hgt: '163', + spd: '91.7', + agl: '337', + lon: '66761211', + lat: '14712280' + }, + { + gtm: '20220318/051128', + mil: '780789.1', + hgt: '161', + spd: '92.6', + agl: '339', + lon: '66761098', + lat: '14712538' + }, + { + gtm: '20220318/051128', + mil: '780789.1', + hgt: '161', + spd: '92.6', + agl: '339', + lon: '66761098', + lat: '14712538' + }, + { + gtm: '20220318/051129', + mil: '780789.1', + hgt: '161', + spd: '92.9', + agl: '340', + lon: '66761046', + lat: '14712669' + }, + { + gtm: '20220318/051137', + mil: '780789.4', + hgt: '156', + spd: '91.1', + agl: '348', + lon: '66760716', + lat: '14713748' + }, + { + gtm: '20220318/051139', + mil: '780789.4', + hgt: '155', + spd: '90.2', + agl: '350', + lon: '66760660', + lat: '14714016' + }, + { + gtm: '20220318/051140', + mil: '780789.4', + hgt: '155', + spd: '89.8', + agl: '351', + lon: '66760636', + lat: '14714148' + }, + { + gtm: '20220318/051151', + mil: '780789.7', + hgt: '155', + spd: '85.9', + agl: '1', + lon: '66760530', + lat: '14715605' + }, + { + gtm: '20220318/051158', + mil: '780789.8', + hgt: '156', + spd: '84.3', + agl: '6', + lon: '66760588', + lat: '14716495' + }, + { + gtm: '20220318/051227', + mil: '780790.5', + hgt: '158', + spd: '90.0', + agl: '29', + lon: '66761906', + lat: '14720056' + }, + { + gtm: '20220318/051228', + mil: '780790.6', + hgt: '158', + spd: '90.0', + agl: '30', + lon: '66761980', + lat: '14720173' + }, + { + gtm: '20220318/051232', + mil: '780790.7', + hgt: '158', + spd: '90.4', + agl: '33', + lon: '66762294', + lat: '14720634' + }, + { + gtm: '20220318/051258', + mil: '780791.3', + hgt: '162', + spd: '87.7', + agl: '49', + lon: '66764841', + lat: '14723184' + }, + { + gtm: '20220318/051328', + mil: '780792.0', + hgt: '160', + spd: '87.7', + agl: '28', + lon: '66767692', + lat: '14726066' + }, + { + gtm: '20220318/051358', + mil: '780792.7', + hgt: '151', + spd: '87.9', + agl: '24', + lon: '66769468', + lat: '14729724' + }, + { + gtm: '20220318/051428', + mil: '780793.5', + hgt: '148', + spd: '89.5', + agl: '24', + lon: '66771240', + lat: '14733412' + }, + { + gtm: '20220318/051458', + mil: '780794.2', + hgt: '147', + spd: '91.0', + agl: '10', + lon: '66772605', + lat: '14737216' + }, + { + gtm: '20220318/051458', + mil: '780794.2', + hgt: '147', + spd: '91.0', + agl: '10', + lon: '66772605', + lat: '14737216' + }, + { + gtm: '20220318/051528', + mil: '780794.9', + hgt: '152', + spd: '85.7', + agl: '6', + lon: '66773130', + lat: '14741232' + }, + { + gtm: '20220318/051558', + mil: '780795.6', + hgt: '160', + spd: '76.3', + agl: '359', + lon: '66773454', + lat: '14744800' + }, + { + gtm: '20220318/051628', + mil: '780796.2', + hgt: '162', + spd: '79.6', + agl: '334', + lon: '66772494', + lat: '14748216' + }, + { + gtm: '20220318/051658', + mil: '780796.9', + hgt: '153', + spd: '92.1', + agl: '318', + lon: '66769858', + lat: '14751336' + }, + { + gtm: '20220318/051728', + mil: '780797.7', + hgt: '146', + spd: '87.7', + agl: '336', + lon: '66767293', + lat: '14754708' + }, + { + gtm: '20220318/051728', + mil: '780797.7', + hgt: '146', + spd: '87.7', + agl: '336', + lon: '66767293', + lat: '14754708' + }, + { + gtm: '20220318/051758', + mil: '780798.4', + hgt: '145', + spd: '87.0', + agl: '341', + lon: '66765988', + lat: '14758480' + }, + { + gtm: '20220318/051828', + mil: '780799.1', + hgt: '151', + spd: '81.4', + agl: '329', + lon: '66764115', + lat: '14761920' + }, + { + gtm: '20220318/051858', + mil: '780799.8', + hgt: '156', + spd: '85.3', + agl: '344', + lon: '66762369', + lat: '14765279' + }, + { + gtm: '20220318/051928', + mil: '780800.5', + hgt: '156', + spd: '85.9', + agl: '349', + lon: '66761536', + lat: '14769173' + }, + { + gtm: '20220318/051958', + mil: '780801.2', + hgt: '162', + spd: '79.5', + agl: '350', + lon: '66760828', + lat: '14772885' + }, + { + gtm: '20220318/052028', + mil: '780801.8', + hgt: '168', + spd: '75.8', + agl: '341', + lon: '66760015', + lat: '14776285' + }, + { + gtm: '20220318/052058', + mil: '780802.4', + hgt: '171', + spd: '76.0', + agl: '325', + lon: '66758274', + lat: '14779292' + }, + { + gtm: '20220318/052128', + mil: '780803.1', + hgt: '184', + spd: '70.8', + agl: '330', + lon: '66756201', + lat: '14782072' + }, + { + gtm: '20220318/052158', + mil: '780803.6', + hgt: '200', + spd: '65.6', + agl: '352', + lon: '66755178', + lat: '14784953' + }, + { + gtm: '20220318/052209', + mil: '780803.8', + hgt: '204', + spd: '0.0', + agl: '352', + lon: '66755022', + lat: '14786029' + }, + { + gtm: '20220318/052228', + mil: '780804.1', + hgt: '204', + spd: '0.0', + agl: '352', + lon: '66755022', + lat: '14786029' + }, + { + gtm: '20220318/052258', + mil: '780804.7', + hgt: '204', + spd: '0.0', + agl: '352', + lon: '66755022', + lat: '14786029' + }, + { + gtm: '20220318/052325', + mil: '780805.1', + hgt: '204', + spd: '67.7', + agl: '359', + lon: '66754046', + lat: '14793393' + }, + { + gtm: '20220318/052328', + mil: '780805.2', + hgt: '233', + spd: '68.4', + agl: '0', + lon: '66754060', + lat: '14793585' + }, + { + gtm: '20220318/052358', + mil: '780805.8', + hgt: '233', + spd: '81.6', + agl: '359', + lon: '66754315', + lat: '14796954' + }, + { + gtm: '20220318/052428', + mil: '780806.5', + hgt: '239', + spd: '77.0', + agl: '340', + lon: '66753391', + lat: '14800528' + }, + { + gtm: '20220318/052458', + mil: '780807.1', + hgt: '250', + spd: '65.7', + agl: '341', + lon: '66752199', + lat: '14803464' + }, + { + gtm: '20220318/052528', + mil: '780807.6', + hgt: '253', + spd: '77.6', + agl: '340', + lon: '66750988', + lat: '14806476' + }, + { + gtm: '20220318/052558', + mil: '780808.3', + hgt: '249', + spd: '86.6', + agl: '353', + lon: '66749950', + lat: '14809989' + }, + { + gtm: '20220318/052628', + mil: '780809.0', + hgt: '240', + spd: '90.6', + agl: '339', + lon: '66748902', + lat: '14813938' + }, + { + gtm: '20220318/052658', + mil: '780809.7', + hgt: '250', + spd: '74.2', + agl: '340', + lon: '66747426', + lat: '14817441' + }, + { + gtm: '20220318/052658', + mil: '780809.7', + hgt: '250', + spd: '74.2', + agl: '340', + lon: '66747426', + lat: '14817441' + }, + { + gtm: '20220318/052728', + mil: '780810.3', + hgt: '254', + spd: '81.6', + agl: '9', + lon: '66747130', + lat: '14820741' + }, + { + gtm: '20220318/052741', + mil: '780810.7', + hgt: '243', + spd: '90.0', + agl: '11', + lon: '66747474', + lat: '14822404' + }, + { + gtm: '20220318/052745', + mil: '780810.8', + hgt: '240', + spd: '91.8', + agl: '10', + lon: '66747585', + lat: '14822944' + }, + { + gtm: '20220318/052747', + mil: '780810.8', + hgt: '239', + spd: '89.7', + agl: '10', + lon: '66747637', + lat: '14823211' + }, + { + gtm: '20220318/052747', + mil: '780810.8', + hgt: '239', + spd: '89.7', + agl: '10', + lon: '66747637', + lat: '14823211' + }, + { + gtm: '20220318/052754', + mil: '780811.0', + hgt: '234', + spd: '89.7', + agl: '5', + lon: '66747772', + lat: '14824150' + }, + { + gtm: '20220318/052758', + mil: '780811.1', + hgt: '232', + spd: '90.3', + agl: '2', + lon: '66747807', + lat: '14824692' + }, + { + gtm: '20220318/052758', + mil: '780811.1', + hgt: '232', + spd: '90.3', + agl: '2', + lon: '66747807', + lat: '14824692' + }, + { + gtm: '20220318/052828', + mil: '780811.8', + hgt: '234', + spd: '85.5', + agl: '340', + lon: '66746934', + lat: '14828604' + }, + { + gtm: '20220318/052828', + mil: '780811.8', + hgt: '234', + spd: '85.5', + agl: '340', + lon: '66746934', + lat: '14828604' + }, + { + gtm: '20220318/052858', + mil: '780812.5', + hgt: '244', + spd: '82.4', + agl: '347', + lon: '66745787', + lat: '14832186' + }, + { + gtm: '20220318/052928', + mil: '780813.2', + hgt: '242', + spd: '84.6', + agl: '341', + lon: '66744861', + lat: '14835897' + }, + { + gtm: '20220318/052958', + mil: '780813.9', + hgt: '249', + spd: '80.4', + agl: '342', + lon: '66743229', + lat: '14839344' + }, + { + gtm: '20220318/053028', + mil: '780814.5', + hgt: '241', + spd: '86.4', + agl: '356', + lon: '66742652', + lat: '14842893' + }, + { + gtm: '20220318/053028', + mil: '780814.5', + hgt: '241', + spd: '86.4', + agl: '356', + lon: '66742652', + lat: '14842893' + }, + { + gtm: '20220318/053058', + mil: '780815.2', + hgt: '244', + spd: '82.3', + agl: '356', + lon: '66742341', + lat: '14846788' + }, + { + gtm: '20220318/053128', + mil: '780815.8', + hgt: '262', + spd: '69.5', + agl: '5', + lon: '66742425', + lat: '14850187' + }, + { + gtm: '20220318/053158', + mil: '780816.4', + hgt: '266', + spd: '78.3', + agl: '356', + lon: '66742451', + lat: '14853436' + }, + { + gtm: '20220318/053228', + mil: '780817.1', + hgt: '259', + spd: '85.5', + agl: '355', + lon: '66741985', + lat: '14857272' + }, + { + gtm: '20220318/053228', + mil: '780817.1', + hgt: '259', + spd: '85.5', + agl: '355', + lon: '66741985', + lat: '14857272' + }, + { + gtm: '20220318/053258', + mil: '780817.8', + hgt: '257', + spd: '88.2', + agl: '5', + lon: '66741985', + lat: '14861127' + }, + { + gtm: '20220318/053328', + mil: '780818.6', + hgt: '253', + spd: '86.9', + agl: '6', + lon: '66742429', + lat: '14865141' + }, + { + gtm: '20220318/053358', + mil: '780819.3', + hgt: '261', + spd: '83.0', + agl: '350', + lon: '66742474', + lat: '14868924' + }, + { + gtm: '20220318/053428', + mil: '780819.9', + hgt: '259', + spd: '84.1', + agl: '349', + lon: '66741589', + lat: '14872584' + }, + { + gtm: '20220318/053455', + mil: '780820.6', + hgt: '259', + spd: '83.8', + agl: '24', + lon: '66742050', + lat: '14875958' + }, + { + gtm: '20220318/053458', + mil: '780820.6', + hgt: '257', + spd: '84.7', + agl: '25', + lon: '66742224', + lat: '14876304' + }, + { + gtm: '20220318/053458', + mil: '780820.6', + hgt: '257', + spd: '84.7', + agl: '25', + lon: '66742224', + lat: '14876304' + }, + { + gtm: '20220318/053528', + mil: '780821.4', + hgt: '237', + spd: '94.7', + agl: '8', + lon: '66743373', + lat: '14880180' + }, + { + gtm: '20220318/053528', + mil: '780821.4', + hgt: '237', + spd: '94.7', + agl: '8', + lon: '66743373', + lat: '14880180' + }, + { + gtm: '20220318/053558', + mil: '780822.1', + hgt: '241', + spd: '84.6', + agl: '5', + lon: '66743965', + lat: '14884314' + }, + { + gtm: '20220318/053628', + mil: '780822.7', + hgt: '255', + spd: '70.3', + agl: '341', + lon: '66743340', + lat: '14887626' + }, + { + gtm: '20220318/053658', + mil: '780823.3', + hgt: '269', + spd: '71.7', + agl: '2', + lon: '66742801', + lat: '14890755' + }, + { + gtm: '20220318/053728', + mil: '780823.9', + hgt: '281', + spd: '75.8', + agl: '2', + lon: '66742920', + lat: '14894061' + }, + { + gtm: '20220318/053758', + mil: '780824.6', + hgt: '289', + spd: '76.3', + agl: '357', + lon: '66742999', + lat: '14897562' + }, + { + gtm: '20220318/053828', + mil: '780825.2', + hgt: '296', + spd: '74.1', + agl: '339', + lon: '66742125', + lat: '14900883' + }, + { + gtm: '20220318/053858', + mil: '780825.8', + hgt: '305', + spd: '71.4', + agl: '343', + lon: '66740890', + lat: '14903998' + }, + { + gtm: '20220318/053928', + mil: '780826.4', + hgt: '299', + spd: '81.0', + agl: '7', + lon: '66740559', + lat: '14907382' + }, + { + gtm: '20220318/053958', + mil: '780827.1', + hgt: '286', + spd: '87.1', + agl: '16', + lon: '66741633', + lat: '14911107' + }, + { + gtm: '20220318/054028', + mil: '780827.8', + hgt: '297', + spd: '75.7', + agl: '17', + lon: '66742755', + lat: '14914566' + }, + { + gtm: '20220318/054058', + mil: '780828.4', + hgt: '300', + spd: '78.8', + agl: '1', + lon: '66743484', + lat: '14918001' + }, + { + gtm: '20220318/054128', + mil: '780829.1', + hgt: '306', + spd: '81.6', + agl: '351', + lon: '66743049', + lat: '14921602' + }, + { + gtm: '20220318/054158', + mil: '780829.7', + hgt: '315', + spd: '78.7', + agl: '5', + lon: '66742749', + lat: '14925207' + }, + { + gtm: '20220318/054228', + mil: '780830.4', + hgt: '312', + spd: '83.3', + agl: '2', + lon: '66743118', + lat: '14928787' + }, + { + gtm: '20220318/054239', + mil: '780830.6', + hgt: '307', + spd: '85.9', + agl: '358', + lon: '66743106', + lat: '14930202' + }, + { + gtm: '20220318/054239', + mil: '780830.6', + hgt: '307', + spd: '85.9', + agl: '358', + lon: '66743106', + lat: '14930202' + }, + { + gtm: '20220318/054241', + mil: '780830.7', + hgt: '306', + spd: '85.5', + agl: '357', + lon: '66743094', + lat: '14930459' + }, + { + gtm: '20220318/054258', + mil: '780831.1', + hgt: '305', + spd: '81.3', + agl: '356', + lon: '66742950', + lat: '14932586' + }, + { + gtm: '20220318/054328', + mil: '780831.8', + hgt: '301', + spd: '87.2', + agl: '10', + lon: '66743058', + lat: '14936337' + }, + { + gtm: '20220318/054358', + mil: '780832.5', + hgt: '294', + spd: '86.7', + agl: '3', + lon: '66743634', + lat: '14940268' + }, + { + gtm: '20220318/054358', + mil: '780832.5', + hgt: '294', + spd: '86.7', + agl: '3', + lon: '66743634', + lat: '14940268' + }, + { + gtm: '20220318/054428', + mil: '780833.1', + hgt: '299', + spd: '80.1', + agl: '353', + lon: '66743478', + lat: '14943906' + }, + { + gtm: '20220318/054458', + mil: '780833.9', + hgt: '282', + spd: '92.1', + agl: '345', + lon: '66742579', + lat: '14947728' + }, + { + gtm: '20220318/054528', + mil: '780834.6', + hgt: '273', + spd: '88.6', + agl: '1', + lon: '66741756', + lat: '14951738' + }, + { + gtm: '20220318/054528', + mil: '780834.6', + hgt: '273', + spd: '88.6', + agl: '1', + lon: '66741756', + lat: '14951738' + }, + { + gtm: '20220318/054558', + mil: '780835.3', + hgt: '265', + spd: '93.6', + agl: '12', + lon: '66742504', + lat: '14955762' + }, + { + gtm: '20220318/054628', + mil: '780836.1', + hgt: '256', + spd: '91.3', + agl: '0', + lon: '66742948', + lat: '14959968' + }, + { + gtm: '20220318/054628', + mil: '780836.1', + hgt: '256', + spd: '91.3', + agl: '0', + lon: '66742948', + lat: '14959968' + }, + { + gtm: '20220318/054758', + mil: '780838.2', + hgt: '250', + spd: '85.2', + agl: '17', + lon: '66743409', + lat: '14971680' + }, + { + gtm: '20220318/054758', + mil: '780838.2', + hgt: '250', + spd: '85.2', + agl: '17', + lon: '66743409', + lat: '14971680' + }, + { + gtm: '20220318/054828', + mil: '780839.0', + hgt: '247', + spd: '87.2', + agl: '31', + lon: '66745303', + lat: '14975193' + }, + { + gtm: '20220318/054848', + mil: '780839.4', + hgt: '257', + spd: '77.6', + agl: '31', + lon: '66746695', + lat: '14977311' + }, + { + gtm: '20220318/054853', + mil: '780839.5', + hgt: '260', + spd: '68.6', + agl: '31', + lon: '66747011', + lat: '14977789' + }, + { + gtm: '20220318/054858', + mil: '780839.6', + hgt: '262', + spd: '58.9', + agl: '31', + lon: '66747271', + lat: '14978181' + }, + { + gtm: '20220318/054858', + mil: '780839.6', + hgt: '262', + spd: '58.9', + agl: '31', + lon: '66747271', + lat: '14978181' + }, + { + gtm: '20220318/054906', + mil: '780839.7', + hgt: '263', + spd: '61.9', + agl: '31', + lon: '66747679', + lat: '14978802' + }, + { + gtm: '20220318/054906', + mil: '780839.7', + hgt: '263', + spd: '61.9', + agl: '31', + lon: '66747679', + lat: '14978802' + }, + { + gtm: '20220318/054906', + mil: '780839.7', + hgt: '263', + spd: '61.9', + agl: '31', + lon: '66747679', + lat: '14978802' + }, + { + gtm: '20220318/054928', + mil: '780840.1', + hgt: '264', + spd: '73.9', + agl: '43', + lon: '66749105', + lat: '14980641' + }, + { + gtm: '20220318/054938', + mil: '780840.3', + hgt: '267', + spd: '76.8', + agl: '48', + lon: '66750001', + lat: '14981428' + }, + { + gtm: '20220318/054944', + mil: '780840.5', + hgt: '269', + spd: '78.1', + agl: '48', + lon: '66750577', + lat: '14981891' + }, + { + gtm: '20220318/054944', + mil: '780840.5', + hgt: '269', + spd: '78.1', + agl: '48', + lon: '66750577', + lat: '14981891' + }, + { + gtm: '20220318/054958', + mil: '780840.7', + hgt: '275', + spd: '74.1', + agl: '38', + lon: '66751762', + lat: '14983060' + }, + { + gtm: '20220318/055028', + mil: '780841.3', + hgt: '284', + spd: '73.7', + agl: '18', + lon: '66753280', + lat: '14985884' + }, + { + gtm: '20220318/055058', + mil: '780842.0', + hgt: '289', + spd: '75.3', + agl: '30', + lon: '66754698', + lat: '14989098' + }, + { + gtm: '20220318/055128', + mil: '780842.6', + hgt: '302', + spd: '72.8', + agl: '31', + lon: '66756525', + lat: '14991936' + }, + { + gtm: '20220318/055158', + mil: '780843.2', + hgt: '309', + spd: '78.8', + agl: '17', + lon: '66758135', + lat: '14995032' + }, + { + gtm: '20220318/055228', + mil: '780843.9', + hgt: '309', + spd: '82.9', + agl: '13', + lon: '66759057', + lat: '14998658' + }, + { + gtm: '20220318/055258', + mil: '780844.5', + hgt: '320', + spd: '77.6', + agl: '22', + lon: '66760026', + lat: '15002143' + }, + { + gtm: '20220318/055328', + mil: '780845.2', + hgt: '329', + spd: '77.5', + agl: '42', + lon: '66762140', + lat: '15005031' + }, + { + gtm: '20220318/055358', + mil: '780845.8', + hgt: '338', + spd: '76.2', + agl: '21', + lon: '66764136', + lat: '15007899' + }, + { + gtm: '20220318/055428', + mil: '780846.4', + hgt: '338', + spd: '82.3', + agl: '43', + lon: '66766063', + lat: '15010915' + }, + { + gtm: '20220318/055458', + mil: '780847.1', + hgt: '343', + spd: '75.6', + agl: '31', + lon: '66768588', + lat: '15013666' + }, + { + gtm: '20220318/055528', + mil: '780847.7', + hgt: '350', + spd: '77.3', + agl: '20', + lon: '66769923', + lat: '15016867' + }, + { + gtm: '20220318/055558', + mil: '780848.3', + hgt: '350', + spd: '83.2', + agl: '27', + lon: '66771541', + lat: '15020088' + }, + { + gtm: '20220318/055628', + mil: '780849.0', + hgt: '351', + spd: '80.2', + agl: '28', + lon: '66773448', + lat: '15023424' + }, + { + gtm: '20220318/055658', + mil: '780849.7', + hgt: '352', + spd: '82.2', + agl: '28', + lon: '66775320', + lat: '15026701' + }, + { + gtm: '20220318/055728', + mil: '780850.3', + hgt: '363', + spd: '77.8', + agl: '13', + lon: '66776769', + lat: '15030003' + }, + { + gtm: '20220318/055758', + mil: '780851.0', + hgt: '364', + spd: '80.0', + agl: '11', + lon: '66777529', + lat: '15033532' + }, + { + gtm: '20220318/055828', + mil: '780851.7', + hgt: '369', + spd: '79.6', + agl: '22', + lon: '66778579', + lat: '15037011' + }, + { + gtm: '20220318/055828', + mil: '780851.7', + hgt: '369', + spd: '79.6', + agl: '22', + lon: '66778579', + lat: '15037011' + }, + { + gtm: '20220318/055858', + mil: '780852.3', + hgt: '377', + spd: '80.3', + agl: '39', + lon: '66780511', + lat: '15040108' + }, + { + gtm: '20220318/055928', + mil: '780853.0', + hgt: '385', + spd: '84.6', + agl: '54', + lon: '66783609', + lat: '15042507' + }, + { + gtm: '20220318/055958', + mil: '780853.6', + hgt: '403', + spd: '70.1', + agl: '26', + lon: '66786253', + lat: '15044933' + }, + { + gtm: '20220318/060028', + mil: '780854.2', + hgt: '406', + spd: '74.8', + agl: '22', + lon: '66787189', + lat: '15048096' + }, + { + gtm: '20220318/060058', + mil: '780854.8', + hgt: '411', + spd: '75.4', + agl: '57', + lon: '66789615', + lat: '15050621' + }, + { + gtm: '20220318/060128', + mil: '780855.5', + hgt: '405', + spd: '86.0', + agl: '52', + lon: '66792936', + lat: '15052671' + }, + { + gtm: '20220318/060158', + mil: '780856.2', + hgt: '404', + spd: '85.5', + agl: '49', + lon: '66795951', + lat: '15055398' + }, + { + gtm: '20220318/060228', + mil: '780856.9', + hgt: '410', + spd: '81.6', + agl: '71', + lon: '66799611', + lat: '15057043' + }, + { + gtm: '20220318/060258', + mil: '780857.6', + hgt: '414', + spd: '79.9', + agl: '50', + lon: '66803138', + lat: '15058749' + }, + { + gtm: '20220318/060328', + mil: '780858.2', + hgt: '410', + spd: '76.9', + agl: '34', + lon: '66805501', + lat: '15061432' + }, + { + gtm: '20220318/060358', + mil: '780858.8', + hgt: '415', + spd: '69.8', + agl: '34', + lon: '66807555', + lat: '15064260' + }, + { + gtm: '20220318/060428', + mil: '780859.4', + hgt: '425', + spd: '74.5', + agl: '33', + lon: '66809478', + lat: '15066900' + }, + { + gtm: '20220318/060458', + mil: '780860.0', + hgt: '423', + spd: '84.0', + agl: '42', + lon: '66811833', + lat: '15069786' + }, + { + gtm: '20220318/060528', + mil: '780860.8', + hgt: '405', + spd: '91.0', + agl: '58', + lon: '66815236', + lat: '15072377' + }, + { + gtm: '20220318/060558', + mil: '780861.5', + hgt: '406', + spd: '80.5', + agl: '57', + lon: '66818857', + lat: '15074269' + }, + { + gtm: '20220318/060628', + mil: '780862.2', + hgt: '393', + spd: '89.4', + agl: '41', + lon: '66822046', + lat: '15076833' + }, + { + gtm: '20220318/060658', + mil: '780862.8', + hgt: '399', + spd: '80.0', + agl: '24', + lon: '66824256', + lat: '15080016' + }, + { + gtm: '20220318/060728', + mil: '780863.5', + hgt: '402', + spd: '77.7', + agl: '20', + lon: '66825574', + lat: '15083224' + }, + { + gtm: '20220318/060758', + mil: '780864.1', + hgt: '397', + spd: '81.2', + agl: '21', + lon: '66826962', + lat: '15086685' + }, + { + gtm: '20220318/060828', + mil: '780864.8', + hgt: '401', + spd: '80.6', + agl: '44', + lon: '66829090', + lat: '15089742' + }, + { + gtm: '20220318/060858', + mil: '780865.5', + hgt: '394', + spd: '92.5', + agl: '70', + lon: '66832554', + lat: '15091718' + }, + { + gtm: '20220318/060928', + mil: '780866.3', + hgt: '388', + spd: '91.2', + agl: '76', + lon: '66837070', + lat: '15092535' + }, + { + gtm: '20220318/060958', + mil: '780867.0', + hgt: '383', + spd: '83.3', + agl: '59', + lon: '66841083', + lat: '15094050' + }, + { + gtm: '20220318/061028', + mil: '780867.7', + hgt: '379', + spd: '83.5', + agl: '48', + lon: '66844303', + lat: '15096396' + }, + { + gtm: '20220318/061058', + mil: '780868.3', + hgt: '393', + spd: '69.3', + agl: '48', + lon: '66847131', + lat: '15098725' + }, + { + gtm: '20220318/061128', + mil: '780868.8', + hgt: '407', + spd: '70.5', + agl: '48', + lon: '66849689', + lat: '15100827' + }, + { + gtm: '20220318/061158', + mil: '780869.4', + hgt: '418', + spd: '74.7', + agl: '57', + lon: '66852426', + lat: '15102871' + }, + { + gtm: '20220318/061228', + mil: '780870.1', + hgt: '419', + spd: '77.2', + agl: '73', + lon: '66855855', + lat: '15104301' + }, + { + gtm: '20220318/061258', + mil: '780870.6', + hgt: '440', + spd: '63.2', + agl: '74', + lon: '66859239', + lat: '15105049' + }, + { + gtm: '20220318/061328', + mil: '780871.1', + hgt: '454', + spd: '58.0', + agl: '60', + lon: '66861894', + lat: '15106108' + }, + { + gtm: '20220318/061358', + mil: '780871.6', + hgt: '468', + spd: '54.7', + agl: '50', + lon: '66864151', + lat: '15107638' + }, + { + gtm: '20220318/061428', + mil: '780872.0', + hgt: '481', + spd: '47.8', + agl: '58', + lon: '66866157', + lat: '15109002' + }, + { + gtm: '20220318/061458', + mil: '780872.4', + hgt: '483', + spd: '59.6', + agl: '64', + lon: '66868482', + lat: '15110097' + }, + { + gtm: '20220318/061528', + mil: '780873.0', + hgt: '480', + spd: '65.6', + agl: '58', + lon: '66871365', + lat: '15111477' + }, + { + gtm: '20220318/061558', + mil: '780873.5', + hgt: '473', + spd: '70.9', + agl: '46', + lon: '66873976', + lat: '15113377' + }, + { + gtm: '20220318/061628', + mil: '780874.1', + hgt: '463', + spd: '75.9', + agl: '34', + lon: '66876273', + lat: '15115911' + }, + { + gtm: '20220318/061628', + mil: '780874.1', + hgt: '463', + spd: '75.9', + agl: '34', + lon: '66876273', + lat: '15115911' + }, + { + gtm: '20220318/061658', + mil: '780874.7', + hgt: '467', + spd: '65.9', + agl: '25', + lon: '66877947', + lat: '15118821' + }, + { + gtm: '20220318/061728', + mil: '780875.3', + hgt: '464', + spd: '73.7', + agl: '30', + lon: '66879390', + lat: '15121637' + }, + { + gtm: '20220318/061738', + mil: '780875.5', + hgt: '461', + spd: '78.4', + agl: '39', + lon: '66880113', + lat: '15122572' + }, + { + gtm: '20220318/061744', + mil: '780875.6', + hgt: '460', + spd: '79.7', + agl: '47', + lon: '66880647', + lat: '15123091' + }, + { + gtm: '20220318/061747', + mil: '780875.7', + hgt: '458', + spd: '79.6', + agl: '50', + lon: '66880944', + lat: '15123327' + }, + { + gtm: '20220318/061752', + mil: '780875.8', + hgt: '455', + spd: '80.6', + agl: '54', + lon: '66881469', + lat: '15123699' + }, + { + gtm: '20220318/061758', + mil: '780875.9', + hgt: '451', + spd: '81.9', + agl: '56', + lon: '66882135', + lat: '15124113' + }, + { + gtm: '20220318/061802', + mil: '780876.0', + hgt: '449', + spd: '83.0', + agl: '56', + lon: '66882588', + lat: '15124390' + }, + { + gtm: '20220318/061809', + mil: '780876.2', + hgt: '446', + spd: '81.2', + agl: '57', + lon: '66883384', + lat: '15124875' + }, + { + gtm: '20220318/061828', + mil: '780876.6', + hgt: '440', + spd: '79.3', + agl: '45', + lon: '66885349', + lat: '15126255' + }, + { + gtm: '20220318/061837', + mil: '780876.8', + hgt: '434', + spd: '81.5', + agl: '38', + lon: '66886134', + lat: '15127071' + }, + { + gtm: '20220318/061841', + mil: '780876.9', + hgt: '432', + spd: '83.1', + agl: '33', + lon: '66886447', + lat: '15127476' + }, + { + gtm: '20220318/061844', + mil: '780877.0', + hgt: '431', + spd: '83.1', + agl: '31', + lon: '66886659', + lat: '15127791' + }, + { + gtm: '20220318/061851', + mil: '780877.1', + hgt: '429', + spd: '77.9', + agl: '28', + lon: '66887103', + lat: '15128545' + }, + { + gtm: '20220318/061852', + mil: '780877.1', + hgt: '429', + spd: '76.2', + agl: '29', + lon: '66887161', + lat: '15128647' + }, + { + gtm: '20220318/061855', + mil: '780877.2', + hgt: '428', + spd: '76.1', + agl: '30', + lon: '66887340', + lat: '15128946' + }, + { + gtm: '20220318/061856', + mil: '780877.2', + hgt: '427', + spd: '75.6', + agl: '30', + lon: '66887402', + lat: '15129045' + }, + { + gtm: '20220318/061858', + mil: '780877.3', + hgt: '426', + spd: '75.5', + agl: '32', + lon: '66887529', + lat: '15129240' + }, + { + gtm: '20220318/061858', + mil: '780877.3', + hgt: '426', + spd: '75.5', + agl: '32', + lon: '66887529', + lat: '15129240' + }, + { + gtm: '20220318/061913', + mil: '780877.6', + hgt: '422', + spd: '77.6', + agl: '49', + lon: '66888745', + lat: '15130518' + }, + { + gtm: '20220318/061926', + mil: '780877.8', + hgt: '410', + spd: '75.7', + agl: '65', + lon: '66890172', + lat: '15131352' + }, + { + gtm: '20220318/061926', + mil: '780877.8', + hgt: '410', + spd: '75.7', + agl: '65', + lon: '66890172', + lat: '15131352' + }, + { + gtm: '20220318/061926', + mil: '780877.8', + hgt: '410', + spd: '75.7', + agl: '65', + lon: '66890172', + lat: '15131352' + }, + { + gtm: '20220318/061926', + mil: '780877.8', + hgt: '410', + spd: '75.7', + agl: '65', + lon: '66890172', + lat: '15131352' + }, + { + gtm: '20220318/061928', + mil: '780877.9', + hgt: '408', + spd: '72.7', + agl: '67', + lon: '66890394', + lat: '15131442' + }, + { + gtm: '20220318/061928', + mil: '780877.9', + hgt: '408', + spd: '72.7', + agl: '67', + lon: '66890394', + lat: '15131442' + }, + { + gtm: '20220318/061932', + mil: '780878.0', + hgt: '404', + spd: '75.4', + agl: '71', + lon: '66890853', + lat: '15131604' + }, + { + gtm: '20220318/061939', + mil: '780878.1', + hgt: '397', + spd: '75.6', + agl: '76', + lon: '66891706', + lat: '15131817' + }, + { + gtm: '20220318/061940', + mil: '780878.1', + hgt: '396', + spd: '74.9', + agl: '76', + lon: '66891828', + lat: '15131844' + }, + { + gtm: '20220318/061943', + mil: '780878.2', + hgt: '394', + spd: '75.9', + agl: '77', + lon: '66892191', + lat: '15131923' + }, + { + gtm: '20220318/061944', + mil: '780878.2', + hgt: '393', + spd: '76.2', + agl: '77', + lon: '66892314', + lat: '15131950' + }, + { + gtm: '20220318/061956', + mil: '780878.5', + hgt: '383', + spd: '70.6', + agl: '68', + lon: '66893730', + lat: '15132348' + }, + { + gtm: '20220318/061958', + mil: '780878.5', + hgt: '381', + spd: '69.3', + agl: '66', + lon: '66893941', + lat: '15132430' + }, + { + gtm: '20220318/062028', + mil: '780879.1', + hgt: '363', + spd: '76.9', + agl: '64', + lon: '66897108', + lat: '15134099' + }, + { + gtm: '20220318/062032', + mil: '780879.2', + hgt: '360', + spd: '77.8', + agl: '67', + lon: '66897576', + lat: '15134289' + }, + { + gtm: '20220318/062049', + mil: '780879.5', + hgt: '347', + spd: '70.9', + agl: '75', + lon: '66899622', + lat: '15134856' + }, + { + gtm: '20220318/062058', + mil: '780879.7', + hgt: '340', + spd: '74.7', + agl: '74', + lon: '66900651', + lat: '15135121' + }, + { + gtm: '20220318/062058', + mil: '780879.7', + hgt: '340', + spd: '74.7', + agl: '74', + lon: '66900651', + lat: '15135121' + }, + { + gtm: '20220318/062104', + mil: '780879.8', + hgt: '335', + spd: '74.3', + agl: '70', + lon: '66901350', + lat: '15135340' + }, + { + gtm: '20220318/062106', + mil: '780879.9', + hgt: '333', + spd: '74.3', + agl: '69', + lon: '66901578', + lat: '15135420' + }, + { + gtm: '20220318/062114', + mil: '780880.0', + hgt: '327', + spd: '73.0', + agl: '64', + lon: '66902472', + lat: '15135780' + }, + { + gtm: '20220318/062120', + mil: '780880.2', + hgt: '323', + spd: '73.1', + agl: '61', + lon: '66903111', + lat: '15136086' + }, + { + gtm: '20220318/062123', + mil: '780880.2', + hgt: '322', + spd: '73.9', + agl: '59', + lon: '66903427', + lat: '15136251' + }, + { + gtm: '20220318/062128', + mil: '780880.3', + hgt: '319', + spd: '73.8', + agl: '57', + lon: '66903942', + lat: '15136549' + }, + { + gtm: '20220318/062132', + mil: '780880.4', + hgt: '318', + spd: '74.4', + agl: '54', + lon: '66904344', + lat: '15136804' + }, + { + gtm: '20220318/062143', + mil: '780880.6', + hgt: '312', + spd: '70.0', + agl: '48', + lon: '66905382', + lat: '15137565' + }, + { + gtm: '20220318/062158', + mil: '780880.9', + hgt: '305', + spd: '71.0', + agl: '41', + lon: '66906595', + lat: '15138683' + }, + { + gtm: '20220318/062204', + mil: '780881.0', + hgt: '300', + spd: '73.0', + agl: '38', + lon: '66907041', + lat: '15139189' + }, + { + gtm: '20220318/062206', + mil: '780881.1', + hgt: '298', + spd: '73.9', + agl: '37', + lon: '66907186', + lat: '15139366' + }, + { + gtm: '20220318/062328', + mil: '780882.7', + hgt: '261', + spd: '71.6', + agl: '18', + lon: '66912453', + lat: '15146934' + }, + { + gtm: '20220318/062358', + mil: '780883.3', + hgt: '254', + spd: '73.6', + agl: '355', + lon: '66912648', + lat: '15150104' + }, + { + gtm: '20220318/062428', + mil: '780883.9', + hgt: '242', + spd: '80.2', + agl: '355', + lon: '66912300', + lat: '15153634' + }, + { + gtm: '20220318/062558', + mil: '780885.8', + hgt: '234', + spd: '81.9', + agl: '6', + lon: '66910521', + lat: '15163734' + }, + { + gtm: '20220318/062628', + mil: '780886.4', + hgt: '237', + spd: '71.9', + agl: '20', + lon: '66911579', + lat: '15167110' + }, + { + gtm: '20220318/062658', + mil: '780887.0', + hgt: '233', + spd: '72.0', + agl: '16', + lon: '66912715', + lat: '15170094' + }, + { + gtm: '20220318/062728', + mil: '780887.6', + hgt: '236', + spd: '70.5', + agl: '354', + lon: '66912972', + lat: '15173292' + }, + { + gtm: '20220318/062758', + mil: '780888.2', + hgt: '225', + spd: '79.1', + agl: '348', + lon: '66912066', + lat: '15176590' + }, + { + gtm: '20220318/062758', + mil: '780888.2', + hgt: '225', + spd: '79.1', + agl: '348', + lon: '66912066', + lat: '15176590' + }, + { + gtm: '20220318/062828', + mil: '780888.9', + hgt: '233', + spd: '71.1', + agl: '7', + lon: '66911983', + lat: '15180178' + }, + { + gtm: '20220318/062858', + mil: '780889.4', + hgt: '239', + spd: '70.2', + agl: '350', + lon: '66911941', + lat: '15183192' + }, + { + gtm: '20220318/062928', + mil: '780890.0', + hgt: '227', + spd: '78.9', + agl: '357', + lon: '66911298', + lat: '15186480' + }, + { + gtm: '20220318/062958', + mil: '780890.7', + hgt: '235', + spd: '74.7', + agl: '20', + lon: '66911943', + lat: '15189939' + }, + { + gtm: '20220318/063028', + mil: '780891.3', + hgt: '227', + spd: '81.8', + agl: '5', + lon: '66912831', + lat: '15193186' + }, + { + gtm: '20220318/063028', + mil: '780891.3', + hgt: '227', + spd: '81.8', + agl: '5', + lon: '66912831', + lat: '15193186' + }, + { + gtm: '20220318/063044', + mil: '780891.7', + hgt: '217', + spd: '88.4', + agl: '353', + lon: '66912784', + lat: '15195237' + }, + { + gtm: '20220318/063051', + mil: '780891.8', + hgt: '213', + spd: '81.6', + agl: '352', + lon: '66912643', + lat: '15196143' + }, + { + gtm: '20220318/063058', + mil: '780892.0', + hgt: '208', + spd: '71.9', + agl: '354', + lon: '66912536', + lat: '15196943' + }, + { + gtm: '20220318/063113', + mil: '780892.1', + hgt: '208', + spd: '18.6', + agl: '16', + lon: '66912508', + lat: '15197962' + }, + { + gtm: '20220318/063118', + mil: '780892.1', + hgt: '209', + spd: '16.1', + agl: '69', + lon: '66912601', + lat: '15198051' + }, + { + gtm: '20220318/063128', + mil: '780892.2', + hgt: '212', + spd: '5.7', + agl: '77', + lon: '66912754', + lat: '15198069' + }, + { + gtm: '20220318/063128', + mil: '780892.2', + hgt: '212', + spd: '5.7', + agl: '77', + lon: '66912754', + lat: '15198069' + }, + { + gtm: '20220318/063158', + mil: '780892.2', + hgt: '215', + spd: '6.1', + agl: '359', + lon: '66913011', + lat: '15198235' + }, + { + gtm: '20220318/063228', + mil: '780892.3', + hgt: '214', + spd: '6.4', + agl: '25', + lon: '66913023', + lat: '15198495' + }, + { + gtm: '20220318/063258', + mil: '780892.3', + hgt: '216', + spd: '5.9', + agl: '33', + lon: '66913222', + lat: '15198727' + }, + { + gtm: '20220318/063300', + mil: '780892.3', + hgt: '216', + spd: '5.8', + agl: '33', + lon: '66913233', + lat: '15198742' + }, + { + gtm: '20220318/063303', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '47', + lon: '66913245', + lat: '15198762' + }, + { + gtm: '20220318/063304', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063311', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063328', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063358', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063428', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063458', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063528', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063537', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '59', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/063843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/064143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/064443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/064743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/065043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/065343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/065643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/065943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/070243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/070543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/070843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/071143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/071443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/071743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/072043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/072343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/072643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/072943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/073243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/073243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/073243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/073543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/073843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/074143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/074443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/074743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/075043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/075343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/075643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/075943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/080243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/080543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/080843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/081143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/081443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/081743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/082043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/082343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/082643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/082943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/083243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/083243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/083543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/083843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/084143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/084443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/084743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/085043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/085343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/085643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/085943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/085943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/090243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/090543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/090543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/090843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/091443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/091743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/092043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/092343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/092643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/092943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/093243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/093543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/093843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/094143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/094443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/094743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/095043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/095343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/095643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/095943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/100243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/100543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/100843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/101143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/101443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/101743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/102043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/102343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/102643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/102943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/103243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/103543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/103843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/104143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/104443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/104743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/105043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/105343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/105643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/105943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/110243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/110243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/110543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/110843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/111143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/111443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/111743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/112043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/112343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/112643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/112943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/113243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/113543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/113843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/114143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/114443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/114743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/115043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/115343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/115643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/115943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/120243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/120543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/120843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/121143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/121443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/121743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/122043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/122343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/122643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/122943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/123543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/123843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/124143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/124443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/124743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/125043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/125343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/125643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/125943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/130243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/130243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/130543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/130843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/131143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/131443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/131743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/132043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/132343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/132643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/132943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/132943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/133243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/133543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/133843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/134143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/134443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/134743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/135043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/135343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/135643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/135943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/140243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/140543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/140843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/141143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/141443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/141743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/142043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/142343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/142643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/142943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/143243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/143543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/143843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/144143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/144443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/144743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/145043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/145343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/145643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/145943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/150243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/150543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/150843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/151143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/151443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/151743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/152043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/152343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/152643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/152943', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/153243', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/153543', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/153843', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/154143', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/154443', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/154743', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/155043', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/155343', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/155643', + mil: '780892.3', + hgt: '216', + spd: '0.0', + agl: '0', + lon: '66913248', + lat: '15198764' + }, + { + gtm: '20220318/155904', + mil: '780892.3', + hgt: '0', + spd: '0.0', + agl: '146', + lon: '66912838', + lat: '15199113' + }, + { + gtm: '20220318/155906', + mil: '780892.3', + hgt: '456', + spd: '0.0', + agl: '147', + lon: '66912838', + lat: '15199114' + }, + { + gtm: '20220318/155936', + mil: '780892.3', + hgt: '221', + spd: '0.0', + agl: '100', + lon: '66913224', + lat: '15198751' + }, + { + gtm: '20220318/160006', + mil: '780892.3', + hgt: '214', + spd: '0.0', + agl: '90', + lon: '66913245', + lat: '15198765' + }, + { + gtm: '20220318/160036', + mil: '780892.3', + hgt: '213', + spd: '0.0', + agl: '90', + lon: '66913254', + lat: '15198764' + }, + { + gtm: '20220318/160106', + mil: '780892.3', + hgt: '212', + spd: '0.0', + agl: '88', + lon: '66913255', + lat: '15198765' + }, + { + gtm: '20220318/160136', + mil: '780892.3', + hgt: '212', + spd: '0.0', + agl: '88', + lon: '66913255', + lat: '15198765' + }, + { + gtm: '20220318/160146', + mil: '780892.3', + hgt: '212', + spd: '0.0', + agl: '88', + lon: '66913255', + lat: '15198765' + }, + { + gtm: '20220318/160152', + mil: '780892.3', + hgt: '212', + spd: '0.0', + agl: '0', + lon: '66913255', + lat: '15198765' + }, + { + gtm: '20220318/160300', + mil: '780892.3', + hgt: '0', + spd: '0.0', + agl: '145', + lon: '66913249', + lat: '15198724' + }, + { + gtm: '20220318/160324', + mil: '780892.3', + hgt: '230', + spd: '0.0', + agl: '95', + lon: '66913227', + lat: '15198741' + }, + { + gtm: '20220318/160354', + mil: '780892.3', + hgt: '234', + spd: '0.0', + agl: '77', + lon: '66913227', + lat: '15198769' + }, + { + gtm: '20220318/160424', + mil: '780892.3', + hgt: '228', + spd: '0.0', + agl: '68', + lon: '66913243', + lat: '15198789' + }, + { + gtm: '20220318/160454', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160524', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160554', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160624', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160654', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160724', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160754', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160824', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160854', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160924', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/160954', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161024', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161054', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161124', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161154', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161224', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161254', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161324', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161354', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161424', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161454', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161524', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161554', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161624', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161654', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161724', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161754', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161824', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161854', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161924', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/161954', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162024', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162054', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162124', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162154', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162224', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162254', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162324', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162354', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162424', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162454', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162524', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162554', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162624', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162654', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162724', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162754', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162824', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162854', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162924', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/162954', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163024', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163024', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163054', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163124', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163154', + mil: '780892.3', + hgt: '223', + spd: '0.0', + agl: '84', + lon: '66913249', + lat: '15198802' + }, + { + gtm: '20220318/163254', + mil: '780892.4', + hgt: '212', + spd: '5.4', + agl: '311', + lon: '66913200', + lat: '15198829' + }, + { + gtm: '20220318/163254', + mil: '780892.4', + hgt: '212', + spd: '5.4', + agl: '311', + lon: '66913200', + lat: '15198829' + }, + { + gtm: '20220318/163324', + mil: '780892.4', + hgt: '213', + spd: '10.8', + agl: '284', + lon: '66912783', + lat: '15198921' + }, + { + gtm: '20220318/163324', + mil: '780892.4', + hgt: '213', + spd: '10.8', + agl: '284', + lon: '66912783', + lat: '15198921' + }, + { + gtm: '20220318/163324', + mil: '780892.4', + hgt: '213', + spd: '10.8', + agl: '284', + lon: '66912783', + lat: '15198921' + }, + { + gtm: '20220318/163354', + mil: '780892.6', + hgt: '213', + spd: '21.9', + agl: '0', + lon: '66912571', + lat: '15199512' + }, + { + gtm: '20220318/163354', + mil: '780892.6', + hgt: '213', + spd: '21.9', + agl: '0', + lon: '66912571', + lat: '15199512' + }, + { + gtm: '20220318/163424', + mil: '780892.8', + hgt: '213', + spd: '37.5', + agl: '12', + lon: '66912790', + lat: '15200826' + }, + { + gtm: '20220318/163454', + mil: '780893.2', + hgt: '209', + spd: '56.1', + agl: '26', + lon: '66913580', + lat: '15202867' + }, + { + gtm: '20220318/163554', + mil: '780894.2', + hgt: '209', + spd: '68.9', + agl: '35', + lon: '66916882', + lat: '15207359' + }, + { + gtm: '20220318/163554', + mil: '780894.2', + hgt: '209', + spd: '68.9', + agl: '35', + lon: '66916882', + lat: '15207359' + }, + { + gtm: '20220318/163554', + mil: '780894.2', + hgt: '209', + spd: '68.9', + agl: '35', + lon: '66916882', + lat: '15207359' + }, + { + gtm: '20220318/163624', + mil: '780894.8', + hgt: '203', + spd: '65.7', + agl: '28', + lon: '66918675', + lat: '15210048' + }, + { + gtm: '20220318/163654', + mil: '780895.3', + hgt: '204', + spd: '68.4', + agl: '28', + lon: '66920211', + lat: '15212687' + }, + { + gtm: '20220318/163654', + mil: '780895.3', + hgt: '204', + spd: '68.4', + agl: '28', + lon: '66920211', + lat: '15212687' + }, + { + gtm: '20220318/163654', + mil: '780895.3', + hgt: '204', + spd: '68.4', + agl: '28', + lon: '66920211', + lat: '15212687' + }, + { + gtm: '20220318/163724', + mil: '780895.9', + hgt: '200', + spd: '76.8', + agl: '28', + lon: '66921921', + lat: '15215634' + }, + { + gtm: '20220318/163724', + mil: '780895.9', + hgt: '200', + spd: '76.8', + agl: '28', + lon: '66921921', + lat: '15215634' + }, + { + gtm: '20220318/163754', + mil: '780896.5', + hgt: '205', + spd: '70.6', + agl: '37', + lon: '66923781', + lat: '15218461' + }, + { + gtm: '20220318/163754', + mil: '780896.5', + hgt: '205', + spd: '70.6', + agl: '37', + lon: '66923781', + lat: '15218461' + }, + { + gtm: '20220318/163754', + mil: '780896.5', + hgt: '205', + spd: '70.6', + agl: '37', + lon: '66923781', + lat: '15218461' + }, + { + gtm: '20220318/163824', + mil: '780897.1', + hgt: '201', + spd: '73.5', + agl: '44', + lon: '66926178', + lat: '15220863' + }, + { + gtm: '20220318/163824', + mil: '780897.1', + hgt: '201', + spd: '73.5', + agl: '44', + lon: '66926178', + lat: '15220863' + }, + { + gtm: '20220318/163854', + mil: '780897.7', + hgt: '202', + spd: '68.9', + agl: '32', + lon: '66928378', + lat: '15223449' + }, + { + gtm: '20220318/163854', + mil: '780897.7', + hgt: '202', + spd: '68.9', + agl: '32', + lon: '66928378', + lat: '15223449' + }, + { + gtm: '20220318/163854', + mil: '780897.7', + hgt: '202', + spd: '68.9', + agl: '32', + lon: '66928378', + lat: '15223449' + }, + { + gtm: '20220318/163924', + mil: '780898.3', + hgt: '193', + spd: '75.3', + agl: '19', + lon: '66929896', + lat: '15226482' + }, + { + gtm: '20220318/163924', + mil: '780898.3', + hgt: '193', + spd: '75.3', + agl: '19', + lon: '66929896', + lat: '15226482' + }, + { + gtm: '20220318/163924', + mil: '780898.3', + hgt: '193', + spd: '75.3', + agl: '19', + lon: '66929896', + lat: '15226482' + }, + { + gtm: '20220318/163954', + mil: '780898.9', + hgt: '189', + spd: '76.9', + agl: '17', + lon: '66930997', + lat: '15229686' + }, + { + gtm: '20220318/163954', + mil: '780898.9', + hgt: '189', + spd: '76.9', + agl: '17', + lon: '66930997', + lat: '15229686' + }, + { + gtm: '20220318/163954', + mil: '780898.9', + hgt: '189', + spd: '76.9', + agl: '17', + lon: '66930997', + lat: '15229686' + }, + { + gtm: '20220318/164024', + mil: '780899.6', + hgt: '187', + spd: '77.0', + agl: '15', + lon: '66932150', + lat: '15233094' + }, + { + gtm: '20220318/164024', + mil: '780899.6', + hgt: '187', + spd: '77.0', + agl: '15', + lon: '66932150', + lat: '15233094' + }, + { + gtm: '20220318/164024', + mil: '780899.6', + hgt: '187', + spd: '77.0', + agl: '15', + lon: '66932150', + lat: '15233094' + }, + { + gtm: '20220318/164054', + mil: '780900.2', + hgt: '187', + spd: '76.2', + agl: '4', + lon: '66932703', + lat: '15236449' + }, + { + gtm: '20220318/164054', + mil: '780900.2', + hgt: '187', + spd: '76.2', + agl: '4', + lon: '66932703', + lat: '15236449' + }, + { + gtm: '20220318/164054', + mil: '780900.2', + hgt: '187', + spd: '76.2', + agl: '4', + lon: '66932703', + lat: '15236449' + }, + { + gtm: '20220318/164124', + mil: '780900.9', + hgt: '184', + spd: '81.0', + agl: '6', + lon: '66933018', + lat: '15240018' + }, + { + gtm: '20220318/164124', + mil: '780900.9', + hgt: '184', + spd: '81.0', + agl: '6', + lon: '66933018', + lat: '15240018' + }, + { + gtm: '20220318/164154', + mil: '780901.5', + hgt: '193', + spd: '68.6', + agl: '23', + lon: '66933933', + lat: '15243305' + }, + { + gtm: '20220318/164224', + mil: '780902.1', + hgt: '191', + spd: '73.6', + agl: '40', + lon: '66935792', + lat: '15246030' + }, + { + gtm: '20220318/164224', + mil: '780902.1', + hgt: '191', + spd: '73.6', + agl: '40', + lon: '66935792', + lat: '15246030' + }, + { + gtm: '20220318/164254', + mil: '780902.6', + hgt: '194', + spd: '69.6', + agl: '44', + lon: '66938149', + lat: '15248322' + }, + { + gtm: '20220318/164324', + mil: '780903.2', + hgt: '191', + spd: '69.3', + agl: '44', + lon: '66940726', + lat: '15250804' + }, + { + gtm: '20220318/164324', + mil: '780903.2', + hgt: '191', + spd: '69.3', + agl: '44', + lon: '66940726', + lat: '15250804' + }, + { + gtm: '20220318/164354', + mil: '780903.8', + hgt: '197', + spd: '62.8', + agl: '55', + lon: '66943083', + lat: '15252693' + }, + { + gtm: '20220318/164424', + mil: '780904.3', + hgt: '190', + spd: '76.1', + agl: '62', + lon: '66946038', + lat: '15254243' + }, + { + gtm: '20220318/164424', + mil: '780904.3', + hgt: '190', + spd: '76.1', + agl: '62', + lon: '66946038', + lat: '15254243' + }, + { + gtm: '20220318/164454', + mil: '780905.0', + hgt: '184', + spd: '75.8', + agl: '56', + lon: '66949389', + lat: '15255955' + }, + { + gtm: '20220318/164454', + mil: '780905.0', + hgt: '184', + spd: '75.8', + agl: '56', + lon: '66949389', + lat: '15255955' + }, + { + gtm: '20220318/164524', + mil: '780905.5', + hgt: '190', + spd: '65.1', + agl: '40', + lon: '66951925', + lat: '15258019' + }, + { + gtm: '20220318/164554', + mil: '780906.1', + hgt: '185', + spd: '71.3', + agl: '25', + lon: '66953751', + lat: '15260638' + }, + { + gtm: '20220318/165354', + mil: '780915.0', + hgt: '196', + spd: '75.2', + agl: '105', + lon: '66994404', + lat: '15277516' + }, + { + gtm: '20220318/165424', + mil: '780915.6', + hgt: '202', + spd: '71.7', + agl: '100', + lon: '66997942', + lat: '15276678' + }, + { + gtm: '20220318/165454', + mil: '780916.2', + hgt: '208', + spd: '73.2', + agl: '88', + lon: '67001474', + lat: '15276468' + }, + { + gtm: '20220318/165524', + mil: '780916.8', + hgt: '203', + spd: '80.5', + agl: '75', + lon: '67005342', + lat: '15277044' + }, + { + gtm: '20220318/165554', + mil: '780917.4', + hgt: '203', + spd: '73.4', + agl: '80', + lon: '67009077', + lat: '15277866' + }, + { + gtm: '20220318/165624', + mil: '780918.0', + hgt: '211', + spd: '69.5', + agl: '85', + lon: '67012587', + lat: '15278208' + }, + { + gtm: '20220318/165654', + mil: '780918.6', + hgt: '214', + spd: '69.8', + agl: '79', + lon: '67015983', + lat: '15278658' + }, + { + gtm: '20220318/165724', + mil: '780919.2', + hgt: '215', + spd: '70.0', + agl: '72', + lon: '67019290', + lat: '15279447' + }, + { + gtm: '20220318/165754', + mil: '780919.8', + hgt: '201', + spd: '80.5', + agl: '68', + lon: '67022895', + lat: '15280674' + }, + { + gtm: '20220318/165824', + mil: '780920.4', + hgt: '206', + spd: '66.8', + agl: '69', + lon: '67026288', + lat: '15281883' + }, + { + gtm: '20220318/165854', + mil: '780920.9', + hgt: '210', + spd: '65.8', + agl: '72', + lon: '67029382', + lat: '15282943' + }, + { + gtm: '20220318/165924', + mil: '780921.4', + hgt: '214', + spd: '62.7', + agl: '84', + lon: '67032423', + lat: '15283518' + }, + { + gtm: '20220318/165954', + mil: '780922.0', + hgt: '219', + spd: '62.6', + agl: '97', + lon: '67035562', + lat: '15283485' + }, + { + gtm: '20220318/170024', + mil: '780922.5', + hgt: '216', + spd: '71.4', + agl: '107', + lon: '67038789', + lat: '15282849' + }, + { + gtm: '20220318/170054', + mil: '780923.1', + hgt: '223', + spd: '64.3', + agl: '106', + lon: '67042155', + lat: '15281952' + }, + { + gtm: '20220318/170124', + mil: '780923.6', + hgt: '230', + spd: '55.7', + agl: '93', + lon: '67045036', + lat: '15281466' + }, + { + gtm: '20220318/170154', + mil: '780924.0', + hgt: '240', + spd: '56.1', + agl: '79', + lon: '67047819', + lat: '15281661' + }, + { + gtm: '20220318/170224', + mil: '780924.5', + hgt: '253', + spd: '56.3', + agl: '75', + lon: '67050562', + lat: '15282312' + }, + { + gtm: '20220318/170254', + mil: '780924.9', + hgt: '269', + spd: '46.4', + agl: '83', + lon: '67053036', + lat: '15282837' + }, + { + gtm: '20220318/170324', + mil: '780925.3', + hgt: '274', + spd: '50.7', + agl: '108', + lon: '67055391', + lat: '15282609' + }, + { + gtm: '20220318/170354', + mil: '780925.8', + hgt: '276', + spd: '53.8', + agl: '112', + lon: '67057761', + lat: '15281637' + }, + { + gtm: '20220318/170424', + mil: '780926.3', + hgt: '272', + spd: '66.8', + agl: '90', + lon: '67060722', + lat: '15281142' + }, + { + gtm: '20220318/170454', + mil: '780926.9', + hgt: '254', + spd: '83.5', + agl: '60', + lon: '67064361', + lat: '15282067' + }, + { + gtm: '20220318/170524', + mil: '780927.6', + hgt: '238', + spd: '92.5', + agl: '59', + lon: '67067908', + lat: '15284419' + }, + { + gtm: '20220318/170554', + mil: '780928.3', + hgt: '238', + spd: '81.3', + agl: '81', + lon: '67071967', + lat: '15285775' + }, + { + gtm: '20220318/170554', + mil: '780928.3', + hgt: '238', + spd: '81.3', + agl: '81', + lon: '67071967', + lat: '15285775' + }, + { + gtm: '20220318/170624', + mil: '780929.0', + hgt: '224', + spd: '87.9', + agl: '89', + lon: '67076147', + lat: '15285900' + }, + { + gtm: '20220318/170654', + mil: '780929.7', + hgt: '221', + spd: '81.4', + agl: '75', + lon: '67080417', + lat: '15286419' + }, + { + gtm: '20220318/170724', + mil: '780930.4', + hgt: '221', + spd: '76.3', + agl: '65', + lon: '67084020', + lat: '15287640' + }, + { + gtm: '20220318/170754', + mil: '780931.0', + hgt: '221', + spd: '73.0', + agl: '79', + lon: '67087531', + lat: '15288826' + }, + { + gtm: '20220318/170824', + mil: '780931.6', + hgt: '228', + spd: '70.1', + agl: '91', + lon: '67090935', + lat: '15289005' + }, + { + gtm: '20220318/170854', + mil: '780932.2', + hgt: '227', + spd: '76.4', + agl: '79', + lon: '67094535', + lat: '15289197' + }, + { + gtm: '20220318/170924', + mil: '780932.8', + hgt: '225', + spd: '77.6', + agl: '64', + lon: '67098186', + lat: '15290398' + }, + { + gtm: '20220318/171124', + mil: '780935.2', + hgt: '226', + spd: '76.0', + agl: '121', + lon: '67112202', + lat: '15290449' + }, + { + gtm: '20220318/171154', + mil: '780935.8', + hgt: '225', + spd: '76.7', + agl: '126', + lon: '67115223', + lat: '15288400' + }, + { + gtm: '20220318/171224', + mil: '780936.5', + hgt: '227', + spd: '77.1', + agl: '99', + lon: '67118739', + lat: '15287056' + }, + { + gtm: '20220318/171254', + mil: '780937.1', + hgt: '229', + spd: '72.6', + agl: '73', + lon: '67122388', + lat: '15287292' + }, + { + gtm: '20220318/171324', + mil: '780937.7', + hgt: '224', + spd: '75.8', + agl: '64', + lon: '67125786', + lat: '15288703' + }, + { + gtm: '20220318/171354', + mil: '780938.3', + hgt: '229', + spd: '68.7', + agl: '64', + lon: '67128999', + lat: '15290136' + }, + { + gtm: '20220318/171424', + mil: '780938.8', + hgt: '237', + spd: '61.5', + agl: '74', + lon: '67132019', + lat: '15291190' + }, + { + gtm: '20220318/171454', + mil: '780939.3', + hgt: '239', + spd: '58.7', + agl: '86', + lon: '67134816', + lat: '15291606' + }, + { + gtm: '20220318/171524', + mil: '780939.8', + hgt: '238', + spd: '67.0', + agl: '98', + lon: '67137958', + lat: '15291495' + }, + { + gtm: '20220318/171554', + mil: '780940.4', + hgt: '245', + spd: '65.5', + agl: '93', + lon: '67141284', + lat: '15291145' + }, + { + gtm: '20220318/171624', + mil: '780940.9', + hgt: '253', + spd: '58.1', + agl: '87', + lon: '67144338', + lat: '15291132' + }, + { + gtm: '20220318/171654', + mil: '780941.4', + hgt: '247', + spd: '68.8', + agl: '86', + lon: '67147404', + lat: '15291367' + }, + { + gtm: '20220318/171724', + mil: '780941.9', + hgt: '252', + spd: '66.4', + agl: '94', + lon: '67150798', + lat: '15291360' + }, + { + gtm: '20220318/171754', + mil: '780942.5', + hgt: '261', + spd: '64.9', + agl: '90', + lon: '67154049', + lat: '15291219' + }, + { + gtm: '20220318/171754', + mil: '780942.5', + hgt: '261', + spd: '64.9', + agl: '90', + lon: '67154049', + lat: '15291219' + }, + { + gtm: '20220318/171824', + mil: '780943.0', + hgt: '262', + spd: '70.7', + agl: '81', + lon: '67157358', + lat: '15291455' + }, + { + gtm: '20220318/171854', + mil: '780943.6', + hgt: '262', + spd: '72.7', + agl: '73', + lon: '67160853', + lat: '15292199' + }, + { + gtm: '20220318/171924', + mil: '780944.2', + hgt: '268', + spd: '73.0', + agl: '64', + lon: '67164231', + lat: '15293418' + }, + { + gtm: '20220318/171954', + mil: '780944.8', + hgt: '271', + spd: '72.5', + agl: '55', + lon: '67167355', + lat: '15295104' + }, + { + gtm: '20220318/172024', + mil: '780945.4', + hgt: '270', + spd: '72.2', + agl: '58', + lon: '67170309', + lat: '15297021' + }, + { + gtm: '20220318/172054', + mil: '780946.0', + hgt: '275', + spd: '69.6', + agl: '66', + lon: '67173327', + lat: '15298491' + }, + { + gtm: '20220318/172124', + mil: '780946.6', + hgt: '272', + spd: '78.7', + agl: '74', + lon: '67176786', + lat: '15299622' + }, + { + gtm: '20220318/172154', + mil: '780947.2', + hgt: '281', + spd: '66.6', + agl: '79', + lon: '67180398', + lat: '15300309' + }, + { + gtm: '20220318/172201', + mil: '780947.3', + hgt: '286', + spd: '0.0', + agl: '74', + lon: '67181242', + lat: '15300488' + }, + { + gtm: '20220318/172201', + mil: '780947.3', + hgt: '286', + spd: '0.0', + agl: '74', + lon: '67181242', + lat: '15300488' + }, + { + gtm: '20220318/172215', + mil: '780947.5', + hgt: '286', + spd: '141.7', + agl: '72', + lon: '67183563', + lat: '15301123' + }, + { + gtm: '20220318/172226', + mil: '780947.7', + hgt: '299', + spd: '59.9', + agl: '71', + lon: '67183893', + lat: '15301224' + }, + { + gtm: '20220318/172256', + mil: '780948.2', + hgt: '302', + spd: '55.9', + agl: '72', + lon: '67186044', + lat: '15301932' + }, + { + gtm: '20220318/172326', + mil: '780948.7', + hgt: '284', + spd: '81.3', + agl: '81', + lon: '67189276', + lat: '15302631' + }, + { + gtm: '20220318/172355', + mil: '780949.5', + hgt: '263', + spd: '94.0', + agl: '97', + lon: '67193565', + lat: '15302769' + }, + { + gtm: '20220318/172356', + mil: '780949.5', + hgt: '263', + spd: '94.3', + agl: '98', + lon: '67193721', + lat: '15302750' + }, + { + gtm: '20220318/172357', + mil: '780949.5', + hgt: '262', + spd: '94.5', + agl: '98', + lon: '67193875', + lat: '15302730' + }, + { + gtm: '20220318/172359', + mil: '780949.6', + hgt: '262', + spd: '93.4', + agl: '100', + lon: '67194182', + lat: '15302680' + }, + { + gtm: '20220318/172403', + mil: '780949.7', + hgt: '260', + spd: '92.1', + agl: '103', + lon: '67194789', + lat: '15302562' + }, + { + gtm: '20220318/172413', + mil: '780949.9', + hgt: '260', + spd: '86.3', + agl: '110', + lon: '67196199', + lat: '15302175' + }, + { + gtm: '20220318/172417', + mil: '780950.0', + hgt: '260', + spd: '81.8', + agl: '111', + lon: '67196721', + lat: '15301996' + }, + { + gtm: '20220318/172426', + mil: '780950.2', + hgt: '263', + spd: '71.6', + agl: '110', + lon: '67197772', + lat: '15301628' + }, + { + gtm: '20220318/172434', + mil: '780950.3', + hgt: '266', + spd: '0.0', + agl: '109', + lon: '67198629', + lat: '15301356' + }, + { + gtm: '20220318/172452', + mil: '780950.6', + hgt: '266', + spd: '66.0', + agl: '108', + lon: '67200610', + lat: '15300739' + }, + { + gtm: '20220318/172457', + mil: '780950.7', + hgt: '271', + spd: '67.5', + agl: '103', + lon: '67201041', + lat: '15300654' + }, + { + gtm: '20220318/172527', + mil: '780951.3', + hgt: '257', + spd: '77.5', + agl: '97', + lon: '67204568', + lat: '15300114' + }, + { + gtm: '20220318/172557', + mil: '780952.0', + hgt: '239', + spd: '90.1', + agl: '89', + lon: '67208712', + lat: '15299953' + }, + { + gtm: '20220318/172627', + mil: '780952.7', + hgt: '241', + spd: '79.7', + agl: '90', + lon: '67213000', + lat: '15299992' + }, + { + gtm: '20220318/172657', + mil: '780953.3', + hgt: '239', + spd: '75.2', + agl: '83', + lon: '67216843', + lat: '15300090' + }, + { + gtm: '20220318/172727', + mil: '780953.9', + hgt: '243', + spd: '72.5', + agl: '64', + lon: '67220341', + lat: '15301032' + }, + { + gtm: '20220318/172757', + mil: '780954.5', + hgt: '249', + spd: '68.5', + agl: '66', + lon: '67223457', + lat: '15302517' + }, + { + gtm: '20220318/172805', + mil: '780954.7', + hgt: '253', + spd: '0.0', + agl: '70', + lon: '67224271', + lat: '15302826' + }, + { + gtm: '20220318/172805', + mil: '780954.7', + hgt: '253', + spd: '0.0', + agl: '70', + lon: '67224271', + lat: '15302826' + }, + { + gtm: '20220318/172827', + mil: '780955.0', + hgt: '253', + spd: '0.0', + agl: '70', + lon: '67224271', + lat: '15302826' + }, + { + gtm: '20220318/172835', + mil: '780955.2', + hgt: '253', + spd: '59.2', + agl: '82', + lon: '67227324', + lat: '15303592' + }, + { + gtm: '20220318/172857', + mil: '780955.6', + hgt: '263', + spd: '67.7', + agl: '86', + lon: '67229493', + lat: '15303793' + }, + { + gtm: '20220318/172927', + mil: '780956.1', + hgt: '263', + spd: '72.0', + agl: '73', + lon: '67233021', + lat: '15304264' + }, + { + gtm: '20220318/172957', + mil: '780956.7', + hgt: '281', + spd: '63.9', + agl: '67', + lon: '67236129', + lat: '15305396' + }, + { + gtm: '20220318/173027', + mil: '780957.3', + hgt: '281', + spd: '70.8', + agl: '67', + lon: '67239208', + lat: '15306576' + }, + { + gtm: '20220318/173057', + mil: '780957.8', + hgt: '288', + spd: '65.1', + agl: '75', + lon: '67242322', + lat: '15307690' + }, + { + gtm: '20220318/173127', + mil: '780958.3', + hgt: '294', + spd: '65.6', + agl: '98', + lon: '67245598', + lat: '15307770' + }, + { + gtm: '20220318/173137', + mil: '780958.5', + hgt: '297', + spd: '0.0', + agl: '100', + lon: '67246636', + lat: '15307627' + }, + { + gtm: '20220318/173157', + mil: '780958.8', + hgt: '297', + spd: '0.0', + agl: '100', + lon: '67246636', + lat: '15307627' + }, + { + gtm: '20220318/173203', + mil: '780958.9', + hgt: '297', + spd: '50.5', + agl: '99', + lon: '67249144', + lat: '15307290' + }, + { + gtm: '20220318/173228', + mil: '780959.3', + hgt: '302', + spd: '56.6', + agl: '98', + lon: '67251165', + lat: '15307015' + }, + { + gtm: '20220318/173258', + mil: '780959.8', + hgt: '303', + spd: '64.1', + agl: '107', + lon: '67254211', + lat: '15306480' + }, + { + gtm: '20220318/173328', + mil: '780960.3', + hgt: '306', + spd: '65.3', + agl: '116', + lon: '67257140', + lat: '15305332' + }, + { + gtm: '20220318/173358', + mil: '780960.9', + hgt: '304', + spd: '72.7', + agl: '99', + lon: '67260343', + lat: '15304328' + }, + { + gtm: '20220318/173428', + mil: '780961.5', + hgt: '310', + spd: '69.6', + agl: '93', + lon: '67263945', + lat: '15304089' + }, + { + gtm: '20220318/173458', + mil: '780962.1', + hgt: '300', + spd: '79.4', + agl: '90', + lon: '67267555', + lat: '15303946' + }, + { + gtm: '20220318/173528', + mil: '780962.7', + hgt: '298', + spd: '72.4', + agl: '69', + lon: '67271418', + lat: '15304566' + }, + { + gtm: '20220318/173558', + mil: '780963.3', + hgt: '305', + spd: '71.2', + agl: '50', + lon: '67274496', + lat: '15306210' + }, + { + gtm: '20220318/173628', + mil: '780963.9', + hgt: '316', + spd: '66.5', + agl: '64', + lon: '67277275', + lat: '15308029' + }, + { + gtm: '20220318/173658', + mil: '780964.4', + hgt: '337', + spd: '53.5', + agl: '79', + lon: '67280176', + lat: '15308844' + }, + { + gtm: '20220318/173728', + mil: '780964.8', + hgt: '344', + spd: '60.7', + agl: '79', + lon: '67282863', + lat: '15309297' + }, + { + gtm: '20220318/173758', + mil: '780965.4', + hgt: '335', + spd: '71.2', + agl: '74', + lon: '67286056', + lat: '15309885' + }, + { + gtm: '20220318/173828', + mil: '780966.0', + hgt: '333', + spd: '70.0', + agl: '58', + lon: '67289254', + lat: '15311376' + }, + { + gtm: '20220318/173858', + mil: '780966.5', + hgt: '328', + spd: '72.9', + agl: '58', + lon: '67292185', + lat: '15313094' + }, + { + gtm: '20220318/173928', + mil: '780967.1', + hgt: '326', + spd: '73.1', + agl: '79', + lon: '67295557', + lat: '15314334' + }, + { + gtm: '20220318/173958', + mil: '780967.7', + hgt: '335', + spd: '66.0', + agl: '85', + lon: '67298941', + lat: '15314604' + }, + { + gtm: '20220318/174028', + mil: '780968.3', + hgt: '335', + spd: '71.9', + agl: '85', + lon: '67302360', + lat: '15314841' + }, + { + gtm: '20220318/174058', + mil: '780968.9', + hgt: '327', + spd: '80.0', + agl: '85', + lon: '67306168', + lat: '15315108' + }, + { + gtm: '20220318/174128', + mil: '780969.5', + hgt: '332', + spd: '76.6', + agl: '79', + lon: '67309980', + lat: '15315532' + }, + { + gtm: '20220318/174158', + mil: '780970.1', + hgt: '341', + spd: '73.4', + agl: '70', + lon: '67313548', + lat: '15316443' + }, + { + gtm: '20220318/174358', + mil: '780972.9', + hgt: '295', + spd: '97.2', + agl: '76', + lon: '67329543', + lat: '15320665' + }, + { + gtm: '20220318/174428', + mil: '780973.8', + hgt: '277', + spd: '102.3', + agl: '104', + lon: '67334565', + lat: '15320400' + }, + { + gtm: '20220318/174432', + mil: '780973.9', + hgt: '276', + spd: '101.7', + agl: '101', + lon: '67335223', + lat: '15320272' + }, + { + gtm: '20220318/174458', + mil: '780974.6', + hgt: '271', + spd: '97.9', + agl: '80', + lon: '67339439', + lat: '15320323' + }, + { + gtm: '20220318/174502', + mil: '780974.7', + hgt: '269', + spd: '98.5', + agl: '81', + lon: '67340085', + lat: '15320415' + }, + { + gtm: '20220318/174517', + mil: '780975.1', + hgt: '262', + spd: '101.8', + agl: '91', + lon: '67342575', + lat: '15320565' + }, + { + gtm: '20220318/174517', + mil: '780975.1', + hgt: '262', + spd: '101.8', + agl: '91', + lon: '67342575', + lat: '15320565' + }, + { + gtm: '20220318/174520', + mil: '780975.2', + hgt: '261', + spd: '101.7', + agl: '92', + lon: '67343081', + lat: '15320549' + }, + { + gtm: '20220318/174525', + mil: '780975.3', + hgt: '259', + spd: '97.7', + agl: '92', + lon: '67343892', + lat: '15320518' + }, + { + gtm: '20220318/174527', + mil: '780975.4', + hgt: '258', + spd: '98.2', + agl: '91', + lon: '67344217', + lat: '15320511' + }, + { + gtm: '20220318/174528', + mil: '780975.4', + hgt: '257', + spd: '97.3', + agl: '91', + lon: '67344378', + lat: '15320509' + }, + { + gtm: '20220318/174548', + mil: '780975.9', + hgt: '258', + spd: '92.2', + agl: '84', + lon: '67347525', + lat: '15320648' + }, + { + gtm: '20220318/174549', + mil: '780975.9', + hgt: '259', + spd: '91.8', + agl: '84', + lon: '67347675', + lat: '15320662' + }, + { + gtm: '20220318/174558', + mil: '780976.1', + hgt: '265', + spd: '87.7', + agl: '83', + lon: '67349002', + lat: '15320806' + }, + { + gtm: '20220318/174628', + mil: '780976.8', + hgt: '276', + spd: '83.4', + agl: '98', + lon: '67353106', + lat: '15320991' + }, + { + gtm: '20220318/174658', + mil: '780977.5', + hgt: '267', + spd: '87.7', + agl: '122', + lon: '67356970', + lat: '15319408' + }, + { + gtm: '20220318/174728', + mil: '780978.2', + hgt: '277', + spd: '77.0', + agl: '105', + lon: '67360617', + lat: '15317776' + }, + { + gtm: '20220318/174728', + mil: '780978.2', + hgt: '277', + spd: '77.0', + agl: '105', + lon: '67360617', + lat: '15317776' + }, + { + gtm: '20220318/174758', + mil: '780978.8', + hgt: '284', + spd: '75.4', + agl: '79', + lon: '67364241', + lat: '15317701' + }, + { + gtm: '20220318/174828', + mil: '780979.5', + hgt: '265', + spd: '86.6', + agl: '80', + lon: '67368063', + lat: '15318663' + }, + { + gtm: '20220318/174828', + mil: '780979.5', + hgt: '265', + spd: '86.6', + agl: '80', + lon: '67368063', + lat: '15318663' + }, + { + gtm: '20220318/174833', + mil: '780979.6', + hgt: '261', + spd: '89.1', + agl: '84', + lon: '67368786', + lat: '15318748' + }, + { + gtm: '20220318/174842', + mil: '780979.8', + hgt: '254', + spd: '92.1', + agl: '91', + lon: '67370140', + lat: '15318798' + }, + { + gtm: '20220318/174844', + mil: '780979.9', + hgt: '253', + spd: '91.1', + agl: '92', + lon: '67370443', + lat: '15318789' + }, + { + gtm: '20220318/174847', + mil: '780979.9', + hgt: '250', + spd: '92.9', + agl: '93', + lon: '67370902', + lat: '15318768' + }, + { + gtm: '20220318/174849', + mil: '780980.0', + hgt: '248', + spd: '92.8', + agl: '93', + lon: '67371209', + lat: '15318751' + }, + { + gtm: '20220318/174855', + mil: '780980.1', + hgt: '243', + spd: '94.1', + agl: '93', + lon: '67372143', + lat: '15318696' + }, + { + gtm: '20220318/174858', + mil: '780980.2', + hgt: '241', + spd: '92.8', + agl: '93', + lon: '67372605', + lat: '15318669' + }, + { + gtm: '20220318/174858', + mil: '780980.2', + hgt: '241', + spd: '92.8', + agl: '93', + lon: '67372605', + lat: '15318669' + }, + { + gtm: '20220318/174902', + mil: '780980.3', + hgt: '240', + spd: '92.6', + agl: '93', + lon: '67373221', + lat: '15318631' + }, + { + gtm: '20220318/174922', + mil: '780980.8', + hgt: '231', + spd: '92.9', + agl: '92', + lon: '67376248', + lat: '15318468' + }, + { + gtm: '20220318/174928', + mil: '780981.0', + hgt: '230', + spd: '91.7', + agl: '89', + lon: '67377166', + lat: '15318468' + }, + { + gtm: '20220318/174928', + mil: '780981.0', + hgt: '230', + spd: '91.7', + agl: '89', + lon: '67377166', + lat: '15318468' + }, + { + gtm: '20220318/174942', + mil: '780981.3', + hgt: '234', + spd: '81.2', + agl: '81', + lon: '67379154', + lat: '15318638' + }, + { + gtm: '20220318/174944', + mil: '780981.3', + hgt: '235', + spd: '80.5', + agl: '81', + lon: '67379418', + lat: '15318678' + }, + { + gtm: '20220318/174958', + mil: '780981.6', + hgt: '234', + spd: '83.3', + agl: '72', + lon: '67381245', + lat: '15319084' + }, + { + gtm: '20220318/175028', + mil: '780982.4', + hgt: '230', + spd: '84.1', + agl: '55', + lon: '67385058', + lat: '15320869' + }, + { + gtm: '20220318/175028', + mil: '780982.4', + hgt: '230', + spd: '84.1', + agl: '55', + lon: '67385058', + lat: '15320869' + }, + { + gtm: '20220318/175028', + mil: '780982.4', + hgt: '230', + spd: '84.1', + agl: '55', + lon: '67385058', + lat: '15320869' + }, + { + gtm: '20220318/175058', + mil: '780983.0', + hgt: '224', + spd: '84.9', + agl: '53', + lon: '67388230', + lat: '15323329' + }, + { + gtm: '20220318/175128', + mil: '780983.7', + hgt: '231', + spd: '77.5', + agl: '82', + lon: '67391823', + lat: '15324663' + }, + { + gtm: '20220318/175158', + mil: '780984.3', + hgt: '234', + spd: '77.2', + agl: '89', + lon: '67395725', + lat: '15324578' + }, + { + gtm: '20220318/175228', + mil: '780985.0', + hgt: '223', + spd: '87.0', + agl: '69', + lon: '67399536', + lat: '15325560' + }, + { + gtm: '20220318/175258', + mil: '780985.7', + hgt: '212', + spd: '90.7', + agl: '82', + lon: '67403984', + lat: '15326187' + }, + { + gtm: '20220318/175328', + mil: '780986.5', + hgt: '220', + spd: '84.4', + agl: '74', + lon: '67408153', + lat: '15327229' + }, + { + gtm: '20220318/175358', + mil: '780987.1', + hgt: '228', + spd: '82.2', + agl: '82', + lon: '67412230', + lat: '15327887' + }, + { + gtm: '20220318/175358', + mil: '780987.1', + hgt: '228', + spd: '82.2', + agl: '82', + lon: '67412230', + lat: '15327887' + }, + { + gtm: '20220318/175428', + mil: '780987.8', + hgt: '226', + spd: '77.3', + agl: '66', + lon: '67415940', + lat: '15328953' + }, + { + gtm: '20220318/175458', + mil: '780988.4', + hgt: '211', + spd: '84.0', + agl: '82', + lon: '67419732', + lat: '15329965' + }, + { + gtm: '20220318/175528', + mil: '780989.1', + hgt: '212', + spd: '84.6', + agl: '83', + lon: '67424028', + lat: '15330388' + }, + { + gtm: '20220318/175558', + mil: '780989.7', + hgt: '237', + spd: '64.9', + agl: '84', + lon: '67427715', + lat: '15330744' + }, + { + gtm: '20220318/175628', + mil: '780990.3', + hgt: '254', + spd: '65.0', + agl: '84', + lon: '67430903', + lat: '15331056' + }, + { + gtm: '20220318/175658', + mil: '780990.8', + hgt: '263', + spd: '63.8', + agl: '66', + lon: '67434006', + lat: '15331714' + }, + { + gtm: '20220318/175728', + mil: '780991.3', + hgt: '276', + spd: '44.8', + agl: '45', + lon: '67436223', + lat: '15333106' + }, + { + gtm: '20220318/175758', + mil: '780991.6', + hgt: '287', + spd: '46.3', + agl: '28', + lon: '67437529', + lat: '15334734' + }, + { + gtm: '20220318/175828', + mil: '780992.0', + hgt: '293', + spd: '49.7', + agl: '18', + lon: '67438369', + lat: '15336808' + }, + { + gtm: '20220318/175858', + mil: '780992.4', + hgt: '303', + spd: '45.4', + agl: '37', + lon: '67439442', + lat: '15338718' + }, + { + gtm: '20220318/175928', + mil: '780992.8', + hgt: '312', + spd: '49.5', + agl: '55', + lon: '67441072', + lat: '15340120' + }, + { + gtm: '20220318/175958', + mil: '780993.3', + hgt: '313', + spd: '62.3', + agl: '77', + lon: '67443585', + lat: '15341102' + }, + { + gtm: '20220318/180028', + mil: '780993.8', + hgt: '304', + spd: '77.9', + agl: '103', + lon: '67447045', + lat: '15340987' + }, + { + gtm: '20220318/180058', + mil: '780994.5', + hgt: '290', + spd: '88.1', + agl: '78', + lon: '67451325', + lat: '15340788' + }, + { + gtm: '20220318/180058', + mil: '780994.5', + hgt: '290', + spd: '88.1', + agl: '78', + lon: '67451325', + lat: '15340788' + }, + { + gtm: '20220318/180128', + mil: '780995.2', + hgt: '294', + spd: '73.2', + agl: '48', + lon: '67454640', + lat: '15342412' + }, + { + gtm: '20220318/180158', + mil: '780995.8', + hgt: '274', + spd: '86.0', + agl: '61', + lon: '67457661', + lat: '15344785' + }, + { + gtm: '20220318/180228', + mil: '780996.5', + hgt: '281', + spd: '80.1', + agl: '70', + lon: '67461483', + lat: '15346127' + }, + { + gtm: '20220318/180258', + mil: '780997.2', + hgt: '264', + spd: '97.0', + agl: '72', + lon: '67465551', + lat: '15347412' + }, + { + gtm: '20220318/180328', + mil: '780997.9', + hgt: '281', + spd: '63.6', + agl: '80', + lon: '67469613', + lat: '15348340' + }, + { + gtm: '20220318/180358', + mil: '780998.3', + hgt: '297', + spd: '42.3', + agl: '84', + lon: '67472103', + lat: '15348672' + }, + { + gtm: '20220318/180428', + mil: '780998.7', + hgt: '310', + spd: '42.8', + agl: '80', + lon: '67474225', + lat: '15348955' + }, + { + gtm: '20220318/180458', + mil: '780999.0', + hgt: '319', + spd: '34.7', + agl: '76', + lon: '67476039', + lat: '15349310' + }, + { + gtm: '20220318/180528', + mil: '780999.3', + hgt: '328', + spd: '42.2', + agl: '72', + lon: '67477854', + lat: '15349785' + }, + { + gtm: '20220318/180558', + mil: '780999.7', + hgt: '332', + spd: '49.4', + agl: '71', + lon: '67479945', + lat: '15350445' + }, + { + gtm: '20220318/180628', + mil: '781000.1', + hgt: '327', + spd: '57.2', + agl: '71', + lon: '67482483', + lat: '15351252' + }, + { + gtm: '20220318/180628', + mil: '781000.1', + hgt: '327', + spd: '57.2', + agl: '71', + lon: '67482483', + lat: '15351252' + }, + { + gtm: '20220318/180633', + mil: '781000.2', + hgt: '326', + spd: '58.0', + agl: '71', + lon: '67482932', + lat: '15351396' + }, + { + gtm: '20220318/180641', + mil: '781000.3', + hgt: '324', + spd: '57.1', + agl: '71', + lon: '67483665', + lat: '15351627' + }, + { + gtm: '20220318/180643', + mil: '781000.3', + hgt: '323', + spd: '55.8', + agl: '71', + lon: '67483840', + lat: '15351682' + }, + { + gtm: '20220318/180658', + mil: '781000.5', + hgt: '319', + spd: '43.2', + agl: '87', + lon: '67485051', + lat: '15351987' + }, + { + gtm: '20220318/180701', + mil: '781000.6', + hgt: '319', + spd: '41.6', + agl: '101', + lon: '67485259', + lat: '15351972' + }, + { + gtm: '20220318/180728', + mil: '781000.7', + hgt: '323', + spd: '15.6', + agl: '267', + lon: '67485244', + lat: '15351306' + }, + { + gtm: '20220318/180754', + mil: '781000.9', + hgt: '323', + spd: '27.2', + agl: '4', + lon: '67484842', + lat: '15351912' + }, + { + gtm: '20220318/180758', + mil: '781000.9', + hgt: '322', + spd: '30.3', + agl: '6', + lon: '67484859', + lat: '15352089' + }, + { + gtm: '20220318/180828', + mil: '781001.3', + hgt: '316', + spd: '55.8', + agl: '7', + lon: '67485062', + lat: '15354067' + }, + { + gtm: '20220318/180858', + mil: '781001.8', + hgt: '301', + spd: '75.7', + agl: '22', + lon: '67485907', + lat: '15356934' + }, + { + gtm: '20220318/180928', + mil: '781002.4', + hgt: '302', + spd: '66.7', + agl: '32', + lon: '67487664', + lat: '15359841' + }, + { + gtm: '20220318/180958', + mil: '781003.0', + hgt: '302', + spd: '71.6', + agl: '12', + lon: '67488826', + lat: '15362638' + }, + { + gtm: '20220318/181028', + mil: '781003.7', + hgt: '282', + spd: '88.5', + agl: '31', + lon: '67490179', + lat: '15366057' + }, + { + gtm: '20220318/181058', + mil: '781004.4', + hgt: '275', + spd: '85.2', + agl: '5', + lon: '67491751', + lat: '15369799' + }, + { + gtm: '20220318/181128', + mil: '781005.1', + hgt: '271', + spd: '80.3', + agl: '12', + lon: '67491994', + lat: '15373522' + }, + { + gtm: '20220318/181158', + mil: '781005.7', + hgt: '269', + spd: '79.9', + agl: '9', + lon: '67492937', + lat: '15376953' + }, + { + gtm: '20220318/181228', + mil: '781006.4', + hgt: '264', + spd: '79.0', + agl: '11', + lon: '67493433', + lat: '15380496' + }, + { + gtm: '20220318/181258', + mil: '781007.1', + hgt: '242', + spd: '96.3', + agl: '18', + lon: '67494639', + lat: '15384245' + }, + { + gtm: '20220318/181258', + mil: '781007.1', + hgt: '242', + spd: '96.3', + agl: '18', + lon: '67494639', + lat: '15384245' + }, + { + gtm: '20220318/181258', + mil: '781007.1', + hgt: '242', + spd: '96.3', + agl: '18', + lon: '67494639', + lat: '15384245' + }, + { + gtm: '20220318/181259', + mil: '781007.1', + hgt: '241', + spd: '96.8', + agl: '17', + lon: '67494686', + lat: '15384384' + }, + { + gtm: '20220318/181302', + mil: '781007.2', + hgt: '240', + spd: '97.1', + agl: '18', + lon: '67494832', + lat: '15384801' + }, + { + gtm: '20220318/181328', + mil: '781007.8', + hgt: '245', + spd: '76.9', + agl: '11', + lon: '67495905', + lat: '15388128' + }, + { + gtm: '20220318/181358', + mil: '781008.4', + hgt: '240', + spd: '82.9', + agl: '351', + lon: '67495717', + lat: '15391686' + }, + { + gtm: '20220318/181428', + mil: '781009.1', + hgt: '238', + spd: '86.3', + agl: '11', + lon: '67495506', + lat: '15395481' + }, + { + gtm: '20220318/181458', + mil: '781009.8', + hgt: '238', + spd: '83.6', + agl: '22', + lon: '67496985', + lat: '15399039' + }, + { + gtm: '20220318/181528', + mil: '781010.6', + hgt: '221', + spd: '93.5', + agl: '22', + lon: '67498674', + lat: '15402750' + }, + { + gtm: '20220318/181548', + mil: '781011.1', + hgt: '213', + spd: '93.8', + agl: '21', + lon: '67499844', + lat: '15405366' + }, + { + gtm: '20220318/181558', + mil: '781011.3', + hgt: '214', + spd: '92.9', + agl: '9', + lon: '67500238', + lat: '15406719' + }, + { + gtm: '20220318/181604', + mil: '781011.5', + hgt: '215', + spd: '91.7', + agl: '2', + lon: '67500324', + lat: '15407548' + }, + { + gtm: '20220318/181628', + mil: '781012.1', + hgt: '222', + spd: '85.7', + agl: '338', + lon: '67499622', + lat: '15410620' + }, + { + gtm: '20220318/181658', + mil: '781012.8', + hgt: '210', + spd: '93.7', + agl: '353', + lon: '67498401', + lat: '15414429' + }, + { + gtm: '20220318/181717', + mil: '781013.3', + hgt: '195', + spd: '103.2', + agl: '7', + lon: '67498446', + lat: '15417252' + }, + { + gtm: '20220318/181719', + mil: '781013.4', + hgt: '193', + spd: '103.8', + agl: '7', + lon: '67498488', + lat: '15417562' + }, + { + gtm: '20220318/181728', + mil: '781013.6', + hgt: '188', + spd: '104.9', + agl: '5', + lon: '67498673', + lat: '15418969' + }, + { + gtm: '20220318/181758', + mil: '781014.4', + hgt: '192', + spd: '88.7', + agl: '8', + lon: '67498722', + lat: '15423331' + }, + { + gtm: '20220318/181828', + mil: '781015.1', + hgt: '191', + spd: '89.6', + agl: '20', + lon: '67500082', + lat: '15427194' + }, + { + gtm: '20220318/181858', + mil: '781015.8', + hgt: '199', + spd: '86.7', + agl: '359', + lon: '67500789', + lat: '15431025' + }, + { + gtm: '20220318/181858', + mil: '781015.8', + hgt: '199', + spd: '86.7', + agl: '359', + lon: '67500789', + lat: '15431025' + }, + { + gtm: '20220318/181928', + mil: '781016.6', + hgt: '198', + spd: '87.4', + agl: '358', + lon: '67500618', + lat: '15435004' + }, + { + gtm: '20220318/181958', + mil: '781017.3', + hgt: '194', + spd: '86.3', + agl: '359', + lon: '67500445', + lat: '15439026' + }, + { + gtm: '20220318/182028', + mil: '781018.0', + hgt: '186', + spd: '90.2', + agl: '7', + lon: '67500849', + lat: '15442908' + }, + { + gtm: '20220318/182058', + mil: '781018.8', + hgt: '165', + spd: '104.2', + agl: '332', + lon: '67499805', + lat: '15447188' + }, + { + gtm: '20220318/182058', + mil: '781018.8', + hgt: '165', + spd: '104.2', + agl: '332', + lon: '67499805', + lat: '15447188' + }, + { + gtm: '20220318/182128', + mil: '781019.6', + hgt: '176', + spd: '91.0', + agl: '339', + lon: '67497579', + lat: '15451086' + }, + { + gtm: '20220318/182158', + mil: '781020.3', + hgt: '179', + spd: '86.5', + agl: '351', + lon: '67496571', + lat: '15454879' + }, + { + gtm: '20220318/182228', + mil: '781021.0', + hgt: '172', + spd: '87.6', + agl: '350', + lon: '67495839', + lat: '15458805' + }, + { + gtm: '20220318/182258', + mil: '781021.8', + hgt: '170', + spd: '88.1', + agl: '350', + lon: '67495120', + lat: '15462682' + }, + { + gtm: '20220318/182302', + mil: '781021.9', + hgt: '169', + spd: '88.0', + agl: '350', + lon: '67495023', + lat: '15463204' + }, + { + gtm: '20220318/182304', + mil: '781021.9', + hgt: '168', + spd: '88.3', + agl: '351', + lon: '67494975', + lat: '15463467' + }, + { + gtm: '20220318/182328', + mil: '781022.5', + hgt: '157', + spd: '92.2', + agl: '7', + lon: '67494805', + lat: '15466714' + }, + { + gtm: '20220318/182358', + mil: '781023.2', + hgt: '153', + spd: '86.9', + agl: '22', + lon: '67496202', + lat: '15470517' + }, + { + gtm: '20220318/182358', + mil: '781023.2', + hgt: '153', + spd: '86.9', + agl: '22', + lon: '67496202', + lat: '15470517' + }, + { + gtm: '20220318/182428', + mil: '781023.9', + hgt: '159', + spd: '85.5', + agl: '354', + lon: '67496790', + lat: '15474331' + }, + { + gtm: '20220318/182458', + mil: '781024.6', + hgt: '173', + spd: '78.1', + agl: '343', + lon: '67495752', + lat: '15477896' + }, + { + gtm: '20220318/182528', + mil: '781025.2', + hgt: '178', + spd: '77.2', + agl: '355', + lon: '67494936', + lat: '15481306' + }, + { + gtm: '20220318/182558', + mil: '781025.9', + hgt: '184', + spd: '78.3', + agl: '7', + lon: '67495030', + lat: '15484797' + }, + { + gtm: '20220318/182628', + mil: '781026.5', + hgt: '193', + spd: '75.0', + agl: '2', + lon: '67495458', + lat: '15488265' + }, + { + gtm: '20220318/182636', + mil: '781026.7', + hgt: '194', + spd: '74.1', + agl: '358', + lon: '67495455', + lat: '15489164' + }, + { + gtm: '20220318/182640', + mil: '781026.8', + hgt: '195', + spd: '73.4', + agl: '356', + lon: '67495422', + lat: '15489606' + }, + { + gtm: '20220318/182658', + mil: '781027.1', + hgt: '199', + spd: '69.9', + agl: '352', + lon: '67495192', + lat: '15491524' + }, + { + gtm: '20220318/182709', + mil: '781027.3', + hgt: '202', + spd: '68.0', + agl: '352', + lon: '67495005', + lat: '15492651' + }, + { + gtm: '20220318/182712', + mil: '781027.4', + hgt: '203', + spd: '68.1', + agl: '352', + lon: '67494952', + lat: '15492957' + }, + { + gtm: '20220318/182728', + mil: '781027.7', + hgt: '204', + spd: '69.7', + agl: '352', + lon: '67494702', + lat: '15494580' + }, + { + gtm: '20220318/182758', + mil: '781028.3', + hgt: '201', + spd: '79.9', + agl: '353', + lon: '67494142', + lat: '15497941' + }, + { + gtm: '20220318/182828', + mil: '781029.0', + hgt: '200', + spd: '80.4', + agl: '6', + lon: '67494063', + lat: '15501621' + }, + { + gtm: '20220318/182858', + mil: '781029.6', + hgt: '209', + spd: '84.4', + agl: '9', + lon: '67494663', + lat: '15505293' + }, + { + gtm: '20220318/182858', + mil: '781029.6', + hgt: '209', + spd: '84.4', + agl: '9', + lon: '67494663', + lat: '15505293' + }, + { + gtm: '20220318/182928', + mil: '781030.3', + hgt: '220', + spd: '72.8', + agl: '355', + lon: '67494901', + lat: '15508896' + }, + { + gtm: '20220318/182958', + mil: '781030.8', + hgt: '225', + spd: '74.3', + agl: '340', + lon: '67494123', + lat: '15511914' + }, + { + gtm: '20220318/183028', + mil: '781031.5', + hgt: '211', + spd: '83.0', + agl: '351', + lon: '67492894', + lat: '15515349' + }, + { + gtm: '20220318/183058', + mil: '781032.2', + hgt: '219', + spd: '73.8', + agl: '11', + lon: '67492984', + lat: '15518871' + }, + { + gtm: '20220318/183128', + mil: '781032.7', + hgt: '221', + spd: '73.9', + agl: '27', + lon: '67494276', + lat: '15521934' + }, + { + gtm: '20220318/183158', + mil: '781033.4', + hgt: '214', + spd: '77.2', + agl: '18', + lon: '67495805', + lat: '15525051' + }, + { + gtm: '20220318/183228', + mil: '781034.0', + hgt: '221', + spd: '70.4', + agl: '4', + lon: '67496473', + lat: '15528304' + }, + { + gtm: '20220318/183258', + mil: '781034.5', + hgt: '231', + spd: '64.2', + agl: '3', + lon: '67496665', + lat: '15531342' + }, + { + gtm: '20220318/183328', + mil: '781035.1', + hgt: '232', + spd: '71.1', + agl: '9', + lon: '67497018', + lat: '15534294' + }, + { + gtm: '20220318/183358', + mil: '781035.7', + hgt: '226', + spd: '72.5', + agl: '17', + lon: '67497816', + lat: '15537492' + }, + { + gtm: '20220318/183421', + mil: '781036.1', + hgt: '218', + spd: '74.9', + agl: '18', + lon: '67498665', + lat: '15539928' + }, + { + gtm: '20220318/183427', + mil: '781036.2', + hgt: '217', + spd: '72.5', + agl: '17', + lon: '67498889', + lat: '15540565' + }, + { + gtm: '20220318/183428', + mil: '781036.3', + hgt: '217', + spd: '71.1', + agl: '17', + lon: '67498925', + lat: '15540667' + }, + { + gtm: '20220318/183458', + mil: '781036.9', + hgt: '217', + spd: '75.1', + agl: '18', + lon: '67500051', + lat: '15543888' + }, + { + gtm: '20220318/183528', + mil: '781037.5', + hgt: '233', + spd: '70.2', + agl: '15', + lon: '67501092', + lat: '15546961' + }, + { + gtm: '20220318/183558', + mil: '781038.1', + hgt: '238', + spd: '76.4', + agl: '0', + lon: '67501537', + lat: '15550236' + }, + { + gtm: '20220318/183628', + mil: '781038.7', + hgt: '234', + spd: '80.0', + agl: '353', + lon: '67501176', + lat: '15553732' + }, + { + gtm: '20220318/183658', + mil: '781039.4', + hgt: '236', + spd: '77.2', + agl: '353', + lon: '67500696', + lat: '15557277' + }, + { + gtm: '20220318/183728', + mil: '781039.9', + hgt: '249', + spd: '68.1', + agl: '5', + lon: '67500520', + lat: '15560517' + }, + { + gtm: '20220318/183758', + mil: '781040.5', + hgt: '257', + spd: '72.9', + agl: '17', + lon: '67501341', + lat: '15563590' + }, + { + gtm: '20220318/183828', + mil: '781041.1', + hgt: '262', + spd: '77.4', + agl: '1', + lon: '67501972', + lat: '15566928' + }, + { + gtm: '20220318/183858', + mil: '781041.8', + hgt: '259', + spd: '77.5', + agl: '356', + lon: '67501746', + lat: '15570488' + }, + { + gtm: '20220318/183928', + mil: '781042.4', + hgt: '260', + spd: '75.2', + agl: '13', + lon: '67501988', + lat: '15573912' + }, + { + gtm: '20220318/183958', + mil: '781043.0', + hgt: '267', + spd: '71.1', + agl: '34', + lon: '67503468', + lat: '15576936' + }, + { + gtm: '20220318/184028', + mil: '781043.6', + hgt: '280', + spd: '68.5', + agl: '26', + lon: '67505316', + lat: '15579475' + }, + { + gtm: '20220318/184058', + mil: '781044.1', + hgt: '281', + spd: '70.3', + agl: '5', + lon: '67506235', + lat: '15582513' + }, + { + gtm: '20220318/184128', + mil: '781044.7', + hgt: '288', + spd: '65.7', + agl: '357', + lon: '67506072', + lat: '15585577' + }, + { + gtm: '20220318/184158', + mil: '781045.2', + hgt: '298', + spd: '64.5', + agl: '15', + lon: '67506450', + lat: '15588474' + }, + { + gtm: '20220318/184228', + mil: '781045.8', + hgt: '304', + spd: '66.3', + agl: '14', + lon: '67507224', + lat: '15591348' + }, + { + gtm: '20220318/184258', + mil: '781046.3', + hgt: '315', + spd: '63.0', + agl: '14', + lon: '67507990', + lat: '15594180' + }, + { + gtm: '20220318/184328', + mil: '781046.8', + hgt: '326', + spd: '67.9', + agl: '10', + lon: '67508727', + lat: '15597039' + }, + { + gtm: '20220318/184358', + mil: '781047.5', + hgt: '324', + spd: '75.6', + agl: '346', + lon: '67508583', + lat: '15600351' + }, + { + gtm: '20220318/184428', + mil: '781048.1', + hgt: '320', + spd: '77.8', + agl: '347', + lon: '67507350', + lat: '15603699' + }, + { + gtm: '20220318/184458', + mil: '781048.7', + hgt: '333', + spd: '69.8', + agl: '3', + lon: '67507230', + lat: '15607005' + }, + { + gtm: '20220318/184528', + mil: '781049.3', + hgt: '336', + spd: '76.8', + agl: '345', + lon: '67506861', + lat: '15610237' + }, + { + gtm: '20220318/184558', + mil: '781049.9', + hgt: '325', + spd: '83.0', + agl: '5', + lon: '67506244', + lat: '15613773' + }, + { + gtm: '20220318/184603', + mil: '781050.1', + hgt: '322', + spd: '84.7', + agl: '11', + lon: '67506351', + lat: '15614397' + }, + { + gtm: '20220318/184606', + mil: '781050.1', + hgt: '320', + spd: '85.9', + agl: '15', + lon: '67506453', + lat: '15614771' + }, + { + gtm: '20220318/184628', + mil: '781050.7', + hgt: '299', + spd: '97.3', + agl: '29', + lon: '67507915', + lat: '15617466' + }, + { + gtm: '20220318/184647', + mil: '781051.2', + hgt: '292', + spd: '96.2', + agl: '14', + lon: '67509168', + lat: '15620053' + }, + { + gtm: '20220318/184652', + mil: '781051.3', + hgt: '293', + spd: '91.9', + agl: '10', + lon: '67509330', + lat: '15620743' + }, + { + gtm: '20220318/184658', + mil: '781051.5', + hgt: '295', + spd: '87.5', + agl: '3', + lon: '67509421', + lat: '15621543' + }, + { + gtm: '20220318/184728', + mil: '781052.2', + hgt: '287', + spd: '87.4', + agl: '354', + lon: '67508892', + lat: '15625423' + }, + { + gtm: '20220318/184758', + mil: '781052.8', + hgt: '297', + spd: '79.7', + agl: '12', + lon: '67509126', + lat: '15629010' + }, + { + gtm: '20220318/184828', + mil: '781053.5', + hgt: '295', + spd: '81.6', + agl: '29', + lon: '67510701', + lat: '15632466' + }, + { + gtm: '20220318/184858', + mil: '781054.2', + hgt: '296', + spd: '80.3', + agl: '14', + lon: '67512234', + lat: '15635767' + }, + { + gtm: '20220318/184928', + mil: '781054.9', + hgt: '288', + spd: '85.4', + agl: '354', + lon: '67512482', + lat: '15639524' + }, + { + gtm: '20220318/184958', + mil: '781055.5', + hgt: '300', + spd: '74.8', + agl: '350', + lon: '67511649', + lat: '15643003' + }, + { + gtm: '20220318/185028', + mil: '781056.1', + hgt: '307', + spd: '73.1', + agl: '15', + lon: '67511808', + lat: '15646255' + }, + { + gtm: '20220318/185028', + mil: '781056.1', + hgt: '307', + spd: '73.1', + agl: '15', + lon: '67511808', + lat: '15646255' + }, + { + gtm: '20220318/185058', + mil: '781056.7', + hgt: '299', + spd: '79.7', + agl: '3', + lon: '67512742', + lat: '15649589' + }, + { + gtm: '20220318/185112', + mil: '781057.0', + hgt: '295', + spd: '81.6', + agl: '348', + lon: '67512588', + lat: '15651274' + }, + { + gtm: '20220318/185116', + mil: '781057.1', + hgt: '293', + spd: '81.8', + agl: '343', + lon: '67512448', + lat: '15651751' + }, + { + gtm: '20220318/185119', + mil: '781057.2', + hgt: '292', + spd: '81.5', + agl: '340', + lon: '67512319', + lat: '15652099' + }, + { + gtm: '20220318/185123', + mil: '781057.3', + hgt: '289', + spd: '83.0', + agl: '336', + lon: '67512108', + lat: '15652560' + }, + { + gtm: '20220318/185128', + mil: '781057.4', + hgt: '285', + spd: '84.7', + agl: '330', + lon: '67511790', + lat: '15653118' + }, + { + gtm: '20220318/185128', + mil: '781057.4', + hgt: '285', + spd: '84.7', + agl: '330', + lon: '67511790', + lat: '15653118' + }, + { + gtm: '20220318/185133', + mil: '781057.5', + hgt: '281', + spd: '88.9', + agl: '327', + lon: '67511403', + lat: '15653676' + }, + { + gtm: '20220318/185158', + mil: '781058.1', + hgt: '277', + spd: '86.1', + agl: '350', + lon: '67509822', + lat: '15656827' + }, + { + gtm: '20220318/185228', + mil: '781058.7', + hgt: '305', + spd: '63.3', + agl: '349', + lon: '67509560', + lat: '15660141' + }, + { + gtm: '20220318/185258', + mil: '781059.2', + hgt: '318', + spd: '54.1', + agl: '344', + lon: '67508655', + lat: '15662643' + }, + { + gtm: '20220318/185328', + mil: '781059.7', + hgt: '321', + spd: '59.5', + agl: '5', + lon: '67508412', + lat: '15665109' + }, + { + gtm: '20220318/185340', + mil: '781059.9', + hgt: '314', + spd: '69.0', + agl: '16', + lon: '67508682', + lat: '15666234' + }, + { + gtm: '20220318/185345', + mil: '781060.0', + hgt: '309', + spd: '72.2', + agl: '19', + lon: '67508874', + lat: '15666739' + }, + { + gtm: '20220318/185353', + mil: '781060.2', + hgt: '301', + spd: '77.8', + agl: '18', + lon: '67509208', + lat: '15667585' + }, + { + gtm: '20220318/185356', + mil: '781060.2', + hgt: '298', + spd: '80.1', + agl: '17', + lon: '67509328', + lat: '15667926' + }, + { + gtm: '20220318/185358', + mil: '781060.3', + hgt: '296', + spd: '81.8', + agl: '15', + lon: '67509402', + lat: '15668161' + }, + { + gtm: '20220318/185359', + mil: '781060.3', + hgt: '295', + spd: '82.8', + agl: '14', + lon: '67509436', + lat: '15668281' + }, + { + gtm: '20220318/185404', + mil: '781060.4', + hgt: '290', + spd: '84.7', + agl: '8', + lon: '67509562', + lat: '15668905' + }, + { + gtm: '20220318/185405', + mil: '781060.4', + hgt: '289', + spd: '83.7', + agl: '7', + lon: '67509579', + lat: '15669030' + }, + { + gtm: '20220318/185413', + mil: '781060.6', + hgt: '283', + spd: '84.2', + agl: '358', + lon: '67509631', + lat: '15670048' + }, + { + gtm: '20220318/185415', + mil: '781060.7', + hgt: '282', + spd: '83.5', + agl: '356', + lon: '67509613', + lat: '15670300' + }, + { + gtm: '20220318/185416', + mil: '781060.7', + hgt: '282', + spd: '84.0', + agl: '355', + lon: '67509601', + lat: '15670428' + }, + { + gtm: '20220318/185428', + mil: '781061.0', + hgt: '272', + spd: '93.3', + agl: '341', + lon: '67509214', + lat: '15671997' + }, + { + gtm: '20220318/185458', + mil: '781061.7', + hgt: '278', + spd: '85.0', + agl: '319', + lon: '67506633', + lat: '15675448' + }, + { + gtm: '20220318/185528', + mil: '781062.3', + hgt: '301', + spd: '61.1', + agl: '326', + lon: '67504297', + lat: '15677997' + }, + { + gtm: '20220318/185558', + mil: '781062.8', + hgt: '309', + spd: '62.5', + agl: '342', + lon: '67503066', + lat: '15680360' + }, + { + gtm: '20220318/185628', + mil: '781063.4', + hgt: '301', + spd: '73.0', + agl: '340', + lon: '67502027', + lat: '15683364' + }, + { + gtm: '20220318/185640', + mil: '781063.6', + hgt: '297', + spd: '75.3', + agl: '331', + lon: '67501399', + lat: '15684570' + }, + { + gtm: '20220318/185640', + mil: '781063.6', + hgt: '297', + spd: '75.3', + agl: '331', + lon: '67501399', + lat: '15684570' + }, + { + gtm: '20220318/185656', + mil: '781063.9', + hgt: '288', + spd: '72.1', + agl: '320', + lon: '67500243', + lat: '15686016' + }, + { + gtm: '20220318/185658', + mil: '781064.0', + hgt: '287', + spd: '72.0', + agl: '320', + lon: '67500090', + lat: '15686181' + }, + { + gtm: '20220318/185658', + mil: '781064.0', + hgt: '287', + spd: '72.0', + agl: '320', + lon: '67500090', + lat: '15686181' + }, + { + gtm: '20220318/185707', + mil: '781064.2', + hgt: '281', + spd: '71.1', + agl: '320', + lon: '67499383', + lat: '15686927' + }, + { + gtm: '20220318/185709', + mil: '781064.2', + hgt: '280', + spd: '71.0', + agl: '320', + lon: '67499229', + lat: '15687090' + }, + { + gtm: '20220318/185718', + mil: '781064.4', + hgt: '273', + spd: '72.3', + agl: '320', + lon: '67498524', + lat: '15687838' + }, + { + gtm: '20220318/185720', + mil: '781064.4', + hgt: '272', + spd: '72.4', + agl: '320', + lon: '67498367', + lat: '15688003' + }, + { + gtm: '20220318/185723', + mil: '781064.5', + hgt: '269', + spd: '74.1', + agl: '320', + lon: '67498126', + lat: '15688257' + }, + { + gtm: '20220318/185727', + mil: '781064.6', + hgt: '265', + spd: '75.9', + agl: '323', + lon: '67497813', + lat: '15688609' + }, + { + gtm: '20220318/185728', + mil: '781064.6', + hgt: '265', + spd: '76.8', + agl: '323', + lon: '67497736', + lat: '15688701' + }, + { + gtm: '20220318/185733', + mil: '781064.7', + hgt: '260', + spd: '79.2', + agl: '327', + lon: '67497366', + lat: '15689189' + }, + { + gtm: '20220318/185736', + mil: '781064.7', + hgt: '258', + spd: '81.3', + agl: '330', + lon: '67497155', + lat: '15689499' + }, + { + gtm: '20220318/185737', + mil: '781064.8', + hgt: '257', + spd: '82.1', + agl: '331', + lon: '67497087', + lat: '15689607' + }, + { + gtm: '20220318/185743', + mil: '781064.9', + hgt: '252', + spd: '83.7', + agl: '336', + lon: '67496719', + lat: '15690283' + }, + { + gtm: '20220318/185745', + mil: '781064.9', + hgt: '251', + spd: '83.1', + agl: '338', + lon: '67496613', + lat: '15690514' + }, + { + gtm: '20220318/185751', + mil: '781065.1', + hgt: '247', + spd: '82.1', + agl: '343', + lon: '67496340', + lat: '15691225' + }, + { + gtm: '20220318/185758', + mil: '781065.3', + hgt: '243', + spd: '83.8', + agl: '350', + lon: '67496118', + lat: '15692067' + }, + { + gtm: '20220318/185813', + mil: '781065.6', + hgt: '233', + spd: '89.9', + agl: '4', + lon: '67495999', + lat: '15694029' + }, + { + gtm: '20220318/185815', + mil: '781065.7', + hgt: '232', + spd: '89.8', + agl: '5', + lon: '67496022', + lat: '15694297' + }, + { + gtm: '20220318/185828', + mil: '781066.0', + hgt: '226', + spd: '84.8', + agl: '7', + lon: '67496241', + lat: '15695997' + }, + { + gtm: '20220318/185831', + mil: '781066.0', + hgt: '224', + spd: '84.4', + agl: '6', + lon: '67496290', + lat: '15696373' + }, + { + gtm: '20220318/185835', + mil: '781066.1', + hgt: '221', + spd: '85.8', + agl: '7', + lon: '67496358', + lat: '15696879' + }, + { + gtm: '20220318/185843', + mil: '781066.3', + hgt: '215', + spd: '86.4', + agl: '6', + lon: '67496494', + lat: '15697920' + }, + { + gtm: '20220318/185858', + mil: '781066.7', + hgt: '206', + spd: '91.9', + agl: '356', + lon: '67496532', + lat: '15699921' + }, + { + gtm: '20220318/190058', + mil: '781069.6', + hgt: '149', + spd: '82.0', + agl: '353', + lon: '67490146', + lat: '15714576' + }, + { + gtm: '20220318/190128', + mil: '781070.2', + hgt: '147', + spd: '78.1', + agl: '355', + lon: '67489779', + lat: '15718095' + }, + { + gtm: '20220318/190158', + mil: '781070.9', + hgt: '147', + spd: '80.1', + agl: '355', + lon: '67489413', + lat: '15721680' + }, + { + gtm: '20220318/190228', + mil: '781071.5', + hgt: '163', + spd: '69.5', + agl: '344', + lon: '67488858', + lat: '15724896' + }, + { + gtm: '20220318/190258', + mil: '781072.1', + hgt: '150', + spd: '80.0', + agl: '339', + lon: '67487544', + lat: '15728097' + }, + { + gtm: '20220318/190328', + mil: '781072.7', + hgt: '152', + spd: '68.5', + agl: '352', + lon: '67486512', + lat: '15731307' + }, + { + gtm: '20220318/190358', + mil: '781073.2', + hgt: '156', + spd: '67.0', + agl: '353', + lon: '67486146', + lat: '15734310' + }, + { + gtm: '20220318/190428', + mil: '781073.8', + hgt: '152', + spd: '71.2', + agl: '336', + lon: '67485159', + lat: '15737278' + }, + { + gtm: '20220318/190458', + mil: '781074.4', + hgt: '137', + spd: '83.6', + agl: '349', + lon: '67483774', + lat: '15740502' + }, + { + gtm: '20220318/190528', + mil: '781075.1', + hgt: '138', + spd: '74.1', + agl: '358', + lon: '67483527', + lat: '15744021' + }, + { + gtm: '20220318/190558', + mil: '781075.7', + hgt: '141', + spd: '70.4', + agl: '356', + lon: '67483357', + lat: '15747339' + }, + { + gtm: '20220318/190619', + mil: '781076.1', + hgt: '146', + spd: '71.8', + agl: '351', + lon: '67483060', + lat: '15749571' + }, + { + gtm: '20220318/190628', + mil: '781076.3', + hgt: '145', + spd: '75.1', + agl: '348', + lon: '67482858', + lat: '15750551' + }, + { + gtm: '20220318/190632', + mil: '781076.4', + hgt: '145', + spd: '77.6', + agl: '348', + lon: '67482750', + lat: '15751002' + }, + { + gtm: '20220318/190658', + mil: '781076.9', + hgt: '146', + spd: '72.1', + agl: '344', + lon: '67481917', + lat: '15753872' + }, + { + gtm: '20220318/190728', + mil: '781077.5', + hgt: '139', + spd: '76.4', + agl: '344', + lon: '67480899', + lat: '15757164' + }, + { + gtm: '20220318/190758', + mil: '781078.2', + hgt: '132', + spd: '79.2', + agl: '351', + lon: '67480005', + lat: '15760587' + }, + { + gtm: '20220318/190828', + mil: '781078.8', + hgt: '131', + spd: '71.4', + agl: '359', + lon: '67479724', + lat: '15764074' + }, + { + gtm: '20220318/190858', + mil: '781079.3', + hgt: '137', + spd: '65.9', + agl: '354', + lon: '67479604', + lat: '15767137' + }, + { + gtm: '20220318/190928', + mil: '781079.9', + hgt: '129', + spd: '77.1', + agl: '336', + lon: '67478617', + lat: '15770256' + }, + { + gtm: '20220318/190951', + mil: '781080.4', + hgt: '122', + spd: '80.0', + agl: '344', + lon: '67477509', + lat: '15772791' + }, + { + gtm: '20220318/190956', + mil: '781080.5', + hgt: '122', + spd: '79.1', + agl: '348', + lon: '67477353', + lat: '15773373' + }, + { + gtm: '20220318/190958', + mil: '781080.6', + hgt: '121', + spd: '77.5', + agl: '349', + lon: '67477302', + lat: '15773601' + }, + { + gtm: '20220318/191028', + mil: '781081.2', + hgt: '120', + spd: '72.5', + agl: '351', + lon: '67476713', + lat: '15776968' + }, + { + gtm: '20220318/191058', + mil: '781081.8', + hgt: '123', + spd: '67.8', + agl: '352', + lon: '67476188', + lat: '15780068' + }, + { + gtm: '20220318/191128', + mil: '781082.3', + hgt: '129', + spd: '65.3', + agl: '358', + lon: '67475787', + lat: '15782988' + }, + { + gtm: '20220318/191158', + mil: '781082.8', + hgt: '122', + spd: '67.3', + agl: '12', + lon: '67476091', + lat: '15785949' + }, + { + gtm: '20220318/191158', + mil: '781082.8', + hgt: '122', + spd: '67.3', + agl: '12', + lon: '67476091', + lat: '15785949' + }, + { + gtm: '20220318/191228', + mil: '781083.4', + hgt: '112', + spd: '73.4', + agl: '12', + lon: '67476867', + lat: '15789141' + }, + { + gtm: '20220318/191228', + mil: '781083.4', + hgt: '112', + spd: '73.4', + agl: '12', + lon: '67476867', + lat: '15789141' + }, + { + gtm: '20220318/191258', + mil: '781084.0', + hgt: '107', + spd: '73.3', + agl: '358', + lon: '67477257', + lat: '15792438' + }, + { + gtm: '20220318/191324', + mil: '781084.6', + hgt: '113', + spd: '69.8', + agl: '345', + lon: '67476801', + lat: '15795226' + }, + { + gtm: '20220318/191328', + mil: '781084.6', + hgt: '113', + spd: '68.7', + agl: '343', + lon: '67476673', + lat: '15795627' + }, + { + gtm: '20220318/191358', + mil: '781085.2', + hgt: '117', + spd: '71.8', + agl: '341', + lon: '67475554', + lat: '15798664' + }, + { + gtm: '20220318/191428', + mil: '781085.8', + hgt: '116', + spd: '71.3', + agl: '341', + lon: '67474392', + lat: '15801771' + }, + { + gtm: '20220318/191458', + mil: '781086.4', + hgt: '106', + spd: '83.8', + agl: '353', + lon: '67473396', + lat: '15805090' + }, + { + gtm: '20220318/191458', + mil: '781086.4', + hgt: '106', + spd: '83.8', + agl: '353', + lon: '67473396', + lat: '15805090' + }, + { + gtm: '20220318/191528', + mil: '781087.1', + hgt: '98', + spd: '80.3', + agl: '6', + lon: '67473591', + lat: '15808896' + }, + { + gtm: '20220318/191558', + mil: '781087.8', + hgt: '99', + spd: '84.1', + agl: '351', + lon: '67473640', + lat: '15812624' + }, + { + gtm: '20220318/191628', + mil: '781088.5', + hgt: '100', + spd: '77.6', + agl: '336', + lon: '67472376', + lat: '15815961' + }, + { + gtm: '20220318/191658', + mil: '781089.1', + hgt: '102', + spd: '69.7', + agl: '337', + lon: '67470820', + lat: '15819015' + }, + { + gtm: '20220318/191658', + mil: '781089.1', + hgt: '102', + spd: '69.7', + agl: '337', + lon: '67470820', + lat: '15819015' + }, + { + gtm: '20220318/191728', + mil: '781089.7', + hgt: '98', + spd: '76.4', + agl: '354', + lon: '67469919', + lat: '15822208' + }, + { + gtm: '20220318/191758', + mil: '781090.3', + hgt: '104', + spd: '71.9', + agl: '9', + lon: '67470033', + lat: '15825546' + }, + { + gtm: '20220318/191828', + mil: '781090.8', + hgt: '113', + spd: '64.8', + agl: '10', + lon: '67470591', + lat: '15828546' + }, + { + gtm: '20220318/191858', + mil: '781091.4', + hgt: '113', + spd: '70.5', + agl: '9', + lon: '67471138', + lat: '15831518' + }, + { + gtm: '20220318/191928', + mil: '781092.0', + hgt: '104', + spd: '76.1', + agl: '19', + lon: '67471903', + lat: '15834768' + }, + { + gtm: '20220318/191958', + mil: '781092.6', + hgt: '96', + spd: '76.6', + agl: '37', + lon: '67473747', + lat: '15837880' + }, + { + gtm: '20220318/192028', + mil: '781093.2', + hgt: '106', + spd: '65.5', + agl: '45', + lon: '67476168', + lat: '15840222' + }, + { + gtm: '20220318/192058', + mil: '781093.7', + hgt: '113', + spd: '65.9', + agl: '38', + lon: '67478376', + lat: '15842379' + }, + { + gtm: '20220318/192128', + mil: '781094.3', + hgt: '109', + spd: '73.8', + agl: '30', + lon: '67480246', + lat: '15845083' + }, + { + gtm: '20220318/192158', + mil: '781094.9', + hgt: '108', + spd: '71.1', + agl: '26', + lon: '67482024', + lat: '15847917' + }, + { + gtm: '20220318/192228', + mil: '781095.5', + hgt: '101', + spd: '72.0', + agl: '19', + lon: '67483128', + lat: '15850994' + }, + { + gtm: '20220318/192258', + mil: '781096.1', + hgt: '95', + spd: '76.8', + agl: '43', + lon: '67485084', + lat: '15853861' + }, + { + gtm: '20220318/192328', + mil: '781096.7', + hgt: '94', + spd: '69.5', + agl: '44', + lon: '67487801', + lat: '15856074' + }, + { + gtm: '20220318/192358', + mil: '781097.3', + hgt: '97', + spd: '69.3', + agl: '31', + lon: '67489923', + lat: '15858643' + }, + { + gtm: '20220318/192428', + mil: '781097.8', + hgt: '101', + spd: '65.9', + agl: '41', + lon: '67491834', + lat: '15861168' + }, + { + gtm: '20220318/192458', + mil: '781098.4', + hgt: '108', + spd: '63.5', + agl: '52', + lon: '67494184', + lat: '15863079' + }, + { + gtm: '20220318/192528', + mil: '781098.9', + hgt: '111', + spd: '70.5', + agl: '41', + lon: '67496761', + lat: '15865140' + }, + { + gtm: '20220318/192528', + mil: '781098.9', + hgt: '111', + spd: '70.5', + agl: '41', + lon: '67496761', + lat: '15865140' + }, + { + gtm: '20220318/192558', + mil: '781099.5', + hgt: '117', + spd: '67.4', + agl: '25', + lon: '67498565', + lat: '15867645' + }, + { + gtm: '20220318/192628', + mil: '781100.1', + hgt: '109', + spd: '71.9', + agl: '22', + lon: '67499928', + lat: '15870651' + }, + { + gtm: '20220318/192658', + mil: '781100.7', + hgt: '105', + spd: '73.1', + agl: '41', + lon: '67501783', + lat: '15873435' + }, + { + gtm: '20220318/192728', + mil: '781101.3', + hgt: '109', + spd: '70.9', + agl: '54', + lon: '67504563', + lat: '15875538' + }, + { + gtm: '20220318/192758', + mil: '781101.8', + hgt: '104', + spd: '72.7', + agl: '30', + lon: '67506888', + lat: '15877806' + }, + { + gtm: '20220318/192828', + mil: '781102.4', + hgt: '105', + spd: '74.5', + agl: '0', + lon: '67507811', + lat: '15881034' + }, + { + gtm: '20220318/192858', + mil: '781103.1', + hgt: '105', + spd: '75.5', + agl: '350', + lon: '67507245', + lat: '15884407' + }, + { + gtm: '20220318/192928', + mil: '781103.7', + hgt: '104', + spd: '76.5', + agl: '18', + lon: '67507425', + lat: '15887781' + }, + { + gtm: '20220318/192928', + mil: '781103.7', + hgt: '104', + spd: '76.5', + agl: '18', + lon: '67507425', + lat: '15887781' + }, + { + gtm: '20220318/192958', + mil: '781104.3', + hgt: '107', + spd: '74.0', + agl: '48', + lon: '67509457', + lat: '15890584' + }, + { + gtm: '20220318/193028', + mil: '781104.9', + hgt: '108', + spd: '70.7', + agl: '51', + lon: '67512333', + lat: '15892650' + }, + { + gtm: '20220318/193058', + mil: '781105.5', + hgt: '98', + spd: '80.7', + agl: '29', + lon: '67514742', + lat: '15895119' + }, + { + gtm: '20220318/193128', + mil: '781106.2', + hgt: '91', + spd: '79.5', + agl: '21', + lon: '67516129', + lat: '15898617' + }, + { + gtm: '20220318/193158', + mil: '781106.8', + hgt: '94', + spd: '75.2', + agl: '45', + lon: '67518226', + lat: '15901479' + }, + { + gtm: '20220318/193228', + mil: '781107.4', + hgt: '94', + spd: '80.3', + agl: '41', + lon: '67521051', + lat: '15903852' + }, + { + gtm: '20220318/193258', + mil: '781108.1', + hgt: '100', + spd: '77.0', + agl: '25', + lon: '67523220', + lat: '15906831' + }, + { + gtm: '20220318/193328', + mil: '781108.7', + hgt: '97', + spd: '77.7', + agl: '9', + lon: '67524306', + lat: '15910137' + }, + { + gtm: '20220318/193358', + mil: '781109.4', + hgt: '89', + spd: '83.7', + agl: '6', + lon: '67524735', + lat: '15913919' + }, + { + gtm: '20220318/193428', + mil: '781110.0', + hgt: '105', + spd: '67.0', + agl: '21', + lon: '67525383', + lat: '15917100' + }, + { + gtm: '20220318/193458', + mil: '781110.6', + hgt: '97', + spd: '80.3', + agl: '34', + lon: '67527318', + lat: '15919944' + }, + { + gtm: '20220318/193528', + mil: '781111.3', + hgt: '95', + spd: '78.5', + agl: '11', + lon: '67528855', + lat: '15923303' + }, + { + gtm: '20220318/193558', + mil: '781111.9', + hgt: '94', + spd: '82.9', + agl: '353', + lon: '67528860', + lat: '15926828' + }, + { + gtm: '20220318/193628', + mil: '781112.6', + hgt: '93', + spd: '84.1', + agl: '354', + lon: '67528315', + lat: '15930658' + }, + { + gtm: '20220318/193658', + mil: '781113.3', + hgt: '95', + spd: '83.0', + agl: '7', + lon: '67528333', + lat: '15934409' + }, + { + gtm: '20220318/193728', + mil: '781113.9', + hgt: '101', + spd: '76.1', + agl: '20', + lon: '67529265', + lat: '15937932' + }, + { + gtm: '20220318/193758', + mil: '781114.6', + hgt: '97', + spd: '78.7', + agl: '28', + lon: '67530888', + lat: '15941020' + }, + { + gtm: '20220318/193828', + mil: '781115.2', + hgt: '89', + spd: '83.0', + agl: '14', + lon: '67532412', + lat: '15944403' + }, + { + gtm: '20220318/193858', + mil: '781115.9', + hgt: '91', + spd: '75.1', + agl: '355', + lon: '67532646', + lat: '15947865' + }, + { + gtm: '20220318/193928', + mil: '781116.5', + hgt: '87', + spd: '78.0', + agl: '341', + lon: '67531740', + lat: '15951139' + }, + { + gtm: '20220318/193958', + mil: '781117.1', + hgt: '83', + spd: '80.7', + agl: '341', + lon: '67530441', + lat: '15954513' + }, + { + gtm: '20220318/194028', + mil: '781117.8', + hgt: '80', + spd: '81.4', + agl: '342', + lon: '67529110', + lat: '15957990' + }, + { + gtm: '20220318/194058', + mil: '781118.4', + hgt: '86', + spd: '70.9', + agl: '348', + lon: '67527921', + lat: '15961249' + }, + { + gtm: '20220318/194128', + mil: '781119.0', + hgt: '92', + spd: '72.7', + agl: '7', + lon: '67527982', + lat: '15964528' + }, + { + gtm: '20220318/194158', + mil: '781119.6', + hgt: '92', + spd: '75.3', + agl: '338', + lon: '67527522', + lat: '15967737' + }, + { + gtm: '20220318/194228', + mil: '781120.3', + hgt: '80', + spd: '80.8', + agl: '331', + lon: '67525531', + lat: '15970974' + }, + { + gtm: '20220318/194258', + mil: '781120.9', + hgt: '93', + spd: '65.6', + agl: '342', + lon: '67523934', + lat: '15973860' + }, + { + gtm: '20220318/194328', + mil: '781121.4', + hgt: '94', + spd: '68.0', + agl: '359', + lon: '67523368', + lat: '15976812' + }, + { + gtm: '20220318/194358', + mil: '781122.0', + hgt: '92', + spd: '73.1', + agl: '1', + lon: '67523472', + lat: '15979998' + }, + { + gtm: '20220318/194428', + mil: '781122.6', + hgt: '89', + spd: '73.4', + agl: '345', + lon: '67523080', + lat: '15983311' + }, + { + gtm: '20220318/194458', + mil: '781123.2', + hgt: '93', + spd: '72.0', + agl: '341', + lon: '67521856', + lat: '15986437' + }, + { + gtm: '20220318/194528', + mil: '781123.8', + hgt: '95', + spd: '71.5', + agl: '349', + lon: '67520827', + lat: '15989469' + }, + { + gtm: '20220318/194558', + mil: '781124.4', + hgt: '86', + spd: '81.3', + agl: '355', + lon: '67520373', + lat: '15992830' + }, + { + gtm: '20220318/194628', + mil: '781125.0', + hgt: '99', + spd: '66.3', + agl: '354', + lon: '67520000', + lat: '15996185' + }, + { + gtm: '20220318/194658', + mil: '781125.6', + hgt: '104', + spd: '68.3', + agl: '1', + lon: '67519744', + lat: '15999137' + }, + { + gtm: '20220318/194728', + mil: '781126.2', + hgt: '96', + spd: '75.5', + agl: '22', + lon: '67520468', + lat: '16002352' + }, + { + gtm: '20220318/194758', + mil: '781126.8', + hgt: '99', + spd: '68.2', + agl: '14', + lon: '67521781', + lat: '16005384' + }, + { + gtm: '20220318/194828', + mil: '781127.3', + hgt: '97', + spd: '71.7', + agl: '354', + lon: '67521969', + lat: '16008493' + }, + { + gtm: '20220318/194858', + mil: '781128.0', + hgt: '83', + spd: '84.2', + agl: '352', + lon: '67521422', + lat: '16012055' + }, + { + gtm: '20220318/194928', + mil: '781128.6', + hgt: '94', + spd: '73.8', + agl: '2', + lon: '67521060', + lat: '16015596' + }, + { + gtm: '20220318/194958', + mil: '781129.2', + hgt: '99', + spd: '71.6', + agl: '5', + lon: '67521489', + lat: '16018788' + }, + { + gtm: '20220318/195028', + mil: '781129.9', + hgt: '87', + spd: '90.4', + agl: '347', + lon: '67521142', + lat: '16022439' + }, + { + gtm: '20220318/195058', + mil: '781130.6', + hgt: '85', + spd: '84.9', + agl: '346', + lon: '67520062', + lat: '16026354' + }, + { + gtm: '20220318/195128', + mil: '781131.3', + hgt: '82', + spd: '82.1', + agl: '354', + lon: '67519167', + lat: '16030020' + }, + { + gtm: '20220318/195158', + mil: '781132.0', + hgt: '91', + spd: '79.1', + agl: '7', + lon: '67519371', + lat: '16033613' + }, + { + gtm: '20220318/195228', + mil: '781132.6', + hgt: '99', + spd: '78.5', + agl: '357', + lon: '67519626', + lat: '16037094' + }, + { + gtm: '20220318/195258', + mil: '781133.3', + hgt: '90', + spd: '85.2', + agl: '339', + lon: '67518769', + lat: '16040761' + }, + { + gtm: '20220318/195308', + mil: '781133.5', + hgt: '91', + spd: '84.2', + agl: '335', + lon: '67518207', + lat: '16041930' + }, + { + gtm: '20220318/195309', + mil: '781133.5', + hgt: '91', + spd: '84.1', + agl: '336', + lon: '67518147', + lat: '16042045' + }, + { + gtm: '20220318/195328', + mil: '781133.9', + hgt: '94', + spd: '79.3', + agl: '341', + lon: '67517134', + lat: '16044186' + }, + { + gtm: '20220318/195328', + mil: '781133.9', + hgt: '94', + spd: '79.3', + agl: '341', + lon: '67517134', + lat: '16044186' + }, + { + gtm: '20220318/195358', + mil: '781134.6', + hgt: '92', + spd: '79.3', + agl: '353', + lon: '67516410', + lat: '16047660' + }, + { + gtm: '20220318/195428', + mil: '781135.2', + hgt: '96', + spd: '75.4', + agl: '337', + lon: '67515455', + lat: '16051123' + }, + { + gtm: '20220318/195458', + mil: '781135.8', + hgt: '103', + spd: '66.1', + agl: '331', + lon: '67513788', + lat: '16053873' + }, + { + gtm: '20220318/195514', + mil: '781136.1', + hgt: '102', + spd: '71.0', + agl: '337', + lon: '67512967', + lat: '16055364' + }, + { + gtm: '20220318/195528', + mil: '781136.4', + hgt: '98', + spd: '78.0', + agl: '345', + lon: '67512396', + lat: '16056822' + }, + { + gtm: '20220318/195555', + mil: '781137.0', + hgt: '91', + spd: '78.8', + agl: '357', + lon: '67511923', + lat: '16059979' + }, + { + gtm: '20220318/195557', + mil: '781137.0', + hgt: '91', + spd: '78.6', + agl: '358', + lon: '67511913', + lat: '16060218' + }, + { + gtm: '20220318/195558', + mil: '781137.0', + hgt: '91', + spd: '78.6', + agl: '359', + lon: '67511910', + lat: '16060335' + }, + { + gtm: '20220318/195628', + mil: '781137.7', + hgt: '95', + spd: '78.1', + agl: '358', + lon: '67511754', + lat: '16063872' + }, + { + gtm: '20220318/195728', + mil: '781138.9', + hgt: '105', + spd: '71.0', + agl: '17', + lon: '67512123', + lat: '16070508' + }, + { + gtm: '20220318/195758', + mil: '781139.5', + hgt: '102', + spd: '76.7', + agl: '32', + lon: '67513665', + lat: '16073433' + }, + { + gtm: '20220318/195828', + mil: '781140.2', + hgt: '94', + spd: '84.3', + agl: '33', + lon: '67515885', + lat: '16076550' + }, + { + gtm: '20220318/195845', + mil: '781140.5', + hgt: '95', + spd: '80.5', + agl: '32', + lon: '67517149', + lat: '16078347' + }, + { + gtm: '20220318/195850', + mil: '781140.7', + hgt: '96', + spd: '77.9', + agl: '31', + lon: '67517495', + lat: '16078855' + }, + { + gtm: '20220318/195858', + mil: '781140.8', + hgt: '97', + spd: '66.8', + agl: '31', + lon: '67517992', + lat: '16079614' + }, + { + gtm: '20220318/195906', + mil: '781140.9', + hgt: '98', + spd: '43.9', + agl: '29', + lon: '67518355', + lat: '16080183' + }, + { + gtm: '20220318/195907', + mil: '781140.9', + hgt: '98', + spd: '42.3', + agl: '29', + lon: '67518390', + lat: '16080240' + }, + { + gtm: '20220318/195928', + mil: '781141.1', + hgt: '101', + spd: '19.1', + agl: '29', + lon: '67518948', + lat: '16081036' + }, + { + gtm: '20220318/195935', + mil: '781141.1', + hgt: '101', + spd: '7.8', + agl: '21', + lon: '67519003', + lat: '16081149' + }, + { + gtm: '20220318/195951', + mil: '781141.1', + hgt: '102', + spd: '0.0', + agl: '19', + lon: '67519017', + lat: '16081200' + }, + { + gtm: '20220318/195958', + mil: '781141.1', + hgt: '102', + spd: '6.5', + agl: '12', + lon: '67519032', + lat: '16081272' + }, + { + gtm: '20220318/200019', + mil: '781141.2', + hgt: '102', + spd: '9.9', + agl: '17', + lon: '67519092', + lat: '16081538' + }, + { + gtm: '20220318/200021', + mil: '781141.2', + hgt: '103', + spd: '9.5', + agl: '26', + lon: '67519104', + lat: '16081565' + }, + { + gtm: '20220318/200028', + mil: '781141.2', + hgt: '103', + spd: '7.1', + agl: '14', + lon: '67519133', + lat: '16081650' + }, + { + gtm: '20220318/200048', + mil: '781141.2', + hgt: '103', + spd: '0.0', + agl: '58', + lon: '67519206', + lat: '16081770' + }, + { + gtm: '20220318/200050', + mil: '781141.2', + hgt: '102', + spd: '0.0', + agl: '60', + lon: '67519241', + lat: '16081785' + }, + { + gtm: '20220318/200058', + mil: '781141.2', + hgt: '101', + spd: '5.6', + agl: '76', + lon: '67519316', + lat: '16081799' + }, + { + gtm: '20220318/200105', + mil: '781141.3', + hgt: '99', + spd: '6.8', + agl: '82', + lon: '67519384', + lat: '16081795' + }, + { + gtm: '20220318/200107', + mil: '781141.3', + hgt: '99', + spd: '7.0', + agl: '76', + lon: '67519407', + lat: '16081799' + }, + { + gtm: '20220318/200128', + mil: '781141.3', + hgt: '97', + spd: '5.9', + agl: '311', + lon: '67519422', + lat: '16081961' + }, + { + gtm: '20220318/200139', + mil: '781141.3', + hgt: '98', + spd: '5.6', + agl: '312', + lon: '67519324', + lat: '16082013' + }, + { + gtm: '20220318/200142', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '329', + lon: '67519309', + lat: '16082032' + }, + { + gtm: '20220318/200145', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200152', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200158', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200204', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200209', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200213', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200216', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200222', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200228', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200258', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200302', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '317', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200308', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/200808', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/201308', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/201808', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/202308', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/202808', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519306', + lat: '16082037' + }, + { + gtm: '20220318/203101', + mil: '781141.3', + hgt: '0', + spd: '0.0', + agl: '111', + lon: '67519384', + lat: '16081974' + }, + { + gtm: '20220318/203104', + mil: '781141.3', + hgt: '127', + spd: '0.0', + agl: '192', + lon: '67519377', + lat: '16081947' + }, + { + gtm: '20220318/203134', + mil: '781141.3', + hgt: '123', + spd: '0.0', + agl: '44', + lon: '67519384', + lat: '16081947' + }, + { + gtm: '20220318/203204', + mil: '781141.3', + hgt: '108', + spd: '0.0', + agl: '113', + lon: '67519390', + lat: '16081968' + }, + { + gtm: '20220318/203234', + mil: '781141.3', + hgt: '100', + spd: '0.0', + agl: '120', + lon: '67519390', + lat: '16081970' + }, + { + gtm: '20220318/203304', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203334', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203404', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203434', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203504', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203534', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203604', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203634', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203704', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203734', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203741', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '126', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/203747', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/204247', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/204747', + mil: '781141.3', + hgt: '98', + spd: '0.0', + agl: '0', + lon: '67519392', + lat: '16081974' + }, + { + gtm: '20220318/204948', + mil: '781141.4', + hgt: '0', + spd: '6.3', + agl: '338', + lon: '67519290', + lat: '16081966' + }, + { + gtm: '20220318/205012', + mil: '781141.4', + hgt: '77', + spd: '10.9', + agl: '21', + lon: '67519479', + lat: '16082266' + }, + { + gtm: '20220318/205036', + mil: '781141.6', + hgt: '94', + spd: '29.6', + agl: '10', + lon: '67519467', + lat: '16082977' + }, + { + gtm: '20220318/205042', + mil: '781141.6', + hgt: '95', + spd: '33.3', + agl: '13', + lon: '67519507', + lat: '16083256' + }, + { + gtm: '20220318/205042', + mil: '781141.6', + hgt: '95', + spd: '33.3', + agl: '13', + lon: '67519507', + lat: '16083256' + }, + { + gtm: '20220318/205112', + mil: '781142.0', + hgt: '88', + spd: '53.4', + agl: '6', + lon: '67519821', + lat: '16085229' + }, + { + gtm: '20220318/205142', + mil: '781142.5', + hgt: '83', + spd: '68.2', + agl: '1', + lon: '67519971', + lat: '16088044' + }, + { + gtm: '20220318/205212', + mil: '781143.1', + hgt: '85', + spd: '69.6', + agl: '2', + lon: '67520077', + lat: '16091226' + }, + { + gtm: '20220318/205242', + mil: '781143.6', + hgt: '84', + spd: '68.3', + agl: '2', + lon: '67520178', + lat: '16094296' + }, + { + gtm: '20220318/205312', + mil: '781144.3', + hgt: '78', + spd: '81.4', + agl: '359', + lon: '67520268', + lat: '16097695' + }, + { + gtm: '20220318/205339', + mil: '781144.9', + hgt: '77', + spd: '79.5', + agl: '346', + lon: '67519806', + lat: '16100994' + }, + { + gtm: '20220318/205341', + mil: '781144.9', + hgt: '77', + spd: '78.4', + agl: '345', + lon: '67519737', + lat: '16101225' + }, + { + gtm: '20220318/205342', + mil: '781144.9', + hgt: '77', + spd: '77.7', + agl: '344', + lon: '67519701', + lat: '16101337' + }, + { + gtm: '20220318/205343', + mil: '781145.0', + hgt: '78', + spd: '77.0', + agl: '343', + lon: '67519665', + lat: '16101448' + }, + { + gtm: '20220318/205412', + mil: '781145.6', + hgt: '85', + spd: '84.3', + agl: '329', + lon: '67518111', + lat: '16104573' + }, + { + gtm: '20220318/205419', + mil: '781145.8', + hgt: '84', + spd: '89.0', + agl: '327', + lon: '67517572', + lat: '16105349' + }, + { + gtm: '20220318/205420', + mil: '781145.8', + hgt: '84', + spd: '89.6', + agl: '327', + lon: '67517491', + lat: '16105464' + }, + { + gtm: '20220318/205424', + mil: '781145.9', + hgt: '83', + spd: '91.6', + agl: '327', + lon: '67517166', + lat: '16105929' + }, + { + gtm: '20220318/205424', + mil: '781145.9', + hgt: '83', + spd: '91.6', + agl: '327', + lon: '67517166', + lat: '16105929' + }, + { + gtm: '20220318/205442', + mil: '781146.3', + hgt: '81', + spd: '86.9', + agl: '327', + lon: '67515730', + lat: '16107981' + }, + { + gtm: '20220318/205512', + mil: '781147.0', + hgt: '75', + spd: '81.7', + agl: '334', + lon: '67513555', + lat: '16111248' + }, + { + gtm: '20220318/205542', + mil: '781147.7', + hgt: '76', + spd: '74.3', + agl: '337', + lon: '67512016', + lat: '16114536' + }, + { + gtm: '20220318/205542', + mil: '781147.7', + hgt: '76', + spd: '74.3', + agl: '337', + lon: '67512016', + lat: '16114536' + }, + { + gtm: '20220318/205612', + mil: '781148.3', + hgt: '82', + spd: '75.2', + agl: '342', + lon: '67510650', + lat: '16117647' + }, + { + gtm: '20220318/205642', + mil: '781148.9', + hgt: '66', + spd: '87.5', + agl: '354', + lon: '67509977', + lat: '16121214' + }, + { + gtm: '20220318/205642', + mil: '781148.9', + hgt: '66', + spd: '87.5', + agl: '354', + lon: '67509977', + lat: '16121214' + }, + { + gtm: '20220318/205712', + mil: '781149.6', + hgt: '62', + spd: '83.0', + agl: '354', + lon: '67509525', + lat: '16125171' + }, + { + gtm: '20220318/205812', + mil: '781150.9', + hgt: '71', + spd: '79.2', + agl: '9', + lon: '67509556', + lat: '16131993' + }, + { + gtm: '20220318/205842', + mil: '781151.5', + hgt: '64', + spd: '79.1', + agl: '9', + lon: '67510173', + lat: '16135512' + }, + { + gtm: '20220318/205912', + mil: '781152.2', + hgt: '59', + spd: '76.6', + agl: '9', + lon: '67510771', + lat: '16138973' + }, + { + gtm: '20220318/205942', + mil: '781152.8', + hgt: '59', + spd: '75.1', + agl: '351', + lon: '67510737', + lat: '16142439' + }, + { + gtm: '20220318/210012', + mil: '781153.4', + hgt: '58', + spd: '80.4', + agl: '341', + lon: '67509666', + lat: '16145715' + }, + { + gtm: '20220318/210042', + mil: '781154.1', + hgt: '65', + spd: '75.9', + agl: '341', + lon: '67508400', + lat: '16149087' + }, + { + gtm: '20220318/210107', + mil: '781154.6', + hgt: '73', + spd: '71.1', + agl: '342', + lon: '67507402', + lat: '16151747' + }, + { + gtm: '20220318/210112', + mil: '781154.7', + hgt: '75', + spd: '70.1', + agl: '341', + lon: '67507212', + lat: '16152250' + }, + { + gtm: '20220318/210142', + mil: '781155.3', + hgt: '78', + spd: '75.1', + agl: '332', + lon: '67505814', + lat: '16155205' + }, + { + gtm: '20220318/210212', + mil: '781155.9', + hgt: '77', + spd: '79.8', + agl: '330', + lon: '67503830', + lat: '16158314' + }, + { + gtm: '20220318/210242', + mil: '781156.5', + hgt: '84', + spd: '73.7', + agl: '337', + lon: '67502094', + lat: '16161343' + }, + { + gtm: '20220318/210242', + mil: '781156.5', + hgt: '84', + spd: '73.7', + agl: '337', + lon: '67502094', + lat: '16161343' + }, + { + gtm: '20220318/210312', + mil: '781157.1', + hgt: '83', + spd: '76.0', + agl: '340', + lon: '67500774', + lat: '16164462' + }, + { + gtm: '20220318/210342', + mil: '781157.8', + hgt: '87', + spd: '74.9', + agl: '332', + lon: '67499317', + lat: '16167642' + }, + { + gtm: '20220318/210412', + mil: '781158.4', + hgt: '90', + spd: '72.2', + agl: '326', + lon: '67497318', + lat: '16170412' + }, + { + gtm: '20220318/210442', + mil: '781159.0', + hgt: '86', + spd: '76.7', + agl: '326', + lon: '67495254', + lat: '16173126' + }, + { + gtm: '20220318/210512', + mil: '781159.6', + hgt: '78', + spd: '83.1', + agl: '326', + lon: '67492935', + lat: '16176178' + }, + { + gtm: '20220318/210542', + mil: '781160.3', + hgt: '84', + spd: '74.3', + agl: '336', + lon: '67490880', + lat: '16179177' + }, + { + gtm: '20220318/210612', + mil: '781160.9', + hgt: '88', + spd: '71.5', + agl: '354', + lon: '67489938', + lat: '16182318' + }, + { + gtm: '20220318/210642', + mil: '781161.4', + hgt: '91', + spd: '70.8', + agl: '355', + lon: '67489806', + lat: '16185552' + }, + { + gtm: '20220318/210712', + mil: '781162.1', + hgt: '89', + spd: '77.0', + agl: '341', + lon: '67489041', + lat: '16188867' + }, + { + gtm: '20220318/210742', + mil: '781162.7', + hgt: '86', + spd: '76.7', + agl: '326', + lon: '67487304', + lat: '16191925' + }, + { + gtm: '20220318/210812', + mil: '781163.4', + hgt: '88', + spd: '76.2', + agl: '323', + lon: '67484956', + lat: '16194750' + }, + { + gtm: '20220318/210842', + mil: '781163.9', + hgt: '92', + spd: '70.0', + agl: '328', + lon: '67482795', + lat: '16197430' + }, + { + gtm: '20220318/210912', + mil: '781164.5', + hgt: '93', + spd: '71.3', + agl: '339', + lon: '67481226', + lat: '16200247' + }, + { + gtm: '20220318/210942', + mil: '781165.1', + hgt: '91', + spd: '74.9', + agl: '351', + lon: '67480303', + lat: '16203369' + }, + { + gtm: '20220318/211012', + mil: '781165.7', + hgt: '92', + spd: '70.2', + agl: '2', + lon: '67480149', + lat: '16206761' + }, + { + gtm: '20220318/211042', + mil: '781166.3', + hgt: '102', + spd: '71.4', + agl: '357', + lon: '67480228', + lat: '16209868' + }, + { + gtm: '20220318/211112', + mil: '781166.9', + hgt: '100', + spd: '76.8', + agl: '346', + lon: '67479645', + lat: '16213323' + }, + { + gtm: '20220318/211142', + mil: '781167.5', + hgt: '105', + spd: '72.7', + agl: '344', + lon: '67478646', + lat: '16216470' + }, + { + gtm: '20220318/211212', + mil: '781168.1', + hgt: '102', + spd: '73.8', + agl: '344', + lon: '67477602', + lat: '16219705' + }, + { + gtm: '20220318/211242', + mil: '781168.7', + hgt: '112', + spd: '65.3', + agl: '354', + lon: '67476857', + lat: '16222668' + }, + { + gtm: '20220318/211312', + mil: '781169.3', + hgt: '117', + spd: '70.9', + agl: '7', + lon: '67476892', + lat: '16225749' + }, + { + gtm: '20220318/211342', + mil: '781169.9', + hgt: '118', + spd: '76.3', + agl: '12', + lon: '67477698', + lat: '16229028' + }, + { + gtm: '20220318/211412', + mil: '781170.5', + hgt: '120', + spd: '73.8', + agl: '357', + lon: '67478025', + lat: '16232400' + }, + { + gtm: '20220318/211442', + mil: '781171.1', + hgt: '113', + spd: '76.2', + agl: '340', + lon: '67477258', + lat: '16235758' + }, + { + gtm: '20220318/211512', + mil: '781171.7', + hgt: '116', + spd: '69.1', + agl: '336', + lon: '67475854', + lat: '16238749' + }, + { + gtm: '20220318/211542', + mil: '781172.3', + hgt: '108', + spd: '76.6', + agl: '344', + lon: '67474566', + lat: '16241854' + }, + { + gtm: '20220318/211612', + mil: '781172.9', + hgt: '112', + spd: '70.2', + agl: '354', + lon: '67473916', + lat: '16245157' + }, + { + gtm: '20220318/211642', + mil: '781173.5', + hgt: '112', + spd: '72.3', + agl: '355', + lon: '67473604', + lat: '16248258' + }, + { + gtm: '20220318/211712', + mil: '781174.1', + hgt: '100', + spd: '80.5', + agl: '355', + lon: '67473233', + lat: '16251783' + }, + { + gtm: '20220318/211742', + mil: '781174.7', + hgt: '98', + spd: '77.9', + agl: '355', + lon: '67472863', + lat: '16255273' + }, + { + gtm: '20220318/211812', + mil: '781175.4', + hgt: '101', + spd: '72.7', + agl: '3', + lon: '67472733', + lat: '16258800' + }, + { + gtm: '20220318/211812', + mil: '781175.4', + hgt: '101', + spd: '72.7', + agl: '3', + lon: '67472733', + lat: '16258800' + }, + { + gtm: '20220318/211842', + mil: '781176.0', + hgt: '105', + spd: '72.2', + agl: '10', + lon: '67473186', + lat: '16261939' + }, + { + gtm: '20220318/211842', + mil: '781176.0', + hgt: '105', + spd: '72.2', + agl: '10', + lon: '67473186', + lat: '16261939' + }, + { + gtm: '20220318/211912', + mil: '781176.6', + hgt: '99', + spd: '80.3', + agl: '11', + lon: '67473877', + lat: '16265307' + }, + { + gtm: '20220318/211912', + mil: '781176.6', + hgt: '99', + spd: '80.3', + agl: '11', + lon: '67473877', + lat: '16265307' + }, + { + gtm: '20220318/211942', + mil: '781177.3', + hgt: '95', + spd: '84.2', + agl: '11', + lon: '67474635', + lat: '16268998' + }, + { + gtm: '20220318/212012', + mil: '781178.0', + hgt: '99', + spd: '78.5', + agl: '26', + lon: '67475919', + lat: '16272577' + }, + { + gtm: '20220318/212012', + mil: '781178.0', + hgt: '99', + spd: '78.5', + agl: '26', + lon: '67475919', + lat: '16272577' + }, + { + gtm: '20220318/212042', + mil: '781178.6', + hgt: '99', + spd: '81.3', + agl: '25', + lon: '67477666', + lat: '16275699' + }, + { + gtm: '20220318/212042', + mil: '781178.6', + hgt: '99', + spd: '81.3', + agl: '25', + lon: '67477666', + lat: '16275699' + }, + { + gtm: '20220318/212112', + mil: '781179.3', + hgt: '101', + spd: '76.7', + agl: '5', + lon: '67478629', + lat: '16279198' + }, + { + gtm: '20220318/212112', + mil: '781179.3', + hgt: '101', + spd: '76.7', + agl: '5', + lon: '67478629', + lat: '16279198' + }, + { + gtm: '20220318/212142', + mil: '781179.9', + hgt: '96', + spd: '83.0', + agl: '6', + lon: '67478995', + lat: '16282717' + }, + { + gtm: '20220318/212212', + mil: '781180.6', + hgt: '89', + spd: '81.4', + agl: '10', + lon: '67479513', + lat: '16286421' + }, + { + gtm: '20220318/212242', + mil: '781181.2', + hgt: '91', + spd: '72.1', + agl: '14', + lon: '67480386', + lat: '16289856' + }, + { + gtm: '20220318/212242', + mil: '781181.2', + hgt: '91', + spd: '72.1', + agl: '14', + lon: '67480386', + lat: '16289856' + }, + { + gtm: '20220318/212312', + mil: '781181.8', + hgt: '103', + spd: '65.4', + agl: '14', + lon: '67481206', + lat: '16292811' + }, + { + gtm: '20220318/212312', + mil: '781181.8', + hgt: '103', + spd: '65.4', + agl: '14', + lon: '67481206', + lat: '16292811' + }, + { + gtm: '20220318/212342', + mil: '781182.3', + hgt: '108', + spd: '71.4', + agl: '3', + lon: '67481670', + lat: '16295818' + }, + { + gtm: '20220318/212342', + mil: '781182.3', + hgt: '108', + spd: '71.4', + agl: '3', + lon: '67481670', + lat: '16295818' + }, + { + gtm: '20220318/212412', + mil: '781183.0', + hgt: '105', + spd: '76.8', + agl: '358', + lon: '67481607', + lat: '16299204' + }, + { + gtm: '20220318/212412', + mil: '781183.0', + hgt: '105', + spd: '76.8', + agl: '358', + lon: '67481607', + lat: '16299204' + }, + { + gtm: '20220318/212442', + mil: '781183.5', + hgt: '107', + spd: '71.3', + agl: '359', + lon: '67481489', + lat: '16302501' + }, + { + gtm: '20220318/212442', + mil: '781183.5', + hgt: '107', + spd: '71.3', + agl: '359', + lon: '67481489', + lat: '16302501' + }, + { + gtm: '20220318/212442', + mil: '781183.5', + hgt: '107', + spd: '71.3', + agl: '359', + lon: '67481489', + lat: '16302501' + }, + { + gtm: '20220318/212512', + mil: '781184.2', + hgt: '96', + spd: '80.1', + agl: '10', + lon: '67481757', + lat: '16305910' + }, + { + gtm: '20220318/212512', + mil: '781184.2', + hgt: '96', + spd: '80.1', + agl: '10', + lon: '67481757', + lat: '16305910' + }, + { + gtm: '20220318/212512', + mil: '781184.2', + hgt: '96', + spd: '80.1', + agl: '10', + lon: '67481757', + lat: '16305910' + }, + { + gtm: '20220318/212542', + mil: '781184.8', + hgt: '94', + spd: '72.8', + agl: '20', + lon: '67482774', + lat: '16309243' + }, + { + gtm: '20220318/212542', + mil: '781184.8', + hgt: '94', + spd: '72.8', + agl: '20', + lon: '67482774', + lat: '16309243' + }, + { + gtm: '20220318/212542', + mil: '781184.8', + hgt: '94', + spd: '72.8', + agl: '20', + lon: '67482774', + lat: '16309243' + }, + { + gtm: '20220318/212612', + mil: '781185.4', + hgt: '103', + spd: '64.4', + agl: '20', + lon: '67483935', + lat: '16312172' + }, + { + gtm: '20220318/212612', + mil: '781185.4', + hgt: '103', + spd: '64.4', + agl: '20', + lon: '67483935', + lat: '16312172' + }, + { + gtm: '20220318/212642', + mil: '781185.9', + hgt: '107', + spd: '66.8', + agl: '20', + lon: '67485013', + lat: '16314888' + }, + { + gtm: '20220318/212712', + mil: '781186.5', + hgt: '102', + spd: '76.4', + agl: '14', + lon: '67486083', + lat: '16318011' + }, + { + gtm: '20220318/212712', + mil: '781186.5', + hgt: '102', + spd: '76.4', + agl: '14', + lon: '67486083', + lat: '16318011' + }, + { + gtm: '20220318/212742', + mil: '781187.1', + hgt: '97', + spd: '74.7', + agl: '9', + lon: '67486810', + lat: '16321341' + }, + { + gtm: '20220318/212742', + mil: '781187.1', + hgt: '97', + spd: '74.7', + agl: '9', + lon: '67486810', + lat: '16321341' + }, + { + gtm: '20220318/212812', + mil: '781187.7', + hgt: '103', + spd: '69.7', + agl: '8', + lon: '67487340', + lat: '16324642' + }, + { + gtm: '20220318/212812', + mil: '781187.7', + hgt: '103', + spd: '69.7', + agl: '8', + lon: '67487340', + lat: '16324642' + }, + { + gtm: '20220318/212842', + mil: '781188.3', + hgt: '112', + spd: '65.7', + agl: '9', + lon: '67487829', + lat: '16327630' + }, + { + gtm: '20220318/212912', + mil: '781188.8', + hgt: '115', + spd: '65.3', + agl: '25', + lon: '67488786', + lat: '16330428' + }, + { + gtm: '20220318/212942', + mil: '781189.3', + hgt: '121', + spd: '68.7', + agl: '38', + lon: '67490633', + lat: '16332919' + }, + { + gtm: '20220318/212942', + mil: '781189.3', + hgt: '121', + spd: '68.7', + agl: '38', + lon: '67490633', + lat: '16332919' + }, + { + gtm: '20220318/213012', + mil: '781189.9', + hgt: '122', + spd: '67.5', + agl: '38', + lon: '67492731', + lat: '16335301' + }, + { + gtm: '20220318/213042', + mil: '781190.5', + hgt: '123', + spd: '75.6', + agl: '38', + lon: '67494956', + lat: '16337832' + }, + { + gtm: '20220318/213112', + mil: '781191.1', + hgt: '128', + spd: '68.9', + agl: '38', + lon: '67497243', + lat: '16340449' + }, + { + gtm: '20220318/213112', + mil: '781191.1', + hgt: '128', + spd: '68.9', + agl: '38', + lon: '67497243', + lat: '16340449' + }, + { + gtm: '20220318/213142', + mil: '781191.6', + hgt: '131', + spd: '69.9', + agl: '35', + lon: '67499267', + lat: '16342866' + }, + { + gtm: '20220318/213142', + mil: '781191.6', + hgt: '131', + spd: '69.9', + agl: '35', + lon: '67499267', + lat: '16342866' + }, + { + gtm: '20220318/213212', + mil: '781192.2', + hgt: '132', + spd: '69.4', + agl: '33', + lon: '67501281', + lat: '16345587' + }, + { + gtm: '20220318/213212', + mil: '781192.2', + hgt: '132', + spd: '69.4', + agl: '33', + lon: '67501281', + lat: '16345587' + }, + { + gtm: '20220318/213242', + mil: '781192.8', + hgt: '142', + spd: '66.9', + agl: '33', + lon: '67503087', + lat: '16348071' + }, + { + gtm: '20220318/213242', + mil: '781192.8', + hgt: '142', + spd: '66.9', + agl: '33', + lon: '67503087', + lat: '16348071' + }, + { + gtm: '20220318/213312', + mil: '781193.4', + hgt: '143', + spd: '75.2', + agl: '33', + lon: '67505115', + lat: '16350856' + }, + { + gtm: '20220318/213312', + mil: '781193.4', + hgt: '143', + spd: '75.2', + agl: '33', + lon: '67505115', + lat: '16350856' + }, + { + gtm: '20220318/213342', + mil: '781194.0', + hgt: '139', + spd: '73.2', + agl: '45', + lon: '67507365', + lat: '16353408' + }, + { + gtm: '20220318/213412', + mil: '781194.6', + hgt: '135', + spd: '72.2', + agl: '34', + lon: '67509974', + lat: '16355929' + }, + { + gtm: '20220318/213442', + mil: '781195.1', + hgt: '152', + spd: '62.8', + agl: '12', + lon: '67511242', + lat: '16358629' + }, + { + gtm: '20220318/213512', + mil: '781195.7', + hgt: '155', + spd: '68.1', + agl: '9', + lon: '67511619', + lat: '16361580' + }, + { + gtm: '20220318/213512', + mil: '781195.7', + hgt: '155', + spd: '68.1', + agl: '9', + lon: '67511619', + lat: '16361580' + }, + { + gtm: '20220318/213542', + mil: '781196.2', + hgt: '160', + spd: '64.3', + agl: '32', + lon: '67512795', + lat: '16364377' + }, + { + gtm: '20220318/213612', + mil: '781196.8', + hgt: '153', + spd: '74.2', + agl: '50', + lon: '67515142', + lat: '16366628' + }, + { + gtm: '20220318/213642', + mil: '781197.4', + hgt: '145', + spd: '76.9', + agl: '45', + lon: '67518049', + lat: '16368885' + }, + { + gtm: '20220318/213712', + mil: '781198.0', + hgt: '142', + spd: '78.4', + agl: '26', + lon: '67520334', + lat: '16371721' + }, + { + gtm: '20220318/213742', + mil: '781198.7', + hgt: '127', + spd: '88.5', + agl: '5', + lon: '67521378', + lat: '16375414' + }, + { + gtm: '20220318/213812', + mil: '781199.4', + hgt: '130', + spd: '80.6', + agl: '10', + lon: '67521693', + lat: '16379125' + }, + { + gtm: '20220318/213812', + mil: '781199.4', + hgt: '130', + spd: '80.6', + agl: '10', + lon: '67521693', + lat: '16379125' + }, + { + gtm: '20220318/213842', + mil: '781200.1', + hgt: '127', + spd: '80.0', + agl: '30', + lon: '67523058', + lat: '16382527' + }, + { + gtm: '20220318/213842', + mil: '781200.1', + hgt: '127', + spd: '80.0', + agl: '30', + lon: '67523058', + lat: '16382527' + }, + { + gtm: '20220318/213912', + mil: '781200.7', + hgt: '132', + spd: '77.5', + agl: '46', + lon: '67525465', + lat: '16385171' + }, + { + gtm: '20220318/213942', + mil: '781201.4', + hgt: '108', + spd: '92.4', + agl: '47', + lon: '67528654', + lat: '16387854' + }, + { + gtm: '20220318/214012', + mil: '781202.1', + hgt: '115', + spd: '83.2', + agl: '41', + lon: '67531704', + lat: '16390587' + }, + { + gtm: '20220318/214036', + mil: '781202.7', + hgt: '117', + spd: '86.5', + agl: '32', + lon: '67533696', + lat: '16393026' + }, + { + gtm: '20220318/214036', + mil: '781202.7', + hgt: '117', + spd: '86.5', + agl: '32', + lon: '67533696', + lat: '16393026' + }, + { + gtm: '20220318/214042', + mil: '781202.8', + hgt: '116', + spd: '89.5', + agl: '29', + lon: '67534140', + lat: '16393716' + }, + { + gtm: '20220318/214108', + mil: '781203.4', + hgt: '112', + spd: '90.7', + agl: '24', + lon: '67535865', + lat: '16396935' + }, + { + gtm: '20220318/214111', + mil: '781203.5', + hgt: '112', + spd: '90.8', + agl: '24', + lon: '67536051', + lat: '16397310' + }, + { + gtm: '20220318/214112', + mil: '781203.5', + hgt: '112', + spd: '90.7', + agl: '25', + lon: '67536114', + lat: '16397434' + }, + { + gtm: '20220318/214142', + mil: '781204.3', + hgt: '108', + spd: '90.0', + agl: '24', + lon: '67537941', + lat: '16401136' + }, + { + gtm: '20220318/214212', + mil: '781205.0', + hgt: '117', + spd: '80.7', + agl: '23', + lon: '67539673', + lat: '16404667' + }, + { + gtm: '20220318/214242', + mil: '781205.6', + hgt: '117', + spd: '83.7', + agl: '27', + lon: '67541352', + lat: '16407984' + }, + { + gtm: '20220318/214309', + mil: '781206.3', + hgt: '112', + spd: '89.7', + agl: '36', + lon: '67543366', + lat: '16411017' + }, + { + gtm: '20220318/214310', + mil: '781206.3', + hgt: '112', + spd: '89.9', + agl: '36', + lon: '67543454', + lat: '16411127' + }, + { + gtm: '20220318/214312', + mil: '781206.4', + hgt: '112', + spd: '90.1', + agl: '38', + lon: '67543639', + lat: '16411342' + }, + { + gtm: '20220318/214342', + mil: '781207.1', + hgt: '106', + spd: '88.0', + agl: '45', + lon: '67546534', + lat: '16414328' + }, + { + gtm: '20220318/214343', + mil: '781207.1', + hgt: '105', + spd: '88.4', + agl: '46', + lon: '67546641', + lat: '16414422' + }, + { + gtm: '20220318/214343', + mil: '781207.1', + hgt: '105', + spd: '88.4', + agl: '46', + lon: '67546641', + lat: '16414422' + }, + { + gtm: '20220318/214400', + mil: '781207.5', + hgt: '99', + spd: '90.1', + agl: '49', + lon: '67548540', + lat: '16415973' + }, + { + gtm: '20220318/214411', + mil: '781207.8', + hgt: '97', + spd: '87.1', + agl: '49', + lon: '67549797', + lat: '16416919' + }, + { + gtm: '20220318/214412', + mil: '781207.8', + hgt: '97', + spd: '86.9', + agl: '49', + lon: '67549908', + lat: '16417005' + }, + { + gtm: '20220318/214442', + mil: '781208.5', + hgt: '100', + spd: '79.6', + agl: '44', + lon: '67552981', + lat: '16419459' + }, + { + gtm: '20220318/214442', + mil: '781208.5', + hgt: '100', + spd: '79.6', + agl: '44', + lon: '67552981', + lat: '16419459' + }, + { + gtm: '20220318/214512', + mil: '781209.1', + hgt: '92', + spd: '83.5', + agl: '35', + lon: '67555630', + lat: '16422305' + }, + { + gtm: '20220318/214512', + mil: '781209.1', + hgt: '92', + spd: '83.5', + agl: '35', + lon: '67555630', + lat: '16422305' + }, + { + gtm: '20220318/214512', + mil: '781209.1', + hgt: '92', + spd: '83.5', + agl: '35', + lon: '67555630', + lat: '16422305' + }, + { + gtm: '20220318/214542', + mil: '781209.9', + hgt: '83', + spd: '87.6', + agl: '25', + lon: '67557780', + lat: '16425667' + }, + { + gtm: '20220318/214612', + mil: '781210.6', + hgt: '86', + spd: '86.7', + agl: '14', + lon: '67559247', + lat: '16429380' + }, + { + gtm: '20220318/214642', + mil: '781211.3', + hgt: '93', + spd: '80.4', + agl: '5', + lon: '67559917', + lat: '16433132' + }, + { + gtm: '20220318/214712', + mil: '781211.9', + hgt: '100', + spd: '71.5', + agl: '6', + lon: '67560126', + lat: '16436521' + }, + { + gtm: '20220318/214742', + mil: '781212.5', + hgt: '97', + spd: '80.3', + agl: '10', + lon: '67560620', + lat: '16439865' + }, + { + gtm: '20220318/214758', + mil: '781212.9', + hgt: '93', + spd: '84.0', + agl: '14', + lon: '67561095', + lat: '16441797' + }, + { + gtm: '20220318/214801', + mil: '781212.9', + hgt: '92', + spd: '84.1', + agl: '14', + lon: '67561200', + lat: '16442164' + }, + { + gtm: '20220318/214812', + mil: '781213.2', + hgt: '86', + spd: '84.4', + agl: '16', + lon: '67561623', + lat: '16443510' + }, + { + gtm: '20220318/214833', + mil: '781213.7', + hgt: '85', + spd: '82.5', + agl: '19', + lon: '67562562', + lat: '16445997' + }, + { + gtm: '20220318/214833', + mil: '781213.7', + hgt: '85', + spd: '82.5', + agl: '19', + lon: '67562562', + lat: '16445997' + }, + { + gtm: '20220318/214842', + mil: '781213.9', + hgt: '89', + spd: '84.0', + agl: '19', + lon: '67562962', + lat: '16447059' + }, + { + gtm: '20220318/214912', + mil: '781214.6', + hgt: '94', + spd: '83.9', + agl: '20', + lon: '67564383', + lat: '16450650' + }, + { + gtm: '20220318/214921', + mil: '781214.8', + hgt: '96', + spd: '82.9', + agl: '20', + lon: '67564802', + lat: '16451712' + }, + { + gtm: '20220318/214923', + mil: '781214.8', + hgt: '96', + spd: '82.9', + agl: '20', + lon: '67564899', + lat: '16451946' + }, + { + gtm: '20220318/214942', + mil: '781215.2', + hgt: '98', + spd: '79.1', + agl: '24', + lon: '67565820', + lat: '16454094' + }, + { + gtm: '20220318/215012', + mil: '781215.9', + hgt: '96', + spd: '84.4', + agl: '41', + lon: '67568026', + lat: '16457214' + }, + { + gtm: '20220318/215012', + mil: '781215.9', + hgt: '96', + spd: '84.4', + agl: '41', + lon: '67568026', + lat: '16457214' + }, + { + gtm: '20220318/215042', + mil: '781216.6', + hgt: '97', + spd: '84.7', + agl: '43', + lon: '67571031', + lat: '16459867' + }, + { + gtm: '20220318/215042', + mil: '781216.6', + hgt: '97', + spd: '84.7', + agl: '43', + lon: '67571031', + lat: '16459867' + }, + { + gtm: '20220318/215112', + mil: '781217.3', + hgt: '93', + spd: '87.1', + agl: '25', + lon: '67573438', + lat: '16463068' + }, + { + gtm: '20220318/215142', + mil: '781218.0', + hgt: '83', + spd: '86.4', + agl: '6', + lon: '67574577', + lat: '16466892' + }, + { + gtm: '20220318/215212', + mil: '781218.7', + hgt: '89', + spd: '79.2', + agl: '359', + lon: '67574599', + lat: '16470609' + }, + { + gtm: '20220318/215242', + mil: '781219.3', + hgt: '86', + spd: '84.2', + agl: '359', + lon: '67574526', + lat: '16474260' + }, + { + gtm: '20220318/215312', + mil: '781220.1', + hgt: '73', + spd: '89.5', + agl: '8', + lon: '67574715', + lat: '16478276' + }, + { + gtm: '20220318/215336', + mil: '781220.7', + hgt: '73', + spd: '86.5', + agl: '18', + lon: '67575525', + lat: '16481403' + }, + { + gtm: '20220318/215336', + mil: '781220.7', + hgt: '73', + spd: '86.5', + agl: '18', + lon: '67575525', + lat: '16481403' + }, + { + gtm: '20220318/215342', + mil: '781220.8', + hgt: '74', + spd: '86.9', + agl: '19', + lon: '67575801', + lat: '16482147' + }, + { + gtm: '20220318/215342', + mil: '781220.8', + hgt: '74', + spd: '86.9', + agl: '19', + lon: '67575801', + lat: '16482147' + }, + { + gtm: '20220318/215412', + mil: '781221.5', + hgt: '87', + spd: '79.9', + agl: '32', + lon: '67577661', + lat: '16485504' + }, + { + gtm: '20220318/215416', + mil: '781221.6', + hgt: '87', + spd: '78.7', + agl: '34', + lon: '67577949', + lat: '16485901' + }, + { + gtm: '20220318/215418', + mil: '781221.6', + hgt: '87', + spd: '78.9', + agl: '34', + lon: '67578096', + lat: '16486098' + }, + { + gtm: '20220318/215442', + mil: '781222.1', + hgt: '81', + spd: '84.5', + agl: '43', + lon: '67580205', + lat: '16488363' + }, + { + gtm: '20220318/215512', + mil: '781222.8', + hgt: '87', + spd: '72.5', + agl: '45', + lon: '67583041', + lat: '16490784' + }, + { + gtm: '20220318/215542', + mil: '781223.4', + hgt: '94', + spd: '73.7', + agl: '37', + lon: '67585428', + lat: '16493208' + }, + { + gtm: '20220318/215612', + mil: '781224.0', + hgt: '87', + spd: '80.8', + agl: '30', + lon: '67587475', + lat: '16496133' + }, + { + gtm: '20220318/215642', + mil: '781224.7', + hgt: '89', + spd: '80.6', + agl: '31', + lon: '67589604', + lat: '16499389' + }, + { + gtm: '20220318/215710', + mil: '781225.3', + hgt: '92', + spd: '85.9', + agl: '39', + lon: '67591710', + lat: '16502199' + }, + { + gtm: '20220318/215712', + mil: '781225.3', + hgt: '91', + spd: '87.8', + agl: '38', + lon: '67591891', + lat: '16502404' + }, + { + gtm: '20220318/215742', + mil: '781226.1', + hgt: '89', + spd: '89.0', + agl: '34', + lon: '67594768', + lat: '16505646' + }, + { + gtm: '20220318/215812', + mil: '781226.8', + hgt: '92', + spd: '90.4', + agl: '22', + lon: '67596811', + lat: '16509108' + }, + { + gtm: '20220318/215813', + mil: '781226.8', + hgt: '92', + spd: '90.6', + agl: '21', + lon: '67596867', + lat: '16509235' + }, + { + gtm: '20220318/215814', + mil: '781226.9', + hgt: '91', + spd: '90.8', + agl: '21', + lon: '67596921', + lat: '16509362' + }, + { + gtm: '20220318/215819', + mil: '781227.0', + hgt: '89', + spd: '91.8', + agl: '20', + lon: '67597188', + lat: '16510006' + }, + { + gtm: '20220318/215842', + mil: '781227.6', + hgt: '83', + spd: '95.4', + agl: '16', + lon: '67598268', + lat: '16513137' + }, + { + gtm: '20220318/215847', + mil: '781227.7', + hgt: '84', + spd: '94.2', + agl: '16', + lon: '67598493', + lat: '16513821' + }, + { + gtm: '20220318/215852', + mil: '781227.8', + hgt: '87', + spd: '91.8', + agl: '17', + lon: '67598716', + lat: '16514488' + }, + { + gtm: '20220318/215912', + mil: '781228.3', + hgt: '92', + spd: '90.7', + agl: '26', + lon: '67599793', + lat: '16516981' + }, + { + gtm: '20220318/215942', + mil: '781229.1', + hgt: '92', + spd: '88.5', + agl: '42', + lon: '67602375', + lat: '16520342' + }, + { + gtm: '20220318/215956', + mil: '781229.4', + hgt: '89', + spd: '87.4', + agl: '43', + lon: '67603782', + lat: '16521698' + }, + { + gtm: '20220318/215956', + mil: '781229.4', + hgt: '89', + spd: '87.4', + agl: '43', + lon: '67603782', + lat: '16521698' + }, + { + gtm: '20220318/220012', + mil: '781229.8', + hgt: '88', + spd: '90.3', + agl: '36', + lon: '67605306', + lat: '16523370' + }, + { + gtm: '20220318/220040', + mil: '781230.5', + hgt: '86', + spd: '93.5', + agl: '21', + lon: '67607260', + lat: '16526785' + }, + { + gtm: '20220318/220040', + mil: '781230.5', + hgt: '86', + spd: '93.5', + agl: '21', + lon: '67607260', + lat: '16526785' + }, + { + gtm: '20220318/220042', + mil: '781230.6', + hgt: '86', + spd: '94.2', + agl: '20', + lon: '67607370', + lat: '16527051' + }, + { + gtm: '20220318/220042', + mil: '781230.6', + hgt: '86', + spd: '94.2', + agl: '20', + lon: '67607370', + lat: '16527051' + }, + { + gtm: '20220318/220112', + mil: '781231.3', + hgt: '83', + spd: '84.5', + agl: '28', + lon: '67609185', + lat: '16530864' + }, + { + gtm: '20220318/220112', + mil: '781231.3', + hgt: '83', + spd: '84.5', + agl: '28', + lon: '67609185', + lat: '16530864' + }, + { + gtm: '20220318/220128', + mil: '781231.7', + hgt: '81', + spd: '87.0', + agl: '35', + lon: '67610388', + lat: '16532599' + }, + { + gtm: '20220318/220142', + mil: '781232.0', + hgt: '82', + spd: '87.4', + agl: '40', + lon: '67611627', + lat: '16534062' + }, + { + gtm: '20220318/220158', + mil: '781232.4', + hgt: '84', + spd: '87.0', + agl: '41', + lon: '67613167', + lat: '16535643' + }, + { + gtm: '20220318/220200', + mil: '781232.4', + hgt: '84', + spd: '87.1', + agl: '41', + lon: '67613361', + lat: '16535838' + }, + { + gtm: '20220318/220212', + mil: '781232.7', + hgt: '86', + spd: '84.7', + agl: '37', + lon: '67614480', + lat: '16537033' + }, + { + gtm: '20220318/220212', + mil: '781232.7', + hgt: '86', + spd: '84.7', + agl: '37', + lon: '67614480', + lat: '16537033' + }, + { + gtm: '20220318/220238', + mil: '781233.3', + hgt: '90', + spd: '86.1', + agl: '27', + lon: '67616428', + lat: '16539852' + }, + { + gtm: '20220318/220242', + mil: '781233.4', + hgt: '89', + spd: '87.5', + agl: '26', + lon: '67616694', + lat: '16540317' + }, + { + gtm: '20220318/220244', + mil: '781233.5', + hgt: '89', + spd: '87.9', + agl: '27', + lon: '67616826', + lat: '16540554' + }, + { + gtm: '20220318/220302', + mil: '781233.9', + hgt: '79', + spd: '92.5', + agl: '28', + lon: '67618029', + lat: '16542750' + }, + { + gtm: '20220318/220308', + mil: '781234.1', + hgt: '76', + spd: '92.0', + agl: '31', + lon: '67618492', + lat: '16543476' + }, + { + gtm: '20220318/220312', + mil: '781234.2', + hgt: '75', + spd: '91.2', + agl: '34', + lon: '67618827', + lat: '16543937' + }, + { + gtm: '20220318/220342', + mil: '781234.9', + hgt: '73', + spd: '89.0', + agl: '50', + lon: '67621788', + lat: '16546875' + }, + { + gtm: '20220318/220412', + mil: '781235.6', + hgt: '81', + spd: '75.9', + agl: '53', + lon: '67625169', + lat: '16549135' + }, + { + gtm: '20220318/220412', + mil: '781235.6', + hgt: '81', + spd: '75.9', + agl: '53', + lon: '67625169', + lat: '16549135' + }, + { + gtm: '20220318/220442', + mil: '781236.2', + hgt: '79', + spd: '84.9', + agl: '45', + lon: '67628347', + lat: '16551514' + }, + { + gtm: '20220318/220512', + mil: '781236.9', + hgt: '68', + spd: '89.2', + agl: '33', + lon: '67631061', + lat: '16554567' + }, + { + gtm: '20220318/220542', + mil: '781237.7', + hgt: '66', + spd: '87.2', + agl: '23', + lon: '67633054', + lat: '16558116' + }, + { + gtm: '20220318/220612', + mil: '781238.3', + hgt: '82', + spd: '78.8', + agl: '24', + lon: '67634727', + lat: '16561590' + }, + { + gtm: '20220318/220642', + mil: '781239.0', + hgt: '77', + spd: '91.1', + agl: '36', + lon: '67636849', + lat: '16564872' + }, + { + gtm: '20220318/220653', + mil: '781239.3', + hgt: '74', + spd: '89.3', + agl: '41', + lon: '67637908', + lat: '16566030' + }, + { + gtm: '20220318/220709', + mil: '781239.7', + hgt: '71', + spd: '91.2', + agl: '42', + lon: '67639518', + lat: '16567638' + }, + { + gtm: '20220318/220712', + mil: '781239.8', + hgt: '70', + spd: '90.9', + agl: '43', + lon: '67639830', + lat: '16567938' + }, + { + gtm: '20220318/220713', + mil: '781239.8', + hgt: '70', + spd: '90.7', + agl: '43', + lon: '67639933', + lat: '16568038' + }, + { + gtm: '20220318/220722', + mil: '781240.0', + hgt: '68', + spd: '89.6', + agl: '40', + lon: '67640831', + lat: '16568952' + }, + { + gtm: '20220318/220724', + mil: '781240.1', + hgt: '68', + spd: '89.3', + agl: '39', + lon: '67641022', + lat: '16569159' + }, + { + gtm: '20220318/220742', + mil: '781240.5', + hgt: '65', + spd: '92.7', + agl: '31', + lon: '67642597', + lat: '16571151' + }, + { + gtm: '20220318/220742', + mil: '781240.5', + hgt: '65', + spd: '92.7', + agl: '31', + lon: '67642597', + lat: '16571151' + }, + { + gtm: '20220318/220812', + mil: '781241.3', + hgt: '72', + spd: '88.8', + agl: '38', + lon: '67645139', + lat: '16574690' + }, + { + gtm: '20220318/220825', + mil: '781241.6', + hgt: '73', + spd: '90.9', + agl: '42', + lon: '67646401', + lat: '16576014' + }, + { + gtm: '20220318/220827', + mil: '781241.7', + hgt: '73', + spd: '91.8', + agl: '43', + lon: '67646610', + lat: '16576216' + }, + { + gtm: '20220318/220842', + mil: '781242.0', + hgt: '71', + spd: '95.4', + agl: '43', + lon: '67648233', + lat: '16577764' + }, + { + gtm: '20220318/220912', + mil: '781242.8', + hgt: '81', + spd: '87.4', + agl: '34', + lon: '67651170', + lat: '16580899' + }, + { + gtm: '20220318/220912', + mil: '781242.8', + hgt: '81', + spd: '87.4', + agl: '34', + lon: '67651170', + lat: '16580899' + }, + { + gtm: '20220318/220942', + mil: '781243.5', + hgt: '77', + spd: '89.5', + agl: '21', + lon: '67653150', + lat: '16584331' + }, + { + gtm: '20220318/221012', + mil: '781244.3', + hgt: '76', + spd: '94.2', + agl: '6', + lon: '67654241', + lat: '16588429' + }, + { + gtm: '20220318/221015', + mil: '781244.3', + hgt: '77', + spd: '94.6', + agl: '5', + lon: '67654285', + lat: '16588854' + }, + { + gtm: '20220318/221018', + mil: '781244.4', + hgt: '78', + spd: '93.8', + agl: '3', + lon: '67654317', + lat: '16589277' + }, + { + gtm: '20220318/221040', + mil: '781245.0', + hgt: '88', + spd: '91.0', + agl: '2', + lon: '67654423', + lat: '16592426' + }, + { + gtm: '20220318/221042', + mil: '781245.0', + hgt: '90', + spd: '89.4', + agl: '2', + lon: '67654432', + lat: '16592696' + }, + { + gtm: '20220318/221112', + mil: '781245.7', + hgt: '100', + spd: '86.5', + agl: '2', + lon: '67654563', + lat: '16596487' + }, + { + gtm: '20220318/221136', + mil: '781246.3', + hgt: '89', + spd: '93.9', + agl: '18', + lon: '67655212', + lat: '16599711' + }, + { + gtm: '20220318/221139', + mil: '781246.4', + hgt: '87', + spd: '94.5', + agl: '19', + lon: '67655365', + lat: '16600113' + }, + { + gtm: '20220318/221142', + mil: '781246.5', + hgt: '86', + spd: '95.4', + agl: '21', + lon: '67655532', + lat: '16600515' + }, + { + gtm: '20220318/221156', + mil: '781246.8', + hgt: '83', + spd: '93.7', + agl: '19', + lon: '67656277', + lat: '16602414' + }, + { + gtm: '20220318/221209', + mil: '781247.2', + hgt: '84', + spd: '91.9', + agl: '18', + lon: '67656951', + lat: '16604134' + }, + { + gtm: '20220318/221212', + mil: '781247.2', + hgt: '85', + spd: '91.4', + agl: '19', + lon: '67657101', + lat: '16604527' + }, + { + gtm: '20220318/221242', + mil: '781248.0', + hgt: '93', + spd: '83.8', + agl: '29', + lon: '67658889', + lat: '16608129' + }, + { + gtm: '20220318/221312', + mil: '781248.6', + hgt: '94', + spd: '85.2', + agl: '29', + lon: '67660931', + lat: '16611433' + }, + { + gtm: '20220318/221342', + mil: '781249.4', + hgt: '79', + spd: '94.8', + agl: '25', + lon: '67663110', + lat: '16615056' + }, + { + gtm: '20220318/221355', + mil: '781249.7', + hgt: '75', + spd: '95.9', + agl: '18', + lon: '67663871', + lat: '16616810' + }, + { + gtm: '20220318/221403', + mil: '781249.9', + hgt: '78', + spd: '91.6', + agl: '13', + lon: '67664203', + lat: '16617898' + }, + { + gtm: '20220318/221412', + mil: '781250.2', + hgt: '82', + spd: '86.2', + agl: '10', + lon: '67664466', + lat: '16619073' + }, + { + gtm: '20220318/221442', + mil: '781250.8', + hgt: '91', + spd: '82.1', + agl: '24', + lon: '67665530', + lat: '16622669' + }, + { + gtm: '20220318/221442', + mil: '781250.8', + hgt: '91', + spd: '82.1', + agl: '24', + lon: '67665530', + lat: '16622669' + }, + { + gtm: '20220318/221512', + mil: '781251.5', + hgt: '93', + spd: '87.3', + agl: '24', + lon: '67667464', + lat: '16626063' + }, + { + gtm: '20220318/221542', + mil: '781252.3', + hgt: '81', + spd: '97.3', + agl: '9', + lon: '67668557', + lat: '16630191' + }, + { + gtm: '20220318/221609', + mil: '781252.9', + hgt: '102', + spd: '70.8', + agl: '21', + lon: '67669514', + lat: '16633452' + }, + { + gtm: '20220318/221611', + mil: '781252.9', + hgt: '104', + spd: '69.5', + agl: '23', + lon: '67669604', + lat: '16633647' + }, + { + gtm: '20220318/221612', + mil: '781253.0', + hgt: '105', + spd: '68.7', + agl: '25', + lon: '67669651', + lat: '16633741' + }, + { + gtm: '20220318/221642', + mil: '781253.5', + hgt: '110', + spd: '74.2', + agl: '33', + lon: '67671342', + lat: '16636455' + }, + { + gtm: '20220318/221712', + mil: '781254.2', + hgt: '105', + spd: '83.9', + agl: '24', + lon: '67673329', + lat: '16639545' + }, + { + gtm: '20220318/221742', + mil: '781254.9', + hgt: '111', + spd: '80.2', + agl: '13', + lon: '67674689', + lat: '16643181' + }, + { + gtm: '20220318/221742', + mil: '781254.9', + hgt: '111', + spd: '80.2', + agl: '13', + lon: '67674689', + lat: '16643181' + }, + { + gtm: '20220318/221812', + mil: '781255.5', + hgt: '104', + spd: '85.5', + agl: '5', + lon: '67675218', + lat: '16646808' + }, + { + gtm: '20220318/221842', + mil: '781256.3', + hgt: '104', + spd: '85.1', + agl: '10', + lon: '67675715', + lat: '16650684' + }, + { + gtm: '20220318/221912', + mil: '781257.0', + hgt: '89', + spd: '95.6', + agl: '17', + lon: '67676766', + lat: '16654624' + }, + { + gtm: '20220318/221930', + mil: '781257.5', + hgt: '84', + spd: '94.9', + agl: '17', + lon: '67677603', + lat: '16657134' + }, + { + gtm: '20220318/221940', + mil: '781257.7', + hgt: '85', + spd: '91.6', + agl: '15', + lon: '67678036', + lat: '16658472' + }, + { + gtm: '20220318/221942', + mil: '781257.8', + hgt: '86', + spd: '91.1', + agl: '15', + lon: '67678116', + lat: '16658737' + }, + { + gtm: '20220318/222012', + mil: '781258.5', + hgt: '78', + spd: '94.5', + agl: '356', + lon: '67678531', + lat: '16662833' + }, + { + gtm: '20220318/222012', + mil: '781258.5', + hgt: '78', + spd: '94.5', + agl: '356', + lon: '67678531', + lat: '16662833' + }, + { + gtm: '20220318/222028', + mil: '781258.9', + hgt: '70', + spd: '97.0', + agl: '350', + lon: '67678158', + lat: '16665114' + }, + { + gtm: '20220318/222029', + mil: '781259.0', + hgt: '70', + spd: '97.3', + agl: '350', + lon: '67678129', + lat: '16665258' + }, + { + gtm: '20220318/222031', + mil: '781259.0', + hgt: '69', + spd: '97.3', + agl: '349', + lon: '67678069', + lat: '16665547' + }, + { + gtm: '20220318/222042', + mil: '781259.3', + hgt: '67', + spd: '94.8', + agl: '350', + lon: '67677738', + lat: '16667128' + }, + { + gtm: '20220318/222050', + mil: '781259.5', + hgt: '70', + spd: '91.4', + agl: '350', + lon: '67677516', + lat: '16668234' + }, + { + gtm: '20220318/222052', + mil: '781259.6', + hgt: '71', + spd: '91.3', + agl: '350', + lon: '67677463', + lat: '16668505' + }, + { + gtm: '20220318/222052', + mil: '781259.6', + hgt: '71', + spd: '91.3', + agl: '350', + lon: '67677463', + lat: '16668505' + }, + { + gtm: '20220318/222112', + mil: '781260.1', + hgt: '79', + spd: '86.9', + agl: '2', + lon: '67677248', + lat: '16671180' + }, + { + gtm: '20220318/222127', + mil: '781260.4', + hgt: '88', + spd: '80.4', + agl: '11', + lon: '67677490', + lat: '16673059' + }, + { + gtm: '20220318/222127', + mil: '781260.4', + hgt: '88', + spd: '80.4', + agl: '11', + lon: '67677490', + lat: '16673059' + }, + { + gtm: '20220318/222128', + mil: '781260.4', + hgt: '89', + spd: '79.7', + agl: '12', + lon: '67677519', + lat: '16673176' + }, + { + gtm: '20220318/222128', + mil: '781260.4', + hgt: '89', + spd: '79.7', + agl: '12', + lon: '67677519', + lat: '16673176' + }, + { + gtm: '20220318/222142', + mil: '781260.7', + hgt: '97', + spd: '72.0', + agl: '14', + lon: '67677951', + lat: '16674720' + }, + { + gtm: '20220318/222142', + mil: '781260.7', + hgt: '97', + spd: '72.0', + agl: '14', + lon: '67677951', + lat: '16674720' + }, + { + gtm: '20220318/222142', + mil: '781260.7', + hgt: '97', + spd: '72.0', + agl: '14', + lon: '67677951', + lat: '16674720' + }, + { + gtm: '20220318/222212', + mil: '781261.3', + hgt: '108', + spd: '72.8', + agl: '15', + lon: '67678866', + lat: '16677835' + }, + { + gtm: '20220318/222212', + mil: '781261.3', + hgt: '108', + spd: '72.8', + agl: '15', + lon: '67678866', + lat: '16677835' + }, + { + gtm: '20220318/222242', + mil: '781262.0', + hgt: '95', + spd: '91.7', + agl: '11', + lon: '67679874', + lat: '16681461' + }, + { + gtm: '20220318/222312', + mil: '781262.7', + hgt: '83', + spd: '90.9', + agl: '4', + lon: '67680444', + lat: '16685605' + }, + { + gtm: '20220318/222329', + mil: '781263.2', + hgt: '79', + spd: '95.0', + agl: '9', + lon: '67680735', + lat: '16687959' + }, + { + gtm: '20220318/222342', + mil: '781263.5', + hgt: '75', + spd: '94.2', + agl: '15', + lon: '67681156', + lat: '16689768' + }, + { + gtm: '20220318/222342', + mil: '781263.5', + hgt: '75', + spd: '94.2', + agl: '15', + lon: '67681156', + lat: '16689768' + }, + { + gtm: '20220318/222347', + mil: '781263.6', + hgt: '73', + spd: '94.4', + agl: '19', + lon: '67681392', + lat: '16690444' + }, + { + gtm: '20220318/222348', + mil: '781263.7', + hgt: '73', + spd: '94.4', + agl: '19', + lon: '67681443', + lat: '16690578' + }, + { + gtm: '20220318/222412', + mil: '781264.3', + hgt: '67', + spd: '91.9', + agl: '22', + lon: '67682799', + lat: '16693728' + }, + { + gtm: '20220318/222412', + mil: '781264.3', + hgt: '67', + spd: '91.9', + agl: '22', + lon: '67682799', + lat: '16693728' + }, + { + gtm: '20220318/222442', + mil: '781265.0', + hgt: '54', + spd: '94.0', + agl: '14', + lon: '67684251', + lat: '16697623' + }, + { + gtm: '20220318/222505', + mil: '781265.6', + hgt: '56', + spd: '92.2', + agl: '8', + lon: '67684965', + lat: '16700854' + }, + { + gtm: '20220318/222507', + mil: '781265.7', + hgt: '57', + spd: '91.3', + agl: '8', + lon: '67685007', + lat: '16701127' + }, + { + gtm: '20220318/222512', + mil: '781265.8', + hgt: '60', + spd: '87.7', + agl: '6', + lon: '67685097', + lat: '16701795' + }, + { + gtm: '20220318/222542', + mil: '781266.5', + hgt: '55', + spd: '94.6', + agl: '359', + lon: '67685272', + lat: '16705812' + }, + { + gtm: '20220318/222602', + mil: '781267.0', + hgt: '55', + spd: '93.6', + agl: '358', + lon: '67685157', + lat: '16708649' + }, + { + gtm: '20220318/222603', + mil: '781267.1', + hgt: '55', + spd: '93.6', + agl: '358', + lon: '67685151', + lat: '16708791' + }, + { + gtm: '20220318/222612', + mil: '781267.3', + hgt: '56', + spd: '94.7', + agl: '358', + lon: '67685085', + lat: '16710063' + }, + { + gtm: '20220318/222625', + mil: '781267.6', + hgt: '61', + spd: '91.3', + agl: '1', + lon: '67685049', + lat: '16711894' + }, + { + gtm: '20220318/222642', + mil: '781268.0', + hgt: '69', + spd: '84.6', + agl: '4', + lon: '67685164', + lat: '16714155' + }, + { + gtm: '20220318/222710', + mil: '781268.7', + hgt: '77', + spd: '80.9', + agl: '9', + lon: '67685661', + lat: '16717522' + }, + { + gtm: '20220318/222712', + mil: '781268.7', + hgt: '77', + spd: '81.8', + agl: '9', + lon: '67685701', + lat: '16717767' + }, + { + gtm: '20220318/222712', + mil: '781268.7', + hgt: '77', + spd: '81.8', + agl: '9', + lon: '67685701', + lat: '16717767' + }, + { + gtm: '20220318/222715', + mil: '781268.8', + hgt: '77', + spd: '83.2', + agl: '10', + lon: '67685774', + lat: '16718133' + }, + { + gtm: '20220318/222742', + mil: '781269.4', + hgt: '69', + spd: '83.7', + agl: '4', + lon: '67686315', + lat: '16721488' + }, + { + gtm: '20220318/222812', + mil: '781270.1', + hgt: '65', + spd: '85.4', + agl: '345', + lon: '67685901', + lat: '16725312' + }, + { + gtm: '20220318/222842', + mil: '781270.7', + hgt: '78', + spd: '77.6', + agl: '328', + lon: '67684212', + lat: '16728622' + }, + { + gtm: '20220318/222912', + mil: '781271.4', + hgt: '80', + spd: '75.1', + agl: '327', + lon: '67682145', + lat: '16731451' + }, + { + gtm: '20220318/222942', + mil: '781272.0', + hgt: '77', + spd: '80.4', + agl: '337', + lon: '67680208', + lat: '16734514' + }, + { + gtm: '20220318/222947', + mil: '781272.1', + hgt: '77', + spd: '81.3', + agl: '339', + lon: '67679955', + lat: '16735079' + }, + { + gtm: '20220318/223003', + mil: '781272.4', + hgt: '83', + spd: '67.7', + agl: '348', + lon: '67679415', + lat: '16736824' + }, + { + gtm: '20220318/223005', + mil: '781272.5', + hgt: '84', + spd: '65.4', + agl: '348', + lon: '67679367', + lat: '16737019' + }, + { + gtm: '20220318/223012', + mil: '781272.6', + hgt: '86', + spd: '58.0', + agl: '356', + lon: '67679263', + lat: '16737652' + }, + { + gtm: '20220318/223024', + mil: '781272.8', + hgt: '87', + spd: '52.5', + agl: '21', + lon: '67679424', + lat: '16738626' + }, + { + gtm: '20220318/223026', + mil: '781272.8', + hgt: '86', + spd: '52.8', + agl: '30', + lon: '67679508', + lat: '16738765' + }, + { + gtm: '20220318/223038', + mil: '781273.0', + hgt: '78', + spd: '62.5', + agl: '73', + lon: '67680478', + lat: '16739316' + }, + { + gtm: '20220318/223042', + mil: '781273.1', + hgt: '75', + spd: '66.3', + agl: '75', + lon: '67680908', + lat: '16739421' + }, + { + gtm: '20220318/223048', + mil: '781273.2', + hgt: '71', + spd: '70.4', + agl: '78', + lon: '67681599', + lat: '16739557' + }, + { + gtm: '20220318/223101', + mil: '781273.4', + hgt: '65', + spd: '79.2', + agl: '79', + lon: '67683229', + lat: '16739835' + }, + { + gtm: '20220318/223112', + mil: '781273.7', + hgt: '58', + spd: '85.1', + agl: '77', + lon: '67684732', + lat: '16740111' + }, + { + gtm: '20220318/223142', + mil: '781274.4', + hgt: '53', + spd: '76.0', + agl: '72', + lon: '67688733', + lat: '16741104' + }, + { + gtm: '20220318/223212', + mil: '781275.0', + hgt: '57', + spd: '77.0', + agl: '70', + lon: '67692382', + lat: '16742259' + }, + { + gtm: '20220318/223242', + mil: '781275.6', + hgt: '67', + spd: '80.0', + agl: '76', + lon: '67696132', + lat: '16743264' + }, + { + gtm: '20220318/223242', + mil: '781275.6', + hgt: '67', + spd: '80.0', + agl: '76', + lon: '67696132', + lat: '16743264' + }, + { + gtm: '20220318/223312', + mil: '781276.3', + hgt: '66', + spd: '86.8', + agl: '82', + lon: '67700394', + lat: '16743994' + }, + { + gtm: '20220318/223342', + mil: '781277.0', + hgt: '83', + spd: '69.4', + agl: '84', + lon: '67704383', + lat: '16744341' + }, + { + gtm: '20220318/223412', + mil: '781277.5', + hgt: '94', + spd: '63.1', + agl: '79', + lon: '67707651', + lat: '16744762' + }, + { + gtm: '20220318/223412', + mil: '781277.5', + hgt: '94', + spd: '63.1', + agl: '79', + lon: '67707651', + lat: '16744762' + }, + { + gtm: '20220318/223442', + mil: '781278.1', + hgt: '94', + spd: '77.7', + agl: '76', + lon: '67711111', + lat: '16745448' + }, + { + gtm: '20220318/223442', + mil: '781278.1', + hgt: '94', + spd: '77.7', + agl: '76', + lon: '67711111', + lat: '16745448' + }, + { + gtm: '20220318/223512', + mil: '781278.7', + hgt: '93', + spd: '80.3', + agl: '82', + lon: '67715047', + lat: '16746176' + }, + { + gtm: '20220318/223542', + mil: '781279.4', + hgt: '77', + spd: '91.9', + agl: '86', + lon: '67719405', + lat: '16746594' + }, + { + gtm: '20220318/223542', + mil: '781279.4', + hgt: '77', + spd: '91.9', + agl: '86', + lon: '67719405', + lat: '16746594' + }, + { + gtm: '20220318/223609', + mil: '781280.1', + hgt: '68', + spd: '93.5', + agl: '79', + lon: '67723725', + lat: '16747105' + }, + { + gtm: '20220318/223611', + mil: '781280.2', + hgt: '68', + spd: '92.0', + agl: '79', + lon: '67724032', + lat: '16747158' + }, + { + gtm: '20220318/223612', + mil: '781280.2', + hgt: '68', + spd: '91.1', + agl: '79', + lon: '67724184', + lat: '16747185' + }, + { + gtm: '20220318/223642', + mil: '781280.9', + hgt: '67', + spd: '84.7', + agl: '73', + lon: '67728378', + lat: '16748118' + }, + { + gtm: '20220318/223712', + mil: '781281.6', + hgt: '78', + spd: '76.2', + agl: '69', + lon: '67732278', + lat: '16749355' + }, + { + gtm: '20220318/223742', + mil: '781282.2', + hgt: '89', + spd: '69.5', + agl: '74', + lon: '67735729', + lat: '16750408' + }, + { + gtm: '20220318/223812', + mil: '781282.8', + hgt: '91', + spd: '78.2', + agl: '78', + lon: '67739346', + lat: '16751220' + }, + { + gtm: '20220318/223835', + mil: '781283.3', + hgt: '79', + spd: '85.9', + agl: '81', + lon: '67742530', + lat: '16751742' + }, + { + gtm: '20220318/223838', + mil: '781283.4', + hgt: '78', + spd: '84.7', + agl: '82', + lon: '67742961', + lat: '16751797' + }, + { + gtm: '20220318/223842', + mil: '781283.5', + hgt: '76', + spd: '82.5', + agl: '82', + lon: '67743516', + lat: '16751866' + }, + { + gtm: '20220318/223842', + mil: '781283.5', + hgt: '76', + spd: '82.5', + agl: '82', + lon: '67743516', + lat: '16751866' + }, + { + gtm: '20220318/223843', + mil: '781283.5', + hgt: '76', + spd: '82.6', + agl: '83', + lon: '67743654', + lat: '16751882' + }, + { + gtm: '20220318/223845', + mil: '781283.5', + hgt: '75', + spd: '82.0', + agl: '83', + lon: '67743931', + lat: '16751913' + }, + { + gtm: '20220318/223848', + mil: '781283.6', + hgt: '74', + spd: '79.9', + agl: '83', + lon: '67744333', + lat: '16751958' + }, + { + gtm: '20220318/223848', + mil: '781283.6', + hgt: '74', + spd: '79.9', + agl: '83', + lon: '67744333', + lat: '16751958' + }, + { + gtm: '20220318/223851', + mil: '781283.7', + hgt: '73', + spd: '78.8', + agl: '83', + lon: '67744734', + lat: '16752003' + }, + { + gtm: '20220318/223853', + mil: '781283.7', + hgt: '73', + spd: '77.7', + agl: '83', + lon: '67744996', + lat: '16752033' + }, + { + gtm: '20220318/223856', + mil: '781283.8', + hgt: '71', + spd: '76.8', + agl: '83', + lon: '67745388', + lat: '16752076' + }, + { + gtm: '20220318/223858', + mil: '781283.8', + hgt: '70', + spd: '76.5', + agl: '83', + lon: '67745644', + lat: '16752105' + }, + { + gtm: '20220318/223903', + mil: '781283.9', + hgt: '68', + spd: '76.4', + agl: '83', + lon: '67746291', + lat: '16752177' + }, + { + gtm: '20220318/223906', + mil: '781284.0', + hgt: '66', + spd: '77.1', + agl: '83', + lon: '67746679', + lat: '16752220' + }, + { + gtm: '20220318/223909', + mil: '781284.0', + hgt: '63', + spd: '78.6', + agl: '83', + lon: '67747074', + lat: '16752264' + }, + { + gtm: '20220318/223912', + mil: '781284.1', + hgt: '61', + spd: '79.1', + agl: '83', + lon: '67747473', + lat: '16752307' + }, + { + gtm: '20220318/223929', + mil: '781284.5', + hgt: '60', + spd: '77.2', + agl: '83', + lon: '67749735', + lat: '16752562' + }, + { + gtm: '20220318/223942', + mil: '781284.7', + hgt: '66', + spd: '76.7', + agl: '83', + lon: '67751412', + lat: '16752768' + }, + { + gtm: '20220318/223959', + mil: '781285.1', + hgt: '70', + spd: '80.9', + agl: '83', + lon: '67753632', + lat: '16753014' + }, + { + gtm: '20220318/224000', + mil: '781285.1', + hgt: '70', + spd: '80.9', + agl: '83', + lon: '67753767', + lat: '16753029' + }, + { + gtm: '20220318/224004', + mil: '781285.2', + hgt: '70', + spd: '81.9', + agl: '85', + lon: '67754317', + lat: '16753075' + }, + { + gtm: '20220318/224012', + mil: '781285.4', + hgt: '72', + spd: '82.1', + agl: '85', + lon: '67755414', + lat: '16753164' + }, + { + gtm: '20220318/224042', + mil: '781286.1', + hgt: '76', + spd: '83.1', + agl: '92', + lon: '67759605', + lat: '16753261' + }, + { + gtm: '20220318/224112', + mil: '781286.8', + hgt: '71', + spd: '85.6', + agl: '98', + lon: '67763802', + lat: '16752927' + }, + { + gtm: '20220318/224142', + mil: '781287.5', + hgt: '56', + spd: '92.5', + agl: '106', + lon: '67768248', + lat: '16752078' + }, + { + gtm: '20220318/224142', + mil: '781287.5', + hgt: '56', + spd: '92.5', + agl: '106', + lon: '67768248', + lat: '16752078' + }, + { + gtm: '20220318/224212', + mil: '781288.2', + hgt: '48', + spd: '95.2', + agl: '107', + lon: '67772724', + lat: '16750881' + }, + { + gtm: '20220318/224242', + mil: '781289.0', + hgt: '58', + spd: '81.7', + agl: '107', + lon: '67777146', + lat: '16749684' + }, + { + gtm: '20220318/224312', + mil: '781289.6', + hgt: '60', + spd: '73.8', + agl: '107', + lon: '67780896', + lat: '16748673' + }, + { + gtm: '20220318/224312', + mil: '781289.6', + hgt: '60', + spd: '73.8', + agl: '107', + lon: '67780896', + lat: '16748673' + }, + { + gtm: '20220318/224342', + mil: '781290.3', + hgt: '52', + spd: '83.9', + agl: '92', + lon: '67784740', + lat: '16748020' + }, + { + gtm: '20220318/224342', + mil: '781290.3', + hgt: '52', + spd: '83.9', + agl: '92', + lon: '67784740', + lat: '16748020' + }, + { + gtm: '20220318/224412', + mil: '781290.9', + hgt: '55', + spd: '85.8', + agl: '72', + lon: '67788909', + lat: '16748535' + }, + { + gtm: '20220318/224442', + mil: '781291.6', + hgt: '51', + spd: '82.7', + agl: '52', + lon: '67792710', + lat: '16750327' + }, + { + gtm: '20220318/224512', + mil: '781292.3', + hgt: '55', + spd: '82.8', + agl: '41', + lon: '67795569', + lat: '16753009' + }, + { + gtm: '20220318/224542', + mil: '781293.0', + hgt: '56', + spd: '84.0', + agl: '66', + lon: '67798879', + lat: '16755237' + }, + { + gtm: '20220318/224612', + mil: '781293.7', + hgt: '59', + spd: '80.8', + agl: '74', + lon: '67802837', + lat: '16756296' + }, + { + gtm: '20220318/224642', + mil: '781294.3', + hgt: '61', + spd: '80.5', + agl: '75', + lon: '67806867', + lat: '16757298' + }, + { + gtm: '20220318/224712', + mil: '781294.9', + hgt: '61', + spd: '74.6', + agl: '74', + lon: '67810617', + lat: '16758231' + }, + { + gtm: '20220318/224742', + mil: '781295.6', + hgt: '62', + spd: '72.9', + agl: '74', + lon: '67814283', + lat: '16759158' + }, + { + gtm: '20220318/224805', + mil: '781296.0', + hgt: '77', + spd: '64.8', + agl: '78', + lon: '67816849', + lat: '16759780' + }, + { + gtm: '20220318/224812', + mil: '781296.1', + hgt: '78', + spd: '63.0', + agl: '84', + lon: '67817595', + lat: '16759887' + }, + { + gtm: '20220318/224822', + mil: '781296.3', + hgt: '76', + spd: '61.7', + agl: '88', + lon: '67818637', + lat: '16759938' + }, + { + gtm: '20220318/224839', + mil: '781296.5', + hgt: '69', + spd: '25.1', + agl: '149', + lon: '67819860', + lat: '16759751' + }, + { + gtm: '20220318/224842', + mil: '781296.5', + hgt: '67', + spd: '27.5', + agl: '172', + lon: '67819899', + lat: '16759636' + }, + { + gtm: '20220318/224843', + mil: '781296.5', + hgt: '66', + spd: '28.4', + agl: '180', + lon: '67819899', + lat: '16759594' + }, + { + gtm: '20220318/224846', + mil: '781296.5', + hgt: '64', + spd: '29.6', + agl: '207', + lon: '67819855', + lat: '16759470' + }, + { + gtm: '20220318/224847', + mil: '781296.5', + hgt: '63', + spd: '28.7', + agl: '216', + lon: '67819827', + lat: '16759434' + }, + { + gtm: '20220318/224848', + mil: '781296.6', + hgt: '62', + spd: '28.4', + agl: '224', + lon: '67819794', + lat: '16759404' + }, + { + gtm: '20220318/224849', + mil: '781296.6', + hgt: '62', + spd: '29.3', + agl: '233', + lon: '67819755', + lat: '16759377' + }, + { + gtm: '20220318/224855', + mil: '781296.6', + hgt: '57', + spd: '30.4', + agl: '284', + lon: '67819459', + lat: '16759342' + }, + { + gtm: '20220318/224902', + mil: '781296.7', + hgt: '56', + spd: '30.4', + agl: '340', + lon: '67819230', + lat: '16759566' + }, + { + gtm: '20220318/224912', + mil: '781296.8', + hgt: '58', + spd: '41.8', + agl: '354', + lon: '67819120', + lat: '16760110' + }, + { + gtm: '20220318/224929', + mil: '781297.0', + hgt: '62', + spd: '50.7', + agl: '356', + lon: '67818987', + lat: '16761292' + }, + { + gtm: '20220318/224942', + mil: '781297.2', + hgt: '66', + spd: '57.1', + agl: '2', + lon: '67818933', + lat: '16762348' + }, + { + gtm: '20220318/224946', + mil: '781297.2', + hgt: '67', + spd: '58.5', + agl: '7', + lon: '67818964', + lat: '16762698' + }, + { + gtm: '20220318/225012', + mil: '781297.7', + hgt: '74', + spd: '61.3', + agl: '23', + lon: '67819596', + lat: '16764917' + }, + { + gtm: '20220318/225042', + mil: '781298.2', + hgt: '81', + spd: '71.3', + agl: '27', + lon: '67821037', + lat: '16767606' + }, + { + gtm: '20220318/225112', + mil: '781298.9', + hgt: '70', + spd: '84.8', + agl: '23', + lon: '67822757', + lat: '16770787' + }, + { + gtm: '20220318/225112', + mil: '781298.9', + hgt: '70', + spd: '84.8', + agl: '23', + lon: '67822757', + lat: '16770787' + }, + { + gtm: '20220318/225142', + mil: '781299.6', + hgt: '56', + spd: '92.1', + agl: '1', + lon: '67823341', + lat: '16774794' + }, + { + gtm: '20220318/225242', + mil: '781300.9', + hgt: '63', + spd: '71.5', + agl: '349', + lon: '67822846', + lat: '16782120' + }, + { + gtm: '20220318/225242', + mil: '781300.9', + hgt: '63', + spd: '71.5', + agl: '349', + lon: '67822846', + lat: '16782120' + }, + { + gtm: '20220318/225242', + mil: '781300.9', + hgt: '63', + spd: '71.5', + agl: '349', + lon: '67822846', + lat: '16782120' + }, + { + gtm: '20220318/225300', + mil: '781301.3', + hgt: '58', + spd: '77.5', + agl: '358', + lon: '67822515', + lat: '16784094' + }, + { + gtm: '20220318/225300', + mil: '781301.3', + hgt: '58', + spd: '77.5', + agl: '358', + lon: '67822515', + lat: '16784094' + }, + { + gtm: '20220318/225310', + mil: '781301.5', + hgt: '57', + spd: '79.2', + agl: '11', + lon: '67822609', + lat: '16785279' + }, + { + gtm: '20220318/225312', + mil: '781301.6', + hgt: '56', + spd: '78.8', + agl: '15', + lon: '67822670', + lat: '16785510' + }, + { + gtm: '20220318/225312', + mil: '781301.6', + hgt: '56', + spd: '78.8', + agl: '15', + lon: '67822670', + lat: '16785510' + }, + { + gtm: '20220318/225312', + mil: '781301.6', + hgt: '56', + spd: '78.8', + agl: '15', + lon: '67822670', + lat: '16785510' + }, + { + gtm: '20220318/225312', + mil: '781301.6', + hgt: '56', + spd: '78.8', + agl: '15', + lon: '67822670', + lat: '16785510' + }, + { + gtm: '20220318/225342', + mil: '781302.2', + hgt: '59', + spd: '70.4', + agl: '29', + lon: '67824426', + lat: '16788508' + }, + { + gtm: '20220318/225412', + mil: '781302.7', + hgt: '68', + spd: '63.6', + agl: '2', + lon: '67825281', + lat: '16791399' + }, + { + gtm: '20220318/225423', + mil: '781302.9', + hgt: '73', + spd: '64.9', + agl: '1', + lon: '67825306', + lat: '16792449' + }, + { + gtm: '20220318/225442', + mil: '781303.3', + hgt: '73', + spd: '77.4', + agl: '2', + lon: '67825348', + lat: '16794513' + }, + { + gtm: '20220318/225442', + mil: '781303.3', + hgt: '73', + spd: '77.4', + agl: '2', + lon: '67825348', + lat: '16794513' + }, + { + gtm: '20220318/225443', + mil: '781303.3', + hgt: '73', + spd: '77.9', + agl: '2', + lon: '67825353', + lat: '16794630' + }, + { + gtm: '20220318/225444', + mil: '781303.3', + hgt: '72', + spd: '78.1', + agl: '2', + lon: '67825357', + lat: '16794747' + }, + { + gtm: '20220318/225448', + mil: '781303.4', + hgt: '71', + spd: '79.0', + agl: '4', + lon: '67825389', + lat: '16795219' + }, + { + gtm: '20220318/225452', + mil: '781303.5', + hgt: '70', + spd: '79.7', + agl: '1', + lon: '67825413', + lat: '16795699' + }, + { + gtm: '20220318/225453', + mil: '781303.5', + hgt: '70', + spd: '77.6', + agl: '0', + lon: '67825414', + lat: '16795816' + }, + { + gtm: '20220318/225455', + mil: '781303.6', + hgt: '69', + spd: '75.3', + agl: '359', + lon: '67825414', + lat: '16796046' + }, + { + gtm: '20220318/225456', + mil: '781303.6', + hgt: '69', + spd: '74.3', + agl: '359', + lon: '67825413', + lat: '16796158' + }, + { + gtm: '20220318/225458', + mil: '781303.6', + hgt: '69', + spd: '72.8', + agl: '356', + lon: '67825401', + lat: '16796379' + }, + { + gtm: '20220318/225512', + mil: '781303.9', + hgt: '71', + spd: '65.9', + agl: '341', + lon: '67825059', + lat: '16797820' + }, + { + gtm: '20220318/225535', + mil: '781304.3', + hgt: '80', + spd: '54.8', + agl: '335', + lon: '67824056', + lat: '16799679' + }, + { + gtm: '20220318/225539', + mil: '781304.3', + hgt: '81', + spd: '48.2', + agl: '338', + lon: '67823916', + lat: '16799960' + }, + { + gtm: '20220318/225539', + mil: '781304.3', + hgt: '81', + spd: '48.2', + agl: '338', + lon: '67823916', + lat: '16799960' + }, + { + gtm: '20220318/225542', + mil: '781304.4', + hgt: '82', + spd: '43.4', + agl: '340', + lon: '67823833', + lat: '16800150' + }, + { + gtm: '20220318/225551', + mil: '781304.5', + hgt: '85', + spd: '41.6', + agl: '346', + lon: '67823643', + lat: '16800687' + }, + { + gtm: '20220318/225551', + mil: '781304.5', + hgt: '85', + spd: '41.6', + agl: '346', + lon: '67823643', + lat: '16800687' + }, + { + gtm: '20220318/225554', + mil: '781304.5', + hgt: '85', + spd: '43.9', + agl: '347', + lon: '67823593', + lat: '16800876' + }, + { + gtm: '20220318/225558', + mil: '781304.5', + hgt: '86', + spd: '44.6', + agl: '351', + lon: '67823538', + lat: '16801140' + }, + { + gtm: '20220318/225558', + mil: '781304.5', + hgt: '86', + spd: '44.6', + agl: '351', + lon: '67823538', + lat: '16801140' + }, + { + gtm: '20220318/225601', + mil: '781304.6', + hgt: '86', + spd: '46.4', + agl: '352', + lon: '67823514', + lat: '16801276' + }, + { + gtm: '20220318/225603', + mil: '781304.6', + hgt: '86', + spd: '47.5', + agl: '354', + lon: '67823481', + lat: '16801489' + }, + { + gtm: '20220318/225612', + mil: '781304.7', + hgt: '88', + spd: '39.7', + agl: '359', + lon: '67823460', + lat: '16802050' + }, + { + gtm: '20220318/225612', + mil: '781304.7', + hgt: '88', + spd: '39.7', + agl: '359', + lon: '67823460', + lat: '16802050' + }, + { + gtm: '20220318/225626', + mil: '781304.9', + hgt: '91', + spd: '44.8', + agl: '356', + lon: '67823439', + lat: '16802968' + }, + { + gtm: '20220318/225642', + mil: '781305.1', + hgt: '92', + spd: '58.5', + agl: '343', + lon: '67823160', + lat: '16804192' + }, + { + gtm: '20220318/225650', + mil: '781305.3', + hgt: '92', + spd: '64.3', + agl: '336', + lon: '67822860', + lat: '16804890' + }, + { + gtm: '20220318/225654', + mil: '781305.3', + hgt: '92', + spd: '65.7', + agl: '334', + lon: '67822674', + lat: '16805243' + }, + { + gtm: '20220318/225712', + mil: '781305.7', + hgt: '91', + spd: '77.3', + agl: '319', + lon: '67821407', + lat: '16806865' + }, + { + gtm: '20220318/225712', + mil: '781305.7', + hgt: '91', + spd: '77.3', + agl: '319', + lon: '67821407', + lat: '16806865' + }, + { + gtm: '20220318/225718', + mil: '781305.8', + hgt: '88', + spd: '79.7', + agl: '318', + lon: '67820877', + lat: '16807397' + }, + { + gtm: '20220318/225720', + mil: '781305.9', + hgt: '86', + spd: '81.1', + agl: '318', + lon: '67820695', + lat: '16807578' + }, + { + gtm: '20220318/225720', + mil: '781305.9', + hgt: '86', + spd: '81.1', + agl: '318', + lon: '67820695', + lat: '16807578' + }, + { + gtm: '20220318/225724', + mil: '781306.0', + hgt: '83', + spd: '83.4', + agl: '318', + lon: '67820320', + lat: '16807948' + }, + { + gtm: '20220318/225732', + mil: '781306.1', + hgt: '76', + spd: '84.5', + agl: '323', + lon: '67819590', + lat: '16808739' + }, + { + gtm: '20220318/225735', + mil: '781306.2', + hgt: '74', + spd: '84.7', + agl: '326', + lon: '67819344', + lat: '16809052' + }, + { + gtm: '20220318/225739', + mil: '781306.3', + hgt: '72', + spd: '85.8', + agl: '331', + lon: '67819044', + lat: '16809495' + }, + { + gtm: '20220318/225741', + mil: '781306.4', + hgt: '71', + spd: '85.3', + agl: '333', + lon: '67818910', + lat: '16809723' + }, + { + gtm: '20220318/225742', + mil: '781306.4', + hgt: '70', + spd: '85.4', + agl: '334', + lon: '67818846', + lat: '16809838' + }, + { + gtm: '20220318/225742', + mil: '781306.4', + hgt: '70', + spd: '85.4', + agl: '334', + lon: '67818846', + lat: '16809838' + }, + { + gtm: '20220318/225746', + mil: '781306.5', + hgt: '69', + spd: '85.7', + agl: '339', + lon: '67818624', + lat: '16810315' + }, + { + gtm: '20220318/225750', + mil: '781306.6', + hgt: '67', + spd: '79.8', + agl: '344', + lon: '67818449', + lat: '16810794' + }, + { + gtm: '20220318/225751', + mil: '781306.6', + hgt: '67', + spd: '76.7', + agl: '344', + lon: '67818415', + lat: '16810905' + }, + { + gtm: '20220318/225753', + mil: '781306.6', + hgt: '66', + spd: '75.3', + agl: '347', + lon: '67818354', + lat: '16811127' + }, + { + gtm: '20220318/225758', + mil: '781306.7', + hgt: '66', + spd: '74.1', + agl: '351', + lon: '67818237', + lat: '16811674' + }, + { + gtm: '20220318/225812', + mil: '781307.0', + hgt: '67', + spd: '76.5', + agl: '5', + lon: '67818180', + lat: '16813281' + }, + { + gtm: '20220318/225822', + mil: '781307.2', + hgt: '71', + spd: '77.5', + agl: '12', + lon: '67818390', + lat: '16814433' + }, + { + gtm: '20220318/225825', + mil: '781307.3', + hgt: '72', + spd: '77.3', + agl: '13', + lon: '67818474', + lat: '16814775' + }, + { + gtm: '20220318/225842', + mil: '781307.7', + hgt: '78', + spd: '78.7', + agl: '13', + lon: '67819006', + lat: '16816716' + }, + { + gtm: '20220318/225912', + mil: '781308.3', + hgt: '83', + spd: '73.8', + agl: '13', + lon: '67819881', + lat: '16820064' + }, + { + gtm: '20220318/225921', + mil: '781308.5', + hgt: '84', + spd: '73.8', + agl: '13', + lon: '67820139', + lat: '16821039' + }, + { + gtm: '20220318/225924', + mil: '781308.5', + hgt: '84', + spd: '71.5', + agl: '13', + lon: '67820223', + lat: '16821358' + }, + { + gtm: '20220318/225927', + mil: '781308.6', + hgt: '84', + spd: '68.8', + agl: '13', + lon: '67820304', + lat: '16821666' + }, + { + gtm: '20220318/225930', + mil: '781308.6', + hgt: '84', + spd: '67.1', + agl: '12', + lon: '67820379', + lat: '16821964' + }, + { + gtm: '20220318/225942', + mil: '781308.8', + hgt: '85', + spd: '62.0', + agl: '13', + lon: '67820676', + lat: '16823086' + }, + { + gtm: '20220318/230012', + mil: '781309.4', + hgt: '94', + spd: '69.2', + agl: '6', + lon: '67821321', + lat: '16825936' + }, + { + gtm: '20220318/230042', + mil: '781310.0', + hgt: '100', + spd: '71.9', + agl: '4', + lon: '67821456', + lat: '16829099' + }, + { + gtm: '20220318/230112', + mil: '781310.5', + hgt: '110', + spd: '66.7', + agl: '14', + lon: '67822146', + lat: '16832176' + }, + { + gtm: '20220318/230142', + mil: '781311.1', + hgt: '111', + spd: '66.3', + agl: '14', + lon: '67822972', + lat: '16835062' + }, + { + gtm: '20220318/230200', + mil: '781311.4', + hgt: '102', + spd: '74.0', + agl: '14', + lon: '67823496', + lat: '16836886' + }, + { + gtm: '20220318/230202', + mil: '781311.5', + hgt: '101', + spd: '75.1', + agl: '14', + lon: '67823560', + lat: '16837104' + }, + { + gtm: '20220318/230208', + mil: '781311.6', + hgt: '97', + spd: '79.8', + agl: '15', + lon: '67823763', + lat: '16837776' + }, + { + gtm: '20220318/230212', + mil: '781311.7', + hgt: '94', + spd: '85.6', + agl: '16', + lon: '67823914', + lat: '16838257' + }, + { + gtm: '20220318/230221', + mil: '781311.9', + hgt: '88', + spd: '91.2', + agl: '22', + lon: '67824357', + lat: '16839397' + }, + { + gtm: '20220318/230223', + mil: '781311.9', + hgt: '87', + spd: '91.9', + agl: '23', + lon: '67824477', + lat: '16839652' + }, + { + gtm: '20220318/230224', + mil: '781312.0', + hgt: '86', + spd: '92.3', + agl: '24', + lon: '67824540', + lat: '16839780' + }, + { + gtm: '20220318/230225', + mil: '781312.0', + hgt: '86', + spd: '92.4', + agl: '26', + lon: '67824609', + lat: '16839904' + }, + { + gtm: '20220318/230236', + mil: '781312.3', + hgt: '80', + spd: '93.4', + agl: '26', + lon: '67825355', + lat: '16841278' + }, + { + gtm: '20220318/230238', + mil: '781312.3', + hgt: '80', + spd: '93.5', + agl: '26', + lon: '67825492', + lat: '16841532' + }, + { + gtm: '20220318/230242', + mil: '781312.4', + hgt: '78', + spd: '91.9', + agl: '26', + lon: '67825762', + lat: '16842033' + }, + { + gtm: '20220318/230312', + mil: '781313.1', + hgt: '82', + spd: '74.4', + agl: '25', + lon: '67827642', + lat: '16845495' + }, + { + gtm: '20220318/230342', + mil: '781313.7', + hgt: '89', + spd: '72.9', + agl: '13', + lon: '67828794', + lat: '16848417' + }, + { + gtm: '20220318/230412', + mil: '781314.3', + hgt: '89', + spd: '75.0', + agl: '18', + lon: '67829676', + lat: '16851748' + }, + { + gtm: '20220318/230427', + mil: '781314.6', + hgt: '89', + spd: '71.3', + agl: '29', + lon: '67830401', + lat: '16853251' + }, + { + gtm: '20220318/230436', + mil: '781314.8', + hgt: '89', + spd: '69.8', + agl: '37', + lon: '67831003', + lat: '16854042' + }, + { + gtm: '20220318/230436', + mil: '781314.8', + hgt: '89', + spd: '69.8', + agl: '37', + lon: '67831003', + lat: '16854042' + }, + { + gtm: '20220318/230442', + mil: '781314.9', + hgt: '88', + spd: '69.1', + agl: '41', + lon: '67831452', + lat: '16854523' + }, + { + gtm: '20220318/230442', + mil: '781314.9', + hgt: '88', + spd: '69.1', + agl: '41', + lon: '67831452', + lat: '16854523' + }, + { + gtm: '20220318/230442', + mil: '781314.9', + hgt: '88', + spd: '69.1', + agl: '41', + lon: '67831452', + lat: '16854523' + }, + { + gtm: '20220318/230511', + mil: '781315.4', + hgt: '92', + spd: '62.4', + agl: '72', + lon: '67833888', + lat: '16856130' + }, + { + gtm: '20220318/230512', + mil: '781315.4', + hgt: '92', + spd: '62.9', + agl: '73', + lon: '67833989', + lat: '16856158' + }, + { + gtm: '20220318/230517', + mil: '781315.5', + hgt: '91', + spd: '63.1', + agl: '72', + lon: '67834503', + lat: '16856295' + }, + { + gtm: '20220318/230520', + mil: '781315.5', + hgt: '91', + spd: '61.5', + agl: '70', + lon: '67834806', + lat: '16856382' + }, + { + gtm: '20220318/230520', + mil: '781315.5', + hgt: '91', + spd: '61.5', + agl: '70', + lon: '67834806', + lat: '16856382' + }, + { + gtm: '20220318/230524', + mil: '781315.6', + hgt: '92', + spd: '60.7', + agl: '66', + lon: '67835197', + lat: '16856517' + }, + { + gtm: '20220318/230524', + mil: '781315.6', + hgt: '92', + spd: '60.7', + agl: '66', + lon: '67835197', + lat: '16856517' + }, + { + gtm: '20220318/230542', + mil: '781315.9', + hgt: '91', + spd: '57.1', + agl: '66', + lon: '67836637', + lat: '16857357' + }, + { + gtm: '20220318/230552', + mil: '781316.0', + hgt: '87', + spd: '60.4', + agl: '85', + lon: '67837644', + lat: '16857544' + }, + { + gtm: '20220318/230553', + mil: '781316.1', + hgt: '87', + spd: '60.5', + agl: '85', + lon: '67837746', + lat: '16857552' + }, + { + gtm: '20220318/230612', + mil: '781316.4', + hgt: '91', + spd: '65.7', + agl: '91', + lon: '67839772', + lat: '16857588' + }, + { + gtm: '20220318/230642', + mil: '781317.0', + hgt: '80', + spd: '78.3', + agl: '94', + lon: '67843503', + lat: '16857372' + }, + { + gtm: '20220318/230712', + mil: '781317.7', + hgt: '66', + spd: '84.2', + agl: '94', + lon: '67847662', + lat: '16857097' + }, + { + gtm: '20220318/230718', + mil: '781317.8', + hgt: '65', + spd: '83.4', + agl: '94', + lon: '67848514', + lat: '16857043' + }, + { + gtm: '20220318/230722', + mil: '781317.9', + hgt: '65', + spd: '82.1', + agl: '93', + lon: '67849074', + lat: '16857017' + }, + { + gtm: '20220318/230722', + mil: '781317.9', + hgt: '65', + spd: '82.1', + agl: '93', + lon: '67849074', + lat: '16857017' + }, + { + gtm: '20220318/230722', + mil: '781317.9', + hgt: '65', + spd: '82.1', + agl: '93', + lon: '67849074', + lat: '16857017' + }, + { + gtm: '20220318/230728', + mil: '781318.0', + hgt: '66', + spd: '79.3', + agl: '95', + lon: '67849893', + lat: '16856965' + }, + { + gtm: '20220318/230730', + mil: '781318.1', + hgt: '66', + spd: '78.2', + agl: '96', + lon: '67850158', + lat: '16856943' + }, + { + gtm: '20220318/230742', + mil: '781318.3', + hgt: '69', + spd: '74.2', + agl: '94', + lon: '67851685', + lat: '16856835' + }, + { + gtm: '20220318/230812', + mil: '781319.0', + hgt: '60', + spd: '80.9', + agl: '89', + lon: '67855617', + lat: '16856628' + }, + { + gtm: '20220318/230842', + mil: '781319.6', + hgt: '61', + spd: '75.9', + agl: '67', + lon: '67859568', + lat: '16857393' + }, + { + gtm: '20220318/230912', + mil: '781320.2', + hgt: '61', + spd: '78.4', + agl: '54', + lon: '67862790', + lat: '16859244' + }, + { + gtm: '20220318/230942', + mil: '781320.8', + hgt: '59', + spd: '71.5', + agl: '71', + lon: '67866174', + lat: '16860795' + }, + { + gtm: '20220318/231004', + mil: '781321.2', + hgt: '60', + spd: '62.6', + agl: '72', + lon: '67868553', + lat: '16861533' + }, + { + gtm: '20220318/231009', + mil: '781321.3', + hgt: '60', + spd: '60.2', + agl: '74', + lon: '67869048', + lat: '16861673' + }, + { + gtm: '20220318/231012', + mil: '781321.4', + hgt: '60', + spd: '59.0', + agl: '75', + lon: '67869340', + lat: '16861743' + }, + { + gtm: '20220318/231012', + mil: '781321.4', + hgt: '60', + spd: '59.0', + agl: '75', + lon: '67869340', + lat: '16861743' + }, + { + gtm: '20220318/231012', + mil: '781321.4', + hgt: '60', + spd: '59.0', + agl: '75', + lon: '67869340', + lat: '16861743' + }, + { + gtm: '20220318/231019', + mil: '781321.5', + hgt: '61', + spd: '49.8', + agl: '75', + lon: '67869969', + lat: '16861899' + }, + { + gtm: '20220318/231020', + mil: '781321.5', + hgt: '61', + spd: '47.9', + agl: '76', + lon: '67870047', + lat: '16861917' + }, + { + gtm: '20220318/231020', + mil: '781321.5', + hgt: '61', + spd: '47.9', + agl: '76', + lon: '67870047', + lat: '16861917' + }, + { + gtm: '20220318/231026', + mil: '781321.6', + hgt: '60', + spd: '40.5', + agl: '90', + lon: '67870491', + lat: '16861972' + }, + { + gtm: '20220318/231034', + mil: '781321.6', + hgt: '60', + spd: '37.3', + agl: '123', + lon: '67870957', + lat: '16861808' + }, + { + gtm: '20220318/231038', + mil: '781321.7', + hgt: '59', + spd: '36.3', + agl: '116', + lon: '67871175', + lat: '16861699' + }, + { + gtm: '20220318/231042', + mil: '781321.7', + hgt: '59', + spd: '35.3', + agl: '94', + lon: '67871406', + lat: '16861653' + }, + { + gtm: '20220318/231042', + mil: '781321.7', + hgt: '59', + spd: '35.3', + agl: '94', + lon: '67871406', + lat: '16861653' + }, + { + gtm: '20220318/231112', + mil: '781322.0', + hgt: '52', + spd: '37.8', + agl: '5', + lon: '67872039', + lat: '16863047' + }, + { + gtm: '20220318/231121', + mil: '781322.1', + hgt: '54', + spd: '31.7', + agl: '14', + lon: '67872111', + lat: '16863517' + }, + { + gtm: '20220318/231129', + mil: '781322.2', + hgt: '55', + spd: '11.1', + agl: '24', + lon: '67872198', + lat: '16863771' + }, + { + gtm: '20220318/231129', + mil: '781322.2', + hgt: '55', + spd: '11.1', + agl: '24', + lon: '67872198', + lat: '16863771' + }, + { + gtm: '20220318/231142', + mil: '781322.2', + hgt: '55', + spd: '0.0', + agl: '25', + lon: '67872231', + lat: '16863849' + }, + { + gtm: '20220318/231212', + mil: '781322.2', + hgt: '55', + spd: '0.0', + agl: '25', + lon: '67872231', + lat: '16863849' + }, + { + gtm: '20220318/231223', + mil: '781322.2', + hgt: '55', + spd: '0.0', + agl: '25', + lon: '67872231', + lat: '16863849' + }, + { + gtm: '20220318/231242', + mil: '781322.2', + hgt: '58', + spd: '5.5', + agl: '29', + lon: '67872318', + lat: '16863990' + }, + { + gtm: '20220318/231312', + mil: '781322.3', + hgt: '50', + spd: '22.7', + agl: '31', + lon: '67872571', + lat: '16864461' + }, + { + gtm: '20220318/231323', + mil: '781322.4', + hgt: '50', + spd: '29.5', + agl: '41', + lon: '67872876', + lat: '16864824' + }, + { + gtm: '20220318/231327', + mil: '781322.4', + hgt: '50', + spd: '30.7', + agl: '44', + lon: '67873017', + lat: '16864959' + }, + { + gtm: '20220318/231332', + mil: '781322.5', + hgt: '50', + spd: '25.9', + agl: '40', + lon: '67873200', + lat: '16865106' + }, + { + gtm: '20220318/231338', + mil: '781322.5', + hgt: '50', + spd: '23.2', + agl: '348', + lon: '67873230', + lat: '16865304' + }, + { + gtm: '20220318/231342', + mil: '781322.5', + hgt: '50', + spd: '26.2', + agl: '342', + lon: '67873185', + lat: '16865448' + }, + { + gtm: '20220318/231354', + mil: '781322.6', + hgt: '51', + spd: '29.7', + agl: '340', + lon: '67872987', + lat: '16865928' + }, + { + gtm: '20220318/231355', + mil: '781322.6', + hgt: '51', + spd: '29.6', + agl: '340', + lon: '67872969', + lat: '16865970' + }, + { + gtm: '20220318/231357', + mil: '781322.7', + hgt: '51', + spd: '28.5', + agl: '342', + lon: '67872936', + lat: '16866049' + }, + { + gtm: '20220318/231412', + mil: '781322.8', + hgt: '54', + spd: '31.2', + agl: '341', + lon: '67872700', + lat: '16866664' + }, + { + gtm: '20220318/231442', + mil: '781323.0', + hgt: '58', + spd: '29.0', + agl: '311', + lon: '67871739', + lat: '16867738' + }, + { + gtm: '20220318/231458', + mil: '781323.2', + hgt: '56', + spd: '34.1', + agl: '338', + lon: '67871325', + lat: '16868440' + }, + { + gtm: '20220318/231458', + mil: '781323.2', + hgt: '56', + spd: '34.1', + agl: '338', + lon: '67871325', + lat: '16868440' + }, + { + gtm: '20220318/231458', + mil: '781323.2', + hgt: '56', + spd: '34.1', + agl: '338', + lon: '67871325', + lat: '16868440' + }, + { + gtm: '20220318/231458', + mil: '781323.2', + hgt: '56', + spd: '34.1', + agl: '338', + lon: '67871325', + lat: '16868440' + }, + { + gtm: '20220318/231459', + mil: '781323.2', + hgt: '56', + spd: '33.6', + agl: '339', + lon: '67871304', + lat: '16868488' + }, + { + gtm: '20220318/231459', + mil: '781323.2', + hgt: '56', + spd: '33.6', + agl: '339', + lon: '67871304', + lat: '16868488' + }, + { + gtm: '20220318/231512', + mil: '781323.3', + hgt: '57', + spd: '36.8', + agl: '1', + lon: '67871227', + lat: '16869171' + }, + { + gtm: '20220318/231512', + mil: '781323.3', + hgt: '57', + spd: '36.8', + agl: '1', + lon: '67871227', + lat: '16869171' + }, + { + gtm: '20220318/231542', + mil: '781323.6', + hgt: '60', + spd: '40.6', + agl: '0', + lon: '67871244', + lat: '16870942' + }, + { + gtm: '20220318/231612', + mil: '781324.0', + hgt: '60', + spd: '43.9', + agl: '0', + lon: '67871255', + lat: '16872851' + }, + { + gtm: '20220318/231612', + mil: '781324.0', + hgt: '60', + spd: '43.9', + agl: '0', + lon: '67871255', + lat: '16872851' + }, + { + gtm: '20220318/231612', + mil: '781324.0', + hgt: '60', + spd: '43.9', + agl: '0', + lon: '67871255', + lat: '16872851' + }, + { + gtm: '20220318/231615', + mil: '781324.0', + hgt: '60', + spd: '43.3', + agl: '0', + lon: '67871256', + lat: '16873048' + }, + { + gtm: '20220318/231616', + mil: '781324.0', + hgt: '60', + spd: '43.0', + agl: '0', + lon: '67871256', + lat: '16873113' + }, + { + gtm: '20220318/231650', + mil: '781324.4', + hgt: '60', + spd: '38.2', + agl: '0', + lon: '67871256', + lat: '16875123' + }, + { + gtm: '20220318/231653', + mil: '781324.4', + hgt: '60', + spd: '37.5', + agl: '0', + lon: '67871258', + lat: '16875294' + }, + { + gtm: '20220318/231710', + mil: '781324.6', + hgt: '60', + spd: '30.2', + agl: '0', + lon: '67871253', + lat: '16876167' + }, + { + gtm: '20220318/231715', + mil: '781324.6', + hgt: '60', + spd: '26.4', + agl: '355', + lon: '67871245', + lat: '16876371' + }, + { + gtm: '20220318/231722', + mil: '781324.7', + hgt: '60', + spd: '35.6', + agl: '359', + lon: '67871214', + lat: '16876702' + }, + { + gtm: '20220318/231724', + mil: '781324.7', + hgt: '60', + spd: '38.2', + agl: '1', + lon: '67871214', + lat: '16876816' + }, + { + gtm: '20220318/231742', + mil: '781324.9', + hgt: '58', + spd: '42.4', + agl: '359', + lon: '67871233', + lat: '16877939' + }, + { + gtm: '20220318/231742', + mil: '781324.9', + hgt: '58', + spd: '42.4', + agl: '359', + lon: '67871233', + lat: '16877939' + }, + { + gtm: '20220318/231743', + mil: '781324.9', + hgt: '58', + spd: '42.3', + agl: '359', + lon: '67871232', + lat: '16878004' + }, + { + gtm: '20220318/231746', + mil: '781325.0', + hgt: '58', + spd: '41.2', + agl: '357', + lon: '67871221', + lat: '16878193' + }, + { + gtm: '20220318/231754', + mil: '781325.0', + hgt: '60', + spd: '23.5', + agl: '8', + lon: '67871211', + lat: '16878611' + }, + { + gtm: '20220318/231757', + mil: '781325.0', + hgt: '60', + spd: '18.9', + agl: '48', + lon: '67871269', + lat: '16878687' + }, + { + gtm: '20220318/231812', + mil: '781325.1', + hgt: '57', + spd: '16.4', + agl: '119', + lon: '67871616', + lat: '16878709' + }, + { + gtm: '20220318/231842', + mil: '781325.3', + hgt: '52', + spd: '30.4', + agl: '111', + lon: '67872828', + lat: '16878282' + }, + { + gtm: '20220318/231912', + mil: '781325.7', + hgt: '50', + spd: '46.6', + agl: '92', + lon: '67874821', + lat: '16877791' + }, + { + gtm: '20220318/231920', + mil: '781325.8', + hgt: '50', + spd: '47.7', + agl: '93', + lon: '67875466', + lat: '16877772' + }, + { + gtm: '20220318/231930', + mil: '781325.9', + hgt: '51', + spd: '45.3', + agl: '92', + lon: '67876260', + lat: '16877745' + }, + { + gtm: '20220318/231942', + mil: '781326.0', + hgt: '52', + spd: '22.2', + agl: '91', + lon: '67877001', + lat: '16877737' + }, + { + gtm: '20220318/232012', + mil: '781326.0', + hgt: '54', + spd: '0.0', + agl: '135', + lon: '67877145', + lat: '16877739' + }, + { + gtm: '20220318/232018', + mil: '781326.0', + hgt: '54', + spd: '0.0', + agl: '135', + lon: '67877145', + lat: '16877739' + }, + { + gtm: '20220318/232038', + mil: '781326.1', + hgt: '52', + spd: '23.2', + agl: '11', + lon: '67877439', + lat: '16877947' + }, + { + gtm: '20220318/232042', + mil: '781326.1', + hgt: '51', + spd: '28.1', + agl: '7', + lon: '67877461', + lat: '16878105' + }, + { + gtm: '20220318/232112', + mil: '781326.4', + hgt: '51', + spd: '37.4', + agl: '8', + lon: '67877721', + lat: '16879652' + }, + { + gtm: '20220318/232142', + mil: '781326.7', + hgt: '50', + spd: '42.5', + agl: '9', + lon: '67878027', + lat: '16881435' + }, + { + gtm: '20220318/232212', + mil: '781327.1', + hgt: '53', + spd: '45.6', + agl: '9', + lon: '67878372', + lat: '16883421' + }, + { + gtm: '20220318/232217', + mil: '781327.2', + hgt: '53', + spd: '44.6', + agl: '9', + lon: '67878432', + lat: '16883758' + }, + { + gtm: '20220318/232219', + mil: '781327.2', + hgt: '53', + spd: '44.7', + agl: '9', + lon: '67878456', + lat: '16883892' + }, + { + gtm: '20220318/232226', + mil: '781327.3', + hgt: '52', + spd: '50.2', + agl: '9', + lon: '67878561', + lat: '16884393' + }, + { + gtm: '20220318/232240', + mil: '781327.3', + hgt: '52', + spd: '0.0', + agl: '163', + lon: '67878639', + lat: '16884862' + }, + { + gtm: '20220318/232241', + mil: '781327.3', + hgt: '52', + spd: '0.0', + agl: '163', + lon: '67878639', + lat: '16884862' + }, + { + gtm: '20220318/232242', + mil: '781327.3', + hgt: '52', + spd: '0.0', + agl: '163', + lon: '67878639', + lat: '16884862' + }, + { + gtm: '20220318/232312', + mil: '781327.3', + hgt: '52', + spd: '0.0', + agl: '163', + lon: '67878639', + lat: '16884862' + }, + { + gtm: '20220318/232313', + mil: '781327.3', + hgt: '52', + spd: '0.0', + agl: '163', + lon: '67878639', + lat: '16884862' + }, + { + gtm: '20220318/232342', + mil: '781327.5', + hgt: '52', + spd: '26.4', + agl: '7', + lon: '67878730', + lat: '16885470' + }, + { + gtm: '20220318/232412', + mil: '781327.8', + hgt: '51', + spd: '45.5', + agl: '357', + lon: '67878738', + lat: '16887123' + }, + { + gtm: '20220318/232442', + mil: '781328.2', + hgt: '52', + spd: '53.2', + agl: '353', + lon: '67878456', + lat: '16889461' + }, + { + gtm: '20220318/232512', + mil: '781328.6', + hgt: '52', + spd: '47.0', + agl: '354', + lon: '67878171', + lat: '16891691' + }, + { + gtm: '20220318/232535', + mil: '781328.9', + hgt: '51', + spd: '51.0', + agl: '354', + lon: '67877943', + lat: '16893449' + }, + { + gtm: '20220318/232535', + mil: '781328.9', + hgt: '51', + spd: '51.0', + agl: '354', + lon: '67877943', + lat: '16893449' + }, + { + gtm: '20220318/232535', + mil: '781328.9', + hgt: '51', + spd: '51.0', + agl: '354', + lon: '67877943', + lat: '16893449' + }, + { + gtm: '20220318/232537', + mil: '781329.0', + hgt: '51', + spd: '50.5', + agl: '353', + lon: '67877925', + lat: '16893601' + }, + { + gtm: '20220318/232542', + mil: '781329.0', + hgt: '51', + spd: '46.5', + agl: '354', + lon: '67877880', + lat: '16893955' + }, + { + gtm: '20220318/232612', + mil: '781329.4', + hgt: '51', + spd: '44.6', + agl: '356', + lon: '67877626', + lat: '16896000' + }, + { + gtm: '20220318/232612', + mil: '781329.4', + hgt: '51', + spd: '44.6', + agl: '356', + lon: '67877626', + lat: '16896000' + }, + { + gtm: '20220318/232615', + mil: '781329.4', + hgt: '51', + spd: '45.6', + agl: '354', + lon: '67877605', + lat: '16896204' + }, + { + gtm: '20220318/232615', + mil: '781329.4', + hgt: '51', + spd: '45.6', + agl: '354', + lon: '67877605', + lat: '16896204' + }, + { + gtm: '20220318/232615', + mil: '781329.4', + hgt: '51', + spd: '45.6', + agl: '354', + lon: '67877605', + lat: '16896204' + }, + { + gtm: '20220318/232615', + mil: '781329.4', + hgt: '51', + spd: '45.6', + agl: '354', + lon: '67877605', + lat: '16896204' + }, + { + gtm: '20220318/232626', + mil: '781329.6', + hgt: '52', + spd: '33.5', + agl: '354', + lon: '67877523', + lat: '16896888' + }, + { + gtm: '20220318/232626', + mil: '781329.6', + hgt: '52', + spd: '33.5', + agl: '354', + lon: '67877523', + lat: '16896888' + }, + { + gtm: '20220318/232642', + mil: '781329.7', + hgt: '52', + spd: '39.8', + agl: '355', + lon: '67877427', + lat: '16897681' + }, + { + gtm: '20220318/232642', + mil: '781329.7', + hgt: '52', + spd: '39.8', + agl: '355', + lon: '67877427', + lat: '16897681' + }, + { + gtm: '20220318/232648', + mil: '781329.8', + hgt: '53', + spd: '42.0', + agl: '355', + lon: '67877391', + lat: '16898059' + }, + { + gtm: '20220318/232712', + mil: '781330.1', + hgt: '52', + spd: '52.1', + agl: '3', + lon: '67877355', + lat: '16899802' + }, + { + gtm: '20220318/232715', + mil: '781330.1', + hgt: '51', + spd: '50.6', + agl: '3', + lon: '67877369', + lat: '16900034' + }, + { + gtm: '20220318/232715', + mil: '781330.1', + hgt: '51', + spd: '50.6', + agl: '3', + lon: '67877369', + lat: '16900034' + }, + { + gtm: '20220318/232719', + mil: '781330.2', + hgt: '51', + spd: '46.3', + agl: '4', + lon: '67877394', + lat: '16900330' + }, + { + gtm: '20220318/232719', + mil: '781330.2', + hgt: '51', + spd: '46.3', + agl: '4', + lon: '67877394', + lat: '16900330' + }, + { + gtm: '20220318/232720', + mil: '781330.2', + hgt: '51', + spd: '43.4', + agl: '5', + lon: '67877400', + lat: '16900396' + }, + { + gtm: '20220318/232721', + mil: '781330.2', + hgt: '51', + spd: '40.7', + agl: '5', + lon: '67877406', + lat: '16900458' + }, + { + gtm: '20220318/232723', + mil: '781330.2', + hgt: '51', + spd: '37.2', + agl: '5', + lon: '67877418', + lat: '16900573' + }, + { + gtm: '20220318/232725', + mil: '781330.2', + hgt: '51', + spd: '36.9', + agl: '5', + lon: '67877430', + lat: '16900686' + }, + { + gtm: '20220318/232726', + mil: '781330.3', + hgt: '51', + spd: '34.2', + agl: '5', + lon: '67877436', + lat: '16900738' + }, + { + gtm: '20220318/232735', + mil: '781330.3', + hgt: '50', + spd: '0.0', + agl: '8', + lon: '67877463', + lat: '16901026' + }, + { + gtm: '20220318/232736', + mil: '781330.3', + hgt: '50', + spd: '0.0', + agl: '13', + lon: '67877463', + lat: '16901028' + }, + { + gtm: '20220318/232738', + mil: '781330.3', + hgt: '50', + spd: '0.0', + agl: '13', + lon: '67877463', + lat: '16901028' + }, + { + gtm: '20220318/232742', + mil: '781330.3', + hgt: '49', + spd: '5.0', + agl: '7', + lon: '67877461', + lat: '16901025' + }, + { + gtm: '20220318/232812', + mil: '781330.5', + hgt: '53', + spd: '31.0', + agl: '8', + lon: '67877590', + lat: '16901907' + }, + { + gtm: '20220318/232842', + mil: '781330.8', + hgt: '51', + spd: '38.9', + agl: '8', + lon: '67877824', + lat: '16903461' + }, + { + gtm: '20220318/232854', + mil: '781330.9', + hgt: '52', + spd: '38.2', + agl: '8', + lon: '67877931', + lat: '16904161' + }, + { + gtm: '20220318/232855', + mil: '781330.9', + hgt: '52', + spd: '38.1', + agl: '6', + lon: '67877940', + lat: '16904220' + }, + { + gtm: '20220318/232858', + mil: '781330.9', + hgt: '51', + spd: '35.3', + agl: '9', + lon: '67877965', + lat: '16904382' + }, + { + gtm: '20220318/232904', + mil: '781331.0', + hgt: '48', + spd: '20.2', + agl: '5', + lon: '67877995', + lat: '16904638' + }, + { + gtm: '20220318/232906', + mil: '781331.0', + hgt: '47', + spd: '16.7', + agl: '3', + lon: '67877999', + lat: '16904694' + }, + { + gtm: '20220318/232912', + mil: '781331.0', + hgt: '46', + spd: '7.8', + agl: '5', + lon: '67878009', + lat: '16904811' + }, + { + gtm: '20220318/232942', + mil: '781331.0', + hgt: '45', + spd: '0.0', + agl: '25', + lon: '67878015', + lat: '16904842' + }, + { + gtm: '20220318/233012', + mil: '781331.0', + hgt: '45', + spd: '0.0', + agl: '25', + lon: '67878015', + lat: '16904842' + }, + { + gtm: '20220318/233014', + mil: '781331.0', + hgt: '45', + spd: '0.0', + agl: '25', + lon: '67878015', + lat: '16904842' + }, + { + gtm: '20220318/233038', + mil: '781331.1', + hgt: '69', + spd: '20.0', + agl: '1', + lon: '67878081', + lat: '16905255' + }, + { + gtm: '20220318/233042', + mil: '781331.1', + hgt: '68', + spd: '14.7', + agl: '1', + lon: '67878078', + lat: '16905358' + }, + { + gtm: '20220318/233049', + mil: '781331.1', + hgt: '65', + spd: '0.0', + agl: '10', + lon: '67878066', + lat: '16905462' + }, + { + gtm: '20220318/233112', + mil: '781331.1', + hgt: '66', + spd: '0.0', + agl: '156', + lon: '67878066', + lat: '16905465' + }, + { + gtm: '20220318/233142', + mil: '781331.1', + hgt: '66', + spd: '0.0', + agl: '156', + lon: '67878066', + lat: '16905465' + }, + { + gtm: '20220318/233212', + mil: '781331.1', + hgt: '66', + spd: '0.0', + agl: '156', + lon: '67878066', + lat: '16905465' + }, + { + gtm: '20220318/233215', + mil: '781331.1', + hgt: '66', + spd: '0.0', + agl: '156', + lon: '67878066', + lat: '16905465' + }, + { + gtm: '20220318/233217', + mil: '781331.1', + hgt: '66', + spd: '0.0', + agl: '156', + lon: '67878066', + lat: '16905465' + }, + { + gtm: '20220318/233242', + mil: '781331.2', + hgt: '76', + spd: '20.3', + agl: '359', + lon: '67878033', + lat: '16905852' + }, + { + gtm: '20220318/233308', + mil: '781331.4', + hgt: '72', + spd: '31.7', + agl: '354', + lon: '67877901', + lat: '16906990' + }, + { + gtm: '20220318/233312', + mil: '781331.4', + hgt: '72', + spd: '29.4', + agl: '354', + lon: '67877878', + lat: '16907175' + }, + { + gtm: '20220318/233319', + mil: '781331.5', + hgt: '77', + spd: '16.4', + agl: '354', + lon: '67877837', + lat: '16907422' + }, + { + gtm: '20220318/233320', + mil: '781331.5', + hgt: '77', + spd: '14.3', + agl: '354', + lon: '67877833', + lat: '16907446' + }, + { + gtm: '20220318/233331', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233340', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233342', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233412', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233412', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233413', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233415', + mil: '781331.5', + hgt: '84', + spd: '0.0', + agl: '359', + lon: '67877811', + lat: '16907595' + }, + { + gtm: '20220318/233442', + mil: '781331.6', + hgt: '68', + spd: '23.8', + agl: '351', + lon: '67877749', + lat: '16908142' + }, + { + gtm: '20220318/233447', + mil: '781331.6', + hgt: '71', + spd: '24.6', + agl: '353', + lon: '67877736', + lat: '16908327' + }, + { + gtm: '20220318/233512', + mil: '781331.9', + hgt: '92', + spd: '30.4', + agl: '355', + lon: '67877602', + lat: '16909459' + }, + { + gtm: '20220318/233533', + mil: '781332.1', + hgt: '75', + spd: '36.4', + agl: '3', + lon: '67877514', + lat: '16910521' + }, + { + gtm: '20220318/233534', + mil: '781332.1', + hgt: '75', + spd: '34.4', + agl: '4', + lon: '67877517', + lat: '16910574' + }, + { + gtm: '20220318/233537', + mil: '781332.1', + hgt: '72', + spd: '31.2', + agl: '7', + lon: '67877530', + lat: '16910719' + }, + { + gtm: '20220318/233542', + mil: '781332.1', + hgt: '70', + spd: '16.0', + agl: '11', + lon: '67877557', + lat: '16910883' + }, + { + gtm: '20220318/233542', + mil: '781332.1', + hgt: '70', + spd: '16.0', + agl: '11', + lon: '67877557', + lat: '16910883' + }, + { + gtm: '20220318/233543', + mil: '781332.1', + hgt: '69', + spd: '13.7', + agl: '11', + lon: '67877562', + lat: '16910904' + }, + { + gtm: '20220318/233543', + mil: '781332.1', + hgt: '69', + spd: '13.7', + agl: '11', + lon: '67877562', + lat: '16910904' + }, + { + gtm: '20220318/233549', + mil: '781332.1', + hgt: '64', + spd: '5.2', + agl: '12', + lon: '67877580', + lat: '16910983' + }, + { + gtm: '20220318/233550', + mil: '781332.1', + hgt: '64', + spd: '5.0', + agl: '13', + lon: '67877582', + lat: '16910989' + }, + { + gtm: '20220318/233554', + mil: '781332.1', + hgt: '64', + spd: '0.0', + agl: '15', + lon: '67877590', + lat: '16911013' + }, + { + gtm: '20220318/233555', + mil: '781332.1', + hgt: '64', + spd: '0.0', + agl: '15', + lon: '67877593', + lat: '16911009' + }, + { + gtm: '20220318/233559', + mil: '781332.1', + hgt: '64', + spd: '0.0', + agl: '15', + lon: '67877593', + lat: '16911009' + }, + { + gtm: '20220318/233612', + mil: '781332.2', + hgt: '63', + spd: '17.9', + agl: '15', + lon: '67877634', + lat: '16911165' + }, + { + gtm: '20220318/233614', + mil: '781332.2', + hgt: '63', + spd: '21.6', + agl: '15', + lon: '67877653', + lat: '16911225' + }, + { + gtm: '20220318/233623', + mil: '781332.3', + hgt: '64', + spd: '29.1', + agl: '14', + lon: '67877749', + lat: '16911583' + }, + { + gtm: '20220318/233642', + mil: '781332.4', + hgt: '64', + spd: '34.6', + agl: '15', + lon: '67878022', + lat: '16912480' + }, + { + gtm: '20220318/233712', + mil: '781332.8', + hgt: '69', + spd: '40.8', + agl: '1', + lon: '67878343', + lat: '16914232' + }, + { + gtm: '20220318/233742', + mil: '781333.1', + hgt: '68', + spd: '45.1', + agl: '2', + lon: '67878369', + lat: '16916341' + }, + { + gtm: '20220318/233748', + mil: '781333.2', + hgt: '70', + spd: '43.5', + agl: '1', + lon: '67878378', + lat: '16916745' + }, + { + gtm: '20220318/233748', + mil: '781333.2', + hgt: '70', + spd: '43.5', + agl: '1', + lon: '67878378', + lat: '16916745' + }, + { + gtm: '20220318/233755', + mil: '781333.3', + hgt: '72', + spd: '40.6', + agl: '355', + lon: '67878363', + lat: '16917192' + }, + { + gtm: '20220318/233812', + mil: '781333.4', + hgt: '75', + spd: '0.0', + agl: '5', + lon: '67878269', + lat: '16917732' + }, + { + gtm: '20220318/233835', + mil: '781333.4', + hgt: '75', + spd: '0.0', + agl: '5', + lon: '67878269', + lat: '16917732' + }, + { + gtm: '20220318/233842', + mil: '781333.4', + hgt: '74', + spd: '5.6', + agl: '351', + lon: '67878268', + lat: '16917748' + }, + { + gtm: '20220318/233851', + mil: '781333.4', + hgt: '74', + spd: '5.5', + agl: '319', + lon: '67878247', + lat: '16917819' + }, + { + gtm: '20220318/233906', + mil: '781333.4', + hgt: '74', + spd: '0.0', + agl: '270', + lon: '67878237', + lat: '16917831' + }, + { + gtm: '20220318/233912', + mil: '781333.4', + hgt: '73', + spd: '5.8', + agl: '321', + lon: '67878233', + lat: '16917831' + }, + { + gtm: '20220318/233942', + mil: '781333.6', + hgt: '71', + spd: '30.2', + agl: '266', + lon: '67877373', + lat: '16917885' + }, + { + gtm: '20220318/234012', + mil: '781333.9', + hgt: '65', + spd: '42.4', + agl: '257', + lon: '67875364', + lat: '16917607' + }, + { + gtm: '20220318/234014', + mil: '781333.9', + hgt: '65', + spd: '42.0', + agl: '257', + lon: '67875223', + lat: '16917579' + }, + { + gtm: '20220318/234016', + mil: '781333.9', + hgt: '65', + spd: '41.1', + agl: '258', + lon: '67875084', + lat: '16917555' + }, + { + gtm: '20220318/234020', + mil: '781334.0', + hgt: '64', + spd: '37.5', + agl: '258', + lon: '67874827', + lat: '16917507' + }, + { + gtm: '20220318/234024', + mil: '781334.0', + hgt: '64', + spd: '34.8', + agl: '259', + lon: '67874583', + lat: '16917462' + }, + { + gtm: '20220318/234042', + mil: '781334.2', + hgt: '62', + spd: '39.5', + agl: '257', + lon: '67873494', + lat: '16917261' + }, + { + gtm: '20220318/234112', + mil: '781334.5', + hgt: '60', + spd: '42.6', + agl: '259', + lon: '67871335', + lat: '16916832' + }, + { + gtm: '20220318/234139', + mil: '781334.9', + hgt: '59', + spd: '47.2', + agl: '258', + lon: '67869316', + lat: '16916439' + }, + { + gtm: '20220318/234142', + mil: '781334.9', + hgt: '59', + spd: '46.9', + agl: '261', + lon: '67869081', + lat: '16916398' + }, + { + gtm: '20220318/234151', + mil: '781335.0', + hgt: '57', + spd: '46.5', + agl: '258', + lon: '67868377', + lat: '16916275' + }, + { + gtm: '20220318/234153', + mil: '781335.1', + hgt: '57', + spd: '45.8', + agl: '257', + lon: '67868223', + lat: '16916244' + }, + { + gtm: '20220318/234156', + mil: '781335.1', + hgt: '57', + spd: '42.0', + agl: '258', + lon: '67868010', + lat: '16916205' + }, + { + gtm: '20220318/234200', + mil: '781335.1', + hgt: '56', + spd: '41.8', + agl: '261', + lon: '67867728', + lat: '16916160' + }, + { + gtm: '20220318/234201', + mil: '781335.1', + hgt: '56', + spd: '41.8', + agl: '261', + lon: '67867657', + lat: '16916151' + }, + { + gtm: '20220318/234210', + mil: '781335.2', + hgt: '55', + spd: '22.5', + agl: '291', + lon: '67867140', + lat: '16916116' + }, + { + gtm: '20220318/234212', + mil: '781335.2', + hgt: '54', + spd: '18.5', + agl: '317', + lon: '67867087', + lat: '16916154' + }, + { + gtm: '20220318/234213', + mil: '781335.2', + hgt: '54', + spd: '17.1', + agl: '331', + lon: '67867072', + lat: '16916175' + }, + { + gtm: '20220318/234242', + mil: '781335.5', + hgt: '51', + spd: '38.3', + agl: '339', + lon: '67866588', + lat: '16917292' + }, + { + gtm: '20220318/234244', + mil: '781335.5', + hgt: '50', + spd: '39.4', + agl: '337', + lon: '67866537', + lat: '16917402' + }, + { + gtm: '20220318/234244', + mil: '781335.5', + hgt: '50', + spd: '39.4', + agl: '337', + lon: '67866537', + lat: '16917402' + }, + { + gtm: '20220318/234246', + mil: '781335.5', + hgt: '50', + spd: '40.3', + agl: '337', + lon: '67866481', + lat: '16917513' + }, + { + gtm: '20220318/234300', + mil: '781335.7', + hgt: '48', + spd: '41.4', + agl: '339', + lon: '67866105', + lat: '16918333' + }, + { + gtm: '20220318/234303', + mil: '781335.7', + hgt: '47', + spd: '40.4', + agl: '341', + lon: '67866034', + lat: '16918510' + }, + { + gtm: '20220318/234310', + mil: '781335.8', + hgt: '46', + spd: '36.7', + agl: '345', + lon: '67865893', + lat: '16918891' + }, + { + gtm: '20220318/234312', + mil: '781335.8', + hgt: '46', + spd: '36.3', + agl: '346', + lon: '67865863', + lat: '16919000' + }, + { + gtm: '20220318/234312', + mil: '781335.8', + hgt: '46', + spd: '36.3', + agl: '346', + lon: '67865863', + lat: '16919000' + }, + { + gtm: '20220318/234320', + mil: '781335.9', + hgt: '47', + spd: '33.0', + agl: '347', + lon: '67865759', + lat: '16919403' + }, + { + gtm: '20220318/234322', + mil: '781335.9', + hgt: '47', + spd: '32.5', + agl: '346', + lon: '67865734', + lat: '16919500' + }, + { + gtm: '20220318/234336', + mil: '781336.0', + hgt: '46', + spd: '15.0', + agl: '307', + lon: '67865520', + lat: '16919992' + }, + { + gtm: '20220318/234339', + mil: '781336.0', + hgt: '45', + spd: '14.0', + agl: '262', + lon: '67865449', + lat: '16920007' + }, + { + gtm: '20220318/234342', + mil: '781336.0', + hgt: '45', + spd: '14.5', + agl: '253', + lon: '67865385', + lat: '16919996' + }, + { + gtm: '20220318/234412', + mil: '781336.2', + hgt: '48', + spd: '35.9', + agl: '264', + lon: '67864050', + lat: '16919770' + }, + { + gtm: '20220318/234442', + mil: '781336.5', + hgt: '52', + spd: '36.5', + agl: '275', + lon: '67862200', + lat: '16919775' + }, + { + gtm: '20220318/234446', + mil: '781336.6', + hgt: '52', + spd: '34.6', + agl: '272', + lon: '67861959', + lat: '16919789' + }, + { + gtm: '20220318/234451', + mil: '781336.6', + hgt: '53', + spd: '32.4', + agl: '271', + lon: '67861677', + lat: '16919794' + }, + { + gtm: '20220318/234452', + mil: '781336.6', + hgt: '53', + spd: '31.6', + agl: '273', + lon: '67861623', + lat: '16919796' + }, + { + gtm: '20220318/234502', + mil: '781336.7', + hgt: '53', + spd: '30.1', + agl: '267', + lon: '67861212', + lat: '16919802' + }, + { + gtm: '20220318/234505', + mil: '781336.7', + hgt: '52', + spd: '28.7', + agl: '266', + lon: '67860969', + lat: '16919784' + }, + { + gtm: '20220318/234512', + mil: '781336.8', + hgt: '53', + spd: '7.7', + agl: '265', + lon: '67860732', + lat: '16919767' + }, + { + gtm: '20220318/234520', + mil: '781336.8', + hgt: '53', + spd: '0.0', + agl: '285', + lon: '67860708', + lat: '16919764' + }, + { + gtm: '20220318/234524', + mil: '781336.8', + hgt: '53', + spd: '0.0', + agl: '285', + lon: '67860708', + lat: '16919764' + }, + { + gtm: '20220318/234542', + mil: '781336.8', + hgt: '53', + spd: '0.0', + agl: '285', + lon: '67860708', + lat: '16919764' + }, + { + gtm: '20220318/234601', + mil: '781336.8', + hgt: '53', + spd: '0.0', + agl: '285', + lon: '67860708', + lat: '16919764' + }, + { + gtm: '20220318/234612', + mil: '781336.8', + hgt: '54', + spd: '7.4', + agl: '257', + lon: '67860625', + lat: '16919760' + } +]; diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html new file mode 100644 index 00000000..a06a10ec --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html @@ -0,0 +1,265 @@ + + + + + + +
    + +

    订单号: {{ i?.billCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.goodsResource?.enterpriseInfoName }} + {{ i?.goodsResource?.shipperAppUserName }} + {{ i?.goodsResource?.enterpriseProjectName }} + {{ i?.goodsResource?.serviceTypeLabel }} + {{ i?.createUserName }} {{ i?.createUserPhone ? '/' + i?.createUserPhone : '' }} + {{ i?.goodsResource?.dispatchName }}{{ i?.goodsResource?.dispatchPhone ? '/' + + i?.goodsResource?.dispatchPhone : '' }} + + {{ i?.externalBillCode }} + {{ i?.goodsResource?.resourceCode }} + {{ i?.wayBill?.wayBillCode }} + {{ i?.goodsResource?.paymentDays }} +
    + + + + + + + + +
    +
    +
    + +
    +
    + + + +
    +
    +
    + + + + 货物信息 + + {{ i?.goodsResource?.enterpriseInfoName }} + + + {{i?.goodsInfoList?.[0]?.goodsName}} + + + + + {{i?.goodsInfoList?.[0]?.weight}}吨,{{i?.goodsInfoList?.[0]?.volume}}方,{{i?.goodsInfoList?.[0]?.number}}件 + {{ i?.carModel }}{{ i?.carLength ? '/' + i?.carLength : '' }} + {{ i?.driverName }}{{ i?.driverPhone ? '/' + i?.driverPhone : '' }}{{ i?.carNo ? '/' + i?.carNo : + '' }} + {{ i?.driverCarModelLabel }},{{ i?.driverCarLengthLabel }}米,{{ i?.driverCarWeight }}吨 + +
    +

    装货卸货信息 + ( + + + ) + +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{ item?.province }}{{ item.city }}{{ item.area }}{{ item.detailedAddress }}

    +

    联系人:{{ item.appUserName }}{{ item.contractTelephone ? '/' + item.contractTelephone : '' }}

    +
    +
    +
    +

    计划装货时间:{{ i?.goodsResource?.loadingTime }}

    +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{ item?.province }}{{ item.city }}{{ item.area }}{{ item.detailedAddress }}

    +

    联系人:{{ item.appUserName }}{{ item.contractTelephone ? '/' + item.contractTelephone : '' }}

    +
    +
    +
    +

    计划卸货时间:{{ i?.goodsResource?.unloadingTime }}

    +
    +
    +
    +
    +
    + + + + {{ i?.goodsResource?.insuranceTypeLabel }} + + + {{ i?.goodsResource?.goodsValue !== null ? (i?.goodsResource?.goodsValue | currency) + '元' : '-' }} + + + {{ i?.goodsResource?.insurancePremium !== null ? (i?.goodsResource?.insurancePremium | currency) + '元' : '-' }} + + + + + + + + {{ item.price | currency }} + + + {{ item.price + item.surcharge | currency }} + + + {{ item.surcharge | currency }} + + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ (i?.totalRate * 100).toFixed(2) }}% ) +
    +
    车队长:{{ i?.payeeName }}{{ i?.payeePhone ? '/' + + i?.payeePhone : '' }}/{{ i?.payeeIdNo }}
    +
    + + + + + 查看附件      + 补充协议 + + + + + + + + + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + + {{ i?.supplementaryInformationVO?.receiptUserName }} / {{ i?.supplementaryInformationVO?.phon }} + + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + + + + + + {{ i?.goodsResource?.remarks }} + + + + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + + +
    +
    您的订单可能存在交易风险,请及时提交申诉材料,提交成功后,平台将及时完成审核并通知您!
    +
    如果您的运单没有问题,可以提出申诉,并提供相关资料,我们将24小时内审核反馈
    +
      +
    • 系统识别:{{ item?.complianceTypeName }}
    • +
    • {{ item?.determineDetails }}
    • +
    +
    +
    + + + + + + + + +
    +
    + + +
    暂无附件信息
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.less b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.less new file mode 100644 index 00000000..64f5143e --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.less @@ -0,0 +1,84 @@ +:host { + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .source-info { + p { + margin-bottom: .5em; + } + } + + .freight-info-box { + width: 95%; + } + + .freigth-label { + display : inline-block; + width : 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width : 70%; + margin: 0 auto; + } + } + + } + + .leftPadding { + padding-right: 100px; + } + .hide{ + display: none; + } + .handling-info { + min-height: 100px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } + .target-fix { + display: block; + margin-top: 290px; + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.spec.ts b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.spec.ts new file mode 100644 index 00000000..3e4df0bf --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 15:31:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-10 09:53:00 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\vehicle-detail\\vehicle-detail.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementVehicleDetailComponent } from './vehicle-detail.component'; + +describe('OrderManagementVehicleDetailComponent', () => { + let component: OrderManagementVehicleDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementVehicleDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementVehicleDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts new file mode 100644 index 00000000..bf23f79e --- /dev/null +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts @@ -0,0 +1,263 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-28 14:42:03 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-13 19:52:15 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\vehicle-detail\\vehicle-detail.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import format from 'date-fns/format'; +import { OrderManagementService } from '../../services/order-management.service'; +@Component({ + selector: 'app-supply-management-vehicle-detail', + templateUrl: './vehicle-detail.component.html', + styleUrls: ['./vehicle-detail.component.less', '../../../commom/less/trajectory.less'] +}) +export class OrderManagementVehicleDetailComponent implements OnInit { + id = this.route.snapshot.params.id; + @ViewChild('logSt') logSt!: STComponent; + modalcontent: any; + modalTitle: string = ''; + trajectory = 'car'; + operationList: any; + mapList: any[] = []; //地图点位数据组 + pois: any[] = []; + addressItems: any[] = []; //打点地址数据组 + warringList: any[] = []; //打点地址数据组 + abnormalList: any[] = []; + i: any = { + unLoadingPlaceList: [], + billExpenseDetails: [], + goodsInfoList: [], + goodsResource: [] + }; + billExpenses: any[] = []; //运费信息表格信息 + imges: any; + attObj: any; + totalObj: any; + approvalLsit: any; + isVisible = false; + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte', width: 120, className: 'text-center' }, + { title: '地点', index: 'parkAdr' } + ]; + logColumns3: STColumn[] = [ + { title: '时间', index: 'warningTime' }, + { title: '异常预警类型', index: 'warningTypeLabel' } + ]; + operateLogColums: STColumn[] = [ + { title: '内容', index: 'operationContent' }, + { title: '操作人', render: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp' } + ]; + logColumns: STColumn[] = [ + { title: '款项', index: 'expenseCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatusLabel' + } + ]; + + constructor( + public route: ActivatedRoute, + private msgSrv: NzMessageService, + public service: OrderManagementService, + private router: Router, + private modal: NzModalService + ) {} + + ngOnInit(): void { + this.initData(); + this.getTrajectory(); + } + get logParams() { + return { operateObject: this.i?.billCode, operateTypeList: ['3', '8'] }; + } + initData() { + this.service.request(this.service.$api_get_getWholeBillDetail, { id: this.id }).subscribe(res => { + if (res) { + this.i = res; + this.pois = [ + { + markerLabel: '装', + color: 'blue', + position: [res.startingPoint.longitude, res.startingPoint.latitude], + title: `发货地:${res.startingPoint.province}${res.startingPoint.city}${res.startingPoint.area || ''}${ + res.startingPoint.detailedAddress + }`, + time: '计划出发时间:' + res.loadPlanTime + }, + { + markerLabel: '卸', + color: 'red', + position: [res.endPoint.longitude, res.endPoint.latitude], + title: `卸货地:${res.endPoint.province}${res.endPoint.city}${res.endPoint.area}${res.endPoint.detailedAddress}`, + time: '计划卸货时间:' + res.unloadPlanTime + } + ]; + this.service + .request(this.service.$api_get_log_list, { operateObject: this.i?.billCode, operateTypeList: ['3', '8'] }) + .subscribe(res => { + if (res) { + console.log('操作日志'); + console.log(res); + let a: any = []; + res.records.forEach((item: any) => { + a.push({ + value: `操作人: ${item.operator}
    操作内容: ${item.operationContent}`, + time: item.operatorTimestamp, + color: 'green' + }); + }); + console.log(a); + this.operationList = a; + } + }); + this.billExpenses = this.i?.billExpenseDetails?.filter( + (data: any) => data.expenseCode === 'PRE' || data.expenseCode === 'RECE' || data.expenseCode === 'BACK' + ); + } + }); + this.service.request(this.service.$api_listBillComplianceAbnormalByBillId, { id: this.id }).subscribe(res => { + if (res) { + console.log('风险详情'); + console.log(res); + this.abnormalList = res; + } + }); + this.service.request(this.service.$api_getAbnormalWarningByBillId, { id: this.id }).subscribe(res => { + if (res) { + console.log('异常预警'); + console.log(res); + this.warringList = res; + } + }); + } + // 取消订单 + cancellation() { + // api_get_cancelAnOrder + this.modal.confirm({ + nzTitle: '确定取消该订单吗?', + nzContent: `取消后无法恢复,请确认`, + nzOnOk: () => + this.service.request(this.service.$api_get_cancelAnOrder, { id: this.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.initData(); + } + }) + }); + } + goBack() { + window.history.go(-1); + } + // 修改订单 + changeOrder() { + this.router.navigate(['order-management/vehicle-detailChange', this.id]); + } + agreement(value: any) { + if (value === '1') { + // this.modalTitle = '附件信息'; + // this.modalcontent = this.i?.contractContent?.contractContent; + this.service.openURL(this.i?.contractContent?.contractFilePath); + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + this.isVisible = true; + } + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + // elf['elementRef'].nativeElement.className = 'target-fix' + } + } + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: `${item.spd}`, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems: any[] = res.parkArray; + if (addressItems?.length > 0) { + addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list || []; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + if (!time) { + return ''; + } + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.html b/src/app/routes/order-management/components/vehicle/vehicle.component.html new file mode 100644 index 00000000..35c07449 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.html @@ -0,0 +1,219 @@ + + + + + + +
    + + + + + + + + + + +
    + +
    + + + {{ item.billCode }} +
    + {{ item?.billTypeLabel }}{{ item?.serviceTypeLabel }} +
    +
    + {{ item?.billStatusLabel }} +
    +
    + +
    {{ item?.goodsName }}
    +
    + {{ item?.weight ? item?.weight + '吨/' : '' }} + {{ item?.volume ? item?.volume + '方/' : '' }} + {{ item?.goodsNumber ? item?.goodsNumber + '件' : '' }} +
    +
    + +
    {{ item?.createUserName }}{{ item?.createUserPhone ? "/" + item?.createUserPhone : '' }}
    +
    + + +
    +

    + {{ data.expenseName }}:{{ data.price | currency }} + {{ data.expenseName }}:{{ (data.price * 100).toFixed(2) + '%' }} + {{ data.paymentStatusLabel }} +

    +
    +
    + +
    + {{ i?.costName }}:{{ i?.price }} +
    +
    + +
    {{ item?.driverName }}{{ item?.driverPhone ? '/' + item?.driverPhone : '' }}{{ item?.carNo ? '/' + item?.carNo : '' }}

    +
    {{ item?.payeeName ? item?.payeeName + '/' : ''}}{{ item?.payeePhone }}
    +
    + + +
    装 | {{ item?.loadingTime }}
    +
    卸 | {{ item?.unloadingTime }}
    +
    +
    +
    +
    + + + + + + {{ index + 1 }} + + + + + + + + + + + + + + {{ item.amountBeforeChange | currency }} + + ¥{{ item.amountchangeValue | number: '0.2-2' + }} + + {{ item.amountAfterChange | currency }} + + +
    变更原因:{{ ViewCause?.changeCause }}
    +
    拒绝原因:{{ ViewCause?.refuseCause }}
    +
    注:附加费依据调整后的运输费用重新计算
    +
    + + + + +
    + + + + + + + + + + +
    暂无评价内容
    +
    + + + + + + +
    暂无评价内容
    +
    +
    +
    + + + + +
    + + +
    + +
    + +
    + + + +
    +
    +
    + + +
    + + + + + + +
    +
    + +
    + +
    已选择{{ + selectedRows?.length || 0 }}条订单,确认批量签收吗? +
    +
    签收后不可再修改运费,请确保运费等信息准确无误后,再进行签收。
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.less b/src/app/routes/order-management/components/vehicle/vehicle.component.less new file mode 100644 index 00000000..149a0bc9 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.less @@ -0,0 +1,13 @@ + + :host { + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.ts b/src/app/routes/order-management/components/vehicle/vehicle.component.ts new file mode 100644 index 00000000..09e3ac81 --- /dev/null +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.ts @@ -0,0 +1,877 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { fromEvent, of } from 'rxjs'; +import { debounceTime, map } from 'rxjs/operators'; +import { BasicTableComponent } from 'src/app/routes/commom/components/basic-table/basic-table.component'; +import { OneCarOrderCancelConfirmComponent } from '../../modal/vehicle/cancel-confirm/cancel-confirm.component'; +import { VehicleConfirReceiptComponent } from '../../modal/vehicle/confir-receipt/confir-receipt.component'; +import { VehicleFreightPeopleComponent } from '../../modal/vehicle/freight-people/freight-people.component'; +import { VehicleModifyCaptainComponent } from '../../modal/vehicle/modify-captain/modify-captain.component'; +import { VehicleModifyRateComponent } from '../../modal/vehicle/modify-rate/modify-rate.component'; +import { VehicleUpdateFreightComponent } from '../../modal/vehicle/update-freight/update-freight.component'; +import { OneCarOrderViewtrackComponent } from '../../modal/vehicle/view-track/view-track.component'; +import { OrderManagementService } from '../../services/order-management.service'; + +@Component({ + selector: 'app-supply-management-vehicle', + templateUrl: './vehicle.component.html', + styleUrls: ['../../../commom/less/commom-table.less','./vehicle.component.less'] +}) +export class OrderManagementVehicleComponent extends BasicTableComponent implements OnInit { + ui: SFUISchema = {}; + schema: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + loading: boolean = true; + paramsList: any; + changeId: any; // 主页面查看运费变更记录id - 用于运费变更记录 + changeViewId: any; // 查看运费变更记录id - 用于查看 + ViewCause: any; // 变更运费查看数据 + shipList: any; // 货主评价 数据 + diverList: any; // 司机评价 数据 + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, + ]; + tabs = { + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + signQuantity: 0, + compolatelQuantity: 0, + GoingQuantity: 0, + totalCount: 0 + }; + resourceStatus: any; + + visible = false; + constructor( + public service: OrderManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + public router: Router, + public ar: ActivatedRoute + ) { + super(); + } + + /** + * 查询参数 + */ + get changeParams() { + return { + id: this.changeId + }; + } + get changeViewParams() { + return { + id: this.changeViewId + }; + } + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.billStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || this.paramsList); + delete params._$expand; + return { + ...a, + ...params, + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const a: any = {}; + if (this.resourceStatus) { + a.billStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || this.paramsList); + delete params._$expand; + this.paramsList = params + Object.assign(requestOptions.body, { + ...a, + ...this.paramsList, + }); + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data); + this.loading = false; + return data.map(item => ({ + ...item, + disabled: item.billStatus == '6' + })); + }; + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + ngOnInit(): void { + this.getGoodsSourceStatistical(); + this.initSF(); + this.initST(); + this.initSTFloat(); + this.initSTFloatView(); + } + + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + getGoodsSourceStatistical() { + this.tabs = { + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + signQuantity: 0, + compolatelQuantity: 0, + GoingQuantity: 0, + totalCount: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.billStatus; + this.service.request(this.service.$api_statisticalStatus, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((element: any) => { + if (element.billStatusLabel === '待发车') { + this.tabs.stayQuantity = element.quantity; + } else if (element.billStatusLabel === '待接单') { + this.tabs.receivedQuantity = element.quantity; + } else if (element.billStatusLabel === '运输中') { + this.tabs.GoingQuantity = element.quantity; + } else if (element.billStatusLabel === '待签收') { + this.tabs.signQuantity = element.quantity; + } else if (element.billStatusLabel === '已完成') { + this.tabs.compolatelQuantity = element.quantity; + } else if (element.billStatusLabel === '已取消') { + this.tabs.cancelQuantity = element.quantity; + } + totalCount += element.quantity; + }); + this.tabs.totalCount = totalCount; + } + }); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '最多100个单号,空号隔开' + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '最多100个单号,空号隔开', + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: {} + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: {} + }, + driverName: { + title: '承运司机', + type: 'string', + ui: {} + }, + + carNo: { + title: '车牌号', + type: 'string', + ui: {} + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: {} + }, + paymentStatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLable: true + } as SFSelectWidgetSchema + }, + // createTime: { + // title: '创建时间', + // type: 'string', + // ui: { + // widget: 'date', + // mode: 'range', + // format: 'yyyy-MM-dd' + // } as SFDateWidgetSchema + // }, + createTime: { + type: 'string', + title: '创建时间', + ui: { widget: 'sl-from-to', type: 'date', format: 'yyyy-MM-dd' } as SFDateWidgetSchema, + }, + riskStatus: { + type: 'string', + title: '是否风险单', + enum: [ + { label: '全部', value: '' }, + { label: '是', value: '3' }, + { label: '否', value: '1' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkEnterpriseName() + } + }, + // goodsNameId: { + // type: 'string', + // title: '货物名称', + // ui: { + // widget: 'select', + // placeholder: '请选择', + // errors: { required: '请选择货物类型' }, + // visibleIf: { + // _$expand: (value: boolean) => value, + // }, + // asyncData: () => + // this.shipperservice.loadConfigByKey('goods.name.config.type').pipe( + // map((data: any) => { + // return data[0].children?.map((m: any) => { + // return { label: m.name, value: m.id }; + // }); + // }) + // ), + // } as SFSelectWidgetSchema + // }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'service:type' }, + containsAllLable: true + } as SFSelectWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 95, grid: { span: 24, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '订单号', + width: '200px', + fixed: 'left', + className: 'text-left', + render: 'billCode' + }, + { title: '货主', index: 'shipperAppUserName', width: '250px', className: 'text-left' }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '180px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '180px', + index: 'unloadingAddressArr' + }, + { + title: '运费明细', + width: '250px', + className: 'text-right', + render: 'mybidDetailInfo' + }, + { + title: '货物信息', + className: 'text-left', + width: '170px', + render: 'goodsName' + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + render: 'driverName' + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '250px', className: 'text-left' }, + { title: '关联运单号', index: 'wayBillCode', width: '170px', className: 'text-left' }, + { title: '关联货源编号', index: 'resourceCode', width: '170px', className: 'text-left' }, + { + title: '装卸货时间', + width: '200px', + className: 'text-left', + render: 'loadingTime' + }, + { + title: '录单时间', + className: 'text-left', + index: 'recordTime', + width: '170px' + }, + { + title: '创建时间', + className: 'text-left', + index: 'createTime', + width: '170px' + }, + { + title: '操作', + fixed: 'right', + width: '130px', + className: 'text-center block-td', + buttons: [ + { + text: '运费变更记录', + click: _record => this.OpenPrice(_record), + iif: item => + item.billStatus == '4' || + item.billStatus == '5' || + item.billStatus == '2' || + item.billStatus == '3' || + item.billStatus == '6', + acl: { ability: ['ORDER-VEHICLE-ChangeApplyList'] } + }, + // { + // text: '查看详情', + // click: (item: any) => { + // this.router.navigate(['./vehicle-detail', item.id], { relativeTo: this.ar }); + // }, + // acl: { ability: ['USERCENTER-FREIGHT-USER-view'] } + // }, + { + text: '查看评价', + click: _record => this.viewEvaluate(_record), + iif: item => item.billStatus == '5', + acl: { ability: ['ORDER-VEHICLE-evaluation'] } + }, + { + text: '变更运费', + click: _record => this.updateFreight(_record), + iif: item => item.billStatus !== '1' && item.billStatus !== '6' && item.overallPaymentStatus != '2', + acl: { ability: ['ORDER-VEHICLE-FreightChangeWholeDetail'] } + }, + { + text: '确认签收', + click: _record => this.confirmReceipt(_record), + iif: item => item.billStatus == '4', + acl: { ability: ['ORDER-VEHICLE-signWholeOrder'] } + }, + { + text: '取消订单', + click: _record => this.cancellation(_record), + iif: item => item.billStatus !== '6' && item.overallPaymentStatus !== '2', + acl: { ability: ['ORDER-VEHICLE-cancelAnOrder'] } + }, + { + text: '修改订单', + click: _record => this.changeOrder(_record), + iif: item => item.billStatus == '4' || item.billStatus == '5' || item.billStatus == '2' || item.billStatus == '3', + acl: { ability: ['ORDER-VEHICLE-modificationOrder'] } + }, + { + text: '申请退款', + click: _record => this.applyRefund(_record), + iif: item => item.isApplyForRefund, + acl: { ability: ['ORDER-VEHICLE-modificationOrder'] } + }, + { + text: '查看轨迹', + click: _record => this.viewTrack(_record), + iif: item => item.billStatus !== '1' && item.billStatus !== '6' + // acl: { ability: ['VEHICLE-LIST-view'] }, + } + ] + } + ]; + } + initSTFloat() { + this.columnsFloat = [ + { + title: '序号', + className: 'text-center', + render: 'order' + }, + { + title: '操作时间', + className: 'text-center', + index: 'applyTime' + }, + { + title: '操作人', + className: 'text-center', + index: 'applyUserName' + }, + { title: '状态', index: 'handleStatusLabel', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '查看', + click: _record => this.FloatView(_record) + }, + { + text: '撤销', + click: _record => this.revoke(_record), + iif: item => item.handleStatus === '1' || item.handleStatus === 1 + } + ] + } + ]; + } + initSTFloatView() { + this.columnsFloatView = [ + { + title: '费用名称', + width: '100px', + className: 'text-center', + index: 'costName' + }, + { + title: '变更前', + width: '100px', + className: 'text-center', + index: 'amountAfterChange', + render: 'amountAfterChange' + }, + { title: '变更值', index: 'amountchangeValue', render: 'amountchangeValue', width: '120px', className: 'text-center' }, + { title: '变更后', index: 'amountBeforeChange', render: 'amountBeforeChange', width: '120px', className: 'text-center' } + ]; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item); + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + /** + * 导入货源 + */ + importGoodsSource() {} + audit(item: any) {} + + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + console.log(type); + if (type === '0') { + this.isVisible = false; + } else if (type === '1') { + this.isVisibleView = false; + } else if (type === '2') { + this.isVisibleEvaluate = false; + } + } + OpenPrice(value: any) { + this.changeId = value.id; + this.isVisible = true; + } + /** + * 浮动费用查看 + */ + FloatView(item: any) { + console.log(item); + this.changeViewId = item.id; + this.service.request(this.service.$api_getChangeRecordWholeDetail, { id: this.changeViewId }).subscribe(res => { + this.ViewCause = res; + }); + this.isVisibleView = true; + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item); + this.isVisibleEvaluate = true; + const params = { + businessCode: item.billCode, + evaluateUserId: item.shipperAppUserId + }; + const params2 = { + businessCode: item.billCode, + evaluateUserId: item.shipperAppUserId + }; + this.service.request(this.service.$api_getBillEvaluateByShipper, params).subscribe(res => { + console.log(res); + this.shipList = res.evaluateInfos; + }); + this.service.request(this.service.$api_getBillEvaluateDriverByShipper, params2).subscribe(res => { + console.log(res); + this.diverList = res.evaluateInfos; + }); + } + /** + *变更运费 + */ + updateFreight(item: any) { + console.log(item?.isFreightChangeApplication); + this.service.request(this.service.$api_get_getFreightChangeWholeDetail, { id: item.id }).subscribe(data => { + if (data) { + const modal = this.modal.create({ + nzTitle: '变更运费', + nzWidth: 580, + nzContent: VehicleUpdateFreightComponent, + nzComponentParams: { data: { ...data, id: item.id, isFreightChangeApplication: item?.isFreightChangeApplication } }, + nzFooter: null + }); + modal.afterClose.subscribe((res: Boolean) => { + if (res) { + this.st.load(); + this.getGoodsSourceStatistical(); + } + }); + } + }); + } + /** + *修改附加费率 + */ + modifyRate() { + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + if (params.length === 0) { + this.service.msgSrv.error('请先选择订单!'); + return; + } + const modal = this.modal.create({ + nzTitle: '修改附加费率', + nzWidth: 600, + nzContent: VehicleModifyRateComponent, + nzComponentParams: { data: { ids: params } }, + nzFooter: null + }); + modal.afterClose.subscribe(result => { + if (result) { + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + } + /** + *修改网络货运人 + */ + modifyFreightPeople() { + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + let params2: any[] = []; + this.selectedRows.forEach(item => { + params2.push(item.enterpriseInfoId); + }); + if (params.length === 0) { + this.service.msgSrv.error('请先选择订单!'); + return; + } + const modal = this.modal.create({ + nzTitle: '修改网络货运人', + nzWidth: 600, + nzContent: VehicleFreightPeopleComponent, + nzComponentParams: { data: { ids: params, enterpriseInfoIds: params2 } }, + nzFooter: null + }); + modal.afterClose.subscribe(result => { + if (result) { + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + } + /** + *修改网络货运人 + */ + modifycaptain() { + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + if (params.length === 0) { + this.service.msgSrv.error('请先选择订单!'); + return; + } + const modal = this.modal.create({ + nzTitle: '修改车队长', + nzWidth: 900, + nzContent: VehicleModifyCaptainComponent, + nzComponentParams: { data: { ids: params } }, + nzFooter: null + // nzOnOk: sin => { + // this.st.reload(); + // } + // }); + // return false; + // } + }); + modal.afterClose.subscribe(result => { + if (result) { + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + } + + // *确认签收 + + confirmReceipt(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认签收', + nzWidth: '50%', + nzContent: VehicleConfirReceiptComponent, + nzComponentParams: { + i: item, + Status: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: boolean) => { + if (res) { + this.resetSF; + this.st.load(); + this.getGoodsSourceStatistical(); + } + }); + } + revoke(item: any) { + this.modal.confirm({ + nzTitle: '是否确定立即撤销费用变更!', + nzOnOk: () => + this.service.request(this.service.$api_get_revokeChangeRecord, { id: item.id }).subscribe(res => { + console.log(res); + if (res) { + this.service.msgSrv.success('撤销成功!'); + this.stFloat.reload(); + } + }) + }); + } + // 取消订单 + cancellation(item: any) { + // api_get_cancelAnOrder + this.modal.confirm({ + nzTitle: '确定取消该订单吗?', + nzContent: `取消后无法恢复,请确认`, + nzOnOk: () => + this.service.request(this.service.$api_get_cancelAnOrder, { id: item.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.st.load(1); + this.getGoodsSourceStatistical(); + this.initST(); + } + }) + }); + } + userAction() { + let params: any[] = []; + if (this.selectedRows.length <= 0) { + this.service.msgSrv.warning('请选择需要签收的订单!'); + return; + } + let flag = true; + this.selectedRows.forEach(item => { + if (item.billStatus !== '4') { + this.service.msgSrv.warning('存在非待签收状态订单,无法签收!'); + flag = false; + } + params.push(item.id); + }); + if (!flag) return; + this.service.request(this.service.$api_get_batchSignWholeOrder, params).subscribe(res => { + if (res) { + console.log(res); + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + } + // 修改订单 + changeOrder(value: any) { + this.router.navigate(['order-management/vehicle-detailChange', value.id]); + } + /** + *申请退款 + */ + applyRefund(item: any) { + const modalRef = this.modal.create({ + nzTitle: '申请退款', + nzContent: OneCarOrderCancelConfirmComponent, + nzComponentParams: { + i: item, + sts: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: boolean) => { + if (res) { + this.resetSF; + this.st.load(); + } + }); + } + /** + *查看轨迹 + */ + viewTrack(item: any) { + const modalRef = this.modal.create({ + nzTitle: '查看轨迹', + nzContent: OneCarOrderViewtrackComponent, + nzWidth: '900px', + nzComponentParams: { + i: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: boolean) => { + if (res) { + } + }); + } + // 导出 + exprot() { + this.service.exportStart({ ...this.reqParams, pageSize: -1 }, this.service.$api_get_asyncExportWholeList); + } +} diff --git a/src/app/routes/order-management/modal/audit/appeal/appeal.component.html b/src/app/routes/order-management/modal/audit/appeal/appeal.component.html new file mode 100644 index 00000000..6e717730 --- /dev/null +++ b/src/app/routes/order-management/modal/audit/appeal/appeal.component.html @@ -0,0 +1,48 @@ + + +
    + + + {{ dataList?.representationsStatusLabel }} + + +
    +
    + {{ item?.complianceName }} +
    +
    +
    + + {{ dataList?.representationsCause }} + + + {{ dataList?.representationsDescribe }} + + +
    + + +
    +
    +
    +
    + diff --git a/src/app/routes/order-management/modal/audit/appeal/appeal.component.ts b/src/app/routes/order-management/modal/audit/appeal/appeal.component.ts new file mode 100644 index 00000000..451a3796 --- /dev/null +++ b/src/app/routes/order-management/modal/audit/appeal/appeal.component.ts @@ -0,0 +1,123 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { + SFComponent, + SFCustomWidgetSchema, + SFNumberWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-appeal', + templateUrl: './appeal.component.html' +}) +export class OneCarOrderAppealComponent implements OnInit { + i: any; + dataList: any; + constructor( + private modalRef: NzModalRef, + private modal: NzModalService, + private msgSrv: NzMessageService, + public http: _HttpClient, + public service: OrderManagementService + ) {} + + ngOnInit(): void { + this.initDate(); + } + // initSF() { + // this.schema = { + // properties: { + // abnormalCause: { + // type: 'string', + // title: '异常原因', + // default: this.i.abnormalCause, + // readOnly: true, + // ui: { + // widget: 'textarea', + // autosize: { minRows: 4, maxRows: 6 } + // } as SFTextareaWidgetSchema + // }, + // representationsCause: { + // type: 'string', + // title: '申诉原因', + // ui: { + // widget: 'dict-select', + // params: { dictKey: 'bill:representation:reason' }, + // containsAllLabel: false, + // placeholder: '请选择', + // errors: { required: '请选择' } + // } + // }, + // representationsDescribe: { + // type: 'string', + // title: '申诉描述', + // maxLength: 100, + // ui: { + // widget: 'textarea', + // autosize: { minRows: 4, maxRows: 6 } + // } as SFTextareaWidgetSchema + // }, + // fileArr: { + // type: 'string', + // title: '上传凭证', + // ui: { + // action: apiConf.fileUpload, + // accept: 'image/png,image/jpeg,image/jpg', + // limit: 5, + // limitFileCount: 5, + // resReName: 'data.fullFilePath', + // urlReName: 'data.fullFilePath', + // widget: 'upload', + // descriptionI18n: '不超过5张,单张大小不超过5M,支持.jpg、.jpeg和 .png格式', + // name: 'multipartFile', + // multiple: true, + // listType: 'picture-card', + // beforeUpload: (file: any, _fileList: any) => { + // return new Observable((observer: Observer) => { + // const isLt2M = file.size / 1024 / 1024 < 5; + // if (!isLt2M) { + // this.service.msgSrv.warning('图片大小超过5M!'); + // observer.complete(); + // return; + // } + // observer.next(isLt2M); + // observer.complete(); + // }); + // } + // } as SFUploadWidgetSchema + // } + // }, + // required: ['representationsCause', 'representationsDescribe'] + // }; + // this.ui = { + // '*': { + // spanLabelFixed: 100, + // grid: { span: 20 } + // } + // }; + // } + initDate(): void { + console.log(this.i); + this.service.request(this.service.$api_get_getOrderComplaintDetail, { id: this.i?.id }).subscribe((res: any) => { + if (res) { + console.log(res); + this.dataList = res + } + }); + } + + close(): void { + this.modalRef.destroy(); + } +} diff --git a/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.html b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.html new file mode 100644 index 00000000..fe3fd680 --- /dev/null +++ b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.html @@ -0,0 +1,28 @@ + +
    + + +
    +
    电子装货单
    +
    +
    + +
    电子卸货单
    +
    +
    +
    + + diff --git a/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.less b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.less new file mode 100644 index 00000000..2502ed97 --- /dev/null +++ b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.less @@ -0,0 +1,106 @@ +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + .hideBtn .ant-upload-list-item-actions button{ + &:last-child{ + display: none; + } + } + } + } + .sfBox { + position: relative; + .example { + position: absolute; + top: 215px; + right: 265px; + color: #1890ff; + cursor: pointer; + .popBox { + position: absolute; + top: -170px; + left: -125px; + width: 300px; + padding: 20px; + text-align: center; + background: #fff; + border: solid 1px #eee; + border-radius: 6px; + box-shadow: 0 1px 5px 1px #ececec; + &::before { + position: absolute; + bottom: -5px; + left: 50%; + width: 10px; + height: 10px; + margin-left: -5px; + background: #fff; + box-shadow: 0 1px 5px 1px #ececec; + transform: rotate(45deg); + content: ''; + } + &::after { + position: absolute; + bottom: 0; + left: 0; + z-index: 10; + width: 100%; + height: 10px; + background: #fff; + content: ''; + } + img { + max-width: 100%; + max-height: 200px; + } + } + } + .pr { + position: relative; + } + + .pa { + position: absolute; + top: 35px; + left: 150px; + } + + .tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } + } + .positionSet{ + top: 356px; + right: 235px; + } + .positionSet01{ + top: 500px; + right: 200px; + } + .positionSet02{ + top: 664px; + right: 265px; + } + .positionSet03{ + top: 808px; + right: 205px; + + } + } + \ No newline at end of file diff --git a/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.ts b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.ts new file mode 100644 index 00000000..ed607da7 --- /dev/null +++ b/src/app/routes/order-management/modal/audit/voucher-view/voucher-view.component.ts @@ -0,0 +1,580 @@ + +import { Component, OnInit, ViewChild } from '@angular/core'; +import { DatePipe } from '@angular/common'; +import { + SFComponent, + SFCustomWidgetSchema, + SFDateWidgetSchema, + SFNumberWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { apiConf } from '@conf/api.conf'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { EAEnvironmentService } from '@shared'; +import { OrderManagementService } from '../../../services/order-management.service'; +import format from 'date-fns/format'; + +@Component({ + selector: 'app-order-management-voucher-view', + templateUrl: './voucher-view.component.html', + styleUrls: ['./voucher-view.component.less'], + providers: [DatePipe] +}) +export class orderManagementVoucherViewComponent implements OnInit { + record: any = {}; + i: any; + loadPDF: string = ''; + formData: any; + datas: any; + Status: any; + data: any = { + weight: 0, + volume: 0 + }; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor(private modal: NzModalRef, private msgSrv: NzMessageService, public http: _HttpClient, public service: OrderManagementService, private datePipe: DatePipe, private envSrv: EAEnvironmentService,) { } + + ngOnInit(): void { + // console.log(this.i) + this.initData() + this.i.time = this.i.loadingTime; + this.initSF(); + } + initSF() { + console.log(this.Status) + if (this.Status == 1) { + + this.schema = { + + properties: { + loadingLadingBillFilePath: { + type: 'string', + title: '装货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + loadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + no4: { + type: 'string', + title: '', + ui: { + widget: 'text', + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式', + }, + unloadingLadingBillFilePath: { + type: 'string', + title: '卸货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + unloadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + } + }, + required: ['loadingLadingBillFilePath', 'loadingPeopleVehiclesGoodsFilePath', 'unloadingLadingBillFilePath', 'unloadingPeopleVehiclesGoodsFilePath'] + }; + } else { + this.schema = { + properties: { + no0: { + type: 'string', + title: '', + ui: { + widget: 'custom', + }, + }, + loadingLadingBillFilePath: { + type: 'string', + title: '装货凭证', + readOnly: true, + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + loadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + readOnly: true, + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + + no4: { + type: 'string', + title: '', + ui: { + widget: 'text', + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式', + }, + no6: { + type: 'string', + title: '', + ui: { + widget: 'custom', + }, + }, + unloadingLadingBillFilePath: { + type: 'string', + title: '卸货凭证', + readOnly: true, + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + }, + unloadingPeopleVehiclesGoodsFilePath: { + type: 'string', + title: '', + readOnly: true, + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + } as SFUploadWidgetSchema, + } + }, + required: ['loadingLadingBillFilePath', 'loadingPeopleVehiclesGoodsFilePath', 'unloadingLadingBillFilePath', 'unloadingPeopleVehiclesGoodsFilePath'] + }; + } + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + }, + $unloadingLadingBillFilePath: { grid: { span: 12 } }, + $unloadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + $loadingLadingBillFilePath: { grid: { span: 12 } }, + $loadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } }, + }; + } + save(value: any): void { + if (!this.sf.valid) { + this.service.msgSrv.warning('必填项为空!') + return; + } + console.log(value) + const params = { + id: this.i?.id, + loadingLadingBillFilePath: value?.loadingLadingBillFilePath?.data?.fullFilePath, + loadingPeopleVehiclesGoodsFilePath: value?.loadingPeopleVehiclesGoodsFilePath?.data?.fullFilePath, + unloadingLadingBillFilePath: value?.unloadingLadingBillFilePath?.data?.fullFilePath, + unloadingPeopleVehiclesGoodsFilePath: value?.unloadingPeopleVehiclesGoodsFilePath?.data?.fullFilePath, + } + console.log(params) + this.service.request(this.service.$api_get_updateBillExamine, params).subscribe((res) => { + if (res) { + this.service.msgSrv.success('修改成功!') + this.modal.destroy(true); + } + }) + } + sure() { + const params = [this.i?.id]; + this.service.downloadFile(this.service.$api_createBillTakeGoods, params) + this.service.downloadFile(this.service.$api_createBillDischargeGoods, params) + this.service.msgSrv.success('生成电子单据成功!') + this.modal.destroy(true); + } + // 确认到车界面信息(两个只能看的图片) + initData() { + this.service.request(this.service.$api_get_getCredentials, { id: this.i?.id }).subscribe((res) => { + console.log(res) + this.datas = res + if (res.unloadingLadingBillFilePath) { + this.formData = { + loadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.loadingLadingBillFilePath, + response: { + url: res.loadingLadingBillFilePath, + }, + }, + ], + loadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.loadingPeopleVehiclesGoodsFilePath, + response: { + url: res.loadingPeopleVehiclesGoodsFilePath, + }, + }, + ], + unloadingLadingBillFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.unloadingLadingBillFilePath, + response: { + url: res.unloadingLadingBillFilePath, + }, + }, + ], + unloadingPeopleVehiclesGoodsFilePath: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.unloadingPeopleVehiclesGoodsFilePath, + response: { + url: res.unloadingPeopleVehiclesGoodsFilePath, + }, + }, + ], + }; + } + }) + } + close(): void { + this.modal.destroy(true); + } + openlaod(value: any) { + if (value === 1) { + const a = document.createElement('a'); + a.href = this.datas?.loadingElectronicsLadingBillFilePath; + document.body.appendChild(a); + console.log(document.body.contains(a)) + a.click(); //点击下载 + document.body.removeChild(a); //下载完成移除元素 + } else { + const a = document.createElement('a'); + a.href = this.datas?.unloadingElectronicsLadingBillFilePath; + document.body.appendChild(a); + console.log(document.body.contains(a)) + a.click(); //点击下载 + document.body.removeChild(a); //下载完成移除元素 + } + + } +} diff --git a/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.html b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.html new file mode 100644 index 00000000..807acb0b --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.html @@ -0,0 +1,100 @@ + +货物单价 + + + + + + {{detailList?.freightPrice}} {{detailList?.freightTypeLabel}} + + + +
    +
    以收货为准
    +
    以发货为准
    +
    保留小数
    +
    抹除小数
    +
    抹除个数
    +
    +
    + +
    + + +
    {{ detailList?.loadWeight }}吨
    +
    + +
    {{ detailList?.loadVolume }}方
    +
    +
    + + +
    {{ detailList?.settlementWeight }}吨
    +
    + +
    {{ detailList?.settlementVolume }}方
    +
    +
    + + +
    {{detailList?.price | currency}} 元
    +
    + +
    {{detailList?.driverName}} / {{detailList?.driverPhone}}/ {{detailList?.carNo}}
    +
    + +
    {{detailList?.payeeName}} / {{detailList?.payeePhone}}
    +
    + + +
    + +
    请上传图片
    +
    +
    + + + + + +
    +
    + diff --git a/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.less b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.ts b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.ts new file mode 100644 index 00000000..9071e083 --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/confir-receipt/confir-receipt.component.ts @@ -0,0 +1,146 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-14 15:02:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:20:58 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\bulk\\confir-receipt\\confir-receipt.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer } from 'rxjs'; +import { OrderManagementService } from '../../../services/order-management.service'; +function getBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); +} +@Component({ + selector: 'app-order-management-confir-receipt', + templateUrl: './confir-receipt.component.html', + styleUrls: ['./confir-receipt.component.less'] +}) +export class ConfirReceiptComponent implements OnInit { + i: any; + Status: any; + detailList: any; + data: any = {}; + driverList: any; + payeeList: any; + carList: any; + listImagUrls: any[] = []; + previewImage1 = ''; + previewVisible1 = false; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public http: _HttpClient, + public service: OrderManagementService + ) {} + + ngOnInit(): void { + this.initData(); + } + + save(): void { + // 大宗 + console.log(this.listImagUrls); + let imgList: any = []; + if (this.listImagUrls.length > 0) { + this.listImagUrls.forEach((res: any) => { + if (res.url) { + imgList.push(res.url); + } + }); + } + console.log(imgList); + const params = { + id: this.i?.id, + filePathList: imgList + }; + console.log(params); + this.service.request(this.service.$api_get_signBulkOrder, params).subscribe((res: any) => { + console.log(res.success); + if (res) { + this.service.msgSrv.success('确认签收成功!'); + this.modal.destroy(true); + } + }); + } + initData() { + // 大宗 + this.service.request(this.service.$api_get_getBulkSignForDetail, { id: this.i?.id }).subscribe((res: any) => { + console.log(res); + this.detailList = res; + let arr: any = []; + res.filePathList.forEach((element: any, index: any) => { + console.log(index); + arr.push({ + url: element, + status: 'done', + uid: index + }); + }); + this.listImagUrls = arr; + }); + } + close(): void { + this.modal.destroy(true); + } + userAction() {} + handlePreview1 = async (file: NzUploadFile) => { + if (!file.url && !file.preview) { + file.preview = await getBase64(file.originFileObj!); + } + this.previewImage1 = file.url || file.preview; + this.previewVisible1 = true; + }; + handleChange1(info: NzUploadChangeParam): void { + switch (info.file.status) { + case 'uploading': + break; + case 'done': + let fileList = [...info.fileList]; + // 2. Read from response and show file link + console.log(fileList); + fileList = fileList.map((file: any) => { + if (file.response) { + file.url = file.response.data.fullFilePath; + } + return file; + }); + console.log(this.listImagUrls); + break; + case 'error': + this.service.msgSrv.error('网络错误'); + break; + } + } + beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => { + return new Observable((observer: Observer) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/bmp'; + if (!isJpgOrPng) { + this.service.msgSrv.warning('只能上传图片!'); + observer.complete(); + return; + } + // tslint:disable-next-line: no-non-null-assertion + const isLt2M = file.size! / 1024 / 1024 < 3; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过3兆!'); + observer.complete(); + return; + } + observer.next(isJpgOrPng && isLt2M); + observer.complete(); + }); + }; +} diff --git a/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.html b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.html new file mode 100644 index 00000000..b6803fd0 --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + +
    +

    + 总运费:{{ data.totalAmount |currency }} +

    +

    运输费:{{ data.totalFreight |currency }},附加费:{{ data.totalSurcharge |currency}}

    +
    + diff --git a/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.less b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.ts b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.ts new file mode 100644 index 00000000..9ee9df5e --- /dev/null +++ b/src/app/routes/order-management/modal/bulk/update-freight/update-freight.component.ts @@ -0,0 +1,218 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-14 14:03:07 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-01 19:27:28 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\bulk\\update-freight\\update-freight.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFNumberWidgetSchema, SFSchema, SFSelectWidgetSchema, SFStringWidgetSchema, SFTextWidgetSchema } from '@delon/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Subscription } from 'rxjs'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-update-freight', + templateUrl: './update-freight.component.html', + styleUrls: ['./update-freight.component.less'] +}) +export class UpdateFreightComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + + @Input() + data: any; + freightTypeOptions: any; + + calculateSub!: Subscription; + constructor(private service: OrderManagementService, private modal: NzModalRef) {} + + ngOnInit(): void { + this.schema = this.initSF(this.data); + this.service.getDictByKey('freight:type').subscribe(res => { + this.freightTypeOptions = res; + }); + } + + /** + * 初始化表单 + */ + private initSF(data: any): SFSchema { + return { + properties: { + freightPrice: { + type: 'number', + title: '运费单价', + ui: { + placeholder: '请输入', + widget: 'custom', + grid: { span: 12 }, + } as SFStringWidgetSchema, + default: data.freightPrice + }, + rule: { + title: '', + type: 'string', + default: data.rule, + enum: [ + { label: '保留小数', value: '1' }, + { label: '抹除小数', value: '2' }, + { label: '抹除个数', value: '3' } + ], + ui: { + widget: 'select', + spanLabelFixed: 10, + grid: { + span: 10 + } + } as SFSelectWidgetSchema + }, + settlementBasis: { + title: '结算依据', + type: 'string', + default: data.settlementBasis, + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:settlement:type' }, + containsAllLabel: false, + placeholder: '结算依据', + errors: { required: '请选择结算依据' }, + grid: {span: 12} + } as SFSelectWidgetSchema + }, + blank1: { + title: '', + type: 'string', + ui: { widget: 'text', grid: { span: 12 }, class: 'input-back' }, + default: ' ' + }, + freightType: { + title: '', + type: 'string', + ui: { hidden: true }, + default: data.freightType + }, + loadWeight: { + type: 'number', + title: '装货重量', + default: data.loadWeight || 0, + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + loadVolume: { + type: 'number', + title: '装货体积', + default: data.loadVolume || 0, + minimum: 0, + maximum: 99999, + ui: { + unit: '方', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + settlementWeight: { + type: 'number', + title: '卸货重量', + default: data.settlementWeight || 0, + minimum: 0, + maximum: 99999, + ui: { + unit: '吨', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + settlementVolume: { + type: 'number', + title: '卸货体积', + default: data.settlementVolume || 0, + minimum: 0, + maximum: 99999, + ui: { + unit: '方', + placeholder: '请输入', + grid: { + span: 12 + }, + hideStep: true, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + changeCause: { + title: '审核备注', + type: 'string', + maxLength: 100, + default: data.changeCause, + ui: { + widget: 'textarea', + span: 24, + placeholder: '选填,最多不超过100字', + autosize: { + minRows: 3, + maxRows: 5 + } + } as SFTextWidgetSchema + }, + }, + required: ['freightPrice', 'settlementBasis'] + }; + } + + changeNumVal() { + console.log('444') + if (this.calculateSub) { + this.calculateSub.unsubscribe(); + } + const params = { billId: this.data.billId, changeCause: this.sf.value.changeCause, dto: {...this.sf.value} } + this.calculateSub = this.service + .request(this.service.$api_calculate_cost, params) + .subscribe(res => { + if (res) { + Object.assign(this.data, { + totalAmount: res.totalAmount, + totalFreight: res.totalFreight, + totalSurcharge: res.totalSurcharge + }); + } + }); + } + + save(value: any): void { + if (!this.sf.valid) { + this.sf.validator({ emitError: true }); + return; + } + const params = { billId: this.data.billId, changeCause: this.sf.value.changeCause, dto: {...this.sf.value} } + this.service.request(this.service.$api_change_bulk,params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('变更运费成功!'); + this.modal.destroy(true); + } + }); + } + + close(): void { + this.modal.destroy(false); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.html b/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.html new file mode 100644 index 00000000..d6326ce7 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.html @@ -0,0 +1,36 @@ + + + +
    {{ i.shipperAppUserName }}
    +
    + +
    {{ i.driverName }} / {{ i.driverPhone }} / {{ i.carNo }}
    +
    + +
    {{ i.payeeName }} / {{ i.payeePhone }}
    +
    + +

    + +

    +
    + 已选择 {{ index }} 项,运费:{{ List | currency}},附加费:{{ ATTPrice | currency }} +
    + + + diff --git a/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.ts b/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.ts new file mode 100644 index 00000000..dc868538 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/cancel-confirm/cancel-confirm.component.ts @@ -0,0 +1,123 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-02-22 13:53:29 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-28 15:56:46 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\cancel-confirm\\cancel-confirm.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { + SFComponent, + SFCustomWidgetSchema, + SFNumberWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + + +@Component({ + selector: 'app-order-management-cancel-confirm', + templateUrl: './cancel-confirm.component.html' +}) +export class OneCarOrderCancelConfirmComponent implements OnInit { + i: any; // 单行数据 + sts: any; // 区分大宗、整车 + index: any; // 项目数 + ATTPrice: any; // 附加费 + List: any; // 运费 + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor( + private modalRef: NzModalRef, + private modal: NzModalService, + private msgSrv: NzMessageService, + public service: OrderManagementService + ) {} + + ngOnInit(): void { + console.log(this.i); + this.initSF(); + this.initData() + + } + initSF() { + this.schema = { + properties: { + reason: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 6, maxRows: 6 } + } as SFTextareaWidgetSchema + }, + }, + required: ['reason'] + }; + this.ui = { + '*': { + spanLabelFixed: 60, + grid: { span: 20 } + } + }; + } + initData() { + let indexId = 0 + let index = 0 + let indexSurcharge = 0 + this.i?.mybidDetailInfo.forEach((ele: any) => { + if(this.sts == 1) { + // 大宗 + if (ele?.paymentStatusLabel == '已支付' && ele.expenseCode == "TRA") { + index += ele?.price; + } + if (ele?.paymentStatusLabel == '已支付') { + indexId += 1; + indexSurcharge += ele?.surcharge; + } + } else { + // 整车 + if (ele?.paymentStatusLabel == '已支付') { + indexId += 1; + index += ele?.price; + indexSurcharge += ele?.surcharge; + } + console.log(ele.expenseCode) + } + }); + this.index = indexId + this.List = index + this.ATTPrice = indexSurcharge + console.log(this.index) + console.log(this.List) + } + save(value: any): void { + if (!this.sf.value.reason) { + this.service.msgSrv.error('请填写备注信息!'); + return; + } + const params = { billId: this.i?.id, ...this.sf.value }; + console.log(params) + this.service.request(this.service.$api_billRefundApplication_save, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功!'); + this.modalRef.close(true); + } + }); + } + + close(value: boolean): void { + this.modalRef.close(false); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.html b/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.html new file mode 100644 index 00000000..7681f210 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.html @@ -0,0 +1,7 @@ + + + + diff --git a/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.ts b/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.ts new file mode 100644 index 00000000..16e7c1c0 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/cancel/cancel.component.ts @@ -0,0 +1,84 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-21 10:14:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:21:43 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\cancel\\cancel.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { + SFComponent, SFSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-cancel', + templateUrl: './cancel.component.html' +}) +export class OneCarOrderCancelComponent implements OnInit { + record: any = {}; + i: any; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor(private modalRef: NzModalRef, private modal: NzModalService, public service: OrderManagementService) {} + + ngOnInit(): void { + this.initSF(); + console.log(this.i.billStatusLabel); + } + initSF() { + this.schema = { + properties: { + cancelReason: { + type: 'string', + title: '取消原因', + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } as SFTextareaWidgetSchema + } + }, + required: ['reason'] + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + } + }; + } + save(value: any): void { + if (this.i?.billStatus === '1') { + // 待接单状态 + this.modal.confirm({ + nzTitle: '是否确定立即取消运单!', + nzOnOk: () => + this.service.request(this.service.$api_get_cancelAnOrder, { id: this.i?.id, ...this.sf.value }).subscribe(res => { + if (res) { + this.modalRef.close(true); + } + }), + nzOnCancel: () => this.modalRef.destroy() + }); + } else { + this.service.request(this.service.$api_get_cancelAnOrder, { id: this.i?.id, ...this.sf.value }).subscribe(res => { + if (res) { + this.modalRef.close(true); + } + }); + } + + this.modalRef.close(true); + } + + close(): void { + this.modalRef.destroy(); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.html b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.html new file mode 100644 index 00000000..2c0d7063 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.html @@ -0,0 +1,71 @@ + + + + + + + + {{item.PRE | currency}} + + + {{item.RECE | currency}} + + + {{item.BACK | currency}} + + + {{ item.traiPrice | currency}} + + + {{item.surcharge | currency}} + + + + +
    {{ dataInfo?.driverName|| '-' }} / {{dataInfo?.driverPhone || '-' }}/ {{ dataInfo?.carNo || '-' }}
    +
    + +
    {{ i?.payeeName || '-'}} / {{ i?.payeePhone || '-'}}
    +
    + + +
    + +
    请上传图片
    +
    +
    + + + + + +
    +
    + diff --git a/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.less b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.ts b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.ts new file mode 100644 index 00000000..fa5b8958 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/confir-receipt/confir-receipt.component.ts @@ -0,0 +1,199 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-15 13:17:42 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-31 17:36:46 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\confir-receipt\\confir-receipt.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit } from '@angular/core'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer } from 'rxjs'; +import { OrderManagementService } from '../../../services/order-management.service'; +function getBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); +} +@Component({ + selector: 'app-order-management-vehicle-confir-receipt', + templateUrl: './confir-receipt.component.html', + styleUrls: ['./confir-receipt.component.less'] +}) +export class VehicleConfirReceiptComponent implements OnInit { + record: any = {}; + i: any; + Status: any; + costDetail: any; // 费用明细 + columns!: STColumn[]; + previewVisible1 = false; + dataInfo: any; + detailList: any; + data: any = {}; + previewImage1 = ''; + listImagUrls: any[] = []; + payeeList: any; + driverList: any; + carList: any; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public http: _HttpClient, + public service: OrderManagementService + ) {} + + ngOnInit(): void { + this.initST(); + this.initData(); + } + + save(): void { + let imgList: any = []; + if (this.listImagUrls.length > 0) { + this.listImagUrls.forEach((res: any) => { + if (res.url) { + imgList.push(res.url); + } + }); + } + console.log(imgList); + const params = { + id: this.i?.id, + filePathList: imgList + }; + this.service.request(this.service.$api_get_signWholeOrder, params).subscribe((res: any) => { + console.log(res); + if (res) { + this.service.msgSrv.success('确认签收成功!'); + this.modal.destroy(true); + } + }); + } + handlePreview1 = async (file: NzUploadFile) => { + if (!file.url && !file.preview) { + file.preview = await getBase64(file.originFileObj!); + } + this.previewImage1 = file.url || file.preview; + this.previewVisible1 = true; + }; + close(): void { + this.modal.destroy(); + } + + beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => { + return new Observable((observer: Observer) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/bmp'; + if (!isJpgOrPng) { + this.service.msgSrv.warning('只能上传图片!'); + observer.complete(); + return; + } + // tslint:disable-next-line: no-non-null-assertion + const isLt2M = file.size! / 1024 / 1024 < 3; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过3兆!'); + observer.complete(); + return; + } + observer.next(isJpgOrPng && isLt2M); + observer.complete(); + }); + }; + initData() { + // 大宗 + this.service.request(this.service.$api_get_getWholeSignForDetail, { id: this.i?.id }).subscribe((res: any) => { + console.log(res); + this.dataInfo = res; + const cost: any = {}; + res.mybidDetailInfo.forEach((element: any) => { + if (element.expenseName === '预付' || element.expenseCode === 'PRE') { + cost.PRE = element.price; + } else if (element.expenseName === '到付' || element.expenseCode === 'RECE') { + cost.RECE = element.price; + } else if (element.expenseName === '回单付' || element.expenseCode === 'BACK') { + cost.BACK = element.price; + } else if (element.expenseCode === 'ATT') { + cost.surcharge = element.price; + } else if (element.expenseCode === 'TOTAL') { + cost.traiPrice = element.price; + } + }); + let arr: any = []; + res.filePathList.forEach((element: any, index: any) => { + console.log(index); + arr.push({ + url: element, + status: 'done', + uid: index + }); + }); + this.listImagUrls = arr; + this.costDetail = [cost]; + }); + } + + initST() { + this.columns = [ + { + title: '预付', + index: 'PRE', + render:'PRE' + }, + { + title: '到付', + index: 'RECE', + render:'RECE' + }, + // { + // title: '油卡', + // index: 'OIL' + // }, + { + title: '回单付', + index: 'BACK', + render:'BACK' + }, + { + title: '附加费', + index: 'surcharge', + render:'surcharge' + }, + { + title: '总运费', + index: 'traiPrice', + render:'traiPrice' + } + ]; + } + + handleChange1(info: NzUploadChangeParam): void { + switch (info.file.status) { + case 'uploading': + break; + case 'done': + let fileList = [...info.fileList]; + // 2. Read from response and show file link + console.log(fileList); + fileList = fileList.map((file: any) => { + if (file.response) { + file.url = file.response.data.fullFilePath; + } + return file; + }); + console.log(this.listImagUrls); + break; + case 'error': + this.service.msgSrv.error('网络错误'); + break; + } + } +} diff --git a/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.html b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.html new file mode 100644 index 00000000..9e2db533 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.html @@ -0,0 +1,16 @@ + + + + diff --git a/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.less b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.ts b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.ts new file mode 100644 index 00000000..15410d98 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/freight-people/freight-people.component.ts @@ -0,0 +1,92 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-29 16:48:16 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-24 20:19:31 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\freight-people\\freight-people.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-vehicle-freight-people', + templateUrl: './freight-people.component.html', + styleUrls: ['./freight-people.component.less'] +}) +export class VehicleFreightPeopleComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + + aggreechecked = false; + + data: any; + + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public service: OrderManagementService, + public shipperservice: ShipperBaseService + ) {} + + ngOnInit(): void { + console.log(this.data); + this.initSF(); + } + initSF() { + this.schema = { + properties: { + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + } + }, + required: ['enterpriseInfoId'] + }; + this.ui = { + '*': { + spanLabelFixed: 130, + grid: { span: 16 } + } + }; + } + + save(value: any): void { + console.log(this.sf.value); + if(!this.sf.valid) { + this.service.msgSrv.error("请选择网络货运人!") + return; + } + const params = { + billIds: this.data?.ids, + enterpriseInfoId: this.sf.value?.enterpriseInfoId + }; + console.log(params); + this.service.request(this.service.$api_set_updateEnterpriseInfoBatch, params).subscribe((res: any) => { + if (res) { + this.modal.destroy(true); + this.service.msgSrv.success('修改网络货运人成功!'); + } + }); + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.html b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.html new file mode 100644 index 00000000..dee32307 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.html @@ -0,0 +1,38 @@ + + +
    +
    + +
    + +
    + +
    +
    + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.less b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.ts b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.ts new file mode 100644 index 00000000..845db74c --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-captain/modify-captain.component.ts @@ -0,0 +1,126 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-30 14:45:39 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-24 10:28:48 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\modify-captain\\modify-captain.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-vehicle-modify-captain', + templateUrl: './modify-captain.component.html', + styleUrls: ['./modify-captain.component.less'] +}) +export class VehicleModifyCaptainComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('st', { static: false }) st!: STComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + Columns: STColumn[] = []; + aggreechecked = false; + dataList: any = []; + data: any; + bankData: any; + + constructor(private modal: NzModalRef, private msgSrv: NzMessageService, public service: OrderManagementService) {} + + ngOnInit(): void { + console.log(this.data); + this.initSF(); + this.initST(); + } + initSF() { + this.schema = { + properties: { + mobile: { + type: 'string', + title: '车队长手机号', + maxLength: 11 + } + }, + required: ['mobile'] + }; + this.ui = { + '*': { + spanLabelFixed: 130, + grid: { span: 16 } + } + }; + } + initST() { + this.Columns = [ + { title: '司机头像', render: 'avatar', width: '120px' }, + { title: '司机姓名', index: 'name', width: '120px' }, + { + title: '实名认证状态', + className: 'text-center', + index: 'certificationStatus', + type: 'badge', + width: '120px', + badge: { + '-1': { text: '未提交', color: 'warning' }, + '0': { text: '待审核', color: 'warning' }, + '1': { text: '通过', color: 'success' }, + '2': { text: '驳回', color: 'error' } + } + }, + { title: '收款账户', width: '200px', render: 'bankList' }, + { + title: '操作', + width: '120px', + className: 'text-center', + buttons: [ + { + text: '设置', + click: item => { + this.set(item); + } + } + ] + } + ]; + } + set(value: any): void { + console.log(this.st?._data); + console.log(this.data); + console.log(value); + console.log(this.bankData); + const params = { + billIds: this.data?.ids, + carCaptainId: value.appUserId, + bankData: this.bankData + }; + this.service.request(this.service.$api_get_updateCarCaptainBatch, params).subscribe((res: any) => { + if (res) { + this.modal.destroy(); + this.service.msgSrv.success('修改成功'); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + } + initDate() { + const params = { + fetchBank: 1, + ...this.sf?.value + }; + this.service.request(this.service.$api_get_getCarCaptainByMobile, params).subscribe((res: any) => { + console.log(res); + if (res) { + this.dataList = [res]; + } + }); + } + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.html b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.html new file mode 100644 index 00000000..ad382091 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.html @@ -0,0 +1,32 @@ + + + + + + + {{ item?.oldAdditionalRate? (item?.oldAdditionalRate * 100).toFixed(2) + '%' : ''}} + + + {{ item?.oldSurcharge | currency}} + + + {{ item?.newSurcharge | currency}} + + + diff --git a/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.less b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.ts b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.ts new file mode 100644 index 00000000..6e61d083 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/modify-rate/modify-rate.component.ts @@ -0,0 +1,104 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-29 14:51:07 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-08 13:21:59 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\modify-rate\\modify-rate.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { STColumn } from '@delon/abc/st'; +import { SFComponent, SFNumberWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-vehicle-modify-rate', + templateUrl: './modify-rate.component.html', + styleUrls: ['./modify-rate.component.less'] +}) +export class VehicleModifyRateComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + columns: STColumn[] = [ + { title: '订单号', index: 'billCode' }, + { title: '原附加费率', render: 'oldAdditionalRate' }, + { title: '原附加费', render: 'oldSurcharge' }, + // { title: '新附加费', render: 'newSurcharge' }, + ]; + aggreechecked = false; + + @Input() + data: any; + + constructor(private modal: NzModalRef, private msgSrv: NzMessageService, public service: OrderManagementService) {} + + ngOnInit(): void { + console.log(this.data); + this.initSF(); + console.log(this.data?.ids) + } + get reqParams() { + + return { + // operateObject: this.i?.resourceCode, + // operateType: 4, + ids: this.data?.ids, + additionalRate: this.sf?.value?.additionalRate || 0 + }; + } + initSF() { + this.schema = { + properties: { + additionalRate: { + type: 'number', + title: '附加费率', + maximum: 99, + minimum: 0, + ui: { + unit: '%', + widgetWidth: 200, + precision: 2 + } as SFNumberWidgetSchema + } + }, + required: ['additionalRate'] + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 16 } + } + }; + } + + save(value: any): void { + if (!this.sf.value?.additionalRate) { + this.service.msgSrv.warning('请填写附加费!'); + return; + } + console.log(this.sf.value); + const params = { + ids: this.data?.ids, + ...this.sf.value + }; + console.log(params); + this.service.request(this.service.$api_set_updateAdditionalRateBatch, params).subscribe((res: any) => { + if (res) { + this.modal.close(true); + this.service.msgSrv.success('变更运费成功'); + } else { + this.service.msgSrv.error(res?.msg); + } + }); + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.html b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.html new file mode 100644 index 00000000..5360747c --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.html @@ -0,0 +1,30 @@ + + + + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + diff --git a/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.less b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.ts b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.ts new file mode 100644 index 00000000..d39e4110 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component.ts @@ -0,0 +1,568 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { + SFComponent, SFSchema, SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import format from 'date-fns/format'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { WaybillManagementServe } from 'src/app/routes/waybill-management/services/waybill-management.service'; + +@Component({ + selector: 'app-order-management-vehicle-sure-arrive', + templateUrl: './sure-arrive.component.html', + styleUrls: ['./sure-arrive.component.less'], + providers: [DatePipe] +}) +export class VehicleSureArriveComponent implements OnInit { + record: any = {}; + i: any; + formData: any; + Status: any; + data: any = { + weight: 0, + volume: 0 + }; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public http: _HttpClient, + public service: WaybillManagementServe, + private datePipe: DatePipe, + private envSrv: EAEnvironmentService + ) { } + + ngOnInit(): void { + console.log(this.i); + this.initData(); + this.i.time = this.i?.loadingTime; + this.initSF(); + } + initSF() { + if (this.Status === 1) { + this.schema = { + properties: { + time: { + type: 'string', + title: '卸货时间', + format: 'date-time' + }, + imgUrl3: { + type: 'string', + title: '装货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl4: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no4: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式' + }, + imgUrl1: { + type: 'string', + title: '卸货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl2: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + } + }, + required: ['time'] + }; + } else { + this.schema = { + properties: { + time: { + type: 'string', + title: '卸货时间', + format: 'date-time' + }, + weight: { + type: 'string', + title: '卸货重量', + ui: { + widget: 'custom' + } + }, + volume: { + type: 'string', + title: '卸货体积', + ui: { + widget: 'custom' + } + }, + imgUrl3: { + type: 'string', + title: '装货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl4: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + no4: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式' + }, + imgUrl1: { + type: 'string', + title: '卸货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl2: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.unloadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + } + }, + required: ['time', 'weight', 'volume'] + }; + } + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + }, + $imgUrl1: { grid: { span: 12 } }, + $imgUrl2: { grid: { span: 12 } }, + $imgUrl3: { grid: { span: 12 } }, + $imgUrl4: { grid: { span: 12 } } + }; + } + save(value: any): void { + console.log(this.Status); + console.log(value?.imgUrl3?.data?.fullFilePath); + console.log(value?.imgUrl3?.url); + + if (this.Status === 1) { + if (!value.time) { + this.service.msgSrv.warning('卸货时间为空!'); + return; + } + const params = { + id: this.i.id, + imgUrl1: value?.imgUrl1?.data?.fullFilePath, + imgUrl2: value?.imgUrl2?.data?.fullFilePath, + setLading: value?.imgUrl3?.data?.fullFilePath || value?.imgUrl3?.url, + setPeoCarGoods: value?.imgUrl4?.data?.fullFilePath || value?.imgUrl4?.url, + time: value?.time + }; + params.time = this.datePipe.transform(value.time, 'yyyy-MM-dd HH:mm:ss '); + console.log(params); + + this.service.request(this.service.$api_get_insertWholeUnloadCarInfo, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('确认到车成功!'); + this.modal.destroy(true); + } + }); + } else { + if (!value?.time) { + this.service.msgSrv.warning('装货时间为空!'); + return; + } + if (!this.data?.volume) { + this.service.msgSrv.warning('装货重量为空!'); + return; + } + if (!this.data?.weight) { + this.service.msgSrv.warning('装货体积为空!'); + return; + } + const params = { + id: this.i?.id, + imgUrl1: value?.imgUrl1?.data?.fullFilePath, + imgUrl2: value?.imgUrl2?.data?.fullFilePath, + setLading: value?.imgUrl3?.data?.fullFilePath || value?.imgUrl3?.url, + setPeoCarGoods: value?.imgUrl4?.data?.fullFilePath || value?.imgUrl4?.url, + time: value?.time, + volume: this.data?.volume, + weight: this.data?.weight + }; + params.time = this.datePipe.transform(value.time, 'yyyy-MM-dd HH:mm:ss '); + this.service.request(this.service.$api_get_insertBulkUnloadCarInfo, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('确认到车成功!'); + this.modal.destroy(true); + } + }); + } + } + // 确认到车界面信息(两个只能看的图片) + initData() { + this.service.request(this.service.$api_get_getUnloadCarInfo, { id: this.i?.id }).subscribe(res => { + console.log(res); + if (res.imgUrl1) { + this.formData = { + imgUrl3: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.imgUrl1, + response: { + url: res.imgUrl1 + } + } + ], + imgUrl4: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: res.imgUrl2, + response: { + url: res.imgUrl2 + } + } + ] + }; + } + }); + } + close(): void { + this.modal.destroy(true); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.html b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.html new file mode 100644 index 00000000..3c703e39 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.html @@ -0,0 +1,30 @@ + + + + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + diff --git a/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.less b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.ts b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.ts new file mode 100644 index 00000000..5da8c701 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component.ts @@ -0,0 +1,346 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { + SFComponent, SFSchema, SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { WaybillManagementServe } from 'src/app/routes/waybill-management/services/waybill-management.service'; +import format from 'date-fns/format'; + +@Component({ + selector: 'app-order-management-vehicle-sure-depart', + templateUrl: './sure-depart.component.html', + styleUrls: ['./sure-depart.component.less'], + providers: [DatePipe] +}) +export class VehicleSureDepartComponent implements OnInit { + record: any = {}; + i: any; + Status: any; + data: any = { + weight: '', + volume: '' + }; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public http: _HttpClient, + public service: WaybillManagementServe, + private envSrv: EAEnvironmentService, + private datePipe: DatePipe + ) { } + + ngOnInit(): void { + this.initSF(); + console.log(this.i); + this.data.weight = this.i?.weight; + this.i.time = this.i.loadingTime; + } + initSF() { + if (this.Status === 1) { + this.schema = { + properties: { + time: { + type: 'string', + title: '装货时间', + format: 'date-time' + }, + no4: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式' + }, + imgUrl1: { + type: 'string', + title: '装货凭证', + ui: { + widget: 'upload', + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl2: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + } + }, + required: ['time'] + }; + } else { + this.schema = { + properties: { + time: { + type: 'string', + title: '装货时间', + format: 'date-time' + }, + weight: { + type: 'string', + title: '装货重量', + ui: { + widget: 'custom' + } + }, + volume: { + type: 'string', + title: '装货体积', + ui: { + widget: 'custom' + } + }, + no4: { + type: 'string', + title: '', + ui: { + widget: 'text' + }, + default: '单张大小不超过5M,支持.jpg、.jpeg和 .png格式' + }, + imgUrl1: { + type: 'string', + title: '装货凭证', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '提货单', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + }, + imgUrl2: { + type: 'string', + title: '', + ui: { + widget: 'upload', + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '人车货照片', + data: { + appId: this.envSrv.env.appId, + content: [ + `上传用户:${this.record?.driverName}(${this.record?.driverTelephone})`, + `上传位置:${this.record?.loadingAddressArr[0]}`, + `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`, + ], + position: '2', + fontSize: '100' + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg,image/jpg,image/gif'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card' + } as SFUploadWidgetSchema + } + }, + required: ['time', 'weight', 'volume'] + }; + } + + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 20 } + }, + $imgUrl1: { grid: { span: 12 } }, + $imgUrl2: { grid: { span: 12 } } + }; + } + save(value: any): void { + if (this.Status === 1) { + if (!value?.time) { + this.service.msgSrv.warning('装货时间为空!'); + return; + } + const params = { + id: this.i.id, + imgUrl1: value?.imgUrl1?.data?.fullFilePath, + imgUrl2: value?.imgUrl2?.data?.fullFilePath, + time: value?.time + }; + params.time = this.datePipe.transform(value.time, 'yyyy-MM-dd HH:mm:ss '); + this.service.request(this.service.$api_get_insertWholeStartCarInfo, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('确认发车成功!'); + this.modal.destroy(true); + } + }); + } else { + if (!value?.time) { + this.service.msgSrv.warning('装货时间为空!'); + return; + } + if (!this.data?.volume) { + this.service.msgSrv.warning('装货重量为空!'); + return; + } + if (!this.data?.weight) { + this.service.msgSrv.warning('装货体积为空!'); + return; + } + console.log(value); + const params = { + id: this.i.id, + imgUrl1: value?.imgUrl1?.data?.fullFilePath, + imgUrl2: value?.imgUrl2?.data?.fullFilePath, + time: value?.time, + volume: this.data?.volume, + weight: this.data?.weight + }; + params.time = this.datePipe.transform(value.time, 'yyyy-MM-dd HH:mm:ss '); + this.service.request(this.service.$api_get_insertBulkStartCarInfo, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('确认发车成功!'); + this.modal.destroy(true); + } + }); + } + } + + close(): void { + this.modal.destroy(true); + } +} diff --git a/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.html b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.html new file mode 100644 index 00000000..34cbd0a0 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.html @@ -0,0 +1,36 @@ + + + + +
    +

    + 总运费:{{ data?.totalAmount | currency }} + (运输费:{{ data?.totalFreight | currency }},附加费:{{ data?.totalSurcharge | currency }},附加费率:{{ (data?.totalRate * 100).toFixed(2) + '%' }}) +

    +

    + +  确认已阅读并知晓 《变更协议》 +

    +
    + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.less b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.ts b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.ts new file mode 100644 index 00000000..8f5794f0 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/update-freight/update-freight.component.ts @@ -0,0 +1,223 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-15 13:17:42 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-24 19:17:10 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\update-freight\\update-freight.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFNumberWidgetSchema, SFSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Subscription } from 'rxjs'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-vehicle-update-freight', + templateUrl: './update-freight.component.html', + styleUrls: ['./update-freight.component.less'] +}) +export class VehicleUpdateFreightComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema: SFSchema = {}; + ui: SFUISchema = {}; + isVisible = false; + modalcontent = ''; + + aggreechecked = false; + + @Input() + data: any; + + dataJSON: any; + + calculateSub!: Subscription; + + constructor(private modal: NzModalRef, private msgSrv: NzMessageService, public service: OrderManagementService) {} + + ngOnInit(): void { + console.log(this.data) + this.dataJSON = JSON.stringify(this.data) + console.log(this.dataJSON) + this.initSF(this.data); + } + initSF(data: any) { + const info = { + prePay: data.list?.filter((item: any) => item.costCode === 'PRE')[0], + toPay: data.list?.filter((item: any) => item.costCode === 'RECE')[0], + receiptPay: data.list?.filter((item: any) => item.costCode === 'BACK')[0] + }; + this.schema = { + properties: { + prePay: { + type: 'number', + title: '预付', + default: info.prePay?.price || 0, + minimum: 0, + maximum: 99999, + readOnly: info.prePay?.paymentStatus === '2' || info.prePay?.paymentStatus === '4', + ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + toPay: { + type: 'number', + title: '到付', + default: info.toPay?.price || 0, + minimum: 0, + maximum: 99999, + readOnly: info.toPay?.paymentStatus === '2' || info.toPay?.paymentStatus === '4', + ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + // oilCardPay: { + // type: 'number', + // title: '油卡', + // default: 0.0, + // minimum:0, + // readOnly: this.i.oilCardPayStatus === '1' || this.i.oilCardPayStatus === '3', + // ui: { + // prefix: '¥', + // widgetWidth: 200, + // precision: 2, + // change: (val: any) => this.changeNumVal() + // } as SFNumberWidgetSchema + // }, + receiptPay: { + type: 'number', + title: '回单付', + maximum: 99999, + default: info.receiptPay?.price || 0, + minimum: 0, + readOnly: info.receiptPay?.paymentStatus === '2' || info.receiptPay?.paymentStatus === '4', + ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal() + } as SFNumberWidgetSchema + }, + changeCause: { + type: 'string', + title: '变更原因', + maxLength: 100, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 } + } as SFTextareaWidgetSchema + } + }, + required: ['changeCause'] + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 16 } + } + }; + } + + save(value: any): void { + if (this.data.isFreightChangeApplication) { + this.service.msgSrv.error('变更申请未处理,请勿重复申请!'); + return; + } + if (!this.save) { + this.service.msgSrv.error('请填写必填项!'); + return; + } + this.service.request(this.service.$api_get_insertFreightChangeWhole, this.getParams()).subscribe(res => { + if (res) { + this.modal.destroy(true); + this.service.msgSrv.success('变更运费成功'); + } + }); + } + + close(): void { + this.modal.destroy(false); + } + /** + * 更新数字框 + * + */ + changeNumVal() { + if (this.calculateSub) { + this.calculateSub.unsubscribe(); + } + this.calculateSub = this.service.request(this.service.$api_getWholeSurchargeDetail, this.getParams()).subscribe((res: any) => { + if (res) { + Object.assign(this.data, { + totalAmount: res.totalAmount, + totalFreight: res.totalFreight, + freight: res.freight, + surcharge: res.surcharge + }); + } + }); + // this.tranPrice = this.sf.value.prePay + this.sf.value.toPay + this.sf.value.oilCardPay + this.sf.value.receiptPay; + // this.totalPrice = this.sf.value.prePay + this.sf.value.toPay + this.sf.value.oilCardPay + this.sf.value.receiptPay + this.otherPrice; + } + + getParams() { + const editItems = this.data.list?.filter((info: any) => info.toPay?.paymentStatus !== '2' && info.toPay?.paymentStatus !== '4'); + editItems.forEach((item: any) => { + switch (item.costName) { + case '预付': + item.price = this.sf.value.prePay; + break; + case '到付': + item.price = this.sf.value.toPay; + break; + case '回单付': + item.price = this.sf.value.receiptPay; + break; + default: + break; + } + }); + + const params = { + billId: this.data.id, + dtos: editItems, + changeCause: this.sf.value.changeCause + }; + return params; + } + agreement() { + + const param = { + billId: this.data.id, + pre: this.sf.value.prePay, + rece: this.sf.value.toPay, + back: this.sf.value.receiptPay, + total: this.data.totalFreight, + freightAmount: this.data.totalAmount, + } + this.service.request(this.service.$api_getSupplementaryAgreement, param).subscribe(res => { + if (res) { + this.modalcontent = res.contractContent; + this.isVisible = true; + } + }); + + } + + + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } +} diff --git a/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.html b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.html new file mode 100644 index 00000000..ad50faeb --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.html @@ -0,0 +1,28 @@ + +
    +
    + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.less b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.less new file mode 100644 index 00000000..ae775710 --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.less @@ -0,0 +1,11 @@ +:host { + ::ng-deep { + // .mapBox { + // iframe, canvas { + // width: 400px !important; + // } + // } + + } + + } \ No newline at end of file diff --git a/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.ts b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.ts new file mode 100644 index 00000000..0b5c1dff --- /dev/null +++ b/src/app/routes/order-management/modal/vehicle/view-track/view-track.component.ts @@ -0,0 +1,119 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-02-22 13:53:29 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-08 16:11:58 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\vehicle\\view-track\\view-track.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn } from '@delon/abc/st'; +import { + SFComponent, + SFCustomWidgetSchema, + SFNumberWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import format from 'date-fns/format'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { OrderManagementService } from '../../../services/order-management.service'; + +@Component({ + selector: 'app-order-management-view-track', + styleUrls: ['./view-track.component.less', '../../../../commom/less/trajectory.less'], + templateUrl: './view-track.component.html' +}) +export class OneCarOrderViewtrackComponent implements OnInit { + i: any; // 单行数据 + MapList: any[] = []; //地图点位数据组 + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + constructor( + private modalRef: NzModalRef, + private modal: NzModalService, + private msgSrv: NzMessageService, + public service: OrderManagementService + ) {} + + ngOnInit(): void { + console.log(this.i); + this.getTrajectory(); + } + close(value: boolean): void { + this.modalRef.close(false); + } + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.i?.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res.parkAdr; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.i?.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/order-management/order-management-routing.module.ts b/src/app/routes/order-management/order-management-routing.module.ts new file mode 100644 index 00000000..7be4f4e5 --- /dev/null +++ b/src/app/routes/order-management/order-management-routing.module.ts @@ -0,0 +1,46 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-06 09:24:00 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-07 09:43:47 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\order-management-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { OrderManagementAbnormalWarningComponent } from './components/abnormal-warning/abnormal-warning.component'; +import { OrderManagementBulkDetailChangeComponent } from './components/bulk-detail-change/bulk-detail-change.component'; +import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementComplaintDetailComponent } from './components/complaint-detail/complaint-detail.component'; +import { OrderManagementComplaintComponent } from './components/complaint/complaint.component'; +import { OrderManagementComplianceAuditComponent } from './components/compliance-audit/compliance-audit.component'; +import { OrderManagementReceiptsAuditComponent } from './components/receipts-audit/receipts-audit.component'; +import { OrderManagementRiskDetailComponent } from './components/risk-detail/risk-detail.component'; +import { OrderManagementRiskComponent } from './components/risk/risk.component'; +import { OrderManagementVehicleDetailChangeComponent } from './components/vehicle-detail-change/vehicle-detail-change.component'; +import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; +import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; + +const routes: Routes = [ + { path: 'vehicle', component: OrderManagementVehicleComponent }, + { path: 'vehicle/vehicle-detail/:id', component: OrderManagementVehicleDetailComponent }, + { path: 'vehicle-detailChange/:id', component: OrderManagementVehicleDetailChangeComponent }, + { path: 'bulk', component: OrderManagementBulkComponent }, + { path: 'bulk/bulk-detail/:id', component: OrderManagementBulkeDetailComponent }, + { path: 'bulk-detailChange/:id', component: OrderManagementBulkDetailChangeComponent }, + { path: 'risk', component: OrderManagementRiskComponent }, + { path: 'risk-detail/:id', component: OrderManagementRiskDetailComponent }, + { path: 'complaint', component: OrderManagementComplaintComponent }, + { path: 'complaint-detail/:id', component: OrderManagementComplaintDetailComponent }, + { path: 'receipts-audit', component: OrderManagementReceiptsAuditComponent }, + { path: 'compliance-audit', component: OrderManagementComplianceAuditComponent }, + { path: 'abnormal-warning', component: OrderManagementAbnormalWarningComponent }, +] +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class OrderManagementRoutingModule { } diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts new file mode 100644 index 00000000..8f00a622 --- /dev/null +++ b/src/app/routes/order-management/order-management.module.ts @@ -0,0 +1,81 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-06 09:24:00 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-25 14:10:36 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\order-management.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; +import { OrderManagementAbnormalWarningComponent } from './components/abnormal-warning/abnormal-warning.component'; +import { OrderManagementBulkDetailChangeComponent } from './components/bulk-detail-change/bulk-detail-change.component'; +import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementComplaintDetailComponent } from './components/complaint-detail/complaint-detail.component'; +import { OrderManagementComplaintComponent } from './components/complaint/complaint.component'; +import { OrderManagementComplianceAuditComponent } from './components/compliance-audit/compliance-audit.component'; +import { OrderManagementReceiptsAuditComponent } from './components/receipts-audit/receipts-audit.component'; +import { OrderManagementRiskDetailComponent } from './components/risk-detail/risk-detail.component'; +import { OrderManagementRiskComponent } from './components/risk/risk.component'; +import { OrderManagementVehicleDetailChangeComponent } from './components/vehicle-detail-change/vehicle-detail-change.component'; +import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; + +import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; +import { OneCarOrderAppealComponent } from './modal/audit/appeal/appeal.component'; +import { orderManagementVoucherViewComponent } from './modal/audit/voucher-view/voucher-view.component'; +import { ConfirReceiptComponent } from './modal/bulk/confir-receipt/confir-receipt.component'; +import { UpdateFreightComponent } from './modal/bulk/update-freight/update-freight.component'; +import { OneCarOrderCancelConfirmComponent } from './modal/vehicle/cancel-confirm/cancel-confirm.component'; +import { OneCarOrderCancelComponent } from './modal/vehicle/cancel/cancel.component'; +import { VehicleConfirReceiptComponent } from './modal/vehicle/confir-receipt/confir-receipt.component'; +import { VehicleFreightPeopleComponent } from './modal/vehicle/freight-people/freight-people.component'; +import { VehicleModifyCaptainComponent } from './modal/vehicle/modify-captain/modify-captain.component'; +import { VehicleModifyRateComponent } from './modal/vehicle/modify-rate/modify-rate.component'; +import { VehicleSureArriveComponent } from './modal/vehicle/sure-arrive/sure-arrive.component'; +import { VehicleSureDepartComponent } from './modal/vehicle/sure-depart/sure-depart.component'; +import { VehicleUpdateFreightComponent } from './modal/vehicle/update-freight/update-freight.component'; +import { OneCarOrderViewtrackComponent } from './modal/vehicle/view-track/view-track.component'; +import { OrderManagementRoutingModule } from './order-management-routing.module'; + +const COMPONENTS: Type[] = [ + OrderManagementVehicleComponent, + OrderManagementVehicleDetailComponent, + OrderManagementBulkComponent, + OrderManagementBulkeDetailComponent, + OrderManagementRiskComponent, + OrderManagementComplaintComponent, + UpdateFreightComponent, + ConfirReceiptComponent, + VehicleUpdateFreightComponent, + VehicleConfirReceiptComponent, + VehicleSureDepartComponent, + VehicleSureArriveComponent, + OrderManagementRiskDetailComponent, + OneCarOrderCancelComponent, + OrderManagementVehicleDetailChangeComponent, + OrderManagementBulkDetailChangeComponent, + VehicleModifyRateComponent, + VehicleFreightPeopleComponent, + VehicleModifyCaptainComponent, + OrderManagementComplaintDetailComponent, + OrderManagementReceiptsAuditComponent, + orderManagementVoucherViewComponent, + OrderManagementComplianceAuditComponent, + OneCarOrderCancelConfirmComponent, + OneCarOrderViewtrackComponent, + OneCarOrderAppealComponent, + OrderManagementAbnormalWarningComponent +]; + +@NgModule({ + imports: [ + SharedModule, + OrderManagementRoutingModule + ], + declarations: COMPONENTS, +}) +export class OrderManagementModule { } diff --git a/src/app/routes/order-management/services/order-management.service.ts b/src/app/routes/order-management/services/order-management.service.ts new file mode 100644 index 00000000..178e640f --- /dev/null +++ b/src/app/routes/order-management/services/order-management.service.ts @@ -0,0 +1,273 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 15:31:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-19 15:16:37 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\order-management\\services\\order-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { EACacheService, ShipperBaseService } from '@shared'; +import { map } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class OrderManagementService extends ShipperBaseService { + $api_get_getEnterpriseNetTransHis = `/api/mdc/enterpriseNetTransHis/getEnterpriseNetTransHis`; + $api_get_catalogue_member = `/user?_allow_anonymous=true`; + $api_get_bulkPage_list = `/api/sdc/goodsResourceOperate/listBulkPage`; + // 据 手机号/姓名 查询 车队长/司机 + $api_get_getDriverInfo = `/api/mdc/cuc/user/getDriverInfo`; + $api_del_driver = ``; + // 获取货主企业列表 + public $api_getList = '/api/mdc/cuc/enterpriseInfo/cargoOwner/getList?_allow_anonymous=true'; + // 风险单: + // 风险单列表查询 + $api_get_listRiskPage = `/api/sdc/billRiskOperate/listRiskPage`; + // 风险单列表查询 + $api_get_listStatisticalStatus = `/api/sdc/billRiskOperate/listStatisticalStatus`; + // 风险单详情查询 + $api_get_getRiskDetail = `/api/sdc/billRiskOperate/getRiskDetail`; + // 风险单审核 + $api_get_listRisk_audit = `/api/sdc/billRiskOperate/audit`; + // 查询整车订单列表 + $api_get_listWholePage = `/api/sdc/billOperate/listWholePage`; + // 整车详情 + $api_get_getWholeBillDetail = `/api/sdc/billOperate/getWholeBillDetail`; + // 根据车牌号查询车辆信息 + $api_get_getCarLicenseListByCarNo = `/api/mdc/cuc/carLicense/findCarLicenseByCarNo`; + + // 查询大宗订单列表 + $api_get_listBulkPage = `/api/sdc/billOperate/listBulkPage`; + // 查看运费变更记录详情-整车 + $api_get_getChangeRecordWholeDetail = `/api/sdc/billFreightChangeRecord/getChangeRecordWholeDetail`; + // 根据订单ID查看运费变更申请记录 + $api_get_listChangeApply = `/api/sdc/billFreightChangeApplication/listChangeApply`; + // 变更运费页面-整车-整车 + $api_get_getFreightChangeWholeDetail = `/api/sdc/billFreightChangeApplication/getFreightChangeWholeDetail`; + // 订单申请撤销 + $api_get_revokeChangeRecord = `/api/sdc/billFreightChangeApplication/revokeChangeRecord`; + // 运费变更申请-整车 + $api_get_insertFreightChangeWhole = `/api/sdc/billFreightChangeApplication/insertOperateFreightChangeWhole`; + // 取消订单 + $api_get_cancelAnOrder = `/api/sdc/billOperate/cancelAnOrder`; + // 批量签收整车订单 + $api_get_batchSignWholeOrder = `/api/sdc/billOperate/batchSignWholeOrder`; + // 批量签收大宗订单 + $api_get_batchSignBulkOrder = `/api/sdc/billOperate/batchSignBulkOrder`; + // 大宗签收详情 + $api_get_getBulkSignForDetail = `/api/sdc/billOperate/getBulkSignForDetail`; + // 整车签收详情 + $api_get_getWholeSignForDetail = `/api/sdc/billOperate/getWholeSignForDetail`; + // 确认签收大宗订单 + $api_get_signBulkOrder = `/api/sdc/billOperate/signBulkOrder`; + // 确认签收整车订单 + $api_get_signWholeOrder = `/api/sdc/billOperate/signWholeOrder`; + // 上传图片 + public $api_upload_url = `/api/mdc/pbc/upload/multipartFile/file`; + // 根据用户id查用户信息(注意:nickName才是用户名称) + public $api_getUserDetailByAppUserId = `/api/mdc/cuc/userBasicInfo/get`; + // 根据车辆id查车辆信息 + public $api_getCarLicenseByIds = `/api/mdc/cuc/carLicense/getCarLicenseByIds`; + // 统计【整车】订单状态数量 + public $api_statisticalStatus = `/api/sdc/billOperate/getWholeStatistical`; + // 统计【大宗】订单状态数量 + public $api_getBulkStatistical = `/api/sdc/billOperate/getBulkStatistical`; + // 变更运费页面-大宗 + public $api_getFreightChangeBulkDetail = `/api/sdc/billFreightChangeApplication/getFreightChangeBulkDetail`; + // 变更运费页面-大宗 + public $api_insertFreightChangeBulk = `/api/sdc/billFreightChangeApplication/insertFreightChangeBulk`; + // 大宗详情 + public $api_getBulkBillDetail = `/api/sdc/billOperate/getBulkBillDetail`; + // 查看运费变更记录详情-大宗 + public $api_getChangeRecordBulkDetail = `/api/sdc/billFreightChangeRecord/getChangeRecordBulkDetail`; + // 查看运费变更记录详情-整车 + public $api_getChangeRecordWholeDetail = `/api/sdc/billFreightChangeRecord/getChangeRecordWholeDetail`; + //运费变更申请计算费用-大宗 + $api_calculate_cost = `/api/sdc/billFreightChangeApplication/getBulkSurchargeDetail`; + //运费变更申请计算费用-整车 + $api_getWholeSurchargeDetail = `/api/sdc/billFreightChangeApplication/getWholeSurchargeDetail`; + //运费变更申请-大宗 + $api_change_bulk = `/api/sdc/billFreightChangeApplication/insertOperateFreightChangeBulk`; + // 删除装卸货信息 + $api_delete_Wholedeletebatch = `/api/sdc/unLoadingPlace/deletebatch`; + // 修改-大宗订单 + $api_set_modifyBulkOrder = `/api/sdc/billOperate/modifyBulkOrder`; + // 修改-整车订单 + $api_set_modifyWholeOrder = `/api/sdc/billOperate/modifyWholeOrder`; + // 批量修改网络货运人 + $api_set_updateEnterpriseInfoBatch = `/api/sdc/billOperate/updateEnterpriseInfoBatch`; + // 批量修改附加费率 + $api_set_updateAdditionalRateBatch = `/api/sdc/billOperate/updateAdditionalRateBatch`; + + // 查询投诉列表 + $api_get_operate_listPage = `/api/sdc/complaint/operate/listPage`; + // 获取投诉表详情 + $api_get_getComplaintDriverDetails = `/api/sdc/complaint/operate/getComplaintDriverDetails`; + // 处理投诉 + $api_get_dealWithComplaint = `/api/sdc/complaint/operate/dealWithComplaint`; + // 撤销投诉 + $api_get_canelComplaint = `/api/sdc/complaint/operate/canelComplaint`; + + // 批量修改车队长 + $api_get_updateCarCaptainBatch = `/api/sdc/billOperate/updateCarCaptainBatch`; + // 根据手机号查询车队长/司机 + $api_get_getCarCaptainByMobile = `/api/mdc/userDriverExpand/getCarCaptainByMobile`; + + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + // 查询系统配置项 + public $api_get_config_item_page = '/api/mdc/pbc/sysConfigItem/list/page'; + + // 查询单据审核 + public $api_get_billExamine_page = '/api/sdc/billExamine/listPage'; + // 单据审核查看凭证 + public $api_get_getCredentials = '/api/sdc/billExamine/getCredentials'; + // 单据审核 + public $api_get_billAudit = '/api/sdc/billExamine/billAudit'; + // 统计单据审核状态数量 + public $api_get_getAuditStatistical = '/api/sdc/billExamine/getAuditStatistical'; + // 修改单据审核 + public $api_get_updateBillExamine = '/api/sdc/billExamine/updateBillExamine'; + // 单据审核通过 + public $api_get_billAuditPass = '/api/sdc/billExamine/billAuditPassBatch'; + + // 查询规则抽查列表 + public $api_get_listCompliancePage = '/api/sdc/BillComplianceSpotCheck/list/Page'; + // 规则抽查审批 + public $api_get_updateBillByCompliance = '/api/sdc/billOperate/updateBillByCompliance'; + // 获取规则抽查分类统计 + public $api_get_getComplianceStatisticalStatus = '/api/sdc/billOperate/getComplianceStatisticalStatus'; + + // 货主端-货主查看评价(评价司机的) + public $api_getBillEvaluateByShipper = '/api/sdc/billEvaluate/getBillEvaluateByShipper'; + // 货主端-货主查看评价(司机评价货主的) + public $api_getBillEvaluateDriverByShipper = '/api/sdc/billEvaluate/getBillEvaluateDriverByShipper'; + + // 获取订单退款申请表 + public $api_billRefundApplication_get = '/api/fcc/billRefundApplication/get'; + // 同意退款 + public $api_billRefundApplication_agreeRefund = '/api/fcc/billRefundApplication/agreeRefund'; + // 保存订单退款申请表 + public $api_billRefundApplication_save = '/api/fcc/billRefundApplication/save'; + + // 批量修改费率-实时查看附加费 + public $api_searchAdditionalRateBatch = '/api/sdc/billOperate/searchAdditionalRateBatch'; + + // 风险异常 + public $api_listBillComplianceAbnormalByBillId = '/api/sdc/billCompliance/listBillComplianceAbnormalByBillId'; + // 异常预警 + public $api_getAbnormalWarningByBillId = '/api/sdc/abnormalWarning/getAbnormalWarningByBillId'; + + // 生成卸货单 + public $api_createBillDischargeGoods = '/api/sdc/billOperate/createBillDischargeGoods'; + // 生成提货单 + public $api_createBillTakeGoods = '/api/sdc/billOperate/createBillTakeGoods'; + // 生成卸货单-页面展示 + public $api_getBillDischargeGoodsVO = '/api/sdc/billOperate/getBillDischargeGoodsVO'; + // 生成提货单-页面展示 + public $api_getBillTakeGoodsVO = '/api/sdc/billOperate/getBillTakeGoodsVO'; + + getDictByKey(dictKey: string) { + const params = { dictKey: dictKey }; + return this.request(this.$api_getDictValue, params); + } + $api_get_risk_order_log = `/api/mdc/pbc/operationLogRecords/getOperationLogRecordsList`; // 获取货源的操作日志 + // 获取数据字典 + $api_getDictValue = `/api/mdc/pbc/dictItems/getDictValue`; + // 获取轨迹 + $api_get_getTrajectory = `/api/sdc/billShipper/getTrajectoryByBillId`; + // 获取订单司机轨迹 + $api_get_getAppDriverPosition = `/api/sdc/billShipper/getAppDriverPosition`; + // 查看申述记录 + $api_get_getOrderComplaintDetail = `/api/sdc/billOperate/getOrderComplaintDetail`; + + // 查询异常预警表 + $api_get_abnormalWarning = `/api/sdc/abnormalWarning/list/page`; + $api_get_order_abnormalWarning = `/api/sdc/abnormalWarning/getAbnormalWarningByBillId`; + + // 异步导出运营后台大宗订单列表 + $api_get_asyncExportBulkList = `/api/sdc/billOperate/asyncExportBulkList`; + // 异步导出运营后台整车订单列表 + $api_get_asyncExportWholeList = `/api/sdc/billOperate/asyncExportWholeList`; + // 异步导出风险单导出 + $api_get_asyncExportRiskBillList = `/api/sdc/billRiskOperate/asyncExportRiskBillList`; + // 异步导出合规抽查导出 + $api_get_asyncExportSpotCheckList = `/api/sdc/BillComplianceSpotCheck/asyncExportSpotCheckList`; + // 异步导出单据审核导出 + $api_get_asyncExportExamineBillList = `/api/sdc/billExamine/asyncExportExamineBillList`; + // 异步导出单据审核导出 + $api_abnormalWarning_asyncExport = `/api/sdc/abnormalWarning/asyncExport`; + // 异步导出投诉管理导出 + $api_asyncExportComplaintListDrv = `/api/sdc/complaint/operate/asyncExportComplaintListDrv`; + //操作日志 + public $api_get_log_list = `/api/mdc/pbc/operationLogRecords/getOperationLogRecordsList`; + // 查看补充协议 + public $api_getSupplementaryAgreement = `/api/sdc/billShipper/getSupplementaryAgreement`; + /** + * 根据企业ID,获取企业历史网络货运人 + * @returns + */ + getNetworkFreightForwarderHistory(params: any) { + const param = { + enterpriseIds: params.enterpriseInfoIds + }; + return this.request(this.$api_get_getEnterpriseNetTransHis, param).pipe( + map((res: any) => { + if (!res) { + return []; + } + const list = res.map((item: any) => ({ + label: item.networkTransporterName, + value: item.networkTransporterId + })); + return [{ value: '', label: '全部' }, ...list]; + }) + ); + } + /** + * 获取车型、车长字典数据 + * @returns + */ + getDictOptions(params = {}) { + return this.request(this.$api_getDictValue, params).pipe( + map((res: any) => { + if (!res) { + return []; + } + const obj = []; + obj.push({ label: '不限', value: '999' }); + return [...obj, ...res]; + }) + ); + } + constructor(public injector: Injector) { + super(injector); + } + public reviewPDF(url: string) { + if (!url) { + return; + } + this.openURL(url); + // const uA = window.navigator.userAgent; // 判断浏览器内核 + // const isIE = + // /msie\s|trident\/|edge\//i.test(uA) && + // !!('uniqueID' in document || 'documentMode' in document || 'ActiveXObject' in window || 'MSInputMethodContext' in window); + // const objectUrl = url; + // const a = document.createElement('a'); + // document.body.appendChild(a); + // a.href = objectUrl; + // a.download = '附件.pdf'; + // if (isIE) { + // // 兼容IE11无法触发下载的问题 + // (navigator as any).msSaveBlob(url, a.download); + // } else { + // a.click(); + // } + // a.remove(); + } +} diff --git a/src/app/routes/partner/account-management/components/account-detail/account-detail.component.html b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.html new file mode 100644 index 00000000..b232905e --- /dev/null +++ b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.html @@ -0,0 +1,65 @@ + + + + + + + + + {{headerTotalInfo?.ltdName}} + + + {{headerTotalInfo?.allAmount |currency}} + + + {{headerTotalInfo?.incomeAmount |currency}} + + + {{headerTotalInfo?.payAmount |currency}} + + + + {{headerTotalInfo?.name}}   {{headerTotalInfo?.phone}} + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    - {{item.amount | currency:' ' }}
    +
    + {{item.amount | currency:' ' }}
    +
    + +
    {{item?.accountBalance |currency:' '}}
    +
    + +
    + +
    +
    diff --git a/src/app/routes/partner/account-management/components/account-detail/account-detail.component.less b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.less new file mode 100644 index 00000000..a485bd4c --- /dev/null +++ b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.less @@ -0,0 +1,21 @@ +:host { + ::ng-deep { + .search-header { + nz-range-picker { + width: 100%; + } + } + } + + .table-content { + position: relative; + + .total-footer { + position: absolute; + bottom: 0; + height: 32px; + margin: 16px 0; + line-height: 32px; + } + } +} diff --git a/src/app/routes/partner/account-management/components/account-detail/account-detail.component.spec.ts b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.spec.ts new file mode 100644 index 00000000..1233feec --- /dev/null +++ b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerAccountManagementAccountDetailComponent } from './account-detail.component'; + +describe('PartnerAccountManagementAccountDetailComponent', () => { + let component: PartnerAccountManagementAccountDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PartnerAccountManagementAccountDetailComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerAccountManagementAccountDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/account-management/components/account-detail/account-detail.component.ts b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.ts new file mode 100644 index 00000000..4e595c8b --- /dev/null +++ b/src/app/routes/partner/account-management/components/account-detail/account-detail.component.ts @@ -0,0 +1,204 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { AccountManagemantService } from '../../services/account-managemant.service'; + +@Component({ + selector: 'app-partner-account-management-account-detail', + templateUrl: './account-detail.component.html', + styleUrls: ['./account-detail.component.less'] +}) +export class PartnerAccountManagementAccountDetailComponent implements OnInit { + headerTotalInfo: any = { + allAmount: 0, + incomeAmount: 0, + payAmount: 0, + name: '', + ltdName: '', + phone: '' + }; + footerTotalInfo: any = { + incomeAmount: 0, + payAmount: 0, + total: 0 + }; + + + url = `/user`; + schema: SFSchema = {}; + ui!: SFUISchema; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + + + columns: STColumn[] = []; + roleId = ''; + bankType = ''; + channelSource = ''; + ltdId = ''; + constructor(public service: AccountManagemantService, public ar: ActivatedRoute) { + + this.roleId = this.ar.snapshot.params.id; + this.ar.queryParamMap.subscribe((res: any) => { + this.ltdId = res?.params?.ltdId; + this.channelSource = res?.params?.channelSource; + this.bankType = res?.params?.bankType; + }) + } + + + get reqParams() { + return { ...this.sf?.value, roleId: this.roleId, ltdId: this.ltdId, channelSource: this.channelSource, bankType: this.bankType }; + } + ngOnInit(): void { + this.getHeaderSummary(); + this.getFooterSummary(); + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { + type: 'boolean', ui: { hidden: true } + }, + createTime: { + type: 'string', + title: '交易时间', + ui: { + widget: 'sl-from-to', + type: 'date', + autoComplete: 'off', + format: 'yyyy-MM-dd', + } as SFDateWidgetSchema, + }, + transactionNumber: { + title: '流水号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + businessNumber: { + title: '交易单号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + tradeType: { + type: 'string', + title: '交易类型', + default: '', + ui: { + widget: 'dict-select', + params: { + dictKey: 'trade:type' + }, + placeholder: '请选择', + allowClear: true, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + }, + }, + incomeType: { + type: 'string', + title: '收支类型', + default: '', + ui: { + widget: 'dict-select', + params: { + dictKey: 'income:type' + }, + placeholder: '请选择', + allowClear: true, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + }, + }, + + } + } + this.ui = { '*': { spanLabelFixed: 100, grid: { span: 8, gutter: 4 } }, }; + } + + /** +* 初始化数据列表 +*/ + initST() { + this.columns = [ + { title: '交易时间', index: 'createTime', className: 'text-center', width: 200 }, + { title: '流水号', index: 'transactionNumber', className: 'text-center', width: 180 }, + { title: '交易类型', index: 'tradeTypeLabel', className: 'text-center', width: 150 }, + { title: '交易单号', index: 'businessNumber', className: 'text-center', width: 180 }, + { title: '备注', index: 'tradeContent', className: 'text-center', width: 180 }, + { title: '收支类型', index: 'incomeTypeLabel', className: 'text-center', width: 180 }, + { title: '交易金额', render: 'amount', className: 'text-center', width: 150 }, + { title: '账户余额', render: 'accountBalance', className: 'text-center', width: 150 }, + { title: '付款方', index: 'payName', className: 'text-center', width: 200 }, + { title: '收款方', index: 'payeeName', className: 'text-center', width: 200 }, + ]; + } + resetSF() { + this._$expand = false; + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + + /** +* 伸缩查询条件 +*/ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 头部汇总 + */ + getHeaderSummary() { + const params = { + roleId: this.roleId, + ltdId: this.ltdId, + channelSource: this.channelSource, + bankType: this.bankType + }; + this.service.request(this.service.$api_get_account_detail_header_summary, { ...params }).subscribe(res => { + if (res) { + this.headerTotalInfo = res; + console.log(res); + } + }) + } + /** + * 脚部汇总 + */ + getFooterSummary() { + this.service.request(this.service.$api_get_account_detail_footer_summary, this.reqParams).subscribe(res => { + if (res) { + this.footerTotalInfo = res; + } + }) + } + + + search() { + this.st.load(1); + } + export() { } + + goBack() { + window.history.go(-1); + } + + +} diff --git a/src/app/routes/partner/account-management/components/list/list.component.html b/src/app/routes/partner/account-management/components/list/list.component.html new file mode 100644 index 00000000..b811832d --- /dev/null +++ b/src/app/routes/partner/account-management/components/list/list.component.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + +
    {{item.allBalance | currency:' '}}
    +
    + + {{item.unEntryAmount | currency:' + '}} + + +
    {{item.availableBalance | currency:' '}}
    +
    + + +
    +
    diff --git a/src/app/routes/partner/account-management/components/list/list.component.spec.ts b/src/app/routes/partner/account-management/components/list/list.component.spec.ts new file mode 100644 index 00000000..da38a52c --- /dev/null +++ b/src/app/routes/partner/account-management/components/list/list.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerAccountManagementListComponent } from './list.component'; + +describe('PartnerAccountManagementListComponent', () => { + let component: PartnerAccountManagementListComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PartnerAccountManagementListComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerAccountManagementListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/account-management/components/list/list.component.ts b/src/app/routes/partner/account-management/components/list/list.component.ts new file mode 100644 index 00000000..3d98844e --- /dev/null +++ b/src/app/routes/partner/account-management/components/list/list.component.ts @@ -0,0 +1,119 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { BussinessStatisticsService } from '../../../business-statistics/services/bussiness-statistics.service'; +import { AccountManagemantService } from '../../services/account-managemant.service'; +import { PartnerAccountManagementVirtualAccountDetailComponent } from '../virtual-account-detail/virtual-account-detail.component'; + +@Component({ + selector: 'app-partner-account-management-list', + templateUrl: './list.component.html', +}) +export class PartnerAccountManagementListComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + ui!: SFUISchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + + constructor(public service: AccountManagemantService, public modal: NzModalService) { } + /** + * 查询参数 + */ + get reqParams() { + const params = { ...this.sf?.value }; + return params + } + + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + userName: { + title: '合伙人名称', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + phone: { + title: '手机号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + } + } + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 12 } }, }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '合伙人名称', index: 'name', className: 'text-center', width: 250 }, + { title: '手机号', index: 'phone', className: 'text-center', width: 200 }, + { + title: '账户总额(元)', index: 'allBalance', className: 'text-right', sort: true, width: 150, type: 'currency', + }, + { + title: '待入账余额(元)', render: 'unEntryAmount', className: 'text-right', width: 150, + }, + { + title: '可用余额(元)', index: 'availableBalance', className: 'text-right', sort: true, width: 150, type: 'currency' + }, + { title: '虚拟账户', index: 'virtualAccount', className: 'text-center', width: 220 }, + { + title: '操作', + width: 150, + buttons: [ + { + text: '虚拟账户明细', + click: (_record) => this.viewVirtual(_record) + } + ] + } + ]; + } + + resetSF() { + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + + /** + * + * @param _record 当前行信息 + */ + viewVirtual(_record: any) { + const modalRef = this.modal.create({ + nzTitle: '虚拟账户明细', + nzContent: PartnerAccountManagementVirtualAccountDetailComponent, + nzComponentParams: { + roleId: _record?.roleId, + }, + nzWidth: '85%', + nzFooter: null + }); + // modalRef.afterClose.subscribe(result => { + // }); + } + + /** + * + */ + export() { + + } + +} diff --git a/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.html b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.html new file mode 100644 index 00000000..218de752 --- /dev/null +++ b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.html @@ -0,0 +1,79 @@ + + + + + + + + + {{summaryObj?.taxno}} + + + {{(summaryObj?.totalRebate?summaryObj?.totalRebate: 0 )|currency :' + '}} + + + {{(summaryObj?.recordedAmount?summaryObj?.recordedAmount:0 + )|currency:' '}} + + + {{(summaryObj?.taxPersonalSum?summaryObj?.taxPersonalSum:0 + )|currency:' '}} + + + {{(summaryObj?.waitRecordedAmount?summaryObj?.waitRecordedAmount:0) + |currency:' '}} + + + + {{summaryObj?.ltdName}} + + + +
    + +
    +
    + + +
    - {{item.amount | currency }}
    +
    + {{item.amount | currency }}
    +
    +
    + +
    +
    + + +
    +
    + {{detailRecord?.ltdName}} + {{detailRecord?.totalRebate |currency: ' '}} +
    + + +
    + {{item?.year }}年 + {{item?.month }}月 +
    +
    + +
    {{item?.profitAmountSum |currency :' '}}
    +
    + +
    +
    +
    diff --git a/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.spec.ts b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.spec.ts new file mode 100644 index 00000000..95af39f8 --- /dev/null +++ b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerAccountManagementRecordedDetailComponent } from './recorded-detail.component'; + +describe('PartnerAccountManagementRecordedDetailComponent', () => { + let component: PartnerAccountManagementRecordedDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PartnerAccountManagementRecordedDetailComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerAccountManagementRecordedDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.ts b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.ts new file mode 100644 index 00000000..e7420c8c --- /dev/null +++ b/src/app/routes/partner/account-management/components/recorded-detail/recorded-detail.component.ts @@ -0,0 +1,186 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema, Widget } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { AccountManagemantService } from '../../services/account-managemant.service'; + +@Component({ + selector: 'app-partner-account-management-recorded-detail', + templateUrl: './recorded-detail.component.html', +}) +export class PartnerAccountManagementRecordedDetailComponent implements OnInit { + summaryObj: any = { + waitRecordedAmount: 0, + totalRebate: 0, + taxPersonalSum: 0, + recordedAmount: 0, + ltdName: '', + taxno: '' + }; + + footerSummary = { + total: 0, + income: 0, + spending: 0 + } + + detailRecord: any = {}; + + url = `/user`; + schema: SFSchema = {}; + ui!: SFUISchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + + + columns: STColumn[] = []; + billDetailColumns: STColumn[] = []; + showBillDetail = false; + billDetailList = []; + roleId = ''; + + constructor(public service: AccountManagemantService, public router: Router, public ar: ActivatedRoute) { + this.roleId = this.ar.snapshot.params.id; + + } + + + get reqParams() { + return { ...this.sf?.value, partnerId: this.roleId }; + } + + get billDetailReqParams() { + return {}; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.getInvoiceSummary(); + } + + initSF() { + this.schema = { + properties: { + ltdName: { + title: '网络货运人', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + + } + } + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 } }, }; + } + + /** +* 初始化数据列表 +*/ + initST() { + this.columns = [ + { title: '网络货运人', index: 'ltdName', className: 'text-center', width: 200 }, + { title: '银行类型', render: 'bankTypeLabel', className: 'text-center', width: 150 }, + { title: '虚拟账户', render: 'fictitiousAccount', className: 'text-center', width: 200 }, + { title: '返佣总额(元)', index: 'totalRebate', className: 'text-center', width: 180, type: 'currency' }, + { title: '已入账金额(元)', index: 'recordedAmount', className: 'text-center', width: 180, type: 'currency' }, + { title: '代缴个税(元)', index: 'taxPersonalSum', className: 'text-center', width: 180, type: 'currency' }, + { title: '待入账金额(元)', index: 'waitRecordedAmount', className: 'text-right', width: 180, type: 'currency' }, + { + title: '操作', className: 'text-center', width: 300, + buttons: [ + { + text: '查看入账记录', + click: (_record) => this.viewBookedRecord(_record) + }, + { + text: '查看账单明细', + click: (_record) => this.viewAccountDetail(_record) + }, + ] + }, + ]; + } + + initBillDetailST() { + this.billDetailColumns = [ + { title: '账单月份', render: 'month', className: 'text-center', width: '40%' }, + { title: '返佣金额(元)', render: 'profitAmountSum', className: 'text-center', width: '40%' }, + { + title: '操作', className: 'text-center', width: '20%', buttons: [ + { + text: '订单明细', + click: (_record) => window.open(location.origin + `#/partner/rebate/record?ltdId=${_record?.ltdId}`) + } + ] + }, + ] + } + + + resetSF() { + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + + + + search() { + this.st.load(1); + } + + /** + * 获取账单明细 + */ + getBillDetail(ltdId: string) { + this.service.request(this.service.$api_get_bill_detail, { ltdId }).subscribe(res => { + if (res) { + this.billDetailList = res; + } + }) + } + + + export() { } + + /** + * 查看入账记录 + * @param record 当前行 + */ + viewBookedRecord(record: any) { + window.open(location.origin + `#/partner/recorded/record?ltdId=${record?.ltdId}`); + } + + /** + * 查看账单明细 + * @param record 当前行 + */ + viewAccountDetail(record: any) { + this.billDetailColumns = []; + this.showBillDetail = true; + this.initBillDetailST(); + this.detailRecord = record; + this.getBillDetail(record?.ltdId); + } + + getInvoiceSummary() { + this.service.request(this.service.$api_get_invoice_summary, { partnerId: this.roleId }).subscribe(res => { + if (res) { + this.summaryObj = res; + } + }) + } + + handleCancel() { + this.showBillDetail = false; + this.detailRecord = {}; + + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.html b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.html new file mode 100644 index 00000000..21bfeea2 --- /dev/null +++ b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.html @@ -0,0 +1,38 @@ + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    + {{item.allBalance}} +
    +
    + +
    + {{item.availableBalance}} +
    +
    +
    +
    +
    + diff --git a/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.spec.ts b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.spec.ts new file mode 100644 index 00000000..9a7da573 --- /dev/null +++ b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerAccountManagementVirtualAccountDetailComponent } from './virtual-account-detail.component'; + +describe('PartnerAccountManagementVirtualAccountDetailComponent', () => { + let component: PartnerAccountManagementVirtualAccountDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PartnerAccountManagementVirtualAccountDetailComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerAccountManagementVirtualAccountDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.ts b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.ts new file mode 100644 index 00000000..6840cddd --- /dev/null +++ b/src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component.ts @@ -0,0 +1,184 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { ShipperBaseService } from 'src/app/shared/services/business/shipper-base.service'; +import { AccountManagemantService } from '../../services/account-managemant.service'; + +@Component({ + selector: 'app-partner-account-management-virtual-account-detail', + templateUrl: './virtual-account-detail.component.html', +}) +export class PartnerAccountManagementVirtualAccountDetailComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + ui!: SFUISchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + roleId = ''; + _$expand = false; + record = {}; + + constructor(public shipperservice: ShipperBaseService, public service: AccountManagemantService, + private modalRef: NzModalRef, public router: Router) { + } + + get reqParams() { + return { ...this.sf?.value, roleId: this.roleId }; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { + type: 'boolean', ui: { hidden: true } + }, + userName: { + title: '合伙人名称', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + phone: { + title: '手机号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + ltdId: { + title: '网络货运人', + type: 'string', + default: '', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder({}, true) + } + + }, + bankType: { + type: 'string', + title: '银行类型', + default: '', + ui: { + widget: 'dict-select', + params: { + dictKey: 'bankname:type' + }, + placeholder: '请选择', + allowClear: true, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + }, + }, + virtualAccount: { + title: '虚拟账户', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value + }, + }, + }, + createTime: { + type: 'string', + title: '创建时间', + ui: { + widget: 'sl-from-to', + type: 'date', + autoComplete: 'off', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + }, + } as SFDateWidgetSchema, + }, + } + } + this.ui = { '*': { spanLabelFixed: 100, grid: { span: 8, gutter: 4 } }, }; + } + + /** +* 初始化数据列表 +*/ + initST() { + this.columns = [ + { title: '合伙人', index: 'name', className: 'text-center', width: 200 }, + { title: '手机号', index: 'phone', className: 'text-center', width: 150 }, + { title: '网络货运人', index: 'ltdName', className: 'text-center', width: 200 }, + { title: '银行类型', index: 'bankTypeLabel', className: 'text-center', width: 120 }, + { title: '虚拟账户', index: 'virtualAccount', className: 'text-center', width: 180 }, + { title: '可用余额', render: 'availableBalance', className: 'text-center', width: 180 }, + { title: '账户总余额', render: 'allBalance', className: 'text-center', width: 180 }, + { title: '创建时间', index: 'createTime', className: 'text-center', width: 200 }, + { title: '状态', index: 'stateDeletedLabel', className: 'text-center', width: 120 }, + { + title: '操作', + width: 120, + buttons: [ + { + text: '查看明细', + click: (_record) => this.viewDetail(_record) + } + ] + } + ]; + } + + resetSF() { + this._$expand = false; + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + /** +* 伸缩查询条件 +*/ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + search() { + this.st.load(1); + } + export() { } + /** + * + * @param _record 当前行信息 + */ + viewDetail(_record: any) { + // this.router.navigate([`/partner/account-management/am/detail/${_record?.roleId}`], { + // queryParams: { + // channelSource: _record?.accountType, + // bankType: _record?.bankType, + // ltdId: _record?.ltdId + // } + // }); + window.open(location.origin + `/#/partner/account-management/am/detail/${_record?.roleId}?ltdId=${_record?.ltdId}&channelSource=${_record?.accountType}&bankType=${_record?.bankType}`); + } + + close() { + this.modalRef.destroy(); + } + +} diff --git a/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html new file mode 100644 index 00000000..e2073979 --- /dev/null +++ b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html @@ -0,0 +1,64 @@ + + + + + + + + + + +
    + + {{formData?.ltdName}} + + + {{formData?.bankType==='1'?'平安银行':'浦发银行'}} + + + {{formData?.refundApplyCode}} + + + {{formData?.bankAccountName}} + + + {{formData?.createTime}} + + + {{formData?.virtualAccount}} + + + {{formData?.refundStatusLabel}} + + + {{formData?.amount | currency}} + + + {{formData?.bankSerialNumber}} + + + {{formData?.bankCardNumber}} + + + {{formData?.refundStatus==='3'?'下载回单':'暂无回单'}} + +
    + + +
    +
    + +
    +
    +
    diff --git a/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less new file mode 100644 index 00000000..e299b7d1 --- /dev/null +++ b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less @@ -0,0 +1,17 @@ +:host::ng-deep { + + .ant-alert-info { + background-color: #f3f3f3; + border : 1px solid #dbdbdb; + + .ant-alert-message { + color: rgba(0, 0, 0, 0.85); + font-weight: 600; + font-size: 16px; + } + } + + .ant-form-item { + margin-bottom: 15px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts new file mode 100644 index 00000000..baf83686 --- /dev/null +++ b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts @@ -0,0 +1,87 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { FreightAccountService } from 'src/app/routes/financial-management/services/freight-account.service'; + +@Component({ + selector: 'app-partner-account-management-withdrawals-detail', + templateUrl: './withdrawals-detail.component.html', + styleUrls: ['./withdrawals-detail.component.less'] +}) +export class PartnerAccountManagementWithdralDetailComponent implements OnInit { + formData: any = {}; + + timeLineData: any = []; + + constructor(public service: FreightAccountService, private route: ActivatedRoute) { + const id = route.snapshot.params.id; + this.loadRefundDetail(id); + } + + ngOnInit(): void {} + + loadRefundDetail(id: string) { + this.service.request(this.service.$api_get_refund_detail, { id }).subscribe(res => { + if (res) { + this.formData = res; + // 处理流程节点数据 + // 流程是否结束 + let isEnd = false; + if (res.successTime) { + isEnd = true; + if (res.refundStatus === '3') { + this.timeLineData.push({ time: res.successTime, value: `到账成功`, color: 'green' }); + } else { + this.timeLineData.push({ time: res.successTime, value: `提现失败`, color: 'red' }); + } + } + if (res.agreeTime && res.refundStatus !== '4') { + this.timeLineData.push({ time: res.agreeTime, value: `银行处理中`, color: 'gray' }); + } + if (res.agreeTime) { + if (res.refundStatus === '4') { + isEnd = true; + this.timeLineData.push({ + time: res.agreeTime, + value: `拒绝提现
    操作人员:${res.handlerUserIdLabel}`, + color: 'red' + }); + } else { + this.timeLineData.push({ + time: res.agreeTime, + value: `审核通过
    操作人员:${res.handlerUserIdLabel}`, + color: 'gray' + }); + } + } + if (res.createTime) { + this.timeLineData.push({ + time: res.createTime, + value: `提交提现申请
    提现${res.amount}元至${res.bankName}(${res.bankCardNumber})
    操作人员:${res.userIdLabel}`, + color: 'gray' + }); + } + if (this.timeLineData?.length > 0 && !isEnd) { + this.timeLineData[0].color = 'green'; + } + } + }); + } + + downBack() { + if (this.formData?.refundStatus !== '3') { + return; + } + this.service.getReceiptUrl(this.formData.receiptUrl, { + bankType: this.formData.bankType, + rmYll: this.formData.userId, + snglFlgCd: this.formData.coreSerNo, + bussType: '06', + ltdId: this.formData.ltdId, + accountType: this.formData.accountType + }); + } + + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.html b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.html new file mode 100644 index 00000000..92dc20a4 --- /dev/null +++ b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.html @@ -0,0 +1,63 @@ + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据   累计提现 {{ + totalCallNo }} + +
    + +
    +
    + + + + {{ item.bankName }}
    {{ item.bankCardNumber }} +
    +
    +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.ts b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.ts new file mode 100644 index 00000000..ad7c8ead --- /dev/null +++ b/src/app/routes/partner/account-management/components/withdrawals-record/withdrawals-record.component.ts @@ -0,0 +1,336 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from 'src/app/routes/financial-management/services/freight-account.service'; +import Big from 'src/app/shared/utils/deal-precision'; +import { AccountManagemantService } from '../../services/account-managemant.service'; + + +@Component({ + selector: 'app-partner-account-management-withdrawals-record', + templateUrl: './withdrawals-record.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class PartnerAccountManagementWithdrawalsRecordComponent implements OnInit { + @ViewChild('st', { static: true }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('auditModal', { static: false }) auditModal!: any; + @ViewChild('viewReasonModal', { static: false }) viewReasonModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + refundStatus: any = ''; + + msg = ''; + constructor(public service: FreightAccountService, public amService: AccountManagemantService, private nzModalService: NzModalService, private router: Router, public ar: ActivatedRoute) { } + + ngOnInit(): void { } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + }, + refundStatus: this.refundStatus || null + }); + } + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + data = data.map(node => ({ ...node, disabled: node.refundStatus !== '1' })); + return data; + }; + + stChange(e: STChange): void { + if (e.type === 'checkbox') { + const checkRows = (e.checkbox as STData[]) || []; + //判断当前页是否有选中的行 + if (checkRows.length === 0) { + // 当前页没有存在已勾选的行,移除之前所记录的当前页的行 + const stList = this.st.list; + stList.forEach(item => { + this.selectedRows = this.selectedRows.filter((e: any) => e.id !== item.id); + }) + } else { + //添加新增的行 + checkRows.forEach((item: any) => { + const newSelectedList = this.selectedRows.filter((r: any) => r.id === item.id); + if (newSelectedList.length === 0) { + this.selectedRows.push(item); + + } + }) + // 移除取消选中的行 + const stList = this.st.list; + stList.forEach(item => { + if (!item.checked) { + const index = this.selectedRows.findIndex(_item => item.id === _item.id); + if (index !== -1) this.selectedRows.splice(index, 1); + } + }) + } + let totalCallNo = 0; + this.selectedRows.forEach((item => { + totalCallNo = new Big(this.totalCallNo).plus(item?.amount).parse(); + })); + this.totalCallNo = totalCallNo; + } else if (e.type === 'loaded') { + // 页面加载时勾选 + (e?.loaded || []).forEach((r) => { + this.selectedRows.forEach((x) => { + if (x.id === r.id) { + r.checked = true; + } + }); + }); + } + } + + changeRefundStatus(status?: string) { + this.refundStatus = status || null; + this.st.load(1); + } + + auditAction(item?: any) { + this.msg = ''; + let params: Array = []; + if (item) { + params = [item.id]; + } else { + params = this.selectedRows.map(node => node.id); + } + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + this.service + .request(this.service.$api_disagree_refund, { + refundApplicationId: params, + msg: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核拒绝成功'); + modal.destroy(); + this.st.load(1); + } + }); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + this.service + .request(this.service.$api_agree_refund, { + refundApplicationId: params, + msg: this.msg + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核通过成功'); + modal.destroy(); + this.st.load(1); + } + }); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: item?.rejectionCause || item?.failCause, + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + refundApplyCode: { + type: 'string', + title: '提现单号', + ui: { + placeholder: '请输入' + } + }, + refundStatus: { + type: 'string', + title: '提现状态', + ui: { + widget: 'dict-select', + params: { dictKey: 'refund:apply:status' }, + placeholder: '请选择' + } + }, + createTime: { + title: '提现时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + bankAccountName: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + accountType: { + type: 'string', + title: '账户类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bank:type' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + bankType: { + type: 'string', + title: '银行类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bankname:type' }, + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', className: 'text-center' }, + { title: '提现时间', index: 'createTime', width: 180, className: 'text-center' }, + { title: '提现单号', index: 'refundApplyCode', width: 180, className: 'text-center' }, + { title: '网络货运人', index: 'ltdName', width: 220, className: 'text-center' }, + { title: '银行类型', index: 'bankTypeLabel', width: 100, className: 'text-center' }, + { title: '账户类型', index: 'accountTypeLabel', width: 100, className: 'text-center' }, + { title: '账户名称', index: 'bankAccountName', width: 220, className: 'text-center' }, + { title: '虚拟账户', index: 'virtualAccount', width: 180, className: 'text-center' }, + { + title: '提现金额', + index: 'amount', + width: 200, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { title: '提现银行账户', render: 'bankCardNumber', width: 200, className: 'text-center' }, + { title: '提现状态', index: 'refundStatusLabel', width: 100, className: 'text-center' }, + { title: '银行流水号', index: 'bankSerialNumber', width: 160, className: 'text-center' }, + { title: '核心交易流水', index: 'coreSerNo', width: 180, className: 'text-center' }, + { title: '失败原因', index: 'rejectionCause', width: 200, format: item => item.failCause, className: 'text-center' }, + { + title: '操作', + fixed: 'right', + width: '110px', + buttons: [ + { + text: '查看回单', + iif: item => item.refundStatus === '3', + click: item => + this.service.getReceiptUrl(item.receiptUrl, { + bankType: item.bankType, + rmYll: item.userId, + snglFlgCd: item.coreSerNo, + bussType: '06', + ltdId: item.ltdId, + accountType: item.accountType + }) + }, + { + text: '查看原因', + iif: item => item.refundStatus === '4', + click: item => this.showReason(item) + }, + { + text: '审核', + iif: item => item.refundStatus === '1', + click: item => this.auditAction(item) + }, + { + text: '详情', + click: item => this.router.navigate(['./../detail/' + item.id], { relativeTo: this.ar }) + } + ] + } + ]; + } +} diff --git a/src/app/routes/partner/account-management/services/account-managemant.service.ts b/src/app/routes/partner/account-management/services/account-managemant.service.ts new file mode 100644 index 00000000..f7fa89b0 --- /dev/null +++ b/src/app/routes/partner/account-management/services/account-managemant.service.ts @@ -0,0 +1,22 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class AccountManagemantService extends BaseService { + + $api_get_account_management_page = `/api/bpc/accountBalancePartner/getPartnerAccountBalanceByOperator`; // 账户管理 + $api_get_virtual_detail_page = `/api/bpc/accountBalancePartner/getPartnerAccountBalanceInfoByOperator`;//虚拟账户明细 + $api_get_withdraw_record_page = `/api/fcc/refundApplicationOBC/list/partnerPage`;// 提现记录 + $api_get_account_detail_page = `/api/bpc/accountBalancePartner/getAccountBalancePartnerByOperatorPage`;// 账户明细 + $api_get_account_detail_footer_summary = `/api/bpc/accountBalancePartner/getAccountBalancePartnerIncomeDetailByOperator`;// 账户明细脚部汇总 + $api_get_account_detail_header_summary = `/api/bpc/accountBalancePartner/getAccountBalancePartnerAmountByOperator`;// 账户明细头部汇总 + $api_get_bill_detail = `/api/bpc/partnerIncomeDetail/findPartnerWaitIncomeByOperator`; // 查看账单明细 + $api_get_invoice_summary = `/api/bpc/partnerInvoiceEntry/oprationEntrySummary`; // 入账明细汇总 + $api_get_invoice_detail_page = `/api/bpc/partnerInvoiceEntry/oprationEntryDetail`; // 待入账明细列表 + + constructor(public injector: Injector) { + super(injector) + } +} diff --git a/src/app/routes/partner/ad/components/list/list.component.html b/src/app/routes/partner/ad/components/list/list.component.html new file mode 100644 index 00000000..5a266913 --- /dev/null +++ b/src/app/routes/partner/ad/components/list/list.component.html @@ -0,0 +1,62 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + + +
    diff --git a/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.html b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.html new file mode 100644 index 00000000..a0469712 --- /dev/null +++ b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.html @@ -0,0 +1,46 @@ + + + + + + +
    +
    + +
    +
    +
    深圳市XXXXXXX有限公司
    +
    91440300357887492H
    + + + + + + +
    +
    +
    待审核
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + + + + + +
    +
    +
    + + \ No newline at end of file diff --git a/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.less b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.less new file mode 100644 index 00000000..403e7692 --- /dev/null +++ b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.less @@ -0,0 +1,29 @@ +:host { + .head-box { + img { + width : 80px; + height : 80px; + padding: 8px; + } + + .right-h { + font-size: 16px; + } + + .right-s { + color: #7f7f7f; + } + + .left-rt { + font-weight: bold; + font-size : 16px; + text-align : right; + } + + .left-rb { + display : flex; + justify-content: flex-end; + padding-top : 16px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.ts b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.ts new file mode 100644 index 00000000..d7aa10db --- /dev/null +++ b/src/app/routes/partner/advice-feedback/components/feedback-detail/feedback-detail.component.ts @@ -0,0 +1,71 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ParterClaimAuditListChannelApproveComponent } from '../../../claim-audit/components/channel-approve/channel-approve.component'; +import { ParterClaimAuditListChannelRejectComponent } from '../../../claim-audit/components/channel-reject/channel-reject.component'; +import { AdviceFeedbackService } from '../../services/advice-feedback.service'; + +// import { ParterClaimAuditListChannelApproveComponent } from '../channel-approve/channel-approve.component'; +// import { ParterClaimAuditListChannelRejectComponent } from '../channel-reject/channel-reject.component'; + +@Component({ + selector: 'app-parter-feedback-detail-detail', + templateUrl: './feedback-detail.component.html', + styleUrls: ['./feedback-detail.component.less'] +}) +export class ParterAdviceFeedbackDetailComponent implements OnInit { + id = this.route.snapshot.queryParams.id; + i: any; + imges: any; + isVisible = false; + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + public service: AdviceFeedbackService, + private modalService: NzModalService, + private router: Router + ) {} + + ngOnInit(): void { + this.initData(); + } + + initData() { + // this.service.request(this.service.$api_getBulkBillDetail, { id: this.id }).subscribe(res => { + // if (res) { + // this.i = res; + // + // } + // }); + } + + approve() { + const modalRef = this.modalService.create({ + nzTitle: '同意', + nzWidth: 700, + nzContent: ParterClaimAuditListChannelApproveComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + reject() { + const modalRef = this.modalService.create({ + nzTitle: '拒绝', + nzWidth: 700, + nzContent: ParterClaimAuditListChannelRejectComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + goBack() { + window.history.go(-1); + } +} diff --git a/src/app/routes/partner/advice-feedback/components/list/list.component.html b/src/app/routes/partner/advice-feedback/components/list/list.component.html new file mode 100644 index 00000000..ca389dea --- /dev/null +++ b/src/app/routes/partner/advice-feedback/components/list/list.component.html @@ -0,0 +1,47 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + diff --git a/src/app/routes/partner/advice-feedback/components/list/list.component.ts b/src/app/routes/partner/advice-feedback/components/list/list.component.ts new file mode 100644 index 00000000..80260b01 --- /dev/null +++ b/src/app/routes/partner/advice-feedback/components/list/list.component.ts @@ -0,0 +1,228 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AdviceFeedbackService } from '../../services/advice-feedback.service'; + +@Component({ + selector: 'app-parter-advice-feedback', + templateUrl: './list.component.html' +}) +export class ParterAdviceFeedbackListComponent implements OnInit { + schema: SFSchema = {}; + columns1!: STColumn[]; + columns2!: STColumn[]; + @ViewChild('st1', { static: false }) + st1!: STComponent; + ui!: SFUISchema; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + _$expand = false; + selectedIndex = 0; + + data=[{name1:1111}] + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: AdviceFeedbackService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { ...this.sf?.value }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + ngOnInit() { + this.initSF(); + this.initST1(); + this.initST2(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + type: 'string', + title: '提交人' + }, + name1: { + type: 'string', + title: '企业管理员' + }, + name2: { + type: 'string', + title: '角色' + }, + name3: { + type: 'string', + title: '问题类型', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + name4: { + type: 'string', + title: '状态', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + } + }; + this.ui = { + '*': { + grid: { span: 8, gutter: 4 } + } + }; + } + + initST1() { + this.columns1 = [ + { + title: '提交人', + index: 'name1' + }, + { + title: '企业管理员', + index: 'name1' + }, + { + title: '手机号', + index: 'name1' + }, + { + title: '角色', + index: 'name1' + }, + { + title: '问题类型', + index: 'name1' + }, + { + title: '描述或建议', + index: 'name1' + }, + { + title: '状态', + index: 'name1' + }, + { + title: '提交时间', + index: 'name1' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '详情', + click: (_record, _modal, _instance) => this.partnerView(_record), + }, + { + text: '处理', + click: (_record, _modal, _instance) => this.partnerView(_record), + }, + ] + } + ]; + } + + initST2() { + this.columns2 = [ + { + title: '提交人', + index: 'name1' + }, + { + title: '客户名称', + index: 'name1' + }, + { + title: '认领备注', + index: 'name1' + }, + { + title: 'CRM状态', + index: 'name1' + }, + { + title: '平台审核状态', + index: 'name1' + }, + { + title: '提交时间', + index: 'name1' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '详情', + click: (_record, _modal, _instance) => this.channelView(_record), + }, + { + text: '审核', + click: (_record, _modal, _instance) => this.channelView(_record), + }, + + ] + } + ]; + } + + partnerView(record: STData) { + this.router.navigate(['/partner/advice-feedback/detail'], { queryParams: {} }); + } + + channelView(record: STData) { + this.router.navigate(['/partner/advice-feedback/detail'], { queryParams: {} }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + search() { + // this.st1?.load(1); + } + + tabChange(index:any){ + console.log(index) + switch (index) { + case 0: + this.initST1(); + break; + case 1: + this.initST2(); + break; + default: + break; + } + } + +} diff --git a/src/app/routes/partner/advice-feedback/services/advice-feedback.service.ts b/src/app/routes/partner/advice-feedback/services/advice-feedback.service.ts new file mode 100644 index 00000000..1e94e786 --- /dev/null +++ b/src/app/routes/partner/advice-feedback/services/advice-feedback.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class AdviceFeedbackService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/article-management/components/edit/edit.component.html b/src/app/routes/partner/article-management/components/edit/edit.component.html new file mode 100644 index 00000000..e8e4a5fc --- /dev/null +++ b/src/app/routes/partner/article-management/components/edit/edit.component.html @@ -0,0 +1,17 @@ + + + + + +
    + + +
    +
    + +
    + + +
    +
    + diff --git a/src/app/routes/partner/article-management/components/edit/edit.component.ts b/src/app/routes/partner/article-management/components/edit/edit.component.ts new file mode 100644 index 00000000..f65dea8f --- /dev/null +++ b/src/app/routes/partner/article-management/components/edit/edit.component.ts @@ -0,0 +1,189 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { Observable, Observer } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ChannelSalesService } from '../../services/channel-sales.service'; + +@Component({ + selector: 'app-parter-article-management-edit', + templateUrl: './edit.component.html' +}) +export class ParterArticleManagementEditComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + public service: ChannelSalesService, + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name1: { + type: 'string', + title: '文章标题', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请输入50字符' + } as SFTextareaWidgetSchema, + }, + name2: { + type: 'string', + title: '文章简介', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请输入50字符' + } as SFTextareaWidgetSchema, + }, + name3: { + type: 'string', + title: '封面图', + ui: { + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFilePath', + urlReName: 'data.fullFilePath', + widget: 'upload', + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸 280px * 180 px)', + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + } + } as SFUploadWidgetSchema + }, + name: { + title: '分类', + type: 'string', + enum: [ + { label: '管理员', value: '1'}, + ], + ui: { + widget: 'select', + } as SFSelectWidgetSchema, + }, + name4: { + type: 'number', + title: '排序', + minimum: 0, + maximum: 99, + ui: { + widgetWidth: 300 , + placeholder:'请输入0~99,数字越大,排序越靠前' + } + }, + name5: { + type: 'string', + title: '跳转路径', + enum: [ + { label: '图文', value: '1'}, + { label: '视频', value: '2'}, + ], + ui: { + widget: 'radio', + } as SFRadioWidgetSchema, + default: '1', + }, + content: { + type: 'string', + title: '正文', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 450 + }, + visibleIf: { name5: (value: string) => value === '1' } + }, + }, + name6: { + type: 'string', + title: '视频', + ui: { + action: apiConf.fileUpload, + accept: 'video/mp4,video/avi,video/mkv,video/vob', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFilePath', + urlReName: 'data.fullFilePath', + widget: 'upload', + descriptionI18n: '支持MP4、AVI、DAT、MKV、FLV、VOB格式,文件小于20M。', + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 20; + if (!isLt2M) { + this.service.msgSrv.warning('视频大小超过20M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + visibleIf: { name5: (value: string) => value === '2' } + } as SFUploadWidgetSchema + }, + }, + required: ['name1', 'name2'] + }; + this.ui = { + '*': { + spanLabelFixed: 150, + grid: { span: 20 } + }, + + }; + } + + close() { + + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + // this.service.request('', { ...this.sf.value }).subscribe(res => { + // if (res) { + // this.modalRef.destroy(true); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } +} diff --git a/src/app/routes/partner/article-management/components/list/list.component.html b/src/app/routes/partner/article-management/components/list/list.component.html new file mode 100644 index 00000000..721c85c0 --- /dev/null +++ b/src/app/routes/partner/article-management/components/list/list.component.html @@ -0,0 +1,49 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + + + diff --git a/src/app/routes/partner/article-management/components/list/list.component.ts b/src/app/routes/partner/article-management/components/list/list.component.ts new file mode 100644 index 00000000..89835f98 --- /dev/null +++ b/src/app/routes/partner/article-management/components/list/list.component.ts @@ -0,0 +1,200 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ChannelSalesService } from '../../services/channel-sales.service'; +import { ParterArticleManagementEditComponent } from '../edit/edit.component'; + +@Component({ + selector: 'app-parter-article-management-list', + templateUrl: './list.component.html' +}) +export class ParterArticleManagementListComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + _$expand = false; + + data=[{name1:1111}] + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: ChannelSalesService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { ...this.sf?.value }; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } + + search() { + // this.st1?.load(1); + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + type: 'string', + title: '文章标题' + }, + phone: { + type: 'string', + title: '分类' + }, + phone1: { + type: 'string', + title: '状态' + }, + phone2: { + type: 'string', + title: '推荐到首页', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + + } + }; + this.ui = { + '*': { + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '销售渠道姓名', + index: 'name1' + }, + { + title: '手机号', + index: 'name1' + }, + { + title: '所属组织', + index: 'name1' + }, + { + title: '职级', + index: 'name1' + }, + { + title: '等级', + index: 'name1' + }, + { + title: '省市', + index: 'name1' + }, + { + title: '邀请码', + index: 'name1' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '修改', + click: (_record, _modal, _instance) => this.edit(_record), + }, + { + text: '禁用', + click: (_record, _modal, _instance) => this.stop(_record), + }, + { + text: '启用', + click: (_record, _modal, _instance) => this.start(_record.id), + }, + { + text: '推荐到首页', + click: (_record, _modal, _instance) => this.recommend(_record.id), + } + ] + } + ]; + } + // 新增 + add() { + this.router.navigate(['/partner/knowledge/article-management-add'], { queryParams: {} }); + } + + // 编辑 + edit(record: STData) { + this.router.navigate(['/partner/knowledge/article-management-edit'], { queryParams: {} }); + } + + + stop(record: STData) { + this.modalService.confirm({ + nzTitle: '禁用确认', + nzContent: `确定禁用此文章吗?
    `, + // nzOnOk: () => + // this.service.request('', '').subscribe(res => { + // if (res) { + // this.service.msgSrv.success('冻结成功!'); + // this.st.reload(); + // } + // }) + }); + } + start(record: STData) { + this.modalService.confirm({ + nzTitle: '启用确认', + nzContent: `确定启用此文章吗?
    `, + // nzOnOk: () => + // this.service.request('', '').subscribe(res => { + // if (res) { + // this.service.msgSrv.success('冻结成功!'); + // this.st.reload(); + // } + // }) + }); + } + recommend(record: STData) { + + } + +} diff --git a/src/app/routes/partner/article-management/services/channel-sales.service.ts b/src/app/routes/partner/article-management/services/channel-sales.service.ts new file mode 100644 index 00000000..6e7cb18c --- /dev/null +++ b/src/app/routes/partner/article-management/services/channel-sales.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class ChannelSalesService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/business-statistics/components/index/index.component.html b/src/app/routes/partner/business-statistics/components/index/index.component.html new file mode 100644 index 00000000..5074b929 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/index/index.component.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/app/routes/partner/business-statistics/components/index/index.component.ts b/src/app/routes/partner/business-statistics/components/index/index.component.ts new file mode 100644 index 00000000..a39d1fa2 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/index/index.component.ts @@ -0,0 +1,37 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-partner-business-statistics-index', + templateUrl: './index.component.html', +}) +export class PartnerBusinessStatisticsIndexComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = []; + selectedIndex = 0; + tabs = [ + { + name: '合伙人统计', + value: '0' + }, + { + name: '渠道销售统计', + value: '1' + } + ] + + constructor() { } + + + ngOnInit(): void { } + + + + add(): void { + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.html b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.html new file mode 100644 index 00000000..b6cc6783 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.html @@ -0,0 +1,44 @@ + + + + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.less b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.less new file mode 100644 index 00000000..06c7da1f --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.less @@ -0,0 +1,11 @@ +:host { + .user-logo { + width: 90px; + } + + .letf-box { + display: inline-block; + width: 250px; + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.spec.ts b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.spec.ts new file mode 100644 index 00000000..4fddfb5d --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerPartnerCustomDetailComponent } from './partner-custom-detail.component'; + +describe('PartnerPartnerCustomDetailComponent', () => { + let component: PartnerPartnerCustomDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerPartnerCustomDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerPartnerCustomDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.ts b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.ts new file mode 100644 index 00000000..f273d209 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-detail/partner-custom-detail.component.ts @@ -0,0 +1,163 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { BussinessStatisticsService } from '../../services/bussiness-statistics.service'; + +@Component({ + selector: 'app-partner-partner-custom-detail', + templateUrl: './partner-custom-detail.component.html', + styleUrls: ['./partner-custom-detail.component.less'] +}) +export class PartnerPartnerCustomDetailComponent implements OnInit { + schema: SFSchema = {}; + ui!: SFUISchema; + detailInfo: any = { + logo: './assets/images/user/logo.svg', + company: '张三', + code: '91440300357887492H', + proxy: '企业合伙人', + belongCity: '深圳、上海、北京', + createTime: '2021-09-23 14:43:31' + } + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = [ + { title: '编号', index: 'no' }, + { title: '调用次数', type: 'number', index: 'callNo' }, + { title: '头像', type: 'img', width: '50px', index: 'avatar' }, + { title: '时间', type: 'date', index: 'updatedAt' }, + { + title: '', + buttons: [ + // { text: '查看', click: (item: any) => `/form/${item.id}` }, + // { text: '编辑', type: 'static', component: FormEditComponent, click: 'reload' }, + ] + } + ]; + _$expand = false; + + constructor(public service: BussinessStatisticsService, public router: Router) { + + } + + get reqParams() { + return { ...this.sf?.value }; + } + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + + resetSF() { + this._$expand = false; + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + /** +* 伸缩查询条件 +*/ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + search() { + this.st.load(1); + } + export() { + + } + + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '客户名称', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '客户状态', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + } + } + this.ui = { + '*': { spanLabelFixed: 100, grid: { span: 11, gutter: 4 } }, + }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '客户名称', index: 'carNo', className: 'text-center', width: 150 }, + { title: '客户状态', render: 'carModelLabel', className: 'text-center', width: 120 }, + { title: '结算时间段', index: 'carNo', className: 'text-center', width: 200 }, + { title: '本月交易数', render: 'approvalStatus0', className: 'text-center', sort: true, width: 150 }, + { title: '客户总数', render: 'approvalStatus', className: 'text-center', sort: true, width: 150 }, + { title: '累计交易数', render: 'approvalStatus1', className: 'text-center', sort: true, width: 120 }, + { title: '本月已结算订单', render: 'approvalStatus2', className: 'text-center', sort: true, width: 180 }, + { title: '累计已结算订单', render: 'approvalStatus3', className: 'text-center', sort: true, width: 180 }, + { title: '本月交易金额(元)', index: 'approvalStatus5', className: 'text-right', sort: true, type: 'currency', width: 180 }, + { title: '累计交易金额(元)', index: 'approvalStatus6', className: 'text-right', sort: true, type: 'currency', width: 180 }, + { title: '本月已结算金额(元)', index: 'approvalStatus7', className: 'text-right', sort: true, type: 'currency', width: 200 }, + { title: '累计已结算金额(元)', index: 'approvalStatus8', className: 'text-right', sort: true, type: 'currency', width: 200 }, + { title: '本月已开票金额(元)', index: 'approvalStatus9', className: 'text-right', sort: true, type: 'currency', width: 200 }, + { title: '累计已开票金额(元)', index: 'approvalStatus10', className: 'text-right', sort: true, type: 'currency', width: 200 }, + { title: '本月申请开票金额(元)', index: 'approvalStatus11', className: 'text-right', sort: true, type: 'currency', width: 200 }, + { + title: '操作', + width: 150, + buttons: [ + { + text: '查看订单明细', + click: (_record) => this.viewOrderDetail(_record) + } + ] + }, + ]; + } + + /** + * 查看订单明细 + * @param record 当前对象 + */ + viewOrderDetail(record: any) { + this.router.navigate([`/partner/business-statistics/partner/custom-order-detail/${record?.id}`]) + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.html b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.html new file mode 100644 index 00000000..227ab356 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.html @@ -0,0 +1,44 @@ + + + + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.less b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.less new file mode 100644 index 00000000..06c7da1f --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.less @@ -0,0 +1,11 @@ +:host { + .user-logo { + width: 90px; + } + + .letf-box { + display: inline-block; + width: 250px; + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.spec.ts b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.spec.ts new file mode 100644 index 00000000..dc51f832 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerPartnerCustomOrderDetailComponent } from './partner-custom-order-detail.component'; + +describe('PartnerPartnerCustomOrderDetailComponent', () => { + let component: PartnerPartnerCustomOrderDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerPartnerCustomOrderDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerPartnerCustomOrderDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.ts b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.ts new file mode 100644 index 00000000..71a30096 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component.ts @@ -0,0 +1,162 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { BussinessStatisticsService } from '../../services/bussiness-statistics.service'; + +@Component({ + selector: 'app-partner-partner-custom-order-detail', + templateUrl: './partner-custom-order-detail.component.html', + styleUrls: ['./partner-custom-order-detail.component.less'] +}) +export class PartnerPartnerCustomOrderDetailComponent implements OnInit { + schema: SFSchema = {}; + ui!: SFUISchema; + detailInfo: any = { + logo: './assets/images/user/logo.svg', + company: '张三', + code: '91440300357887492H', + proxy: '企业合伙人', + belongCity: '深圳、上海、北京', + createTime: '2021-09-23 14:43:31' + } + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + _$expand = false; + + constructor(public service: BussinessStatisticsService) { + + } + + get reqParams() { + return { ...this.sf?.value }; + } + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + + resetSF() { + this._$expand = false; + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + /** +* 伸缩查询条件 +*/ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + search() { + this.st.load(1); + } + export() { + + } + + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '订单号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '订单状态', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + abnormalCause2: { + title: '开票状态', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + } + } + this.ui = { + '*': { spanLabelFixed: 100, grid: { span: 7, gutter: 4 } }, + }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '订单号', index: 'carNo', className: 'text-center', width: 150 }, + { title: '订单状态', render: 'carModelLabel', className: 'text-center', width: 120 }, + { title: '订单金额(元)', index: 'carNo', className: 'text-center', width: 200 }, + { title: '实际付款金额(元)', render: 'approvalStatus0', className: 'text-center', sort: true, width: 150 }, + { title: '客户附加费率', render: 'approvalStatus', className: 'text-center', sort: true, width: 150 }, + { title: '预估收益(元)', render: 'approvalStatus1', className: 'text-center', sort: true, width: 120 }, + { title: '开票状态', render: 'approvalStatus2', className: 'text-center', sort: true, width: 180 }, + { title: '开票金额(元)', render: 'approvalStatus3', className: 'text-center', sort: true, width: 180 }, + { title: '下单时间', index: 'approvalStatus5', className: 'text-right', sort: true, type: 'currency', width: 180 }, + { + title: '操作', + width: 150, + buttons: [ + { + text: '查看订单详情', + click: (_record) => this.viewOrderDetail(_record) + } + ] + }, + ]; + } + + viewOrderDetail(record: any) { + + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.html b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.html new file mode 100644 index 00000000..fa14c129 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.html @@ -0,0 +1,49 @@ + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + diff --git a/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.less b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.less new file mode 100644 index 00000000..06c7da1f --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.less @@ -0,0 +1,11 @@ +:host { + .user-logo { + width: 90px; + } + + .letf-box { + display: inline-block; + width: 250px; + } + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.spec.ts b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.spec.ts new file mode 100644 index 00000000..a77b84eb --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerPartnerOrderDetailComponent } from './partner-order-detail.component'; + +describe('PartnerPartnerOrderDetailComponent', () => { + let component: PartnerPartnerOrderDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerPartnerOrderDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerPartnerOrderDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.ts b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.ts new file mode 100644 index 00000000..50c33e77 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-order-detail/partner-order-detail.component.ts @@ -0,0 +1,173 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { BussinessStatisticsService } from '../../services/bussiness-statistics.service'; + +@Component({ + selector: 'app-partner-partner-order-detail', + templateUrl: './partner-order-detail.component.html', + styleUrls: ['./partner-order-detail.component.less'] +}) +export class PartnerPartnerOrderDetailComponent implements OnInit { + schema: SFSchema = {}; + ui!: SFUISchema; + detailInfo: any = { + logo: './assets/images/user/logo.svg', + company: '张三', + code: '91440300357887492H', + proxy: '企业合伙人', + belongCity: '深圳、上海、北京', + createTime: '2021-09-23 14:43:31' + } + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + _$expand = false; + isLoading: boolean = false; + + constructor(public service: BussinessStatisticsService) { + + } + + get reqParams() { + return { ...this.sf?.value }; + } + + ngOnInit(): void { + this.initST(); + this.initSF(); + } + + resetSF() { + this._$expand = false; + this.sf.reset(); + this.isLoading = true + } + /** +* 伸缩查询条件 +*/ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + search() { + this.st.load(1); + } + export() { + + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + abnormalCause: { + title: '订单号', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '订单状态', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + abnormalCause2: { + title: '开票状态', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + abnormalCause3: { + title: '客户名称', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + }, + }, + } + } + this.ui = { + '*': { spanLabelFixed: 100, grid: { span: 8, gutter: 4 } }, + }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '订单号', index: 'carNo', className: 'text-center', width: 150 }, + { title: '订单状态', render: 'carModelLabel', className: 'text-center', width: 120 }, + { title: '订单金额(元)', index: 'carNo', className: 'text-center', width: 200 }, + { title: '实际付款金额(元)', render: 'approvalStatus0', className: 'text-center', sort: true, width: 150 }, + { title: '客户附加费率', render: 'approvalStatus', className: 'text-center', sort: true, width: 150 }, + { title: '预估收益(元)', render: 'approvalStatus1', className: 'text-center', sort: true, width: 120 }, + { title: '开票状态', render: 'approvalStatus2', className: 'text-center', sort: true, width: 180 }, + { title: '开票金额(元)', render: 'approvalStatus3', className: 'text-center', sort: true, width: 180 }, + { title: '下单时间', index: 'approvalStatus5', className: 'text-right', sort: true, type: 'currency', width: 180 }, + { + title: '操作', + width: 150, + buttons: [ + { + text: '查看订单详情', + click: (_record) => this.viewOrderDetail(_record) + } + ] + }, + ]; + } + + viewOrderDetail(record: any) { + + } + goBack() { + window.history.go(-1); + } + + +} diff --git a/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.html b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.html new file mode 100644 index 00000000..e832275b --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + {{item.yskmoney}} + + +
    {{item.approvalStatus1 | currency:' '}}
    +
    + + {{item.yskmoney | currency:' + '}} + + + +
    {{item.yskmoney | currency:' '}}
    +
    + +
    {{item.armoney | currency:' '}}
    +
    +
    +
    diff --git a/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.spec.ts b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.spec.ts new file mode 100644 index 00000000..5396aaf2 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerPartnerStatisticsComponent } from './partner-statistics.component'; + +describe('PartnerPartnerStatisticsComponent', () => { + let component: PartnerPartnerStatisticsComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerPartnerStatisticsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerPartnerStatisticsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.ts b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.ts new file mode 100644 index 00000000..43cc7831 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/partner-statistics/partner-statistics.component.ts @@ -0,0 +1,98 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { BussinessStatisticsService } from '../../services/bussiness-statistics.service'; + +@Component({ + selector: 'app-partner-partner-statistics', + templateUrl: './partner-statistics.component.html', +}) +export class PartnerPartnerStatisticsComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + ui!: SFUISchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + isLoading: boolean = false; + + constructor(public service: BussinessStatisticsService) { } + /** + * 查询参数 + */ + get reqParams() { + const params = { ...this.sf?.value }; + return params + } + + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '合伙人名称', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '类型', + type: 'string', + default: '', + enum: [ + { + label: '全部', + value: '' + }, + { + label: '个人', + value: '1' + }, + { + label: '企业', + value: '2' + } + ], + ui: { + widget: 'select' + }, + }, + } + } + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 } } }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '合伙人名称', index: 'carNo', className: 'text-center', width: 150 }, + { title: '类型', render: 'carModelLabel', className: 'text-center', width: 150 }, + { title: '注册时间', index: 'carNo', className: 'text-center', width: 150 }, + { title: '本月新增客户', render: 'approvalStatus0', className: 'text-center', sort: true, width: 150 }, + { title: '客户总数', render: 'approvalStatus', className: 'text-center', sort: true, width: 150 }, + { title: '本月已结算金额(元)', render: 'approvalStatus1', className: 'text-right', sort: true, width: 180 }, + { title: '累计已结算金额(元)', render: 'approvalStatus2', className: 'text-right', sort: true, width: 180 }, + { title: '本月预估收益(元)', render: 'approvalStatus3', className: 'text-right', sort: true, width: 180 }, + { title: '累计收益(元)', render: 'approvalStatus4', className: 'text-right', sort: true, width: 180 }, + ]; + } + + resetSF() { + this.sf.reset(); + this.isLoading = true + } + + export() { + + } + + + +} diff --git a/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.html b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.html new file mode 100644 index 00000000..b376f70a --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.spec.ts b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.spec.ts new file mode 100644 index 00000000..d88e4632 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerSaleCustomDetailComponent } from './sale-custom-detail.component'; + +describe('PartnerSaleCustomDetailComponent', () => { + let component: PartnerSaleCustomDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerSaleCustomDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerSaleCustomDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.ts b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.ts new file mode 100644 index 00000000..c3a63716 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-custom-detail/sale-custom-detail.component.ts @@ -0,0 +1,53 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-partner-sale-custom-detail', + templateUrl: './sale-custom-detail.component.html', +}) +export class PartnerSaleCustomDetailComponent implements OnInit { + url = `/user`; + searchSchema: SFSchema = { + properties: { + no: { + type: 'string', + title: '编号' + } + } + }; + detailInfo: any = { + logo: './assets/images/user/logo.svg', + name: '张三', + phone: '1399999999', + proxy: '城市代理', + level: '二级', + createTime: '添加时间' + } + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = [ + { title: '编号', index: 'no' }, + { title: '调用次数', type: 'number', index: 'callNo' }, + { title: '头像', type: 'img', width: '50px', index: 'avatar' }, + { title: '时间', type: 'date', index: 'updatedAt' }, + { + title: '', + buttons: [ + // { text: '查看', click: (item: any) => `/form/${item.id}` }, + // { text: '编辑', type: 'static', component: FormEditComponent, click: 'reload' }, + ] + } + ]; + + constructor(private http: _HttpClient, private modal: ModalHelper) { } + + ngOnInit(): void { } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + +} diff --git a/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.html b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.html new file mode 100644 index 00000000..482ccb06 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.spec.ts b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.spec.ts new file mode 100644 index 00000000..673661d9 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerSalePartnerDetailComponent } from './sale-partner-detail.component'; + +describe('PartnerSalePartnerDetailComponent', () => { + let component: PartnerSalePartnerDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerSalePartnerDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerSalePartnerDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.ts b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.ts new file mode 100644 index 00000000..229daf8d --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-partner-detail/sale-partner-detail.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-partner-sale-partner-detail', + templateUrl: './sale-partner-detail.component.html', +}) +export class PartnerSalePartnerDetailComponent implements OnInit { + url = `/user`; + searchSchema: SFSchema = { + properties: { + no: { + type: 'string', + title: '编号' + } + } + }; + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = [ + { title: '编号', index: 'no' }, + { title: '调用次数', type: 'number', index: 'callNo' }, + { title: '头像', type: 'img', width: '50px', index: 'avatar' }, + { title: '时间', type: 'date', index: 'updatedAt' }, + { + title: '', + buttons: [ + // { text: '查看', click: (item: any) => `/form/${item.id}` }, + // { text: '编辑', type: 'static', component: FormEditComponent, click: 'reload' }, + ] + } + ]; + + constructor(private http: _HttpClient, private modal: ModalHelper) { } + + ngOnInit(): void { } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + +} diff --git a/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.html b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.html new file mode 100644 index 00000000..3a68680d --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + {{item.yskmoney | currency:' ':false:'1.0-2'}} + + +
    {{item.approvalStatus1 | currency:' '}}
    +
    + +
    {{item.approvalStatus1 | currency:' '}}
    +
    + + +
    {{item.yskmoney | currency:' '}}
    +
    +
    +
    diff --git a/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.spec.ts b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.spec.ts new file mode 100644 index 00000000..bfa13cd2 --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerSaleStatisticsComponent } from './sale-statistics.component'; + +describe('PartnerSaleStatisticsComponent', () => { + let component: PartnerSaleStatisticsComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerSaleStatisticsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerSaleStatisticsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.ts b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.ts new file mode 100644 index 00000000..5e3524ef --- /dev/null +++ b/src/app/routes/partner/business-statistics/components/sale-statistics/sale-statistics.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { BussinessStatisticsService } from '../../services/bussiness-statistics.service'; + +@Component({ + selector: 'app-partner-sale-statistics', + templateUrl: './sale-statistics.component.html', +}) +export class PartnerSaleStatisticsComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + ui!: SFUISchema; + isLoading: boolean = false; + + constructor(public service: BussinessStatisticsService) { } + + /** + * 查询参数 + */ + get reqParams() { + const params = { ...this.sf?.value }; + return params + } + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '渠道销售姓名', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '手机号', + type: 'string', + ui: { + placeholder: '请输入' + }, + }, + } + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 8 } } }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '联系人', index: 'carNo', className: 'text-center' }, + { title: '手机号', render: 'carModelLabel', className: 'text-center' }, + { title: '添加时间', index: 'carNo', className: 'text-center' }, + { title: '本月新增客户', render: 'approvalStatus', className: 'text-center', sort: true }, + { title: '客户总数', render: 'approvalStatus', className: 'text-center', sort: true }, + { title: '本月新增合伙人', render: 'approvalStatus1', className: 'text-center', sort: true }, + { title: '合伙人总数', render: 'approvalStatus1', className: 'text-center', sort: true }, + { title: '本月已结算金额(元)', render: 'approvalStatus2', className: 'text-right', sort: true }, + { title: '累计已结算金额(元)', render: 'approvalStatus3', className: 'text-right', sort: true }, + ]; + } + export() { + + } + resetSF() { + this.sf.reset(); + this.isLoading = true + } +} diff --git a/src/app/routes/partner/business-statistics/services/bussiness-statistics.service.ts b/src/app/routes/partner/business-statistics/services/bussiness-statistics.service.ts new file mode 100644 index 00000000..894da58b --- /dev/null +++ b/src/app/routes/partner/business-statistics/services/bussiness-statistics.service.ts @@ -0,0 +1,13 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class BussinessStatisticsService extends BaseService { + + $api_get_partner_statistics_page = `/api/fcc/ficoBrmH/list/page`; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/channel-sales/components/edit/edit.component.html b/src/app/routes/partner/channel-sales/components/edit/edit.component.html new file mode 100644 index 00000000..7386c7af --- /dev/null +++ b/src/app/routes/partner/channel-sales/components/edit/edit.component.html @@ -0,0 +1,7 @@ + + + +
    + + +
    diff --git a/src/app/routes/partner/channel-sales/components/edit/edit.component.ts b/src/app/routes/partner/channel-sales/components/edit/edit.component.ts new file mode 100644 index 00000000..6b143413 --- /dev/null +++ b/src/app/routes/partner/channel-sales/components/edit/edit.component.ts @@ -0,0 +1,156 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFAutoCompleteWidgetSchema, SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ChannelSalesService } from '../../services/channel-sales.service'; + +@Component({ + selector: 'app-parter-channel-sales-edit', + templateUrl: './edit.component.html' +}) +export class ParterChannelSalesEditComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + record:any; + currentOAItem:any; + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ChannelSalesService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + + this.service.request(this.service.$api_getChannelSalesInfo, {id:this.i?.id}).subscribe(res => { + if(res){ + this.record = res; + } + this.initSF(); + }); + + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name: { + title: '渠道销售姓名', + type: 'string', + maxLength: 12, + ui: { + placeholder:'请输入' + } + }, + phoneNumber: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder:'请输入' + } + }, + employeeVO: { + title: '关联OA员工', + type: 'string', + ui: { + widget: 'autocomplete', + placeholder:'请选择', + asyncData: (input:string) => this.service.request(this.service.$api_fuzzyQuery,{name:input}).pipe( + map((res: any) => { + return res.map((item:any)=>{ + return {label: item.empName+"/"+item.empNo, value: item.empNo, obj: item} + }) + }) + ), + change:(item:any, org:any)=>{ + this.currentOAItem = org.obj; + } + } as SFAutoCompleteWidgetSchema, + }, + isAuthorization: { + type: 'string', + title: '授权登录运营后台', + enum: [ + { label: '否', value: '0' }, + { label: '是', value: '1' } + ], + ui: { + widget: 'radio', + } as SFRadioWidgetSchema, + default: '0', + }, + roleIds: { + title: '', + type: 'string', + ui: { + widget: 'select', + placeholder: '授权角色', + mode: 'multiple', + maxMultipleCount: 5, + asyncData: () => { + return this.service.request(this.service.$api_getAppRoleList).pipe( + map((res: any) => { + return res + .filter((role: any) => role.roleCode !== 'Administrator') + .map((item: any) => { + return { label: item.roleName, value: item.id }; + }); + }) + ); + }, + visibleIf: { isAuthorization: (value: string) => value === '1' } + }, + }, + remark: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请输入50字符' + } as SFTextareaWidgetSchema, + }, + }, + required: ['name', 'phoneNumber', 'employeeVO', 'roleIds', 'remark'] + }; + this.ui = { + '*': { + spanLabelFixed: 150, + grid: { span: 24 } + }, + $isAuthorization:{ grid: { span: 12 }}, + $roleIds:{ spanLabelFixed: 10, grid: { span: 12 }}, + + + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + this.service.request(this.service.$api_save, { ...this.sf.value, employeeVO: this.currentOAItem}).subscribe(res => { + if (res) { + this.modalRef.destroy(true); + } else { + this.service.msgSrv.error(res.msg); + } + }); + } +} diff --git a/src/app/routes/partner/channel-sales/components/list/list.component.html b/src/app/routes/partner/channel-sales/components/list/list.component.html new file mode 100644 index 00000000..589c32e9 --- /dev/null +++ b/src/app/routes/partner/channel-sales/components/list/list.component.html @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/src/app/routes/partner/channel-sales/components/list/list.component.ts b/src/app/routes/partner/channel-sales/components/list/list.component.ts new file mode 100644 index 00000000..ba7097ec --- /dev/null +++ b/src/app/routes/partner/channel-sales/components/list/list.component.ts @@ -0,0 +1,163 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ChannelSalesService } from '../../services/channel-sales.service'; +import { ParterChannelSalesEditComponent } from '../edit/edit.component'; + +@Component({ + selector: 'app-parter-channel-sales-list', + templateUrl: './list.component.html' +}) +export class ParterChannelSalesListComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + + data=[{name1:1111}] + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: ChannelSalesService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { ...this.sf?.value }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + name: { + type: 'string', + title: '销售渠道姓名' + }, + telephone: { + type: 'string', + title: '手机号' + }, + } + }; + this.ui = { + '*': { + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '销售渠道姓名', + index: 'name' + }, + { + title: '手机号', + index: 'telephone' + }, + { + title: '所属组织', + index: 'organLable' + }, + { + title: '职级', + index: 'station' + }, + { + title: '等级', + index: 'postLevel' + }, + { + title: '省市', + index: 'residencePlace' + }, + { + title: '邀请码', + index: 'inviteCode' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: (_record, _modal, _instance) => this.edit(_record), + }, + { + text: '冻结', + click: (_record, _modal, _instance) => this.stop(_record.id), + } + ] + } + ]; + } + + add() { + const modalRef = this.modalService.create({ + nzWidth:600, + nzTitle: '新增', + nzContent: ParterChannelSalesEditComponent, + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.reload(); + } + }); + } + + // 编辑 + edit(record: STData) { + const modalRef = this.modalService.create({ + nzWidth:600, + nzTitle: '编辑', + nzContent: ParterChannelSalesEditComponent, + nzComponentParams: { i: record } + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.reload(); + } + }); + } + + + + stop(id: any) { + this.modalService.confirm({ + nzTitle: '冻结确认', + nzContent: `确定冻结该账号吗?
    `, + // nzOnOk: () => + // this.service.request('', '').subscribe(res => { + // if (res) { + // this.service.msgSrv.success('冻结成功!'); + // this.st.reload(); + // } + // }) + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } + + +} diff --git a/src/app/routes/partner/channel-sales/services/channel-sales.service.ts b/src/app/routes/partner/channel-sales/services/channel-sales.service.ts new file mode 100644 index 00000000..9382c6a9 --- /dev/null +++ b/src/app/routes/partner/channel-sales/services/channel-sales.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class ChannelSalesService extends BaseService { + + // 保存渠道销售管理 + $api_save = '/api/mdc/channelSalesManagement/save'; + + // 查询渠道销售管理表 + $api_getPage = '/api/mdc/channelSalesManagement/list/page'; + // OA员工模糊查询 + $api_fuzzyQuery = '/api/mdc/channelSalesManagement/fuzzyQuery'; + // 获取角色列表 + $api_getAppRoleList = '/api/mdc/cuc/roleInfo/getRoleList'; + // 获取渠道销售管理详情 + $api_listChannelSalesManagement = '/api/mdc/channelSalesManagement/list/listChannelSalesManagement'; + // 根据渠道销售id获取渠道信息 + $api_getChannelSalesInfo = '/api/mdc/channelSalesManagement/getChannelSalesInfo'; + + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.html b/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.html new file mode 100644 index 00000000..dc134ee2 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.html @@ -0,0 +1,9 @@ + + +
    + 结算起算日:指给合伙人结算佣金的起算时间,更换合伙人,该日期是当前合伙人的结算起算日,原合伙人的结算结束时间则为此日期的前一天 +
    +
    + + +
    diff --git a/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.ts b/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.ts new file mode 100644 index 00000000..8856e337 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-approve/channel-approve.component.ts @@ -0,0 +1,98 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ClaimAuditService } from '../../services/claim-audit.service'; + + +@Component({ + selector: 'app-parter-claim-audit-channel-approve', + templateUrl: './channel-approve.component.html' +}) +export class ParterClaimAuditListChannelApproveComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ClaimAuditService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name1: { + title: '合伙人(认领人)', + type: 'string', + ui: { + widget: 'text', + } , + }, + name2: { + title: '认领客户名称', + type: 'string', + ui: { + widget: 'text', + } , + }, + data: { + title: '结算起算日期', + type: 'string', + format: 'date', + }, + name3: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请不要超过50个字' + } as SFTextareaWidgetSchema, + }, + }, + required: ['name3'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + }, + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + // this.service.request('', { ...this.sf.value }).subscribe(res => { + // if (res) { + // this.modalRef.destroy(true); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } + + +} diff --git a/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.html b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.html new file mode 100644 index 00000000..08f52a77 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.html @@ -0,0 +1,62 @@ + + + + + + +
    +
    + +
    +
    +
    深圳市XXXXXXX有限公司
    +
    91440300357887492H
    + + + + + + +
    +
    +
    待审核
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + 现渠道销售(提交人) + + + + + + +
    +
    + +
    +
    + + 原渠道销售 + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.less b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.less new file mode 100644 index 00000000..7d4ae911 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.less @@ -0,0 +1,27 @@ +:host { + .head-box { + img { + width: 80px; + height: 80px; + padding: 8px; + } + .right-h{ + font-size: 16px; + } + .right-s{ + color: #7f7f7f; + } + + .left-rt { + font-weight: bold; + font-size: 16px; + text-align: right; + } + + .left-rb { + display: flex; + justify-content: flex-end; + padding-top: 16px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.ts b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.ts new file mode 100644 index 00000000..c3eca870 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-detail/channel-detail.component.ts @@ -0,0 +1,82 @@ + +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import format from 'date-fns/format'; + +import { ClaimAuditService } from '../../services/claim-audit.service'; +import { ParterClaimAuditListChannelApproveComponent } from '../channel-approve/channel-approve.component'; +import { ParterClaimAuditListChannelRejectComponent } from '../channel-reject/channel-reject.component'; + +@Component({ + selector: 'app-parter-claim-audit-channel-detail', + templateUrl: './channel-detail.component.html', + styleUrls: ['./channel-detail.component.less'] +}) +export class ParterClaimAuditListChannelDetailComponent implements OnInit { + id = this.route.snapshot.queryParams.id; + i: any; + imges: any; + isVisible = false; + columns: STColumn[] = [ + { title: '操作时间', index: 'id', width: 120 }, + { title: '操作人', type: 'img', width: 120, }, + { title: '操作人手机号', index: 'email', width: 120 }, + { title: '操作页面', index: 'phone' }, + { title: '操作内容', index: 'registered' } + ]; + + data=[{id:11111}] + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private service: ClaimAuditService, + private modalService: NzModalService, + private router: Router + ) {} + + ngOnInit(): void { + this.initData(); + } + + initData() { + // this.service.request(this.service.$api_getBulkBillDetail, { id: this.id }).subscribe(res => { + // if (res) { + // this.i = res; + // + // } + // }); + } + + approve() { + const modalRef = this.modalService.create({ + nzTitle: '同意', + nzWidth: 700, + nzContent: ParterClaimAuditListChannelApproveComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + reject() { + const modalRef = this.modalService.create({ + nzTitle: '拒绝', + nzWidth: 700, + nzContent: ParterClaimAuditListChannelRejectComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.html b/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.html new file mode 100644 index 00000000..dc134ee2 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.html @@ -0,0 +1,9 @@ + + +
    + 结算起算日:指给合伙人结算佣金的起算时间,更换合伙人,该日期是当前合伙人的结算起算日,原合伙人的结算结束时间则为此日期的前一天 +
    +
    + + +
    diff --git a/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.ts b/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.ts new file mode 100644 index 00000000..27566f45 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/channel-reject/channel-reject.component.ts @@ -0,0 +1,98 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ClaimAuditService } from '../../services/claim-audit.service'; + + +@Component({ + selector: 'app-parter-claim-audit-channel-reject', + templateUrl: './channel-reject.component.html' +}) +export class ParterClaimAuditListChannelRejectComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ClaimAuditService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name1: { + title: '合伙人(认领人)', + type: 'string', + ui: { + widget: 'text', + } , + }, + name2: { + title: '认领客户名称', + type: 'string', + ui: { + widget: 'text', + } , + }, + data: { + title: '结算起算日期', + type: 'string', + format: 'date', + }, + name3: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请不要超过50个字' + } as SFTextareaWidgetSchema, + }, + }, + required: ['name3'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + }, + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + // this.service.request('', { ...this.sf.value }).subscribe(res => { + // if (res) { + // this.modalRef.destroy(true); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } + + +} diff --git a/src/app/routes/partner/claim-audit/components/list/list.component.html b/src/app/routes/partner/claim-audit/components/list/list.component.html new file mode 100644 index 00000000..8e321e48 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/list/list.component.html @@ -0,0 +1,66 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + diff --git a/src/app/routes/partner/claim-audit/components/list/list.component.ts b/src/app/routes/partner/claim-audit/components/list/list.component.ts new file mode 100644 index 00000000..cf817568 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/list/list.component.ts @@ -0,0 +1,230 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ClaimAuditService } from '../../services/claim-audit.service'; + +@Component({ + selector: 'app-parter-claim-audit-list', + templateUrl: './list.component.html' +}) +export class ParterClaimAuditListComponent implements OnInit { + schema: SFSchema = {}; + columns1!: STColumn[]; + columns2!: STColumn[]; + @ViewChild('st1', { static: false }) + st1!: STComponent; + @ViewChild('st2', { static: false }) + st2!: STComponent; + ui!: SFUISchema; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + _$expand = false; + selectedIndex = 0; + + data=[{name1:1111}] + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: ClaimAuditService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { ...this.sf?.value }; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + ngOnInit() { + this.initSF(); + this.initST1(); + this.initST2(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + type: 'string', + title: '认领人' + }, + name1: { + type: 'string', + title: '客户名称' + }, + name2: { + type: 'string', + title: '平台审核状态' + }, + name3: { + type: 'string', + title: '渠道销售状态', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + name4: { + type: 'string', + title: 'CRM状态', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + } + }; + this.ui = { + '*': { + grid: { span: 8, gutter: 4 } + } + }; + } + + initST1() { + this.columns1 = [ + { + title: '提交人', + index: 'name1' + }, + { + title: '客户名称', + index: 'name1' + }, + { + title: '认领备注', + index: 'name1' + }, + { + title: '渠道销售审核状态', + index: 'name1' + }, + { + title: 'CRM状态', + index: 'name1' + }, + { + title: '平台审核状态', + index: 'name1' + }, + { + title: 'CRM状态', + index: 'name1' + }, + { + title: '提交时间', + index: 'name1' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '详情', + click: (_record, _modal, _instance) => this.partnerView(_record), + }, + { + text: '审核', + click: (_record, _modal, _instance) => this.partnerView(_record), + }, + ] + } + ]; + } + + initST2() { + this.columns2 = [ + { + title: '提交人', + index: 'name1' + }, + { + title: '客户名称', + index: 'name1' + }, + { + title: '认领备注', + index: 'name1' + }, + { + title: 'CRM状态', + index: 'name1' + }, + { + title: '平台审核状态', + index: 'name1' + }, + { + title: '提交时间', + index: 'name1' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '详情', + click: (_record, _modal, _instance) => this.channelView(_record), + }, + { + text: '审核', + click: (_record, _modal, _instance) => this.channelView(_record), + }, + + ] + } + ]; + } + + partnerView(record: STData) { + this.router.navigate(['/partner/claim-audit/partner-detail'], { queryParams: {} }); + } + + channelView(record: STData) { + this.router.navigate(['/partner/claim-audit/channel-detail'], { queryParams: {} }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + search() { + // this.st1?.load(1); + } + + tabChange(index:any){ + console.log(index) + switch (index) { + case 0: + this.initST1(); + break; + case 1: + this.initST2(); + break; + default: + break; + } + } + +} diff --git a/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.html b/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.html new file mode 100644 index 00000000..dc134ee2 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.html @@ -0,0 +1,9 @@ + + +
    + 结算起算日:指给合伙人结算佣金的起算时间,更换合伙人,该日期是当前合伙人的结算起算日,原合伙人的结算结束时间则为此日期的前一天 +
    +
    + + +
    diff --git a/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.ts b/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.ts new file mode 100644 index 00000000..86f5e72d --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-approve/partner-approve.component.ts @@ -0,0 +1,98 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ClaimAuditService } from '../../services/claim-audit.service'; + + +@Component({ + selector: 'app-parter-claim-audit-partner-approve', + templateUrl: './partner-approve.component.html' +}) +export class ParterClaimAuditListPartnerApproveComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ClaimAuditService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name1: { + title: '合伙人(认领人)', + type: 'string', + ui: { + widget: 'text', + } , + }, + name2: { + title: '认领客户名称', + type: 'string', + ui: { + widget: 'text', + } , + }, + data: { + title: '结算起算日期', + type: 'string', + format: 'date', + }, + name3: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请不要超过50个字' + } as SFTextareaWidgetSchema, + }, + }, + required: ['name3'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + }, + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + // this.service.request('', { ...this.sf.value }).subscribe(res => { + // if (res) { + // this.modalRef.destroy(true); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } + + +} diff --git a/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.html b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.html new file mode 100644 index 00000000..c6370656 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.html @@ -0,0 +1,79 @@ + + + + + + +
    +
    + +
    +
    +
    深圳市XXXXXXX有限公司
    +
    91440300357887492H
    + + + + + + +
    +
    +
    待审核
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + 现合伙人(提交人) + + + + + + + +
    +
    + + 现渠道销售 + + + + +
    +
    + +
    +
    + + 原合伙人 + + + + + +
    +
    + + 原渠道销售 + + + + +
    +
    +
    + + + + diff --git a/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.less b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.less new file mode 100644 index 00000000..403e7692 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.less @@ -0,0 +1,29 @@ +:host { + .head-box { + img { + width : 80px; + height : 80px; + padding: 8px; + } + + .right-h { + font-size: 16px; + } + + .right-s { + color: #7f7f7f; + } + + .left-rt { + font-weight: bold; + font-size : 16px; + text-align : right; + } + + .left-rb { + display : flex; + justify-content: flex-end; + padding-top : 16px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.ts b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.ts new file mode 100644 index 00000000..41f5558f --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-detail/partner-detail.component.ts @@ -0,0 +1,82 @@ + +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import format from 'date-fns/format'; +import { ClaimAuditService } from '../../services/claim-audit.service'; +import { ParterClaimAuditListPartnerRejectComponent } from '../partner-reject/partner-reject.component'; +import { ParterClaimAuditListPartnerApproveComponent } from '../partner-approve/partner-approve.component'; + +@Component({ + selector: 'app-parter-claim-audit-partner-detail', + templateUrl: './partner-detail.component.html', + styleUrls: ['./partner-detail.component.less'] +}) +export class ParterClaimAuditListPartnerDetailComponent implements OnInit { + id = this.route.snapshot.queryParams.id; + i: any; + imges: any; + isVisible = false; + columns: STColumn[] = [ + { title: '操作时间', index: 'id', width: 120 }, + { title: '操作人', type: 'img', width: 120, }, + { title: '操作人手机号', index: 'email', width: 120 }, + { title: '操作页面', index: 'phone' }, + { title: '操作内容', index: 'registered' } + ]; + + data=[{id:11111}] + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private service: ClaimAuditService, + private modalService: NzModalService, + private router: Router + ) {} + + ngOnInit(): void { + this.initData(); + } + + initData() { + // this.service.request(this.service.$api_getBulkBillDetail, { id: this.id }).subscribe(res => { + // if (res) { + // this.i = res; + // + // } + // }); + } + + approve() { + const modalRef = this.modalService.create({ + nzTitle: '同意', + nzWidth: 700, + nzContent: ParterClaimAuditListPartnerApproveComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + reject() { + const modalRef = this.modalService.create({ + nzTitle: '拒绝', + nzWidth: 700, + nzContent: ParterClaimAuditListPartnerRejectComponent, + nzComponentParams: { + i: this.i + }, + nzFooter: null + }); + } + goBack() { + window.history.go(-1); + } + + +} diff --git a/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.html b/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.html new file mode 100644 index 00000000..dc134ee2 --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.html @@ -0,0 +1,9 @@ + + +
    + 结算起算日:指给合伙人结算佣金的起算时间,更换合伙人,该日期是当前合伙人的结算起算日,原合伙人的结算结束时间则为此日期的前一天 +
    +
    + + +
    diff --git a/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.ts b/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.ts new file mode 100644 index 00000000..09abe28f --- /dev/null +++ b/src/app/routes/partner/claim-audit/components/partner-reject/partner-reject.component.ts @@ -0,0 +1,98 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ClaimAuditService } from '../../services/claim-audit.service'; + + +@Component({ + selector: 'app-parter-claim-audit-partner-reject', + templateUrl: './partner-reject.component.html' +}) +export class ParterClaimAuditListPartnerRejectComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ClaimAuditService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + name1: { + title: '合伙人(认领人)', + type: 'string', + ui: { + widget: 'text', + } , + }, + name2: { + title: '认领客户名称', + type: 'string', + ui: { + widget: 'text', + } , + }, + data: { + title: '结算起算日期', + type: 'string', + format: 'date', + }, + name3: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请不要超过50个字' + } as SFTextareaWidgetSchema, + }, + }, + required: ['name3'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + }, + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + // this.service.request('', { ...this.sf.value }).subscribe(res => { + // if (res) { + // this.modalRef.destroy(true); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } + + +} diff --git a/src/app/routes/partner/claim-audit/services/claim-audit.service.ts b/src/app/routes/partner/claim-audit/services/claim-audit.service.ts new file mode 100644 index 00000000..a102b596 --- /dev/null +++ b/src/app/routes/partner/claim-audit/services/claim-audit.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class ClaimAuditService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/knowledge/banner/components/add/add.component.html b/src/app/routes/partner/knowledge/banner/components/add/add.component.html new file mode 100644 index 00000000..6760c1a0 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/add/add.component.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/partner/knowledge/banner/components/add/add.component.spec.ts b/src/app/routes/partner/knowledge/banner/components/add/add.component.spec.ts new file mode 100644 index 00000000..64562645 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/add/add.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { BannerComponentsAddComponent } from './add.component'; + +describe('BannerComponentsAddComponent', () => { + let component: BannerComponentsAddComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BannerComponentsAddComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BannerComponentsAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/knowledge/banner/components/add/add.component.ts b/src/app/routes/partner/knowledge/banner/components/add/add.component.ts new file mode 100644 index 00000000..132e6bb2 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/add/add.component.ts @@ -0,0 +1,241 @@ +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import format from 'date-fns/format'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { BannerService } from '../../services/banner.service'; +import { apiConf } from '@conf/api.conf'; + +@Component({ + selector: 'app-ad-components-add', + templateUrl: './add.component.html', + styleUrls: ['./add.less'] +}) +export class BannerComponentsAddComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema: SFSchema = {}; + contentListData = []; + queryParams: any = {}; + oldTakeEffectTime = ''; + maxSort = 0; + isVisible = false; + validFalg = true; + detailData: any = { + advertisementContentDTOList: [] + }; + changeTimeFlag = false; + currentIndex = 0; + addFlag = true; + addId = 1; + inputPoint: any = { + lng: 0, + lat: 0 + }; + today = new Date(); + navData: any = []; + navigationName = ''; + ui: SFUISchema = { + '*': { + spanLabelFixed: 200, + grid: { span: 24 }, + }, + }; + constructor( + public msgSrv: NzMessageService, + public http: _HttpClient, + public service: BannerService, + private route: ActivatedRoute, + private router: Router, + private cdr: ChangeDetectorRef, + private envSrv: EAEnvironmentService, + ) { } + + + ngOnInit(): void { + this.queryParams = this.route.snapshot.queryParams; + if (this.queryParams.type !== 'add') { + this.initDetailData(); + } + this.initSF(); + } + initDetailData() { + + } + initSF() { + this.schema = { + properties: { + name: { + type: 'string', + title: 'banner名称', + maxLength: 10, + ui: { + showRequired: true, + placeholder: '请不要超过10个字', + } + }, + licensePhotoWatermark: { + type: 'string', + title: 'banner图', + ui: { + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸 700px * 286px)。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.enterpriseBaseDTO.licensePhoto = args.file.response.data.fullFilePath + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt4M = file.size / 1024 / 1024 < 2; + if (!isLt4M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt4M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url), + }, + }, + sortId: { + type: 'string', + title: '顺序', + ui: { + showRequired: true, + widget: '=', + placeholder: '请输入0~99,数字越大,排序越靠前', + serverSearch: true, + } as SFSelectWidgetSchema, + }, + linkType: { + type: 'string', + title: '跳转路径', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '文章ID', value: 1 }, + { label: '分类ID', value: 2 }, + { label: '自编辑', value: 3 }, + ], + }, + content: { + type: 'string', + title: '内容', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 450 + }, + visibleIf: { name5: (value: string) => value === '1' } + }, + }, + }, + required: [], + }; + if (this.queryParams.type === 'add'){ + setTimeout(() => { + this.sf.setValue('/takeEffectType', 1); + this.sf.setValue('/style', 1); + }, 500); + } + } + get reqParams() { + return {}; + } + disabledDate = (current: Date): boolean => { + // Can not select days before today and today + return differenceInCalendarDays(current, this.today) < 0; + } + changeTime(){ + this.changeTimeFlag = true; + } + + + checkSort(){ + const params: any = { + navigationId: this.sf?.value.navigationId, + sortId: this.sf?.value.sortId, + takeEffectType: this.sf?.value.takeEffectType, + }; + if (this.queryParams.id !== '0'){ + params.advertisementId = this.queryParams.id; + } + if (this.sf.value.takeEffectType === 2){ + if (this.changeTimeFlag) { + params.takeEffectTime = format(this.detailData.takeEffectTime, 'yyyy-MM-dd HH:mm'); + } else { + params.takeEffectTime = this.detailData.takeEffectTime; + } + } + + } + save() { + const params: any = { + ...this.sf?.value, + latitude: this.inputPoint.lat, + longitude: this.inputPoint.lng, + id: this.queryParams.id + }; + this.detailData.advertisementContentDTOList.forEach((item: any) => { + delete item.addId; + }); + if (this.queryParams.type === 'add') { + delete params.id; + } + if (this.sf.value.takeEffectType === 2){ + if (this.changeTimeFlag) { + params.takeEffectTime = format(this.detailData.takeEffectTime, 'yyyy-MM-dd HH:mm'); + } else { + params.takeEffectTime = this.detailData.takeEffectTime; + } + } else { + delete params.takeEffectTime; + } + this.service.request(this.service.$api_add_one, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.router.navigate(['../list'], {relativeTo: this.route}); + } + }); + } + + goBack() { + window.history.go(-1); + } + gotoMap() { + this.isVisible = true; + } + + handleOk(): void { + this.isVisible = false; + } + + handleCancel(): void { + this.isVisible = false; + } +} diff --git a/src/app/routes/partner/knowledge/banner/components/add/add.less b/src/app/routes/partner/knowledge/banner/components/add/add.less new file mode 100644 index 00000000..0a6adacb --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/add/add.less @@ -0,0 +1,119 @@ +:host { + .styleBox { + display: flex; + align-items: flex-end; + margin: 10px 0 0 0; + } + .imgBox { + position: relative; + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + .leftBox, + .rightBox { + position: absolute; + top: 50%; + transform: translate(0, -50%); + } + img { + width: 170px; + height: 40px; + } + .leftBox { + left: 3px; + } + .rightBox { + right: 3px; + } + } + .imgBox_two { + width: 200px; + padding: 6px; + text-align: center; + border: solid 1px #eee; + img { + width: 100%; + height: 40px; + } + } + .imgBox_three { + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + img { + width: 25%; + height: 40px; + margin: 0 6% 0 0; + &:first-child { + margin: 0 6%; + } + } + } + .imgBox_four { + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + img { + width: 22%; + height: 40px; + margin: 0 2% 0 0; + &:first-child { + margin: 0 2%; + } + } + } + .imgBox_one { + width: 60px; + padding: 6px; + text-align: center; + border: solid 1px #eee; + img { + width: 100%; + height: 40px; + } + } + .imgBox_info { + width: 200px; + padding: 6px; + overflow: hidden; + border: solid 1px #eee; + .title { + width: 100%; + line-height: 30px; + text-align: center; + } + .infoBox { + .name { + line-height: 28px; + } + .map { + width: 100%; + text-align: center; + img { + width: 90%; + } + } + } + } + .hint { + margin: 0 0 0 10px; + color: #f00; + } + .addBtn { + margin: 0 0 10px 0; + } + } + .overflowText { + display: -webkit-box; + max-width: 200px; + overflow: hidden; + text-align: left; + text-overflow: -o-ellipsis-lastline; + text-overflow: ellipsis; + -webkit-line-clamp: 1; + line-clamp: 1; + -webkit-box-orient: vertical; + } \ No newline at end of file diff --git a/src/app/routes/partner/knowledge/banner/components/list/list.component.html b/src/app/routes/partner/knowledge/banner/components/list/list.component.html new file mode 100644 index 00000000..d533734b --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/list/list.component.html @@ -0,0 +1,62 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + + +
    diff --git a/src/app/routes/partner/knowledge/banner/components/list/list.component.less b/src/app/routes/partner/knowledge/banner/components/list/list.component.less new file mode 100644 index 00000000..0aae2779 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/list/list.component.less @@ -0,0 +1 @@ +@import '~@delon/theme/index'; diff --git a/src/app/routes/partner/knowledge/banner/components/list/list.component.spec.ts b/src/app/routes/partner/knowledge/banner/components/list/list.component.spec.ts new file mode 100644 index 00000000..3bd8060c --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/list/list.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { BannerComponentsListComponent } from './list.component'; + +describe('BannerComponentsListComponent', () => { + let component: BannerComponentsListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BannerComponentsListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BannerComponentsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/knowledge/banner/components/list/list.component.ts b/src/app/routes/partner/knowledge/banner/components/list/list.component.ts new file mode 100644 index 00000000..aae33fa5 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/list/list.component.ts @@ -0,0 +1,239 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { BannerService } from '../../services/banner.service'; + +@Component({ + selector: 'app-banner-components-list', + templateUrl: './list.component.html', + styleUrls: ['./list.component.less'] +}) + +export class BannerComponentsListComponent implements OnInit { + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + appList: any[] = []; + _$expand = false; + selectApp = { + appName: '', + appId: '' + }; + isLoading: boolean = false; + + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + constructor(public service: BannerService, private modal: ModalHelper, private msg: NzMessageService, private router: Router, private modalSrv: NzModalService, private ar: ActivatedRoute) { } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + if (params.status === '') { + delete params.status; + } + if (params.style === '') { + delete params.style; + } + if (params.navigationId === '') { + delete params.navigationId; + } + return { ...params}; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + selectAppFun(item: any) { + this.selectApp = item; + this.st.load(1); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + _$expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + name: { + type: 'string', + title: 'banner名称', + maxLength: 10, + ui: { + widget: '', + placeholder: '请输入', + } + }, + status: { + type: 'string', + title: '状态', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + } as SFSelectWidgetSchema, + enum: [ + { label: '全部', value: 1 }, + { label: '正常', value: 2 }, + { label: '禁用', value: 3 } + ] + }, + }, + }; + this.ui = { + '*': { + spanLabelFixed: 110, + grid: { span: 8 }, + }, + }; + } + + initST() { + this.columns = [ + { + title: 'banner名称', // 位:px + index: 'name', + className: 'text-center' + }, + { + title: 'banner', + index: 'navigationName', + className: 'text-center' + }, + { + title: '排序', // 位 px + index: 'sortId', + className: 'text-center' + }, + { + title: '状态', // 位 px + index: 'style', + className: 'text-center', + type: 'enum', + enum: { + 1: '正常', + 2: '禁用', + } + }, + { + title: '最后修改时间', // 位 px + index: 'createTime', + className: 'text-center' + }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 280, + buttons: [ + { + text: '修改', + click: (item) => { + this.router.navigate(['../detail'], { queryParams: { id: item.id, type: 'edit' }, relativeTo: this.ar }); + } + }, + { + text: '禁用', + pop: { + title: `确定禁用此banner图吗??`, + okType: 'danger', + icon: 'alert', + }, + click: (item) => { + this.changeStatus(item.id); + }, + iif: (item) => item.status === 1 + }, + { + text: '启用', + pop: { + title: `确定启用此banner图吗?`, + okType: 'danger', + icon: 'success', + }, + click: (item) => { + this.changeStatus(item); + }, + iif: (item) => item.status === 2 + }, + ], + }, + ]; + } + changeStatus(item: any) { + const params = { + status, + idList: [item.id] + }; + // this.service.request(this.service.$api_openOrClose, params).subscribe(res => { + // if (res) { + // this.st.reload(); + // } + // }); + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + + /** + * 新增单个实例 + */ + add() { + this.router.navigate(['../banner/detail'], { queryParams: { id: 0, type: 'add' }, relativeTo: this.ar }); + } + + /** + * 删除单个实例 + */ + del(item: any) { + const ids = []; + ids.push(item.id); + this.service.request(this.service.$api_del_many, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功'); + this.st.reload(); + } + }); + } +} diff --git a/src/app/routes/partner/knowledge/banner/components/list/list.less b/src/app/routes/partner/knowledge/banner/components/list/list.less new file mode 100644 index 00000000..d9b6c73f --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/components/list/list.less @@ -0,0 +1,9 @@ +.selectApp { + display: flex; + .appTitle { + font-size: 14px; + } + } + .redfont{ + color: #f00; + } \ No newline at end of file diff --git a/src/app/routes/partner/knowledge/banner/services/banner.service.ts b/src/app/routes/partner/knowledge/banner/services/banner.service.ts new file mode 100644 index 00000000..6710ef04 --- /dev/null +++ b/src/app/routes/partner/knowledge/banner/services/banner.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class BannerService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/knowledge/classification/components/edit/edit.component.html b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.html new file mode 100644 index 00000000..855ada53 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/app/routes/partner/knowledge/classification/components/edit/edit.component.spec.ts b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.spec.ts new file mode 100644 index 00000000..e31fd9c9 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerEditComponent } from './edit.component'; + +describe('PartnerEditComponent', () => { + let component: PartnerEditComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerEditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/knowledge/classification/components/edit/edit.component.ts b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.ts new file mode 100644 index 00000000..817ac254 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/edit/edit.component.ts @@ -0,0 +1,111 @@ +import { Component, OnInit } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { SFSchema, SFUISchema } from '@delon/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { ClassificationService } from '../../services/classification.service'; + +@Component({ + selector: 'app-partner-edit', + templateUrl: './edit.component.html', +}) +export class PartnerEditComponent implements OnInit { + record: any = {}; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + status = 'add'; + + constructor( + private modal: NzModalRef, + public service: ClassificationService + ) { } + + ngOnInit(): void { + if (this.i) { + this.i.icon = [ + { + uid: -1, + name: 'xxx.png', + status: 'done', + url: this.i.url, + response: { + resource_id: 1, + }, + }, + ] + } + this.initSF(); + + } + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '分类名称', + type: 'string', + maxLength: 5, + ui: { + placeholder: '请输入', + }, + }, + icon: { + type: 'string', + title: '图标', + ui: { + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg', + limit: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸 88px * 88px)', + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + } + } + }, + abnormalCause2: { + title: '排序', + type: 'number', + maximum: 99, + minimum: 0, + ui: { + placeholder: '请输入', + widgetWidth: 350 + } + }, + }, + required: ['abnormalCause', 'icon', 'abnormalCause2'] + + } + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 20, gutter: 4 } }, }; + + } + + save(value: any): void { + this.service.request(`/user/${this.record.id}`, value).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.modal.close(true); + } + + }); + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/partner/knowledge/classification/components/list/list.component.html b/src/app/routes/partner/knowledge/classification/components/list/list.component.html new file mode 100644 index 00000000..2947e9a8 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/list/list.component.html @@ -0,0 +1,28 @@ + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    + +
    + + + + + +
    diff --git a/src/app/routes/partner/knowledge/classification/components/list/list.component.spec.ts b/src/app/routes/partner/knowledge/classification/components/list/list.component.spec.ts new file mode 100644 index 00000000..f63ab2ec --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/list/list.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PartnerListComponent } from './list.component'; + +describe('PartnerListComponent', () => { + let component: PartnerListComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ PartnerListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PartnerListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/knowledge/classification/components/list/list.component.ts b/src/app/routes/partner/knowledge/classification/components/list/list.component.ts new file mode 100644 index 00000000..db88bed4 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/components/list/list.component.ts @@ -0,0 +1,173 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { PartnerAccountManagementVirtualAccountDetailComponent } from 'src/app/routes/partner/account-management/components/virtual-account-detail/virtual-account-detail.component'; +import { AccountManagemantService } from 'src/app/routes/partner/account-management/services/account-managemant.service'; +import { PartnerEditComponent } from '../edit/edit.component'; + +@Component({ + selector: 'app-partner-list', + templateUrl: './list.component.html', +}) +export class PartnerKnowledgeClassificationListComponent implements OnInit { + url = `/user`; + schema!: SFSchema; + ui!: SFUISchema; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') private readonly sf!: SFComponent; + columns: STColumn[] = []; + + constructor(public service: AccountManagemantService, public modal: NzModalService) { } + /** + * 查询参数 + */ + get reqParams() { + const params = { ...this.sf?.value }; + return params + } + + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + abnormalCause: { + title: '分类ID', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause1: { + title: '分类名称', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + abnormalCause2: { + title: '状态', + type: 'string', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: '1' }, + { label: '禁用', value: '2' } + ], + default: '', + }, + } + } + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 } }, }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '分类ID', index: 'carNo', className: 'text-center', width: 150 }, + { title: '分类名称', render: 'carModelLabel', className: 'text-center', width: 200 }, + { title: '图标', render: 'icon', className: 'text-center', width: 200 }, + { title: '文章数', render: 'approvalStatus2', className: 'text-center', width: 120 }, + { title: '排序', render: 'approvalStatus3', className: 'text-center', width: 120 }, + { title: '状态', index: 'approvalStatus4', className: 'text-center', width: 120 }, + { title: '最后修改时间', index: 'approvalStatus4', className: 'text-center', width: 180 }, + { + title: '操作', + width: 150, + buttons: [ + { + text: '修改', + click: (_record) => this.edit(_record) + }, + { + text: '启用', + click: (_record) => this.operate(_record, 1) + }, + { + text: '禁用', + click: (_record) => this.operate(_record, 2) + } + ] + } + ]; + } + + resetSF() { + this.sf.reset(); + setTimeout(() => { + this.st.reset(); + }) + } + + /** + *新增 + * @param _record 当前行信息 + */ + add() { + const modalRef = this.modal.create({ + nzTitle: '新增分类', + nzContent: PartnerEditComponent, + nzWidth: 600, + nzComponentParams: { + i: null + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + if (res) { + this.st.load(1); + } + }); + } + + /** + *编辑 + * @param _record 当前行信息 + */ + edit(record: any) { + const modalRef = this.modal.create({ + nzTitle: '修改分类', + nzContent: PartnerEditComponent, + nzWidth: 600, + nzComponentParams: { + i: record + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + if (res) { + this.st.load(1); + } + }); + } + + /** + *禁用或者启动 + * @param _record 当前行信息 + */ + operate(record: any, type = 1) { + this.modal.confirm({ + nzTitle: `确定${type === 1 ? '启用' : '禁用'}此分类吗?`, + nzOnOk: () => + this.service.request(this.service.$api_edit_one, { id: record.id }).subscribe((res) => { + if (res) { + this.st.load(1); + this.service.msgSrv.success(`${type === 1 ? '启用' : '禁用'}成功!`); + } + }), + }); + } + + /** + * + */ + export() { + + } + +} diff --git a/src/app/routes/partner/knowledge/classification/services/classification.service.ts b/src/app/routes/partner/knowledge/classification/services/classification.service.ts new file mode 100644 index 00000000..034cdb74 --- /dev/null +++ b/src/app/routes/partner/knowledge/classification/services/classification.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class ClassificationService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/level-config/components/edit/edit.component.html b/src/app/routes/partner/level-config/components/edit/edit.component.html new file mode 100644 index 00000000..ba3e7981 --- /dev/null +++ b/src/app/routes/partner/level-config/components/edit/edit.component.html @@ -0,0 +1,7 @@ + + + +
    + + +
    diff --git a/src/app/routes/partner/level-config/components/edit/edit.component.ts b/src/app/routes/partner/level-config/components/edit/edit.component.ts new file mode 100644 index 00000000..029381d5 --- /dev/null +++ b/src/app/routes/partner/level-config/components/edit/edit.component.ts @@ -0,0 +1,85 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnumType, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent } from 'src/app/shared/components/amap'; +import { ChannelSalesService } from '../../services/level-config.service'; + +@Component({ + selector: 'app-parter-LevelConfig-edit', + templateUrl: './edit.component.html' +}) +export class ParterLevelConfigEditComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + i: any; + type: any; + + constructor( + public http: _HttpClient, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: ChannelSalesService, + private modalRef: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + id: { + type: 'string', + title: '', + ui: { hidden: true } + }, + gradeName: { + title: '等级名称', + type: 'string', + }, + sortId: { + title: '排序', + type: 'string', + }, + remark: { + type: 'string', + title: '备注', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请输入50字符' + } as SFTextareaWidgetSchema, + }, + }, + required: ['gradeName', 'sortId', 'remark'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + }, + }; + } + + close() { + this.modalRef.destroy(); + } + save() { + this.sf.validator({ emitError: true }); + if(!this.sf.valid) return; + this.service.request(this.service.$api_save, { ...this.sf.value }).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!') + this.modalRef.destroy(true); + } else { + this.service.msgSrv.error(res.msg); + } + }); + } +} diff --git a/src/app/routes/partner/level-config/components/list/list.component.html b/src/app/routes/partner/level-config/components/list/list.component.html new file mode 100644 index 00000000..e6f50f99 --- /dev/null +++ b/src/app/routes/partner/level-config/components/list/list.component.html @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/src/app/routes/partner/level-config/components/list/list.component.ts b/src/app/routes/partner/level-config/components/list/list.component.ts new file mode 100644 index 00000000..e079f0e7 --- /dev/null +++ b/src/app/routes/partner/level-config/components/list/list.component.ts @@ -0,0 +1,190 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ChannelSalesService } from '../../services/level-config.service'; +import { ParterLevelConfigEditComponent } from '../edit/edit.component'; + +@Component({ + selector: 'app-parter-LevelConfig-list', + templateUrl: './list.component.html' +}) +export class ParterLevelConfigListComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + + data=[{name1:1111}] + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: ChannelSalesService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { ...this.sf?.value }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + gradeName: { + type: 'string', + title: '等级姓名', + }, + stateLocked: { + type: 'string', + title: '状态', + enum:[{label:'启用',value:'1'},{label:'禁用',value:'0'}], + ui:{ + widget:'select', + } + }, + } + }; + this.ui = { + '*': { + width:300, + grid: { span: 12, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '等级姓名', + index: 'gradeName' + }, + { + title: '备注', + index: 'remark' + }, + { + title: '创建时间', + index: 'createTime' + }, + { + title: '启用时间', + index: 'enableTime' + }, + { + title: '状态', + index: 'stateLocked', + format: (item: any) => { + return item.stateLocked ? '禁用':'启用' + } + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: (_record, _modal, _instance) => this.edit(_record), + }, + { + text: '禁用', + click: (_record, _modal, _instance) => this.stop(_record), + iif:(item)=>!item.stateLocked + }, + { + text: '启用', + click: (_record, _modal, _instance) => this.restart(_record), + iif:(item)=>item.stateLocked + } + ] + } + ]; + } + + add() { + const modalRef = this.modalService.create({ + nzWidth:500, + nzTitle: '新增', + nzContent: ParterLevelConfigEditComponent, + nzComponentParams: { type: this.spuStatus } + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.reload(); + } + }); + } + + // 编辑 + edit(record: STData) { + const modalRef = this.modalService.create({ + nzWidth:500, + nzTitle: '编辑', + nzContent: ParterLevelConfigEditComponent, + nzComponentParams: { i: record, type: this.spuStatus } + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.reload(); + } + }); + } + + // 编辑 + view(record: STData) { + const modalRef = this.modalService.create({ + nzTitle: '查看', + nzContent: ParterLevelConfigEditComponent, + nzComponentParams: { i: record } + }); + } + + restart(item: any) { + this.modalService.confirm({ + nzTitle: '启用确认', + nzContent: `确定启用该账号吗?
    `, + nzOnOk: () => + this.service.request(this.service.$api_updatePartnerGradeConfig, {id:item.id}).subscribe(res => { + if (res) { + this.service.msgSrv.success('启用成功!'); + this.st.reload(); + } + }) + }); + } + stop(item: any) { + this.modalService.confirm({ + nzTitle: '禁用确认', + nzContent: `确定禁用该账号吗?
    `, + nzOnOk: () => + this.service.request(this.service.$api_updatePartnerGradeConfig, {id:item.id}).subscribe(res => { + if (res) { + this.service.msgSrv.success('禁用成功!'); + this.st.reload(); + } + }) + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } + + +} diff --git a/src/app/routes/partner/level-config/services/level-config.service.ts b/src/app/routes/partner/level-config/services/level-config.service.ts new file mode 100644 index 00000000..df8e18b3 --- /dev/null +++ b/src/app/routes/partner/level-config/services/level-config.service.ts @@ -0,0 +1,22 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class ChannelSalesService extends BaseService { + // 查询合伙人等级配置表 + $api_getList = '/api/mdc/partnerGradeConfig/list/page'; + // 获取合伙人等级配置表 + $api_getPartnerGradeConfig = '/api/mdc/partnerGradeConfig/get'; + // 保存合伙人等级配置表 + $api_save = '/api/mdc/partnerGradeConfig/save'; + // 删除合伙人等级配置表 + $api_del = '/api/mdc/partnerGradeConfig/deletebatch'; + // 启用/禁用等级配置 + $api_updatePartnerGradeConfig = '/api/mdc/partnerGradeConfig/updatePartnerGradeConfig'; + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.html b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.html new file mode 100644 index 00000000..bd95c61e --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.html @@ -0,0 +1,91 @@ + + + + + + + + + +
    企业基本信息
    +
    + +
    + 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
    上传后系统会自动识别并填写
    +
    +
    + +
    万元
    +
    + + + +
    营业执照法人信息
    +
    + +
    +
    请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
    +
    上传后系统会自动识别并填写
    +
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    + + + +
    企业管理员信息
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    + + + +
    所属城市
    +
    + + + +
    渠道销售
    +
    +
    + +
    + + +
    +
    diff --git a/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.less b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.less new file mode 100644 index 00000000..6b70e074 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.less @@ -0,0 +1,68 @@ +:host { + ::ng-deep { + nz-card { + + .pr { + position: relative; + } + + .pa { + position: absolute; + top : 50px; + left : 150px; + } + + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + } + + .ant-form-item { + margin-left: 180px; + } + + nz-date-picker, + nz-input-number { + width: 100% !important; + } + + .input-back { + nz-form-item { + margin-left: 0px; + + .ant-form-item-label { + flex: 0 !important; + } + + .ant-form-item-control { + max-width : 100% !important; + margin-left: 20px !important; + } + } + } + + } + } \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.ts b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.ts new file mode 100644 index 00000000..14efa97f --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-etp-partner/add-etp-partner.component.ts @@ -0,0 +1,666 @@ +import { Component, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { + SFUploadWidgetSchema, + SFComponent, + SFSchema, + SFUISchema, + SFDateWidgetSchema, + SFCheckboxWidgetSchema, + SFTreeSelectWidgetSchema +} from '@delon/form'; +import { NzTreeNode } from 'ng-zorro-antd/tree'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { of, Subscription } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { PartnerListService } from '../../services/partner-list.service'; + +const IMAGECONFIG = { + previewFile: (file: NzUploadFile) => of(file.url), + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + name: 'multipartFile', + multiple: false, + listType: 'picture-card' +} as SFUploadWidgetSchema; + +const DATECONFIG = { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择' +}; + +@Component({ + selector: 'app-add-etp-partner', + templateUrl: './add-etp-partner.component.html', + styleUrls: ['./add-etp-partner.component.less'] +}) +export class AddEtpPartnerComponent { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + schema: SFSchema = this.initBasicInfoSF(); + ui: SFUISchema = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 } + }, + $_basicInfoTitle: { + spanLabelFixed: 0 + }, + $_legalPersontitle: { + spanLabelFixed: 0 + }, + $_isLoingDate: { + spanLabelFixed: 100, + grid: { xxl: 6, xl: 6, lg: 4, md: 6 } + } + }; + + getIdentityInfoSub = new Subscription(); + loadingIdentityInfoSub = false; + + constructor(public service: PartnerListService) {} + + submitForm() { + if (!this.sf.valid) { + this.sf.validator({ emitError: true }); + this.service.msgSrv.warning('请修改填写错误信息'); + return; + } + if (this.sf.value.cityCodesList?.length > 3) { + this.sf.validator({ emitError: true }); + this.service.msgSrv.warning('所属城市不能超过3个'); + return; + } + // 校验企业营业期限 + const operatingStartTime = new Date(this.sf.value.operatingStartTime); + const operatingEndTime = new Date(this.sf.value.operatingEndTime); + if (operatingStartTime.getTime() > operatingEndTime.getTime()) { + this.service.msgSrv.warning('营业截止日期不能小于开始日期'); + return; + } + // 校验法人证件有效期限 + if (this.sf.value.legalPersonIdentity.validEndTime) { + const validStartTime = new Date(this.sf.value.legalPersonIdentity.validStartTime); + const validEndTime = new Date(this.sf.value.legalPersonIdentity.validEndTime); + if (validStartTime.getTime() > validEndTime.getTime()) { + this.service.msgSrv.warning('法人证件有效截止日期不能小于开始日期'); + return; + } + } + // 校验管理员证件有效期限 + if (this.sf.value.adminUserInfo.validEndTime) { + const validStartTime = new Date(this.sf.value.adminUserInfo.validStartTime); + const validEndTime = new Date(this.sf.value.adminUserInfo.validEndTime); + if (validStartTime.getTime() > validEndTime.getTime()) { + this.service.msgSrv.warning('管理员证件有效截止日期小于开始日期'); + return; + } + } + const params = {}; + Object.assign(params, { ...this.sf.value, source: 2 }); + // console.log(params); + + this.service.request(this.service.$api_save_entp_partner, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('新增企业合伙人成功'); + this.goBack(); + } + }); + } + + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + if (type === 1) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf.setValue('/legalPersonIdentity/name', res.name); + } + if (res.number) { + this.sf.setValue('/legalPersonIdentity/certificateType', 0); + this.sf.setValue('/legalPersonIdentity/certificateNumber', res.number); + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.sf.setValue('/legalPersonIdentity/validStartTime', res.validFrom); + } + if (res.validTo) { + this.sf.setValue('/legalPersonIdentity/validEndTime', res.validTo); + this.sf.setValue('/legalPersonIdentity/_isLoingDate', false); + } else { + this.sf.setValue('/legalPersonIdentity/_isLoingDate', true); + } + } + } + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf.setValue('/adminUserInfo/name', res.name); + } + if (res.number) { + this.sf.setValue('/adminUserInfo/certificateNumber', res.number); + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.sf.setValue('/adminUserInfo/validStartTime', res.validFrom); + } + if (res.validTo) { + this.sf.setValue('/adminUserInfo/validEndTime', res.validTo); + this.sf.setValue('/adminUserInfo/_isLoingDate', false); + } else { + this.sf.setValue('/adminUserInfo/_isLoingDate', true); + } + } + } + } + }); + } + + // 识别营业执照 + checkBusinessLicense(imgurl: any) { + this.service.request(this.service.$api_ocr_recognize_business_license, { businessLicenseUrl: imgurl }).subscribe(res => { + if (res) { + if (res.registrationNumber) { + this.sf.setValue('/unifiedSocialCreditCode', res.registrationNumber); + } + if (res.name) { + this.sf.setValue('/enterpriseName', res.name); + } + if (res.businessTermStartDate) { + this.sf.setValue('/operatingStartTime', res.businessTermStartDate); + } + if (res.businessTermEndDate) { + this.sf.setValue('/operatingEndTime', res.businessTermEndDate); + this.sf.setValue('/_isLoingDate', false); + } else { + this.sf.setValue('/_isLoingDate', true); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + + private initBasicInfoSF(): SFSchema { + return { + properties: { + // 企业基本信息 + _basicInfoTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + _licenseTips: { title: '营业执照', type: 'string', ui: { widget: 'custom' }, default: true }, + licensePhoto: { title: '', type: 'string', ui: { hidden: true } }, + licensePhotoWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/licensePhoto', args.fileList[0].response.data.fullFilePath); + this.checkBusinessLicense(args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码' + } + } + }, + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 1, + maxLength: 100, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入公司名称' + } + } + }, + operatingStartTime: { + title: '营业期限', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + operatingEndTime: { + title: '', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 20, md: 18 }, + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf?.setValue('/_isLoingDate', false); + } + } as SFDateWidgetSchema + }, + _isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + class: 'input-back', + widget: 'checkbox', + change: i => this.sf?.setValue('/operatingEndTime', null) + } as SFCheckboxWidgetSchema + }, + + // 法人信息 + legalPersonIdentity: { + type: 'object', + properties: { + _legalPersontitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + _certificatePhototips: { title: '法定代表人证件照', type: 'string', ui: { widget: 'custom' }, default: true }, + _certificatePhotoExmplateA: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/legalPersonIdentity/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front', 1); + } + } + } as SFUploadWidgetSchema + }, + _certificatePhotoExmplateB: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/legalPersonIdentity/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back', 1); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '法人代表姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入营业执照上的法人姓名' + } + }, + certificateType: { + type: 'string', + title: '法人证件类型', + enum: [ + { label: '大陆身份证', value: 0 }, + { label: '港澳居民通行证', value: 1 }, + { label: '香港居民通行证', value: 2 } + ], + default: 0, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select' + } + }, + certificateNumber: { + title: ' 法定代表人证件号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入法定代表人证件号' + } + }, + validStartTime: { + title: '法人证件有效开始日期', + type: 'string', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + validEndTime: { + title: '法人证件有效截止日期', + type: 'string', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf?.setValue('/legalPersonIdentity/_isLoingDate', false); + } + } as SFDateWidgetSchema + }, + _isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + spanLabelFixed: 100, + grid: { span: 6 }, + class: 'input-back', + widget: 'checkbox', + change: i => this.sf?.setValue('/legalPersonIdentity/validEndTime', null) + } as SFCheckboxWidgetSchema + } + }, + required: [ + '_certificatePhototips', + 'certificatePhotoFront', + 'certificatePhotoBack', + 'name', + 'certificateType', + 'certificateNumber', + 'validStartTime' + ] + }, + _adminTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + adminMobile: { + title: ' 企业管理员手机号', + type: 'string', + minLength: 1, + format: 'mobile', + maxLength: 11, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员手机号', + errors: { required: '请输入企业管理员手机号', format: '手机号格式错误' }, + change: (mobile: any) => { + // 根据手机号获取实名信息 + if (mobile?.length === 11) { + if (this.loadingIdentityInfoSub) { + this.getIdentityInfoSub.unsubscribe(); + } + this.loadingIdentityInfoSub = true; + this.getIdentityInfoSub = this.service.request(this.service.$api_get_identityInfo_by_mobile, { mobile }).subscribe( + res => { + if (res) { + this.setInfo(res); + this.sf.setValue('/adminUserInfo/id', res.id); + this.sf.setValue('/adminUserInfo/userId', res.userId); + } + this.loadingIdentityInfoSub = false; + }, + _ => {}, + () => (this.loadingIdentityInfoSub = false) + ); + } + } + } + }, + // 企业管理员信息 + adminUserInfo: { + type: 'object', + properties: { + _adminCertificatePhotoTipsA: { + title: '企业管理员证件照', + type: 'string', + ui: { + widget: 'custom' + }, + default: true + }, + id: { title: '', type: 'string', ui: { hidden: true } }, + userId: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/adminUserInfo/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front', 0); + } + } + } as SFUploadWidgetSchema + }, + _adminCertificatePhotoTipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6 + } + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/adminUserInfo/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back', 0); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '企业管理员姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员姓名' + } + }, + certificateNumber: { + title: '企业管理员身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员身份证号' + } + }, + validStartTime: { + title: '身份证有效开始日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + validEndTime: { + title: '身份证有效截止日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 20, md: 18 }, + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf?.setValue('/adminUserInfo/_isLoingDate', false); + } + } as SFDateWidgetSchema + }, + _isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + spanLabelFixed: 100, + grid: { span: 6 }, + class: 'input-back', + widget: 'checkbox', + change: i => this.sf?.setValue('/adminUserInfo/validEndTime', null) + } as SFCheckboxWidgetSchema + } + }, + required: ['_adminCertificatePhotoTipsA', 'name', 'certificateNumber', 'operatingStartTime'] + }, + // 所属城市 + _addressTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + cityCodesList: { + type: 'string', + title: '所属城市', + ui: { + widget: 'tree-select', + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请选择城市(最多3个)', + checkable: true, + class: 'city-tree-select', + asyncData: () => + this.getRegionDetailByCode('').pipe( + map((res: any) => + res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, disabled: true, isDisableCheckbox: true })) + ) + ), + expandChange: ({ node }: { node: NzTreeNode }) => + this.getRegionDetailByCode(node.key).pipe( + map((res: any) => res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, isLeaf: true }))) + ) + } as SFTreeSelectWidgetSchema + }, + // 渠道销售 + _channelTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + invitationCode: { + title: '渠道销售邀请码', + type: 'string', + minLength: 1, + maxLength: 100, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入渠道销售邀请码', + errors: { + required: '请输入渠道销售邀请码' + } + } + } + }, + required: [ + '_licenseTips', + 'licensePhotoWatermark', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'operatingStartTime', + 'cityCodesList', + 'adminMobile', + 'invitationCode' + ] + }; + } + + private setInfo(info: any) { + if (info.name) { + this.sf.setValue('/adminUserInfo/name', info.name); + } + if (info.certificatePhotoFront) { + this.sf.setValue('/adminUserInfo/certificatePhotoFront', info.certificatePhotoFront); + } + if (info.certificatePhotoFrontWatermark) { + console.log(this.sf.getProperty('/adminUserInfo/certificatePhotoFrontWatermark')); + + this.sf.setValue('/adminUserInfo/certificatePhotoFrontWatermark', [ + { + uid: -1, + name: '文件', + status: 'done', + url: info.certificatePhotoFrontWatermark, + response: info.certificatePhotoFrontWatermark + } + ]); + } + if (info.certificatePhotoBack) { + this.sf.setValue('/adminUserInfo/certificatePhotoBack', info.certificatePhotoBack); + } + if (info.certificatePhotoBackWatermark) { + this.sf.setValue('/adminUserInfo/certificatePhotoBackWatermark', [ + { + uid: -1, + name: '文件', + status: 'done', + url: info.certificatePhotoBackWatermark, + response: info.certificatePhotoBackWatermark + } + ]); + } + if (info.certificateNumber) { + this.sf.setValue('/adminUserInfo/certificateNumber', info.certificateNumber); + } + if (info.validStartTime) { + this.sf.setValue('/adminUserInfo/validStartTime', info.validStartTime); + } + if (info.validEndTime) { + this.sf.setValue('/adminUserInfo/validEndTime', info.validEndTime); + this.sf.setValue('/adminUserInfo/_isLoingDate', false); + } else { + this.sf.setValue('/adminUserInfo/_isLoingDate', true); + } + } +} diff --git a/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.html b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.html new file mode 100644 index 00000000..7a071adc --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.html @@ -0,0 +1,49 @@ + + + + + + + + + +
    合伙人信息
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    + + + +
    所属城市
    +
    + + + +
    渠道销售
    +
    +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.less b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.less new file mode 100644 index 00000000..6b70e074 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.less @@ -0,0 +1,68 @@ +:host { + ::ng-deep { + nz-card { + + .pr { + position: relative; + } + + .pa { + position: absolute; + top : 50px; + left : 150px; + } + + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + } + + .ant-form-item { + margin-left: 180px; + } + + nz-date-picker, + nz-input-number { + width: 100% !important; + } + + .input-back { + nz-form-item { + margin-left: 0px; + + .ant-form-item-label { + flex: 0 !important; + } + + .ant-form-item-control { + max-width : 100% !important; + margin-left: 20px !important; + } + } + } + + } + } \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.ts b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.ts new file mode 100644 index 00000000..d21416e3 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/add-personal-partner/add-personal-partner.component.ts @@ -0,0 +1,388 @@ +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFUploadWidgetSchema, + SFComponent, + SFSchema, + SFUISchema, + SFDateWidgetSchema, + SFCheckboxWidgetSchema, + SFTreeSelectWidgetSchema +} from '@delon/form'; +import { NzTreeNode } from 'ng-zorro-antd/tree'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { of, Subscription } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { PartnerListService } from '../../services/partner-list.service'; + +const IMAGECONFIG = { + previewFile: (file: NzUploadFile) => of(file.url), + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + name: 'multipartFile', + multiple: false, + listType: 'picture-card' +} as SFUploadWidgetSchema; + +const DATECONFIG = { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择' +}; + +@Component({ + selector: 'app-add-personal-partner', + templateUrl: './add-personal-partner.component.html', + styleUrls: ['./add-personal-partner.component.less'] +}) +export class AddPersonalPartnerComponent { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + schema: SFSchema = this.initBasicInfoSF(); + ui: SFUISchema = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 } + }, + $_basicInfoTitle: { + spanLabelFixed: 0 + }, + $_legalPersontitle: { + spanLabelFixed: 0 + }, + $_isLoingDate: { + spanLabelFixed: 100, + grid: { xxl: 6, xl: 6, lg: 4, md: 6 } + } + }; + + getIdentityInfoSub = new Subscription(); + loadingIdentityInfoSub = false; + + constructor(private router: Router, public service: PartnerListService) {} + + submitForm() { + if (!this.sf.valid) { + this.sf.validator({ emitError: true }); + this.service.msgSrv.warning('请修改填写错误信息'); + return; + } + if (this.sf.value.cityCodesList?.length > 3) { + this.sf.validator({ emitError: true }); + this.service.msgSrv.warning('所属城市不能超过3个'); + return; + } + if (this.sf.value.validEndTime) { + const validStartTime = new Date(this.sf.value.validStartTime); + const validEndTime = new Date(this.sf.value.validEndTime); + if (validStartTime.getTime() > validEndTime.getTime()) { + this.service.msgSrv.warning('身份证有效截止日期不能小于开始日期'); + return; + } + } + const params = {}; + Object.assign(params, { ...this.sf.value, source: 2 }); + + this.service.request(this.service.$api_save_personal_partner, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('新增个人合伙人成功'); + this.goBack(); + } + }); + } + + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf.setValue('/adminUserInfo/name', res.name); + } + if (res.number) { + this.sf.setValue('/adminUserInfo/certificateType', 0); + this.sf.setValue('/adminUserInfo/certificateNumber', res.number); + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.sf.setValue('/adminUserInfo/validStartTime', res.validFrom); + } + if (res.validTo) { + this.sf.setValue('/adminUserInfo/validEndTime', res.validTo); + this.sf.setValue('/adminUserInfo/_isLoingDate', false); + } else { + this.sf.setValue('/adminUserInfo/_isLoingDate', true); + } + } + } + }); + } + + goBack() { + window.history.go(-1); + } + + private initBasicInfoSF(): SFSchema { + return { + properties: { + _adminTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + mobile: { + title: ' 手机号', + type: 'string', + minLength: 1, + format: 'mobile', + maxLength: 11, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入手机号', + errors: { required: '请输入手机号', format: '手机号格式错误' }, + change: (mobile: any) => { + // 根据手机号获取实名信息 + if (mobile?.length === 11) { + if (this.loadingIdentityInfoSub) { + this.getIdentityInfoSub.unsubscribe(); + } + this.loadingIdentityInfoSub = true; + this.getIdentityInfoSub = this.service.request(this.service.$api_get_identityInfo_by_mobile, { mobile }).subscribe( + res => { + if (res) { + this.setInfo(res); + this.sf.setValue('/adminUserInfo/id', res.id); + this.sf.setValue('/adminUserInfo/userId', res.userId); + } + this.loadingIdentityInfoSub = false; + }, + _ => {}, + () => (this.loadingIdentityInfoSub = false) + ); + } + } + } + }, + // 合伙人信息 + adminUserInfo: { + type: 'object', + properties: { + _adminCertificatePhotoTipsA: { + title: '证件照', + type: 'string', + ui: { + widget: 'custom' + }, + default: true + }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + id: { title: '', type: 'string', ui: { hidden: true } }, + userId: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificateType: { title: '', type: 'string', ui: { hidden: true }, default: 0 }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/adminUserInfo/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front'); + } + } + } as SFUploadWidgetSchema + }, + _adminCertificatePhotoTipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6 + } + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/adminUserInfo/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back'); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入姓名' + } + }, + certificateNumber: { + title: '身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入身份证号' + } + }, + validStartTime: { + title: '身份证有效开始日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + validEndTime: { + title: '身份证有效截止日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 20, md: 18 }, + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf?.setValue('/adminUserInfo/_isLoingDate', false); + } + } as SFDateWidgetSchema + }, + _isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + spanLabelFixed: 100, + grid: { span: 6 }, + class: 'input-back', + widget: 'checkbox', + change: i => this.sf?.setValue('/adminUserInfo/validEndTime', null) + } as SFCheckboxWidgetSchema + } + }, + required: ['_adminCertificatePhotoTipsA', 'adminMobile', 'name', 'certificateNumber', 'validStartTime'] + }, + // 所属城市 + _addressTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + cityCodesList: { + type: 'string', + title: '所属城市', + ui: { + widget: 'tree-select', + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请选择城市(最多3个)', + checkable: true, + class: 'city-tree-select', + asyncData: () => + this.getRegionDetailByCode('').pipe( + map((res: any) => + res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, disabled: true, isDisableCheckbox: true })) + ) + ), + expandChange: ({ node }: { node: NzTreeNode }) => + this.getRegionDetailByCode(node.key).pipe( + map((res: any) => res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, isLeaf: true }))) + ) + } as SFTreeSelectWidgetSchema + }, + // 渠道销售 + _channelTitle: { title: '', type: 'string', ui: { widget: 'custom' } }, + invitationCode: { + title: '渠道销售邀请码', + type: 'string', + minLength: 1, + maxLength: 100, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入渠道销售邀请码', + errors: { + required: '请输入渠道销售邀请码' + } + } + } + }, + required: ['cityCodesList', 'invitationCode'] + }; + } + + private setInfo(info: any) { + if (info.name) { + this.sf.setValue('/adminUserInfo/name', info.name); + } + if (info.certificatePhotoFront) { + this.sf.setValue('/adminUserInfo/certificatePhotoFront', info.certificatePhotoFront); + } + if (info.certificatePhotoFrontWatermark) { + console.log(this.sf.getProperty('/adminUserInfo/certificatePhotoFrontWatermark')); + + this.sf.setValue('/adminUserInfo/certificatePhotoFrontWatermark', [ + { + uid: -1, + name: '文件', + status: 'done', + url: info.certificatePhotoFrontWatermark, + response: info.certificatePhotoFrontWatermark + } + ]); + } + if (info.certificatePhotoBack) { + this.sf.setValue('/adminUserInfo/certificatePhotoBack', info.certificatePhotoBack); + } + if (info.certificatePhotoBackWatermark) { + this.sf.setValue('/adminUserInfo/certificatePhotoBackWatermark', [ + { + uid: -1, + name: '文件', + status: 'done', + url: info.certificatePhotoBackWatermark, + response: info.certificatePhotoBackWatermark + } + ]); + } + if (info.certificateNumber) { + this.sf.setValue('/adminUserInfo/certificateNumber', info.certificateNumber); + } + if (info.validStartTime) { + this.sf.setValue('/adminUserInfo/validStartTime', info.validStartTime); + } + if (info.validEndTime) { + this.sf.setValue('/adminUserInfo/validEndTime', info.validEndTime); + this.sf.setValue('/adminUserInfo/_isLoingDate', false); + } else { + this.sf.setValue('/adminUserInfo/_isLoingDate', true); + } + } +} diff --git a/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.html b/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.html new file mode 100644 index 00000000..a9d9fe7e --- /dev/null +++ b/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.html @@ -0,0 +1,13 @@ +

    转移客户数:{{changeST?.total}}

    + + +

    不转移客户数:{{noChangeST?.total}}

    + + +

    + 客户转移:客户跟着上级合伙人转移一并到新渠道销售下,会同步发起CRM《客户转移》流程;不转移的,客户会与上级合伙人解绑,修改成功后,修改时间也是合伙人与客户的结算结束时间,成为原来渠道销售的直客。 +

    \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.less b/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.ts b/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.ts new file mode 100644 index 00000000..6fc1e963 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/channel-log-modal/channel-log-modal.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { PartnerListService } from '../../services/partner-list.service'; + +@Component({ + selector: 'app-channel-log-modal', + templateUrl: './channel-log-modal.component.html' +}) +export class ChannelLogModalComponent implements OnInit { + columns: { changeColumn: STColumn[]; beChangeColumn: STColumn[] } = this.initST(); + id = ''; + constructor(public service: PartnerListService, public route: ActivatedRoute) {} + + ngOnInit(): void {} + + private initST(): { changeColumn: STColumn[]; beChangeColumn: STColumn[] } { + return { + changeColumn: [ + { title: '客户名称', index: 'payCode', width: 180 }, + { title: '合伙人', index: 'ltdName', width: 160 }, + { title: '渠道销售', index: 'payDate', className: 'text-center', width: 130 }, + { title: 'CRM审核状态', index: 'payDate', width: 150 }, + { title: '生效时间', index: 'payDate', className: 'text-center', width: 130 } + ], + beChangeColumn: [ + { title: '客户名称', index: 'payCode', width: 180 }, + { title: '合伙人', index: 'ltdName', width: 160 }, + { title: '渠道销售', index: 'payDate', className: 'text-center', width: 130 }, + { title: '生效时间', index: 'payDate', className: 'text-center', width: 130 } + ] + }; + } +} diff --git a/src/app/routes/partner/partner-list/components/index/partner-list.component.html b/src/app/routes/partner/partner-list/components/index/partner-list.component.html new file mode 100644 index 00000000..ff6f4383 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/index/partner-list.component.html @@ -0,0 +1,78 @@ + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + +
    + + +
    + + + +
    + + +
    +
    + {{selectItem?.enterpriseName || selectItem?.contactName}} + + + + + +
    +
    +

    说明:修改模板后,当月开始返佣收益将会按新模板计算

    +
    + + +
    +
    + {{selectItem?.enterpriseName || selectItem?.contactName}} + {{selectItem?.channelId}} + + + + + + + + + +

    已选(0)

    + + +
    + + + + + + +
    +
    +

    客户转移:客户跟着上级合伙人转移一并到新渠道销售下,会同步发起CRM《客户转移》流程;不转移的,客户会与上级合伙人解绑,成为渠道销售的直客

    +
    \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/index/partner-list.component.ts b/src/app/routes/partner/partner-list/components/index/partner-list.component.ts new file mode 100644 index 00000000..ae12b403 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/index/partner-list.component.ts @@ -0,0 +1,482 @@ +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFAutoCompleteWidgetSchema, SFSelectWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { AddCollectionInvoiceModalComponent } from 'src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component'; + +import { PartnerListService } from '../../services/partner-list.service'; +import { PartnerAuditModalComponent } from '../partner-audit-modal/partner-audit-modal.component'; + +@Component({ + selector: 'app-partner-list', + templateUrl: './partner-list.component.html', + styleUrls: ['../../../../commom/less/box.less'] +}) +export class PartnerListComponent { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + _$expand = false; + + @ViewChild('editTemplate', { static: true }) + editTemplate: any; + templateId: any; + templates: any[] = []; + + @ViewChild('editCannel', { static: true }) + editCannel: any; + customers: any[] = []; + cannels: any[] = []; + selectedRows: any[] = []; + cannelItem: any = { channelId: null, effectiveNode: 1, enterpriseIdList: [], remark: '' }; + + selectItem: any = {}; + + constructor(public service: PartnerListService, private nzModalService: NzModalService, private router: Router) { + this.loadSelectOptions(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + let params = { ...this.sf.value }; + if (params.createTime) { + params.createTime = { start: this.sf?.value?.createTime?.[0], end: this.sf?.value?.createTime?.[1] }; + } + Object.assign(requestOptions.body, params); + } + return requestOptions; + }; + + loadSelectOptions() { + this.service.getRebateConfig().subscribe(res => { + if (res) { + this.customers = res; + } + }); + this.service.getChannel().subscribe(res => { + if (res) { + this.cannels = res; + } + }); + } + + auditPartner(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: PartnerAuditModalComponent, + nzComponentParams: { info: { ...item, enterpriseName: item.enterpriseName || item.contactName }, sourcePage: '合伙人审核列表' }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + modal.destroy(); + }); + } + + editTemplateAction(item: any) { + this.selectItem = item; + this.templateId = item.templateId || null; + const modal = this.nzModalService.create({ + nzTitle: '修改返佣模板', + nzContent: this.editTemplate, + nzOnOk: () => { + if (!this.templateId) { + this.service.msgSrv.warning('请选择返佣模板'); + return false; + } + this.confirmEditTemplate(); + return false; + } + }); + } + + private confirmEditTemplate() { + const modal = this.nzModalService.confirm({ + nzTitle: '确定要修改返佣模板吗?', + nzOnOk: () => { + this.service + .request(this.service.$api_update_partner_template, { + id: this.selectItem.id, + templateId: this.templateId + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.st.load(1); + this.nzModalService.closeAll(); + } + }); + return false; + } + }); + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + editCannelAction(item: any) { + this.selectItem = item; + this.cannelItem = { channelId: null, effectiveNode: 1, enterpriseIdList: [], remark: '' }; + this.selectedRows = []; + // 校验合伙人是否可修改渠道销售 true:可以修改 false:不可以修改 + this.service.request(this.service.$api_check_partenr_change_channel, { id: item.id }).subscribe(res => { + if (res) { + this.selectItem = item; + const modal = this.nzModalService.create({ + nzTitle: '修改渠道销售', + nzWidth: 650, + nzContent: this.editCannel, + nzOnOk: () => { + if (!this.cannelItem.channelId) { + this.service.msgSrv.warning('请选择渠道销售'); + return false; + } + if (!this.cannelItem.remark) { + this.service.msgSrv.warning('请填写备注'); + return false; + } + this.confirmEditCannel(item); + return false; + } + }); + } + }); + } + + confirmEditCannel(item: any) { + const modal = this.nzModalService.confirm({ + nzTitle: '确定提交吗?', + nzOnOk: () => { + this.cannelItem.enterpriseIdList = this.selectedRows.map(row => row.id); + this.service + .request(this.service.$api_update_partner_channel_by_id, { + ...this.cannelItem, + id: item.id + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.nzModalService.closeAll(); + this.st.load(1); + } + }); + } + }); + } + + /** + * 重新发起crm + * @param item + */ + reSendCRM(item: any) { + const modal = this.nzModalService.confirm({ + nzTitle: '是否确定重新发起CRM?', + nzOnOk: () => { + this.service + .request(this.service.$api_resend_crm, { + id: item.id + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('发起成功'); + } else { + this.service.msgSrv.warning('发起失败'); + } + this.st.load(1); + }); + } + }); + } + + routeTo(route: string) { + this.router.navigate([route]); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + enterpriseName: { + type: 'string', + title: '合伙人名称' + }, + contactName: { + type: 'string', + title: '企业管理员' + }, + contactMobile: { + type: 'string', + title: '手机号' + }, + channelId: { + type: 'string', + title: '渠道销售', + ui: { + widget: 'select', + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service.getChannel({ name: str }).toPromise(); + } else { + return of([]); + } + } + } as SFSelectWidgetSchema + }, + partnerType: { + type: 'string', + title: '类型', + enum: [ + { value: '', label: '全部' }, + { value: 1, label: '企业' }, + { value: 2, label: '个人' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + approvalStatus: { + type: 'string', + title: '认证审核状态', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'pay:mode' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + signStatus: { + type: 'string', + title: '签约状态', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'pay:mode' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + crmStatus: { + type: 'string', + title: 'CRM状态', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'pay:mode' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + paymo11de: { + type: 'string', + title: '注册渠道', + enum: [ + { value: '', label: '全部' }, + { value: 1, label: '合伙人注册' }, + { value: 2, label: '平台添加' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + templateId: { + type: 'string', + title: '返佣模板', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + lockedStatus: { + type: 'string', + title: '合伙人状态', + enum: [ + { value: '', label: '全部' }, + { value: 0, label: '启用' }, + { value: 1, label: '冻结' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + createTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { + title: '合伙人名称', + index: 'contactName', + width: 180 + }, + { title: '付款编码', index: 'payCode', width: 160 }, + { title: '邀请码', index: 'invitationCode', className: 'text-center', width: 130 }, + { title: '企业管理员', index: 'adminName', width: 150 }, + { title: '手机号', index: 'contactMobile', className: 'text-center', width: 150 }, + { title: '类型', index: 'partnerType', className: 'text-center', width: 130, type: 'enum', enum: { 1: '企业', 2: '个人' } }, + { title: '注册渠道', index: 'source', type: 'enum', enum: { 1: '合伙人注册', 2: '平台添加' }, width: 130 }, + { title: '注册时间', index: 'createTime', className: 'text-center', width: 170 }, + { title: '渠道销售', index: 'channelIdLabel', width: 170 }, + { title: '返佣模板', index: 'templateName', width: 150 }, + { + title: '认证审核状态', + index: 'approvalStatus', + width: 150, + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 10: { text: '待审核', color: 'processing' }, + 20: { text: '审核通过', color: 'success' }, + 30: { text: '驳回', color: 'error' } + } + }, + { + title: '签约状态', + index: 'signStatus', + width: 150, + type: 'badge', + badge: { + 0: { text: '未发起', color: 'default' }, + 10: { text: '待合伙人签约', color: 'default' }, + 15: { text: '签约中', color: 'processing' }, + 20: { text: '平台签约完成', color: 'success' }, + 30: { text: '驳回', color: 'error' } + } + }, + { + title: 'CRM状态', + index: 'crmStatus', + width: 150, + type: 'badge', + badge: { + 0: { text: '未发起', color: 'default' }, + 10: { text: '审核失败', color: 'error' }, + 20: { text: '审核通过', color: 'success' } + } + }, + { + title: '合伙人状态', + index: 'lockedStatus', + className: 'text-center', + width: 140, + type: 'badge', + badge: { + 0: { text: '启用', color: 'success' }, + 1: { text: '冻结', color: 'error' } + } + }, + { + title: '操作', + fixed: 'right', + width: '150px', + buttons: [ + { type: 'divider' }, + { + text: '审核', + iif: item => item.id && item.approvalStatus === 10, + click: item => this.auditPartner(item) + }, + { + text: '详情
    ', + iif: item => item.id, + click: item => { + if (item.partnerType === 1) { + this.router.navigate([`/partner/partner-list/etp-detail/${item.id}`]); + } else { + this.router.navigate([`/partner/partner-list/personal-detail/${item.id}`]); + } + } + }, + { + text: '修改返佣模板', + iif: item => item.id, + click: item => this.editTemplateAction(item) + }, + { + text: '修改渠道销售', + iif: item => item.id, + click: item => this.editCannelAction(item) + }, + { + text: '重发CRM流程', + click: item => item.id && this.reSendCRM(item), + iif: item => item.crmStatus === 10 + } + ] + } + ]; + } +} diff --git a/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.html b/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.html new file mode 100644 index 00000000..fc8043d6 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.html @@ -0,0 +1,7 @@ +
    + +
    + \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.less b/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.ts b/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.ts new file mode 100644 index 00000000..f6fbcaac --- /dev/null +++ b/src/app/routes/partner/partner-list/components/partner-audit-modal/partner-audit-modal.component.ts @@ -0,0 +1,132 @@ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFValue } from '@delon/form'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { PartnerListService } from '../../services/partner-list.service'; + +@Component({ + selector: 'app-partner-audit-modal', + templateUrl: './partner-audit-modal.component.html', + styleUrls: ['./partner-audit-modal.component.less'] +}) +export class PartnerAuditModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @Input() + info: any; + schema!: SFSchema; + sourcePage = ''; + constructor(private nzModalService: NzModalService, public service: PartnerListService) {} + + ngOnInit(): void { + this.initSF(this.info); + } + + initSF(user: any) { + this.schema = { + properties: { + isPass: { + type: 'boolean', + ui: { + hidden: true + }, + default: this.info.isPass + }, + staffName: { + title: '合伙人名称', + type: 'string', + ui: { widget: 'text' }, + default: user.enterpriseName + }, + status: { + title: '审核结果', + type: 'string', + maxLength: 11, + enum: [ + { value: true, label: '通过' }, + { value: false, label: '驳回' } + ], + ui: { + widget: 'radio', + hidden: this.info.isPass !== undefined + }, + default: true + }, + channelId: { + title: '渠道销售', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getChannel(), + hidden: this.info.isPass === false, + visibleIf: { + status: value => value + }, + errors: { + required: ' ' + } + }, + default: '' + }, + approvalOpinion: { + title: '备注', + type: 'string', + maxLength: 100, + ui: { + widget: 'textarea', + placeholder: '请不要超过100个字', + autosize: { minRows: 3 }, + hidden: this.info.isPass === true, + visibleIf: { + status: value => !value || this.info.isPass === false + }, + errors: { + required: ' ' + } + } + } + }, + required: ['channelId', 'approvalOpinion'] + }; + } + + sure() { + if (this.info.isPass || this.sf.value.status) { + this.nzModalService.confirm({ + nzTitle: `确定以“${this.info.channelIdLabel}”的名义重新发起CRM《付款对象合同管理》吗?`, + nzOnOk: () => { + this.audit(); + } + }); + } else { + this.audit(); + } + } + + audit() { + const params: any = { + ...this.sf.value, + id: this.info.id, + auditStatusEnum: this.info.isPass || this.sf.value.status ? '20' : '30' + }; + this.service + .request(this.service.$api_audit_partner, { + ...params, + auditStatusEnum: params.auditStatusEnum, + id: params.id, + approvalOpinion: params.approvalOpinion, + sourcePage: this.sourcePage + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('审核成功!'); + this.close(); + } + }); + } + + close() { + this.nzModalService.closeAll(); + } +} diff --git a/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.html b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.html new file mode 100644 index 00000000..1606454d --- /dev/null +++ b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + 企业管理员信息 + + + + + + {{detailData.adminUserInfo.mobile}} + + + + + +
    + + + + +
    +
    + + + + - + + + + + + + + + +
    + + + + + + + + +

    + 四要素验证: + + + +

    +
    + + + {{detailData.enterpriseName}} + + + + {{detailData.unifiedSocialCreditCode}} + + + + + + + + + + - + + + + + + + + + +
    + + + 企业法人信息 + + + + + + + + + - + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + {{ enterpriseDefaultCityName || '-' }} + + +
    + + + 渠道销售信息 + {{ detailData?.channelName }} + {{ detailData?.channelMobile }} + {{ detailData?.bindChannelTime }} + +
    + + + + 修改渠道销售记录 + + + + + + + + +
    + +
    {{ title }} +
    +
    + {{ content }} +
    +
    +
    + + + + + +
    上传
    +
    +
    + + +
    +
    +
    diff --git a/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.less b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.less new file mode 100644 index 00000000..be442cbc --- /dev/null +++ b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.less @@ -0,0 +1,37 @@ +@import '../../../../usercenter/less/edit.less'; + + +.user-info { + font-size: 16px; + + .enterprise-name { + margin-right: 15px; + } + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + .user-info-des { + margin-bottom: 5px; + } +} + +:host::ng-deep { + .affix { + position: fixed !important; + top : 20px !important; + z-index : 999 !important; + width : 100% !important; + } + + .image-hover .delete-icon { + top : unset !important; + right : unset !important; + margin-top : -15px; + margin-left: -15px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.ts b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.ts new file mode 100644 index 00000000..80a9aa45 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/partner-detail/partner-detail.component.ts @@ -0,0 +1,379 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn } from '@delon/abc/st'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzFormatEmitEvent, NzTreeNode, NzTreeNodeOptions } from 'ng-zorro-antd/tree'; +import { NzTreeSelectComponent } from 'ng-zorro-antd/tree-select'; +import { Subscription, fromEvent } from 'rxjs'; + +import { PartnerListService } from '../../services/partner-list.service'; +import { ChannelLogModalComponent } from '../channel-log-modal/channel-log-modal.component'; +import { PartnerAuditModalComponent } from '../partner-audit-modal/partner-audit-modal.component'; + +@Component({ + selector: 'app-partner-detail', + templateUrl: './partner-detail.component.html', + styleUrls: ['./partner-detail.component.less'], + providers: [DatePipe] +}) +export class PartnerDetailComponent implements OnInit, OnDestroy { + @ViewChild('areaTreeSelect') + areaTreeSelect!: NzTreeSelectComponent; + + columns: STColumn[] = this.initST(); + + detailData: any = { adminUserInfo: { name: '' }, legalPersonIdentity: { name: '' } }; + tempalateData = { ...this.detailData }; + + isEdit = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + enterpriseAddressCode: string[] = []; + enterpriseDefaultAddressCode: string[] = []; + enterpriseDefaultCityName: string = ''; + areaList = []; + + esignCheckStatus: any = { + 0: '不通过', + 1: '通过', + 2: '未认证' + }; + + scrollTop = 0; + subscribeScoll!: Subscription; + constructor( + public service: PartnerListService, + public route: ActivatedRoute, + private nzModalService: NzModalService, + private datePipe: DatePipe + ) {} + ngOnDestroy(): void { + this.subscribeScoll.unsubscribe(); + } + + ngOnInit() { + this.initData(); + this.loadlAreaList(); + this.subscribeScoll = fromEvent(window, 'scroll').subscribe(event => { + this.scrollTop = document.documentElement.scrollTop; + }); + } + + loadlAreaList() { + this.service.request(this.service.$api_get_region_by_code, { regionCode: '' }).subscribe(res => { + if (res) { + this.areaList = res.map((item: any) => ({ + ...item, + isLeaf: false, + title: item.name, + key: item.regionCode.toString(), + disabled: true, + isDisableCheckbox: true + })); + } + }); + } + + initData() { + this.service + .request(this.service.$api_get_ent_partner_detail, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.detailData = res; + // 存储数据源 + this.tempalateData = { ...this.detailData }; + // 拼接所属城市 + if (this.detailData?.cityCodesList?.length > 0) { + this.enterpriseAddressCode = (this.detailData?.cityCodesList as any[]).map(city => city.cityCode); + this.enterpriseDefaultCityName = (this.detailData?.cityCodesList as any[]).map(city => city.cityName).join('、'); + this.enterpriseDefaultAddressCode = [ + ...new Set((this.detailData?.cityCodesList as any[]).map(city => city.provinceCode)) + ]; + } + // 拼接渠道销售信息 + if (this.detailData?.channelIdLabel) { + const channel = (this.detailData.channelIdLabel as string).split('/'); + Object.assign(this.detailData, { + channelName: channel[0], + channelMobile: channel[1] + }); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_lock_freight, { + appUserId: [this.detailData.appUserId], + freezeOrResume: !!type, + pageName: '合伙人详情', + telephone: this.detailData.adminUserInfo.mobile + }) + .subscribe(res => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else { + this.service.msgSrv.success(`冻结成功!`); + } + this.initData(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + auditPartner(isPass: boolean) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: PartnerAuditModalComponent, + nzComponentParams: { info: { ...this.detailData, isPass }, sourcePage: '合伙人审核详情' }, + nzFooter: null + }); + } + + ratify() { + this.isEdit = true; + // 搜索展开省份并选中节点 + setTimeout(() => { + if (this.enterpriseDefaultAddressCode?.length > 0 && this.areaTreeSelect) { + this.enterpriseDefaultAddressCode.forEach(code => { + const node = this.areaTreeSelect.getTreeNodeByKey(code); + if (node) { + node.setExpanded(true); + this.onExpandChange(node); + } + }); + } + }, 500); + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string, id: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + if (id === 'legalFront' || id === 'legalBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'legalFront' ? 'front' : 'back', 1); + } + if (id === 'certificateBackFront' || id === 'certificateBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'certificateBackFront' ? 'front' : 'back', 0); + } + if (id === 'detailPhoto') { + this.checkBusinessLicense(file.response.data?.fullFilePath); + } + } + } + + onExpandChange(node: NzTreeNode | null | undefined): void { + if (node && node.getChildren().length === 0 && node.isExpanded) { + this.loadRegionData(node).then(data => { + node.addChildren(data); + // 更新选中数据 + this.areaTreeSelect.updateSelectedNodes(true); + // 修改子节点选中状态 + const children = node.getChildren(); + if (children?.length > 0) { + children.forEach(childNode => { + if (this.enterpriseAddressCode.find(area => area === childNode.key)) { + childNode.setChecked(true); + } + }); + } + }); + } + } + + /** + * 级联获取地区数据 + * + * @param node 节点 + * @param index 层级 + * @returns + */ + loadRegionData(node: NzTreeNode): Promise { + let rs: any[] = []; + return new Promise(resolve => { + this.service.request(this.service.$api_get_region_by_code, { regionCode: node?.origin.regionCode || '' }).subscribe( + res => { + rs = res.map((item: any) => ({ + ...item, + isLeaf: true, + title: item.name, + key: item.regionCode.toString(), + isSelectable: true, + isSelected: true, + isChecked: true + })); + }, + _ => {}, + () => { + resolve(rs); + } + ); + }); + } + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save() { + if (this.enterpriseAddressCode?.length > 3) { + this.service.msgSrv.warning('所属城市不能超过3个'); + return; + } + const dateil = { ...this.detailData }; + Object.assign(dateil.legalPersonIdentity, { + validStartTime: this.datePipe.transform(dateil.legalPersonIdentity.validStartTime, 'yyyy-MM-dd'), + validEndTime: this.datePipe.transform(dateil.legalPersonIdentity.validEndTime, 'yyyy-MM-dd') + }); + Object.assign(dateil.adminUserInfo, { + validStartTime: this.datePipe.transform(dateil.adminUserInfo.validStartTime, 'yyyy-MM-dd'), + validEndTime: this.datePipe.transform(dateil.adminUserInfo.validEndTime, 'yyyy-MM-dd') + }); + const params = {}; + Object.assign(params, { + ...dateil, + cityCodesList: this.enterpriseAddressCode, + enterpriseRegistrationTime: this.datePipe.transform(dateil.enterpriseRegistrationTime, 'yyyy-MM-dd'), + operatingEndTime: this.datePipe.transform(dateil.operatingEndTime, 'yyyy-MM-dd'), + operatingStartTime: this.datePipe.transform(dateil.operatingStartTime, 'yyyy-MM-dd') + }); + + this.service.request(this.service.$api_save_entp_partner, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('企业合伙人修改成功'); + this.initData(); + this.isEdit = false; + } + }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + if (type === 1) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.detailData.legalPersonIdentity.name = res.name; + } + if (res.number) { + this.detailData.legalPersonIdentity.certificateType = 0; + this.detailData.legalPersonIdentity.certificateNumber = res.number; + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.detailData.legalPersonIdentity.validStartTime = res.validFrom; + } + if (res.validTo) { + this.detailData.legalPersonIdentity.validEndTime = res.validTo; + } else { + this.detailData.legalPersonIdentity.validEndTime = null; + } + } + } + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.detailData.adminUserInfo.name = res.name; + } + if (res.number) { + this.detailData.adminUserInfo.certificateNumber = res.number; + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.detailData.adminUserInfo.validStartTime = res.validFrom; + } + if (res.validTo) { + this.detailData.adminUserInfo.validEndTime = res.validTo; + } + } + } + } + }); + } + + // 识别营业执照 + checkBusinessLicense(imgurl: any) { + this.service.request(this.service.$api_ocr_recognize_business_license, { businessLicenseUrl: imgurl }).subscribe(res => { + if (res) { + // if (res.registrationNumber) { + // this.detailData.unifiedSocialCreditCode = res.registrationNumber; + // } + // if (res.name) { + // this.detailData.enterpriseName = res.name; + // } + if (res.businessTermStartDate) { + this.detailData.operatingStartTime = res.businessTermStartDate; + } + if (res.businessTermEndDate) { + this.detailData.operatingEndTime = res.businessTermEndDate; + } else { + this.detailData.operatingEndTime = null; + } + } + }); + } + + private initST(): STColumn[] { + return [ + { title: '修改后渠道销售', index: 'newChannelIdLabel', width: 180 }, + { title: '修改前渠道销售', index: 'originalChannelIdLabel', width: 160 }, + { title: '转移客户数', index: 'quantity', className: 'text-center', width: 130 }, + { title: '生效节点', index: 'effectiveNode', width: 150, type: 'enum', enum: { 1: '立即生效', 2: 'CRM审核后生效' } }, + { title: '备注', index: 'remark', className: 'text-center', width: 150 }, + { title: '修改时间', index: 'effectiveTime', className: 'text-center', width: 180, type: 'date' }, + { title: '操作人', index: 'modifyUserIdLabel', width: 180 }, + { + title: '操作', + fixed: 'right', + width: '140px', + buttons: [ + { + text: '详情', + click: (item) => this.service.showChangeDetail(item.id) + } + ] + } + ]; + } +} diff --git a/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.html b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.html new file mode 100644 index 00000000..87573d13 --- /dev/null +++ b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.html @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + 合伙人信息 + + + + + + {{detailData.adminUserInfo.mobile}} + + + + + + + + - + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + {{ enterpriseDefaultCityName || '-' }} + + +
    + + + 渠道销售信息 + {{ detailData?.channelName }} + {{ detailData?.channelMobile }} + {{ detailData?.bindChannelTime }} + +
    + + + + 修改渠道销售记录 + + + + + + + + +
    + +
    {{ title }} +
    +
    + {{ content }} +
    +
    +
    + + + + + +
    上传
    +
    +
    + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.less b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.less new file mode 100644 index 00000000..be442cbc --- /dev/null +++ b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.less @@ -0,0 +1,37 @@ +@import '../../../../usercenter/less/edit.less'; + + +.user-info { + font-size: 16px; + + .enterprise-name { + margin-right: 15px; + } + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + .user-info-des { + margin-bottom: 5px; + } +} + +:host::ng-deep { + .affix { + position: fixed !important; + top : 20px !important; + z-index : 999 !important; + width : 100% !important; + } + + .image-hover .delete-icon { + top : unset !important; + right : unset !important; + margin-top : -15px; + margin-left: -15px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.ts b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.ts new file mode 100644 index 00000000..ab33519c --- /dev/null +++ b/src/app/routes/partner/partner-list/components/personal-partner-detail/personal-partner-detail.component.ts @@ -0,0 +1,301 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn } from '@delon/abc/st'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzTreeNode, NzTreeNodeOptions } from 'ng-zorro-antd/tree'; +import { NzTreeSelectComponent } from 'ng-zorro-antd/tree-select'; +import { Subscription, fromEvent } from 'rxjs'; + +import { PartnerListService } from '../../services/partner-list.service'; +import { PartnerAuditModalComponent } from '../partner-audit-modal/partner-audit-modal.component'; + +@Component({ + selector: 'app-personal-partner-detail', + templateUrl: './personal-partner-detail.component.html', + styleUrls: ['./personal-partner-detail.component.less'], + providers: [DatePipe] +}) +export class PersonalPartnerDetailComponent implements OnInit { + @ViewChild('areaTreeSelect') + areaTreeSelect!: NzTreeSelectComponent; + + columns: STColumn[] = this.initST(); + + detailData: any = { adminUserInfo: { name: '' }, legalPersonIdentity: { name: '' } }; + tempalateData = { ...this.detailData }; + + isEdit = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + enterpriseAddressCode: string[] = []; + enterpriseDefaultAddressCode: string[] = []; + enterpriseDefaultCityName: string = ''; + areaList = []; + + constructor( + public service: PartnerListService, + public route: ActivatedRoute, + private nzModalService: NzModalService, + private datePipe: DatePipe + ) {} + + ngOnInit() { + this.initData(); + this.loadlAreaList(); + } + + loadlAreaList() { + this.service.request(this.service.$api_get_region_by_code, { regionCode: '' }).subscribe(res => { + if (res) { + this.areaList = res.map((item: any) => ({ + ...item, + isLeaf: false, + title: item.name, + key: item.regionCode.toString(), + disabled: true, + isDisableCheckbox: true + })); + } + }); + } + + initData() { + this.service + .request(this.service.$api_get_personal_partner_detail, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.detailData = res; + console.log(this.detailData); + + this.tempalateData = { ...this.detailData }; + // 拼接所属城市 + if (this.detailData?.cityCodesList?.length > 0) { + this.enterpriseAddressCode = (this.detailData?.cityCodesList as any[]).map(city => city.cityCode); + this.enterpriseDefaultCityName = (this.detailData?.cityCodesList as any[]).map(city => city.cityName).join('、'); + this.enterpriseDefaultAddressCode = [ + ...new Set((this.detailData?.cityCodesList as any[]).map(city => city.provinceCode)) + ]; + } + if (this.detailData?.channelIdLabel) { + const channel = (this.detailData.channelIdLabel as string).split('/'); + Object.assign(this.detailData, { + channelName: channel[0], + channelMobile: channel[1] + }); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_lock_freight, { + appUserId: [this.detailData.appUserId], + freezeOrResume: !!type, + pageName: '合伙人详情', + telephone: this.detailData.adminUserInfo.mobile + }) + .subscribe(res => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else { + this.service.msgSrv.success(`冻结成功!`); + } + this.initData(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + auditPartner(isPass: boolean) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: PartnerAuditModalComponent, + nzComponentParams: { + info: { ...this.detailData, isPass, enterpriseName: this.detailData.adminUserInfo?.name }, + sourcePage: '合伙人审核详情' + }, + nzFooter: null + }); + } + + ratify() { + this.isEdit = true; + // 搜索展开省份并选中节点 + setTimeout(() => { + if (this.enterpriseDefaultAddressCode?.length > 0 && this.areaTreeSelect) { + this.enterpriseDefaultAddressCode.forEach(code => { + const node = this.areaTreeSelect.getTreeNodeByKey(code); + if (node) { + node.setExpanded(true); + this.onExpandChange(node); + } + }); + } + }, 500); + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string, id: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + if (id === 'legalFront' || id === 'legalBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'legalFront' ? 'front' : 'back'); + } + } + } + + onExpandChange(node: NzTreeNode | null | undefined): void { + if (node && node.getChildren().length === 0 && node.isExpanded) { + this.loadRegionData(node).then(data => { + node.addChildren(data); + // 更新选中数据 + this.areaTreeSelect.updateSelectedNodes(true); + // 修改子节点选中状态 + const children = node.getChildren(); + if (children?.length > 0) { + children.forEach(childNode => { + if (this.enterpriseAddressCode.find(area => area === childNode.key)) { + childNode.setChecked(true); + } + }); + } + }); + } + } + + /** + * 级联获取地区数据 + * + * @param node 节点 + * @param index 层级 + * @returns + */ + loadRegionData(node: NzTreeNode): Promise { + let rs: any[] = []; + return new Promise(resolve => { + this.service.request(this.service.$api_get_region_by_code, { regionCode: node?.origin.regionCode || '' }).subscribe( + res => { + rs = res.map((item: any) => ({ + ...item, + isLeaf: true, + title: item.name, + key: item.regionCode.toString(), + isSelectable: true, + isSelected: true, + isChecked: true + })); + }, + _ => {}, + () => { + resolve(rs); + } + ); + }); + } + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save() { + if (this.enterpriseAddressCode?.length > 3) { + this.service.msgSrv.warning('所属城市不能超过3个'); + return; + } + const dateil = { ...this.detailData, cityCodesList: this.enterpriseAddressCode }; + Object.assign(dateil.adminUserInfo, { + validStartTime: this.datePipe.transform(dateil.adminUserInfo.validStartTime, 'yyyy-MM-dd'), + validEndTime: this.datePipe.transform(dateil.adminUserInfo.validEndTime, 'yyyy-MM-dd') + }); + + this.service.request(this.service.$api_save_personal_partner, dateil).subscribe(res => { + if (res) { + this.service.msgSrv.success('个人合伙人修改成功'); + this.initData(); + this.isEdit = false; + } + }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + // 企业管理员证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.detailData.adminUserInfo.name = res.name; + } + if (res.number) { + this.detailData.adminUserInfo.certificateNumber = res.number; + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.detailData.adminUserInfo.validStartTime = res.validFrom; + } + if (res.validTo) { + this.detailData.adminUserInfo.validEndTime = res.validTo; + } + } + } + }); + } + + private initST(): STColumn[] { + return [ + { title: '修改后渠道销售', index: 'newChannelIdLabel', width: 180 }, + { title: '修改前渠道销售', index: 'originalChannelIdLabel', width: 160 }, + { title: '转移客户数', index: 'quantity', className: 'text-center', width: 130 }, + { title: '生效节点', index: 'effectiveNode', width: 150, type: 'enum', enum: { 1: '立即生效', 2: 'CRM审核后生效' } }, + { title: '备注', index: 'remark', className: 'text-center', width: 150 }, + { title: '修改时间', index: 'effectiveTime', className: 'text-center', width: 180, type: 'date' }, + { title: '操作人', index: 'modifyUserIdLabel', width: 180 }, + { + title: '操作', + fixed: 'right', + width: '140px', + buttons: [ + { + text: '详情', + click: item => this.service.showChangeDetail(item.id) + } + ] + } + ]; + } +} diff --git a/src/app/routes/partner/partner-list/services/partner-list.service.ts b/src/app/routes/partner/partner-list/services/partner-list.service.ts new file mode 100644 index 00000000..22151e83 --- /dev/null +++ b/src/app/routes/partner/partner-list/services/partner-list.service.ts @@ -0,0 +1,75 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService, EACacheService, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { ChannelLogModalComponent } from '../components/channel-log-modal/channel-log-modal.component'; + +@Injectable() +export class PartnerListService extends ShipperBaseService { + $mock_url = '/rule?_allow_anonymous=true'; + + // 查询合伙人信息-分页 + $api_get_partner_page = '/api/mdc/partner/list/page'; + // 新增/更新保存企业合伙人信息 + $api_save_entp_partner = '/api/mdc/partner/saveEnterprise'; + // 新增/更新个人合伙人信息 + $api_save_personal_partner = '/api/mdc/partner/savePersonally'; + // 获取企业合伙人信息 + $api_get_ent_partner_detail = '/api/mdc/partner/getEnterprise'; + // 获取合伙人信息 + $api_get_personal_partner_detail = '/api/mdc/partner/getPersonally'; + // 审核合伙人 + $api_audit_partner = '/api/mdc/partner/audit'; + // 修改返佣模板 + $api_update_partner_template = '/api/mdc/partner/updateTemplate'; + // 更新渠道销售 + $api_update_partner_channel = '/api/mdc/partner/updateChannelSale'; + // 更新渠道销售 + $api_update_partner_channel_by_id = '/api/mdc/partner/updateChannelSaleByID'; + // 重新发起CRM + $api_resend_crm = '/api/mdc/partner/reSendCrm'; + // 查询合伙人修改渠道渠道销售记录 + $api_get_personal_channel_list = '/api/mdc/partnerChannelRelLog/list/page'; + // 查询客户关系列表-不分页 + $api_get_enterprice_rel_list = '/api/mdc/EnterpriseRelLog/list'; + // 校验合伙人是否可修改渠道销售 true:可以修改 false:不可以修改 + $api_check_partenr_change_channel = '/api/mdc/partner/updateChannelCheck'; + // 根据手机号查询实名信息 + $api_get_identityInfo_by_mobile = '/api/mdc/cuc/identityInfo/getByMobile'; + // 渠道销售修改详情 + $api_get_partner_change_list = '/api/mdc/partnerChannelRelLog/partnerChannelUpdateDetaiList'; + // 冻结/启用企业业 + $api_lock_freight = '/api/mdc/cuc/userApp/freezeOrResume'; + + // 根据地区code查询列表 + $api_get_region_by_code = '/api/mdc/pbc/region/getRegionByCode'; + // 根据地区code查询地区详情 + $api_get_region_detail_by_code = '/api/mdc/pbc/region/getRegionDetailByCode'; + // 营业执照识别 + $api_ocr_recognize_business_license = '/api/mdc/pbc/hwc/ocr/recognizeBusinessLicense'; + // 身份证识别 + $api_ocr_recognize_id_card = '/api/mdc/pbc/hwc/ocr/recognizeIdCard'; + + constructor(public injector: Injector, private nzModalService: NzModalService) { + super(injector); + } + + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + showChangeDetail(id: string) { + const modal = this.nzModalService.create({ + nzTitle: '详情', + nzContent: ChannelLogModalComponent, + nzComponentParams: { id }, + nzNoAnimation: true, + nzWidth: 800, + nzFooter: null + }); + } +} diff --git a/src/app/routes/partner/partner-routing.module.ts b/src/app/routes/partner/partner-routing.module.ts new file mode 100644 index 00000000..8c979b66 --- /dev/null +++ b/src/app/routes/partner/partner-routing.module.ts @@ -0,0 +1,171 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-02-24 15:07:57 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-11 15:22:36 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\partner\\partner-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { PartnerAccountManagementAccountDetailComponent } from './account-management/components/account-detail/account-detail.component'; +import { PartnerAccountManagementListComponent } from './account-management/components/list/list.component'; +import { PartnerAccountManagementRecordedDetailComponent } from './account-management/components/recorded-detail/recorded-detail.component'; +import { PartnerBusinessStatisticsIndexComponent } from './business-statistics/components/index/index.component'; +import { PartnerPartnerCustomDetailComponent } from './business-statistics/components/partner-custom-detail/partner-custom-detail.component'; +import { PartnerPartnerCustomOrderDetailComponent } from './business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component'; +import { PartnerPartnerOrderDetailComponent } from './business-statistics/components/partner-order-detail/partner-order-detail.component'; +import { PartnerSaleCustomDetailComponent } from './business-statistics/components/sale-custom-detail/sale-custom-detail.component'; +import { PartnerSalePartnerDetailComponent } from './business-statistics/components/sale-partner-detail/sale-partner-detail.component'; +import { ParterChannelSalesEditComponent } from './channel-sales/components/edit/edit.component'; +import { ParterChannelSalesListComponent } from './channel-sales/components/list/list.component'; +import { ParterClaimAuditListChannelDetailComponent } from './claim-audit/components/channel-detail/channel-detail.component'; +import { ParterClaimAuditListComponent } from './claim-audit/components/list/list.component'; +import { ParterClaimAuditListPartnerDetailComponent } from './claim-audit/components/partner-detail/partner-detail.component'; +import { ParterLevelConfigEditComponent } from './level-config/components/edit/edit.component'; +import { ParterLevelConfigListComponent } from './level-config/components/list/list.component'; +import { PartnerDetailComponent } from './partner-list/components/partner-detail/partner-detail.component'; +import { ParterRebateManageMentParticularsComponent } from './rebate-management/components/particulars/particulars.component'; +import { ParterRebateManageMentRecordComponent } from './rebate-management/components/rebate-record/rebate-record.component'; +import { PartnerAccountManagementWithdrawalsRecordComponent } from './account-management/components/withdrawals-record/withdrawals-record.component'; +import { PartnerAccountManagementWithdralDetailComponent } from './account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; +import { ParterRebateManageMentAddComponent } from './rebate-management/components/rebate-setting/add/add.component'; +import { ParterRebateManageMentSettingComponent } from './rebate-management/components/rebate-setting/rebate-setting.component'; +import { PartnerRecordedDetailComponent } from './recorded/components/detail/detail.component'; +import { PartnerRecordedRecordComponent } from './recorded/components/record/record.component'; +import { AddEtpPartnerComponent } from './partner-list/components/add-etp-partner/add-etp-partner.component'; +import { AddPersonalPartnerComponent } from './partner-list/components/add-personal-partner/add-personal-partner.component'; +import { PartnerListComponent } from './partner-list/components/index/partner-list.component'; +import { PartnerKnowledgeClassificationListComponent } from './knowledge/classification/components/list/list.component'; +import { ParterArticleManagementListComponent } from './article-management/components/list/list.component'; +import { ParterArticleManagementEditComponent } from './article-management/components/edit/edit.component'; +import { ScrollimgComponentsAddComponent } from './scrollimg/components/add/add.component'; +import { ScrollImgComponentsListComponent } from './scrollimg/components/list/list.component'; +import { BannerComponentsListComponent } from './knowledge/banner/components/list/list.component'; +import { BannerComponentsAddComponent } from './knowledge/banner/components/add/add.component'; +import { PersonalPartnerDetailComponent } from './partner-list/components/personal-partner-detail/personal-partner-detail.component'; +import { ParterAdviceFeedbackListComponent } from './advice-feedback/components/list/list.component'; +import { ParterAdviceFeedbackDetailComponent } from './advice-feedback/components/feedback-detail/feedback-detail.component'; + +const routes: Routes = [ + { + path: 'business-statistics', + children: [ + { path: '', redirectTo: 'index' }, + { path: 'index', component: PartnerBusinessStatisticsIndexComponent }, + { path: 'partner/order-detail/:id', component: PartnerPartnerOrderDetailComponent }, + { path: 'partner/custom-detail/:id', component: PartnerPartnerCustomDetailComponent }, + { path: 'partner/custom-order-detail/:id', component: PartnerPartnerCustomOrderDetailComponent }, + { path: 'sale/custom-detail/:id', component: PartnerSaleCustomDetailComponent }, + { path: 'sale/partner-detail/:id', component: PartnerSalePartnerDetailComponent } + ] + }, + { + path: 'channel-sales', + children: [ + { path: '', component: ParterChannelSalesListComponent }, + { path: 'list', component: ParterChannelSalesListComponent }, + { path: 'edit', component: ParterChannelSalesEditComponent } + ] + }, + { + path: 'level-config', + children: [ + { path: '', component: ParterLevelConfigListComponent }, + { path: 'list', component: ParterLevelConfigListComponent }, + { path: 'edit', component: ParterLevelConfigEditComponent } + ] + }, + { + path: 'rebate', + children: [ + { path: 'particulars', component: ParterRebateManageMentParticularsComponent }, + { path: 'record', component: ParterRebateManageMentRecordComponent }, + { path: 'setting', component: ParterRebateManageMentSettingComponent }, + { path: 'setting/add/:id', component: ParterRebateManageMentAddComponent } + ] + }, + { + path: 'account-management', + children: [ + { + path: 'am', + children: [ + { path: '', redirectTo: 'list' }, + { path: 'list', component: PartnerAccountManagementListComponent }, + { path: 'detail/:id', component: PartnerAccountManagementAccountDetailComponent }, + { path: 'recorded/detail/:id', component: PartnerAccountManagementRecordedDetailComponent } + ] + }, + { + path: 'withdraw-record', + children: [ + { path: '', redirectTo: 'list' }, + { path: 'list', component: PartnerAccountManagementWithdrawalsRecordComponent }, + { path: 'detail/:id', component: PartnerAccountManagementWithdralDetailComponent } + ] + } + ] + }, + { + path: 'partner-list', + children: [ + { path: '', component: PartnerListComponent }, + { path: 'etp-detail/:id', component: PartnerDetailComponent }, + { path: 'personal-detail/:id', component: PersonalPartnerDetailComponent }, + { path: 'add-etp-partner', component: AddEtpPartnerComponent }, + { path: 'add-personal-partner', component: AddPersonalPartnerComponent } + ] + }, + { + path: 'claim-audit', + children: [ + { path: '', component: ParterClaimAuditListComponent }, + { path: 'list', component: ParterClaimAuditListComponent }, + { path: 'channel-detail', component: ParterClaimAuditListChannelDetailComponent }, + { path: 'partner-detail', component: ParterClaimAuditListPartnerDetailComponent } + ] + }, + { + path: 'scrollimg', + children: [ + { path: '', component: ScrollImgComponentsListComponent }, + { path: 'list', component: ScrollImgComponentsListComponent }, + { path: 'detail', component: ScrollimgComponentsAddComponent } + ] + }, + { + path: 'advice-feedback', + children: [ + { path: '', component: ParterAdviceFeedbackListComponent }, + { path: 'list', component: ParterAdviceFeedbackListComponent }, + { path: 'detail', component: ParterAdviceFeedbackDetailComponent } + ] + }, + { + path: 'recorded', + children: [ + { path: 'record', component: PartnerRecordedRecordComponent }, + { path: 'record/detail/:id', component: PartnerRecordedDetailComponent } + ] + }, + { + path: 'knowledge', + children: [ + { path: 'classification', component: PartnerKnowledgeClassificationListComponent }, + { path: 'article-management-list', component: ParterArticleManagementListComponent }, + { path: 'article-management-add', component: ParterArticleManagementEditComponent }, + { path: 'article-management-edit', component: ParterArticleManagementEditComponent }, + { path: 'banner', component: BannerComponentsListComponent }, + { path: 'banner/detail', component: BannerComponentsAddComponent } + ] + } +]; +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class PartnerRoutingModule {} diff --git a/src/app/routes/partner/partner.module.ts b/src/app/routes/partner/partner.module.ts new file mode 100644 index 00000000..3255e0c1 --- /dev/null +++ b/src/app/routes/partner/partner.module.ts @@ -0,0 +1,126 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-09 14:34:55 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-11 15:28:01 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\partner\\partner.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { PartnerAccountManagementAccountDetailComponent } from './account-management/components/account-detail/account-detail.component'; +import { PartnerAccountManagementListComponent } from './account-management/components/list/list.component'; +import { PartnerAccountManagementRecordedDetailComponent } from './account-management/components/recorded-detail/recorded-detail.component'; +import { PartnerAccountManagementVirtualAccountDetailComponent } from './account-management/components/virtual-account-detail/virtual-account-detail.component'; +import { PartnerAccountManagementWithdralDetailComponent } from './account-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; +import { PartnerAccountManagementWithdrawalsRecordComponent } from './account-management/components/withdrawals-record/withdrawals-record.component'; +import { PartnerBusinessStatisticsIndexComponent } from './business-statistics/components/index/index.component'; +import { PartnerPartnerCustomDetailComponent } from './business-statistics/components/partner-custom-detail/partner-custom-detail.component'; +import { PartnerPartnerCustomOrderDetailComponent } from './business-statistics/components/partner-custom-order-detail/partner-custom-order-detail.component'; +import { PartnerPartnerOrderDetailComponent } from './business-statistics/components/partner-order-detail/partner-order-detail.component'; +import { PartnerPartnerStatisticsComponent } from './business-statistics/components/partner-statistics/partner-statistics.component'; +import { PartnerSaleCustomDetailComponent } from './business-statistics/components/sale-custom-detail/sale-custom-detail.component'; +import { PartnerSalePartnerDetailComponent } from './business-statistics/components/sale-partner-detail/sale-partner-detail.component'; +import { PartnerSaleStatisticsComponent } from './business-statistics/components/sale-statistics/sale-statistics.component'; +import { ParterChannelSalesEditComponent } from './channel-sales/components/edit/edit.component'; +import { ParterChannelSalesListComponent } from './channel-sales/components/list/list.component'; +import { ParterClaimAuditListChannelApproveComponent } from './claim-audit/components/channel-approve/channel-approve.component'; +import { ParterClaimAuditListChannelDetailComponent } from './claim-audit/components/channel-detail/channel-detail.component'; +import { ParterClaimAuditListChannelRejectComponent } from './claim-audit/components/channel-reject/channel-reject.component'; +import { ParterClaimAuditListComponent } from './claim-audit/components/list/list.component'; +import { ParterClaimAuditListPartnerApproveComponent } from './claim-audit/components/partner-approve/partner-approve.component'; +import { ParterClaimAuditListPartnerDetailComponent } from './claim-audit/components/partner-detail/partner-detail.component'; +import { ParterClaimAuditListPartnerRejectComponent } from './claim-audit/components/partner-reject/partner-reject.component'; +import { ParterLevelConfigEditComponent } from './level-config/components/edit/edit.component'; +import { ParterLevelConfigListComponent } from './level-config/components/list/list.component'; +import { PartnerListComponent } from './partner-list/components/index/partner-list.component'; +import { PartnerAuditModalComponent } from './partner-list/components/partner-audit-modal/partner-audit-modal.component'; +import { PartnerDetailComponent } from './partner-list/components/partner-detail/partner-detail.component'; +import { PartnerListService } from './partner-list/services/partner-list.service'; +import { PartnerRoutingModule } from './partner-routing.module'; +import { ParterRebateManageMentParticularsComponent } from './rebate-management/components/particulars/particulars.component'; +import { ParterRebateManageMentRecordComponent } from './rebate-management/components/rebate-record/rebate-record.component'; +import { ParterRebateManageMentSettingComponent } from './rebate-management/components/rebate-setting/rebate-setting.component'; +import { AddEtpPartnerComponent } from './partner-list/components/add-etp-partner/add-etp-partner.component'; +import { AddPersonalPartnerComponent } from './partner-list/components/add-personal-partner/add-personal-partner.component'; +import { ParterRebateManageMenAbnormalFeedbackComponent } from './rebate-management/model/abnormal-feedback/abnormal-feedback.component'; +import { PartnerRecordedDetailComponent } from './recorded/components/detail/detail.component'; +import { PartnerRecordedRecordComponent } from './recorded/components/record/record.component'; +import { ParterRebateManageMentAddComponent } from './rebate-management/components/rebate-setting/add/add.component'; +import { ParterArticleManagementEditComponent } from './article-management/components/edit/edit.component'; +import { ParterArticleManagementListComponent } from './article-management/components/list/list.component'; +import { PartnerKnowledgeClassificationListComponent } from './knowledge/classification/components/list/list.component'; +import { PartnerEditComponent } from './knowledge/classification/components/edit/edit.component'; +import { ScrollimgComponentsAddComponent } from './scrollimg/components/add/add.component'; +import { ScrollImgComponentsListComponent } from './scrollimg/components/list/list.component'; +import { BannerComponentsListComponent } from './knowledge/banner/components/list/list.component'; +import { BannerComponentsAddComponent } from './knowledge/banner/components/add/add.component'; +import { PersonalPartnerDetailComponent } from './partner-list/components/personal-partner-detail/personal-partner-detail.component'; +import { ParterAdviceFeedbackListComponent } from './advice-feedback/components/list/list.component'; +import { ParterAdviceFeedbackDetailComponent } from './advice-feedback/components/feedback-detail/feedback-detail.component'; +import { ParterRebateManageMentAddPartnerListComponent } from './rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component'; +import { ChannelLogModalComponent } from './partner-list/components/channel-log-modal/channel-log-modal.component'; + +const COMPONENTS: any[] = [ + PartnerBusinessStatisticsIndexComponent, + ParterChannelSalesListComponent, + ParterChannelSalesEditComponent, + ParterLevelConfigListComponent, + ParterLevelConfigEditComponent, + PartnerPartnerStatisticsComponent, + PartnerSaleStatisticsComponent, + PartnerPartnerCustomDetailComponent, + PartnerPartnerCustomDetailComponent, + PartnerSaleCustomDetailComponent, + ParterRebateManageMentParticularsComponent, + ParterRebateManageMentRecordComponent, + PartnerSalePartnerDetailComponent, + PartnerPartnerCustomOrderDetailComponent, + PartnerPartnerOrderDetailComponent, + PartnerAccountManagementListComponent, + ParterClaimAuditListComponent, + ParterClaimAuditListChannelDetailComponent, + ParterClaimAuditListPartnerDetailComponent, + ParterClaimAuditListPartnerApproveComponent, + ParterClaimAuditListPartnerRejectComponent, + ParterClaimAuditListChannelApproveComponent, + ParterClaimAuditListChannelRejectComponent, + PartnerAccountManagementVirtualAccountDetailComponent, + PartnerAccountManagementAccountDetailComponent, + PartnerAccountManagementRecordedDetailComponent, + PartnerAccountManagementWithdrawalsRecordComponent, + PartnerAccountManagementWithdralDetailComponent, + PartnerRecordedRecordComponent, + PartnerRecordedDetailComponent, + PartnerListComponent, + PartnerDetailComponent, + ParterRebateManageMenAbnormalFeedbackComponent, + ParterRebateManageMentSettingComponent, + PartnerAuditModalComponent, + ParterRebateManageMentAddComponent, + AddEtpPartnerComponent, + AddPersonalPartnerComponent, + ScrollImgComponentsListComponent, + ScrollimgComponentsAddComponent, + ParterArticleManagementEditComponent, + ParterArticleManagementListComponent, + PartnerKnowledgeClassificationListComponent, + PartnerEditComponent, + BannerComponentsListComponent, + BannerComponentsAddComponent, + PersonalPartnerDetailComponent, + ParterAdviceFeedbackListComponent, + ParterAdviceFeedbackDetailComponent, + ParterRebateManageMentAddPartnerListComponent, + ChannelLogModalComponent +]; + +@NgModule({ + declarations: [...COMPONENTS], + imports: [CommonModule, PartnerRoutingModule, SharedModule], + providers: [PartnerListService] +}) +export class PartnerModule {} diff --git a/src/app/routes/partner/rebate-management/components/particulars/particulars.component.html b/src/app/routes/partner/rebate-management/components/particulars/particulars.component.html new file mode 100644 index 00000000..0ebf82f0 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/particulars/particulars.component.html @@ -0,0 +1,60 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + diff --git a/src/app/routes/partner/rebate-management/components/particulars/particulars.component.ts b/src/app/routes/partner/rebate-management/components/particulars/particulars.component.ts new file mode 100644 index 00000000..55ed5dd9 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/particulars/particulars.component.ts @@ -0,0 +1,188 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../services/rebate-management.service'; + +@Component({ + selector: 'app-parter-channel-rebate-management-particulars', + templateUrl: './particulars.component.html' +}) +export class ParterRebateManageMentParticularsComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + _$expand = false; + data = [{ name1: 1111 }]; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modalService: NzModalService, + public shipperservice: ShipperBaseService + ) {} + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询参数 + */ + get reqParams() { + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...params, + deadlineTime: { + start: this.sf?.value?.deadlineTime?.[0] || '', + end: this.sf?.value?.deadlineTime?.[1] || '', + }, + }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + type: 'string', + title: '订单号' + }, + phone: { + type: 'string', + title: '付款单号' + }, + phone2: { + type: 'string', + title: '下单客户' + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + phone3: { + type: 'string', + title: '合伙人名称', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + }, + } + }, + deadlineTime: { + title: '时间范围', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } as SFDateWidgetSchema + } + } + }; + this.ui = { + '*': { + spanLabelFixed: 140, + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '订单号', + index: 'name1' + }, + { + title: '订单金额(元)', + index: 'name1' + }, + { + title: '付款金额(元)', + index: 'name1' + }, + { + title: '预估返佣金额(元)', + index: 'name1' + }, + { + title: '附加费率', + index: 'name1' + }, + { + title: '下单客户', + index: 'name1' + }, + { + title: '网络货运人', + index: 'name1' + }, + { + title: '销售渠道', + index: 'name1' + }, + { + title: '合伙人名称', + index: 'name1' + }, + { + title: '合伙人等级', + index: 'name1' + }, + { + title: '管理费比例', + index: 'name1' + }, + { + title: '固定结算费率', + index: 'name1' + }, + { + title: '返佣时间', + index: 'name1' + } + ]; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } +} diff --git a/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.html b/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.html new file mode 100644 index 00000000..2456985d --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.html @@ -0,0 +1,48 @@ + + + +
    + + +
    + + + +
    +
    +
    + + + + + +
    123212{{item?.abnormalFeedback}}
    +
    +
    +
    diff --git a/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.ts b/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.ts new file mode 100644 index 00000000..e1d2b4c3 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-record/rebate-record.component.ts @@ -0,0 +1,154 @@ +import { ModalHelper } from '@delon/theme'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../services/rebate-management.service'; +import { ParterRebateManageMenRecordDetailComponent } from '../../model/record-detail/record-detail.component'; +import { ParterRebateManageMenAbnormalFeedbackComponent } from '../../model/abnormal-feedback/abnormal-feedback.component'; + +@Component({ + selector: 'app-parter-channel-rebate-management-record', + templateUrl: './rebate-record.component.html' +}) +export class ParterRebateManageMentRecordComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + _$expand = false; + data = [{ name1: 1111 }]; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + ) {} + /** + * 查询参数 + */ + get reqParams() { + const params: any = Object.assign({}, this.sf?.value || {}); + return { + ...params, + }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + month: { + type: 'string', + title: '时间月份', + format: 'month', + }, + phone: { + type: 'string', + title: '合伙人名称' + }, + } + }; + this.ui = { + '*': { + spanLabelFixed: 140, + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '月份', + index: 'month', + format: (item: any) => {return item?.month ? item?.month + '月' : ''} + }, + { + title: '返佣金额(元)', + index: 'name1' + }, + { + title: '合伙人名称', + index: 'partnerName' + }, + { + title: '实际等级', + index: 'name1' + }, + { + title: '管理费比例', + index: 'rebateRatio' + }, + { + title: '返佣时间', + index: 'name1' + }, + { + title: '异常反馈', + render: 'abnormalFeedback' + }, + { + title: '操作', + fixed: 'right', + width: '90px', + className: 'text-left', + buttons: [ + { + text: '明细', + click: _record => this.viewEvaluate(_record), + } + ] + } + ]; + } + /** + *查看明细 + */ + viewEvaluate(item: any) { + const modal = this.modal.create({ + nzTitle: '明细', + nzWidth: 1200, + nzContent: ParterRebateManageMenRecordDetailComponent, + nzComponentParams: { }, + nzFooter: null + }); + modal.afterClose.subscribe((res: any) => { + if (res) { + } + }); + } + /** + *异常反馈 + */ + feedback(item?: any) { + const modal = this.modal.create({ + nzTitle: '异常反馈', + nzWidth: 580, + nzContent: ParterRebateManageMenAbnormalFeedbackComponent, + nzComponentParams: { i: item }, + nzFooter: null + }); + modal.afterClose.subscribe((res: any) => { + if (res) { + } + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } +} diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.html b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.html new file mode 100644 index 00000000..a537892f --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.html @@ -0,0 +1,30 @@ + + +
    + +
    + +
    +
    +
    + + + + + + diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.less b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.less new file mode 100644 index 00000000..e87948ce --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.less @@ -0,0 +1,20 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } + .imgBox { + display: flex; + img { + width: 60px !important; + } + } + +} \ No newline at end of file diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.ts b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.ts new file mode 100644 index 00000000..65ce3f8c --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add-partnerlist/add-partnerlist.component.ts @@ -0,0 +1,141 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { + SFComponent, + SFDateWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFUISchema +} from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService, NzModalRef } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { RebateManagementService } from '../../../services/rebate-management.service'; + +@Component({ + selector: 'app-add-partnerlist', + templateUrl: './add-partnerlist.component.html', + styleUrls: ['./add-partnerlist.component.less'] +}) +export class ParterRebateManageMentAddPartnerListComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + ui: SFUISchema = {}; + i: any; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData: any; + isVisible = false; + edit = false; + editId = false; + selectedIndex = 0; + + columns: STColumn[] = [ + { title: '', type: 'checkbox', width: '50px', className: 'text-center' }, + { + title: '合伙人名称', + index: 'enterpriseName', + width: 180, + format: item => (item.partnerType ? `${item.enterpriseName || item.contactName}` : '') + }, + { title: '联系人', index: 'contactName', width: 150, format: item => (item.partnerType ? `${item.contactName}` : '') }, + { title: '手机号', index: 'contactMobile', className: 'text-center', width: 150 }, + { title: '类型', index: 'partnerType', className: 'text-center', width: 130, type: 'enum', enum: { 1: '企业', 2: '个人' } }, + { + title: '操作', + width: '90px', + fixed: 'right', + buttons: [ + { + text: '添加', + click: _record => this.add(_record), + acl: { ability: ['AbnormalAppear-reply'] } + } + ] + } + ]; + + get reqParams() { + // signStatus固定传20 代表签约完成 signStatus: 20 + let params: any = { ...this.sf?.value, }; + return params; + } + + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + + constructor( + public service: RebateManagementService, + public shipperSrv: ShipperBaseService, + private modal: NzModalService, + private modals: NzModalRef + ) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + enterpriseName: { + type: 'string', + title: '合伙人名称' + }, + partnerType: { + type: 'string', + title: '类型', + enum: [ + { value: '', label: '全部' }, + { value: 1, label: '企业' }, + { value: 2, label: '个人' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + search() { + this.st?.load(1); + } + + selectedIndexChange(event: any) { + if (this.selectedIndex === 0) { + this.st?.load(1); + } + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + // 回复操作 + add(item: any) { + console.log(item); + this.modals.destroy(item); + } + // 批量回复操作 + batchReply() { + // if (this.selectedRows.length === 0) { + // this.service.msgSrv.warning('请勾选数据!') + // return; + // } + this.modals.destroy(this.selectedRows); + } +} diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.html b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.html new file mode 100644 index 00000000..65cd23f9 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.html @@ -0,0 +1,70 @@ + + + +
    + + + +    + 固定结算费率配置 +     % + 业务量和管理费比例配置 +    + + + + + + +    + + + 关联合伙人配置 +    + + + + + +   添加 + + + +    + + 1 + 2 + 3 + 4 + 5 + + +    + + +    + + + +
    + + +
    +
    +
    diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.less b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.less new file mode 100644 index 00000000..fe7d3fd2 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.less @@ -0,0 +1,16 @@ +:host { + ::ng-deep { + .sv__label { + color: #000; + } + .sv__title { + font-weight: 700; + } + } + .align-center { + display: flex; + align-items: center; + justify-content: center; + } + +} diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.ts b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.ts new file mode 100644 index 00000000..958809db --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/add/add.component.ts @@ -0,0 +1,149 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-21 09:26:45 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-29 10:53:39 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\partner\\rebate-management\\components\\rebate-setting\\add\\add.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { ModalHelper } from '@delon/theme'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../../services/rebate-management.service'; +import { ParterRebateManageMentAddPartnerListComponent } from '../add-partnerlist/add-partnerlist.component'; +import { inRange } from '@delon/util'; +@Component({ + selector: 'app-parter-channel-rebate-management-add', + styleUrls: ['./add.component.less'], + templateUrl: './add.component.html' +}) +export class ParterRebateManageMentAddComponent implements OnInit { + @ViewChild('table') table!: any; + tabelData: any; + configName: string = ''; + partnerType: string = ''; + remarke: string = ''; + accountingRate: Number = 0; + priority: string = ''; + partnerPeopleList: any; + configType = '1'; + precision = 2; + partnerId :Array =[]; + inputValue = ''; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService + ) {} + columns: STColumn[] = [ + { + title: '合伙人名称', + index: 'enterpriseName', + width: 180, + format: item => (item.partnerType ? `${item.enterpriseName || item.contactName}` : '') + }, + { title: '联系人', index: 'contactName', width: 150, format: item => (item.partnerType ? `${item.contactName}` : '') }, + { title: '手机号', index: 'contactMobile', className: 'text-center', width: 150 }, + { title: '类型', index: 'partnerType', className: 'text-center', width: 130, type: 'enum', enum: { 1: '企业', 2: '个人' } }, + { + title: '操作', width: '90px', fixed: 'right', + buttons: [ + { + text: '移除', + click: _record => this.delete(_record), + acl: { ability: ['AbnormalAppear-reply'] } + }, + ] + }, + ]; + initSF(data?: any) { + this.schema1 = { + properties: { + ruleDescription: { + type: 'string', + title: '', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 650 + } + }, + // default: data?.agreementContent || '' + } + } + }; + } + ngOnInit() { + this.initSF(); + } + goBack() { + window.history.go(-1); + } + /** + *合伙人选择 + */ + add(item?: any) { + const modalRef = this.modal.create({ + nzTitle: '合伙人选择', + nzWidth: 1000, + nzContent: ParterRebateManageMentAddPartnerListComponent, + nzComponentParams: { + i: item, + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + this.partnerId = []; + if (res) { + console.log(Array.isArray(res)); + console.log(res); + if(Array.isArray(res)) { + this.partnerPeopleList = res; + res.forEach((ele: any) => { + this.partnerId.push(ele?.id); + }) + } else { + this.partnerPeopleList = [res]; + this.partnerId.push(res?.id); + } + } + }); + } + delete(item: any) { + console.log(item); + } + save () { + const params = { + accountingRate: this.accountingRate, + configName: this.configName, + configType: this.configType, + rebateConfigLineDTO: this.table.data, + priority: this.priority,// 优先级 + partnerId: this.partnerId.join(','), + ruleDescription: this.sf.value.ruleDescription, + remarke: this.remarke, + partnerType: this.partnerType + } + console.log(params); + this.service.request(this.service.$api_save_rebateConfig, params).subscribe((res: any) => { + if(res) { + console.log(res); + this.service.msgSrv.success('新增成功!') + this.router.navigate(['/partner/rebate/setting']) + } + }) + } +} diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.html b/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.html new file mode 100644 index 00000000..5d636436 --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.html @@ -0,0 +1,64 @@ + + + +
    + + +
    + + + +
    +
    +
    + + + + +
    +
    + +
    +
    + + +
    按全部等级配置
    +
    按不同等级配置
    +
    + +
    全部合伙人
    +
    新注册合伙人
    +
    自定义合伙人
    +
    + +
    {{item?.stateLocked ? '启用' : '禁用'}}
    +
    +
    +
    diff --git a/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.ts b/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.ts new file mode 100644 index 00000000..ee9b5b9d --- /dev/null +++ b/src/app/routes/partner/rebate-management/components/rebate-setting/rebate-setting.component.ts @@ -0,0 +1,200 @@ +import { ModalHelper } from '@delon/theme'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../services/rebate-management.service'; +import { ParterRebateManageMenRecordDetailComponent } from '../../model/record-detail/record-detail.component'; +import { ParterRebateManageMenAbnormalFeedbackComponent } from '../../model/abnormal-feedback/abnormal-feedback.component'; + +@Component({ + selector: 'app-parter-channel-rebate-management-setting', + templateUrl: './rebate-setting.component.html' +}) +export class ParterRebateManageMentSettingComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + _$expand = false; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modal: NzModalService, + public shipperservice: ShipperBaseService, + ) {} + /** + * 查询参数 + */ + get reqParams() { + const params: any = Object.assign({}, this.sf?.value || {}); + return { + ...params, + }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + configName: { + type: 'string', + title: '配置名称', + }, + stateLocked: { + type: 'string', + title: '状态', + enum: [ + {label: '全部', value: ''}, + {label: '启用', value: 0}, + {label: '禁用', value: 1}, + ], + ui: { + widget: 'select', + }, + + }, + } + }; + this.ui = { + '*': { + spanLabelFixed: 140, + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '配置名称', + index: 'configName', + width: '200px', + }, + { + title: '配置类型', + render: 'configType', + width: '200px', + + }, + { + title: '备注', + index: 'remark', + width: '250px', + }, + { + title: '关联合伙人范围', + render: 'partnerType', + width: '200px', + }, + { + title: '创建时间', + index: 'enableTime', + width: '200px', + }, + { + title: '启用时间', + index: 'enableTime', + width: '200px', + }, + { + title: '优先级', + index: 'priority', + width: '100px', + }, + { + title: '状态', + render: 'stateLocked', + width: '100px', + }, + { + title: '操作', + fixed: 'right', + width: '90px', + className: 'text-left', + buttons: [ + { + text: '查看', + click: _record => this.viewEvaluate(_record), + }, + { + text: '禁用', + iif: (_record) =>{ return _record.stateLocked == true}, + click: _record => this.viewEvaluate(_record), + }, + { + text: '启用', + iif: (_record) =>{ return _record.stateLocked == false}, + click: _record => this.viewEvaluate(_record), + }, + ] + } + ]; + } + /** + *禁用 + */ + viewEvaluate(item: any) { + console.log(item.stateLocked); + let title = '' + let stateLocked: boolean; + if(item.stateLocked) { + title = '是否禁用该配置?' + stateLocked = false + } else { + title = '是否启用该配置?' + stateLocked = true + } + this.modal.confirm({ + nzTitle: title, + nzOnOk: () => { + const params = { + id: item?.id, + stateLocked: stateLocked, + } + this.service.request(this.service.$api_set_updateRebateConfig,params).subscribe((res: any) => { + if(res) { + this.service.msgSrv.success('设置成功!') + this.st.reload(); + } + }) + } + }); + } + /** + *查看 + */ + feedback(item?: any) { + const modal = this.modal.create({ + nzTitle: '查看', + nzWidth: 580, + nzContent: ParterRebateManageMenAbnormalFeedbackComponent, + nzComponentParams: { i: item }, + nzFooter: null + }); + modal.afterClose.subscribe((res: any) => { + if (res) { + } + }); + } + configAction() { + this.router.navigate(['/partner/rebate/setting/add/', 1]) + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } +} diff --git a/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.html b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.html new file mode 100644 index 00000000..cef84c44 --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.html @@ -0,0 +1,38 @@ + + + +
    有订单有异常请查看
    +
    2022-09-08 00:00:00
    +
    + +
    +
    + +
    + +
    + +
    \ No newline at end of file diff --git a/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.less b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.less new file mode 100644 index 00000000..52b47a0e --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.less @@ -0,0 +1,6 @@ +:host { + [nz-button] { + margin-right: 8px; + margin-bottom: 12px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.ts b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.ts new file mode 100644 index 00000000..3d8c1fd4 --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/abnormal-feedback/abnormal-feedback.component.ts @@ -0,0 +1,72 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-10 14:50:45 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-10 15:09:51 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\partner\\rebate-management\\model\\abnormal-feedback\\abnormal-feedback.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { ModalHelper } from '@delon/theme'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService, NzModalRef } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../services/rebate-management.service'; +import { NzButtonSize } from 'ng-zorro-antd/button'; + +@Component({ + selector: 'app-parter-channel-rebate-management-abnormal-feedback', + templateUrl: './abnormal-feedback.component.html' +}) +export class ParterRebateManageMenAbnormalFeedbackComponent implements OnInit { + schema: SFSchema = {}; + ui!: SFUISchema; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i!: any; + data = [{ name1: 1111 }]; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modalService: NzModalService, + public shipperservice: ShipperBaseService, + public modalRef: NzModalRef, + ) {} + + + ngOnInit() { + this.initSF(); + } + + initSF() { + this.schema = { + properties: { + name3: { + type: 'string', + title: '回复', + maxLength: 50, + ui: { + widget: 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + placeholder:'请不要超过50个字' + } as SFTextareaWidgetSchema, + }, + } + }; + this.ui = { + '*': { + spanLabelFixed: 60, + grid: { span: 16 }, + } + }; + } + close() { + this.modalRef.destroy() + } +} + diff --git a/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.html b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.html new file mode 100644 index 00000000..63f8290c --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.html @@ -0,0 +1,38 @@ + +
    + +
    + + + +
    合计:2999.00元
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.less b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.less new file mode 100644 index 00000000..52b47a0e --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.less @@ -0,0 +1,6 @@ +:host { + [nz-button] { + margin-right: 8px; + margin-bottom: 12px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.ts b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.ts new file mode 100644 index 00000000..1efde6a2 --- /dev/null +++ b/src/app/routes/partner/rebate-management/model/record-detail/record-detail.component.ts @@ -0,0 +1,171 @@ +import { ModalHelper } from '@delon/theme'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { processSingleSort, ShipperBaseService } from '@shared'; +import { NzModalService, NzModalRef } from 'ng-zorro-antd/modal'; +import { RebateManagementService } from '../../services/rebate-management.service'; +import { NzButtonSize } from 'ng-zorro-antd/button'; + +@Component({ + selector: 'app-parter-channel-rebate-management-record-detail', + templateUrl: './record-detail.component.html' +}) +export class ParterRebateManageMenRecordDetailComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + ui!: SFUISchema; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + spuStatus = '1'; + size: NzButtonSize = 'large'; + _$expand = false; + data = [{ name1: 1111 }]; + constructor( + public router: Router, + public ar: ActivatedRoute, + public service: RebateManagementService, + private modalService: NzModalService, + public shipperservice: ShipperBaseService, + public modalRef: NzModalRef, + ) {} + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询参数 + */ + get reqParams() { + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...params, + }; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + + initSF() { + this.schema = { + properties: { + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + change: (value: any) => { + console.log(value) + this.st.reload() + } + } + }, + paymentStatus: { + title: '银行类型', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + change: (value: any) => { + console.log(value) + this.st.reload() + } + } as SFSelectWidgetSchema + }, + } + }; + this.ui = { + '*': { + spanLabelFixed: 140, + grid: { span: 8, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '订单号', + index: 'billCode' + }, + { + title: '订单金额(元)', + index: 'name1' + }, + { + title: '付款金额(元)', + index: 'name1' + }, + { + title: '预估返佣金额(元)', + index: 'name1' + }, + { + title: '附加费率', + index: 'name1' + }, + { + title: '下单客户', + index: 'name1' + }, + { + title: '网络货运人', + index: 'name1' + }, + { + title: '销售渠道', + index: 'name1' + }, + { + title: '合伙人名称', + index: 'name1' + }, + { + title: '合伙人等级', + index: 'name1' + }, + { + title: '管理费比例', + index: 'name1' + }, + { + title: '固定结算费率', + index: 'name1' + }, + { + title: '返佣时间', + index: 'name1' + } + ]; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.st.load(1); + } + close() { + this.modalRef.destroy() + } +} + diff --git a/src/app/routes/partner/rebate-management/services/rebate-management.service.ts b/src/app/routes/partner/rebate-management/services/rebate-management.service.ts new file mode 100644 index 00000000..fd12644c --- /dev/null +++ b/src/app/routes/partner/rebate-management/services/rebate-management.service.ts @@ -0,0 +1,35 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-10 11:19:00 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-29 11:26:38 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\partner\\rebate-management\\services\\rebate-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class RebateManagementService extends BaseService { + // 查询规则抽查列表 + public $api_get_listCompliancePage = '/api/sdc/billRiskOperate/listRiskPage'; + // 查询返佣配置表 + public $api_get_rebateConfig = '/api/mdc/rebateConfig/list/page'; + // 保存返佣配置表 + public $api_save_rebateConfig = '/api/mdc/rebateConfig/save'; + // 启用/禁用返佣配置 + public $api_set_updateRebateConfig = '/api/mdc/rebateConfig/updateRebateConfig'; + + + // 运营端查询合伙人返佣 + public $api_get_getIncomeByBillpage = '/api/bpc/partnerIncomeHead/getIncomeByBillpage'; +   // 查询合伙人信息-分页 + public $api_get_partner_page = '/api/mdc/partner/list/page'; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/recorded/components/detail/detail.component.html b/src/app/routes/partner/recorded/components/detail/detail.component.html new file mode 100644 index 00000000..8bfafd61 --- /dev/null +++ b/src/app/routes/partner/recorded/components/detail/detail.component.html @@ -0,0 +1,97 @@ + + + + + + +
    +

    {{formData?.stsLabel}}

    +
    + +
    +
    +
    +
    + + + + +
    + + {{formData?.accountName}} + + + {{formData?.ltdName}} + + + {{formData?.entryNumber}} + + + {{formData?.bankName}} + + + {{formData?.fictitiousAccount}} + + + {{formData?.submitTime}} + + + {{formData?.invoiceAmount | currency}} + + + {{formData?.taxPersonal | currency}} + + + {{formData?.recordedAmount | currency}} + + + {{formData?.stsLabel}} + + + + - + + + {{formData?.expressName}} + + + + - + + + {{formData?.bankFlow}} + +
    + + +
    +
    + +
    +
    +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/partner/recorded/components/detail/detail.component.less b/src/app/routes/partner/recorded/components/detail/detail.component.less new file mode 100644 index 00000000..e299b7d1 --- /dev/null +++ b/src/app/routes/partner/recorded/components/detail/detail.component.less @@ -0,0 +1,17 @@ +:host::ng-deep { + + .ant-alert-info { + background-color: #f3f3f3; + border : 1px solid #dbdbdb; + + .ant-alert-message { + color: rgba(0, 0, 0, 0.85); + font-weight: 600; + font-size: 16px; + } + } + + .ant-form-item { + margin-bottom: 15px; + } +} \ No newline at end of file diff --git a/src/app/routes/partner/recorded/components/detail/detail.component.ts b/src/app/routes/partner/recorded/components/detail/detail.component.ts new file mode 100644 index 00000000..bbfad88e --- /dev/null +++ b/src/app/routes/partner/recorded/components/detail/detail.component.ts @@ -0,0 +1,130 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from 'src/app/routes/financial-management/services/freight-account.service'; +import { RecordedService } from '../../services/recorded.service'; + + +@Component({ + selector: 'app-partner-recored-detail', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'] +}) +export class PartnerRecordedDetailComponent implements OnInit { + @ViewChild('auditModal', { static: false }) auditModal!: any; + formData: any = {}; + timeLineData: any = []; + msg = ''; + id = ''; + + constructor(public service: RecordedService, private route: ActivatedRoute, private nzModalService: NzModalService) { + this.id = route.snapshot.params.id; + this.getRecordedDetail(this.id); + } + + ngOnInit(): void { } + + getRecordedDetail(id: string) { + this.service.request(this.service.$api_get_recorded_record_detail, { id }).subscribe(res => { + if (res) { + this.formData = res; + // 处理流程节点数据 + // 流程是否结束 + // let isEnd = false; + // if (res.successTime) { + // isEnd = true; + // if (res.refundStatus === '3') { + // this.timeLineData.push({ time: res.successTime, value: `到账成功`, color: 'green' }); + // } else { + // this.timeLineData.push({ time: res.successTime, value: `提现失败`, color: 'red' }); + // } + // } + // if (res.agreeTime && res.refundStatus !== '4') { + // this.timeLineData.push({ time: res.agreeTime, value: `银行处理中`, color: 'gray' }); + // } + // if (res.agreeTime) { + // if (res.refundStatus === '4') { + // isEnd = true; + // this.timeLineData.push({ + // time: res.agreeTime, + // value: `拒绝提现
    操作人员:${res.handlerUserIdLabel}`, + // color: 'red' + // }); + // } else { + // this.timeLineData.push({ + // time: res.agreeTime, + // value: `审核通过
    操作人员:${res.handlerUserIdLabel}`, + // color: 'gray' + // }); + // } + // } + // if (res.createTime) { + // this.timeLineData.push({ + // time: res.createTime, + // value: `提交提现申请
    提现${res.amount}元至${res.bankName}(${res.bankCardNumber})
    操作人员:${res.userIdLabel}`, + // color: 'gray' + // }); + // } + // if (this.timeLineData?.length > 0 && !isEnd) { + // this.timeLineData[0].color = 'green'; + // } + } + }); + } + + auditAction(item?: any, type: string = '1') { + this.msg = ''; + let params: Array = []; + params = [item.id]; + const modal = this.nzModalService.create({ + nzTitle: type === '1' ? '审核' : '复审', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + if (!this.msg || this.msg.trim().length === 0) { + this.service.msgSrv.warning('请填写拒绝原因 '); + return; + } + this.audit({ ids: params, rejectReason: this.msg, sts: '3' }, () => { + modal.destroy(true); + }, '审核拒绝成功'); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + this.audit({ ids: params, rejectReason: this.msg, sts: this.formData?.sts === '0' ? 1 : 2 }, () => { + modal.destroy(true); + }, `${this.formData?.sts === '1' ? '审核' : '复审'}通过成功`); + } + } + ] + }); + modal.afterClose.subscribe((res: any) => { + if (res) { + this.getRecordedDetail(this.id); + } + }); + } + goBack() { + history.go(-1); + } + + /** + * 审核 + */ + audit(params: any, callback: Function, msg = '成功') { + this.service + .request(this.service.$api_audit_recored, ...params) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + callback(); + } + }); + } +} diff --git a/src/app/routes/partner/recorded/components/record/record.component.html b/src/app/routes/partner/recorded/components/record/record.component.html new file mode 100644 index 00000000..ca550d9d --- /dev/null +++ b/src/app/routes/partner/recorded/components/record/record.component.html @@ -0,0 +1,76 @@ + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据,累计入账 {{ + totalCallNo }} + +
    + +
    +
    + +
    + + + {{ item.bankName }}
    {{ item.bankCardNumber }} +
    +
    +
    + 合伙人数: + 入账笔数: + 开票金额: + 代缴个税: + 入账金额: +
    +
    +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/partner/recorded/components/record/record.component.ts b/src/app/routes/partner/recorded/components/record/record.component.ts new file mode 100644 index 00000000..2a554c41 --- /dev/null +++ b/src/app/routes/partner/recorded/components/record/record.component.ts @@ -0,0 +1,363 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { FreightAccountService } from 'src/app/routes/financial-management/services/freight-account.service'; +import Big from 'src/app/shared/utils/deal-precision'; +import { RecordedService } from '../../services/recorded.service'; + + +@Component({ + selector: 'app-partner-recorded-record', + templateUrl: './record.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class PartnerRecordedRecordComponent implements OnInit { + @ViewChild('st', { static: true }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('auditModal', { static: false }) auditModal!: any; + @ViewChild('viewReasonModal', { static: false }) viewReasonModal!: any; + columns!: STColumn[]; + searchSchema!: SFSchema; + totalInfo: any = { + invoiceAmountSum: 0, + invoiceEntryNum: 0, + partnerNum: 0, + recordedAmountSum: 0, + taxPersonalSum: 0 + } + + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + refundStatus: any = ''; + + msg = ''; + + ltdId = ''; // 网络货运人 + accountName = ''; // 账户名称 + + + constructor(public service: RecordedService, private nzModalService: NzModalService, + private router: Router, public ar: ActivatedRoute, public shipperSrv: ShipperBaseService) { + this.ltdId = this.ar.snapshot.queryParams?.ltdId || ''; + + } + + ngOnInit(): void { + this.searchSchema = this.initSF(); + this.columns = this.initST(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + }, + refundStatus: this.refundStatus || null + }); + } + delete requestOptions?.body?.expand; + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + // data = data.map(node => ({ ...node, disabled: node.sts !== '0' })); + return data; + }; + + stChange(e: STChange): void { + if (e.type === 'checkbox') { + const checkRows = (e.checkbox as STData[]) || []; + //判断当前页是否有选中的行 + if (checkRows.length === 0) { + // 当前页没有存在已勾选的行,移除之前所记录的当前页的行 + const stList = this.st.list; + stList.forEach(item => { + this.selectedRows = this.selectedRows.filter((e: any) => e.id !== item.id); + }) + } else { + //添加新增的行 + checkRows.forEach((item: any) => { + const newSelectedList = this.selectedRows.filter((r: any) => r.id === item.id); + if (newSelectedList.length === 0) { + this.selectedRows.push(item); + + } + }) + // 移除取消选中的行 + const stList = this.st.list; + stList.forEach(item => { + if (!item.checked) { + const index = this.selectedRows.findIndex(_item => item.id === _item.id); + if (index !== -1) this.selectedRows.splice(index, 1); + } + }) + } + let totalCallNo = 0; + this.selectedRows.forEach((item => { + totalCallNo = new Big(this.totalCallNo).plus(item?.entryAmount).parse(); + })); + this.totalCallNo = totalCallNo; + } else if (e.type === 'loaded') { + // 页面加载时勾选 + (e?.loaded || []).forEach((r) => { + this.selectedRows.forEach((x) => { + if (x.id === r.id) { + r.checked = true; + } + }); + }); + } + } + + changeRefundStatus(status?: string) { + this.refundStatus = status || null; + this.st.load(1); + } + + auditAction(item?: any, type: string = '1') { + if (!item && this.selectedRows.length === 0) { + this.service.msgSrv.warning('请选择需要审核的记录'); + return; + } + this.msg = ''; + let params: Array = []; + if (item) { + params = [item.id]; + } else { + params = this.selectedRows.map(node => node.id); + } + const modal = this.nzModalService.create({ + nzTitle: type === '1' ? '审核' : '复审', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + if (!this.msg || this.msg.trim().length === 0) { + this.service.msgSrv.warning('请填写拒绝原因 '); + return; + } + this.audit({ ids: params, rejectReason: this.msg, sts: '3' }, () => { + modal.destroy(); + this.st.load(1); + }, '审核拒绝成功'); + // this.service + // .request(this.service.$api_disagree_recorded, { + // id: params, + // rejectReason: this.msg + // }) + // .subscribe(res => { + // if (res) { + // this.service.msgSrv.success('审核拒绝成功'); + // modal.destroy(); + // this.st.load(1); + // } + // }); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + this.audit({ ids: params, rejectReason: this.msg, sts: '1' }, () => { + modal.destroy(); + this.st.load(1); + }, '审核通过成功'); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: item?.rejectionCause || item?.failCause, + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + accountName: { + type: 'string', + title: '账户名称', + default: this.accountName, + ui: { + placeholder: '请输入' + } + }, + sts: { + type: 'string', + title: '入账状态', + default: '', + enum: [ + { label: '全部', value: '' }, + { label: '待初审', value: '0' }, + { label: '待复核', value: '1' }, + { label: '已入账', value: '2' }, + { label: '已拒绝', value: '3' }, + ], + ui: { + widget: 'select', + placeholder: '请选择' + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + default: this.ltdId, + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperSrv.getNetworkFreightForwarder({}, true), + } + }, + submitTime: { + title: '提交时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', className: 'text-center' }, + { title: '账户名称', index: 'accountName', width: 180, className: 'text-center' }, + { title: '虚拟账户', index: 'fictitiousAccount', width: 180, className: 'text-center' }, + { title: '入账单号', index: 'entryNumber', width: 190, className: 'text-center' }, + { title: '网络货运人', index: 'ltdName', width: 220, className: 'text-center' }, + { + title: '开票金额', + index: 'amount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '代缴个税', + index: 'taxPersonal', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + { + title: '入账金额', + index: 'entryAmount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.amount }) } + }, + + { title: '提交时间', index: 'submitTime', width: 180, className: 'text-center' }, + { title: '入账状态', index: 'stsLabel', width: 120, className: 'text-center' }, + { + title: '操作', + fixed: 'right', + width: '110px', + buttons: [ + { + text: '审核', + iif: item => item.sts === '0', + click: item => this.auditAction(item) + }, + { + text: '复审', + iif: item => item.sts === '1', + click: item => this.router.navigate(['./detail/' + item.id], { relativeTo: this.ar }) + }, + { + text: '详情', + click: item => this.router.navigate(['./detail/' + item.id], { relativeTo: this.ar }) + } + ] + } + ]; + } + + /** + * 审核 + */ + audit(params: any, callback: Function, msg = '成功') { + this.service + .request(this.service.$api_audit_recored, { ...params }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + callback(); + } + }); + } + + search() { + this.st.load(1); + this.getSummary(); + } + /** + * 底部统计 + */ + getSummary() { + this.service.request(this.service.$api_get_list_summary, { ...this.sf.value }).subscribe(res => { + if (res) { + this.totalInfo = res; + } + }) + } +} diff --git a/src/app/routes/partner/recorded/services/recorded.service.ts b/src/app/routes/partner/recorded/services/recorded.service.ts new file mode 100644 index 00000000..72d088aa --- /dev/null +++ b/src/app/routes/partner/recorded/services/recorded.service.ts @@ -0,0 +1,18 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class RecordedService extends BaseService { + + $api_get_recorded_page = `/api/bpc/partnerInvoiceEntry/queryInvoiceEntrylist`; // 查询合伙人发票入账主表 + $api_get_recorded_record_detail = `/api/bpc/partnerInvoice/getDetailByOpration`; // 入账记录详情 + $api_disagree_recorded = ``; // 拒绝审核 + $api_agree_recorded = ``; // 同意审核 + $api_audit_recored = `/api/bpc/partnerInvoiceEntry/oprationAudit`; // 审核单据 + $api_get_list_summary = `/api/bpc/partnerInvoiceEntry/invoiceEntrySummary`; // 每页统计 + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/partner/scrollimg/components/add/add.component.html b/src/app/routes/partner/scrollimg/components/add/add.component.html new file mode 100644 index 00000000..f6a39e94 --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/add/add.component.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/partner/scrollimg/components/add/add.component.spec.ts b/src/app/routes/partner/scrollimg/components/add/add.component.spec.ts new file mode 100644 index 00000000..80b44d19 --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/add/add.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdComponentsAddComponent } from './add.component'; + +describe('AdComponentsAddComponent', () => { + let component: AdComponentsAddComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdComponentsAddComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdComponentsAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/scrollimg/components/add/add.component.ts b/src/app/routes/partner/scrollimg/components/add/add.component.ts new file mode 100644 index 00000000..e8345d9e --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/add/add.component.ts @@ -0,0 +1,243 @@ +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import format from 'date-fns/format'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { apiConf } from '@conf/api.conf'; +import { ScrollImgService } from '../../services/scrollimg.service'; + +@Component({ + selector: 'app-ad-components-add', + templateUrl: './add.component.html', + styleUrls: ['./add.less'] +}) +export class ScrollimgComponentsAddComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema: SFSchema = {}; + contentListData = []; + queryParams: any = {}; + oldTakeEffectTime = ''; + maxSort = 0; + isVisible = false; + validFalg = true; + detailData: any = { + advertisementContentDTOList: [] + }; + changeTimeFlag = false; + currentIndex = 0; + addFlag = true; + addId = 1; + inputPoint: any = { + lng: 0, + lat: 0 + }; + today = new Date(); + navData: any = []; + navigationName = ''; + ui: SFUISchema = { + '*': { + spanLabelFixed: 200, + grid: { span: 24 }, + }, + }; + constructor( + public msgSrv: NzMessageService, + public http: _HttpClient, + public service: ScrollImgService, + private route: ActivatedRoute, + private router: Router, + private envSrv: EAEnvironmentService, + ) { } + + + ngOnInit(): void { + this.queryParams = this.route.snapshot.queryParams; + if (this.queryParams.type !== 'add') { + this.initDetailData(); + } + this.initSF(); + } + initDetailData() { + + } + initSF() { + this.schema = { + properties: { + name: { + type: 'string', + title: '轮播图名称', + maxLength: 10, + ui: { + showRequired: true, + placeholder: '请不要超过10个字', + } + }, + licensePhotoWatermark: { + type: 'string', + title: '轮播图', + ui: { + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持JPG、PNG格式,文件小于2M(建议尺寸 702px * 280px)', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.enterpriseBaseDTO.licensePhoto = args.file.response.data.fullFilePath + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt4M = file.size / 1024 / 1024 < 2; + if (!isLt4M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt4M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url), + }, + }, + linkType: { + type: 'string', + title: '可见范围', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '全部可见', value: 1 }, + { label: '合伙人可见', value: 2 }, + { label: '销售渠道可见', value: 3 }, + ], + }, + sortId: { + type: 'string', + title: '顺序', + ui: { + showRequired: true, + widget: '=', + placeholder: '请输入0~99,数字越大,排序越靠前', + serverSearch: true, + } as SFSelectWidgetSchema, + }, + content: { + type: 'string', + title: '内容', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 450 + }, + visibleIf: { name5: (value: string) => value === '1' } + }, + }, + }, + required: [], + }; + if (this.queryParams.type === 'add') { + setTimeout(() => { + this.sf.setValue('/takeEffectType', 1); + this.sf.setValue('/style', 1); + }, 500); + } + } + get reqParams() { + return {}; + } + disabledDate = (current: Date): boolean => { + // Can not select days before today and today + return differenceInCalendarDays(current, this.today) < 0; + } + changeTime() { + this.changeTimeFlag = true; + } + + + checkSort() { + const params: any = { + navigationId: this.sf?.value.navigationId, + sortId: this.sf?.value.sortId, + takeEffectType: this.sf?.value.takeEffectType, + }; + if (this.queryParams.id !== '0') { + params.advertisementId = this.queryParams.id; + } + if (this.sf.value.takeEffectType === 2) { + if (this.changeTimeFlag) { + params.takeEffectTime = format(this.detailData.takeEffectTime, 'yyyy-MM-dd HH:mm'); + } else { + params.takeEffectTime = this.detailData.takeEffectTime; + } + } + + } + save() { + const params: any = { + ...this.sf?.value, + latitude: this.inputPoint.lat, + longitude: this.inputPoint.lng, + id: this.queryParams.id + }; + this.detailData.advertisementContentDTOList.forEach((item: any) => { + delete item.addId; + }); + if (this.queryParams.type === 'add') { + delete params.id; + } + if (this.sf.value.takeEffectType === 2) { + if (this.changeTimeFlag) { + params.takeEffectTime = format(this.detailData.takeEffectTime, 'yyyy-MM-dd HH:mm'); + } else { + params.takeEffectTime = this.detailData.takeEffectTime; + } + } else { + delete params.takeEffectTime; + } + this.service.request(this.service.$api_add_one, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.router.navigate(['../list'], { relativeTo: this.route }); + } + }); + } + + goBack() { + window.history.go(-1); + } + gotoMap() { + this.isVisible = true; + } + + handleOk(): void { + this.isVisible = false; + } + + handleCancel(): void { + this.isVisible = false; + } + outputPointAddress(data: any) { + this.sf.setValue('/companyAddress', data.address); + this.inputPoint = data.inputPoint; + } +} diff --git a/src/app/routes/partner/scrollimg/components/add/add.less b/src/app/routes/partner/scrollimg/components/add/add.less new file mode 100644 index 00000000..0a6adacb --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/add/add.less @@ -0,0 +1,119 @@ +:host { + .styleBox { + display: flex; + align-items: flex-end; + margin: 10px 0 0 0; + } + .imgBox { + position: relative; + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + .leftBox, + .rightBox { + position: absolute; + top: 50%; + transform: translate(0, -50%); + } + img { + width: 170px; + height: 40px; + } + .leftBox { + left: 3px; + } + .rightBox { + right: 3px; + } + } + .imgBox_two { + width: 200px; + padding: 6px; + text-align: center; + border: solid 1px #eee; + img { + width: 100%; + height: 40px; + } + } + .imgBox_three { + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + img { + width: 25%; + height: 40px; + margin: 0 6% 0 0; + &:first-child { + margin: 0 6%; + } + } + } + .imgBox_four { + width: 200px; + padding: 6px 0; + text-align: center; + border: solid 1px #eee; + img { + width: 22%; + height: 40px; + margin: 0 2% 0 0; + &:first-child { + margin: 0 2%; + } + } + } + .imgBox_one { + width: 60px; + padding: 6px; + text-align: center; + border: solid 1px #eee; + img { + width: 100%; + height: 40px; + } + } + .imgBox_info { + width: 200px; + padding: 6px; + overflow: hidden; + border: solid 1px #eee; + .title { + width: 100%; + line-height: 30px; + text-align: center; + } + .infoBox { + .name { + line-height: 28px; + } + .map { + width: 100%; + text-align: center; + img { + width: 90%; + } + } + } + } + .hint { + margin: 0 0 0 10px; + color: #f00; + } + .addBtn { + margin: 0 0 10px 0; + } + } + .overflowText { + display: -webkit-box; + max-width: 200px; + overflow: hidden; + text-align: left; + text-overflow: -o-ellipsis-lastline; + text-overflow: ellipsis; + -webkit-line-clamp: 1; + line-clamp: 1; + -webkit-box-orient: vertical; + } \ No newline at end of file diff --git a/src/app/routes/partner/scrollimg/components/list/list.component.html b/src/app/routes/partner/scrollimg/components/list/list.component.html new file mode 100644 index 00000000..54ecf965 --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/list/list.component.html @@ -0,0 +1,62 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + + +
    diff --git a/src/app/routes/partner/scrollimg/components/list/list.component.less b/src/app/routes/partner/scrollimg/components/list/list.component.less new file mode 100644 index 00000000..0aae2779 --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/list/list.component.less @@ -0,0 +1 @@ +@import '~@delon/theme/index'; diff --git a/src/app/routes/partner/scrollimg/components/list/list.component.spec.ts b/src/app/routes/partner/scrollimg/components/list/list.component.spec.ts new file mode 100644 index 00000000..c8ac7672 --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/list/list.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdComponentsListComponent } from './list.component'; + +describe('AdComponentsListComponent', () => { + let component: AdComponentsListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdComponentsListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdComponentsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/partner/scrollimg/components/list/list.component.ts b/src/app/routes/partner/scrollimg/components/list/list.component.ts new file mode 100644 index 00000000..f1b7e90d --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/list/list.component.ts @@ -0,0 +1,283 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ScrollImgService } from '../../services/scrollimg.service'; + +@Component({ + selector: 'app-scrollimg-components-list', + templateUrl: './list.component.html', + styleUrls: ['./list.component.less'] +}) + +export class ScrollImgComponentsListComponent implements OnInit { + schema: SFSchema = {}; + columns: STColumn[] = []; + ui: SFUISchema = {}; + appList: any[] = []; + _$expand = false; + selectApp = { + appName: '', + appId: '' + }; + isLoading: boolean = false; + + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + constructor(public service: ScrollImgService, private modal: ModalHelper, private msg: NzMessageService, private router: Router, private modalSrv: NzModalService, private ar: ActivatedRoute) { } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + if (params.status === '') { + delete params.status; + } + if (params.style === '') { + delete params.style; + } + if (params.navigationId === '') { + delete params.navigationId; + } + return { ...params}; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit() { + this.initSF(); + this.initST(); + } + selectAppFun(item: any) { + this.selectApp = item; + this.st.load(1); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + _$expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + name: { + type: 'string', + title: '轮播图名称', + maxLength: 10, + ui: { + widget: '', + placeholder: '请输入', + } + }, + status1: { + type: 'string', + title: '可见范围', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + } as SFSelectWidgetSchema, + enum: [ + { label: '全部', value: 1 }, + { label: '全部可见', value: 2 }, + { label: '渠道销售可见', value: 3 }, + { label: '合伙人可见', value: 4 }, + ] + }, + status: { + type: 'string', + title: '状态', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + } as SFSelectWidgetSchema, + enum: [ + { label: '全部', value: 1 }, + { label: '正常', value: 2 }, + { label: '禁用', value: 3 } + ] + }, + }, + }; + this.ui = { + '*': { + spanLabelFixed: 110, + grid: { span: 8 }, + }, + }; + } + + initST() { + this.columns = [ + { + title: '轮播图名称', // 位:px + index: 'name', + className: 'text-center' + }, + { + title: '轮播图', + index: 'navigationName', + className: 'text-center' + }, + { + title: '可见范围', + index: 'navigationName', + className: 'text-center' + }, + { + title: '排序', // 位 px + index: 'sortId', + className: 'text-center' + }, + { + title: '状态', // 位 px + index: 'style', + className: 'text-center', + type: 'enum', + enum: { + 1: '正常', + 2: '禁用', + } + }, + { + title: '最后修改时间', // 位 px + index: 'createTime', + className: 'text-center' + }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 280, + buttons: [ + { + text: '修改', + click: (item) => { + this.router.navigate(['../detail'], { queryParams: { id: item.id, type: 'edit' }, relativeTo: this.ar }); + } + }, + { + text: '禁用', + pop: { + title: `是否确认禁用?`, + okType: 'danger', + icon: 'alert', + }, + click: (item) => { + this.changeStatus(item.id); + }, + iif: (item) => item.status === 1 + }, + { + text: '启用', + pop: { + title: `是否确认启用?`, + okType: 'danger', + icon: 'alert', + }, + click: (item) => { + this.changeStatus(item); + }, + iif: (item) => item.status === 2 + }, + { + text: '查看', + click: (item) => { + this.router.navigate(['../view'], { queryParams: { id: item.id, type: 'view' }, relativeTo: this.ar }); + } + }, + { + text: '删除', + pop: { + title: `确定删除吗?`, + okType: 'danger', + icon: 'alert', + }, + click: (item) => { + this.del(item); + }, + iif: (item) => item.status === 2 + }, + { + text: '操作记录', + click: (item) => { + this.router.navigate(['../operatordata'], { queryParams: { id: item.id }, relativeTo: this.ar }); + } + }, + ], + }, + ]; + } + changeStatus(item: any) { + const params = { + status, + idList: [item.id] + }; + // this.service.request(this.service.$api_openOrClose, params).subscribe(res => { + // if (res) { + // this.st.reload(); + // } + // }); + } + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + + /** + * 新增单个实例 + */ + add() { + this.router.navigate(['../detail'], { queryParams: { id: 0, type: 'add' }, relativeTo: this.ar }); + } + + /** + * 删除单个实例 + */ + del(item: any) { + const ids = []; + ids.push(item.id); + this.service.request(this.service.$api_del_many, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功'); + this.st.reload(); + } + }); + } +} diff --git a/src/app/routes/partner/scrollimg/components/list/list.less b/src/app/routes/partner/scrollimg/components/list/list.less new file mode 100644 index 00000000..d9b6c73f --- /dev/null +++ b/src/app/routes/partner/scrollimg/components/list/list.less @@ -0,0 +1,9 @@ +.selectApp { + display: flex; + .appTitle { + font-size: 14px; + } + } + .redfont{ + color: #f00; + } \ No newline at end of file diff --git a/src/app/routes/partner/scrollimg/services/scrollimg.service.ts b/src/app/routes/partner/scrollimg/services/scrollimg.service.ts new file mode 100644 index 00000000..0af4095c --- /dev/null +++ b/src/app/routes/partner/scrollimg/services/scrollimg.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from '@shared'; + +@Injectable({ + providedIn: 'root', +}) +export class ScrollImgService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/passport/components/login/login.component.html b/src/app/routes/passport/components/login/login.component.html new file mode 100644 index 00000000..79afbdb7 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.html @@ -0,0 +1,156 @@ + + +
    +
    +
    +
    + + +
    +
    + +
    + + + + 获取验证码 + + 请等待{{ count }}s + diff --git a/src/app/routes/passport/components/login/login.component.less b/src/app/routes/passport/components/login/login.component.less new file mode 100644 index 00000000..5e69a1b2 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.less @@ -0,0 +1,193 @@ +.body-box { + display : flex; + -webkit-flex-direction: column; + -ms-flex-direction : column; + flex-direction : column; + justify-content : space-between; + width : 100%; + max-width : 960px; + height : calc(100vh - 64px); + margin : auto; + -webkit-box-orient : vertical; + + .box-content { + width : 100%; + height : 600px; + border-radius: 0px 16px 16px 0px; + + .login-logo { + width : 310px; + height: 600px; + } + + .login-box { + flex : 1; + background-color: #fff; + + .login-box-content { + max-width: 434px; + margin : auto; + padding : 88px 0 38px; + } + } + + .form-box { + margin : 0 auto; + padding: 40px 88px 40px; + + + .title { + margin-bottom: 30px; + color : #1890ff; + font-weight : 800; + font-size : 32px; + text-align : center; + } + + .other { + margin-top : 24px; + line-height: 22px; + text-align : left; + } + } + } + + .box-footer { + padding-top: 70px; + color : #626262; + font-weight: 400; + font-size : 14px; + text-align : center; + } +} + +.forgetPwd { + font-weight: 400; + color : #26282A; + font-size : 14px; + text-align : center; + cursor : pointer; +} + +.agreement { + text-align: center; + font-size : 12px; + color : #86909C; + margin-top: 88px; + + a { + color: #E60012; + } +} + +::ng-deep { + passport-login { + background-color: #F8FBFD; + } + + .pro-passport { + min-height: calc(100vh - 64px); + } +} + +:host ::ng-deep { + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + } + + /* 火狐 */ + input[type='number'] { + -moz-appearance: textfield; + } + + // tabs样式调整 + .ant-tabs-nav-list { + width: 281px; + + .ant-tabs-tab-btn { + font-size : 24px; + color : #86909C; + font-weight: 500; + } + + } + + .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn { + color: #26282A; + } + + .ant-tabs-tab { + padding: 8px 0; + } + + .ant-tabs-top>.ant-tabs-nav { + margin: 0 0 38px 0; + + .ant-tabs-ink-bar { + background: #26282A; + } + } + + // input 框样式修改 + nz-input-group { + height : 44px; + font-size : 14px; + border-radius: 4px; + border-color : #E5E6EB; + box-shadow : none; + } + + .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover { + border-color: #E5E6EB; + } + + .ant-input { + padding : 10px 16px; + border-color : #E5E6EB; + border-radius: 4px; + font-size : 14px; + box-shadow : none; + } + + .ant-form-item { + margin-bottom: 32px; + } + + .ant-form-item-with-help { + margin-bottom: 0 !important; + } + + .ant-form-item-explain, + .ant-form-item-extra { + min-height : 32px; + line-height: 2; + } + + // 按钮样式修改 + .ant-btn { + padding: 0 16px 12px; + } + + .ant-btn-primary { + color : #fff; + background : #26282A; + border-color : #26282A; + font-size : 14px; + line-height : 40px; + height : 44px; + border-radius: 4px + } +} + +@media (max-width: 990px) { + .box-content { + + .login-logo { + width : 0px !important; + height: 0px !important; + } + } + +} \ No newline at end of file diff --git a/src/app/routes/passport/components/login/login.component.ts b/src/app/routes/passport/components/login/login.component.ts new file mode 100644 index 00000000..d9874028 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.ts @@ -0,0 +1,232 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, Optional, ViewChild } from '@angular/core'; +import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { StartupService } from '@core'; +import { ReuseTabService } from '@delon/abc/reuse-tab'; +import { DA_SERVICE_TOKEN, ITokenService, SocialOpenType, SocialService } from '@delon/auth'; +import { SFComponent, SFSchema, SFUISchema, SFStringWidgetSchema } from '@delon/form'; +import { SettingsService, _HttpClient } from '@delon/theme'; +import { environment } from '@env/environment'; +import { NzTabChangeEvent } from 'ng-zorro-antd/tabs'; +import { interval } from 'rxjs'; +import { finalize, take } from 'rxjs/operators'; +import { DunHelper } from 'src/app/shared/components/captcha'; +import { EAUserService, EACaptchaService, EAValidateService, EAPlatformService } from 'src/app/shared/services'; + +@Component({ + selector: 'passport-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.less'], + host: { + '[class.ant-row]': 'true', + '[class.pro-passport]': 'true' + } +}) +export class UserLoginComponent implements OnInit, OnDestroy { + @ViewChild('accountSF', { static: false }) + accountSF!: SFComponent; + @ViewChild('captchaSF', { static: false }) + captchaSF!: SFComponent; + accountSchema!: SFSchema; + accountUI!: SFUISchema; + captchaSchema!: SFSchema; + captchaUI!: SFUISchema; + count = 0; + type = 0; + + isPasswordType = true; + // vcode = null; + + copyright = ''; + constructor( + public userSrv: EAUserService, + private captchaSrv: EACaptchaService, + private validateSrv: EAValidateService, + private dunHelper: DunHelper, + private cdr: ChangeDetectorRef, + private router: Router + ) { + // this.vcode = this.platformSrv.getOperatorCode(); + // 加载copyright信息 + // this.userSrv + // .request(this.platformSrv.$api_get_config, { + // pageIndex: 1, + // pageSize: 999, + // }) + // .subscribe((res: any) => { + // this.copyright = res?.records?.find((f: any) => f.configKey === 'website.copyright')?.configValue; + // this.imageUrl = res?.records?.find((f: any) => f.configKey === 'platform.saas.logo')?.configValue; + // }); + } + + ngOnInit(): void { + this.initAccountSF(); + this.initCaptchaSF(); + } + + initAccountSF(): void { + this.accountSchema = { + properties: { + username: { + title: '', + type: 'string', + maxLength: 11, + ui: { + widget: 'custom', + size: 'large', + errors: { required: '请输入手机号', format: '手机号格式错误' } + } + }, + password: { + title: '', + type: 'string', + ui: { + widget: 'custom', + size: 'large', + errors: { required: '请输入密码' } + } + } + // sc: { + // title: '', + // type: 'string', + // ui: { + // hidden: !!this.vcode, + // placeholder: '请输入安全码', + // prefixIcon: 'safety', + // size: 'large', + // errors: { + // required: '请输入安全码' + // } + // } as SFStringWidgetSchema, + // default: this.vcode + // } + }, + required: ['username', 'password'] + }; + this.accountUI = { + '*': { spanLabelFixed: 110, grid: { span: 24 } } + }; + } + + initCaptchaSF(): void { + this.captchaSchema = { + properties: { + phone: { + title: '', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + widget: 'custom', + size: 'large', + errors: { required: '请输入手机号!', format: '手机号格式错误' } + } + }, + smsCode: { + title: '', + type: 'string', + maxLength: 6, + ui: { + widget: 'custom', + size: 'large', + errors: { required: '请输入验证码!', maxLength: '验证码错误' } + } + } + // sc: { + // title: '', + // type: 'string', + // ui: { + // hidden: !!this.vcode, + // placeholder: '请输入安全码', + // prefixIcon: 'safety', + // size: 'large', + // errors: { + // required: '请输入安全码' + // } + // } as SFStringWidgetSchema, + // default: this.vcode + // } + }, + required: ['phone', 'smsCode'] + }; + this.captchaUI = { + '*': { spanLabelFixed: 110, grid: { span: 24 } } + }; + } + + /** + * 获取验证码 + */ + getCaptcha(): void { + this.captchaSF.getProperty('/phone')?.updateValueAndValidity(); + const result = this.validateSrv.validateMobile(this.captchaSF.value.phone); + // this.captchaSrv.sendSMSCaptchaByMobile(); + if (result) { + this.captchaSrv.sendSMSCaptchaByMobile(this.captchaSF.value.phone).subscribe(res => { + console.log(res); + + if (res.success && res.data.code === '1') { + this.captchaSrv.msgSrv.success('发送验证码成功'); + this.createInterval(); + } + // else if (res.status === 503609) { + // this.dunHelper.popUp(this.captchaSF.value.phone).subscribe(_ => { + // this.createInterval(); + // this.dunHelper.destory(); + // }); + // } + else { + this.captchaSrv.msgSrv.warning(res.msg); + } + }); + } + } + + /** + * 登录 + */ + submit(): void { + if (this.type === 0) { + this.accountSF.validator({ emitError: true }); + if (!this.accountSF.valid) { + return; + } + this.userSrv.loginByAccount(this.accountSF.value.username, this.accountSF.value.password); + } else { + this.captchaSF.validator({ emitError: true }); + if (!this.captchaSF.valid) { + return; + } + this.userSrv.loginByMobile(this.captchaSF.value.phone, this.captchaSF.value.smsCode, this.captchaSF.value.sc); + } + // this.router.navigateByUrl('/'); + /* if (!this.accountSF.valid && !this.captchaSF.valid) { + return; + } + + Object.prototype.hasOwnProperty.call(value, 'username') + ? this.userSrv.loginByAccount(value.username, value.password) + : this.userSrv.loginByCaptcha(value.phone, value.smsCode); */ + } + + switch(ret: any) { + this.type = ret.index; + } + + ngOnDestroy(): void {} + + changeInputType(a: any) { + console.log(a); + } + + private createInterval() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } +} diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.html b/src/app/routes/passport/components/order-agreement/order-agreement.component.html new file mode 100644 index 00000000..a9106098 --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.html @@ -0,0 +1,19 @@ + +
    +
    +

    + {{ agreementContent?.agreementName }} +

    +

    最新版本生效日期:{{ agreementContent?.modifyTime }}

    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.less b/src/app/routes/passport/components/order-agreement/order-agreement.component.less new file mode 100644 index 00000000..867915ea --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.less @@ -0,0 +1,12 @@ +@import '~@delon/theme/index'; + +:host { + .page-box { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 50px; + background-color: #fff; + } +} diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.ts b/src/app/routes/passport/components/order-agreement/order-agreement.component.ts new file mode 100644 index 00000000..5fa44cad --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.ts @@ -0,0 +1,50 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-14 14:17:38 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-25 13:52:54 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\passport\\components\\order-agreement\\order-agreement.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; +import { PassportService } from '../../services/passport.service'; + +@Component({ + selector: 'app-buyer-components-serve-order-agreement', + templateUrl: './order-agreement.component.html', + styleUrls: ['./order-agreement.component.less'] +}) +export class OrderAgreementComponent implements OnInit { + agreementContent: any; + type = 2; + data : any; + constructor(private ar: ActivatedRoute, private service: PassportService) { + ar.queryParams.subscribe((params: Params) => { + console.log(params); + + this.type = params?.type || 2; + this.data = JSON.parse(params?.data) || {}; + }); + } + ngOnInit() { + console.log(this.type); + if(this.type == 3) { + console.log(this.data); + + this.service.request(this.service.$api_get_getSupplementaryAgreement, { billId: this.data?.billId, billCode: this.data?.billCode }).subscribe(res => { + if (res) { + this.agreementContent = res; + } + }); + } else { + this.service.request(this.service.$api_get_agreement, { type: this.type }).subscribe(res => { + if (res) { + this.agreementContent = res; + } + }); + } + } +} diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html new file mode 100644 index 00000000..cd15accc --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html @@ -0,0 +1,140 @@ +
    + + + + + + + +
    + +
    +
    +
    + + 手机号 + + + + + + 验证码 + + + + + + + + + + + +
    +
    +
    +
    + + +
    +
    +
    + + 设置新密码 + + + + + + + + +
    +
    + + +
    + +
    +
    + + 重复新密码 + + + + + + + + + +
    +
    + + +
    + +
    +
    + + + + + +
    +
    +
    +
    + + + + +
    + + 密码设置成功! + 密码设置失败! +
    +
    + +
    请牢记您的新密码,3秒后自动跳转至登录页...
    +
    + + + +
    +
    +
    +
    +
    + + + + 获取验证码 + + 请等待{{ count }}s + + + \ No newline at end of file diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less new file mode 100644 index 00000000..1922612a --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less @@ -0,0 +1,85 @@ +:host { + ::ng-deep { + .ant-steps { + width : 500px; + margin: 0 auto; + } + + .ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail::after { + background-color: #999494; + } + + .ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail::after { + background-color: #999494; + } + + .ant-spin-container { + background-color: #f8f8f8; + } + + .ant-form-item-label>label { + height: 40px; + } + + } + + .main { + max-width: 1200px; + margin : 0 auto; + overflow : hidden; + } + + page-grid { + width : 100%; + height : 100%; + margin : 100px auto; + background-color: #fff; + + .myForm { + margin-top : 3rem; + margin-bottom: 5rem; + } + + .steps-content { + min-height : 250px; + margin-top : 16px; + background-color: #fff; + border : 1px dashed #e9e9e9; + border-radius : 6px; + // text-align: center; + } + + .steps-action { + margin-top: 24px; + } + + button { + margin-right: 8px; + } + } +} + +.input-tootip { + display : flex; + align-items : center; + width : 250px; + padding-left: 20px; + + .dot { + color : #bdb8b8; + font-size: 21px; + } + + .valid-icon { + color: rgb(217 0 27); + } + + .invalid-icon { + color: rgb(82 196 26); + } + + .tootip-label { + margin-left: 8px; + font-size : 12px; + } +} \ No newline at end of file diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts new file mode 100644 index 00000000..df0184b0 --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts @@ -0,0 +1,187 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { interval } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { EAUserService } from 'src/app/shared/services/business/user.service'; + +@Component({ + selector: 'app-routes-password-retrieve-password', + templateUrl: './retrieve-password.component.html', + styleUrls: ['./retrieve-password.component.less'] +}) +export class UserRetrievePasswordComponent implements OnInit, AfterViewInit { + step = 0; + count = 0; + formGroup1!: FormGroup; + formGroup2!: FormGroup; + confirmPasswordValidator!: ValidatorFn; + result = true; + + isPassWordHide = true; + isConfirmPassWordHide = true; + + constructor(private fb: FormBuilder, public service: EAUserService, private router: Router, private cdr: ChangeDetectorRef) {} + + ngAfterViewInit(): void {} + + ngOnInit() { + this.initForm(); + } + + initForm() { + this.confirmPasswordValidator = control => { + if (!control.value) { + return { error: true, required: true }; + } else if (control.value !== this.formGroup2.controls.passWord.value) { + return { passWordTo: true, error: true }; + } + return {}; + }; + + this.formGroup1 = this.fb.group({ + phone: [null, [Validators.required]], + smsVerifyCode: [null, [Validators.required]], + voucher: [null, [Validators.required]] + }); + + this.formGroup2 = this.fb.group({ + passWord: [ + null, + [ + Validators.required, + Validators.maxLength(16), + Validators.minLength(8), + Validators.pattern('^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z-_]{8,16}$') + ] + ], + passWordTo: [null, [this.confirmPasswordValidator, Validators.maxLength(16), Validators.minLength(8)]], + voucher: [null, [Validators.required]], + phone: [null, [Validators.required]] + }); + } + + formSubmit() { + switch (this.step) { + case 0: + this.submitForm1(); + break; + case 1: + this.submitForm2(); + break; + } + } + + submitForm1() { + for (const i in this.formGroup1.controls) { + if (this.formGroup1.controls[i]) { + this.formGroup1.controls[i].markAsDirty(); + this.formGroup1.controls[i].updateValueAndValidity(); + } + } + if (this.formGroup1.value.smsVerifyCode.length !== 6) { + this.service.msgSrv.error('请输入6位验证码'); + return; + } + if (this.formGroup1.valid) { + const param = Object.assign({}, this.formGroup1.value); + this.service.http.post(this.service.$forgetPasswordVerifyIdentity, param).subscribe((res: any) => { + // console.log(res, 'submitForm1'); + if (res.success === true) { + this.formGroup2.patchValue( + { + voucher: res.data.voucher, + phone: this.formGroup1.value.phone + }, + { onlySelf: true } + ); + this.step = 1; + // clearInterval(this.interval$); + } else { + this.service.msgSrv.warning(res?.msg || '操作超时,请重新开始找回密码的流程!'); + // this.refreshPage(); + } + }); + } + } + + submitForm2() { + for (const i in this.formGroup2.controls) { + if (this.formGroup2.controls[i]) { + this.formGroup2.controls[i].markAsDirty(); + this.formGroup2.controls[i].updateValueAndValidity(); + } + } + + if (this.formGroup2.valid) { + this.service.http + .post(this.service.$voucherUpdatePassword, this.formGroup2.value) + .subscribe((res: { success: any; data: boolean; msg: any }) => { + if (res.success && res.data === true) { + this.result = true; + this.step = 2; + setTimeout(() => { + //this.service.logout(); + this.router.navigateByUrl('/passport/login'); + }, 3000); + } else { + this.result = false; + this.service.msgSrv.warning(res.msg || '密码修改失败!'); + } + }); + } + } + + getCaptcha() { + for (const i in this.formGroup1.controls) { + if (true) { + this.formGroup1.controls[i].markAsDirty(); + this.formGroup1.controls[i].updateValueAndValidity(); + } + } + if (this.formGroup1.value.phone.length !== 11) { + this.service.msgSrv.error('请输入11位手机号'); + return; + } + if (this.formGroup1.value.phone) { + this.service.http + .post(`${this.service.$getAccountSMVerificationCode}`, null, { phoneNumber: this.formGroup1.value.phone }) + .subscribe((res: any) => { + // console.log(res, 'res'); + if (res.success) { + this.formGroup1.patchValue( + { + voucher: res?.data?.voucher + }, + { onlySelf: true } + ); + if (res?.data?.code === '1') { + this.codeCountDown(); + this.service.msgSrv.success('验证码已发送到该账号绑定的手机号!'); + } else if (res?.data?.code === '503046') { + // this.dun.popUp(); + } else { + this.service.msgSrv.error('获取验证码失败!'); + } + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + } + + /* code倒计时 */ + codeCountDown() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } + + validateConfirmPassword(): void { + setTimeout(() => this.formGroup2.controls.passWordTo.updateValueAndValidity()); + } +} diff --git a/src/app/routes/passport/passport-routing.module.ts b/src/app/routes/passport/passport-routing.module.ts new file mode 100644 index 00000000..171e40f2 --- /dev/null +++ b/src/app/routes/passport/passport-routing.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { LayoutPassportComponent } from '../../layout/passport/passport.component'; +import { UserLoginComponent } from './components/login/login.component'; +import { OrderAgreementComponent } from './components/order-agreement/order-agreement.component'; +import { UserRetrievePasswordComponent } from './components/retrieve-password/retrieve-password.component'; + +const routes: Routes = [ + // passport + { + path: 'passport', + component: LayoutPassportComponent, + children: [ + { + path: 'login', + component: UserLoginComponent, + data: { title: '登录' } + }, + { + path: 'agreement', + component: OrderAgreementComponent, + data: { title: '协议' } + }, + { + path: 'retrieve-password', + component: UserRetrievePasswordComponent, + data: { title: '忘记密码' } + } + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class PassportRoutingModule {} diff --git a/src/app/routes/passport/passport.module.ts b/src/app/routes/passport/passport.module.ts new file mode 100644 index 00000000..ad3a9f31 --- /dev/null +++ b/src/app/routes/passport/passport.module.ts @@ -0,0 +1,68 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { ResultModule } from '@delon/abc/result'; +import { SEModule } from '@delon/abc/se'; +import { DelonACLModule } from '@delon/acl'; +import { DelonFormModule } from '@delon/form'; +import { AlainThemeModule } from '@delon/theme'; +import { PipeModule } from '@shared'; +import { NzAlertModule } from 'ng-zorro-antd/alert'; +import { NzAvatarModule } from 'ng-zorro-antd/avatar'; +import { NzButtonModule } from 'ng-zorro-antd/button'; +import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; +import { NzFormModule } from 'ng-zorro-antd/form'; +import { NzGridModule } from 'ng-zorro-antd/grid'; +import { NzIconModule } from 'ng-zorro-antd/icon'; +import { NzInputModule } from 'ng-zorro-antd/input'; +import { NzPopoverModule } from 'ng-zorro-antd/popover'; +import { NzProgressModule } from 'ng-zorro-antd/progress'; +import { NzSelectModule } from 'ng-zorro-antd/select'; +import { NzStepsModule } from 'ng-zorro-antd/steps'; +import { NzTabsModule } from 'ng-zorro-antd/tabs'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; +import { ProPageModule } from 'src/app/layout/pro/shared/page'; +import { UserLoginComponent } from './components/login/login.component'; +import { OrderAgreementComponent } from './components/order-agreement/order-agreement.component'; +import { UserRetrievePasswordComponent } from './components/retrieve-password/retrieve-password.component'; + +import { PassportRoutingModule } from './passport-routing.module'; + +const COMPONENTS = [ + // passport pages + UserLoginComponent, + UserRetrievePasswordComponent, + OrderAgreementComponent +]; + +@NgModule({ + imports: [ + PassportRoutingModule, + CommonModule, + FormsModule, + ReactiveFormsModule, + AlainThemeModule.forChild(), + NzTabsModule, + NzAlertModule, + NzFormModule, + NzGridModule, + NzInputModule, + NzSelectModule, + NzButtonModule, + NzCheckboxModule, + NzIconModule, + NzToolTipModule, + NzPopoverModule, + NzProgressModule, + NzAvatarModule, + SEModule, + ResultModule, + DelonACLModule, + DelonFormModule, + NzStepsModule, + ProPageModule, + PipeModule + ], + declarations: COMPONENTS +}) +export class PassportModule {} diff --git a/src/app/routes/passport/services/passport.service.ts b/src/app/routes/passport/services/passport.service.ts new file mode 100644 index 00000000..bb23b727 --- /dev/null +++ b/src/app/routes/passport/services/passport.service.ts @@ -0,0 +1,27 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-27 21:08:36 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-24 09:59:50 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\passport\\services\\passport.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services/core/base.service'; + +@Injectable({ + providedIn: 'root' +}) +export class PassportService extends BaseService { + // 登录协议,服务订购协议 + public $api_get_agreement = `/api/mdc/pbc/agreementInfo/getAgreementInfoByType?_allow_anonymous=true`; + // 查看补充协议 + public $api_get_getSupplementaryAgreement = `/api/sdc/billOperate/getSupplementaryAgreement?_allow_anonymous=true`; + // 未登录账号发送验证码 + public $getAccountSMVerificationCode = `/api/mdc/cuc/userBasicInfo/forgetPassword/getAccountSMVerificationCode?_allow_anonymous=true`; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/regulatory-data/components/dashboard/dashboard.component.html b/src/app/routes/regulatory-data/components/dashboard/dashboard.component.html new file mode 100644 index 00000000..06139f88 --- /dev/null +++ b/src/app/routes/regulatory-data/components/dashboard/dashboard.component.html @@ -0,0 +1,13 @@ + + diff --git a/src/app/routes/regulatory-data/components/dashboard/dashboard.component.less b/src/app/routes/regulatory-data/components/dashboard/dashboard.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/regulatory-data/components/dashboard/dashboard.component.ts b/src/app/routes/regulatory-data/components/dashboard/dashboard.component.ts new file mode 100644 index 00000000..d895eedc --- /dev/null +++ b/src/app/routes/regulatory-data/components/dashboard/dashboard.component.ts @@ -0,0 +1,66 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { G2PieClickItem, G2PieComponent, G2PieData } from '@delon/chart/pie'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.less'] +}) +export class DashboardComponent implements OnInit { + @ViewChild('pie', { static: false }) readonly pie!: G2PieComponent; + salesPieData: G2PieData[] = []; + total = ''; + + constructor(private msg: NzMessageService) { + this.refresh(); + } + ngOnInit(): void { + throw new Error('Method not implemented.'); + } + + refresh(): void { + const rv = (min: number = 0, max: number = 5000) => Math.floor(Math.random() * (max - min + 1) + min); + this.salesPieData = [ + { + x: '家用电器', + y: rv() + }, + { + x: '食用酒水', + y: rv() + }, + { + x: '个护健康', + y: rv() + }, + { + x: '服饰箱包', + y: rv() + }, + { + x: '母婴产品', + y: rv() + } + ]; + if (Math.random() > 0.5) { + this.salesPieData.push({ + x: '其他', + y: rv() + }); + } + this.total = `¥ ${this.salesPieData.reduce((pre, now) => now.y + pre, 0).toFixed(2)}`; + if (this.pie) { + // 等待组件渲染 + setTimeout(() => this.pie.changeData()); + } + } + + format(val: number): string { + return `¥ ${val.toFixed(2)}`; + } + + handleClick(data: G2PieClickItem): void { + this.msg.info(`${data.item.x} - ${data.item.y}`); + } +} diff --git a/src/app/routes/regulatory-data/regulatory-data-routing.module.ts b/src/app/routes/regulatory-data/regulatory-data-routing.module.ts new file mode 100644 index 00000000..bb68bd97 --- /dev/null +++ b/src/app/routes/regulatory-data/regulatory-data-routing.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { DashboardComponent } from './components/dashboard/dashboard.component'; + +const routes: Routes = [{ path: 'dashboard', component: DashboardComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class RegulatoryDataRoutingModule {} diff --git a/src/app/routes/regulatory-data/regulatory-data.module.ts b/src/app/routes/regulatory-data/regulatory-data.module.ts new file mode 100644 index 00000000..c76d3521 --- /dev/null +++ b/src/app/routes/regulatory-data/regulatory-data.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { SharedModule, SHARED_G2_MODULES } from '@shared'; + +import { DashboardComponent } from './components/dashboard/dashboard.component'; +import { RegulatoryDataRoutingModule } from './regulatory-data-routing.module'; + +const COMPONENTS: any = [DashboardComponent]; +const NOTROUTECOMPONENTS: any = []; +@NgModule({ + declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, RegulatoryDataRoutingModule, SharedModule, SHARED_G2_MODULES] +}) +export class RegulatoryDataModule {} diff --git a/src/app/routes/regulatory-data/services/regulatory-data.service.ts b/src/app/routes/regulatory-data/services/regulatory-data.service.ts new file mode 100644 index 00000000..7206840f --- /dev/null +++ b/src/app/routes/regulatory-data/services/regulatory-data.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class RegulatoryDataService { + + constructor() { } +} diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts new file mode 100644 index 00000000..544a7684 --- /dev/null +++ b/src/app/routes/routes-routing.module.ts @@ -0,0 +1,105 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-13 19:22:47 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-30 14:09:00 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\routes-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +// layout +import { LayoutProComponent } from '@brand'; +import { EATokenGuard } from '@core'; +import { environment } from '@env/environment'; + +import { AuthGuard } from '../core/guards/auth.guard'; + +// dashboard pages +import { DashboardComponent } from './dashboard/dashboard.component'; +import { OrderAgreementComponent } from './passport/components/order-agreement/order-agreement.component'; + +const routes: Routes = [ + { + path: '', + component: LayoutProComponent, + canActivate: [AuthGuard, EATokenGuard], + canActivateChild: [AuthGuard, EATokenGuard], + children: [ + { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, + { path: 'dashboard', component: DashboardComponent }, + { + path: 'account', + loadChildren: () => import('./account/account.module').then(m => m.AccountModule) + }, + { + path: 'usercenter', + loadChildren: () => import('./usercenter/usercenter.module').then(m => m.UsercenterModule) + }, + { path: 'system', loadChildren: () => import('./sys-setting/sys-setting.module').then(m => m.SysSettingModule) }, + { path: 'logs', loadChildren: () => import('./logs/logs.module').then(m => m.LogsModule) }, + { path: 'ticket', loadChildren: () => import('./ticket-management/ticket-management.module').then(m => m.TicketManagementModule) }, + { path: 'supplygoods', loadChildren: () => import('./supply-goods/supply-goods.module').then(m => m.SupplyGoodsModule) }, + { path: 'vehicle', loadChildren: () => import('./vehicle/vehicle.module').then(m => m.VehicleModule) }, + { + path: 'supply-management', + loadChildren: () => import('./supply-management/supply-management.module').then(m => m.SupplyManagementModule) + }, + { + path: 'insurance-management', + loadChildren: () => import('./insurance-management/insurance-management.module').then(m => m.InsuranceManagementModule) + }, + { + path: 'order-management', + loadChildren: () => import('./order-management/order-management.module').then(m => m.OrderManagementModule) + }, + { + path: 'waybill-management', + loadChildren: () => import('./waybill-management/waybill-management.module').then(m => m.WaybillManagementModule) + }, + { + path: 'financial-management', + loadChildren: () => import('./financial-management/financial-management.module').then(m => m.FinancialManagementModule) + }, + { + path: 'contract-management', + loadChildren: () => import('./contract-management/contract-management.module').then(m => m.ContractManagementManagementModule) + }, + { path: 'menu-management', loadChildren: () => import('./menu-manager/menu-manager.module').then(m => m.MenuManagerModule) }, + { path: 'partner', loadChildren: () => import('./partner/partner.module').then(m => m.PartnerModule) }, + { path: 'regulatory-data', loadChildren: () => import('./regulatory-data/regulatory-data.module').then(m => m.RegulatoryDataModule) }, + { + path: 'download', + loadChildren: () => import('./download/download.module').then(m => m.DownloadModule) + }, + { path: 'datatable', loadChildren: () => import('./datatable/datatable.module').then((m) => m.DatatableModule) }, + { path: 'tax', loadChildren: () => import('./tax-management/taxmanagement.module').then((m) => m.TaxManagementModule) }, + ] + }, + // passport + { + path: 'agreement', + component: OrderAgreementComponent, + data: { title: '协议', titleI18n: 'app.login.agreement' } + }, + { path: '', loadChildren: () => import('./passport/passport.module').then(m => m.PassportModule) }, + { path: 'exception', loadChildren: () => import('./exception/exception.module').then(m => m.ExceptionModule) }, + // 单页不包裹Layout + { path: '**', redirectTo: 'exception/404' } +]; + +@NgModule({ + imports: [ + RouterModule.forRoot(routes, { + useHash: environment.useHash, + // NOTICE: If you use `reuse-tab` component and turn on keepingScroll you can set to `disabled` + // Pls refer to https://ng-alain.com/components/reuse-tab + scrollPositionRestoration: 'top' + }) + ], + exports: [RouterModule] +}) +export class RouteRoutingModule { } diff --git a/src/app/routes/routes.module.ts b/src/app/routes/routes.module.ts new file mode 100644 index 00000000..a185d251 --- /dev/null +++ b/src/app/routes/routes.module.ts @@ -0,0 +1,17 @@ +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; + +// dashboard pages +import { DashboardComponent } from './dashboard/dashboard.component'; +import { RouteRoutingModule } from './routes-routing.module'; +import { BasicTableComponent } from './commom/components/basic-table/basic-table.component'; + +const COMPONENTS = [DashboardComponent, BasicTableComponent]; +const COMPONENTS_NOROUNT: Array> = []; + +@NgModule({ + imports: [SharedModule, RouteRoutingModule], + declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT], + entryComponents: COMPONENTS_NOROUNT +}) +export class RoutesModule {} diff --git a/src/app/routes/supply-goods/components/carload/carload.component.html b/src/app/routes/supply-goods/components/carload/carload.component.html new file mode 100644 index 00000000..a7cae549 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.html @@ -0,0 +1,213 @@ + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + + + +
    +
    +
    +
    + +
    + +
    + + + + 共 {{ total }} 条 + + + 货源编号 + 货源类型 + 货主 + 项目名称 + 装货地 + 卸货地 + 货物名称 + 重量/体积 + 用车需求 + 总费用 + 附加费 + 用车需求 + 货源状态 + 创建时间 + 审核状态 + 操作 + + + + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + +
    已接单
    +
    已取消
    +
    待接单
    + + + {{ data.id3 }} + + +
    +
    审核通过
    +
    不通过
    +
    待审核
    + +
    + + + + + + +
    +
    +
    +
    + + + + + +
    + {{ this.sfFre.value.contactsName }} +
    +
    + +    天内支付运费。 + + 15.00(费率:5.3 +
    +
    + + + + +
    + + + + + + + + + + + + diff --git a/src/app/routes/supply-goods/components/carload/carload.component.less b/src/app/routes/supply-goods/components/carload/carload.component.less new file mode 100644 index 00000000..36f9126d --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.less @@ -0,0 +1,7 @@ + +.status-point { + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; +} diff --git a/src/app/routes/supply-goods/components/carload/carload.component.spec.ts b/src/app/routes/supply-goods/components/carload/carload.component.spec.ts new file mode 100644 index 00000000..00b3e821 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-08 15:46:29 + * @LastEditTime: 2021-12-01 10:02:07 + * @LastEditors: Please set LastEditors + * @Reference: + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyGoodsComponentListCarloadComponent } from './carload.component'; + +describe('SupplyGoodsComponentListCarloadComponent', () => { + let component: SupplyGoodsComponentListCarloadComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SupplyGoodsComponentListCarloadComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyGoodsComponentListCarloadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-goods/components/carload/carload.component.ts b/src/app/routes/supply-goods/components/carload/carload.component.ts new file mode 100644 index 00000000..a14ed204 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.ts @@ -0,0 +1,394 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-15 09:42:57 + * @LastEditTime : 2022-02-25 15:34:50 + * @LastEditors : Shiming + * @Reference: + */ +import { AfterViewInit, Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { STChange, STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFRadioWidgetSchema, SFSchema, SFTextWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { filter } from 'rxjs/operators'; + + +@Component({ + selector: 'app-supply-goods-components-list-carload', + templateUrl: './carload.component.html', + styleUrls: ['./carload.component.less'], +}) +export class SupplyGoodsComponentListCarloadComponent implements OnInit, AfterViewInit { + @ViewChild('st', { static: true }) st!: STComponent; + @ViewChild('stAssign', { static: true }) stAssign!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfAssign', { static: false }) sfAssign!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + isVisible = false; + isVisibleAssign = false; + ColumnsAssign!: STColumn[]; + ui: SFUISchema = {}; + uiFre: SFUISchema = {}; + mode: any = 'search'; + demoValue: any; + tabs = ['全部', '待接单', '已接单', '已取消']; + listData: any =[ + { + id: 1, + id2: 2, + id3:3, + id4: 4, + } + ] + listData2: any = [ + { + clientGroupName: '姓名', + clientCount: '姓名', + clientCount2: '姓名', + clientCount3: '姓名', + } + ] + orderStatus: any = '0'; // 订单状态, 10为已提交待付款, 20为已付款待发,30为已发货待收货,50取消订单,40 已完成 + nzSelectedIndex = 0; + total = 1; + loading = false; + pageSize = 20; + pageIndex = 1; + toSendCount = 0; + addTimeStart = ''; + addTimeEnd = ''; + sfExpand = false; + _$expand = false; + ssdsad: any; + schema!: SFSchema; + schemaAssign!: SFSchema; + freightSchema!: SFSchema; + payStatus: any; + constructor( + private fb: FormBuilder, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + private modalHelper: ModalHelper, + ) {} + + ngOnInit(): void { + this.getList(); + this.initSF(); + this.initUI(); + this.initSFFre(); + this.initSFAssign(); + } + + ngAfterViewInit() { + // this.router.events.pipe(filter((evt) => evt instanceof NavigationEnd)).subscribe(() => { + // + // }); + } + /** + * 指定客户分组查询参数 + */ + get reqParamsAssign() { + const params = Object.assign({}); + return { ...params, ...this.sfAssign?.value }; + } + change(change: STChange) { + console.log(change.checkbox) + } + initSFFre() { + this.freightSchema = { + properties: { + btn: { + type: 'string', + title: '是否回单', + enum: ['需要', '不需要'], + ui: { + widget: 'radio', + } as SFRadioWidgetSchema, + default: '需要', + }, + contactsName: { + title: '预付', + type: 'string', + minimum:0, + maximum:99999, + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '到付', + type: 'string', + minimum:0, + maximum:99999, + ui: { + showRequired: false, + }, + }, + // unifiedSocialCreditCode2: { + // title: '油卡', + // type: 'string', + // minimum:0, + // maximum:99999, + // ui: { + // showRequired: false, + // }, + // }, + unifiedSocialCreditCode3: { + title: '回单付', + type: 'string', + minimum:0, + maximum:99999, + ui: { + showRequired: false, + }, + }, + '小计': { type: 'number', ui: { widget: 'text', defaultText: '5000 text' } as SFTextWidgetSchema }, + fujia: { type: 'string',title: '附加费', ui: { widget: 'custom'}}, + manys: { type: 'string',title: '总费用', ui: { widget: 'custom'}}, + unifiedSocia: { type: 'string',title: '总费用', ui: { widget: 'custom'}}, + + }, + }; + this.schemaAssign = { + properties: { + clientGroupName: { + title: '分组名称', + type: 'string', + ui: { + placeholder: '请输入司机姓名/手机号', + enter: (e: KeyboardEvent) => { + this.stAssign.load(); + }, + }, + }, + clientGroupName2: { + title: '分组名称', + type: 'string', + ui: { + placeholder: '请输入车牌号', + enter: (e: KeyboardEvent) => { + this.stAssign.load(); + }, + }, + }, + }, + }; + this.uiFre = { '*': { spanLabelFixed: 90, grid: { span: 16 }, enter: () => this.st.load() } }; + } + initSFAssign() { + this.ColumnsAssign = [ + { title: '', type: 'checkbox', width: '40px', className: 'text-center' }, + { title: '司机姓名', index: 'clientGroupName', width: '300px', className: 'text-center' }, + { title: '手机号', index: 'clientCount', width: '300px', className: 'text-center' }, + { title: '车牌号', index: 'clientCount2', width: '300px', className: 'text-center' }, + { title: '状态', index: 'clientCount3', width: '300px', className: 'text-center' }, + ]; + } + + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '货源编号', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '货物名称', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '装货地', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode2: { + title: '卸货地', + type: 'string', + ui: { + showRequired: false, + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + unifiedSocialCreditCode3: { + title: '货主', + type: 'string', + ui: { + showRequired: false, + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: '审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + }, + }; + + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + initUI() { + this.ui = { + '*': { + spanLabelFixed: 90, + grid: { span: 8 }, + }, + }; + } + tabChange(i: number) { + console.log(i) + this.changeIndex(i); + this.getList(); + } + changeIndex(i: number) { + if (i === 0) { + this.orderStatus = '0'; + this.payStatus = null; + } else if (i === 1) { + this.orderStatus = '5'; + this.payStatus = null; + } else if (i === 2) { + this.orderStatus = null; + this.payStatus = '10'; + } else if (i === 3) { + this.orderStatus = '20'; + this.payStatus = null; + } + this.pageIndex = 1; + } + getList(type?: string) { + // this.loading = true; + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + payStatus: this.payStatus, + createTime: this.sf?.value.createTime || [], + time: {}, + }; + if (this.sf?.value?.createTime) { + delete params.createTime; + params.time.start = this.sf?.value?.createTime[0]; + params.time.end = this.sf?.value?.createTime[1]; + } + delete params.expand; + if (type === 'search') { + params.pageIndex = 1; + } + // this.service.request(this.service.$api_get_page, params).subscribe((res) => { + // this.loading = false; + // this.listData = res.orderPage.records; + // this.toSendCount = res.toSendCount; + // this.listData.forEach((element: { goodsList: { goodsSpecJson: string }[] }) => { + // element.goodsList.forEach((item: { goodsSpecJson: string }) => { + // if (item.goodsSpecJson) { + // item.goodsSpecJson = JSON.parse(item.goodsSpecJson); + // } + // }); + // }); + // this.total = res.orderPage.total; + // }); + } + + orderExport() { + // this.service.exportStart(params, this.service.$api_export); + this.modal.create({ + nzTitle: '订单导出', + // nzContent: this.exportTemplate, + // nzContent: `待导出订单总数:${this.pageInfo.total}条,确定要导出吗?`, + nzOnOk: () => { + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + // createTime: this.sf?.value.createTime || [], + }; + delete params.expand; + }, + }); + } + + goDetail(data: any) { + this.router.navigate(['../order-detail', data.orderSn], { relativeTo: this.ar }); + } + + + changePageIndex(pageIndex: number) { + this.pageIndex = pageIndex; + this.getList(); + } + changePageSize(value: number) { + this.pageSize = value; + this.getList(); + } + expandToggle() { + this.sfExpand = !this.sfExpand; + this.sf?.setValue('/expand', this.sfExpand); + } + + showApply() { + this.isVisible = true + } + showAssign() { + this.isVisibleAssign = true + } + handleOK() { + + } +handleCancel(type: any) { + if(type === 'suppliersType') { + this.isVisible = false + } else if(type === 'assign') { + this.isVisibleAssign = false + } +} + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.sfExpand = false; + } + resetSFAssign() { + this.sfAssign.reset(); + } + + + + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } +} diff --git a/src/app/routes/supply-goods/components/large-amount/large-amount.component.html b/src/app/routes/supply-goods/components/large-amount/large-amount.component.html new file mode 100644 index 00000000..c6d18d1a --- /dev/null +++ b/src/app/routes/supply-goods/components/large-amount/large-amount.component.html @@ -0,0 +1,158 @@ + + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + + 共 {{ total }} 条 + + + 货源编号 + 货源类型 + 货主 + 项目名称 + 关联运单 + 货物信息 + 装货地 + 卸货地 + 用车需求 + 运费单价 + 结算重量 + 录单员 + 调度员 + 货源状态 + 截止时间 + 创建时间 + 审核状态 + 操作 + + + + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + + {{ data.id3 }} + + +
    已接单
    +
    已取消
    +
    待接单
    + + + {{ data.id3 }} + + + + {{ data.id3 }} + + +
    +
    审核通过
    +
    不通过
    +
    待审核
    + +
    + + + + + + +
    +
    +
    +
    diff --git a/src/app/routes/supply-goods/components/large-amount/large-amount.component.less b/src/app/routes/supply-goods/components/large-amount/large-amount.component.less new file mode 100644 index 00000000..36f9126d --- /dev/null +++ b/src/app/routes/supply-goods/components/large-amount/large-amount.component.less @@ -0,0 +1,7 @@ + +.status-point { + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; +} diff --git a/src/app/routes/supply-goods/components/large-amount/large-amount.component.spec.ts b/src/app/routes/supply-goods/components/large-amount/large-amount.component.spec.ts new file mode 100644 index 00000000..4511b1f3 --- /dev/null +++ b/src/app/routes/supply-goods/components/large-amount/large-amount.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-08 15:46:29 + * @LastEditTime: 2021-12-01 10:02:07 + * @LastEditors: Please set LastEditors + * @Reference: + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyGoodsComponentListLargeAmountComponent } from './large-amount.component'; + +describe('SupplyGoodsComponentListLargeAmountComponent', () => { + let component: SupplyGoodsComponentListLargeAmountComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SupplyGoodsComponentListLargeAmountComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyGoodsComponentListLargeAmountComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-goods/components/large-amount/large-amount.component.ts b/src/app/routes/supply-goods/components/large-amount/large-amount.component.ts new file mode 100644 index 00000000..50ac2849 --- /dev/null +++ b/src/app/routes/supply-goods/components/large-amount/large-amount.component.ts @@ -0,0 +1,252 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-15 09:42:57 + * @LastEditTime: 2021-12-01 15:06:11 + * @LastEditors: Please set LastEditors + * @Reference: + */ +import { AfterViewInit, Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { filter } from 'rxjs/operators'; + + +@Component({ + selector: 'app-supply-goods-components-list-large-amount', + templateUrl: './large-amount.component.html', + styleUrls: ['./large-amount.component.less'], +}) +export class SupplyGoodsComponentListLargeAmountComponent implements OnInit, AfterViewInit { + @ViewChild('st', { static: true }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + validateForm!: FormGroup; + @ViewChild('exportTemplate') + exportTemplate!: TemplateRef; + ui: SFUISchema = {}; + mode: any = 'search'; + tabs = ['全部', '进行中', '已完结', '已取消']; + listData: any =[ + { + id: 1, + id2: 2, + id3:3, + id4: 4, + } + ] + orderStatus: any = '0'; // 订单状态, 10为已提交待付款, 20为已付款待发,30为已发货待收货,50取消订单,40 已完成 + nzSelectedIndex = 0; + total = 1; + loading = false; + pageSize = 20; + pageIndex = 1; + toSendCount = 0; + addTimeStart = ''; + addTimeEnd = ''; + sfExpand = false; + _$expand = false; + + schema!: SFSchema; + payStatus: any; + constructor( + private fb: FormBuilder, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + private modalHelper: ModalHelper, + public shipperSrv: ShipperBaseService + + ) {} + + ngOnInit(): void { + this.getList(); + this.initSF(); + this.initUI(); + } + + ngAfterViewInit() { + // this.router.events.pipe(filter((evt) => evt instanceof NavigationEnd)).subscribe(() => { + // + // }); + } + + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '货源编号', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '货物名称', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '装货地', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode2: { + title: '卸货地', + type: 'string', + ui: { + showRequired: false, + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + createUserId: { + type: 'string', + title: '录单员', + default: '', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + asyncData: () => this.shipperSrv.getStaffList(), + allowClear: true, + }, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + initUI() { + this.ui = { + '*': { + spanLabelFixed: 90, + grid: { span: 8 }, + }, + }; + } + tabChange(i: number) { + console.log(i) + this.changeIndex(i); + this.getList(); + } + changeIndex(i: number) { + if (i === 0) { + this.orderStatus = '0'; + this.payStatus = null; + } else if (i === 1) { + this.orderStatus = '5'; + this.payStatus = null; + } else if (i === 2) { + this.orderStatus = null; + this.payStatus = '10'; + } else if (i === 3) { + this.orderStatus = '20'; + this.payStatus = null; + } + this.pageIndex = 1; + } + getList(type?: string) { + // this.loading = true; + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + payStatus: this.payStatus, + createTime: this.sf?.value.createTime || [], + time: {}, + }; + if (this.sf?.value?.createTime) { + delete params.createTime; + params.time.start = this.sf?.value?.createTime[0]; + params.time.end = this.sf?.value?.createTime[1]; + } + delete params.expand; + if (type === 'search') { + params.pageIndex = 1; + } + // this.service.request(this.service.$api_get_page, params).subscribe((res) => { + // this.loading = false; + // this.listData = res.orderPage.records; + // this.toSendCount = res.toSendCount; + // this.listData.forEach((element: { goodsList: { goodsSpecJson: string }[] }) => { + // element.goodsList.forEach((item: { goodsSpecJson: string }) => { + // if (item.goodsSpecJson) { + // item.goodsSpecJson = JSON.parse(item.goodsSpecJson); + // } + // }); + // }); + // this.total = res.orderPage.total; + // }); + } + + orderExport() { + // this.service.exportStart(params, this.service.$api_export); + this.modal.create({ + nzTitle: '订单导出', + nzContent: this.exportTemplate, + // nzContent: `待导出订单总数:${this.pageInfo.total}条,确定要导出吗?`, + nzOnOk: () => { + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + // createTime: this.sf?.value.createTime || [], + }; + delete params.expand; + }, + }); + } + + goDetail(data: any) { + this.router.navigate(['../order-detail', data.orderSn], { relativeTo: this.ar }); + } + + + changePageIndex(pageIndex: number) { + this.pageIndex = pageIndex; + this.getList(); + } + changePageSize(value: number) { + this.pageSize = value; + this.getList(); + } + expandToggle() { + this.sfExpand = !this.sfExpand; + this.sf?.setValue('/expand', this.sfExpand); + } + + showApply() { + + } + + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.sfExpand = false; + } + + + + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } +} diff --git a/src/app/routes/supply-goods/components/list/list.component.html b/src/app/routes/supply-goods/components/list/list.component.html new file mode 100644 index 00000000..49b36faf --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.html @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/src/app/routes/supply-goods/components/list/list.component.spec.ts b/src/app/routes/supply-goods/components/list/list.component.spec.ts new file mode 100644 index 00000000..1327ea76 --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-01 09:25:32 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:26:01 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-goods\\components\\list\\list.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyGoodsComponentListComponent } from './list.component'; + +describe('SupplyGoodsComponentListComponent', () => { + let component: SupplyGoodsComponentListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SupplyGoodsComponentListComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyGoodsComponentListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-goods/components/list/list.component.ts b/src/app/routes/supply-goods/components/list/list.component.ts new file mode 100644 index 00000000..66b5c93b --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.ts @@ -0,0 +1,25 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-01 09:25:32 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:26:12 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-goods\\components\\list\\list.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-supply-goods-components-list', + templateUrl: './list.component.html' +}) +export class SupplyGoodsComponentListComponent implements OnInit { + constructor(private ar: ActivatedRoute) {} + nzSelectedIndex = 0; + ngOnInit(): void { + this.nzSelectedIndex = this.ar.snapshot.queryParams.nzSelectedIndex; + } +} diff --git a/src/app/routes/supply-goods/services/supply-goods.service.ts b/src/app/routes/supply-goods/services/supply-goods.service.ts new file mode 100644 index 00000000..49f54aac --- /dev/null +++ b/src/app/routes/supply-goods/services/supply-goods.service.ts @@ -0,0 +1,22 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-01 09:24:09 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:26:22 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-goods\\services\\supply-goods.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services/core/base.service'; + +@Injectable({ + providedIn: 'root' +}) +export class SupplyGoodsService extends BaseService { + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/supply-goods/supply-goods-routing.module.ts b/src/app/routes/supply-goods/supply-goods-routing.module.ts new file mode 100644 index 00000000..6a0cfb06 --- /dev/null +++ b/src/app/routes/supply-goods/supply-goods-routing.module.ts @@ -0,0 +1,22 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-01 09:24:09 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:25:04 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-goods\\supply-goods-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { SupplyGoodsComponentListComponent } from './components/list/list.component'; + +const routes: Routes = [{ path: 'list', component: SupplyGoodsComponentListComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SupplyGoodsRoutingModule {} diff --git a/src/app/routes/supply-goods/supply-goods.module.ts b/src/app/routes/supply-goods/supply-goods.module.ts new file mode 100644 index 00000000..ecec755d --- /dev/null +++ b/src/app/routes/supply-goods/supply-goods.module.ts @@ -0,0 +1,30 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-01 09:24:09 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:25:15 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-goods\\supply-goods.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { SupplyGoodsComponentListCarloadComponent } from './components/carload/carload.component'; +import { SupplyGoodsComponentListLargeAmountComponent } from './components/large-amount/large-amount.component'; +import { SupplyGoodsComponentListComponent } from './components/list/list.component'; +import { SupplyGoodsRoutingModule } from './supply-goods-routing.module'; + + +const COMPONENTS = [ + SupplyGoodsComponentListComponent, + SupplyGoodsComponentListCarloadComponent, + SupplyGoodsComponentListLargeAmountComponent +]; + +@NgModule({ + imports: [SharedModule, SupplyGoodsRoutingModule], + declarations: [...COMPONENTS] +}) +export class SupplyGoodsModule {} diff --git a/src/app/routes/supply-management/components/add-driver/add-driver.component.html b/src/app/routes/supply-management/components/add-driver/add-driver.component.html new file mode 100644 index 00000000..e7df0e64 --- /dev/null +++ b/src/app/routes/supply-management/components/add-driver/add-driver.component.html @@ -0,0 +1,62 @@ + + + +
    + + +
    +
    +
    正面照
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照
    +
    示例
    +
    +
    +
    +
    +
    + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/src/app/routes/supply-management/components/add-driver/add-driver.component.less b/src/app/routes/supply-management/components/add-driver/add-driver.component.less new file mode 100644 index 00000000..af8ad338 --- /dev/null +++ b/src/app/routes/supply-management/components/add-driver/add-driver.component.less @@ -0,0 +1,57 @@ +.sfBox{ + position: relative; +} +.pr { + position: relative; +} + +.pa { + position: absolute; + top: 35px; + left: 150px; + img{border: solid 1px #ebf0fb;} +} + +.tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } +} +.drivercard{ + position: absolute; + top: 620px; + left: 330px; + border: solid 1px #ebf0fb; +} +.jopcard{ + position: absolute; + top: 1034px; + left: 330px; + border: solid 1px #ebf0fb; +} +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + .setCustom .ant-form-item-control{ + margin-left: -100px !important + } + .borderImg{ + border: solid 1px #ebf0fb; + } + } +} \ No newline at end of file diff --git a/src/app/routes/supply-management/components/add-driver/add-driver.component.spec.ts b/src/app/routes/supply-management/components/add-driver/add-driver.component.spec.ts new file mode 100644 index 00000000..92751ffa --- /dev/null +++ b/src/app/routes/supply-management/components/add-driver/add-driver.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CarAddDriverComponent } from './add-driver.component'; + +describe('CarAddDriverComponent', () => { + let component: CarAddDriverComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CarAddDriverComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CarAddDriverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/add-driver/add-driver.component.ts b/src/app/routes/supply-management/components/add-driver/add-driver.component.ts new file mode 100644 index 00000000..18c09240 --- /dev/null +++ b/src/app/routes/supply-management/components/add-driver/add-driver.component.ts @@ -0,0 +1,640 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { cacheConf } from '@conf/cache.conf'; +import { SFComponent, SFUISchema, SFSchema, SFUploadWidgetSchema, SFDateWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EACacheService, EAEnvironmentService } from '@shared'; +import { AnyRecord } from 'dns'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/supply-management.service'; +@Component({ + selector: 'app-car-add-driver', + templateUrl: './add-driver.component.html', + styleUrls: ['./add-driver.component.less'] +}) +export class CarAddDriverComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; + record: any = {}; + i: any; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + ui3: SFUISchema = {}; + schema: SFSchema = {}; + schema1: SFSchema = {}; + schema2: SFSchema = {}; + showCardFlag = false; + showJopFlag = false; + detailData: any = { + identityInfoDTO: {}, + userDriverLicenseDTO: {}, + userPracticeSeniorityDTO: {} + }; + companyData: any = {}; + mobile = '' + checked = false + constructor( + private modal: NzModalRef, + public service: SupplyManagementService, + private envSrv: EAEnvironmentService, + private eaCacheSrv: EACacheService, + ) { } + + ngOnInit(): void { + this.companyData = this.eaCacheSrv.get(cacheConf.env) + this.initSF() + } + initSF() { + this.schema = { + properties: { + titleA: { + title: '司机信息(必填)', + type: 'string', + ui: { + widget: 'text', + }, + default: '照片上传后会自动识别文字并填充下列内容栏' + }, + mobile: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + widget: '', + }, + default: this.mobile + }, + showName: { + title: '身份证照片', + type: 'string', + readOnly: true, + ui: { + widget: 'textarea', + borderless:true, + showRequired: true, + }, + default: '请上传身份证原件的高清照片,若上传复印件,则需加盖公司印章及法人签字;上传后系统会自动识别并填写', + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoFrontWatermark', avatar); + this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath + this.checkIdCard(args.file.response.data.fullFilePath, 'front', 0); + } else { + this.detailData.certificatePhotoFront = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url), + }, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoBackWatermark', avatar); + this.detailData.certificatePhotoBack = args.file.response.data.fullFilePath + this.checkIdCard(args.file.response.data.fullFilePath, 'back', 0); + } else { + this.detailData.certificatePhotoBack = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url),} + }, + name: { + title: '姓名', + type: 'string', + maxLength: 32, + ui: { + widget: '', + placeholder: '请输入姓名', + }, + }, + certificateNumber: { + title: '身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + widget: '', + placeholder: '请输入法定代表人证件号', + errors: { + required: '请输入18位身份证号码', + }, + }, + }, + }, + required: [ + 'certificatePhotoFrontWatermark', + 'certificatePhotoBackWatermark', + 'name', + 'certificateNumber' + ], + }; + this.schema1 = { + properties: { + titleB: { + title: '驾驶证信息(必填)', + type: 'string', + ui: { + widget: 'text', + }, + default: '照片上传后会自动识别文字并填充下列内容栏' + }, + certificatePhotoWatermark: { + type: 'string', + title: '驾驶证照片', + ui: { + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传驾驶证照片,支持JPG、PNG格式,文件小于5M。照片信息缺失、拼凑、过度PS、模糊不清,都不会通过审核。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.userDriverLicenseDTO.certificatePhoto = args.file.response.data.fullFilePath + this.checkDriverCard(args.file.response.data.fullFilePath, 'front', 0); + } else { + this.detailData.userDriverLicenseDTO.certificatePhoto = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt4M = file.size / 1024 / 1024 < 5; + if (!isLt4M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt4M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url),} + }, + roadImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + licenseNo: { + title: '驾驶证号', + type: 'string', + ui: { + // widget: 'text', + placeholder: '请输入', + }, + // default: this.ar.snapshot.queryParams.licenseNo + }, + driverModel: { + title: '准驾车型', + type: 'string', + ui: { + widget: 'select', + mode: 'multiple', + containsAllLabel: false, + placeholder: '请选择准驾车型', + asyncData: () => + this.service.request(this.service.$api_getDictValue, { dictKey: 'driverModel' }).pipe( + map((data: any) => { + return data.map((m: any) => { + return { label: m.label, value: m.label }; + }); + }), + ), + }, + }, + validStartTime: { + title: '有效期起', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择起始日期', + }, + change: (i) => { }, + } as SFDateWidgetSchema, + }, + validEndTime: { + title: '有效期止', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择终止日期', + }, + change: (i) => { }, + } as SFDateWidgetSchema, + }, + signingOrganization: { + title: '签发机关', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入', + }, + }, + }, + required: [ + 'certificatePhotoWatermark', + 'licenseNo', + 'driverModel', + 'validStartTime', + 'validEndTime', + ], + }; + this.schema2 = { + properties: { + titleC: { + title: '从业资格证(选填)', + type: 'string', + ui: { + widget: 'text', + }, + default: '照片上传后会自动识别文字并填充下列内容栏', + }, + certificatePhotoWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.userPracticeSeniorityDTO.certificatePhoto = args.file.response.data.fullFilePath + this.checkQualificationCertificate(args.file.response.data.fullFilePath); + } else{ + this.detailData.userPracticeSeniorityDTO.certificatePhoto = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url),} + }, + agreeImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + licenseNo: { + title: '从业资格证号', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入', + }, + }, + regionCode: { + title: '签发省份', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择', + asyncData: () => this.getProvinceData(), + } as SFDateWidgetSchema, + }, + validStartTime: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择起始日期', + }, + change: (i) => { }, + } as SFDateWidgetSchema, + }, + validEndTime: { + title: '有效期止', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择终止日期', + }, + change: (i) => { }, + } as SFDateWidgetSchema, + }, + }, + required: [ + + ], + }; + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 }, + width: 700, + }, + }; + this.ui2 = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $titleB:{ + grid: { span: 24 }, + }, + $certificatePhotoWatermark: { + grid: { span: 12 }, + }, + $roadImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + }; + this.ui3 = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $titleC:{ + grid: { span: 24 }, + }, + $certificatePhotoWatermark: { + grid: { span: 12 }, + }, + $agreeImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + }; + } + checkQualificationCertificate(imgurl: any) { + // 识别从业资格证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + qualificationCertificateUrl: imgurl, + }; + this.service.request(this.service.$api_recognizeQualificationCertificate, params).subscribe((res: any) => { + if (res) { + this.sf2.setValue('/licenseNo', res.certificateNumber); + this.sf2.setValue('/regionCode', res.addressRegionCodes[0]); + res.qualificationCategoryList.forEach((item: any) => { + console.log(item.category.indexOf('道路货物运输驾驶员') !== -1) + if (item.category.indexOf('道路货物运输驾驶员') !== -1) { + this.sf2.setValue('/validStartTime', item.initialIssueDate.split(' ')[0]); + this.sf2.setValue('/validEndTime', item.expiryDate.split(' ')[0]); + } + }) + + } + }); + } + getProvinceData() { + return this.service.request(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( + map((res: any) => { + const result: any = [] + if (res) { + res.map((m: any) => { + const item = { label: m.name, value: m.regionCode } + result.push(item) + }); + } + return result + }) + ); + } + checkIdCard(imgurl: any, side: any, type: any) { + // 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardUrl: imgurl, + side, + }; + this.service.request(this.service.$api_checkIdCard, params).subscribe((res: any)=> { + if (res) { + if (type === 0) { + // 法定代表人身份证 + if (side === 'front') { + // 正面 + this.sf.setValue('/name', res.name); + this.sf.setValue('/certificateNumber', res.number); + } + } + } + }); + } + checkDriverCard(imgurl: any, side: any, type: any) { + // 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + driverLicenseUrl: imgurl, + side, + }; + this.service.request(this.service.$api_recognizeDriverLicense, params).subscribe((res: any) => { + if (res) { + if (type === 0) { + // 法定代表人身份证 + if (side === 'front') { + // 正面 + this.sf1.setValue('/licenseNo', res.number); + this.sf1.setValue('/driverModel', [(res.classType).toUpperCase()]); + this.sf1.setValue('/validStartTime', res.validFrom); + this.sf1.setValue('/validEndTime', res.validTo); + this.sf1.setValue('/signingOrganization', res.issuingAuthority); + } + } + } + }); + } + close(): void { + this.modal.destroy(); + } + showExample(){ + this.showCardFlag = !this.showCardFlag + } + showJopExample(){ + this.showJopFlag = !this.showJopFlag + } + submitForm(){ + const params:any = { + source: 1, + mobile: this.sf.value.mobile, + identityInfoDTO:{ + ...this.sf.value, + certificatePhotoFront: this.detailData.certificatePhotoFront, + certificatePhotoBack: this.detailData.certificatePhotoBack, + }, + userDriverLicenseDTO: { + ...this.sf1.value, + certificatePhoto: this.detailData.userDriverLicenseDTO.certificatePhoto, + }, + userPracticeSeniorityDTO: { + ...this.sf2.value, + certificatePhoto: this.detailData.userPracticeSeniorityDTO.certificatePhoto, + }, + }; + if(params.userPracticeSeniorityDTO.certificatePhoto === '' || params.userPracticeSeniorityDTO.certificatePhotoWatermark === '') { + delete params.userPracticeSeniorityDTO.certificatePhotoWatermark + delete params.userPracticeSeniorityDTO.certificatePhoto + } + params.userDriverLicenseDTO.driverModel = params.userDriverLicenseDTO.driverModel.join(',') + delete params.identityInfoDTO.showName; + delete params.identityInfoDTO.titleA; + delete params.userDriverLicenseDTO.titleB; + delete params.userPracticeSeniorityDTO.titleC; + delete params.userDriverLicenseDTO.tipsA; + delete params.userPracticeSeniorityDTO.tipsC; + if(JSON.stringify(params.userPracticeSeniorityDTO) === '{}') { + params.userPracticeSeniorityDTO = null + } + this.checked = true + this.service.request(this.service.$api_enterpriseVehicleSave, params).subscribe((res: any) => { + this.checked = false + if(res){ + this.service.msgSrv.success('添加成功') + this.modal.close(true) + } + }) + } +} diff --git a/src/app/routes/supply-management/components/add-drivers/add-drivers.component.html b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.html new file mode 100644 index 00000000..1ff67246 --- /dev/null +++ b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.html @@ -0,0 +1,14 @@ +
    +
    +
    + + + +
    +
    +
    + + +
    + +
    diff --git a/src/app/routes/supply-management/components/add-drivers/add-drivers.component.spec.ts b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.spec.ts new file mode 100644 index 00000000..ef047291 --- /dev/null +++ b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementAddDriversComponent } from './add-drivers.component'; + +describe('SupplyManagementAddDriversComponent', () => { + let component: SupplyManagementAddDriversComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementAddDriversComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementAddDriversComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/add-drivers/add-drivers.component.ts b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.ts new file mode 100644 index 00000000..da816bfe --- /dev/null +++ b/src/app/routes/supply-management/components/add-drivers/add-drivers.component.ts @@ -0,0 +1,120 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STColumnButton, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; + +@Component({ + selector: 'app-supply-management-add-drivers', + templateUrl: './add-drivers.component.html', +}) +export class SupplyManagementAddDriversComponent implements OnInit { + url = `/user?_allow_anonymous=true`; + i: any; + searchSchema: SFSchema = {}; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf') sf!: SFComponent; + ui: SFUISchema = {} + columns: STColumn[] = []; + isVisible = false; + diverList: object[] = []; + dirvierInfo: any = {}; + constructor(public service: SupplyManagementService, private modal: NzModalRef) { } + + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + /** +* 查询参数 +*/ + get reqParams() { + return { + ...this.sf?.value + }; + } + /** +* 初始化查询表单 +*/ + initSF() { + this.searchSchema = { + properties: { + mobile: { + type: 'string', + title: '车队长手机号', + ui: { + placeholder: '请输入' + } + }, + }, + type: 'object', + }; + this.ui = { '*': { spanLabelFixed: 80, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '司机头像', + width: '100px', + className: 'text-center', + index: 'avatar', + type: 'img', + }, + { title: '司机姓名', index: 'name', width: '120px', className: 'text-center' }, + { title: '实名认证状态', index: 'linkUrl', width: '120px', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-center', + buttons: [ + { + text: '设置', + click: (_record) => this.addCaptain(_record) + // iif: (item: STData, btn: STColumnButton, column: STColumn) => item?.status > 0, + }, + ], + }, + ]; + } + + + + search() { + this.getDriverList(); + } + + + getDriverList() { + this.service.request(this.service.$api_get_car_captain_by_mobile, { ...this.sf?.value }).subscribe((res: any) => { + this.diverList = []; + if (res.userId) { + this.diverList.push(res); + } + // this.st.reload(); + }) + } + + + /** + * + */ + addCaptain(item: any) { + this.modal.close(item); // 虚设置车队长 + // const { appUserId: carCaptain } = item; + // const { appUserId } = this.dirvierInfo; + // this.service.request(this.service.$api_add_car_caption, { carCaptain, appUserId }).subscribe(res => { + // if (res) { + // this.service.msgSrv.success('设置成功'); + // this.modal.close(true); + // } + // }) + } + +} diff --git a/src/app/routes/supply-management/components/addmodal/addmodal.component.html b/src/app/routes/supply-management/components/addmodal/addmodal.component.html new file mode 100644 index 00000000..ce7b7eb1 --- /dev/null +++ b/src/app/routes/supply-management/components/addmodal/addmodal.component.html @@ -0,0 +1,88 @@ + + + +
    + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    + + +
    + + +
    + 未认证 +
    +
    + 待审核 +
    +
    + 已成功 +
    +
    + 已驳回 +
    +
    + + {{ item.carModelLabel }}-{{ item.carLengthLabel }}米-{{ item.carLoad }}吨 + +
    +
    + + +
    + diff --git a/src/app/routes/supply-management/components/addmodal/addmodal.component.less b/src/app/routes/supply-management/components/addmodal/addmodal.component.less new file mode 100644 index 00000000..700887cc --- /dev/null +++ b/src/app/routes/supply-management/components/addmodal/addmodal.component.less @@ -0,0 +1,38 @@ + +:host{ + ::ng-deep{ + .ant-card-meta-title{ + display: flex; + align-items: center; + justify-content: space-between; + } + .nameBox { + display: flex; + align-items: baseline; + .name{ + margin: 0 10px 0 0; + } + } + .ant-badge-status{ + color: #666 + } + + } + .title{ + clear: both; + margin: 10px 0; + font-weight: bold; + font-size: 14px; + } + .noContent{ + width: 100%; + min-height: 300px; + font-size: 16px; + line-height: 300px; + text-align: center; + span { + color: #1890ff; + cursor: pointer; + } + } +} \ No newline at end of file diff --git a/src/app/routes/supply-management/components/addmodal/addmodal.component.spec.ts b/src/app/routes/supply-management/components/addmodal/addmodal.component.spec.ts new file mode 100644 index 00000000..b15da72d --- /dev/null +++ b/src/app/routes/supply-management/components/addmodal/addmodal.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CarAddmodalComponent } from './addmodal.component'; + +describe('CarAddmodalComponent', () => { + let component: CarAddmodalComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CarAddmodalComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CarAddmodalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/addmodal/addmodal.component.ts b/src/app/routes/supply-management/components/addmodal/addmodal.component.ts new file mode 100644 index 00000000..7497b56a --- /dev/null +++ b/src/app/routes/supply-management/components/addmodal/addmodal.component.ts @@ -0,0 +1,175 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { cacheConf } from '@conf/cache.conf'; +import { STColumn, STComponent, STChange, STData } from '@delon/abc/st'; +import { SFUISchema, SFSchema, SFComponent } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { EACacheService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { CarAddDriverComponent } from '../add-driver/add-driver.component'; + +@Component({ + selector: 'app-car-addmodal', + templateUrl: './addmodal.component.html', + styleUrls: ['./addmodal.component.less'] +}) +export class CarAddmodalComponent implements OnInit { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + tableData: any = []; + companyData: any = {}; + flag = false + isLoading: boolean = false; + constructor( + private modal: NzModalRef, + private eaCacheSrv: EACacheService, + public service: SupplyManagementService, private router: Router, private ar: ActivatedRoute, + private modalHelper: ModalHelper + ) { } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item: any) => item.checked) || []; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.companyData = this.eaCacheSrv.get(cacheConf.env) + this.initSF(); + this.initST() + this.initData() + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + mobile: { title: '司机手机号', type: 'string', maxLength: 11, ui: { showRequired: false, placeholder: '请输入司机手机号', } }, + }, + }; + this.ui = { + '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.st?.load(1) }, + $time: { grid: { span: 24 } }, + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '司机头像', type: 'img', index: 'avatar', className: 'text-center' }, + { title: '司机姓名', index: 'name', className: 'text-center' }, + { title: '当前车辆', index: 'carNo', className: 'text-center' }, + { title: '车辆信息', render: 'carModel', className: 'text-center' }, + { + title: '个人认证状态', + render: 'certificationStatus', + className: 'text-center', + }, + { title: '驾驶证类型', index: 'driverType', className: 'text-center' }, + { + title: '操作', + width: '180px', + className: 'text-center', + buttons: [ + { text: '添加', click: (_record: any) => this.add(_record) }, + ], + }, + ]; + } + initData(flag?: any) { + if (this.sf?.value.mobile) { + this.service.request(this.service.$api_getCarCaptainByMobile, { mobile: this.sf?.value.mobile }).subscribe((res: any) => { + this.flag = flag + if (res.userId) { + this.tableData = [res]; + setTimeout(() => { + this.st.reload() + }) + } else { + this.tableData = [] + } + }) + } + } + /** + * 数据列表状态变化事件 + */ + change(change: STChange) { + // console.log(change); + } + + /** + * 新增 + */ + add(item: any) { + const params: any = { + source: 1, + appUserId: item.appUserId ? item.appUserId : '', + mobile: item.mobile + } + this.service.request(this.service.$api_enterpriseVehicleSave, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('添加成功') + this.modal.close(true) + } + }) + } + addModal() { + this.modalHelper.create(CarAddDriverComponent, {mobile: this.sf?.value.mobile}, { size: 900 }).subscribe((res) => { + this.initData() + }); + //this.router.navigate(['/car/add']) + } + goBack() { + window.history.go(-1); + } + close(): void { + this.modal.close(true); + } +} diff --git a/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html new file mode 100644 index 00000000..22030b03 --- /dev/null +++ b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html @@ -0,0 +1,49 @@ +
    +
    +
    + +
    + +
    + +
    + + + + + + {{car.carNo}} - + {{car.carLength}}米,{{car.carLoad}}吨 - + 空闲 + 在途 + 未认证 + + + + + + {{item.captainName}} {{item.captainPhone}} + 设置 + + + 空闲 + 在途 + 未认证 + + +
    + +
    diff --git a/src/app/routes/supply-management/components/assigned-car/assigned-car.component.spec.ts b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.spec.ts new file mode 100644 index 00000000..1dc14946 --- /dev/null +++ b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementAssignedCarComponent } from './assigned-car.component'; + +describe('SupplyManagementAssignedCarComponent', () => { + let component: SupplyManagementAssignedCarComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementAssignedCarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementAssignedCarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/assigned-car/assigned-car.component.ts b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.ts new file mode 100644 index 00000000..1793c83e --- /dev/null +++ b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.ts @@ -0,0 +1,274 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STChange, STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementAddDriversComponent } from '../add-drivers/add-drivers.component'; +import { CarAddmodalComponent } from '../addmodal/addmodal.component'; + + +const BADGE: STColumnBadge = { + 1: { text: '空闲', color: 'success' }, + 2: { text: '未实名', color: 'error' }, + 3: { text: '在途', color: 'warning' }, +}; + +@Component({ + selector: 'app-supply-management-assigned-car', + templateUrl: './assigned-car.component.html', +}) +export class SupplyManagementVehicleAssignedCarComponent implements OnInit { + record: any = {}; + i: any; + schema: SFSchema = {}; + ui: SFUISchema = {}; + columns: STColumn[] = []; + + @ViewChild('st') st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + status: string = 'anew'; + url = ''; // 请求的api地址 + params: any = {}; // 传进来的参数 + cardBADGE: STColumnBadge | any = { + 0: { text: '空闲', color: 'success' }, + 1: { text: '在途', color: 'warning' }, + 2: { text: '未认证', color: 'error' }, + }; + selectedRows: any = null; // 已选行 + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public service: SupplyManagementService, + private modalHelper: ModalHelper, + private envSrv: EAEnvironmentService, + private modalSrv: NzModalService + ) { + this.initSF(); + this.initSt(); + } + + /** +* 查询参数 +*/ + get reqParams() { + return { + ...this.sf?.value, + loadingTime: this.params?.loadingTime, + enterpriseId: this.params?.shipperAppUserId, + enterpriseProjectId: this.params?.enterpriseProjectId, + unloadingTime: this.params?.unloadingTime, + }; + } + + + + + /** +* 初始化查询表单 +*/ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + nameOrPhone: { + type: 'string', + title: '承运司机', + ui: { + placeholder: '请输入司机姓名/手机号' + } + }, + carNo: { + type: 'string', + title: '车牌号', + maxLength: 9, + ui: { + placeholder: '请输入车牌号' + } + }, + }, + type: 'object', + }; + this.ui = { '*': { spanLabelFixed: 10, grid: { span: 8, gutter: 1 } } }; + } + + /** + * 初始化数据列表 + */ + initSt() { + this.columns = [ + { width: 50, type: 'radio', className: 'text-center' }, + { title: '司机姓名', width: 120, index: 'name', className: 'text-center' }, + { title: '手机号', index: 'telephone', width: 200, className: 'text-center' }, + { title: '车队长', render: 'carCaptain', className: 'text-center' }, + { title: '指定车辆', width: 300, render: 'carId', className: 'text-center' }, + { title: '状态', render: 'driverStatus', className: 'text-center', type: 'badge', badge: BADGE }, + ]; + } + + ngOnInit(): void { + console.log(this.params) + } + + dataProcess = (data: STData[], rawData: any): STData[] => { + if (rawData.status === 505016) { + this.modalSrv.confirm({ + nzTitle: '系统提示', + nzContent: '该司机还未注册,是否邀请他注册?点击"是"系统将发送邀请短信给司机', + nzOkText: '确定', + nzCancelText: '取消', + nzOnOk: () => { + this.sendMsg(this.sf?.value?.nameOrPhone).subscribe((res => { + if (res.code === '1') { + this.service.msgSrv.success('发送成功'); + } else { + this.service.msgSrv.success('发送失败'); + } + })); + } + }); + return []; + } + return data.map((i, index) => { + i.carId = ''; + i.disabled = (i?.certificationStatus === 1 && i.driverStatus === 1); + const defaultCar = i?.userCarLicenseDesensitizationVOList?.find((item: any) => item.isDefault); + if (defaultCar) { + i.carId = defaultCar?.carId; + } + return i; + }); + } + + save(): void { + const { carId, appUserId: driverId, captainAppUserId: carCaptainId } = this.selectedRows; + const params: any = { carId, driverId, carCaptainId }; + this.service.request(this.url, { ...params, ...this.params }).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('指派成功!'); + this.modal.close(res); + } + }) + + } + + changeSt(e: STChange): void { + if (e?.type === 'loaded') this.selectedRows = null; + if (e?.type === 'radio') this.selectedRows = e?.radio; + + } + /** + * 添加司机 + * @param item + */ + addDriver() { + this.modalHelper.create(CarAddmodalComponent, {}, { size: 900, modalOptions: { nzMaskClosable: false } }).subscribe((res) => { + if (res) this.st.reload(); + }); + } + + /** + * 校验司机是否能设置车队长 + * @param item 当前对象 + */ + verifyCanSetCarCaptain(item: any) { + this.service.request(this.service.$api_get_sys_config, [{ itemKey: 'sys.config.shipper.setCarCaptain', businessId: this.envSrv.env.enterpriseId }]).subscribe(res => { + if (res && res.length > 0) { + const { itemValue } = res[0]; + if (itemValue !== '1') { + this.service.msgSrv.error('不可设置车队长!'); + return; + } + this.setCarCaptain(item); + } + }) + } + + /** + * 设置车队长 + */ + setCarCaptain(item: any) { + + this.modalHelper.create(SupplyManagementAddDriversComponent, { dirvierInfo: item }, { + size: 900, + modalOptions: { nzMaskClosable: false, nzTitle: '设置' } + } + ).subscribe((res) => { + if (res) { + item.captainName = res?.name; + item.captainPhone = res?.mobile; + item.captainAppUserId = res?.appUserId; + } + }); + } + + close(): void { + this.modal.destroy(); + } + + reset() { + this.sf.reset(); + this.st.load(1); + } + + /** + * 验证车辆的状态 + */ + verifyVechicleStatus(params: any) { + if (this.selectedRows) { + const obj = this.status === 'anew' ? { resourceId: params.id } : { ...params }; + const { carId, appUserId: driverId, captainAppUserId: carCaptainId } = this.selectedRows; + const carInfo: any = { carId, driverId, carCaptainId }; + this.service.request(this.service.$api_verify_vehicle_status, { ...obj, ...carInfo }).subscribe(res => { + if (res) { + const { title, alert, subContent, content } = res; + switch (alert) { + case 'Error': + // if (code === '3' || code === '4' || code === '8') { + // this.error(title, subContent, '#CF3834'); + // } else { + this.error(title, content, subContent); + break; + case 'Warn': + this.showConfirm(title, content, subContent); + break; + case 'Success': + this.save(); + break; + } + } + }) + } + + } + + error(title: string, content: string, subContent: string): void { + this.modalSrv.error({ + nzTitle: title, + nzContent: `${content ? content : ''}${subContent ? subContent : ''}`, + nzOkText: '知道了' + }); + } + + showConfirm(title: string, content: string, subContent: string): void { + this.modalSrv.confirm({ + nzTitle: title, + nzContent: `${content ? content : ''}${subContent ? subContent : ''}`, + nzOkText: '继续', + nzCancelText: '取消', + nzOnOk: () => { + this.save(); + } + }); + } + + /** +* 发送邀请司机注册短信 +*/ + sendMsg(phoneNumber: string) { + return this.service.request(this.service.$api_send_msg_code, phoneNumber) + } + +} diff --git a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.html b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.html new file mode 100644 index 00000000..00606c3d --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.html @@ -0,0 +1,189 @@ +
    + + + + + +
    + +

    货源编码 : {{ i?.resourceCode }}

    +
    +
    +
    网络货运人:{{ i?.shipperAppUserName }}
    +
    + + + +
    +
    +
    +
    + 总费用:{{ i?.totalAmount | currency: '¥' }} +
    +
    + +
    + {{ i?.enterpriseProjectName }} + {{ i?.deadlineTime }} + {{ i?.createUserName }}/{{ i?.createUserPhone }} + {{ i?.dispatchName }}/{{ i?.dispatchPhone }} + {{ i?.serviceTypeLabel }} +
    +
    +
    + +
    +
    + + + + + + +
    +
    +
    + + + + 货物信息 + + + {{item.goodsTypeName}} > {{item.goodsName}} + + + {{item.weight}}吨 / {{item.volume>=0?item.volume:'-'}}方 + + + {{i?.surplusWeight!==null?i?.surplusWeight:'--'}}吨 / {{i?.surplusVolume!==null?i?.surplusVolume:'-'}}方 + + + {{item.carModelLabel || '--'}} / {{item.carLengthLabel || '--'}} + + + + + +
    +

    装货卸货信息 + ( + + + ) + +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{ item?.province }}{{ item?.city }}{{ item?.area }}{{ item?.detailedAddress }}

    +

    联系人:{{ item?.appUserName }}/{{ item?.contractTelephone }}

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{ item?.province }}{{ item?.city }}{{ item?.area }}{{ item?.detailedAddress }}

    +

    联系人:{{ item?.appUserName }}/{{ item?.contractTelephone }}

    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +

    收货后{{ i?.paymentDays }}天内支付运费

    +

    {{ settlementBasis[item?.settlementBasis] }},{{ rule[item?.rule] }}

    +
    + +
    + + {{ item?.freightPrice | currency: '¥' }} {{ + freightType[item?.freightType] }} + (附加费率{{i?.rate * 100 | number: '0.2-2'}}%) +
    +
    +
    +
    +
    + + + + ({{ item?.count }}) + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptTypeLabel }} + + + {{ i?.supplementaryInformationVO?.receiptUserName ? i?.supplementaryInformationVO?.receiptUserName + '/' : '' }} {{ i?.supplementaryInformationVO?.phon }} + + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + {{ i?.supplementaryInformationVO?.remarks }} + + + + + + + +
    diff --git a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.less b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.less new file mode 100644 index 00000000..957a1f03 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.less @@ -0,0 +1,84 @@ +:host { + .source-info { + min-height: 210px; + + p { + margin-bottom: .5em; + } + } + + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .title { + font-weight: bold; + font-size: 26; + } + + .freight-info-box { + width: 95%; + + p { + margin-bottom: 5px; + } + } + + .freigth-label { + display: inline-block; + width: 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width: 70%; + margin: 0 auto; + } + } + } + + .handling-info { + min-height: 100px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} diff --git a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.spec.ts b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.spec.ts new file mode 100644 index 00000000..a1781458 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementBulkDetailComponent } from './bulk-detail.component'; + +describe('SupplyManagementBulkDetailComponent', () => { + let component: SupplyManagementBulkDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [SupplyManagementBulkDetailComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementBulkDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts new file mode 100644 index 00000000..b7711049 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts @@ -0,0 +1,192 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +// import { PublishGoodsChooseFamifiarComponent } from 'src/app/routes/publish-goods/components/choose-famifiar-bulk/choose-famifiar.component'; +import { SupplyManagementService } from '../../services/supply-management.service'; +// import { SupplyManagementCurrentAssignmentComponent } from '../current-assignment/current-assignment.component'; +import { SupplyManagementUpdatePriceComponent } from '../update-price/update-price.component'; + +@Component({ + selector: 'app-supply-management-bulk-detail', + templateUrl: './bulk-detail.component.html', + styleUrls: ['./bulk-detail.component.less'] +}) +export class SupplyManagementBulkDetailComponent implements OnInit { + + id = this.route.snapshot.params.id; + i: any; + logColumns: STColumn[] = [ + { title: '内容', index: 'operationContent' }, + { title: '操作人', index: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp' }, + ]; + driverColums: STColumn[] = [ + { title: '司机姓名', index: 'theme' }, + { title: '手机号', index: 'operationUserPhone' }, + { title: '车牌号', index: ' createTime' }, + { title: '承运次数', index: 'operationUserPhone' }, + { title: '承运数量', index: ' createTime' }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-center', + buttons: [ + { + text: '移除', + click: (_record) => this.delDiver(_record), + }, + ], + }, + ]; + status: any = { 1: '待接单', 2: '已接单', 3: '已取消' }; + serviceType: any = { + 1: '抢单', + 2: '指派' + } + freightType: any = { + 1: '元/吨', + 2: '元/方', + 3: '元/车' + } // 运单类型 + + settlementBasis: any = { + 1: '以收货为准', + 2: '以发货为准' + } // 结算依据 + + rule: any = { + 1: '保留小数', + 2: '抹除小数', + 3: '抹除个数' + } // 取整规则 + get reqParams() { + return { + operateObject: this.i?.resourceCode, + operateTypeList: [4,7], + }; + } + currentStatus = 0; + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + public service: SupplyManagementService, + private modal: NzModalService, + private router: Router + ) { + + } + + ngOnInit(): void { + this.getGoodsSourceDetail(); + } + + /** + * 移除司机 + */ + delDiver(item: any) { + const { id } = item; + // this.modal.confirm({ + // nzTitle: '删除确认', + // nzContent: `请仔细核对,避免误操作!
    是否删除?
    `, + // nzOnOk: () => { + // this.service.http.post(this.service.$api_del_driver, { id }).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('数据删除成功!'); + // // this.st1.reload(); + // } else { + // this.service.msgSrv.error('删除失败!'); + // } + // }); + // }, + // }); + } + + /** + * 查看当前指派 + */ + viewCurrentAssign(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '当前指派', + // nzWidth: '600px', + // nzContent: SupplyManagementCurrentAssignmentComponent, + // nzComponentParams: { + // i: item, + // }, + // nzFooter: null, + // }); + } + /** + *再下一单 + * @param record + */ + placeOrder(record: any) { + console.log(record) + this.router.navigate(['/supply-management/bulk-amend', record.id], { + queryParams: { + sta: 4 + }, + }) + } + /** + * 修改货源 + */ + updateGoodsSource(record: any) { + this.router.navigate(['./pbg/onecar-publish'], { + queryParams: { + id: record?.id + } + }) + } + + /** + * 更新单价 + */ + updatePrice(item: any) { + const modalRef = this.modal.create({ + nzTitle: '修改单价', + nzWidth: '600px', + nzContent: SupplyManagementUpdatePriceComponent, + nzComponentParams: { + record: item, + }, + nzFooter: null, + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.getGoodsSourceDetail(); + } + }) + } + + /** + * 取消货源 + */ + cancleGoodsSource() { + this.modal.confirm({ + nzTitle: '确定取消货源吗?', + nzContent: `取消后不可恢复,谨慎操作`, + nzOnOk: () => + this.service.request(this.service.$api_cancle_goods_source, { id: this.i.id }).subscribe((res) => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.getGoodsSourceDetail(); + } + }), + }) + } + + getGoodsSourceDetail() { + this.service.request(this.service.$api_get_getBulkDetail, { id: this.id }).subscribe(res => { + this.i = res; + this.currentStatus = +this.i?.resourceStatus - 1; + }) + } + + goBack() { + window.history.go(-1); + } +} diff --git a/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.html b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.html new file mode 100644 index 00000000..fc4ad284 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.html @@ -0,0 +1,183 @@ + + + + + + +
    货源单设置
    + +
    + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    + +
    +
    +
    +
    + + 装货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    + +
    +
    + + +
    货物信息
    +
    +
    + + + + + + 国家法规及行政命令禁限运货物不能托运 + 《禁运物品说明》 + + + + + + + + + + + + + + + + +
    + + + + + + + +

    例如 付司机运费 = 重量*单价 = 999.99

    +

    保留小数,即 999.99

    +

    抹除小数,即 999.00

    +

    抹除个位,即 990.00

    +
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    +
    + + +
    补充信息
    +
    +
    + + +
    +
    +
    + +
    +
    +  天内支付运费 +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + +
    +
    diff --git a/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.less b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.less new file mode 100644 index 00000000..a2ab5fbc --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.less @@ -0,0 +1,81 @@ +:host { + ::ng-deep { + nz-input-number { + width: 100%; + } + + nz-date-picker { + width: 100%; + } + + .sf3 { + .goods_Tips_item { + .goods_tips { + width: calc(50% - 45px); + + .ant-alert { + padding: 0 0 0 2px; + } + + } + + nz-form-item { + margin-bottom: 8px; + } + + // .ant-form-item-control-input-content { + // display: flex; + // justify-content: end; + // } + } + } + } + + + i { + cursor: pointer; + } +} + +.tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; +} + +.card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; +} + +.align-center { + display: flex; + align-items: center; + justify-content: center; +} + +.swap-icon { + padding: 24px; + color: #7d7d7d; + font-size: 30px; + + :hover { + color: #52acff; + } +} + +#container { + width: 300px; + height: 180px; +} + +input[type='number'] { + -moz-appearance: textfield; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + margin: 0; + -webkit-appearance: none; +} diff --git a/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.ts b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.ts new file mode 100644 index 00000000..733bddf3 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-publish/bulk-publish.component.ts @@ -0,0 +1,1163 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { + SFComponent, + SFNumberWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { AmapPoiPickerComponent, AmapService, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { PublishGoodsChooseFamifiarComponent } from '../choose-famifiar/choose-famifiar.component'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { map } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { PublishSuccessComponent } from '../onecar-publish/publish-success/publish-success.component'; +import { PublishAddressListComponent } from '../onecar-publish/address-list/address-list.component'; +import { TranAgreementComponent } from '../tran-agreement/tran-agreement.component'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import { SupplyManagementQrcodePageComponent } from '../qrcode-page/qrcode-page.component'; +@Component({ + selector: 'app-publish-goods-bulk-publish', + templateUrl: './bulk-publish.component.html', + styleUrls: ['./bulk-publish.component.less'] +}) +export class SupplyManagementBulkPublishComponent implements OnInit { + validateForm1: FormGroup; + sf1data: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + sf5data: any; // 货源单设置回显 + sf7data: any; // 货源单设置回显 + creatTime: any; // 货源单设置回显 + modifyTime: any; // 货源单设置回显 + totalFees: any; // 总数信息 + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + currentGoodsTypeName: any; + enterpriseProjectIds: any; + freightTypeOptions: any; + ruleOptions: any; + id = this.route.snapshot.params.id; // 传参id + // // 单位 + startInfo: any = []; + endInfo: any = []; + PageStatus = ''; + shipperName = ''; + limitValues = { + maxMonth: 99, + maxWeight: 99999, + maxVolume: 99999, + maxTrainNumber: 99999, + maxFreight: 9999999 + }; + constructor( + private http: _HttpClient, + fb: FormBuilder, + private router: Router, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: SupplyManagementService, + private amapService: AmapService, + public shipperSrv: ShipperBaseService + ) { + this.validateForm1 = fb.group({ + loadAddress0: [null, [Validators.required]], + loadName0: [null, [Validators.required]], + loadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]], + unloadAddress0: [null, [Validators.required]], + unloadName0: [null, [Validators.required]], + unloadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]] + }); + } + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + schema1: SFSchema = {}; + ui1!: SFUISchema; + + @ViewChild('sf2', { static: false }) sf2!: SFComponent; + schema2: SFSchema = {}; + ui2!: SFUISchema; + + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + ui4!: SFUISchema; + + @ViewChild('sf7', { static: false }) sf7!: SFComponent; + schema7: SFSchema = {}; + ui7!: SFUISchema; + // 初始化 + ngOnInit(): void { + if (this.route.snapshot?.queryParams?.sta === '3') { + this.PageStatus = '大宗修改'; + } else if (this.route.snapshot?.queryParams?.sta === '4') { + this.PageStatus = '大宗下一单'; + } + this.initSF1(); + this.initSF3(); + this.initSF4(); + this.initSF6(); + this.initdata(); + this.initDict(); + this.getLimitvalue(); + } + initSF1() { + this.schema1 = { + properties: { + shipperAppUserId: { + title: '货主', + type: 'string', + maxLength: 30, + ui: { + widget: 'select', + serverSearch: true, + allowClear: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + onSearch: (q: any) => { + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map(res => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any, qs: any) => { + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + this.getRegionCode(str); + this.shipperName = qs?.label; + } + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '项目', + ui: { + widget: 'select', + placeholder: '请选择' + } as SFSelectWidgetSchema + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'text' + } + }, + deadlineTime: { + title: '有效期', + type: 'string', + format: 'date-time', + ui: { + placeholder: '请输入', + format: 'yyyy-MM-dd HH:mm:ss', + validator: val => { + let d = new Date(); + let year = d.getFullYear(); + let month = d.getMonth(); + let date = d.getDate(); + let mydate = new Date(year, month + this.limitValues.maxMonth, date); + if (new Date(val) < new Date()) { + return [{ keyword: 'validTime', message: '有效期时间需大于当前时间' }]; + } + if (new Date(val) > mydate) { + return [{ keyword: 'validTime2', message: `有效期最长为${this.limitValues.maxMonth}个月` }]; + } + return []; + } + } + }, + dispatchName: { + type: 'string', + title: '调度员姓名', + maxLength: 30, + ui: { + optionalHelp: '选若未填写,司机直接联系您', + placeholder: '请输入' + } + }, + dispatchPhone: { + type: 'string', + title: '调度员手机号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + } + }, + required: ['shipperAppUserId', 'enterpriseProjectId', 'enterpriseInfoName', 'deadlineTime'] + }; + this.ui1 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + } + }; + } + initSF3() { + this.schema3 = { + properties: { + goodsTips: { + type: 'string', + title: '', + ui: { + widget: 'custom', + class: 'goods_Tips_item', + // visibleIf: { + // goodsTypeName: (value: any) => value && value === '其它' + // } + } + }, + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物类型' }, + asyncData: () => + this.shipperSrv.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + maxLength: 20, + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + }, + blur: (value: any) => { + this.checkGoodsName(); + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId', 'goodsName1'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 90, + grid: { span: 12 } + }, + $goodsTips: { + grid: { span: 24 } + } + }; + } + initSF4() { + this.schema4 = { + properties: { + freightPrice: { + type: 'string', + title: '运费单价', + ui: { + errors: { required: '请选择运费单价' }, + widget: 'custom', + placeholder: '请输入' + } + }, + freightType: { + type: 'string', + title: '', + ui: { + hidden: true + }, + default: '1' + }, + rule: { + type: 'string', + title: '', + ui: { + widget: 'custom', + errors: { required: '请选择运费取整规则' } + } + }, + settlementBasis: { + type: 'string', + title: '', + enum: [ + { label: '以收货为准', value: '1' }, + { label: '以发货为准', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '结算依据', + errors: { required: '请选择结算依据' } + } as SFSelectWidgetSchema + }, + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '请填写总重量' } + } + }, + volume: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + number: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + carModel: { + type: 'string', + title: '车型/车长', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车型', + errors: { required: '请选择车型' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:model' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carModel', ['999']); + } + } + } + }, + carLength: { + type: 'string', + title: '', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车长', + errors: { required: '请选择车长' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:length' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carModel', ['999']); + } + } + } + } + }, + required: ['weight', 'carModel', 'carLength', 'freightPrice', 'rule', 'settlementBasis'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + }, + $freightPrice: { + grid: { span: 8 } + }, + $rule: { + grid: { span: 8 } + }, + $settlementBasis: { + grid: { span: 8 } + }, + $weight: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $volume: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $number: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $carModel: { + spanLabelFixed: 120, + grid: { span: 8 } + }, + $carLength: { + grid: { span: 8 } + } + }; + } + initSF6() { + this.schema7 = { + properties: { + stateReceipt: { + type: 'string', + title: '是否回单', + enum: [ + { label: '需要', value: true }, + { label: '不需要', value: false } + ], + ui: { + widget: 'select', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + receiptType: { + type: 'string', + title: '回单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'receipt:type' }, + containsAllLabel: false, + placeholder: '请选择', + errors: { required: '请选择' }, + visibleIf: { + stateReceipt: value => value === true + } + } + }, + receiptUserName: { + type: 'string', + title: '联系人', + maxLength: 15, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptUserPhone: { + type: 'string', + title: '联系电话', + maxLength: 11, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddressArea: { + type: 'string', + title: '所在地区', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddress: { + type: 'string', + title: '详细地址', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + paymentDays: { + type: 'string', + title: '到货后', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '请输入付款承诺天数' } + } + }, + remarks: { + type: 'string', + title: '备注', + maxLength: 200, + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { minRows: 3, maxRows: 3 } + } as SFTextareaWidgetSchema + } + }, + required: [ + 'stateReceipt', + 'receiptType', + 'receiptUserName', + 'receiptUserPhone', + 'receiptAddressArea', + 'receiptAddress', + 'paymentDays' + ] + }; + this.ui7 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + } + }; + } + changeValue() { + this.totalFees = + Number(this.sf7?.value?.appendFee) + + Number(this.sf7?.value?.oilCardPay) + + Number(this.sf7?.value?.prePay) + + Number(this.sf7?.value?.receiptPay) + + Number(this.sf7?.value?.toPay); + } + initDict() { + this.service.getDictByKey('freight:type').subscribe(res => { + this.freightTypeOptions = res; + }); + this.service.getDictByKey('goodresource:rounding:rules').subscribe(res => { + this.ruleOptions = res; + }); + } + // 获取城市列表 + getRegionCode(regionCode: any) { + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf1.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf1.getProperty('/enterpriseProjectId')!.widget.reset(res); + if (this.enterpriseProjectIds) { + this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + } + }); + } + addStartInfo(event: any) { + if (this.startInfo.length < 5) { + const controlId = this.startInfo.length; + this.startInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: 1 + }); + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required)); + } + } + subStartInfo(event: any, index: number, id?: any) { + if (id) { + this.service.request(this.service.$api_delete_Wholedeletebatch, [id]).subscribe(res => { }); + } + this.startInfo.splice(index, 1); + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + } + addEndInfo(event: any) { + if (this.addEndInfo.length < 5) { + const controlId = this.endInfo.length; + this.endInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: 2 + }); + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required)); + } + } + subEndInfo(event: any, index: number, id?: any) { + if (id) { + this.service.request(this.service.$api_delete_Wholedeletebatch, [id]).subscribe(res => { }); + } + this.endInfo.splice(index, 1); + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + } + // 指派熟车 + chooseFamifiar(item: any) { + const modalRef = this.modalService.create({ + nzTitle: '指派熟车', + nzContent: PublishGoodsChooseFamifiarComponent, + nzComponentParams: { + submitParams: item, + submitUrl: this.service.$api_save_bulk_assign + }, + nzWidth: 1300 + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.openFinishPage(result); + } + }); + } + // 打开下单完成页面 + openFinishPage(resourceObj: any = null) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'bulk' } + }); + } + // 提交前确认,委托运输协议弹窗 + submitConfirm(submitType?: any) { + Object.keys(this.validateForm1.controls).forEach(key => { + this.validateForm1.controls[key].markAsDirty(); + this.validateForm1.controls[key].updateValueAndValidity(); + }); + this.sf1.validator({ emitError: true }); + this.sf3.validator({ emitError: true }); + this.sf4.validator({ emitError: true }); + if (this.validateForm1.invalid || !this.sf1.valid || !this.sf3.valid || !this.sf4.valid) { + this.service.msgSrv.warning('请完善必填项!'); + return; + } + if (this.totalDistance <= 0) { + this.service.msgSrv.warning('起终点相同,请重新选择装卸货地址!'); + return; + } + // 校验各个输入限定值 + if ( + this.sf4.value?.weight > this.limitValues?.maxWeight || + this.sf4.value?.volume > this.limitValues?.maxVolume || + this.sf4.value?.number > this.limitValues?.maxTrainNumber + ) { + this.service.msgSrv.error( + `当前货物核载信息已超出限定值【${this.limitValues?.maxWeight}吨、${this.limitValues?.maxVolume}方、${this.limitValues?.maxTrainNumber}车】` + ); + return; + } + + if (this.sf4.value?.freightPrice > this.limitValues?.maxFreight) { + this.service.msgSrv.error(`当前运费单价已超出限定值【${this.limitValues.maxFreight}元】`); + return; + } + + // //装卸货信息 + const LoadingList = this.startInfo.concat(this.endInfo); + // 货物信息 + const sf3Values = { ...this.sf3.value }; + if (sf3Values.goodsTypeName === '其它') { + sf3Values.goodsName = sf3Values.goodsName1; + delete sf3Values.goodsName1; + } + if (this.sf4.value.carModel.includes('999')) { + this.sf4.value.carModel = ['999']; + } + if (this.sf4.value.carLength.includes('999')) { + this.sf4.value.carLength = ['999']; + } + const goodsInfoDTOList = [ + { + ...this.sf4.value, + ...this.sf3.value, + carModel: this.sf4.value?.carModel.join(','), + carLength: this.sf4.value?.carLength.join(',') + } + ]; + // 从“再下一单”过来,将所有的子参数内的id都删除 + if ((this.PageStatus = '大宗下一单')) { + LoadingList.forEach((ele: any) => { + delete ele.id; + }); + goodsInfoDTOList.forEach((ele: any) => { + delete ele.id; + }); + } + const params: any = { + ...this.sf1.value, + ...this.sf7.value, + unLoadingPlaceDTOList: LoadingList, + goodsInfoDTOList: goodsInfoDTOList, + estimatedKilometers: this.totalDistance, + estimatedTravelTime: this.totalTime + }; + params.freightPrice = this.totalFees; + const modalRef = this.modalService.create({ + nzTitle: '运输协议', + nzContent: TranAgreementComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { object: params, shipperName: this.shipperName, type: 'bulk' } + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.submit(submitType, params); + } + }); + } + // 确认提交 + submit(submitType?: string, params?: any): void { + if (submitType) { + if (submitType == 'assign') { + this.chooseFamifiar(params); + return; + } else if (submitType === 'qrcode') { + this.service.request(this.service.$api_saveAnotherBulkOrderQRCode, params).subscribe(res => { + if (res) { + this.assignedQrcode(res, params); + } + }); + return; + } + } + if (this.PageStatus === '大宗修改') { + this.requests(this.service.$api_set_bulkModify, params, 1); + } else if (this.PageStatus === '大宗下一单') { + this.requests(this.service.$api_set_saveAnotherBulkOrder, params, 2); + } + } + // 生成二维码 + assignedQrcode(id: string, parms: any) { + const item = { + id, + enterpriseInfoName: parms.enterpriseInfoName, + loadingAddressArr: this.startInfo.map((ele: any) => ele.detailedAddress), + unloadingAddressArr: this.endInfo.map((ele: any) => ele.detailedAddress), + deadlineTime: parms.deadlineTime + }; + const modalRef = this.modalService.create({ + nzTitle: '二维码', + nzWidth: '468px', + nzContent: SupplyManagementQrcodePageComponent, + nzComponentParams: { + i: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(() => { + this.router.navigate(['/supply-management/index'], { queryParams: { type: 'bulk' } }); + }); + } + requests(url: any, params: any, change?: any) { + this.service.request(url, params).subscribe((res: any) => { + if (res) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'onecar', change: change } + }); + } + }); + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget.reset(res); + if (this.sf3data.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId); + } + } + }); + } + backBillChange() { + const modalRef = this.modalService.create({ + nzTitle: '选择收回单地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '2' }, + nzOnOk: item => { + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + this.sf7.setValue('/receiptAddressId', data.id); + this.sf7.setValue('/receiptUserName', data.contactName); + this.sf7.setValue('/phon', data.contactTelephone); + this.sf7.setValue('/area', `${data.province}-${data.city}-${data.area}`); + this.sf7.setValue('/address', data.detailedAddress); + } + }); + } + // 打开地图 + openMap(type: string, index: number) { + const modalRef = this.modalService.create({ + nzTitle: '', + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + if (item?.poi) { + const poi = item.poi; + const locList = poi.location.toString().split(','); + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.district + poi.name; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.cityInfo.province; + this.startInfo[index].city = poi.cityInfo.city; + this.startInfo[index].area = poi.cityInfo.district; + this.startInfo[index].address = poi.name; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.district + poi.name; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.cityInfo.province; + this.endInfo[index].city = poi.cityInfo.city; + this.endInfo[index].area = poi.cityInfo.district; + this.endInfo[index].address = poi.name; + break; + default: + break; + } + + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe((res: any) => { + this.totalDistance = res.distance; + this.totalTime = res.time; + }); + } + return true + } else { + this.service.msgSrv.warning('请重新手动选择地址!') + return false + } + } + }); + } + goBack() { + window.history.go(-1); + } + // 初始化信息 + initdata() { + this.service.request(`${this.service.$api_get_getBulkDetail}`, { id: this.id }).subscribe(res => { + this.dataR(res); + }); + } + + // 初始化信息 + dataR(res: any) { + // 注:区分编辑和下一单 区别是初始化的时候加不加ID + if (res?.shipperAppUserName) { + this.shipperName = res?.shipperAppUserName; + const List: any = []; + this.service.request(this.service.$api_enterpriceList, { enterpriseName: res?.shipperAppUserName }).subscribe(rs => { + rs?.forEach((element: any) => { + List.push({ label: element.enterpriseName, value: element.id }); + }); + this.sf1.getProperty('/shipperAppUserId')!.schema.enum = List; + this.sf1.getProperty('/shipperAppUserId')!.widget.reset(List); + if (res?.shipperAppUserId) { + this.sf1.setValue('/shipperAppUserId', res?.shipperAppUserId); + this.getRegionCode(res?.shipperAppUserId); + } + }); + } + if (res?.enterpriseProjectId) { + this.enterpriseProjectIds = res.enterpriseProjectId; + } + this.totalDistance = res?.estimatedKilometers; + this.totalTime = res?.estimatedTravelTime; + this.sf1data = { + dispatchPhone: res?.dispatchPhone, + dispatchName: res?.dispatchName, + // shipperAppUserName: res?.shipperAppUserName || '', + enterpriseProjectId: res?.enterpriseProjectId || '', + enterpriseInfoName: res?.enterpriseInfoName || '', + externalResourceCode: res?.externalResourceCode || '', + deadlineTime: res?.deadlineTime || '' + }; + if (this.PageStatus === '大宗修改') { + this.sf1data.id = res?.id; + } + res?.unLoadingPlaceVOList.forEach((element: any) => { + if (element.type === 1 || element.type === '1') { + const controlId = this.startInfo.length; + if (this.PageStatus === '大宗修改') { + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + } else { + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type + }); + } + if (element.createTime) { + this.creatTime = element?.createTime; + this.modifyTime = element?.modifyTime; + } + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required)); + } else if (element.type === 2 || element.type === '2') { + const controlId = this.endInfo.length; + if (this.PageStatus === '大宗修改') { + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + } else { + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type + }); + } + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required)); + } + }); + this.sf3data = { + goodsTypeId: res?.goodsInfoVOList[0]?.goodsTypeId || '', + goodsTypeName: res?.goodsInfoVOList[0]?.goodsTypeName || '', + goodsNameId: res?.goodsInfoVOList[0]?.goodsNameId || '', + goodsName: res?.goodsInfoVOList[0]?.goodsName || '' + }; + if (this.sf3data.goodsTypeName === '其它') { + this.sf3data.goodsName1 = res?.goodsInfoVOList[0]?.goodsName || ''; + } + this.changeGoodsType(this.sf3data.goodsTypeId, { label: this.sf3data.goodsTypeName, value: this.sf3data.goodsTypeId }); + + this.sf4data = { + freightPrice: res?.goodsInfoVOList[0]?.freightPrice || '', + freightType: res?.goodsInfoVOList[0]?.freightType || '', + rule: res?.goodsInfoVOList[0]?.rule || '', + settlementBasis: res?.goodsInfoVOList[0]?.settlementBasis || '', + weight: res?.goodsInfoVOList[0]?.weight || '', + volume: res?.goodsInfoVOList[0]?.volume || '', + number: res?.goodsInfoVOList[0]?.number || '', + carModel: res?.goodsInfoVOList[0]?.carModel?.split(',') || '', + carLength: res?.goodsInfoVOList[0]?.carLength?.split(',') || '' + }; + if (this.PageStatus === '大宗修改') { + this.sf4data.id = res?.goodsInfoVOList[0]?.id; + } + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + }); + } + this.totalFees = res?.freightPrice || '0'; + this.sf7data = { + stateReceipt: res?.stateReceipt, + receiptType: res?.receiptType || '', + receiptUserName: res?.supplementaryInformationVO?.receiptUserName || '', + receiptAddressArea: res?.supplementaryInformationVO?.area || '', + receiptUserPhone: res?.supplementaryInformationVO?.phon || '', + receiptAddress: res?.receiptAddress || '', + paymentDays: res?.paymentDays || '', + remarks: res?.remarks || '' + }; + } + // 回退 + choose() { + window.history.go(-1); + } + // 选择地址 + chooseAddress(index: number, type: string) { + const modalRef = this.modalService.create({ + nzTitle: '选择地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '1' }, + nzOnOk: item => { + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + switch (type) { + case 'start': + this.startInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '1' + }; + break; + case 'end': + this.endInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '2' + }; + break; + default: + break; + } + } + }); + } + // 装卸货地址互换 + swapAddress() { + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any) => { + element.type = '1'; + }); + this.endInfo.forEach((element: any) => { + element.type = '2'; + }); + + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + }); + } + } + getLimitvalue() { + const getlimitvaluesParms = [ + this.service.limitKeys2.month, + this.service.limitKeys2.weight, + this.service.limitKeys2.volume, + this.service.limitKeys2.trainNumber, + this.service.limitKeys2.freight + ]; + this.service.request(this.service.$api_findItemValueByItemKeys, getlimitvaluesParms).subscribe(res => { + const maxMonth = res.filter((item: any) => item.itemKey === this.service.limitKeys2.month)[0].itemValue; + const maxWeight = res.filter((item: any) => item.itemKey === this.service.limitKeys2.weight)[0].itemValue; + const maxVolume = res.filter((item: any) => item.itemKey === this.service.limitKeys2.volume)[0].itemValue; + const maxTrainNumber = res.filter((item: any) => item.itemKey === this.service.limitKeys2.trainNumber)[0].itemValue; + const maxFreight = res.filter((item: any) => item.itemKey === this.service.limitKeys2.freight)[0].itemValue; + this.limitValues = { + maxMonth: Number(maxMonth), + maxWeight: Number(maxWeight), + maxVolume: Number(maxVolume), + maxTrainNumber: Number(maxTrainNumber), + maxFreight: Number(maxFreight) + }; + }); + } + checkGoodsName() { + const name = this.sf3.getValue('/goodsName1'); + if (!name || name.trim().length === 0) { + return; + } + this.service.request(this.service.$api_checkGoodsName, name).subscribe(res => { + if (res === false) { + const modalRef = this.modalService.error({ + nzTitle: '货物名称含有违禁词,请重新输入!', + }); + modalRef.afterClose.subscribe(result => { + // this.sf3.setValue('/goodsName1', null); + }); + } + }); + } +} diff --git a/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.html b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.html new file mode 100644 index 00000000..db754dcf --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.html @@ -0,0 +1,238 @@ + + + + + + +
    货源单设置
    + + {{ i.value }} + +
    + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    + +
    +
    +
    +
    + + 装货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    + +
    +
    + + +
    货物信息
    +
    +
    + + + + + + + + + + + + + +
    + + + + + + + +

    例如 付司机运费 = 重量*单价 = 999.99

    +

    保留小数,即 999.99

    +

    抹除小数,即 999.00

    +

    抹除个位,即 990.00

    +
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    +
    + + +
    补充信息
    +
    +
    + + +
    +
    +
    + +
    +
    +  天内支付运费 +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + +
    +
    diff --git a/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.less b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.less new file mode 100644 index 00000000..6abb9df7 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.less @@ -0,0 +1,48 @@ +:host { + ::ng-deep { + nz-input-number { + width: 100%; + } + nz-date-picker { + width: 94.3%; + } + } + i { + cursor: pointer; + } +} + +.tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; +} + +.card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; +} + +.align-center { + display: flex; + align-items: center; + justify-content: center; +} + +.swap-icon { + padding: 24px; + color: #7d7d7d; + font-size: 30px; + :hover{color: #52acff;} +} + + +input[type='number'] { + -moz-appearance: textfield; +} +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + margin: 0; + -webkit-appearance: none; +} diff --git a/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.ts b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.ts new file mode 100644 index 00000000..789f2339 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk-release-publish/bulk-release-publish.component.ts @@ -0,0 +1,882 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { NgForm } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { + SFComponent, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { SettingsService, _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent, AmapService } from 'src/app/shared/components/amap'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { PublishGoodsChooseFamifiarComponent } from '../choose-famifiar/choose-famifiar.component'; +import { PublishAddressListComponent } from '../onecar-publish/address-list/address-list.component'; +import { PublishSuccessComponent } from '../onecar-publish/publish-success/publish-success.component'; +import { TranAgreementComponent } from '../tran-agreement/tran-agreement.component'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import { SupplyManagementQrcodePageComponent } from '../qrcode-page/qrcode-page.component'; +@Component({ + selector: 'app-publish-goods-bulk-publish', + templateUrl: './bulk-release-publish.component.html', + styleUrls: ['./bulk-release-publish.component.less'] +}) +export class SupplyManagementBulkReleasePublishComponent implements OnInit { + @ViewChild('ngForm') + ngForm!: NgForm; + sf1data: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + sf5data: any; // 货源单设置回显 + sf6data: any; // 货源单设置回显 + sf7data: any; // 货源单设置回显 + creatTime: any; // 货源单设置回显 + modifyTime: any; // 货源单设置回显 + totalFees: any; // 总数信息 + ruleOptions: any; + id = ''; + type = 'add'; + limitValues = { + maxMonth: 99, + maxWeight: 99999, + maxVolume: 99999, + maxTrainNumber: 99999, + maxFreight: 9999999 + } + shipperName = ''; + // // 单位 + startInfo: any[] = []; + endInfo: any[] = []; + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + freightTypeOptions: any; + constructor( + private http: _HttpClient, + private modalService: NzModalService, + private settingSrv: SettingsService, + private service: SupplyManagementService, + private router: Router, + private route: ActivatedRoute, + private amapService: AmapService, + public shipperSrv: ShipperBaseService + ) { + + } + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + schema1: SFSchema = {}; + ui1!: SFUISchema; + + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + ui4!: SFUISchema; + + @ViewChild('sf6', { static: false }) sf6!: SFComponent; + schema6: SFSchema = {}; + ui6!: SFUISchema; + // 初始化 + ngOnInit(): void { + this.initSF1(); + this.initSF3(); + this.initSF4(); + this.initSF6(); + this.getLimitvalue(); + this.initDict(); + this.startInfo = [ + { + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '1' + } + ]; + this.endInfo = [ + { + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '2' + } + ]; + } + initSF1() { + this.schema1 = { + properties: { + shipperAppUserId: { + title: '货主', + type: 'string', + maxLength: 30, + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str =q?.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any[]) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any, qs: any) => { + let str =q?.replace(/^\s+|\s+$/g,""); + if (str) { + this.getRegionCode(str); + this.shipperName = qs?.label; + } + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '项目', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + } as SFSelectWidgetSchema + }, + enterpriseInfoNamer: { + type: 'string', + title: '', + ui: { hidden: true } + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperSrv.getNetworkFreightForwarder(), + change: (q: any, qs: any) => { + this.sf1.setValue('/enterpriseInfoNamer', qs.label); + } + } + }, + deadlineTime: { + title: '有效期', + type: 'string', + format: 'date-time', + ui: { + placeholder: '请输入', + format: 'yyyy-MM-dd HH:mm:ss', + validator: (val) => { + let d = new Date(); + let year = d.getFullYear(); + let month = d.getMonth(); + let date = d.getDate(); + let mydate = new Date(year, month + this.limitValues.maxMonth, date); + if (new Date(val) < new Date()) { + return [{ keyword: 'validTime', message: '有效期时间需大于当前时间' }]; + } + if (new Date(val) > mydate) { + return [{ keyword: 'validTime2', message: `有效期最长为${this.limitValues.maxMonth}个月` }]; + } + return []; + }, + } + }, + dispatchName: { + type: 'string', + title: '调度员姓名', + maxLength: 30, + ui: { + optionalHelp: '选若未填写,司机直接联系您', + placeholder: '请输入' + } + }, + dispatchPhone: { + type: 'string', + title: '调度员手机号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + }, + }, + required: ['shipperAppUserId', 'enterpriseProjectId','enterpriseInfoName','enterpriseInfoId', 'deadlineTime',] + }; + this.ui1 = { + '*': { + spanLabelFixed: 110, + grid: { span: 12 } + }, + $enterpriseInfoName: { + grid: { span: 24 } + } + }; + } + initSF3() { + this.schema3 = { + properties: { + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物类型' }, + asyncData: () => + this.shipperSrv.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + maxLength: 20, + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId','goodsName1'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 90, + grid: { span: 12 } + } + }; + } + initSF4() { + this.schema4 = { + properties: { + freightPrice: { + type: 'string', + title: '运费单价', + ui: { + errors: { required: '请选择运费单价' }, + widget: 'custom', + placeholder: '请输入' + } + }, + freightType: { + type: 'string', + title: '', + ui: { + hidden: true + }, + default: '1' + }, + + rule: { + type: 'string', + title: '', + ui: { + widget: 'custom', + errors: { required: '请选择运费取整规则' } + } + }, + settlementBasis: { + type: 'string', + title: '', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:settlement:type' }, + placeholder: '结算依据', + errors: { required: '请选择结算依据' } + } as SFSelectWidgetSchema + }, + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '请填写总重量' } + } + }, + volume: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + number: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + carModel: { + type: 'string', + title: '车型/车长', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount:3, + placeholder: '请选择车型', + errors: { required: '请选择车型' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:model' }), + change:(tag:any , org:any)=>{ + if(tag.includes("999")){ + this.sf4.setValue('/carModel',["999"]); + } + } + } + }, + carLength: { + type: 'string', + title: '', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount:3, + placeholder: '请选择车长', + errors: { required: '请选择车长' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:length' }), + change:(tag:any , org:any)=>{ + if(tag.includes("999")){ + this.sf4.setValue('/carModel',["999"]); + } + } + } + }, + }, + required: ['weight', 'carModel', 'carLength', 'freightPrice', 'rule', 'settlementBasis'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + }, + $freightPrice: { + grid: { span: 8 } + }, + $rule: { + grid: { span: 8 } + }, + $settlementBasis: { + grid: { span: 8 } + }, + $weight: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $volume: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $number: { + grid: { lg: 8, md: 12, sm: 12, xs: 24 } + }, + $carModel: { + spanLabelFixed: 120, + grid: { span: 8 } + }, + $carLength: { + grid: { span: 8 } + } + }; + } + initSF6() { + this.schema6 = { + properties: { + stateReceipt: { + type: 'string', + title: '是否回单', + enum: [ + { label: '需要', value: true }, + { label: '不需要', value: false } + ], + ui: { + widget: 'select', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + receiptType: { + type: 'string', + title: '回单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'receipt:type' }, + containsAllLabel: false, + placeholder: '请选择', + errors: { required: '请选择' }, + visibleIf: { + stateReceipt: value => value === true + } + } + }, + receiptUserName: { + type: 'string', + title: '联系人', + maxLength: 15, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + }, + }, + receiptUserPhone: { + type: 'string', + title: '联系电话', + maxLength: 11, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + }, + }, + receiptAddressArea: { + type: 'string', + title: '所在地区', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + }, + }, + receiptAddress: { + type: 'string', + title: '详细地址', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + }, + }, + paymentDays: { + type: 'string', + title: '到货后', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '请输入付款承诺天数' } + } + }, + remarks: { + type: 'string', + title: '备注', + maxLength: 200, + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { minRows: 3, maxRows: 3 } + } as SFTextareaWidgetSchema + } + }, + required: ['stateReceipt', 'paymentDays', 'receiptType', 'receiptUserName','receiptUserPhone','receiptAddressArea','receiptAddress','paymentDays'] + }; + this.ui6 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + } + }; + } + initDict() { + this.service.getDictByKey('freight:type').subscribe(res => { + this.freightTypeOptions = res; + }); + this.service.getDictByKey('goodresource:rounding:rules').subscribe(res => { + this.ruleOptions = res; + }); + } + //指派熟车 + chooseFamifiar(item: any) { + const modalRef = this.modalService.create({ + nzTitle: '指派熟车', + nzContent: PublishGoodsChooseFamifiarComponent, + nzComponentParams: { + submitParams: item, + submitUrl: this.service.$api_save_consignBulkAssign + }, + nzWidth: 1300 + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.openFinishPage(result); + } + }); + } + // 打开下单完成页面 + openFinishPage(resourceObj: any = null) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'bulk' } + }); + } + // 提交前确认,委托运输协议弹窗 + submitConfirm(submitType?: any) { + // 校验规则 + Object.keys(this.ngForm.form.controls).forEach(key => { + this.ngForm.form.controls[key].markAsDirty(); + this.ngForm.form.controls[key].updateValueAndValidity(); + }); + this.sf1.validator({ emitError: true }); + this.sf3.validator({ emitError: true }); + this.sf4.validator({ emitError: true }); + this.sf6.validator({ emitError: true }); + if (this.ngForm.form.invalid || !this.sf1.valid || !this.sf3.valid || !this.sf4.valid || !this.sf6.valid) { + this.service.msgSrv.warning('请完善必填项!'); + return; + } + if (this.totalDistance <= 0) { + this.service.msgSrv.warning('起终点相同,请重新选择装卸货地址!'); + return; + } + // 校验各个输入限定值 + if (this.sf4.value.weight > this.limitValues.maxWeight || this.sf4.value.volume > this.limitValues.maxVolume || this.sf4.value.number > this.limitValues.maxTrainNumber) { + this.service.msgSrv.error(`当前货物核载信息已超出限定值【${this.limitValues.maxWeight}吨、${this.limitValues.maxVolume}方、${this.limitValues.maxTrainNumber}车】`); + return; + } + + if (this.sf4.value.freightPrice > this.limitValues.maxFreight) { + this.service.msgSrv.error(`当前运费单价已超出限定值【${this.limitValues.maxFreight}元】`); + return; + } + + // //装卸货信息 + const LoadingList = this.startInfo.concat(this.endInfo); + + // 货物信息 + const sf3Values = { ...this.sf3.value }; + if (sf3Values.goodsTypeName === '其它') { + sf3Values.goodsName = sf3Values.goodsName1; + delete sf3Values.goodsName1; + } + if (this.sf4.value.carModel.includes('999')) { + this.sf4.value.carModel = ['999'] + } + if (this.sf4.value.carLength.includes('999')) { + this.sf4.value.carLength = ['999'] + } + + const goodsInfoList = [ + { + ...sf3Values, + ...this.sf4.value, + carModel: this.sf4.value.carModel.join(','), + carLength: this.sf4.value.carLength.join(',') + } + ]; + const params = { + id: '', + ...this.sf1.value, + unLoadingPlaceDTOList: LoadingList, + goodsInfoDTOList: goodsInfoList, + ...this.sf6.value, + estimatedKilometers: this.totalDistance, + estimatedTravelTime: this.totalTime, + }; + const modalRef = this.modalService.create({ + nzTitle: '运输协议', + nzContent: TranAgreementComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { object: params, shipperName: this.shipperName , type:'bulk'} + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.submit(submitType, params); + } + }); + } + // 确认提交(下单) + submit(submitType?: string, params?: any): void { + + + let reqUrl = this.service.$api_consignBulk; + if (submitType === 'assign') { + this.chooseFamifiar(params); + }else if(submitType === 'qrcode'){ + this.service.request(this.service.$api_consignBulkQRCode, params).subscribe(res => { + if (res) { + this.assignedQrcode( res, params ) + } + }); + return; + } else { + this.service.request(reqUrl, params).subscribe(res => { + if (res) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'bulk' } + }); + } + }); + } + } + // 生成二维码 + assignedQrcode(id:string,parms:any ) { + const item = { + id, + enterpriseInfoName: parms.enterpriseInfoName, + loadingAddressArr: this.startInfo.map((ele: any)=>ele.detailedAddress), + unloadingAddressArr: this.endInfo.map((ele: any)=>ele.detailedAddress), + deadlineTime: parms.deadlineTime, + } + const modalRef = this.modalService.create({ + nzTitle: '二维码', + nzWidth: '468px', + nzContent: SupplyManagementQrcodePageComponent, + nzComponentParams: { + i: item, + }, + nzFooter: null, + }); + modalRef.afterClose.subscribe(() => { + this.router.navigate(['/supply-management/index'], { queryParams: { type: 'bulk' } }); + }); + } + // 获取城市列表 + getRegionCode(regionCode: any) { + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf1.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf1.getProperty('/enterpriseProjectId')!.widget.reset(res); + }); + } + // 打开地图 + openMap(type: string, index: number) { + const modalRef = this.modalService.create({ + nzTitle: '', + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + if(item?.poi) { + const poi = item.poi; + const locList = poi.pois; + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.formattedAddress; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.addressComponent.province; + this.startInfo[index].city = poi.addressComponent.city; + this.startInfo[index].area = poi.addressComponent.district; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.formattedAddress; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.addressComponent.province; + this.endInfo[index].city = poi.addressComponent.city; + this.endInfo[index].area = poi.addressComponent.district; + break; + default: + break; + } + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + }); + } + return true + } else { + this.service.msgSrv.warning('请重新手动选择地址!') + return false + } + } + }); + } + // 选择地址 + chooseAddress(index: number, type: string) { + const modalRef = this.modalService.create({ + nzTitle: '选择地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '1' }, + nzOnOk: item => { + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + switch (type) { + case 'start': + this.startInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '1' + }; + break; + case 'end': + this.endInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '2' + }; + break; + default: + break; + } + } + }); + } + // 返回上一页 + goBack() { + window.history.go(-1); + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget.reset(res); + if (this.sf3data?.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId); + } + } + }); + } + // 装卸货地址互换 + swapAddress(){ + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any) => { + element.type = '1'; + }); + this.endInfo.forEach((element: any) => { + element.type = '2'; + }); + + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + }); + } + } + getLimitvalue() { + const getlimitvaluesParms = [ + this.service.limitKeys2.month, + this.service.limitKeys2.weight, + this.service.limitKeys2.volume, + this.service.limitKeys2.trainNumber, + this.service.limitKeys2.freight, + ]; + this.service.request(this.service.$api_findItemValueByItemKeys, getlimitvaluesParms).subscribe((res) => { + const maxMonth = res.filter((item: any) => item.itemKey === this.service.limitKeys2.month)[0].itemValue; + const maxWeight = res.filter((item: any) => item.itemKey === this.service.limitKeys2.weight)[0].itemValue; + const maxVolume = res.filter((item: any) => item.itemKey === this.service.limitKeys2.volume)[0].itemValue; + const maxTrainNumber = res.filter((item: any) => item.itemKey === this.service.limitKeys2.trainNumber)[0].itemValue; + const maxFreight = res.filter((item: any) => item.itemKey === this.service.limitKeys2.freight)[0].itemValue; + this.limitValues = { + maxMonth: Number(maxMonth), + maxWeight: Number(maxWeight), + maxVolume: Number(maxVolume), + maxTrainNumber: Number(maxTrainNumber), + maxFreight: Number(maxFreight) + } + }) + } +} diff --git a/src/app/routes/supply-management/components/bulk/bulk.component.html b/src/app/routes/supply-management/components/bulk/bulk.component.html new file mode 100644 index 00000000..483a6ed1 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk/bulk.component.html @@ -0,0 +1,136 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + +
    + + +
    +
    + + + + + + + +
    + + +
    +
    + + +
    {{ item?.createUserName }}{{ item?.createUserPhone ? '/' + item?.createUserPhone : ''}}
    +
    + + +
    {{ item?.freightPrice | currency }}
    +
    + + + {{ item?.resourceCode }} +
    {{ item?.resourceTypeLabel }}{{ item?.serviceTypeLabel }}
    +
    {{ item?.resourceStatusLabel === '已完成' ? '已完结' : item?.resourceStatusLabel }}
    +
    + + +
    抢单
    +
    指派
    +
    + + +
    + + ({{ item?.count }}) +
    +
    + + +
    {{ item?.goodsInfos?.goodsName }}
    +
    货源:{{ item?.goodsInfos?.goodsResource }}
    +
    剩余: {{ item?.goodsInfos?.remainingAmount }}
    +
    + + +
    车型: {{ item?.carModelLabel }}
    +
    车长: {{ item?.carLengthLabel }} 米
    +
    +
    +
    +
    + + +
    + + +
    + +
    + + + + +
    + diff --git a/src/app/routes/supply-management/components/bulk/bulk.component.spec.ts b/src/app/routes/supply-management/components/bulk/bulk.component.spec.ts new file mode 100644 index 00000000..1f54e37b --- /dev/null +++ b/src/app/routes/supply-management/components/bulk/bulk.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementBulkComponent } from './bulk.component'; + +describe('SupplyManagementBulkComponent', () => { + let component: SupplyManagementBulkComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementBulkComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementBulkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/bulk/bulk.component.ts b/src/app/routes/supply-management/components/bulk/bulk.component.ts new file mode 100644 index 00000000..9e90a8f6 --- /dev/null +++ b/src/app/routes/supply-management/components/bulk/bulk.component.ts @@ -0,0 +1,573 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementQrcodePageComponent } from '../qrcode-page/qrcode-page.component'; +import { SupplyManagementUpdatePriceComponent } from '../update-price/update-price.component'; + +@Component({ + selector: 'app-supply-management-bulk', + templateUrl: './bulk.component.html' +}) +export class SupplyManagementBulkComponent implements OnInit { + resourceStatus: any; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + auditMany = false; + isVisible = false; + loading: boolean = true; + auditID: any; + _$expand = false; + columns: STColumn[] = []; + freightSchema: SFSchema = {}; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + + tabs: any = { + totalQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0 + }; + constructor( + public service: SupplyManagementService, + private modal: NzModalService, + private router: Router, + public shipperservice: ShipperBaseService + ) {} + + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSFFre(); + this.getGoodsSourceStatistical(); + } + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.resourceStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + releaseTime: { + start: this.sf?.value?.releaseTime?.[0] || '', + end: this.sf?.value?.releaseTime?.[1] || '' + }, + deadlineTime: { + start: this.sf?.value?.deadlineTime?.[0] || '', + end: this.sf?.value?.deadlineTime?.[1] || '' + } + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const a: any = {}; + if (this.resourceStatus) { + a.resourceStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + if (this.sf) { + Object.assign(requestOptions.body, { + ...a, + ...params, + releaseTime: { + start: this.sf?.value?.releaseTime?.[0] || '', + end: this.sf?.value?.releaseTime?.[1] || '' + }, + deadlineTime: { + start: this.sf?.value?.deadlineTime?.[0] || '', + end: this.sf?.value?.deadlineTime?.[1] || '' + } + }); + } + this.loading = true; + return requestOptions; + }; + search() { + this.st?.load(); + this.getGoodsSourceStatistical(); + } + afterRes = (data: any[], rawData?: any) => { + console.log(data); + this.loading = false; + return data.map(item => ({ + ...item, + disabled: item.auditStatus !== '1' + })); + }; + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + loadingPlace: { + type: 'string', + title: '装货地' + }, + dischargePlace: { + type: 'string', + title: '卸货地' + }, + serviceType: { + title: '服务类型', + type: 'string', + default: '', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'service:type' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + settlementBasis: { + title: '结算依据', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'goodresource:settlement:type' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + releaseTime: { + title: '发布时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } as SFDateWidgetSchema + }, + deadlineTime: { + title: '截止时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } as SFDateWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + } + } as SFSelectWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFFre() { + this.freightSchema = { + properties: { + remarks: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '请输入备注', + widget: 'textarea' + } + } + } + }; + this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 16 } } }; + } + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '货源编号', + width: '200px', + fixed: 'left', + className: 'text-left', + render: 'resourceCode' + }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '220px', className: 'text-left' }, + { title: '项目名称', index: 'enterpriseProjectName', width: '220px', className: 'text-left' }, + { title: '关联订单', render: 'orderSn', width: '200px', className: 'text-left' }, + { title: '货物信息', render: 'goodsInfos', width: '280px', className: 'text-left' }, + { + title: '装货地', + className: 'text-left', + index: 'loadingAddressArr', + width: '200px' + }, + { + title: '卸货地', + className: 'text-left', + index: 'unloadingAddressArr', + width: '200px' + }, + { + title: '用车需求', + className: 'text-left', + width: '200px', + render: 'useCarDemand' + }, + { + title: '运费单价', + className: 'text-right', + width: '150px', + index: 'freightPrice', + render: 'freightPrice' + }, + { + title: '结算依据', + className: 'text-left', + width: '200px', + index: 'settlementBasisLabel' + }, + { + title: '货源状态', + className: 'text-left', + index: 'resourceStatusLabel', + width: '120px' + }, + { + title: '截止时间', + width: '170px', + className: 'text-left', + index: 'deadlineTime' + }, + { + title: '发布时间', + width: '170px', + className: 'text-left', + index: 'createTime' + }, + { + title: '审核状态', + className: 'text-left', + index: 'auditStatus', + type: 'badge', + width: '170px', + badge: { + '1': { text: '待审核', color: 'warning' }, + '2': { text: '审核通过', color: 'success' }, + '3': { text: '不通过', color: 'default' }, + '4': { text: '已取消', color: 'default' } + } + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center block-td', + buttons: [ + { + text: '货源审核', + click: _record => this.audit(_record, 1), + iif: item => item.auditStatus === '1', + acl: { ability: ['SUPPLY-INDEX-bulkBatchAudit'] } + }, + { + text: '二维码', + click: _record => this.assignedQrcode(_record), + iif: item => item.resourceStatus == 1 + }, + { + text: '修改单价', + click: _record => this.modification(_record), + iif: item => item.resourceStatus == 1, + acl: { ability: ['SUPPLY-INDEX-modificationUnitPrice'] } + }, + { + text: '取消货源', + click: _record => this.delOne(_record), + iif: item => item.resourceStatus == 1, + acl: { ability: ['SUPPLY-INDEX-bulkCancelSupply'] } + }, + { + text: '再下一单', + click: _record => this.nextOrder(_record), + acl: { ability: ['SUPPLY-INDEX-bulkPlaceOrder'] } + }, + { type: 'divider' } + ] + } + ]; + } + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + + selectChange(e: number) { + console.log(e); + if (e == 2) { + this.resourceStatus = 4; + } else { + this.resourceStatus = e; + } + this.initST(); + setTimeout(() => { + this.st.load(1); + }, 500); + } + + /** + * 二维码 + */ + assignedQrcode(item: any) { + const modalRef = this.modal.create({ + nzTitle: '二维码', + nzWidth: '468px', + nzContent: SupplyManagementQrcodePageComponent, + nzComponentParams: { + i: item + }, + nzFooter: null + }); + } + tabChange(item: any) { + console.log(item); + } + /** + * 审核 + * status : 1 单个 2:批量 + * value : 单个单条数据 + */ + audit(value: any, status?: any) { + console.log(value); + console.log(status); + if (status === 2) { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('未选择货源单!'); + return; + } + let list: any[] = []; + this.selectedRows.forEach(item => { + list.push(item.id); + }); + this.auditID = list; + this.auditMany = true; + } else { + this.auditID = value.id; + this.auditMany = false; + } + this.isVisible = true; + } + /** + * 审核关闭弹窗 + */ + handleCancel(type: any) { + this.isVisible = false; + } + /** + * 代发货源 + */ + releaseGoods() { + this.router.navigate(['/supply-management/bulk-release']); + } + /** + * 审核通过按钮 + */ + handleOK(value: any) { + if (this.selectedRows.length <= 0) { + const params: any = { + id: this.auditID, + remarks: this.sfFre.value.remarks + }; + if (value == 1) { + params.auditStatus = 2; + } else { + params.auditStatus = 3; + } + console.log(params); + this.service.request(this.service.$api_goodsResourceAudit, params).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('审核成功!'); + this.isVisible = false; + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } else { + const params: any = { + ids: this.auditID, + remarks: this.sfFre.value.remarks + }; + if (value == 1) { + params.auditStatus = 2; + } else { + params.auditStatus = 3; + } + console.log(params); + this.service.request(this.service.$api_batchGoodsResourceAudit, params).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('审核成功!'); + this.isVisible = false; + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } + } + // 修改单价 + modification(item: any) { + const modalRef = this.modal.create({ + nzTitle: '修改单价', + nzWidth: '600px', + nzContent: SupplyManagementUpdatePriceComponent, + nzComponentParams: { + record: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } + // getGoodsSourceDetail() { + // this.service.request(this.service.$api_get_bulk_detail, { id: this.id }).subscribe(res => { + // this.i = res; + // this.currentStatus = +this.i?.resourceStatus - 1; + // }) + // } + + // 再下一单 + nextOrder(item: any) { + this.router.navigate(['/supply-management/bulk-amend', item.id], { + queryParams: { + sta: 4 + } + }); + } + // 取消货源 + delOne(item: any) { + this.modal.confirm({ + nzTitle: '确定取消货源吗?', + nzContent: `取消后不可恢复,谨慎操作`, + nzOnOk: () => + this.service.request(this.service.$api_cancelSource, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('已取消货源!'); + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }) + }); + } + // 获取货源状态统计 + getGoodsSourceStatistical() { + this.tabs = { + totalQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.resourceStatus; + this.service.request(this.service.$api_get_goods_resource_statistical, { resourceType: 2, ...params }).subscribe(res => { + if (res) { + console.log(res); + this.tabs = res; + } + }); + } + userAction() {} + // 导出 + exportFire() { + this.service.exportStart(this.reqParams, this.service.$api_asyncExportBulkList); + } +} diff --git a/src/app/routes/supply-management/components/choose-famifiar/add/add.component.html b/src/app/routes/supply-management/components/choose-famifiar/add/add.component.html new file mode 100644 index 00000000..b33e4119 --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/add/add.component.html @@ -0,0 +1,6 @@ + + +
    + + +
    diff --git a/src/app/routes/supply-management/components/choose-famifiar/add/add.component.ts b/src/app/routes/supply-management/components/choose-famifiar/add/add.component.ts new file mode 100644 index 00000000..383d919d --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/add/add.component.ts @@ -0,0 +1,44 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFSchema, SFSchemaEnumType, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; + +@Component({ + selector: 'app-choose-famifiar-add', + templateUrl: './add.component.html' +}) +export class PublishchooseFamifiarAddComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + + i: any; + + constructor(public http: _HttpClient, private cdr: ChangeDetectorRef, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + name: { + type: 'string', + title: '司机手机号' + } + }, + required: ['name'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + } + + close() {} + save() {} +} diff --git a/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.html b/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.html new file mode 100644 index 00000000..0f517765 --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.html @@ -0,0 +1,61 @@ + + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + +
    +
    + +
    已选择{{ st2Data.length }}位司机
    + + + {{ item.captainName }} {{ item.captainPhone }}   + 设置 + + + {{item.default?.carNo}} + + +
    +
    +
    + + +
    diff --git a/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.ts b/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.ts new file mode 100644 index 00000000..3b5ada90 --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/choose-famifiar.component.ts @@ -0,0 +1,345 @@ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzDrawerService } from 'ng-zorro-antd/drawer'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { SupplyManagementAddDriversComponent } from 'src/app/routes/supply-management/components/add-drivers/add-drivers.component'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { CarAddmodalComponent } from '../addmodal/addmodal.component'; + + +@Component({ + selector: 'app-publish-goods-choose-famifiar', + templateUrl: './choose-famifiar.component.html' +}) +export class PublishGoodsChooseFamifiarComponent implements OnInit { + schema: SFSchema = {}; + columns!: STColumn[]; + i: any; + ui!: SFUISchema; + sfExpand = false; + @ViewChild('st', { static: false }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + @ViewChild('st2', { static: false }) + st2!: STComponent; + columns2!: STColumn[]; + st2Data: STData[] = []; + + @Input() + submitUrl = ''; + + @Input() + submitParams: any; + + constructor( + private modal: NzModalRef, + public router: Router, + public ar: ActivatedRoute, + private drawerService: NzDrawerService, + public service: SupplyManagementService, + private modalService: NzModalService, + private modalHelper: ModalHelper, + private envSrv: EAEnvironmentService + ) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + isManage: 0 + }; + } + ngOnInit() { + this.initSF(); + this.initST(); + this.initST2(); + } + + initSF() { + this.schema = { + properties: { + nameOrPhone: { + type: 'string', + title: '承运司机', + ui: { + placeholder: '请输入司机姓名/手机号' + } + }, + carNo: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入车牌号' + } + } + } + }; + this.ui = { + '*': { + grid: { span: 12, gutter: 4 } + } + }; + } + + initST() { + this.columns = [ + { + title: '司机姓名', + index: 'name' + }, + { + title: '手机号', + index: 'telephone' + }, + { + title: '指定车辆', + width: 130, + render: 'userCarLicenseDesensitizationVOList' + }, + { + title: '状态', + className: 'text-center', + index: 'certificationStatus', + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 0: { text: '待审核', color: 'processing' }, + 1: { text: '已认证', color: 'success' }, + 2: { text: '未认证', color: 'error' } + } + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '选择', + iif: item => item.showChoose != false, + click: (_record, _modal, _instance) => this.verifyVechicleStatus(_record), + iifBehavior: 'disabled' + } + ] + } + ]; + } + + initST2() { + this.columns2 = [ + { + title: '司机姓名', + index: 'name', + width: '90px' + }, + { + title: '手机号', + index: 'telephone', + width: '120px' + }, + { + title: '车队长', + render: 'captain', + width: '200px' + }, + { + title: '指定车辆', + render: 'defaultCar', + width: '130px' + }, + { + title: '操作', + className: 'text-center', + width: '90px', + buttons: [ + { + text: '移除', + click: (_record, _modal, _instance) => this.remove(_record, _modal, _instance) + } + ] + } + ]; + } + + // 选择 + choose(record: STData) { + this.st2Data = [...this.st2Data, ...[record]]; + this.st.setRow(record, { showChoose: false }); + } + // 移除 + remove(record: STData, value1: any, comp: any) { + const index = this.st?.list.findIndex((obj: any) => obj.appUserId === record.appUserId); + if (index >= 0) { + comp!.removeRow(record); + this.st2Data = this.st2Data.filter(item => item.appUserId !== record.appUserId); + this.st.setRow(index, { showChoose: true }); + } + } + + //添加司机 + add() { + this.modalHelper.create(CarAddmodalComponent, {}, { size: 900, modalOptions: { nzMaskClosable: false } }).subscribe(res => { + if (res) this.st.reload(); + }); + } + + /** + * 校验司机是否能设置车队长 + * @param item 当前对象 + */ + verifyCanSetCarCaptain(item: any, index: any) { + this.service.request(this.service.$api_get_sys_config, [{ itemKey: 'sys.config.shipper.setCarCaptain', businessId: this.envSrv.env.enterpriseId }]).subscribe(res => { + if (res && res.length > 0) { + const { itemValue } = res[0]; + if (itemValue !== '1') { + this.service.msgSrv.error('不可设置车队长!'); + return; + } + this.setCaptain(item, index); + } + }) + } + + //设置车队长 + setCaptain(record: STData, index: any) { + this.modalHelper + .create( + SupplyManagementAddDriversComponent, + { dirvierInfo: record }, + { + size: 900, + modalOptions: { nzMaskClosable: false, nzTitle: '设置' } + } + ) + .subscribe(res => { + if (res) { + this.st2.setRow(index, { captainName: res.name, captainPhone: res.mobile, captainAppUserId: res.appUserId }); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.sfExpand = false; + this.st.load(1); + } + + expandToggle() { + this.sfExpand = !this.sfExpand; + this.sf?.setValue('/_expand', this.sfExpand); + } + + // 熟车请求数据处理 + reqProcess = (data: STData[], rawData: any): STData[] => { + if (rawData.status === 505016) { + this.modalService.confirm({ + nzTitle: '系统提示', + nzContent: '该司机还未注册,是否邀请他注册?点击"是"系统将发送邀请短信给司机', + nzOkText: '确定', + nzCancelText: '取消', + nzOnOk: () => { + this.sendMsg(this.sf?.value?.nameOrPhone).subscribe((res => { + if (res.code === '1') { + this.service.msgSrv.success('发送成功'); + } else { + this.service.msgSrv.success('发送失败'); + } + })); + } + }); + return []; + } + return data.map((i, index) => { + const defaultCart = i.userCarLicenseDesensitizationVOList.find((cart: any) => cart.isDefault); + return { ...i, default: defaultCart || '' }; + }); + } + + cancel() { + this.modal.destroy(); + } + + ok() { + if (this.st2._data?.length <= 0) { + this.service.msgSrv.warning('请选择熟车'); + return; + } + const data = this.st2._data.map(item => ({ + driverId: item.appUserId, + carId: item.default?.carId || null, + carCaptainId: item.captainAppUserId + })); + this.service.request(this.submitUrl, { ...this.submitParams, carDriverIds: data }).subscribe((rs: any) => { + if (rs) { + this.service.msgSrv.success('指派成功'); + this.modal.destroy(true); + } + }); + } + + carChange(event: any, item: STData) { + + } + + /** +* 验证车辆的状态 +*/ + verifyVechicleStatus(_record: STData) { + const { carId, appUserId: driverId, captainAppUserId: carCaptainId } = _record; + const carInfo: any = { carId, driverId, carCaptainId }; + const goodsInfoList = this.submitParams?.goodsInfoList; + this.service.request(this.service.$api_verify_vehicle_status, { ...carInfo, goodsInfoList }).subscribe((res: any) => { + if (res) { + const { title, alert, subContent, content } = res; + switch (alert) { + case 'Error': + this.error(title, content, subContent); + break; + case 'Warn': + this.showConfirm(_record, title, content, subContent); + break; + case 'Success': + this.choose(_record); + break; + } + } + }); + + } + + error(title: string, content: string, subContent: string): void { + this.modalService.error({ + nzTitle: title, + nzContent: `${content ? content : ''}${subContent ? subContent : ''}`, + nzOkText: '知道了' + }); + } + + showConfirm(_record: STData, title: string, content: string, subContent: string): void { + this.modalService.confirm({ + nzTitle: title, + nzContent: `${content ? content : ''}${subContent ? subContent : ''}`, + nzOkText: '继续', + nzCancelText: '取消', + nzOnOk: () => { + this.choose(_record); + } + }); + } + + /** +* 发送邀请司机注册短信 +*/ + sendMsg(phoneNumber: string) { + return this.service.request(this.service.$api_send_msg_code, phoneNumber) + } +} diff --git a/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.html b/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.html new file mode 100644 index 00000000..b33e4119 --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.html @@ -0,0 +1,6 @@ + + +
    + + +
    diff --git a/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.ts b/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.ts new file mode 100644 index 00000000..395a7514 --- /dev/null +++ b/src/app/routes/supply-management/components/choose-famifiar/set-captain/set-captain.component.ts @@ -0,0 +1,53 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-06 15:17:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-02 14:29:12 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\choose-famifiar\\set-captain\\set-captain.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFSchema, SFSchemaEnumType, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; + +@Component({ + selector: 'app-choose-famifiar-set-captain', + templateUrl: './set-captain.component.html' +}) +export class PublishchooseFamifiarSetCaptainComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema!: SFSchema; + ui!: SFUISchema; + + i: any; + + constructor(public http: _HttpClient, private cdr: ChangeDetectorRef, private route: ActivatedRoute, private modal: NzModalRef,) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + captainPhone: { + type: 'string', + title: '车队长手机号' + } + }, + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + } + + close() {this.modal.close()} + save() {this.modal.close(this.sf.value.captainPhone)} +} diff --git a/src/app/routes/supply-management/components/index/index.component.html b/src/app/routes/supply-management/components/index/index.component.html new file mode 100644 index 00000000..5d61d68b --- /dev/null +++ b/src/app/routes/supply-management/components/index/index.component.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/supply-management/components/index/index.component.spec.ts b/src/app/routes/supply-management/components/index/index.component.spec.ts new file mode 100644 index 00000000..9601ea0c --- /dev/null +++ b/src/app/routes/supply-management/components/index/index.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementIndexComponent } from './index.component'; + +describe('SupplyManagementIndexComponent', () => { + let component: SupplyManagementIndexComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementIndexComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementIndexComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/index/index.component.ts b/src/app/routes/supply-management/components/index/index.component.ts new file mode 100644 index 00000000..1cb8ec9c --- /dev/null +++ b/src/app/routes/supply-management/components/index/index.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; + +@Component({ + selector: 'app-supply-management-index', + templateUrl: './index.component.html', +}) +export class SupplyManagementIndexComponent implements OnInit { + selectedIndex = 0; + + constructor(private http: _HttpClient, private modal: ModalHelper) { } + + ngOnInit(): void { } + + +} diff --git a/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.html b/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.html new file mode 100644 index 00000000..cb2e8122 --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.html @@ -0,0 +1,25 @@ + + + + {{ item.province }}-{{ item.city }}-{{ item.area }} + diff --git a/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.ts b/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.ts new file mode 100644 index 00000000..9dcc4ec0 --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/address-list/address-list.component.ts @@ -0,0 +1,87 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-14 20:08:17 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:28:07 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\onecar-publish\\address-list\\address-list.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { processSingleSort } from '@shared'; +import { NzDrawerService } from 'ng-zorro-antd/drawer'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../../services/supply-management.service'; +@Component({ + selector: 'app-publish-address-list', + templateUrl: './address-list.component.html' +}) +export class PublishAddressListComponent implements OnInit { + columns!: STColumn[]; + @ViewChild('st', { static: false }) + st!: STComponent; + + seleteData: any; + + spuStatus = '1'; // '1'客户地址,'2'收回单地址 + + constructor( + public router: Router, + public ar: ActivatedRoute, + private drawerService: NzDrawerService, + public service: SupplyManagementService, + private modalService: NzModalService + ) {} + + /** + * 查询参数 + */ + get reqParams() { + return { + type: this.spuStatus + }; + } + ngOnInit() { + this.initST(); + } + + initST() { + this.columns = [ + { title: '', index: 'id', type: 'radio', width: 70 }, + { + title: '省市区', + render: 'region' + }, + { + title: '详细地址', + index: 'detailedAddress' + }, + { + title: '联系人', + index: 'contactName' + }, + { + title: '联系电话', + index: 'contactTelephone' + }, + { + title: '更新时间', + index: 'modifyTime' + } + ]; + } + + // 排序 + reqProcess(requestOptions: STRequestOptions): STRequestOptions { + return processSingleSort(requestOptions); + } + + change(ret: STChange): void { + console.log('change', ret); + this.seleteData = { ...ret.radio }; + } +} diff --git a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html new file mode 100644 index 00000000..3c489ffb --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html @@ -0,0 +1,268 @@ + + + + + + +
    货源单设置
    + +
    + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    + +
    +
    +
    +
    + + 装货地 + +
    + + + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + 装货时间 + + + + +
    +
    +
    + + 卸货时间 + + + + +
    +
    + +
    +
    + + +
    货物信息
    +
    +
    + + + + + + 国家法规及行政命令禁限运货物不能托运 + 《禁运物品说明》 + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    + + +
    服务信息
    +
    +
    + + +  货源曝光率 +10   +  车源匹配率 +10 + + +  货源曝光率 +20   +  车源匹配率 +20 + + + + + + + + ①香港、澳门、台湾、西藏、新疆不予承保,②单次运输保额仅限200万元以内,③保险详细内容及注意事项请见《保险告知函》 + +
    +
    +
    + + + +
    补充信息
    +
    +
    + +
    +
    +
    + + +
    运费信息
    +
    +
    + + + + + + + + + + + + + + {{ i.value | currency }} + {{ i.value | currency }}(费率:{{ currentRate | number: + '0.2-4' }}%) + {{ i.value | currency }} + +
    +
    + +
    +
    +  天内支付运费 +
    +
    +
    +
    +
    +
    +
    + +
    + + + + +
    +
    diff --git a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.less b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.less new file mode 100644 index 00000000..a445eacf --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.less @@ -0,0 +1,86 @@ +:host { + ::ng-deep { + nz-input-number { + width: 100%; + } + + nz-date-picker { + width: 94.3%; + } + + .sf3 { + .goods_Tips_item { + .goods_tips { + width: calc(50% - 45px); + + .ant-alert { + padding: 0 0 0 2px; + } + + } + + nz-form-item { + margin-bottom: 8px; + } + + // .ant-form-item-control-input-content { + // display: flex; + // justify-content: end; + // } + } + } + + } + + i { + cursor: pointer; + } +} + +.tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; +} + +.card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; +} + +.align-center { + display: flex; + align-items: center; + justify-content: center; +} + +.swap-icon { + padding: 24px; + color: #7d7d7d; + font-size: 30px; + + :hover { + color: #52acff; + } +} + +#container { + width: 300px; + height: 180px; +} + +input[type='number'] { + -moz-appearance: textfield; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + margin: 0; + -webkit-appearance: none; +} + +.hides { + margin-left: 10px; + color: aqua; +} diff --git a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts new file mode 100644 index 00000000..9795724f --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts @@ -0,0 +1,1487 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import format from 'date-fns/format'; +import { Subject } from 'rxjs'; +import { ActivatedRoute, Router } from '@angular/router'; +import { + SFCheckboxWidgetSchema, + SFComponent, + SFNumberWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { AmapPoiPickerComponent, AmapService, EACacheService, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementVehicleAssignedCarComponent } from '../assigned-car/assigned-car.component'; +import { TranAgreementComponent } from '../tran-agreement/tran-agreement.component'; +import { PublishAddressListComponent } from './address-list/address-list.component'; +import { PublishSuccessComponent } from './publish-success/publish-success.component'; +import { cacheConf } from '@conf/cache.conf'; + +@Component({ + selector: 'app-publish-goods-onecar-publish', + templateUrl: './onecar-publish.component.html', + styleUrls: ['./onecar-publish.component.less'] +}) +export class SupplyManagementOnecarPublishComponent implements OnInit { + // 环境信息 appId、tenantId + envInfo = this.eaCacheSrv.get(cacheConf.env); + validateForm1: FormGroup; + limitValues = { + maxWeight: 99999, + maxVolume: 99999, + maxPiece: 99999, + maxDays: 999, + intervalDays: 999, + maxTimes: 5 + }; + sf1data: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + sf5data: any; // 货源单设置回显 + sf55data: any; // 货源单设置回显 + sf6data: any; // 货源单设置回显 + sf7data: any; // 货源单设置回显 + creatTime: any; // 货源单设置回显 + loadingTime: any; // 货源单设置回显 + unloadingTime: any; // 货源单设置回显 + totalFees: any; // 总数信息 + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + currentRate = 0; //实时计算的费率 + id = this.route.snapshot.params.id; + startInfo: any = []; // 发货地数据 + endInfo: any = []; // 卸货地数据 + PageStatus = ''; + shipperName = ''; + changeSub = new Subject(); + envCache: any; + enterpriseProjectIds: any; + constructor( + private http: _HttpClient, + fb: FormBuilder, + private router: Router, + private route: ActivatedRoute, + private modalService: NzModalService, + public service: SupplyManagementService, + private amapService: AmapService, + public shipperSrv: ShipperBaseService, + private eaCacheSrv: EACacheService + ) { + this.validateForm1 = fb.group({ + loadingTime: [null, [Validators.required]], + unloadingTime: [null, [Validators.required]] + }); + this.envCache = this.eaCacheSrv.get(cacheConf.env); + } + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + schema1: SFSchema = {}; + ui1!: SFUISchema; + + @ViewChild('sf2', { static: false }) sf2!: SFComponent; + schema2: SFSchema = {}; + ui2!: SFUISchema; + + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + ui4!: SFUISchema; + + @ViewChild('sf5', { static: false }) sf5!: SFComponent; + schema5: SFSchema = {}; + ui5!: SFUISchema; + + @ViewChild('sf55', { static: false }) sf55!: SFComponent; + schema55: SFSchema = {}; + ui55!: SFUISchema; + + @ViewChild('sf6', { static: false }) sf6!: SFComponent; + schema6: SFSchema = {}; + ui6!: SFUISchema; + + @ViewChild('sf7', { static: false }) sf7!: SFComponent; + schema7: SFSchema = {}; + ui7!: SFUISchema; + + formatterRmb = (value: number): string => { + if (value === null || value === undefined) { + return ''; + } else { + let value2 = Number(value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + return `¥${value2}`; + } + }; + parserRmb = (value: string): string => value.replace('¥', '').replace(',', ''); + + // 页面初始化 + ngOnInit(): void { + if (this.route.snapshot?.queryParams?.sta === '1') { + this.PageStatus = '整车修改'; + } else if (this.route.snapshot?.queryParams?.sta === '2') { + this.PageStatus = '整车下一单'; + } + this.initSF1(); + this.initSF3(); + this.initSF4(); + this.initSF5(); + this.initSF6(); + this.initSF7(); + this.getLimitvalue(); + this.initdata(); + } + initSF1() { + this.schema1 = { + properties: { + resourceCode: { + type: 'string', + title: '', + ui: { hidden: true } + }, + shipperAppUserId: { + title: '货主', + type: 'string', + maxLength: 30, + readOnly: this.PageStatus == '整车修改' ? true : false, + ui: { + widget: 'select', + // serverSearch: true, + allowClear: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + onSearch: (q: any) => { + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map(res => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any, qs: any) => { + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + this.getRegionCode(str); + this.shipperName = qs?.label; + this.payChange(); + } + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '项目', + readOnly: this.PageStatus == '整车修改' ? true : false, + ui: { + widget: 'select', + placeholder: '请选择' + } as SFSelectWidgetSchema + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'text' + } + }, + + externalResourceCode: { + type: 'string', + title: '外部货源号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + }, + dispatchName: { + type: 'string', + title: '调度员姓名', + maxLength: 30, + ui: { + optionalHelp: '选若未填写,司机直接联系您', + placeholder: '请输入' + } + }, + dispatchPhone: { + type: 'string', + title: '调度员手机号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + } + // dispatchId: { + // type: 'string', + // title: '调度员', + // ui: { + // widget: 'select', + // placeholder: '请选择', + // allowClear: true, + // optionalHelp: '选择调度员,司机直接联系调度员 ; 不选择,司机直接联系您', + // change: (_value: any, data: any) => { + // if (data.label) { + // const dat = data.label.split('/'); + // this.sf1.setValue('/dispatchName', dat[0]); + // this.sf1.setValue('/dispatchPhone', dat[1]); + // } + // }, + // asyncData: () => this.shipperSrv.getStaffList2() + // } as SFSelectWidgetSchema + // }, + }, + required: ['shipperAppUserId', 'enterpriseProjectId'] + }; + this.ui1 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + }, + $enterpriseInfoName: { + grid: { span: 12 } + }, + $shipperAppUserId: { + grid: { span: 12 } + }, + $enterpriseProjectId: { + grid: { span: 12 } + } + }; + } + initSF3() { + this.schema3 = { + properties: { + goodsTips: { + type: 'string', + title: '', + ui: { + widget: 'custom', + class: 'goods_Tips_item', + // visibleIf: { + // goodsTypeName: (value: any) => value && value === '其它' + // } + } + }, + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物类型' }, + asyncData: () => + this.shipperSrv.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (_value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + maxLength: 20, + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + }, + blur: (value: any) => { + this.checkGoodsName(); + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId', 'goodsName1'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 90, + grid: { span: 12 } + }, + $goodsTips: { + grid: { span: 24 } + } + }; + } + initSF4() { + this.schema4 = { + properties: { + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '必填项' }, + validator: val => this.customValidator(val) + } + }, + volume: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + number: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + carModel: { + type: 'string', + title: '车型/车长', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车型', + errors: { required: '请选择车型' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:model' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carModel', ['999']); + } + } + } + }, + carLength: { + type: 'string', + title: '', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车长', + errors: { required: '请选择车长' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:length' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carLength', ['999']); + } + } + } + }, + hidenField: { + type: 'string', + title: '', + default: ' ', + ui: { + widget: 'text' + } + }, + insurancePackagedGoods: { + type: 'string', + title: '货物包装', + ui: { + widget: 'dict-select', + params: { dictKey: 'insure:packaged:goods' }, + containsAllLabel: false, + validator: val => { + if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { + return [{ keyword: 'required', message: '必填项' }]; + } else { + return []; + } + } + } as SFSelectWidgetSchema + }, + goodsValue: { + type: 'string', + title: '货物价值', + ui: { + widget: 'custom', + validator: val => { + if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { + return [{ keyword: 'required', message: '必填项' }]; + } else { + return []; + } + } + } + } + }, + required: ['weight', 'carModel', 'carLength'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 115, + grid: { span: 8 } + } + }; + } + + + initSF5() { + this.schema5 = { + properties: { + insuranceType: { + type: 'string', + title: '服务包', + ui: { + widget: 'select', + asyncData: () => { + return this.service.request(this.service.$api_getDictValue, { dictKey: 'bill:insurance:type' }).pipe( + map((res: any) => { + return [...res]; + }) + ) + }, + change: (tag: any, org: any) => { + if (tag === '3') { + this.sf5.setValue('/insurancePremium', null); + this.sf5.setValue('/insuranceRate', null); + } else { + this.getInsurersPrice(tag); + } + } + }, + default: '3' + }, + type1: { + type: 'string', + title: '', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '0' } + }, + }, + type2: { + type: 'string', + title: '', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '1' } + } + }, + insurancePremium: { + type: 'string', + title: '服务包费用', + readOnly: true, + ui: { + visibleIf: { insuranceType: (value: string) => value !== '3' } + } + }, + insuranceRate: { + type: 'string', + title: '保险费率', + ui: { + hidden: true + } + }, + freeInsurance1: { + type: 'string', + title: '预投基本险', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '0' } + } + }, + freeInsurance2: { + type: 'string', + title: '预投综合险', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '1' } + } + }, + }, + required: ['insurancePremium'] + }; + this.ui5 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + }, + $type1: { + grid: { span: 24 } + }, + $type2: { + grid: { span: 24 } + }, + $freeInsurance1: { + grid: { span: 24 } + }, + $freeInsurance2: { + grid: { span: 24 } + } + }; + } + + /** + * 自定义校验数据 + * @param val + */ + customValidator(val: number) { + if (this.isEmpty(val)) { + return [{ keyword: 'required', message: '不能为空' }]; + } else { + if (val <= 0) { + return [{ keyword: 'required', message: '数值需大于0' }]; + } + return []; + } + } + isEmpty(val: any) { + return val === undefined || val === null || val.toString().trim() === ''; + } + initSF6() { + this.schema6 = { + properties: { + stateReceipt: { + type: 'string', + title: '是否回单', + enum: [ + { label: '需要', value: true }, + { label: '不需要', value: false } + ], + ui: { + widget: 'select', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + receiptType: { + type: 'string', + title: '回单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'receipt:type' }, + containsAllLabel: false, + placeholder: '请选择', + errors: { required: '请选择' }, + visibleIf: { + stateReceipt: value => value === true + } + } + }, + receiptUserName: { + type: 'string', + title: '联系人', + maxLength: 15, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptUserPhone: { + type: 'string', + title: '联系电话', + maxLength: 11, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddressArea: { + type: 'string', + title: '所在地区', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddress: { + type: 'string', + title: '详细地址', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + remarks: { + type: 'string', + title: '备注', + maxLength: 200, + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { minRows: 3, maxRows: 3 } + } as SFTextareaWidgetSchema + } + }, + required: ['stateReceipt', 'receiptType', 'receiptUserName', 'receiptUserPhone', 'receiptAddressArea', 'receiptAddress'] + }; + this.ui6 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + } + }; + } + + initSF7() { + this.schema7 = { + properties: { + prePay: { + type: 'number', + title: '预付', + ui: { widget: 'custom' } + }, + toPay: { + type: 'number', + title: '到付', + ui: { widget: 'custom' } + }, + receiptPay: { + type: 'number', + title: '回单付', + ui: { widget: 'custom' } + }, + subtotal: { type: 'number', title: '小计', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + appendFee: { type: 'number', title: '附加费', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + total: { type: 'number', title: '总费用', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + paymentDays: { + type: 'string', + title: '到货后', + ui: { + widget: 'custom', + errors: { required: '请输入付款承诺天数' } + } + } + }, + required: ['paymentDays'] + }; + this.ui7 = { + '*': { + spanLabelFixed: 115, + grid: { span: 24 } + } + }; + } + getRegionCode(regionCode: any) { + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf1.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf1.getProperty('/enterpriseProjectId')!.widget.reset(res); + if (this.enterpriseProjectIds) { + this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + } + }); + } + payChange() { + const prePay = this.sf7.value.prePay || 0; + const toPay = this.sf7.value.toPay || 0; + const receiptPay = this.sf7.value.receiptPay || 0; + const oilCardPay = 0; + const subtotal = prePay + toPay + receiptPay; + const params = { + shipperId: this?.sf1?.value?.shipperAppUserId, + enterpriseInfoId: this?.sf1data?.enterpriseInfoId || '', + totalFreight: subtotal, + fuelCardAmount: oilCardPay, + resourcetype: '1' + }; + this.service.request(this.service.$api_getCalculatedSurcharge, params).subscribe(res => { + if (res) { + this.sf7.setValue('/appendFee', res.surcharge); + this.sf7.setValue('/subtotal', subtotal); + this.sf7.setValue('/total', subtotal + res.surcharge); + let items = this?.sf1data?.enterpriseInfoId || ''; + this.service + .request( + this.service.$api_getAdditionalRate + + `?shipperId=${this?.sf1?.value?.shipperAppUserId || ''}&enterpriseInfoId=${items}&resourcetype='1'` + ) + .subscribe(res => { + if (res) { + this.currentRate = res.rate * 100; + } + }); + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + addStartInfo() { + if (this.startInfo.length < this.limitValues.maxTimes) { + const controlId = this.startInfo.length; + this.startInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '1' + }); + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + } + } + + getLimitvalue() { + // 货物核载信息最大值 + // 货物运输费(小计)最大值 + const getlimitvaluesParms = [ + this.service?.limitKeys?.weight, + this.service?.limitKeys?.volume, + this.service?.limitKeys?.piece, + this.service?.limitKeys?.maxDays, + this.service?.limitKeys?.intervalDays, + this.service?.limitKeys?.maxTimes + ]; + this.service.request(this.service.$api_findItemValueByItemKeys, getlimitvaluesParms).subscribe(res => { + const maxWeight = res.filter((item: any) => item.itemKey === this.service.limitKeys?.weight)[0].itemValue; + const maxVolume = res.filter((item: any) => item.itemKey === this.service.limitKeys?.volume)[0].itemValue; + const maxPiece = res.filter((item: any) => item.itemKey === this.service.limitKeys?.piece)[0].itemValue; + const maxDays = res.filter((item: any) => item.itemKey === this.service.limitKeys?.maxDays)[0].itemValue; + const intervalDays = res.filter((item: any) => item.itemKey === this.service.limitKeys?.intervalDays)[0].itemValue; + const maxTimes = res.filter((item: any) => item.itemKey === this.service.limitKeys?.maxTimes)[0].itemValue; + this.limitValues = { + maxWeight: Number(maxWeight), + maxVolume: Number(maxVolume), + maxPiece: Number(maxPiece), + maxDays: Number(maxDays), + intervalDays: Number(intervalDays), + maxTimes: Number(maxTimes) + }; + }); + } + subStartInfo(event: any, index: number) { + this.startInfo.splice(index, 1); + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + } + addEndInfo() { + if (this.endInfo.length < this.limitValues.maxTimes) { + const controlId = this.endInfo.length; + this.endInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '2' + }); + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl( + `unloadPhone${controlId}`, + new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')]) + ); + } + } + subEndInfo(event: any, index: number) { + this.endInfo.splice(index, 1); + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget.reset(res); + if (this.sf3data.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId); + } + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + //指派熟车 + chooseFamifiar(item: any) { + const modalRef = this.modalService.create({ + nzTitle: '指派熟车', + nzContent: SupplyManagementVehicleAssignedCarComponent, + nzWidth: 1200, + nzComponentParams: { + status: 'new', + url: this.service.$api_save_assign_whole, + params: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.openFinishPage(result); + } + }); + } + // 打开下单完成页面 + openFinishPage(resourceObj: any = null, change?: any) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'onecar', resourceObj, change: change } + }); + } + // 提交前确认,委托运输协议弹窗 + submitConfirm(submitType?: string) { + Object.keys(this.validateForm1.controls).forEach(key => { + this.validateForm1.controls[key].markAsDirty(); + this.validateForm1.controls[key].updateValueAndValidity(); + }); + this.sf3.validator({ emitError: true }); + this.sf4.validator({ emitError: true }); + this.sf5.validator({ emitError: true }); + this.sf6.validator({ emitError: true }); + this.sf7.validator({ emitError: true }); + if ( + this.validateForm1.invalid || + !this.sf3.valid || + !this.sf1.valid || + !this.sf4.valid || + !this.sf5.valid || + !this.sf6.valid || + !this.sf7.valid + ) { + this.service.msgSrv.warning('请完善必填项!'); + return; + } + if (this.totalDistance <= 0) { + this.service.msgSrv.warning('起终点相同,请重新选择装卸货地址!'); + return; + } + if (this.validateForm1.value.loadingTime < new Date()) { + this.service.msgSrv.warning('装货时间必须大于当前时间!'); + return; + } + if (this.validateForm1.value.loadingTime > this.validateForm1.value.unloadingTime) { + this.service.msgSrv.warning('装货时间不能大于卸货时间!'); + return; + } + if (this.sf7.value.total <= 0) { + this.service.msgSrv.warning('总费用不能为0!'); + return; + } + const num = (Number(this.validateForm1.value.unloadingTime) - Number(this.validateForm1.value.loadingTime)) / (24 * 60 * 60 * 1000); + if (num > this.limitValues.maxDays) { + this.service.msgSrv.error(`当前计划装卸货时间间隔已超出限定值【${this.limitValues?.maxDays}天】`); + return; + } + if ( + this.sf4.value?.weight > this.limitValues?.maxWeight || + this.sf4.value?.volume > this.limitValues?.maxVolume || + this.sf4.value?.number > this.limitValues?.maxPiece + ) { + this.service.msgSrv.error( + `当前货物核载信息已超出限定值【${this.limitValues?.maxWeight}吨、${this.limitValues?.maxVolume}方、${this.limitValues?.maxPiece}件】` + ); + return; + } + + const getFreightParms = { carLengthKeys: this.sf4.value.carLength, km: this.totalDistance }; + this.service.request(this.service.$api_getFreight, getFreightParms).subscribe(res => { + if (this.sf7.value.subtotal > res.maxPrice) { + this.service.msgSrv.error(`运费过高,请调整录入`); + return; + } else if (this.sf7.value.subtotal > res.ewPrice) { + this.modalService.confirm({ + nzTitle: '', + nzContent: `您的录入的运费过高,可能会影响支付,请仔细确认`, + nzOkText: '继续', + nzCancelText: '取消', + nzOnOk: () => { + this.agreementConfirm(submitType); + } + }); + } else { + this.agreementConfirm(submitType); + } + }); + } + // 提交前协议弹窗 + agreementConfirm(submitType?: string) { + //装卸货信息 + const LoadingList = this.startInfo.concat(this.endInfo); + + // 货物信息 + const sf3Values = { ...this.sf3.value }; + if (sf3Values.goodsTypeName === '其它') { + sf3Values.goodsName = sf3Values.goodsName1; + delete sf3Values.goodsName1; + } + if (this.sf4.value.carModel.includes('999')) { + this.sf4.value.carModel = ['999']; + } + if (this.sf4.value.carLength.includes('999')) { + this.sf4.value.carLength = ['999']; + } + const goodsInfoVOList = [ + { + ...sf3Values, + ...this.sf4.value, + carModel: this.sf4.value.carModel.join(','), + carLength: this.sf4.value.carLength.join(',') + } + ]; + // 运费信息 + const expenseList = [ + { expenseCode: 'PRE', expenseName: '预付', price: this.sf7.value.prePay || 0, id: this.sf7data?.prePayId || '', resourceId: this.sf7data?.PREresourceId || '' }, + { expenseCode: 'RECE', expenseName: '到付', price: this.sf7.value.toPay || 0, id: this.sf7data?.toPayId || '', resourceId: this.sf7data?.RECEresourceId || '' }, + { expenseCode: 'BACK', expenseName: '回单付', price: this.sf7.value.receiptPay || 0, id: this.sf7data?.receiptPayId || '', resourceId: this.sf7data?.BACKresourceId || '' } + ]; + // 从“再下一单”过来,将所有的子参数内的id都删除 + if (this.PageStatus === '整车下一单') { + delete this.sf1.value.resourceCode; + + LoadingList.forEach((ele: any) => { + delete ele.id; + }); + goodsInfoVOList.forEach((ele: any) => { + delete ele.id; + }); + expenseList.forEach((ele: any) => { + delete ele.id; + }); + } + const params = { + id: '', + ...this.sf1.value, + unLoadingPlaceDTOList: LoadingList, + unloadingTime: format(this.validateForm1.value.unloadingTime, 'yyyy-MM-dd HH:mm:ss'), + loadingTime: format(this.validateForm1.value.loadingTime, 'yyyy-MM-dd HH:mm:ss'), + goodsInfoDTOList: goodsInfoVOList, + ...this.sf5.value, + ...this.sf6.value, + expenseDTOList: expenseList, + paymentDays: this.sf7.value.paymentDays, + estimatedKilometers: this.totalDistance, + estimatedTravelTime: this.totalTime, + subtotal: this.sf7.value.subtotal, + total: this.sf7.value.total, + insurancePackagedGoods: this.sf4.value.insurancePackagedGoods, + goodsValue: this.sf4.value.goodsValue + }; + const modalRef = this.modalService.create({ + nzTitle: '运输协议', + nzContent: TranAgreementComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { object: params, shipperName: this.shipperName, type: 'onecar' } + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.submit(submitType, params); + } + }); + } + // 提交 + submit(submitType?: string, params?: any): void { + if (submitType) { + if (submitType == 'assign') { + this.chooseFamifiar(params); + return; + } + } + if (this.PageStatus === '整车修改') { + this.requests(this.service.$api_set_WholeModify, params, 1); + } else if (this.PageStatus === '整车下一单') { + this.requests(this.service.$api_set_saveAnotherWholeOrder, params, 2); + } + } + // 补0函数 + addPreZero(num: any) { + if (num < 10) { + return '0' + num; + } else { + return num; + } + } + // 下单成功提示弹窗 + requests(url: any, params: any, change?: any) { + this.service.request(url, params).subscribe((res: any) => { + if (res) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'onecar', change: change } + }); + } + }); + } + // 打开地图 + openMap(type: string, index: number) { + console.log(type); + console.log(index); + const modalRef = this.modalService.create({ + nzTitle: '', + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + console.log(item); + if (item?.poi) { + const poi = item.poi; + const locList = poi.pois; + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.formattedAddress; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.addressComponent.province; + this.startInfo[index].city = poi.addressComponent.city; + this.startInfo[index].area = poi.addressComponent.district; + this.startInfo[index].address = poi.formattedAddress; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.formattedAddress; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.addressComponent.province; + this.endInfo[index].city = poi.addressComponent.city; + this.endInfo[index].area = poi.addressComponent.district; + this.endInfo[index].address = poi.formattedAddress; + break; + default: + break; + } + + if (this.startInfo[0]?.area && this.endInfo[0]?.area) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe((res: any) => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); // 计算保费金额 + }); + } + return true + } else { + this.service.msgSrv.warning('请重新手动选择地址!') + return false + } + } + }); + } + // 返回上一页 + goBack() { + window.history.go(-1); + } + // 初始化赋值信息 + initdata() { + this.service.request(`${this.service.$api_get_getCompleteVehicleDetail}`, { id: this.id }).subscribe(res => { + this.dataR(res); + }); + } + // 初始化赋值信息函数 + dataR(res: any) { + if (res?.shipperAppUserName) { + this.shipperName = res?.shipperAppUserName; + const List: any = []; + this.service.request(this.service.$api_enterpriceList, { enterpriseName: res?.shipperAppUserName }).subscribe(rs => { + rs?.forEach((element: any) => { + List.push({ label: element.enterpriseName, value: element.id }); + }); + this.sf1.getProperty('/shipperAppUserId')!.schema.enum = List; + this.sf1.getProperty('/shipperAppUserId')!.widget.reset(List); + if (res?.shipperAppUserId) { + this.sf1.setValue('/shipperAppUserId', res?.shipperAppUserId); + this.getRegionCode(res?.shipperAppUserId); + } + }); + } + if (res?.enterpriseProjectId) { + this.enterpriseProjectIds = res.enterpriseProjectId; + } + this.totalDistance = res?.estimatedKilometers; + this.totalTime = res?.estimatedTravelTime; + this.sf1data = { + resourceCode: res?.resourceCode || '', + enterpriseInfoName: res?.enterpriseInfoName, + enterpriseInfoId: res?.enterpriseInfoId, + dispatchPhone: res?.dispatchPhone, + dispatchName: res?.dispatchName, + externalResourceCode: res?.externalResourceCode + }; + if (this.PageStatus === '整车修改') { + this.sf1data.id = res?.id; + } + res?.unLoadingPlaceVOList.forEach((element: any) => { + if (element.type === 1 || element.type === '1') { + const controlId = this.startInfo.length; + if (this.PageStatus === '整车修改') { + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + } else { + this.startInfo.push({ + detailedAddress: element.detailedAddress, + appUserName: element.appUserName, + contractTelephone: element.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type + }); + } + + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required)); + } else if (element.type === 2 || element.type === '2') { + const controlId = this.endInfo.length; + if (this.PageStatus === '整车修改') { + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type, + id: element.id + }); + } else { + this.endInfo.push({ + detailedAddress: element?.detailedAddress, + appUserName: element?.appUserName, + contractTelephone: element?.contractTelephone, + latitude: element.latitude, + longitude: element.longitude, + province: element.province, + city: element.city, + area: element.area, + type: element.type + }); + } + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required)); + } + + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); //计算保费金额 + }); + } + }); + + this.sf3data = { + goodsTypeId: res?.goodsInfoVOList[0]?.goodsTypeId || '', + goodsTypeName: res?.goodsInfoVOList[0]?.goodsTypeName || '', + goodsNameId: res?.goodsInfoVOList[0]?.goodsNameId || '', + goodsName: res?.goodsInfoVOList[0]?.goodsName || '' + }; + if (this.sf3data.goodsTypeName === '其它') { + this.sf3data.goodsName1 = res?.goodsInfoVOList[0]?.goodsName || ''; + } + this.changeGoodsType(this.sf3data.goodsTypeId, { label: this.sf3data.goodsTypeName, value: this.sf3data.goodsTypeId }); + + if (res?.loadingTime) { + this.loadingTime = res?.loadingTime; + } + if (res?.unloadingTime) { + this.unloadingTime = res?.unloadingTime; + } + this.validateForm1.patchValue( + { + loadingTime: new Date(Date.parse(res?.loadingTime.replace(/-/g, '/'))), + unloadingTime: new Date(Date.parse(res?.unloadingTime.replace(/-/g, '/'))) + }, + { onlySelf: true } + ); + this.sf4data = { + weight: res?.goodsInfoVOList[0]?.weight || '', + volume: res?.goodsInfoVOList[0]?.volume || '', + number: res?.goodsInfoVOList[0]?.number || '', + carModel: res?.goodsInfoVOList[0]?.carModel?.split(',') || [], + carLength: res?.goodsInfoVOList[0]?.carLength?.split(',') || [], + goodsValue: res?.goodsValue || '', + insurancePackagedGoods: res?.insurancePackagedGoods || '' + }; + if (this.PageStatus === '整车修改') { + this.sf4data.id = res?.goodsInfoVOList[0]?.id; + } + this.totalFees = res?.shippingInformationVO?.totalFee || '0'; + this.sf5data = { + insuranceType: res?.insuranceType || '', + insurancePremium: res?.insurancePremium || '', + insuranceRate: res?.insuranceRate || '' + }; + this.sf6data = { + stateReceipt: res?.stateReceipt, + receiptType: res?.receiptType || '', + receiptUserName: res?.supplementaryInformationVO?.receiptUserName || '', + receiptAddressArea: res?.supplementaryInformationVO?.area || '', + receiptUserPhone: res?.supplementaryInformationVO?.phon || '', + receiptAddress: res?.supplementaryInformationVO.address || '', + remarks: res?.supplementaryInformationVO?.remarks || '' + }; + // this.sf7data = { + // prePay: res?.shippingInformationVO?.prePay, + // toPay: res?.shippingInformationVO?.toPay, + // // oilCardPay: 0, + // receiptPay: res?.shippingInformationVO?.receiptPay, + // total: res?.shippingInformationVO?.totalFee, + // appendFee: res?.shippingInformationVO?.appendFee, + // paymentDays: res?.paymentDays + // }; + this.sf7data = { + prePay: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'PRE')[0]?.price || null, + toPay: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'RECE')[0]?.price || null, + receiptPay: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'BACK')[0]?.price || null, + appendFee: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'ATT')[0]?.price || 0, + paymentDays: res?.paymentDays || '', + prePayId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'PRE')[0]?.id || '', + PREresourceId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'PRE')[0]?.resourceId || '', + RECEresourceId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'RECE')[0]?.resourceId || '', + BACKresourceId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'BACK')[0]?.resourceId || '', + toPayId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'RECE')[0]?.id || '', + receiptPayId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'BACK')[0]?.id || '', + appendFeeId: res?.expenseVOList?.filter((data: any) => data.expenseCode === 'ATT')[0]?.id || '' + }; + this.sf7.setValue('/prePay', this.sf7data.prePay); + this.sf7.setValue('/toPay', this.sf7data.toPay); + this.sf7.setValue('/receiptPay', this.sf7data.receiptPay); + this.payChange(); + } + + // 选择地址 + chooseAddress(index: number, type: string) { + const modalRef = this.modalService.create({ + nzTitle: '选择地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '1' }, + nzOnOk: item => { + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + switch (type) { + case 'start': + this.startInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '1' + }; + break; + case 'end': + this.endInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '2' + }; + break; + default: + break; + } + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); //计算保费金额 + }); + } + } + }); + } + // 不可选择的时间 + disabledDateStart = (current: Date): boolean => { + let d = new Date(); + let year = d.getFullYear(); + let month = d.getMonth(); + let date = d.getDate(); + let hours = d.getHours(); + let mydate = new Date(year, month, date + this.limitValues.maxDays, hours + 1); + return differenceInCalendarDays(new Date(), current) > 0 || new Date(current) > mydate; + }; + // 装卸货地址互换 + swapAddress() { + this.startInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + }); + this.endInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + }); + + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any, index: any) => { + element.type = '1'; + this.validateForm1.addControl(`loadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + this.endInfo.forEach((element: any, index: any) => { + element.type = '2'; + this.validateForm1.addControl(`unloadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); //计算保费金额 + }); + } + } + // 计算保价费金额 + getInsurersPrice(insuranceType = this.sf5.value.insuranceType) { + console.log(this.totalDistance); + if (insuranceType !== '3' && this.totalDistance > 0) { + const params = { + insuranceType, + goodsValue: this.sf4.value.goodsValue, + km: this.totalDistance + }; + this.service.request(this.service.$api_getWholeInsuranceInfo, params).subscribe(res => { + if (res) { + this.sf5.setValue('/insurancePremium', res.insurancePremium); + this.sf5.setValue('/insuranceRate', res.insuranceRate); + } else { + this.sf5.setValue('/insurancePremium', null); + this.sf5.setValue('/insuranceRate', null); + } + }); + } + } + // 运费信息价格变更 + priceChange(event: any, i: any) { + i.setValue(event); + if (event >= 99999) { + this.modalService.warning({ + nzTitle: '可输入的最大金额为99999元', + }); + } + this.payChange() + } + + checkGoodsName() { + const name = this.sf3.getValue('/goodsName1'); + if (!name || name.trim().length === 0) { + return; + } + this.service.request(this.service.$api_checkGoodsName, name).subscribe(res => { + if (res === false) { + const modalRef = this.modalService.error({ + nzTitle: '货物名称含有违禁词,请重新输入!', + }); + modalRef.afterClose.subscribe(result => { + // this.sf3.setValue('/goodsName1', null); + }); + } + }); + } +} diff --git a/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.html b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.html new file mode 100644 index 00000000..96ce805b --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.html @@ -0,0 +1,19 @@ + + +
    + +
    + + +
    +
    +
    diff --git a/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.less b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.less new file mode 100644 index 00000000..a33ce26d --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.less @@ -0,0 +1,88 @@ +@import '~@delon/theme/index'; +:host { + + ::ng-deep { + h3 { + margin-bottom: 20px; + font-size: 16px; + } + .submit { + width: 50%; + } + .login { + float: right; + line-height: @btn-height-lg; + } + } +} +::ng-deep { + .register-password-cdk { + .success, + .warning, + .error { + transition: color 0.3s; + } + .success { + color: @success-color; + } + .warning { + color: @warning-color; + } + .error { + color: @error-color; + } + .progress-pass > .progress { + .ant-progress-bg { + background-color: @warning-color; + } + } + } +} + +.form-box{ + display: block; + width: 368px; + margin: 0 auto; +} + +.content { + background-color: #f0f3f7; +} +.main { + max-width: 1200px; + margin: 0 auto; +} +.header { + background: #fff; +} +.layout { + min-height: 100vh; +} + +.logo { + display: flex; + margin: 16px 0; + line-height: 32px; + dt { + width: 95px; + height: 32px; + img { + vertical-align: top; + } + } + dd { + flex: 1; + margin-bottom: 0; + padding: 0 10px; + color: #1890ff; + font-weight: 500; + font-size: 24px; + } +} +.footer { + text-align: center; + background-color: #f0f3f7; +} + + + diff --git a/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.ts b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.ts new file mode 100644 index 00000000..e04e3858 --- /dev/null +++ b/src/app/routes/supply-management/components/onecar-publish/publish-success/publish-success.component.ts @@ -0,0 +1,44 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-14 20:39:34 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-18 17:28:26 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\onecar-publish\\publish-success\\publish-success.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NzMessageService } from 'ng-zorro-antd/message'; + +@Component({ + selector: 'publish-goods-publish-success', + templateUrl: './publish-success.component.html', + styleUrls: ['./publish-success.component.less'] +}) +export class PublishSuccessComponent { + type = 'onecar'; + title = '下单成功!'; + change: any = 0; + resourceObj: any = null; + constructor(private route: ActivatedRoute, private router: Router, public msg: NzMessageService) { + this.type = route.snapshot.queryParams.type || 'onecar'; + } + ngOnInit() { + console.log(this.change); + if (this.change == 1) { + this.title = '保存成功!'; + } else if (this.change == 2) { + this.title = '下单成功!'; + } + } + continue() { + window.location.reload(); + } + + view() { + this.router.navigate(['/supply-management/index'], { queryParams: { type: this.type } }); + } +} diff --git a/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.html b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.html new file mode 100644 index 00000000..449b496a --- /dev/null +++ b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.html @@ -0,0 +1,18 @@ + +
    + +
    +
    + +

    {{i?.shipperAppUserName}}

    + +
    卸货地 : {{address}}
    +
    装货地 : {{address}}
    +
    截止时间 : {{i?.deadlineTime}}
    +
    + +
    + +
    diff --git a/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.spec.ts b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.spec.ts new file mode 100644 index 00000000..fc268d02 --- /dev/null +++ b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 11:10:14 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-28 20:00:20 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\qrcode-page\\qrcode-page.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementQrcodePageComponent } from './qrcode-page.component'; + +describe('SupplyManagementQrcodePageComponent', () => { + let component: SupplyManagementQrcodePageComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementQrcodePageComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementQrcodePageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.ts b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.ts new file mode 100644 index 00000000..f1681253 --- /dev/null +++ b/src/app/routes/supply-management/components/qrcode-page/qrcode-page.component.ts @@ -0,0 +1,103 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 11:10:14 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-01 14:19:47 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\qrcode-page\\qrcode-page.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Component, OnInit, ViewChild } from '@angular/core'; +import { QRComponent } from '@delon/abc/qr'; +import { SFSchema, SFUISchema } from '@delon/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import html2canvas from 'html2canvas'; + +@Component({ + selector: 'app-supply-management-qrcode-page', + templateUrl: './qrcode-page.component.html' +}) +export class SupplyManagementQrcodePageComponent implements OnInit { + @ViewChild('qr') qr!: QRComponent; + record: any = {}; + i: any; + schema: SFSchema = {}; + qrCodeValue = ''; + ui: SFUISchema = { + '*': { + spanLabelFixed: 100, + grid: { span: 12 }, + }, + $no: { + widget: 'text' + }, + $href: { + widget: 'string', + }, + $description: { + widget: 'textarea', + grid: { span: 24 }, + }, + }; + + constructor( + private modal: NzModalRef, + ) { } + + ngOnInit(): void { + this.qrCodeValue = `rid:${this.i?.id}`; + } + + + /** + * 下载二维码 + * @param downloadName 文件名 + * @param contents 内容 + */ + downLoadQrcode(downloadName: any, contents: any): void { + let aLink = document.createElement('a'); + const content = contents; + let blob = this.base64ToBlob(content); //new Blob([content]); + let evt = document.createEvent("HTMLEvents"); + evt.initEvent("click", true, true);//initEvent 不加后两个参数在IE下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为 + aLink.download = downloadName; + aLink.href = URL.createObjectURL(blob); + // aLink.dispatchEvent(evt); + aLink.click(); + + + } + + //base64转blob + base64ToBlob(code: any) { + let parts = code.split(';base64,'); + let contentType = parts[0].split(':')[1]; + let raw = window.atob(parts[1]); + let rawLength = raw.length; + let uInt8Array = new Uint8Array(rawLength); + for (let i = 0; i < rawLength; ++i) { + uInt8Array[i] = raw.charCodeAt(i); + } + return new Blob([uInt8Array], { type: contentType }); + } + + close(): void { + this.modal.destroy(); + } + + /** + * 把页面装成canvas + */ + toCanvasPhoto() { + let aLink = document.createElement('a'); + html2canvas(document.getElementById('qr_page')!, { height: 340 }).then((canvas:any) => { + let url = canvas.toDataURL("image/jpeg"); + this.downLoadQrcode('二维码', url); + + }) + } + + +} diff --git a/src/app/routes/supply-management/components/release-publish/release-publish.component.html b/src/app/routes/supply-management/components/release-publish/release-publish.component.html new file mode 100644 index 00000000..efdb686f --- /dev/null +++ b/src/app/routes/supply-management/components/release-publish/release-publish.component.html @@ -0,0 +1,265 @@ + + + + + + +
    货源单设置
    + + {{ i.value }} + +
    + + +
    装卸货信息预计公里数:{{ totalDistance }}km,预计行程耗时:{{ totalTime }}小时
    + +
    +
    +
    +
    + + 装货地 + +
    + + + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + 卸货地 + +
    + + + + + +
    +
    +
    + + 联系人 +
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + 装货时间 + + + + +
    +
    +
    + + 卸货时间 + + + + +
    +
    + +
    +
    + + +
    货物信息
    +
    +
    + + + + + + 国家法规及行政命令禁限运货物不能托运 + 《禁运物品说明》 + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    + + +
    服务信息
    +
    +
    + + +  货源曝光率 +10   +  车源匹配率 +10 + + +  货源曝光率 +20   +  车源匹配率 +20 + + + + + + + + ①香港、澳门、台湾、西藏、新疆不予承保,②单次运输保额仅限200万元以内,③保险详细内容及注意事项请见《保险告知函》 + +
    +
    +
    + +
    补充信息
    +
    +
    + + +
    +
    +
    + + +
    运费信息
    +
    +
    + + + + + + + + + + + + + + {{ i.value | currency }} + {{ i.value | currency }}(费率:{{ currentRate | number: + '0.2-4' }}%) + {{ i.value | currency }} + +
    +
    + +
    +
    +  天内支付运费 +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +
    diff --git a/src/app/routes/supply-management/components/release-publish/release-publish.component.less b/src/app/routes/supply-management/components/release-publish/release-publish.component.less new file mode 100644 index 00000000..b34cbcc9 --- /dev/null +++ b/src/app/routes/supply-management/components/release-publish/release-publish.component.less @@ -0,0 +1,80 @@ +:host { + ::ng-deep { + nz-input-number { + width: 100%; + } + + nz-date-picker { + width: 94.3%; + } + + .sf3 { + .goods_Tips_item { + .goods_tips { + width: calc(50% - 45px); + + .ant-alert { + padding: 0 0 0 2px; + } + + } + + nz-form-item { + margin-bottom: 8px; + } + + // .ant-form-item-control-input-content { + // display: flex; + // justify-content: end; + // } + } + } + } + + i { + cursor: pointer; + } +} + +.tip-font { + margin-left: 16px; + font-weight: 500; + font-size: 12px; +} + +.card-title { + margin-bottom: 24px; + font-weight: bold; + font-size: 16px; +} + +.align-center { + display: flex; + align-items: center; + justify-content: center; +} + +.swap-icon { + padding: 24px; + color: #7d7d7d; + font-size: 30px; + + :hover { + color: #52acff; + } +} + +#container { + width: 300px; + height: 180px; +} + +input[type='number'] { + -moz-appearance: textfield; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + margin: 0; + -webkit-appearance: none; +} diff --git a/src/app/routes/supply-management/components/release-publish/release-publish.component.ts b/src/app/routes/supply-management/components/release-publish/release-publish.component.ts new file mode 100644 index 00000000..d82b9567 --- /dev/null +++ b/src/app/routes/supply-management/components/release-publish/release-publish.component.ts @@ -0,0 +1,1267 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { cacheConf } from '@conf/cache.conf'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import { + SFCheckboxWidgetSchema, + SFComponent, + SFNumberWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema +} from '@delon/form'; +import { SettingsService, _HttpClient } from '@delon/theme'; +import { EACacheService, ShipperBaseService } from '@shared'; +import format from 'date-fns/format'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AmapPoiPickerComponent, AmapService } from 'src/app/shared/components/amap'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementVehicleAssignedCarComponent } from '../assigned-car/assigned-car.component'; +import { PublishAddressListComponent } from '../onecar-publish/address-list/address-list.component'; +import { PublishSuccessComponent } from '../onecar-publish/publish-success/publish-success.component'; +import { TranAgreementComponent } from '../tran-agreement/tran-agreement.component'; + +@Component({ + selector: 'app-publish-goods-onecar-publish', + templateUrl: './release-publish.component.html', + styleUrls: ['./release-publish.component.less'] +}) +export class SupplyManagementReleasePublishComponent implements OnInit { + // 环境信息 appId、tenantId + envInfo = this.eaCacheSrv.get(cacheConf.env); + validateForm1: FormGroup; + sf1data: any; // 货源单设置回显 + sf3data: any; // 货源单设置回显 + sf4data: any; // 货源单设置回显 + sf5data: any; // 货源单设置回显 + sf55data: any; // 货源单设置回显 + sf6data: any; // 货源单设置回显 + sf7data: any; // 货源单设置回显 + id = ''; + envCache: any; + type = 'add'; + // // 单位 + startInfo: any[] = []; + endInfo: any[] = []; + totalDistance = 0.0; //总里程 + totalTime = 0.0; //路程总时间 + currentRate = 0; //实时计算的费率 + shipperName = ''; + constructor( + private http: _HttpClient, + fb: FormBuilder, + private modalService: NzModalService, + private settingSrv: SettingsService, + public service: SupplyManagementService, + private router: Router, + private route: ActivatedRoute, + private eaCacheSrv: EACacheService, + private amapService: AmapService, + public shipperSrv: ShipperBaseService + ) { + this.validateForm1 = fb.group({ + loadAddress0: [null, [Validators.required]], + loadName0: [null, [Validators.required]], + loadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]], + unloadAddress0: [null, [Validators.required]], + unloadName0: [null, [Validators.required]], + unloadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]], + loadingTime: [null, []], + unloadingTime: [null, []] + }); + } + + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + schema1: SFSchema = {}; + ui1!: SFUISchema; + + @ViewChild('sf3', { static: false }) sf3!: SFComponent; + schema3: SFSchema = {}; + ui3!: SFUISchema; + + @ViewChild('sf4', { static: false }) sf4!: SFComponent; + schema4: SFSchema = {}; + ui4!: SFUISchema; + + @ViewChild('sf5', { static: false }) sf5!: SFComponent; + schema5: SFSchema = {}; + ui5!: SFUISchema; + + @ViewChild('sf55', { static: false }) sf55!: SFComponent; + schema55: SFSchema = {}; + ui55!: SFUISchema; + + @ViewChild('sf6', { static: false }) sf6!: SFComponent; + schema6: SFSchema = {}; + ui6!: SFUISchema; + + @ViewChild('sf7', { static: false }) sf7!: SFComponent; + schema7: SFSchema = {}; + ui7!: SFUISchema; + limitValues = { + maxWeight: 99999, + maxVolume: 99999, + maxPiece: 99999, + maxDays: 999, + intervalDays: 999, + maxTimes: 5 + }; + + formatterRmb = (value: number): string => { + if (value === null || value === undefined) { + return ''; + } else { + let value2 = Number(value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + return `¥${value2}`; + } + }; + parserRmb = (value: string): string => value.replace('¥', '').replace(',', ''); + // 页面初始化 + ngOnInit(): void { + this.initSF1(); + this.initSF3(); + this.initSF4(); + this.initSF5(); + this.initSF6(); + this.initSF7(); + this.addStartInfo(); + this.addEndInfo(); + this.getLimitvalue(); + } + initSF1() { + this.schema1 = { + properties: { + shipperAppUserId: { + title: '货主', + type: 'string', + maxLength: 30, + ui: { + widget: 'select', + allowClear: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + onSearch: (q: any) => { + console.log(q === ' '); + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map(res => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any, qs: any) => { + let str = q?.replace(/^\s+|\s+$/g, ''); + if (str) { + this.getRegionCode(str); + this.shipperName = qs?.label; + this.payChange(); + } + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '项目', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + } as SFSelectWidgetSchema + }, + enterpriseInfoNamer: { + type: 'string', + title: '', + ui: { hidden: true } + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperSrv.getNetworkFreightForwarder(), + change: (q: any, qs: any) => { + console.log(qs.label); + this.sf1.setValue('/enterpriseInfoNamer', qs.label); + this.payChange() + } + } + }, + externalResourceCode: { + type: 'string', + title: '外部货源号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + }, + dispatchName: { + type: 'string', + title: '调度员姓名', + maxLength: 30, + ui: { + optionalHelp: '选若未填写,司机直接联系您', + placeholder: '请输入' + } + }, + dispatchPhone: { + type: 'string', + title: '调度员手机号', + maxLength: 30, + ui: { + placeholder: '请输入' + } + } + }, + required: ['shipperAppUserId', 'enterpriseProjectId', 'enterpriseInfoName'] + }; + this.ui1 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + }, + $enterpriseInfoName: { + grid: { span: 12 } + }, + $shipperAppUserId: { + grid: { span: 12 } + }, + $enterpriseProjectId: { + grid: { span: 12 } + }, + $dispatchId: { + grid: { span: 12 } + } + }; + } + initSF3() { + this.schema3 = { + properties: { + goodsTips: { + type: 'string', + title: '', + ui: { + widget: 'custom', + class: 'goods_Tips_item', + // visibleIf: { + // goodsTypeName: (value: any) => value && value === '其它' + // } + } + }, + goodsTypeId: { + type: 'string', + title: '货物名称', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请选择货物名称' }, + asyncData: () => + this.shipperSrv.loadConfigByKey('goods.name.config.type').pipe( + map((data: any) => { + return data[0].children?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ), + change: (value, data: any) => { + this.changeGoodsType(value, data); + this.sf3.setValue('/goodsTypeName', data.label); + } + } as SFSelectWidgetSchema + }, + goodsTypeName: { + type: 'string', + title: '', + ui: { + hidden: true + } + }, + goodsNameId: { + type: 'string', + title: '', + ui: { + widget: 'select', + placeholder: '请选择', + errors: { required: '请填写货物名称' }, + change: (value: any, data: any) => { + this.sf3.setValue('/goodsName', data.label); + }, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName: { + type: 'string', + title: '', + ui: { + hidden: true, + visibleIf: { + goodsTypeName: (value: any) => value && value !== '其它' + } + } + }, + goodsName1: { + type: 'string', + title: '', + maxLength: 20, + ui: { + errors: { required: '请填写货物名称' }, + visibleIf: { + goodsTypeName: (value: any) => value && value === '其它' + }, + blur: (value: any) => { + this.checkGoodsName(); + } + } + } + }, + required: ['goodsTypeId', 'goodsName', 'goodsNameId', 'goodsName1'] + }; + this.ui3 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + }, + $goodsTips: { + grid: { span: 24 } + } + }; + } + initSF4() { + this.schema4 = { + properties: { + weight: { + type: 'string', + title: '货物数量', + ui: { + widget: 'custom', + placeholder: '请输入', + errors: { required: '必填项' }, + validator: val => this.customValidator(val) + } + }, + volume: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + number: { + type: 'string', + title: '', + ui: { + widget: 'custom', + placeholder: '请输入' + } + }, + carModel: { + type: 'string', + title: '车型/车长', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车型', + errors: { required: '请选择车型' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:model' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carModel', ['999']); + } + } + } + }, + carLength: { + type: 'string', + title: '', + ui: { + widget: 'select', + mode: 'multiple', + maxMultipleCount: 3, + placeholder: '请选择车长', + errors: { required: '请选择车长' }, + asyncData: () => this.service.getDictOptions({ dictKey: 'car:length' }), + change: (tag: any, org: any) => { + if (tag.includes('999')) { + this.sf4.setValue('/carLength', ['999']); + } + } + } + }, + hidenField: { + type: 'string', + title: '', + default: ' ', + ui: { + widget: 'text' + } + }, + insurancePackagedGoods: { + type: 'string', + title: '货物包装', + ui: { + widget: 'dict-select', + params: { dictKey: 'insure:packaged:goods' }, + containsAllLabel: false, + validator: val => { + if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { + return [{ keyword: 'required', message: '必填项' }]; + } else { + return []; + } + } + } as SFSelectWidgetSchema + }, + goodsValue: { + type: 'string', + title: '货物价值', + ui: { + widget: 'custom', + validator: val => { + if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { + return [{ keyword: 'required', message: '必填项' }]; + } else { + return []; + } + } + } + } + }, + required: ['weight', 'carModel', 'carLength'] + }; + this.ui4 = { + '*': { + spanLabelFixed: 115, + grid: { span: 8 } + } + }; + } + + initSF5() { + this.schema5 = { + properties: { + insuranceType: { + type: 'string', + title: '服务包', + ui: { + widget: 'select', + asyncData: () => { + return this.service.request(this.service.$api_getDictValue, { dictKey: 'bill:insurance:type' }).pipe( + map((res: any) => { + return [...res]; + }) + ); + }, + change: (tag: any, org: any) => { + if (tag === '3') { + this.sf5.setValue('/insurancePremium', null); + this.sf5.setValue('/insuranceRate', null); + } else { + this.getInsurersPrice(tag); + } + } + }, + default: '3' + }, + type1: { + type: 'string', + title: '', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '0' } + } + }, + type2: { + type: 'string', + title: '', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '1' } + } + }, + insurancePremium: { + type: 'string', + title: '服务包费用', + readOnly: true, + ui: { + visibleIf: { insuranceType: (value: string) => value !== '3' } + } + }, + insuranceRate: { + type: 'string', + title: '保险费率', + ui: { + hidden: true + } + }, + freeInsurance1: { + type: 'string', + title: '预投基本险', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '0' } + } + }, + freeInsurance2: { + type: 'string', + title: '预投综合险', + ui: { + widget: 'custom', + visibleIf: { insuranceType: (value: string) => value === '1' } + } + } + }, + required: ['insurancePremium'] + }; + this.ui5 = { + '*': { + spanLabelFixed: 115, + grid: { span: 12 } + }, + $type1: { + grid: { span: 24 } + }, + $type2: { + grid: { span: 24 } + }, + $freeInsurance1: { + grid: { span: 24 } + }, + $freeInsurance2: { + grid: { span: 24 } + } + }; + } + + initSF6() { + this.schema6 = { + properties: { + stateReceipt: { + type: 'string', + title: '是否回单', + enum: [ + { label: '需要', value: true }, + { label: '不需要', value: false } + ], + ui: { + widget: 'select', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + receiptType: { + type: 'string', + title: '回单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'receipt:type' }, + containsAllLabel: false, + placeholder: '请选择', + errors: { required: '请选择' }, + visibleIf: { + stateReceipt: value => value === true + } + } + }, + receiptUserName: { + type: 'string', + title: '联系人', + maxLength: 15, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptUserPhone: { + type: 'string', + title: '联系电话', + format: 'mobile', + maxLength: 11, + ui: { + errors: { + format: '请输入正确联系电话格式' + }, + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddressArea: { + type: 'string', + title: '所在地区', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + receiptAddress: { + type: 'string', + title: '详细地址', + maxLength: 30, + ui: { + visibleIf: { + receiptType: value => value === '2' + } + } + }, + remarks: { + type: 'string', + title: '备注', + maxLength: 200, + ui: { + widget: 'textarea', + placeholder: '请输入', + autosize: { minRows: 3, maxRows: 3 } + } as SFTextareaWidgetSchema + } + }, + required: ['stateReceipt', 'receiptType', 'receiptUserName', 'receiptUserPhone', 'receiptAddressArea', 'receiptAddress'] + }; + this.ui6 = { + '*': { + spanLabelFixed: 90, + grid: { span: 24 } + } + }; + } + + initSF7() { + this.schema7 = { + properties: { + prePay: { + type: 'number', + title: '预付', + ui: { widget: 'custom' } + }, + toPay: { + type: 'number', + title: '到付', + ui: { widget: 'custom' } + }, + receiptPay: { + type: 'number', + title: '回单付', + ui: { widget: 'custom' } + }, + subtotal: { type: 'number', title: '小计', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + appendFee: { type: 'number', title: '附加费', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + total: { type: 'number', title: '总费用', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, + paymentDays: { + type: 'string', + title: '到货后', + ui: { + widget: 'custom', + errors: { required: '请输入付款承诺天数' } + } + } + }, + required: ['paymentDays'] + }; + this.ui7 = { + '*': { + spanLabelFixed: 115, + grid: { span: 24 } + } + }; + } + getLimitvalue() { + // 货物核载信息最大值 + // 货物运输费(小计)最大值 + const getlimitvaluesParms = [ + this.service.limitKeys?.weight, + this.service.limitKeys?.volume, + this.service.limitKeys?.piece, + this.service.limitKeys?.maxDays, + this.service.limitKeys?.intervalDays, + this.service.limitKeys?.maxTimes + ]; + this.service.request(this.service.$api_findItemValueByItemKeys, getlimitvaluesParms).subscribe(res => { + const maxWeight = res.filter((item: any) => item.itemKey === this.service.limitKeys?.weight)[0].itemValue; + const maxVolume = res.filter((item: any) => item.itemKey === this.service.limitKeys?.volume)[0].itemValue; + const maxPiece = res.filter((item: any) => item.itemKey === this.service.limitKeys?.piece)[0].itemValue; + const maxDays = res.filter((item: any) => item.itemKey === this.service.limitKeys?.maxDays)[0].itemValue; + const intervalDays = res.filter((item: any) => item.itemKey === this.service?.limitKeys?.intervalDays)[0].itemValue; + const maxTimes = res.filter((item: any) => item.itemKey === this.service.limitKeys.maxTimes)[0]?.itemValue; + this.limitValues = { + maxWeight: Number(maxWeight), + maxVolume: Number(maxVolume), + maxPiece: Number(maxPiece), + maxDays: Number(maxDays), + intervalDays: Number(intervalDays), + maxTimes: Number(maxTimes) + }; + }); + } + // 不可选择的时间 + disabledDateStart = (current: Date): boolean => { + return differenceInCalendarDays(new Date(), current) > 0; + }; + + /** + * 自定义校验数据 + * @param val + */ + customValidator(val: number) { + if (this.isEmpty(val)) { + return [{ keyword: 'required', message: '不能为空' }]; + } else { + if (val <= 0) { + return [{ keyword: 'required', message: '数值需大于0' }]; + } + return []; + } + } + + isEmpty(val: any) { + return val === undefined || val === null || val.toString().trim() === ''; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf1.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf1.getProperty('/enterpriseProjectId')!.widget.reset(res); + }); + } + payChange() { + const prePay = this.sf7.value.prePay || 0; + const toPay = this.sf7.value.toPay || 0; + const receiptPay = this.sf7.value.receiptPay || 0; + const oilCardPay = 0; + const subtotal = prePay + toPay + receiptPay; + const params = { + shipperId: this?.sf1.value?.shipperAppUserId, + enterpriseInfoId: this?.sf1.value?.enterpriseInfoName || '', + totalFreight: subtotal, + fuelCardAmount: oilCardPay, + resourcetype: '1' + }; + this.service.request(this.service.$api_getCalculatedSurcharge, params).subscribe(res => { + if (res) { + this.sf7.setValue('/appendFee', res.surcharge); + this.sf7.setValue('/subtotal', subtotal); + this.sf7.setValue('/total', subtotal + res.surcharge); + this.service + .request( + this.service.$api_getAdditionalRate + + `?shipperId=${this?.sf1.value?.shipperAppUserId || ''}&enterpriseInfoId=${this?.sf1.value?.enterpriseInfoName || '' + }&resourcetype='1'` + ) + .subscribe(res => { + if (res) { + this.currentRate = res.rate * 100; + } + }); + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + // 添加 删除发货卸货地址 + addStartInfo() { + console.log(this.startInfo.length); + console.log(this.limitValues.maxTimes); + + if (this.startInfo.length < this.limitValues.maxTimes) { + const controlId = this.startInfo.length; + this.startInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '1' + }); + this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + } + } + // 添加 删除发货卸货地址 + subStartInfo(event: any, index: number) { + this.startInfo.splice(index, 1); + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + } + // 添加 删除发货卸货地址 + addEndInfo() { + if (this.endInfo.length < this.limitValues.maxTimes) { + const controlId = this.endInfo.length; + this.endInfo.push({ + detailedAddress: '', + appUserName: '', + contractTelephone: '', + latitude: '', + longitude: '', + province: '', + city: '', + area: '', + type: '2' + }); + this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl( + `unloadPhone${controlId}`, + new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')]) + ); + } + } + // 添加 删除发货卸货地址 + subEndInfo(event: any, index: number) { + this.endInfo.splice(index, 1); + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + } + //指派熟车 + chooseFamifiar(item: any) { + console.log('999'); + const modalRef = this.modalService.create({ + nzTitle: '指派熟车', + nzContent: SupplyManagementVehicleAssignedCarComponent, + nzWidth: 1200, + nzComponentParams: { + status: 'new', + url: this.service.$api_save_consignWholeAssign, + params: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.openFinishPage(result); + } + }); + } + // 提交前确认,委托运输协议弹窗 + submitConfirm(submitType?: any) { + Object.keys(this.validateForm1.controls).forEach(key => { + this.validateForm1.controls[key].markAsDirty(); + this.validateForm1.controls[key].updateValueAndValidity(); + }); + this.sf1.validator({ emitError: true }); + this.sf3.validator({ emitError: true }); + this.sf4.validator({ emitError: true }); + this.sf5.validator({ emitError: true }); + this.sf6.validator({ emitError: true }); + this.sf7.validator({ emitError: true }); + console.log(!this.sf1.valid); + console.log(this.sf1.value); + if ( + this.validateForm1.invalid || + !this.sf3.valid || + !this.sf1.valid || + !this.sf4.valid || + !this.sf5.valid || + !this.sf6.valid || + !this.sf7.valid + ) { + this.service.msgSrv.warning('请完善必填项!'); + return; + } + if (this.totalDistance <= 0) { + this.service.msgSrv.warning('起终点相同,请重新选择装卸货地址!'); + return; + } + if (this.validateForm1.value.loadingTime < new Date()) { + this.service.msgSrv.warning('装货时间必须大于当前时间!'); + return; + } + if (this.validateForm1.value.loadingTime > this.validateForm1.value.unloadingTime) { + this.service.msgSrv.warning('装货时间不能大于卸货时间!'); + return; + } + if (this.sf7.value.total <= 0) { + this.service.msgSrv.warning('总费用不能为0!'); + return; + } + const num = (Number(this.validateForm1.value.unloadingTime) - Number(this.validateForm1.value.loadingTime)) / (24 * 60 * 60 * 1000); + if (num > this.limitValues.maxDays) { + this.service.msgSrv.error(`当前计划装卸货时间间隔已超出限定值【${this.limitValues.maxDays}天】`); + return; + } + if ( + this.sf4.value?.weight > this.limitValues?.maxWeight || + this.sf4.value?.volume > this.limitValues?.maxVolume || + this.sf4.value?.number > this.limitValues?.maxPiece + ) { + this.service.msgSrv.error( + `当前货物核载信息已超出限定值【${this.limitValues?.maxWeight}吨、${this.limitValues?.maxVolume}方、${this.limitValues?.maxPiece}件】` + ); + return; + } + + const getFreightParms = { carLengthKeys: this.sf4.value.carLength, km: this.totalDistance }; + this.service.request(this.service.$api_getFreight, getFreightParms).subscribe(res => { + if (this.sf7.value?.subtotal > res?.maxPrice) { + this.service.msgSrv.error(`运费过高,请调整录入`); + return; + } else if (this.sf7.value?.subtotal > res?.ewPrice) { + this.modalService.confirm({ + nzTitle: '', + nzContent: `您的录入的运费过高,可能会影响支付,请仔细确认`, + nzOkText: '继续', + nzCancelText: '取消', + nzOnOk: () => { + this.agreementConfirm(submitType); + } + }); + } else { + this.agreementConfirm(submitType); + } + }); + } + // 提交前协议弹窗 + agreementConfirm(submitType?: string) { + //装卸货信息 + const LoadingList = this.startInfo.concat(this.endInfo); + + // 货物信息 + const sf3Values = { ...this.sf3.value }; + if (sf3Values.goodsTypeName === '其它') { + sf3Values.goodsName = sf3Values.goodsName1; + delete sf3Values.goodsName1; + } + if (this.sf4.value.carModel.includes('999')) { + this.sf4.value.carModel = ['999']; + } + if (this.sf4.value.carLength.includes('999')) { + this.sf4.value.carLength = ['999']; + } + const goodsInfoVOList = [ + { + ...sf3Values, + ...this.sf4.value, + carModel: this.sf4.value.carModel.join(','), + carLength: this.sf4.value.carLength.join(',') + } + ]; + // 运费信息 + const expenseList = [ + { expenseCode: 'PRE', expenseName: '预付', price: this.sf7.value.prePay || 0, id: this.sf7data?.prePayId || '' }, + { expenseCode: 'RECE', expenseName: '到付', price: this.sf7.value.toPay || 0, id: this.sf7data?.toPayId || '' }, + { expenseCode: 'BACK', expenseName: '回单付', price: this.sf7.value.receiptPay || 0, id: this.sf7data?.receiptPayId || '' } + ]; + const params = { + id: '', + ...this.sf1.value, + unLoadingPlaceDTOList: LoadingList, + unloadingTime: format(this.validateForm1.value.unloadingTime, 'yyyy-MM-dd HH:mm:ss'), + loadingTime: format(this.validateForm1.value.loadingTime, 'yyyy-MM-dd HH:mm:ss'), + goodsInfoDTOList: goodsInfoVOList, + ...this.sf5.value, + ...this.sf6.value, + expenseDTOList: expenseList, + paymentDays: this.sf7.value.paymentDays, + subtotal: this.sf7.value.subtotal, + total: this.sf7.value.total, + estimatedKilometers: this.totalDistance, + estimatedTravelTime: this.totalTime, + insurancePackagedGoods: this.sf4.value.insurancePackagedGoods, + goodsValue: this.sf4.value.goodsValue + }; + console.log(params); + const modalRef = this.modalService.create({ + nzTitle: '运输协议', + nzContent: TranAgreementComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { object: params, shipperName: this.shipperName, type: 'onecar' } + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.submit(submitType, params); + } + }); + } + // 提交 + submit(submitType?: string, params?: any): void { + let reqUrl = this.service.$api_consignWhole; + if (submitType) { + if (submitType == 'assign') { + this.chooseFamifiar(params); + return; + } + } + + this.service.request(reqUrl, params).subscribe((res: any) => { + if (res) { + this.openFinishPage(); + } + }); + } + // 打开地图 + openMap(type: string, index: number) { + const modalRef = this.modalService.create({ + nzTitle: '', + nzContent: AmapPoiPickerComponent, + nzWidth: 900, + nzOnOk: item => { + if (item?.poi) { + const poi = item.poi; + const locList = poi.pois; + switch (type) { + case 'start': + this.startInfo[index].detailedAddress = poi.formattedAddress; + this.startInfo[index].longitude = locList[0]; + this.startInfo[index].latitude = locList[1]; + this.startInfo[index].province = poi.addressComponent.province; + this.startInfo[index].city = poi.addressComponent.city; + this.startInfo[index].area = poi.addressComponent.district; + break; + case 'end': + this.endInfo[index].detailedAddress = poi.formattedAddress; + this.endInfo[index].longitude = locList[0]; + this.endInfo[index].latitude = locList[1]; + this.endInfo[index].province = poi.addressComponent.province; + this.endInfo[index].city = poi.addressComponent.city; + this.endInfo[index].area = poi.addressComponent.district; + break; + default: + break; + } + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); // 计算保费金额 + }); + } + return true; + } else { + this.service.msgSrv.warning('请重新手动选择地址!'); + return false; + } + } + }); + } + // 选择收回单地址 + backBillChange() { + const modalRef = this.modalService.create({ + nzTitle: '选择收回单地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '2' }, + nzOnOk: item => { + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + this.sf6.setValue('/receiptAddressId', data.id); + this.sf6.setValue('/receiptUserName', data.contactName); + this.sf6.setValue('/phon', data.contactTelephone); + this.sf6.setValue('/area', `${data.province}-${data.city}-${data.area}`); + this.sf6.setValue('/address', data.detailedAddress); + } + }); + } + // 选择地址 + chooseAddress(index: number, type: string) { + const modalRef = this.modalService.create({ + nzTitle: '选择地址', + nzContent: PublishAddressListComponent, + nzWidth: 900, + nzComponentParams: { spuStatus: '1' }, + nzOnOk: item => { + console.log(item); + console.log(type); + const data = item.seleteData; + if (JSON.stringify(data) === '{}') return; + switch (type) { + case 'start': + this.startInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '1' + }; + break; + case 'end': + this.endInfo[index] = { + detailedAddress: data.detailedAddress, + appUserName: data.contactName, + contractTelephone: data.contactTelephone, + latitude: data.contactTelephone, + longitude: data.latitude, + province: data.province, + city: data.city, + area: data.area, + type: '2' + }; + break; + default: + break; + } + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); //计算保费金额 + }); + } + } + }); + } + // 打开下单完成页面 + openFinishPage(resourceObj: any = null) { + this.modalService.create({ + nzTitle: '', + nzContent: PublishSuccessComponent, + nzWidth: 900, + nzFooter: null, + nzComponentParams: { type: 'onecar', resourceObj } + }); + } + changeGoodsType(value: string, data: any) { + if (data.label === '其它') return; + const params = { + pageIndex: 1, + pageSize: 100, + configId: value + }; + this.service + .request(this.service.$api_get_config_item_page, params) + .pipe( + map(data => { + return data.records?.map((m: any) => { + return { label: m.name, value: m.id }; + }); + }) + ) + .subscribe(res => { + if (res) { + this.sf3.getProperty('/goodsNameId')!.schema.enum = res; + this.sf3.getProperty('/goodsNameId')!.widget.reset(res); + if (this.sf3data?.goodsNameId) { + this.sf3.setValue('/goodsNameId', this.sf3data?.goodsNameId); + } + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + // 返回上一页 + goBack() { + window.history.go(-1); + } + // 装卸货地址互换 + swapAddress() { + this.startInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`loadAddress${index}`); + this.validateForm1.removeControl(`loadName${index}`); + this.validateForm1.removeControl(`loadPhone${index}`); + }); + this.endInfo.forEach((element: any, index: any) => { + this.validateForm1.removeControl(`unloadAddress${index}`); + this.validateForm1.removeControl(`unloadName${index}`); + this.validateForm1.removeControl(`unloadPhone${index}`); + }); + + let item = this.startInfo; + this.startInfo = this.endInfo; + this.endInfo = item; + + this.startInfo.forEach((element: any, index: any) => { + element.type = '1'; + this.validateForm1.addControl(`loadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`loadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + this.endInfo.forEach((element: any, index: any) => { + element.type = '2'; + this.validateForm1.addControl(`unloadAddress${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadName${index}`, new FormControl(null, Validators.required)); + this.validateForm1.addControl(`unloadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')])); + }); + // 计算里程,时间 + if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { + this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { + this.totalDistance = res.distance; + this.totalTime = res.time; + this.getInsurersPrice(); //计算保费金额 + }); + } + } + // 计算保价费金额 + getInsurersPrice(insuranceType = this.sf5.value?.insuranceType) { + console.log(insuranceType); + console.log(this.totalDistance); + if (insuranceType !== '3' && this.totalDistance > 0) { + const params = { + insuranceType, + goodsValue: this.sf4.value.goodsValue, + km: this.totalDistance + }; + this.service.request(this.service.$api_getWholeInsuranceInfo, params).subscribe(res => { + if (res) { + this.sf5.setValue('/insurancePremium', res.insurancePremium); + this.sf5.setValue('/insuranceRate', res.insuranceRate); + } else { + this.sf5.setValue('/insurancePremium', null); + this.sf5.setValue('/insuranceRate', null); + } + }); + } + } + // 运费信息价格变更 + priceChange(event: any, i: any) { + i.setValue(event); + if (event >= 99999) { + this.modalService.warning({ + nzTitle: '可输入的最大金额为99999元' + }); + } + this.payChange(); + } + + checkGoodsName() { + const name = this.sf3.getValue('/goodsName1'); + if (!name || name.trim().length === 0) { + return; + } + this.service.request(this.service.$api_checkGoodsName, name).subscribe(res => { + if (res === false) { + const modalRef = this.modalService.error({ + nzTitle: '货物名称含有违禁词,请重新输入!', + }); + modalRef.afterClose.subscribe(result => { + // this.sf3.setValue('/goodsName1', null); + }); + } + }); + } +} diff --git a/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.html b/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.html new file mode 100644 index 00000000..25ed7a44 --- /dev/null +++ b/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.html @@ -0,0 +1,16 @@ + + +
    +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.less b/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.ts b/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.ts new file mode 100644 index 00000000..d49c407e --- /dev/null +++ b/src/app/routes/supply-management/components/tran-agreement/tran-agreement.component.ts @@ -0,0 +1,163 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-02-24 20:19:51 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-15 15:18:29 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\tran-agreement\\tran-agreement.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-06 15:01:40 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-28 20:55:07 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\components\\tran-agreement\\tran-agreement.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component } from '@angular/core'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; + +@Component({ + selector: 'publish-goods-tran-agreement', + templateUrl: './tran-agreement.component.html', + styleUrls: ['./tran-agreement.component.less'] +}) +export class TranAgreementComponent { + enterpriseInfo: any; // 网络货运人 + type: any; + object: any; + agreement: any; + envCache: any; + shipperName: any; + constructor(private modal: NzModalRef, public service: SupplyManagementService) {} + + ngOnInit() { + console.log(this.object); + // 获取托运人承运人信息 + this.service.request(this.service.$api_getContractAtr, { id: this.object?.shipperAppUserId }).subscribe(res => { + if (res) { + this.enterpriseInfo = res; + this.getContent(); + } + }); + } + + getContent() { + let params: any; + if (this.type === 'onecar') { + params = { + contractType: '1', + resourceType: '1', + signingObject: '1', + templateType: 'MX', + parametersDTO: { + contractCode: '', + shipperLegalPersonName: this.enterpriseInfo.legalPersonName || '', //托运法定代表人 + carrierLegalPersonName: this.enterpriseInfo.netLegalPersonName || '', //承运法定代表人 + shipperName: this?.shipperName || '', //托运人 + carrierName: this.object?.enterpriseInfoNamer || this.object?.enterpriseInfoName || '', //承运人 + consignorInfo: `${this.object?.unLoadingPlaceDTOList[0]?.appUserName || ''} ${ + this.object?.unLoadingPlaceDTOList[0]?.contractTelephone || '' + }`, // 发货信息 + consignorAddress: this.object?.unLoadingPlaceDTOList[0].detailedAddress || '', // 发货地址 + consignorDate: this.object?.loadingTime || '', // 发货时间 + consigneeInfo: `${this.object?.unLoadingPlaceDTOList[this.object?.unLoadingPlaceDTOList.length - 1].appUserName} ${ + this.object?.unLoadingPlaceDTOList[this.object?.unLoadingPlaceDTOList.length - 1].contractTelephone + }`, // 收货信息 + consigneeDate: this.object?.unloadingTime || '', // 收货时间 + consigneeAddress: this.object?.unLoadingPlaceDTOList[this.object?.unLoadingPlaceDTOList.length - 1].detailedAddress || '', // 收货地址 + goodsName: this.object?.goodsInfoDTOList[0].goodsName || '', // 货物名称 + shippingType: '整车运输', + consignmentVolume: `${this.object?.goodsInfoDTOList[0]?.weight || '-'}吨/${this.object?.goodsInfoDTOList[0]?.volume || '-'}方/${ + this.object?.goodsInfoDTOList[0]?.number || '-' + }件`, //托运量 + transporterInfo: '', //运输方信息 + freightAmount: this.object?.total || '', // 订单运费金额(元) + pre: this.object?.expenseDTOList?.filter((item: any) => item.expenseCode === 'PRE')[0].price || '', //预付 + rece: this.object?.expenseDTOList?.filter((item: any) => item.expenseCode === 'RECE')[0].price || '', // 到付 + back: this.object?.expenseDTOList?.filter((item: any) => item.expenseCode === 'BACK')[0].price || '', // 回单付 + lunarKnot: 0, + total: this.object?.subtotal || '', // 合计(元) + paymentTime: `到货后${this.object?.paymentDays || ''}天`, // 承诺支付运费时间 + year: new Date().getFullYear() || '', // 签约年份 + month: new Date().getMonth() + 1 || '', // 签约月份 + day: new Date().getDate() || '' // 签约日期 + } + }; + } else if (this.type === 'bulk') { + params = { + contractType: '1', + resourceType: '2', + signingObject: '1', + templateType: 'MX', + parametersDTO: { + contractCode: '', + shipperName: this?.shipperName || '', //托运人 + carrierName: this.object?.enterpriseInfoNamer || this.object?.enterpriseInfoName || '', //承运人 + shipperLegalPersonName: this.enterpriseInfo.legalPersonName || '', //托运法定代表人 + carrierLegalPersonName: this.enterpriseInfo.netLegalPersonName || '', //承运法定代表人 + consignorInfo: `${this.object.unLoadingPlaceDTOList[0]?.appUserName || ''} ${ + this.object.unLoadingPlaceDTOList[0]?.contractTelephone || '' + }`, // 发货信息 + consignorAddress: this.object.unLoadingPlaceDTOList[0].detailedAddress, // 发货地址 + consignorDate: '', // 发货时间 + consigneeInfo: `${this.object.unLoadingPlaceDTOList[this.object.unLoadingPlaceDTOList.length - 1]?.appUserName || ''} ${ + this.object.unLoadingPlaceDTOList[this.object.unLoadingPlaceDTOList.length - 1]?.contractTelephone || '' + }`, // 收货信息 + consigneeDate: '', // 收货时间 + consigneeAddress: this.object.unLoadingPlaceDTOList[this.object.unLoadingPlaceDTOList.length - 1]?.detailedAddress || '', // 收货地址 + goodsName: this.object.goodsInfoDTOList[0]?.goodsName || '', // 货物名称 + shippingType: '大宗运输', + consignmentVolume: `${this.object?.goodsInfoDTOList?.[0]?.weight || '-'}吨/${ + this.object?.goodsInfoDTOList?.[0]?.volume || '-' + }方/${this.object.goodsInfoDTOList?.[0]?.number || '-'}车`, //托运量 + transporterInfo: '', //运输方信息 + freightAmount: '', // 订单运费金额(元) + pre: '', //预付 + rece: '', // 到付 + back: '', // 回单付 + lunarKnot: '', + total: '', // 合计(元) + paymentTime: `到货后${this.object?.paymentDays || ''}天`, // 承诺支付运费时间 + year: new Date().getFullYear() || '', // 签约年份 + month: new Date().getMonth() + 1 || '', // 签约月份 + day: new Date().getDate() || '' // 签约日期 + } + }; + } + if (params.parametersDTO.freightAmount) { + params.parametersDTO.freightAmount = this.toThousands(params.parametersDTO.freightAmount); + } + if (params.parametersDTO.pre) { + params.parametersDTO.pre = this.toThousands(params.parametersDTO.pre); + } + if (params.parametersDTO.rece) { + params.parametersDTO.rece = this.toThousands(params.parametersDTO.rece); + } + if (params.parametersDTO.back) { + params.parametersDTO.back = this.toThousands(params.parametersDTO.back); + } + if (params.parametersDTO.total) { + params.parametersDTO.total = this.toThousands(params.parametersDTO.total); + } + console.log(params); + this.service.request(this.service.$api_getContractContent, params).subscribe(res => { + if (res) { + this.agreement = res.contractContent; + } + }); + } + + toThousands(num: any) { + let str = num.toString(); + return '¥' + str.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,'); + } + handleOk() { + this.modal.close(true); + } +} diff --git a/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.html b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.html new file mode 100644 index 00000000..0adf665b --- /dev/null +++ b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.html @@ -0,0 +1,10 @@ + +
    编辑外部货源号
    + + + \ No newline at end of file diff --git a/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.spec.ts b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.spec.ts new file mode 100644 index 00000000..1f32b568 --- /dev/null +++ b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementUpdateExternalSnComponent } from './update-external-sn.component'; + +describe('SupplyManagementUpdateExternalSnComponent', () => { + let component: SupplyManagementUpdateExternalSnComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementUpdateExternalSnComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementUpdateExternalSnComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.ts b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.ts new file mode 100644 index 00000000..6031e1fa --- /dev/null +++ b/src/app/routes/supply-management/components/update-external-sn/update-external-sn.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit } from '@angular/core'; +import { SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; + +@Component({ + selector: 'app-supply-management-update-external-sn', + templateUrl: './update-external-sn.component.html', +}) +export class SupplyManagementUpdateExternalSnComponent implements OnInit { + record: any = {}; + orderObject: any; + schema: SFSchema = { + properties: { + owner: { + type: 'string', + maxLength: 30, + title: '', + ui: { + placeholder: '不超过30位' + } + }, + }, + required: ['owner'], + }; + ui: SFUISchema = { + '*': { + spanControl: 24 + }, + }; + + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public service: SupplyManagementService + ) { } + + ngOnInit(): void { + + } + + save(value: any): void { + const { id, sn } = value; + this.service.request(`/user/${this.record.id}`, { id, sn }).subscribe(res => { + this.msgSrv.success('保存成功'); + this.modal.close(true); + }); + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/supply-management/components/update-freight/update-freight.component.html b/src/app/routes/supply-management/components/update-freight/update-freight.component.html new file mode 100644 index 00000000..7e3e8f7c --- /dev/null +++ b/src/app/routes/supply-management/components/update-freight/update-freight.component.html @@ -0,0 +1,15 @@ + + + + + 天内支付运费 + + +
    {{sf.value.description1 | currency: 'CNY' }}(费率:5.3%)
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/supply-management/components/update-freight/update-freight.component.spec.ts b/src/app/routes/supply-management/components/update-freight/update-freight.component.spec.ts new file mode 100644 index 00000000..da00ca73 --- /dev/null +++ b/src/app/routes/supply-management/components/update-freight/update-freight.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementUpdateFreightComponent } from './update-freight.component'; + +describe('SupplyManagementUpdateFreightComponent', () => { + let component: SupplyManagementUpdateFreightComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementUpdateFreightComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementUpdateFreightComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/update-freight/update-freight.component.ts b/src/app/routes/supply-management/components/update-freight/update-freight.component.ts new file mode 100644 index 00000000..8e3c4b1d --- /dev/null +++ b/src/app/routes/supply-management/components/update-freight/update-freight.component.ts @@ -0,0 +1,143 @@ +import { Component, OnInit } from '@angular/core'; +import { SFCustomWidgetSchema, SFNumberWidgetSchema, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; + +@Component({ + selector: 'app-supply-management-update-freight', + templateUrl: './update-freight.component.html', +}) +export class SupplyManagementUpdateFreightComponent implements OnInit { + record: any = {}; + i: any; + schema: SFSchema = {}; + ui: SFUISchema = {}; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public http: _HttpClient, + ) { } + + ngOnInit(): void { + this.initSF(); + + if (this.record.id > 0) + this.http.get(`/user/${this.record.id}`).subscribe(res => (this.i = res)); + } + initSF() { + this.schema = { + properties: { + no1: { + type: 'string', + title: '是否回单', + enum: [ + { label: '需要', value: 0 }, + { label: '不需要', value: 1 }, + ], + ui: { + widget: 'radio' + } as SFRadioWidgetSchema, + default: 0 + }, + owner1: { + type: 'number', + title: '预付', + minimum: 0, + max: 99999999, + ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal(val, 1) + } as SFNumberWidgetSchema + }, + callNo1: { + type: 'number', + title: '到付', + minimum: 0, + ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal(val, 2) + } as SFNumberWidgetSchema + }, + // href1: { + // type: 'number', + // title: '油卡', + // minimum: 0, + // ui: { + // prefix: '¥', + // widgetWidth: 200, + // precision: 2, + // change: (val: any) => this.changeNumVal(val, 3) + // } as SFNumberWidgetSchema + // }, + description5: { + type: 'number', title: '回单付', minimum: 0, maxLength: 140, ui: { + prefix: '¥', + widgetWidth: 200, + precision: 2, + change: (val: any) => this.changeNumVal(val, 4) + } as SFNumberWidgetSchema + }, + href2: { + type: 'string', + title: '小计', + ui: { + widget: 'text' + } + }, + description1: { + type: 'string', + title: '附加费', + ui: { + widget: 'custom' + } + }, + description2: { + type: 'string', + title: '总费用', + ui: { + widget: 'text' + } + }, + description3: { + type: 'number', + title: '到货后', + maximum: 30, + minimum: 1, + ui: { + widget: 'custom', + } as SFCustomWidgetSchema + }, + }, + required: ['owner', 'callNo', 'href', 'description'], + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 16 }, + }, + }; + } + save(value: any): void { + this.http.post(`/user/${this.record.id}`, value).subscribe(res => { + this.msgSrv.success('保存成功'); + this.modal.close(true); + }); + } + + close(): void { + this.modal.destroy(); + } + /** + * 更新数字框 + * @param value + * @param type + */ + changeNumVal(value: any, type: number) { + + } +} diff --git a/src/app/routes/supply-management/components/update-price/update-price.component.html b/src/app/routes/supply-management/components/update-price/update-price.component.html new file mode 100644 index 00000000..490015a8 --- /dev/null +++ b/src/app/routes/supply-management/components/update-price/update-price.component.html @@ -0,0 +1,40 @@ + +
    + + + + + + + + +
    +
    +

    变更日志

    + + + {{item?.operator}}/{{item.telephone}} + + +
    + + {{ freightType[i?.freightType] }} + diff --git a/src/app/routes/supply-management/components/update-price/update-price.component.spec.ts b/src/app/routes/supply-management/components/update-price/update-price.component.spec.ts new file mode 100644 index 00000000..213a77a0 --- /dev/null +++ b/src/app/routes/supply-management/components/update-price/update-price.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementUpdatePriceComponent } from './update-price.component'; + +describe('SupplyManagementUpdatePriceComponent', () => { + let component: SupplyManagementUpdatePriceComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementUpdatePriceComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementUpdatePriceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/update-price/update-price.component.ts b/src/app/routes/supply-management/components/update-price/update-price.component.ts new file mode 100644 index 00000000..0c41962e --- /dev/null +++ b/src/app/routes/supply-management/components/update-price/update-price.component.ts @@ -0,0 +1,121 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; + +@Component({ + selector: 'app-supply-management-update-price', + templateUrl: './update-price.component.html', +}) +export class SupplyManagementUpdatePriceComponent implements OnInit { + record: any = {}; + i: any; + schema: SFSchema = {}; + ui: SFUISchema = {}; + columns: STColumn[] = []; + @ViewChild('sf', { static: false }) sf!: SFComponent; + freightType: any = { + 1: '元/吨', + 2: '元/方', + 3: '元/车' + } // 运单类型 + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public service: SupplyManagementService + ) { } + + get reqParams() { + return { + operateObject: this.record?.resourceCode, + operateType: 7, + }; + } + ngOnInit(): void { + this.initSF(); + this.initSt(); + console.log(this.record) + if (this.record?.id) this.getGoodsResourceShipperDeatail(this.record?.id); + } + + initSF() { + this.schema = { + properties: { + resourceCode: { + type: 'string', + title: '货源编号', + ui: { + widget: 'text' + }, + }, + freightPrice: { + type: 'string', + title: '运费单价', + ui: { + widget: 'custom' + } + }, + rule: { + type: 'string', + title: '取整规则', + default: '0', + ui: { + widget: 'dict-select', + params: { dictKey: 'goodresource:rounding:rules' }, + optionalHelp: { + text: '例如:付司机运费= 重量*单价 = 999.99;\n 保留小数:即 999.99; \n 抹除小数:即 999.00;\n 抹除个位,即 990.00', + } + } + }, + + }, + required: ['freightPrice', 'rule',], + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 16 }, + }, + '$rule': { + spanLabelFixed: 120, + grid: { span: 16 }, + }, + }; + } + + getGoodsResourceShipperDeatail(id: any) { + this.service.request(this.service.$api_get_goods_resource_shipper, { id }).subscribe(res => { + if (res) { + this.i = res; + } + }) + } + /** + * 初始化数据列表 + */ + initSt() { + this.columns = [ + { title: '日志内容', width: 120, index: 'operationContent', className: 'text-center' }, + { title: '更新时间', index: 'operatorTimestamp', width: 100, className: 'text-center' }, + { title: '操作人', width: 100, render: 'operator', className: 'text-center' }, + ]; + } + save(value: any): void { + console.log(value); + // const { id: resourceId, freightType, freightPrice, resourceCode, rule, goodsID: id } = value; + const { resourceId, freightType, freightPrice, resourceCode, rule, id } = value; + this.service.request(this.service.$api_update_price, { id, freightType, freightPrice, resourceCode, rule, resourceId }).subscribe(res => { + if (res) { + this.msgSrv.success('保存成功'); + this.modal.close(true); + } + }); + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html new file mode 100644 index 00000000..a570a0d1 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html @@ -0,0 +1,230 @@ +
    + + + + + +
    + +

    货源编码 : {{ i?.resourceCode }}

    +
    +
    +
    网络货运人:{{ i?.enterpriseInfoName }}
    +
    + + + + +
    +
    +
    +
    + 总费用:{{ i?.totalAmount | currency: '¥' }} +
    +
    + +
    + {{ i?.externalResourceCode }} + {{ i?.enterpriseProjectName }} + {{ i?.createUserName }}/{{ i?.createUserPhone }} + {{ i?.dispatchName }}/{{ i?.dispatchPhone }} + {{ i?.serviceTypeLabel }} +
    +
    +
    + +
    +
    + + + + + +
    +
    +
    + + + + 货物信息 + + + {{ item.goodsTypeName }} - {{ item.goodsName }} + + {{ item.weight }}吨,{{ item.volume }}方,{{ item.number }}件 + + + + 承运信息 + + {{ i?.carrierInformationVO?.driverName }} + + + {{ i?.carrierInformationVO?.driverTelephone }} + + + {{ i?.carrierInformationVO?.driverLicensePlate }} + + +
    +

    装货卸货信息 + ( + + + ) + +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{ item?.province }}{{ item?.city }}{{ item?.area }}{{ item?.detailedAddress }}

    +

    联系人:{{ item?.appUserName }}/{{ item?.contractTelephone }}

    +
    +
    +
    +

    装货时间:{{ i?.loadingTime }}

    +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{ item?.province }}{{ item?.city }}{{ item?.area }}{{ item?.detailedAddress }}

    +

    联系人:{{ item?.appUserName }}/{{ item?.contractTelephone }}

    +
    +
    +
    +

    卸货时间:{{ i?.unloadingTime }}

    +
    +
    +
    +
    +
    + + + + + {{ i?.insuranceTypeLabel}} + + + {{i?.goodsValue !==null?(i?.goodsValue|currency)+'元':'-'}} + + + {{i?.insurancePremium!==null?(i?.insurancePremium |currency)+'元':'-'}} + + + + + + +
    + {{ item?.totalAmount | currency }} + (含附加费) +
    +
    + +
    + {{ item?.price | currency }} +
    +
    +
    +
    +
    +

    + + + {{ i?.totalAmount | currency }} + + (运费{{ i?.totalFreight | currency }}含附加运费 {{ i?.totalSurcharge | currency }}) +

    +
    车队长:{{ i?.payeeName }}/{{ i?.payeePhone }}/{{ i?.payeeCardNo }}
    +
    +
    +
    + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + {{ i?.supplementaryInformationVO?.receiptUserName || '-' }} / {{ i?.supplementaryInformationVO?.phon || '-' }} + + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + {{ i?.supplementaryInformationVO?.remarks }} + + + + + + +
    + {{ item?.operator }} {{ item?.telephone ? '/' + item?.telephone : '' }} +
    +
    +
    +
    +
    diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.less b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.less new file mode 100644 index 00000000..e963d1b7 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.less @@ -0,0 +1,84 @@ +:host { + .source-info { + min-height: 210px; + + p { + margin-bottom: .5em; + } + } + + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .title { + font-weight: bold; + font-size: 26; + } + + .freight-info-box { + width: 95%; + + p { + margin-bottom: 5px; + } + } + + .freigth-label { + display: inline-block; + width: 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width: 70%; + margin: 0 auto; + } + } + } + + .handling-info { + min-height: 176px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.spec.ts b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.spec.ts new file mode 100644 index 00000000..cb740ab1 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementVehicleDetailComponent } from './vehicle-detail.component'; + +describe('SupplyManagementVehicleDetailComponent', () => { + let component: SupplyManagementVehicleDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [SupplyManagementVehicleDetailComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementVehicleDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts new file mode 100644 index 00000000..c2af6ae7 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts @@ -0,0 +1,181 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementVehicleAssignedCarComponent } from '../assigned-car/assigned-car.component'; +import { SupplyManagementUpdateExternalSnComponent } from '../update-external-sn/update-external-sn.component'; + +@Component({ + selector: 'app-supply-management-vehicle-detail', + templateUrl: './vehicle-detail.component.html', + styleUrls: ['./vehicle-detail.component.less'] +}) +export class SupplyManagementVehicleDetailComponent implements OnInit { + + id = this.route.snapshot.params.id; + i: any; + serviceType: any = { + 1: '抢单', + 2: '指派' + } + logColumns: STColumn[] = [ + { title: '内容', index: 'operationContent' }, + { title: '操作人', render: 'operator' }, + { title: '操作时间', index: 'operatorTimestamp' }, + ]; + totalObj: any; + attObj: any; + status: any = { 1: '待接单', 2: '已接单', 3: '已取消' }; + totalExpensePrice = 0; + expenseColumns: STColumn[] = [ + { + title: '款项', + width: '150px', + className: 'text-center', + index: 'expenseName' + }, + { + title: '总费用(元)', + width: '150px', + className: 'text-center', + render: 'total' + }, + { + title: '协议金额(元)', + width: '150px', + className: 'text-center', + render: 'price' + }, + ]; + get reqParams() { + return { + operateObject: this.i?.resourceCode, + operateTypeList: [4,7], + }; + } + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + public service: SupplyManagementService, + public modal: NzModalService, + public router: Router + ) { + + } + + ngOnInit(): void { + this.getGoodsSourceDetail() + } + + getGoodsSourceDetail() { + this.service.request(this.service.$api_get_getCompleteVehicleDetail, { id: this.id }).subscribe(res => { + console.log('888') + console.log(this.i) + const expenseList = res?.expenseVOList || []; + this.totalExpensePrice = 0; + this.attObj = res?.expenseVOList?.filter((data: any) => data.expenseCode === 'ATT')[0]; + this.totalObj = res?.expenseVOList?.filter((data: any) => data.expenseCode === 'TOTAL')[0]; + console.log(this.attObj) + console.log(this.totalObj) + expenseList.forEach((e: any) => { + this.totalExpensePrice += e?.price * e?.rate; + }); + this.i = { ...res, totalExpensePrice: this.totalExpensePrice }; + + }) + } + /** + * 修改货源 + */ + updateGoodsSource(record: any) { + this.router.navigate(['/supply-management/vehicle-amend', record.id], { + queryParams: { + sta: 1 + } + }); + } + + /** + * 取消货源 + */ + cancleGoodsSource() { + this.modal.confirm({ + nzTitle: '确定取消货源吗?', + nzContent: `取消后不可恢复,谨慎操作`, + nzOnOk: () => + this.service.request(this.service.$api_cancle_goods_source, { id: this.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.getGoodsSourceDetail() + } + }) + }) + } + + /** + *再下一单 + * @param record + */ + placeOrder(record: any) { + this.router.navigate(['./pbg/onecar-publish'], { + queryParams: { + id: record?.id, + type: 'add' + } + }) + } + /** + * 编辑外部货源号 + * @param item st当前行对象 + */ + editEnternalSn(item: any) { + const modalRef = this.modal.create({ + nzWidth: '400px', + nzContent: SupplyManagementUpdateExternalSnComponent, + nzComponentParams: { + orderObject: item, + }, + nzFooter: null, + nzClosable: false + }); + } + + /** + * 重新指派 + */ + assignedCar(item: any) { + const { id } = item; + console.log(id) + const modalRef = this.modal.create({ + nzTitle: '指派熟车', + nzWidth: '1200px', + nzContent: SupplyManagementVehicleAssignedCarComponent, + nzComponentParams: { + i: item, + status: 'anew', + params: { id }, + url: this.service.$api_save_assign_vehicle, + }, + nzFooter: null, + + }); + modalRef.afterClose.subscribe((result) => { + if (result) { + } + }); + } + nextOrder(item: any) { + this.router.navigate(['/supply-management/vehicle-amend', item.id], { + queryParams: { + sta: 2 + } + }); + } + goBack() { + window.history.go(-1); + } + +} diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.html b/src/app/routes/supply-management/components/vehicle/vehicle.component.html new file mode 100644 index 00000000..9ed09a00 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.html @@ -0,0 +1,121 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + +
    + +
    + + +
    + + + + +
    {{ item?.createUserName }}/{{ item?.createUserPhone }}
    +
    + + {{ item?.resourceCode }} +

    {{ item?.resourceTypeLabel }}{{ item?.serviceTypeLabel }}

    +

    {{ item?.resourceStatusLabel }}

    +
    + +
    {{ item?.totalAmount | currency }}
    +
    + +
    {{ item?.freight | currency }}
    +
    + +
    {{ item?.surcharge | currency }}
    +
    + +
    车型: {{ item?.carModelLabel }}
    +
    车长: {{ item?.carLengthLabel }} 米
    +
    +
    +
    +
    + +
    + + + +
    +
    + + + +
    + + +
    + + +
    + + + + +
    diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.less b/src/app/routes/supply-management/components/vehicle/vehicle.component.less new file mode 100644 index 00000000..e3128423 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.less @@ -0,0 +1,25 @@ +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + max-width : 400px; + position : absolute; + right : 0; + bottom : 30px; + } + +} + +:host::ng-deep { + p { + margin-bottom: 0; + } + + .text-truncate { + white-space: normal; + } +} \ No newline at end of file diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.ts b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts new file mode 100644 index 00000000..dcaf4062 --- /dev/null +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts @@ -0,0 +1,658 @@ +import { ActivatedRoute, Router } from '@angular/router'; +import { Component, OnInit, ViewChild, OnChanges } from '@angular/core'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { SupplyManagementVehicleAssignedCarComponent } from '../assigned-car/assigned-car.component'; +import { SupplyManagementUpdateExternalSnComponent } from '../update-external-sn/update-external-sn.component'; +import { of } from 'rxjs'; +import { ShipperBaseService } from '@shared'; +import { SupplyManagementImportSupplyComponent } from '../../model/import-supply/import-supply.component'; + +@Component({ + selector: 'app-supply-management-vehicle', + templateUrl: './vehicle.component.html', + styleUrls: ['./vehicle.component.less'] +}) +export class SupplyManagementVehicleComponent implements OnInit { + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + loading: boolean = true; + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + _$expand = false; + tabs = { + totalQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0 + }; + + isVisible = false; + freightSchema: SFSchema = {}; + auditMany = false; + + resourceStatus: any; + auditID: any; + constructor( + public service: SupplyManagementService, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + public shipperSrv: ShipperBaseService + ) { } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + const a: any = { + ...params + }; + if (this.resourceStatus) { + a.resourceStatus = this.resourceStatus; + } + this.loading = true; + return { + ...a + }; + } + beforeReq = (requestOptions: STRequestOptions) => { + const params = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + const a: any = { + ...params + }; + if (this.resourceStatus) { + a.resourceStatus = this.resourceStatus; + } + if (this.sf) { + Object.assign(requestOptions.body, { + ...a + }); + } + this.loading = true; + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + this.loading = false; + return data.map(item => ({ + ...item, + disabled: item.auditStatus !== '1' + })); + }; + + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + ngOnInit(): void { + this.initSFFre(); + this.getGoodsSourceStatistical(); + } + /** + * 初始化查询表单 + */ + + initSFFre() { + this.freightSchema = { + properties: { + remarks: { + title: '备注', + type: 'string', + maxLength: 50, + ui: { + placeholder: '请输入备注', + widget: 'textarea' + } + } + }, + require: ['remarks'] + }; + } + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + selectChange(e: number) { + this.resourceStatus = e; + setTimeout(() => { + this.st.load(1); + }, 500); + } + /** + * 导入货源 + */ + importGoodsSource() { + const modalRef = this.modal.create({ + nzTitle: '货源导入', + nzWidth: 600, + nzContent: SupplyManagementImportSupplyComponent, + nzComponentParams: { + // i: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(result => { + if (result) { + const tipsModal = this.modal.create({ + nzTitle: '上传提示', + nzWidth: 600, + nzContent: `
    文件上传完成!成功${result?.successNumber}条,失败${result?.failNumber}条!
    `, + nzFooter: [ + { + label: '取 消', + type: 'default', + onClick: () => { + tipsModal.destroy(); + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }, + { + label: '下载失败数据', + type: 'primary', + loading: this.service.http.loading, + onClick: () => { + if(!result?.failNumber) { + this.service.msgSrv.error('没有失败数据!'); + tipsModal.destroy(); + this.st?.reload(); + this.getGoodsSourceStatistical(); + return; + } + this.service.downloadFile(this.service.$api_getFailUploadGoodsOperateResource, result.ids) + tipsModal.destroy(); + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }, + ] + }) + tipsModal.afterClose.subscribe(result => { + this.st?.reload(); + this.getGoodsSourceStatistical(); + }) + } else { + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } + + + /** + * 重新指派 + */ + /** + * 重新指派 + */ + assignedCar(item: any) { + const { id } = item; + const modalRef = this.modal.create({ + nzTitle: '指派熟车', + nzWidth: '1200px', + nzContent: SupplyManagementVehicleAssignedCarComponent, + nzComponentParams: { + i: item, + status: 'anew', + params: { id }, + url: this.service.$api_save_assign_vehicle + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(result => { + if (result) { + this.st.reload(); + } + }); + } + /** + * 审核 + */ + audit(value: any, status?: any) { + console.log(value); + console.log(status); + if (status === 2) { + if (this.selectedRows.length <= 0) { + this.service.msgSrv.error('未选择货源单!'); + return; + } + let list: any[] = []; + this.selectedRows.forEach(item => { + list.push(item.id); + }); + this.auditID = list; + this.auditMany = true; + } else { + this.auditID = value.id; + this.auditMany = false; + } + this.isVisible = true; + } + /** + * 审核关闭弹窗 + */ + handleCancel(type: any) { + this.isVisible = false; + } + /** + * 审核通过按钮 + */ + handleOK(value: any) { + if (this.auditMany === false) { + const params: any = { + id: this.auditID, + remarks: this.sfFre.value.remarks + }; + if (value == 1) { + params.auditStatus = 2; + } else { + params.auditStatus = 3; + } + console.log('999'); + console.log(params); + this.service.request(this.service.$api_goodsResourceAudit, params).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('审核成功!'); + this.isVisible = false; + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } else { + const params: any = { + ids: this.auditID, + remarks: this.sfFre.value.remarks + }; + if (value == 1) { + params.auditStatus = 2; + } else { + params.auditStatus = 3; + } + console.log(params); + this.service.request(this.service.$api_batchGoodsResourceAudit, params).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('审核成功!'); + this.isVisible = false; + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }); + } + } + /** + * 跳转修改货源 + */ + amend(item: any) { + console.log(item); + this.router.navigate(['/supply-management/vehicle-amend', item.id], { + queryParams: { + sta: 1 + } + }); + } + nextOrder(item: any) { + this.router.navigate(['/supply-management/vehicle-amend', item.id], { + queryParams: { + sta: 2 + } + }); + } + /** + * 代发货源 + */ + releaseGoods() { + this.router.navigate(['/supply-management/vehicle-release']); + } + /** + * 取消货源 + */ + cancleGoodsSource(record: any) { + this.modal.confirm({ + nzTitle: '确定取消货源吗?', + nzContent: `取消后不可恢复,谨慎操作`, + nzOnOk: () => + this.service.request(this.service.$api_cancle_goods_source, { id: record.id }).subscribe(res => { + if (res === true) { + this.service.msgSrv.success('操作成功!'); + this.st?.reload(); + this.getGoodsSourceStatistical(); + } + }) + }); + } + // 获取货源状态统计 + getGoodsSourceStatistical() { + this.tabs = { + totalQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.resourceStatus; + this.service.request(this.service.$api_get_goods_resource_statistical, { resourceType: 1, ...params }).subscribe(res => { + if (res) { + console.log(res); + this.tabs = res; + } + }); + } + + private initSF(): SFSchema { + return { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + resourceCode: { + type: 'string', + title: '货源编号', + ui: { placeholder: '请输入' } + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + placeholder: '请输入' + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { placeholder: '请输入' } + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + // enterpriseProjectId: { + // type: 'string', + // title: '所属项目', + // ui: { + // widget: 'select', + // visibleIf: { + // _$expand: (value: boolean) => value + // }, + // allowClear: true, + // containsAllLabel: true, + // asyncData: () => this.shipperSrv.getEnterpriseProject(this.sf.value?.shipperAppUserId) + // } as SFSelectWidgetSchema + // }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + serviceType: { + title: '服务类型', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'service:type' }, + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } as SFSelectWidgetSchema + }, + auditStatus: { + title: '审核状态', + type: 'string', + ui: { + widget: 'dict-select', + allowClear: true, + containsAllLabel: true, + params: { dictKey: 'goodresource:audit:status' }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + asyncData: () => this.shipperSrv.getNetworkFreightForwarder(), + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true + } + } + } + }; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + /** + * 初始化数据列表 + */ + private initST(): STColumn[] { + return [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '货源编号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'resourceCode' + }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { + title: '货主', + index: 'shipperAppUserName', + width: '180px', + className: 'text-left' + }, + + { + title: '项目名称', + index: 'enterpriseProjectName', + width: '180px', + className: 'text-left' + }, + { + title: '装货地', + index: 'loadingAddressArr', + width: '200px', + className: 'text-left' + }, + { + title: '卸货地', + index: 'unloadingAddressArr', + width: '200px', + className: 'text-left' + }, + { + title: '货物名称', + index: 'goodsName', + width: '150px', + className: 'text-left' + }, + { + title: '货物数量', + width: '200px', + index: 'goodsNumber', + className: 'text-left', + format: item => item.goodsNumber.join('/') + }, + { + title: '用车需求', + className: 'text-left', + width: '180px', + render: 'useCarDemand' + }, + { + title: '总费用', + className: 'text-right', + width: '120px', + render: 'total' + }, + { + title: '总运费', + width: '150px', + className: 'text-right', + index: 'totalAmount', + render: 'totalAmount' + }, + { + title: '附加费', + className: 'text-right', + width: '120px', + index: 'surcharge', + render: 'surcharge' + }, + { + title: '货源状态', + className: 'text-left', + index: 'resourceStatusLabel', + width: '120px' + }, + { + title: '创建时间', + width: '200px', + index: 'createTime', + className: 'text-left' + }, + { + title: '审核状态', + className: 'text-left', + index: 'auditStatus', + type: 'badge', + width: '170px', + badge: { + '1': { text: '待审核', color: 'warning' }, + '2': { text: '审核通过', color: 'success' }, + '3': { text: '不通过', color: 'error' }, + '4': { text: '已取消', color: 'default' } + } + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center block-td', + buttons: [ + { + text: '货源审核', + click: _record => this.audit(_record, 1), + iif: item => item.auditStatus === '1', + acl: { ability: ['SUPPLY-INDEX-vehicleBatchAudit'] } + }, + { + text: '修改货源', + click: _record => this.amend(_record), + iif: item => item.resourceStatus === '1' && item.insurancePayment !== 'Y', + acl: { ability: ['SUPPLY-INDEX-vehicleModificationSupply'] } + }, + // { + // text: '修改运费', + // click: _record => this.updateFreight(_record), + // iif: item => item.resourceStatus === '1' && item.serviceType === '2' + // }, + { + text: '取消货源', + click: _record => this.cancleGoodsSource(_record), + iif: item => item.resourceStatus === '1', + acl: { ability: ['SUPPLY-INDEX-vehicleCancelSupply'] } + }, + { + text: '再下一单', + click: _record => this.nextOrder(_record), + acl: { ability: ['SUPPLY-INDEX-vehiclePlaceOrder'] } + }, + { + text: '重新指派', + click: _record => this.assignedCar(_record), + iif: item => item.resourceStatus === '1' && item.serviceType === '2', + acl: { ability: ['SUPPLY-INDEX-vehicleReassign'] } + }, + { type: 'divider' } + ] + } + ]; + } + // 导出 + exportFire() { + this.service.exportStart(this.reqParams, this.service.$api_asyncExportWholeList); + } +} diff --git a/src/app/routes/supply-management/model/import-supply/import-supply.component.html b/src/app/routes/supply-management/model/import-supply/import-supply.component.html new file mode 100644 index 00000000..f06873b6 --- /dev/null +++ b/src/app/routes/supply-management/model/import-supply/import-supply.component.html @@ -0,0 +1,55 @@ + +
    + + + + + + + + + + + + +
    + +
    +
    + 下载导入模板 +
    仅支持XLS / XLSX文件格式,最多不能超过100行数据
    +
    +
    +
    +

    注意:

    +

    1、第一次上传请点击下载模板

    +

    2、请不要调整模板顺序

    +

    3、必填字段请务必填写

    +

    4、如果不清楚字段值,请参考货源发布功能

    +

    5、发布成功后,可在货源列表-待接单查看

    +
    +
    +
    + 文件上传成功!成功xx条,失败xx条! +
    + diff --git a/src/app/routes/supply-management/model/import-supply/import-supply.component.spec.ts b/src/app/routes/supply-management/model/import-supply/import-supply.component.spec.ts new file mode 100644 index 00000000..65a74b1c --- /dev/null +++ b/src/app/routes/supply-management/model/import-supply/import-supply.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyManagementImportSupplyComponent } from './import-supply.component'; + +describe('SupplyManagementImportSupplyComponent', () => { + let component: SupplyManagementImportSupplyComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ SupplyManagementImportSupplyComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyManagementImportSupplyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-management/model/import-supply/import-supply.component.ts b/src/app/routes/supply-management/model/import-supply/import-supply.component.ts new file mode 100644 index 00000000..e75aafe1 --- /dev/null +++ b/src/app/routes/supply-management/model/import-supply/import-supply.component.ts @@ -0,0 +1,214 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-01 15:13:03 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-13 10:41:08 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\model\\import-supply\\import-supply.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/supply-management.service'; +import { apiConf } from '@conf/api.conf'; + +@Component({ + selector: 'app-supply-management-import-supply', + templateUrl: './import-supply.component.html', +}) +export class SupplyManagementImportSupplyComponent implements OnInit { + record: any = {}; + files: any; + fileName: any; + status: boolean = true + files2: any; + schema: SFSchema = {}; + load = false + ui: SFUISchema = {}; + networkTransporter: any; // 网络货运人id + uploadUrl = apiConf.file_upload_url; + @ViewChild('sf', { static: false }) sf!: SFComponent; + constructor( + private modal: NzModalRef, + private msgSrv: NzMessageService, + public service: SupplyManagementService + ) { } + + ngOnInit(): void { + this.initSF(); + console.log(this.record) + } + + initSF() { + this.schema = { + properties: { + shipperAppUserId: { + title: '货主', + type: 'string', + maxLength: 30, + ui: { + widget: 'select', + // serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + onSearch: (q: any) => { + console.log(q === ' ') + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map(res => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + this.getRegionCode(str); + this.getRegionCode2(str); + } + } + } as SFSelectWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'text', + }, + default: '确认货主后带出' + }, + enterpriseProjectId: { + type: 'string', + title: '项目', + ui: { + widget: 'select', + placeholder: '请选择' + } as SFSelectWidgetSchema + }, + fileName: { + type: 'string', + title: '导入货源信息', + ui: { + widget: 'custom' + } + }, + file: { + type: 'string', + title: '', + ui: { + widget: 'custom' + } + }, + }, + required: ['shipperAppUserId', 'enterpriseProjectId','enterpriseInfoId','fileName'], + }; + this.ui = { + '*': { + grid: { span: 20 }, + }, + '$fileName': { + spanLabelFixed: 130, + grid: { span: 20 }, + }, + '$file': { + spanLabelFixed: 130, + grid: { span: 20 }, + }, + }; + } + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + }); + } + getRegionCode2(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_getNetworkTransporter, { id: regionCode }).subscribe((res: any) => { + console.log(res) + this.networkTransporter = res.networkTransporter + this.sf.getProperty('/enterpriseInfoId')!.widget.reset(res?.netTranName); + this.sf.setValue('/enterpriseInfoId', res?.netTranName) + }); + } + save(): void { + if(!this.sf.value?.shipperAppUserId || !this?.networkTransporter || !this.sf.value?.enterpriseProjectId || !this.sf.value?.fileName) { + this.service.msgSrv.error('请填写必填项并上传文件!') + return + } + this.load =true; + const formData : any= new FormData(); + this.files?.forEach((file: any) => { + formData.append('file', file); + formData.append('shipperAppUserId', this.sf.value?.shipperAppUserId); + formData.append('enterpriseInfoId', this?.networkTransporter); + formData.append('enterpriseProjectId', this.sf.value?.enterpriseProjectId); + }); + + console.log(formData) + this.service.request(this.service.$api_goodsResourceOperateImport, formData).subscribe(res => { + if (res) { + this.service.msgSrv.success('导入成功'); + this.load =false; + this.modal.destroy({ ...res }); + } + }); + } + + close(): void { + this.modal.destroy(); + } + handleChange(info: NzUploadChangeParam): void { + switch (info?.file?.status) { + case 'uploading': + break; + case 'done': + console.log(info); + let file = info?.file; + let fileName = file?.response.name; + this.sf?.setValue('/fileName', fileName); + this.sf?.setValue('/file', file?.response?.url); + break; + case 'error': + this.service.msgSrv.error('出错误了'); + break; + } + } + beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => { + let fileName = file?.name; + this.files = []; + this.files.push(file); + this.sf?.setValue('/fileName', fileName); + return false; + }; + downFile() { + this.service.downloadFile(this.service.$api_exportGoodsResourceOperateTemplate); + } + clearFile() { + this.fileName = null; + this.sf?.setValue('/fileName', null); + } +} diff --git a/src/app/routes/supply-management/services/supply-management.service.ts b/src/app/routes/supply-management/services/supply-management.service.ts new file mode 100644 index 00000000..f2680cc9 --- /dev/null +++ b/src/app/routes/supply-management/services/supply-management.service.ts @@ -0,0 +1,190 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 11:10:14 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-24 19:35:52 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\services\\supply-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Injectable, Injector } from '@angular/core'; +import { map } from 'rxjs/operators'; +import { BaseService } from 'src/app/shared/services'; + +@Injectable({ + providedIn: 'root' +}) +export class SupplyManagementService extends BaseService { + $api_get_enterprise_project = `/api/mdc/cuc/enterpriseProject/getEnterpriseProjectList `; // 所属项目列表 + // 取消货源 + $api_cancle_goods_source = `/api/sdc/goodsResourceOperate/cancelSource`; + // 整车获取货源表详情 + $api_get_getCompleteVehicleDetail = `/api/sdc/goodsResourceOperate/getWholeDetail`; + // 大宗获取货源表详情 + $api_get_getBulkDetail = `/api/sdc/goodsResourceOperate/getBulkDetail`; + // 查询运营后台大宗货源列表 + $api_get_bulkPage_list = `/api/sdc/goodsResourceOperate/listBulkPage`; + // 查询运营后台整车货源列表 + $api_get_wholePage_list = `/api/sdc/goodsResourceOperate/listWholePage`; + // 整车再下一单 + $api_set_saveAnotherWholeOrder = `/api/sdc/goodsResourceOperate/saveAnotherWholeOrder`; + // 大宗再下一单 + $api_set_saveAnotherBulkOrder = `/api/sdc/goodsResourceOperate/saveAnotherBulkOrder`; + // 编辑整车货源 + $api_set_WholeModify = `/api/sdc/goodsResourceOperate/updateWhole`; + // 编辑大宗货源 + $api_set_bulkModify = `/api/sdc/goodsResourceOperate/updateBulk`; + // 删除装卸货信息 + $api_delete_Wholedeletebatch = `/api/sdc/unLoadingPlace/deletebatch`; + // 删除货物信息 + $api_delete_bulkdeletebatch = `/api/sdc/goodsInfo/deletebatch`; + $api_get_catalogue_member = `/user?_allow_anonymous=true`; + $api_get_listModifyPrice = `/api/sdc/goodsInfo/listModifyPrice`; + $api_update_price = `/api/sdc/goodsResourceShipper/modifyPrice`; // 根据货物ID修改单价 + $api_get_goods_resource_statistical = `/api/sdc/goodsResourceOperate/statisticalStatus`; // 统计整车、大宗货源状态数量 + // 获取货主企业列表 + public $api_getList = '/api/mdc/cuc/enterpriseInfo/cargoOwner/getList?_allow_anonymous=true'; + public $api_commonAddress = '/api/sdc/commonAddress/list/page'; + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + // 取消货源 + public $api_cancelSource = '/api/sdc/goodsResourceOperate/cancelSource'; + // 整车计算附加费 + $api_getCalculatedSurcharge = `/api/sdc/expense/getCalculatedSurcharge`; + // 整车计算附加费率 + $api_getcalculatedServiceRate = `/api/sdc/expense/getAdditionalRate`; + // 整车计算附加费率 + $api_getAdditionalRate = `/api/sdc/expense/getAdditionalRate`; + // 代发整车货源 + $api_consignWhole = `/api/sdc/goodsResourceOperate/consignWhole`; + // 代发大宗货源 + $api_consignBulk = `/api/sdc/goodsResourceOperate/consignBulk`; + + $api_get_practice_car_list = `/api/mdc/cuc/enterpriseVehicle/getPracticeCarList`; // 获取熟车列表 + $api_add_car_caption = `/api/mdc/userDriverExpand/addCarCaptainForShiper`; // 设置为车队长 + $api_get_goods_resource_shipper = `/api/sdc/goodsResourceShipper/modifyPricePre`; // 修改单价页面根据货源ID获取货物表 + $api_get_car_captain_by_mobile = `/api/mdc/userDriverExpand/getCarCaptainByMobile`; // 查询车队长或者司机列表 + $api_save_assign_vehicle = `/api/sdc/goodsResourceShipper/reAssignWhole`; // 整车货源重新指派 + + $api_save_assign_bulk = `/api/sdc/goodsResourceShipper/reAssignBulk`; // 货主端大宗货源指派熟车 + // 整车再下一单指派熟车 + $api_save_assign_whole = `/api/sdc/goodsResourceOperate/saveAnotherWholeOrderAssign`; + // 代发整车货源指派熟车 + $api_save_consignWholeAssign = `/api/sdc/goodsResourceOperate/consignWholeAssign`; + // 货主端大宗货源指派熟车 + $api_save_bulk_assign = `/api/sdc/goodsResourceOperate/saveAnotherBulkOrderAssign`; + // 代发大宗货源指派熟车 + $api_save_consignBulkAssign = `/api/sdc/goodsResourceOperate/consignBulkAssign`; + + $api_get_has_assigned_car_list = `/api/sdc/goodsResourceShipper/getCarDriverIdsByResourceId`; // 大宗货源根据货源id获取司机和车辆的id集合 + + // 根据手机号查询车队长/司机 + $api_getCarCaptainByMobile = `/api/mdc/userDriverExpand/getCarCaptainByMobile`; + // 新增熟车 + $api_enterpriseVehicleSave = `/api/mdc/cuc/enterpriseVehicle/save`; + // 删除熟车 + $api_deletebatch = `/api/mdc/cuc/enterpriseVehicle/deletebatch`; + // 熟车详情 + $api_getMyDriverUserDetail = `/api/mdc/cuc/enterpriseVehicle/getMyDriverUserDetail`; + + // 获取指派熟车列表 + $api_getList_card = '/api/mdc/cuc/enterpriseVehicle/getPracticeCarList'; + + // 根据地区code查询列表 + $api_getRegionByCode = '/api/mdc/pbc/region/getRegionByCode'; + // 识别身份证 + $api_checkIdCard = '/api/mdc/pbc/hwc/ocr/recognizeIdCard'; + // 驾驶证识别 + $api_recognizeDriverLicense = `/api/mdc/pbc/hwc/ocr/recognizeDriverLicense`; + // 查询系统配置项 + public $api_get_config_item_page = '/api/mdc/pbc/sysConfigItem/list/page'; + + // 货源审核 + public $api_goodsResourceAudit = '/api/sdc/goodsResourceOperate/goodsResourceAudit'; + // 货源审核【批量】 + public $api_batchGoodsResourceAudit = '/api/sdc/goodsResourceOperate/batchGoodsResourceAudit'; + + // 大宗再下一单二维码 + $api_saveAnotherBulkOrderQRCode = '/api/sdc/goodsResourceOperate/saveAnotherBulkOrderQRCode'; + // 代发大宗货源二维码 + $api_consignBulkQRCode = '/api/sdc/goodsResourceOperate/consignBulkQRCode'; + // 获取操作日志列表 + public $api_getOperationLogRecordsList = '/api/mdc/pbc/operationLogRecords/getOperationLogRecordsList'; + // 获取数据字典 + $api_getDictValue = `/api/mdc/pbc/dictItems/getDictValue`; + // 获取协议信息 + public $api_getAgreementInfoByType = '/api/mdc/pbc/agreementInfo/getAgreementInfoByType'; + // 获取协议信息 + public $api_getContractContent = '/api/sdc/contractTemplate/getContractContent'; + // 获取运价 + public $api_getFreight = '/api/mdc/cuc/freightConfig/getFreight'; + // 从业资格证 + $api_recognizeQualificationCertificate = '/api/mdc/pbc/hwc/ocr/recognizeQualificationCertificate'; + /** + * 获取车型、车长字典数据 + * @returns + */ + getDictOptions(params = {}) { + return this.request(this.$api_getDictValue, params).pipe( + map((res: any) => { + if (!res) { + return []; + } + const obj = []; + obj.push({ label: '不限', value: '999' }); + return [...obj, ...res]; + }) + ); + } + constructor(public injector: Injector) { + super(injector); + } + public limitKeys = { + weight: 'sys.config.goods.approvalCarMaxWeight', //整车-核载重量上限 + volume: 'sys.config.goods.approvalCarMaxVolume', //整车-核载体积上限 + piece: 'sys.config.goods.approvalCarMaxPiece', //整车-核载件数上限 + maxDays: 'sys.config.goods.wholeLoadingMaxDays', //整车-计划装货时间上限 + intervalDays: 'sys.config.goods.wholeUnloadingIntervalDays', //计划装、卸货时间间隔 + maxTimes: 'sys.config.goods.wholeLoadingMaxTimes' //整车-多装多卸地点上限 + }; + public limitKeys2 = { + month: 'sys.config.goods.bulkEndMaxMonth', //大宗-截止时间上限 + weight: 'sys.config.goods.bulkMaxWeight', //大宗-重量上限 + volume: 'sys.config.goods.bulkMaxVolume', //大宗-体积上限 + trainNumber: 'sys.config.goods.bulkMaxTrainNumber', //大宗-车次上限 + freight: 'sys.config.goods.bulkMaxUnitFreight' //大宗-运费单价上限 + }; + // 根据ItemKey获取项值 + public $api_findItemValueByItemKeys = '/api/mdc/pbc/sysConfigItem/findItemValueByItemKeys'; + // 获取保价费信息 + public $api_getWholeInsuranceInfo = '/api/sdc/goodsResourceShipper/getWholeInsuranceInfo'; + // 下载导入货源模板-运营后台 + public $api_exportGoodsResourceOperateTemplate = '/api/sdc/uploadGoodsResource/exportGoodsResourceOperateTemplate'; + // 导入货源-运营后台 + public $api_goodsResourceOperateImport = '/api/sdc/uploadGoodsResource/goodsResourceOperateImport'; + // 下载失败数据-运营后台 + public $api_getFailUploadGoodsOperateResource = '/api/sdc/uploadGoodsResource/getFailUploadGoodsOperateResource'; + // 根据货主ID查询网络货运人信息 + public $api_getNetworkTransporter = '/api/mdc/cuc/enterpriseInfo/operate/getNetworkTransporter'; + $api_verify_vehicle_status = `/api/sdc/goodsResourceShipper/saveVerify`; // 发布货源校验司机/车队长的状态 + $api_get_sys_config = `/api/mdc/pbc/sysConfigItem/findConfigValues`; // 根据项key、业务id获取配置信息 + // 获取指派熟车列表 + $api_getListCars = '/api/mdc/cuc/enterpriseVehicle/getPracticeCarList'; + // 异步导出运营后台大宗货源列表 + $api_asyncExportBulkList = '/api/sdc/goodsResourceOperate/asyncExportBulkList'; + // 异步导出运营后台整车货源列表 + $api_asyncExportWholeList = '/api/sdc/goodsResourceOperate/asyncExportWholeList'; + // 根据货主ID查询合同签署属性 + public $api_getContractAtr = '/api/mdc/cuc/enterpriseInfo/cargoOwner/getContractAtr'; + // 发送邀请司机短信 + $api_send_msg_code = `/api/mdc/pbc/smsSend/sendInviteDriver`; + + // 校验货物名称是否合规 + $api_checkGoodsName = '/api/sdc/goodsResourceShipper/checkGoodsName'; + + getDictByKey(dictKey: string) { + const params = { dictKey: dictKey }; + return this.request(this.$api_getDictValue, params); + } +} diff --git a/src/app/routes/supply-management/supply-management-routing.module.ts b/src/app/routes/supply-management/supply-management-routing.module.ts new file mode 100644 index 00000000..c3eb4ba2 --- /dev/null +++ b/src/app/routes/supply-management/supply-management-routing.module.ts @@ -0,0 +1,38 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-03 11:10:14 + * @LastEditors : Shiming + * @LastEditTime : 2022-02-10 14:39:00 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\supply-management-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { SupplyManagementAddDriversComponent } from './components/add-drivers/add-drivers.component'; +import { SupplyManagementBulkDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { SupplyManagementBulkPublishComponent } from './components/bulk-publish/bulk-publish.component'; +import { SupplyManagementBulkReleasePublishComponent } from './components/bulk-release-publish/bulk-release-publish.component'; +import { SupplyManagementIndexComponent } from './components/index/index.component'; +import { SupplyManagementOnecarPublishComponent } from './components/onecar-publish/onecar-publish.component'; +import { SupplyManagementReleasePublishComponent } from './components/release-publish/release-publish.component'; +import { SupplyManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; + +const routes: Routes = [ + { path: 'index', component: SupplyManagementIndexComponent }, + { path: 'index/bulk-detail/:id', component: SupplyManagementBulkDetailComponent }, + { path: 'index/vehicle-detail/:id', component: SupplyManagementVehicleDetailComponent }, + { path: 'add-drivers', component: SupplyManagementAddDriversComponent }, + { path: 'vehicle-amend/:id', component: SupplyManagementOnecarPublishComponent }, + { path: 'vehicle-release', component: SupplyManagementReleasePublishComponent }, + { path: 'bulk-release', component: SupplyManagementBulkReleasePublishComponent }, + { path: 'bulk-amend/:id', component: SupplyManagementBulkPublishComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SupplyManagementRoutingModule {} diff --git a/src/app/routes/supply-management/supply-management.module.ts b/src/app/routes/supply-management/supply-management.module.ts new file mode 100644 index 00000000..63ee9e26 --- /dev/null +++ b/src/app/routes/supply-management/supply-management.module.ts @@ -0,0 +1,73 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-20 10:13:02 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-07 15:59:05 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\supply-management\\supply-management.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; +import { ParterRebateManageMenRecordDetailComponent } from '../partner/rebate-management/model/record-detail/record-detail.component'; +import { CarAddDriverComponent } from './components/add-driver/add-driver.component'; +import { SupplyManagementAddDriversComponent } from './components/add-drivers/add-drivers.component'; +import { CarAddmodalComponent } from './components/addmodal/addmodal.component'; +import { SupplyManagementVehicleAssignedCarComponent } from './components/assigned-car/assigned-car.component'; +import { SupplyManagementBulkDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { SupplyManagementBulkPublishComponent } from './components/bulk-publish/bulk-publish.component'; +import { SupplyManagementBulkReleasePublishComponent } from './components/bulk-release-publish/bulk-release-publish.component'; +import { SupplyManagementBulkComponent } from './components/bulk/bulk.component'; +import { PublishchooseFamifiarAddComponent } from './components/choose-famifiar/add/add.component'; +import { PublishGoodsChooseFamifiarComponent } from './components/choose-famifiar/choose-famifiar.component'; +import { PublishchooseFamifiarSetCaptainComponent } from './components/choose-famifiar/set-captain/set-captain.component'; +import { SupplyManagementIndexComponent } from './components/index/index.component'; +import { PublishAddressListComponent } from './components/onecar-publish/address-list/address-list.component'; +import { SupplyManagementOnecarPublishComponent } from './components/onecar-publish/onecar-publish.component'; +import { PublishSuccessComponent } from './components/onecar-publish/publish-success/publish-success.component'; +import { SupplyManagementQrcodePageComponent } from './components/qrcode-page/qrcode-page.component'; +import { SupplyManagementReleasePublishComponent } from './components/release-publish/release-publish.component'; +import { TranAgreementComponent } from './components/tran-agreement/tran-agreement.component'; +import { SupplyManagementUpdateExternalSnComponent } from './components/update-external-sn/update-external-sn.component'; +import { SupplyManagementUpdateFreightComponent } from './components/update-freight/update-freight.component'; +import { SupplyManagementUpdatePriceComponent } from './components/update-price/update-price.component'; +import { SupplyManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; +import { SupplyManagementVehicleComponent } from './components/vehicle/vehicle.component'; +import { SupplyManagementImportSupplyComponent } from './model/import-supply/import-supply.component'; +import { SupplyManagementRoutingModule } from './supply-management-routing.module'; + +const COMPONENTS: Type[] = [ + SupplyManagementIndexComponent, + SupplyManagementBulkComponent, + SupplyManagementVehicleComponent, + SupplyManagementUpdatePriceComponent, + SupplyManagementUpdateFreightComponent, + SupplyManagementVehicleAssignedCarComponent, + SupplyManagementQrcodePageComponent, + SupplyManagementUpdateExternalSnComponent, + SupplyManagementVehicleDetailComponent, + SupplyManagementAddDriversComponent, + SupplyManagementOnecarPublishComponent, + PublishGoodsChooseFamifiarComponent, + PublishchooseFamifiarSetCaptainComponent, + PublishchooseFamifiarAddComponent, + SupplyManagementBulkPublishComponent, + PublishAddressListComponent, + PublishSuccessComponent, + CarAddDriverComponent, + CarAddmodalComponent, + SupplyManagementBulkDetailComponent, + SupplyManagementReleasePublishComponent, + SupplyManagementBulkReleasePublishComponent, + TranAgreementComponent, + SupplyManagementImportSupplyComponent, + ParterRebateManageMenRecordDetailComponent +]; + +@NgModule({ + imports: [SharedModule, SupplyManagementRoutingModule], + declarations: COMPONENTS +}) +export class SupplyManagementModule {} diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html new file mode 100644 index 00000000..17d718f0 --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html @@ -0,0 +1,41 @@ + + + +
    +
    +
      +
    • + {{ item.agreementName }} +
    • +
    +
    +
    + +
    + {{ tabItem.agreementName }} + +
    +
    + 更新时间: {{ tabItem.modifyTime }} + 预览 + +
    +
    +
    + + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less new file mode 100644 index 00000000..0e059770 --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less @@ -0,0 +1,90 @@ +:host { + // [nz-menu] { + // float: left; + // width: 254px; + // min-height: 810px; + // } + ::ng-deep { + .ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { + font-weight: 500; + } + + .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + // background: transparent; + } + .ant-menu-inline .ant-menu-item::after { + border-right: none; + } + .ant-menu-item-selected { + background: transparent; + } + .ant-menu-inline .ant-menu-submenu-title { + margin: 0; + } + .console-menu-icon { + width: 20px; + } + .console-menu-title { + margin-left: 9px; + vertical-align: middle; + } + .ant-menu-item:focus { + outline: none !important; + } + .tabset-container { + height: 450px; + margin-top: 16px; + overflow-y: auto; + } + } + h3 { + margin-left: 15px; + padding: 8px 15px; + font-weight: 700; + } + .times { + display: inline-block; + padding-right: 15px; + } + .width100 { + width: 100px; + margin: 0 5px; + } + .width200 { + width: 200px; + margin: 0 5px; + } + .sales-order { + margin-left: 15px; + padding: 8px 40px; + font-size: 18px; + } + .general-box { + height: 750px; + overflow: auto; + } + .card-height { + height: 800px; + } + .btn-right { + float: right; + } + .save-btn { + width: 100%; + text-align: right; + } + .ant-menu-vertical .ant-menu-item::after, + .ant-menu-vertical-left .ant-menu-item::after, + .ant-menu-vertical-right .ant-menu-item::after, + .ant-menu-inline .ant-menu-item::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + border-right: 3px solid #202886; + content: ''; + } + .but_rigth { + margin-left: 16% !important; + } +} diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts new file mode 100644 index 00000000..8f0ff5b8 --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { SystemService } from '../../services/system.service'; +@Component({ + selector: 'app-agreement-config-components-base', + styleUrls: ['./agreement-config.component.less'], + templateUrl: './agreement-config.component.html' +}) +export class AgreementConfigComponentsBaseComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + isUpdate = false; + tabItem: any = {}; + tabs: any[] = []; + + constructor(private service: SystemService) {} + + ngOnInit() { + this.loadAgreement(); + this.initSF(); + } + + initSF(data?: any) { + this.schema1 = { + properties: { + content: { + type: 'string', + title: '', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 650 + } + }, + default: data?.agreementContent || '' + } + } + }; + } + + changeType(item: any): void { + this.isUpdate = false; + this.tabItem = item; + } + + loadAgreement(type?: number) { + this.service.request(`${this.service.$api_get_agreement_page}`, { pageIndex: 1, pageSize: 99 }).subscribe(res => { + if (res) { + res.records = res.records.map((item: any) => ({ ...item, agreementContent: decodeURIComponent(item.agreementContent) })); + this.tabs = res.records; + if (type) { + this.tabItem = res.records.find((i: any) => i.type === type); + } else { + this.tabItem = res.records?.[0]; + } + } + }); + } + + update() { + this.isUpdate = true; + this.initSF(this.tabItem); + } + save() { + const params = { + id: this.tabItem.id, + agreementContent: encodeURIComponent(this.sf?.value.content), + type: this.tabItem.type, + agreementName: this.tabItem.agreementName + }; + this.isUpdate = false; + this.service.request(`${this.service.$api_update_agreement}`, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.isUpdate = false; + this.loadAgreement(this.tabItem.type); + } + }); + } + + cancel() { + this.isUpdate = false; + } +} diff --git a/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.html b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.html new file mode 100644 index 00000000..e70f7e38 --- /dev/null +++ b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.html @@ -0,0 +1,66 @@ + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + 客户 + 供应商 +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.less b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.ts b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.ts new file mode 100644 index 00000000..74ea33fd --- /dev/null +++ b/src/app/routes/sys-setting/components/announcement-message/announcement-message.component.ts @@ -0,0 +1,257 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFRadioWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { EAEnvironmentService, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-sys-setting-components-announcement-message', + templateUrl: './announcement-message.component.html', + styleUrls: ['./announcement-message.component.less'] +}) +export class AnnouncementMessageComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData :any; + isVisible = false; + edit = false; + editId = false; + + columns: STColumn[] = [ + { title: '公告标题', index: 'announcementTitle' }, + { title: '创建时间', index: 'createTime' }, + { title: '发送时间', index: 'sendTime' }, + { title: '公告内容', index: 'announcementContent' }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item, 2) + }, + { + text: '删除', + click: item => this.deleteAction(item) + }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams (){ + return { + ...this.sf?.value, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }}; + + constructor( + public service: SystemService, + private nzModalService: NzModalService, + public shipperservice: ShipperBaseService, + private envSrv: EAEnvironmentService, + ) {} + + ngOnInit(): void { + this.initSF() + this.initSFFre() + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF(){ + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + announcementTitle: { + type: 'string', + title: '按钮名称', + ui: { placeholder: '请输入' } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + } as SFDateWidgetSchema + }, + } + + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + appIdList: { + type: 'string', + title: '发布平台', + enum: [ + { label: '运营后台', value: this.envSrv.env.appId }, + // { label: '货主后台', value: this.envSrv.env.HzappId }, + // { label: '司机端', value: this.envSrv.env.sjappId } + ], + ui: { + widget: 'select', + mode: 'multiple', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + announcementTitle: { + type: 'string', + title: '公告标题', + ui: { placeholder: '请输入' } + }, + announcementContent: { + type: 'string', + title: '公告内容', + ui: { placeholder: '请输入' } + }, + sendTime: { + title: '发送时间', + type: 'string', + format: 'date-time', + ui: { + allowClear: true, + } + }, + }, + required: ['name', 'i18n', 'text'] + }; +this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; +} + roleAction(value: any,item?: any) { + if(item === 1) { + this.edit = false; + this.editText = '新增'; + this.formData = {}; + } else { + this.service.request(this.service.$api_getAnnouncementInfoById_detail, {id: value.id}).subscribe((res: any) => { + console.log(res) + if(res) { + this.formData = res; + } + }) + this.edit = true; + this.editId = value.id; + this.editText = '编辑'; + } + this.isVisible = true; + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_delete_deleteAnnouncementInfoById, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + handleCancel() { + this.isVisible = false + } + + handleOK() { + console.log(this.sfFre.value) + if(!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!') + return + } + var c = new Date(this.sfFre.value.sendTime); + this.sfFre.value.sendTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + const params ={ + ...this.sfFre.value + } + if(this.editId) { + params.id = this.editId + console.log(params) + this.service.request(this.service.$api_modifyAnnouncementInfo, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } + }) + } else { + this.service.request(this.service.$api_addAnnouncementInfo, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } + } + )} +} + addPreZero(num: any) { + if (num < 10) { + return '0' + num; + } else { + return num; + } + } +} diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html new file mode 100644 index 00000000..0025c730 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html @@ -0,0 +1,25 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less new file mode 100644 index 00000000..80d9010f --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: -40px; +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts new file mode 100644 index 00000000..ced52980 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts @@ -0,0 +1,128 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STChange, STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { AuditResonConfigActionModalComponent } from './audit-reson-config-action-modal/audit-reson-config-action-modal.component'; + +@Component({ + selector: 'app-audit-reason-config', + templateUrl: './audit-reason-config.component.html', + styleUrls: ['./audit-reason-config.component.less'] +}) +export class AuditReasonConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '审核类型', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + }, + phone: { + type: 'string', + title: '驳回理由', + ui: { placeholder: '请输入' } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '操作时间', index: 'updatedAt', type: 'date' }, + { title: '操作人', index: 'description' }, + { title: '操作人手机号码', index: 'description' }, + { title: '操作页面', index: 'description' }, + { title: '操作内容', index: 'description' }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.reasonAction(item) + }, + { + text: '删除', + click: item => this.deleteReason(item) + } + ] + } + ]; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void {} + + reasonAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: AuditResonConfigActionModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: 1, name: '车辆审核', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deleteReason(item: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html new file mode 100644 index 00000000..beead4d9 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
    + + +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.less b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts new file mode 100644 index 00000000..ea2449a9 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts @@ -0,0 +1,94 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-audit-reson-config-action-modal', + templateUrl: './audit-reson-config-action-modal.component.html', + styleUrls: ['./audit-reson-config-action-modal.component.less'] +}) +export class AuditResonConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + constructor(private modal: NzModalRef, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '选择审核类型', + type: 'string', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.name = i; + this.sf?.setValue('/name', i); + } + }, + default: staff.name + }, + phone: { + title: '驳回理由', + type: 'string', + ui: { placeholder: '请输入', widget: 'textarea', autosize: { minRows: 2, maxRows: 6 } }, + default: staff.phone + } + }, + required: ['name'] + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleId, + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleId, + telephone: this.i.telephone + }; + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html new file mode 100644 index 00000000..beead4d9 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
    + + +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.less b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts new file mode 100644 index 00000000..0b999760 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-basic-config-action-modal', + templateUrl: './basic-config-action-modal.component.html', + styleUrls: ['./basic-config-action-modal.component.less'] +}) +export class BasicConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + constructor(private modal: NzModalRef,public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '配置类型', + type: 'string', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.name = i; + this.sf?.setValue('/name', i); + } + }, + default: staff.name + }, + phone: { + title: '配置项', + type: 'string', + ui: { placeholder: '请输入' }, + default: staff.phone + }, + roleId: { + type: 'string', + title: '启用状态', + enum: [ + { label: '启用', value: 1 }, + { label: '停用', value: 0 } + ], + ui: { + widget: 'radio' + } as SFRadioWidgetSchema, + default: staff?.roleId || 1 + } + }, + required: ['name', 'phone', 'roleId'] + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleId, + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleId, + telephone: this.i.telephone + }; + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.html b/src/app/routes/sys-setting/components/basic-config/basic-config.component.html new file mode 100644 index 00000000..3840d334 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.html @@ -0,0 +1,26 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.less b/src/app/routes/sys-setting/components/basic-config/basic-config.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts b/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts new file mode 100644 index 00000000..2d1838b5 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts @@ -0,0 +1,129 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { BasicConfigActionModalComponent } from './basic-config-action-modal/basic-config-action-modal.component'; + +@Component({ + selector: 'app-basic-config', + templateUrl: './basic-config.component.html', + styleUrls: ['./basic-config.component.less'] +}) +export class BasicConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + receiveName: { + title: '配置类型', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择', + // asyncData: () => { + // return this.service.request(this.service.$api_getAppRoleList).pipe( + // map((res: any) => { + // this.roleList = res; + // return res.map((item: any) => { + // return { label: item.roleName, value: item.id }; + // }); + // }), + // ); + // }, + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + } + } + }; + + columns: STColumn[] = [ + { title: '配置类型', index: 'no' }, + { title: '配置项', index: 'description' }, + { + title: '启用状态', + className: 'text-center', + index: 'status', + type: 'badge', + badge: { + 0: { text: '启用', color: 'success' }, + 2: { text: '停用', color: 'error' }, + 3: { text: '停用', color: 'error' }, + 1: { text: '停用', color: 'error' } + } + }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.configAction(item) + }, + { + text: '停用', + click: item => this.deactivateConfig(item) + } + ] + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + configAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: BasicConfigActionModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: 1, name: '车辆审核', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deactivateConfig(item?: any) { + this.nzModalService.error({ + nzTitle: '确认停用?', + nzContent: ``, + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.html b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.html new file mode 100644 index 00000000..9cd465f6 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.html @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.less b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.less new file mode 100644 index 00000000..8e398b39 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.less @@ -0,0 +1,27 @@ +:host { + ::ng-deep { + .card-height { + min-height: 600px; + } + + .save-btn { + width : 100%; + text-align: right; + } + + .block-radio { + display : flex; + min-height: 32px; + } + + input { + width : 100px; + margin-left: 10px; + } + + .ant-form-item-control-input-content { + display: flex; + } + } + +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.ts b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.ts new file mode 100644 index 00000000..e765f3dc --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-setting/basic-setting.component.ts @@ -0,0 +1,74 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-01-25 13:10:49 + * @LastEditors : Shiming + * @LastEditTime : 2022-01-26 17:45:11 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\sys-setting\\components\\basic-setting\\basic-setting.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-basic-setting', + templateUrl: './basic-setting.component.html', + styleUrls: ['./basic-setting.component.less'] +}) +export class BasicSettingComponent implements OnInit { + tabs: any[] = []; + selectedTab: any = null; + labelWidth = 250; + configList: any = []; + constructor(public service: SystemService) {} + + ngOnInit() { + this.getTypeList(); + } + + getTypeList() { + this.service.request(this.service.$api_get_config_tree, { configFullKey: 'sys.config', extendType: 0 }).subscribe((res: Array) => { + if (res?.length > 0) { + const typeData = res.find(config => config.configFullKey === 'sys.config'); + if (typeData) { + this.tabs = typeData?.children; + this.selectedTab = typeData?.children?.[0]; + this.getConfigList(this.selectedTab); + } + } + }); + } + + getConfigList(selectedTab: any) { + this.selectedTab = selectedTab; + this.service.request(this.service.$api_get_config_by_parent_id, { id: selectedTab?.id }).subscribe((res: Array) => { + if (res?.length > 0) { + res = res.map(item => ({ + ...item, + remark: item.remark ? JSON.parse(item.remark) : null, + itemValue: item?.itemValue ? (item?.itemType !== 8 ? JSON.parse(item?.itemValue) : item?.itemValue) : item?.itemValue, + itemData: item.itemData ? JSON.parse(item.itemData) : item.itemData + })); + const hiddenType = res.find(item => item.itemType === 7 || item.itemType === 999); + this.labelWidth = hiddenType ? 0 : 250; + this.configList = res; + } else { + this.configList = []; + } + }); + } + + saveAction(params: any) { + this.service.request(this.service.$api_update_config_batch, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改配置成功'); + setTimeout(() => { + this.getConfigList(this.selectedTab); + }, 100); + } + }); + } +} diff --git a/src/app/routes/sys-setting/components/btn-management/btn-management.component.html b/src/app/routes/sys-setting/components/btn-management/btn-management.component.html new file mode 100644 index 00000000..ccccdef8 --- /dev/null +++ b/src/app/routes/sys-setting/components/btn-management/btn-management.component.html @@ -0,0 +1,80 @@ + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + 客户 + 供应商 +
    +
    +
    +
    + + + + + + + + + + diff --git a/src/app/routes/sys-setting/components/btn-management/btn-management.component.less b/src/app/routes/sys-setting/components/btn-management/btn-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/btn-management/btn-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/btn-management/btn-management.component.ts b/src/app/routes/sys-setting/components/btn-management/btn-management.component.ts new file mode 100644 index 00000000..e2350c92 --- /dev/null +++ b/src/app/routes/sys-setting/components/btn-management/btn-management.component.ts @@ -0,0 +1,200 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-sys-setting-components-btn-management', + templateUrl: './btn-management.component.html', + styleUrls: ['./btn-management.component.less'] +}) +export class BtnManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editcode = ''; + formData :any; + isVisible = false; + edit = false; + editId = false; + + columns: STColumn[] = [ + { title: '按钮名称', index: 'name' }, + { title: 'i18n', index: 'i18n' }, + { title: '创建时间', index: 'createTime' }, + { title: '按钮编码', index: 'code' }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item, 2) + }, + { + text: '删除', + click: item => this.deleteAction(item) + }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams (){ + return { + ...this.sf?.value, + }}; + + constructor( + public service: SystemService, + private nzModalService: NzModalService, + public shipperservice: ShipperBaseService, + ) {} + + ngOnInit(): void { + this.initSF() + this.initSFFre() + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF(){ + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + name: { + type: 'string', + title: '按钮名称', + ui: { placeholder: '请输入' } + }, + } + + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + name: { + type: 'string', + title: '按钮名称', + ui: { placeholder: '请输入' } + }, + i18n: { + type: 'string', + title: 'i18n', + ui: { placeholder: '请输入' } + }, + code: { + title: '按钮编码', + type: 'string', + ui: { + placeholder: '请输入', + } + }, + }, + required: ['name', 'i18n', 'code'] + }; +this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; +} + roleAction(value: any,item?: any) { + if(item === 1) { + this.edit = false; + this.editcode = '新增'; + this.formData = {}; + } else { + this.service.request(this.service.$api_getButtonInfo_one, {id: value.id}).subscribe((res: any) => { + console.log(res) + if(res) { + this.formData = res; + } + }) + this.edit = true; + this.editId = value.id; + this.editcode = '编辑'; + } + this.isVisible = true; + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_deletebatchButton, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + handleCancel() { + this.isVisible = false + } + + handleOK() { + console.log(this.sfFre.value) + if(!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!') + return + } + const params ={ + ...this.sfFre.value + } + if(this.editId) { + params.id = this.editId + } + this.service.request(this.service.$api_saveButtonInfo, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } else { + this.service.msgSrv.warning(res?.msg) + + } + }) + } +} diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html new file mode 100644 index 00000000..4e4ed373 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
    + + +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.less b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts new file mode 100644 index 00000000..86e436fd --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts @@ -0,0 +1,146 @@ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFStringWidgetSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-cart-config-action-modal', + templateUrl: './cart-config-action-modal.component.html', + styleUrls: ['./cart-config-action-modal.component.less'] +}) +export class CartConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + @Input() + configType: number = 1; + dictKey = ''; + constructor(private modal: NzModalRef, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + let option: any = {}; + switch (this.configType) { + case 1: + option = { + title: '车型', + ui: { + placeholder: '请输入' + } + }; + this.dictKey = 'car:model'; + break; + case 2: + option = { + title: '车长', + ui: { + placeholder: '请输入', + addOnAfter: '米' + } as SFStringWidgetSchema + }; + this.dictKey = 'car:length'; + break; + case 3: + option = { + title: '物品名称', + ui: { + placeholder: '请输入' + } + }; + this.dictKey = 'ban.goods.name'; + break; + + default: + break; + } + this.schema = { + properties: { + itemValue: { + ...option, + type: 'string', + default: staff.itemValue + }, + statePaused: { + type: 'string', + title: '状态', + enum: [ + { label: '启用', value: false }, + { label: '停用', value: true } + ], + ui: { + widget: 'radio', + visibleIf: { + itemValue: (value: number) => this.configType !== 3 + } + } as SFRadioWidgetSchema, + default: staff?.statePaused || false + } + }, + required: ['itemValue'] + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + dictKey: this.dictKey, + itemData: this.sf.value.itemValue + }; + this.service.request(this.service.$api_add_dict, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.modal.close(true); + } + }); + } else { + const params: any = { + ...this.i, + ...this.sf.value + }; + this.service.request(this.service.$api_update_dict, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.modal.close(true); + } + }); + } + } + + configAction() { + if (this.i.id === 0) { + const params: any = { + configFullKey: 'ban.goods.name', + name: this.sf.value.itemValue + }; + this.service.request(this.service.$api_add_config_item, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.modal.close(true); + } + }); + } else { + const params: any = { ...this.sf.value, ...this.i, configFullKey: 'ban.goods.name', name: this.sf.value.itemValue }; + this.service.request(this.service.$api_update_config_item, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.modal.close(true); + } + }); + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.html b/src/app/routes/sys-setting/components/cart-config/cart-config.component.html new file mode 100644 index 00000000..c5cfa144 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.html @@ -0,0 +1,31 @@ + + + + + + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.less b/src/app/routes/sys-setting/components/cart-config/cart-config.component.less new file mode 100644 index 00000000..72efc9a9 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + .tabs-wrap>.ant-tabs-nav { + margin-bottom: 0; + } + + h1 { + margin: 0; + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts b/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts new file mode 100644 index 00000000..b7039fb0 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts @@ -0,0 +1,197 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { CartConfigActionModalComponent } from './cart-config-action-modal/cart-config-action-modal.component'; + +@Component({ + selector: 'app-cart-config', + templateUrl: './cart-config.component.html', + styleUrls: ['./cart-config.component.less'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CartConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + tabs = [ + { + name: '车型配置', + type: 1, + isActived: false + }, + { + name: '车长配置', + type: 2, + isActived: false + }, + { + name: '禁限物品名单', + type: 3, + isActived: false + } + ]; + tabType = 1; + + searchSchema: SFSchema = { + properties: { + tabType: { + type: 'number', + ui: { + hidden: true + } + }, + params1: { + title: '车型', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 1 + } + } + }, + params2: { + title: '车长', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 2 + } + } + }, + params3: { + title: '物品名称', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 3 + } + } + } + } + }; + + columns: STColumn[] = [ + { title: '车型', index: 'itemValue', iif: () => this.tabType === 1 }, + { title: '车长', index: 'itemValue', iif: () => this.tabType === 2 }, + { title: '物品名称', index: 'name', iif: () => this.tabType === 3 }, + { + title: '启用状态', + className: 'text-center', + iif: () => this.tabType !== 3, + index: 'statePaused', + type: 'badge', + badge: { + false: { text: '启用', color: 'success' }, + true: { text: '禁用', color: 'error' } + } + }, + { + title: '创建时间', + index: 'modifyTime', + type: 'date' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.configAction(item) + }, + { + text: '删除', + click: item => this.deleteAction(item) + } + ] + } + ]; + + loading = true; + constructor(public service: SystemService, private nzModalService: NzModalService, private cdr: ChangeDetectorRef) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + let params = {}; + switch (this.tabType) { + case 1: + Object.assign(params, { dictKey: 'car:model', itemValue: this.sf?.value.params1 }); + break; + case 2: + Object.assign(params, { dictKey: 'car:length', itemValue: this.sf?.value.params2 }); + break; + case 3: + Object.assign(params, { configFullKey: 'ban.goods.name', name: this.sf?.value.params3 }); + break; + + default: + break; + } + Object.assign(requestOptions.body, params); + this.loading = true; + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + this.loading = false; + return data; + }; + + // 切换Tab + changeTab(item: any) { + this.tabType = item.type; + this.sf?.setValue('/tabType', item.type); + this.sf?.reset(); + // this.tabs.forEach(i => (i.isActived = false)); + // item.isActived = !item.isActived; + this.st.load(1); + this.st.resetColumns(); + // this.cdr.detectChanges(); + } + + configAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: CartConfigActionModalComponent, + nzComponentParams: item + ? { i: { ...item, itemValue: item.name }, configType: this.tabType } + : { i: { id: 0 }, configType: this.tabType }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + this.cdr.detectChanges(); + } + }); + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service + .request(this.tabType === 3 ? this.service.$api_remove_config_item : this.service.$api_delete_dict_by_ids, [item.id]) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('删除配置成功'); + this.st.load(1); + } + }); + } + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/close-account/close-account.component.html b/src/app/routes/sys-setting/components/close-account/close-account.component.html new file mode 100644 index 00000000..ac4baf2e --- /dev/null +++ b/src/app/routes/sys-setting/components/close-account/close-account.component.html @@ -0,0 +1,66 @@ + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + +
    +
    + +
    +
    + + +
    + 客户 + 供应商 +
    +
    +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/close-account/close-account.component.less b/src/app/routes/sys-setting/components/close-account/close-account.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/close-account/close-account.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/close-account/close-account.component.ts b/src/app/routes/sys-setting/components/close-account/close-account.component.ts new file mode 100644 index 00000000..0826ae0c --- /dev/null +++ b/src/app/routes/sys-setting/components/close-account/close-account.component.ts @@ -0,0 +1,248 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-close-account', + templateUrl: './close-account.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class CloseAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData :any; + isVisible = false; + edit = false; + editId = false; + + columns: STColumn[] = [ + { title: '结算客户名称', index: 'customerName' }, + { title: '结算客户编码', index: 'customerCode' }, + { title: '网络货运人', index: 'networkTransporterName' }, + { title: '货主名称', index: 'enterpriseName' }, + { title: '客户编码', index: 'crmCustomerCode' }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item, 2) + }, + { + text: '删除', + click: item => this.deleteAction(item) + }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams (){ + return { + ...this.sf?.value, + }}; + + constructor( + public service: SystemService, + private nzModalService: NzModalService, + public shipperservice: ShipperBaseService, + ) {} + + ngOnInit(): void { + this.initSF() + this.initSFFre() + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF(){ + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + customerName: { + type: 'string', + title: '结算客户名称', + ui: { placeholder: '请输入' } + }, + customerCode: { + type: 'string', + title: '结算客户编码', + ui: { placeholder: '请输入' } + }, + networkTransporterId: { + title: '网络货运人', + type: 'string', + ui: { + placeholder: '请选择', + widget: 'select', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + } + }, + enterpriseName: { + type: 'string', + title: '货主名称', + ui: { placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value + } } + }, + } + + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + customerName: { + type: 'string', + title: '结算客户名称', + ui: { placeholder: '请输入' } + }, + customerCode: { + type: 'string', + title: '结算客户编码', + ui: { placeholder: '请输入' } + }, + networkTransporterId: { + title: '网络货运人', + type: 'string', + ui: { + placeholder: '请选择', + widget: 'select', + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + } + }, + enterpriseId: { + title: '货主', + type: 'string', + maxLength: 30, + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + onSearch: (q: any) => { + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str}) + .pipe(map((res: any) => (res as any[]).map((i) => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + } as SFSelectWidgetSchema, + }, + }, + required: ['customerName', 'customerCode', 'networkTransporterId', 'enterpriseId'] + }; +this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; +} + roleAction(value: any,item?: any) { + if(item === 1) { + this.edit = false; + this.editText = '新增'; + this.formData = {}; + } else { + this.service.request(this.service.$api_settlementCustomer_get, {id: value.id}).subscribe((res: any) => { + console.log(res) + if(res) { + this.formData = res; + } + }) + this.edit = true; + this.editId = value.id; + this.editText = '编辑'; + } + this.isVisible = true; + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_deletebatchButton, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + handleCancel() { + this.isVisible = false + } + + handleOK() { + console.log(this.sfFre.value) + if(!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!') + return + } + const params ={ + ...this.sfFre.value + } + if(this.editId) { + params.id = this.editId + } + this.service.request(this.service.$api_settlementCustomer_save, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } else { + this.service.msgSrv.warning(res?.msg) + + } + }) + } +} diff --git a/src/app/routes/sys-setting/components/crm-management/crm-management.component.html b/src/app/routes/sys-setting/components/crm-management/crm-management.component.html new file mode 100644 index 00000000..af91a30c --- /dev/null +++ b/src/app/routes/sys-setting/components/crm-management/crm-management.component.html @@ -0,0 +1,52 @@ + + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + 客户 + 供应商 +
    +
    +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/crm-management/crm-management.component.less b/src/app/routes/sys-setting/components/crm-management/crm-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/crm-management/crm-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/crm-management/crm-management.component.ts b/src/app/routes/sys-setting/components/crm-management/crm-management.component.ts new file mode 100644 index 00000000..7202b549 --- /dev/null +++ b/src/app/routes/sys-setting/components/crm-management/crm-management.component.ts @@ -0,0 +1,205 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-crm-management', + templateUrl: './crm-management.component.html', + styleUrls: ['./crm-management.component.less'] +}) +export class CrmManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData :any; + isVisible = false; + edit = false; + editId = false; + + columns: STColumn[] = [ + { title: '客户名称', index: 'customerName' }, + { title: '客户简称', index: 'customerShortName' }, + { title: '客户编码', index: 'customerCode' }, + { + title: '操作', + className: 'text-left', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item, 2), + acl: { ability: ['SYSTEM-CRM-edit'] }, + }, + { + text: '删除', + click: item => this.deleteAction(item), + acl: { ability: ['SYSTEM-CRM-delete'] }, + }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams (){ + return { + ...this.sf?.value, + }}; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void { + this.initSF() + this.initSFFre() + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF(){ + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + customerName: { + type: 'string', + title: '客户名称', + ui: { placeholder: '请输入' } + }, + customerShortName: { + type: 'string', + title: '客户简称', + ui: { placeholder: '请输入' } + }, + customerCode: { + type: 'string', + title: '客户编码', + ui: { placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value + } } + }, + } + + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 12, gutter: 4 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + customerName: { + type: 'string', + title: '客户名称', + ui: { placeholder: '请输入' } + }, + customerShortName: { + type: 'string', + title: '客户简称', + ui: { placeholder: '请输入' } + }, + customerCode: { + type: 'string', + title: '客户编码', + ui: { placeholder: '请输入' } + }, + }, + required: ['customerName', 'customerShortName', 'customerCode'] + }; +this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; +} + roleAction(value: any,item?: any) { + if(item === 1) { + this.edit = false; + this.editText = '新增'; + this.formData = {}; + } else { + this.service.request(this.service.$api_get_crmCustomer, {id: value.id}).subscribe((res: any) => { + console.log(res) + if(res) { + this.formData = res; + } + }) + this.edit = true; + this.editId = value.id; + this.editText = '编辑'; + } + this.isVisible = true; + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_deletebatch_crmCustomer, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + handleCancel() { + this.isVisible = false + } + + handleOK() { + console.log(this.sfFre.value) + if(!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!') + return + } + const params ={ + ...this.sfFre.value + } + if(this.editId) { + params.id = this.editId + } + this.service.request(this.service.$api_save_crmCustomer, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } else { + this.service.msgSrv.warning(res?.msg) + + } + }) + } +} diff --git a/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.html b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.html new file mode 100644 index 00000000..db84f3c8 --- /dev/null +++ b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.html @@ -0,0 +1,75 @@ + + + + +
    +
    + + +
    + + +
    + +
      +
    • 编辑
    • +
    • 上移
    • +
    • 下移
    • +
    • 删除
    • +
    +
    +
    +
    + +
    + + +
    +
    +
    + +
    +
    + + + + + + +
    + + +
    +
    + +
    + + + +
    +
    + + + +
    +
    +
    + + +
    +
    + + {{selectedType?.name}} + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.less b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.less new file mode 100644 index 00000000..48111074 --- /dev/null +++ b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.less @@ -0,0 +1,11 @@ +:host::ng-deep { + .ant-list-items { + max-height: 600px; + overflow : auto; + } +} + +.select-type { + color : #1890ff; + background-color: rgb(230 247 255); +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.ts b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.ts new file mode 100644 index 00000000..4806f3d7 --- /dev/null +++ b/src/app/routes/sys-setting/components/goods-name-config/goods-name-config.component.ts @@ -0,0 +1,238 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-goods-name-config', + templateUrl: './goods-name-config.component.html', + styleUrls: ['./goods-name-config.component.less'] +}) +export class GoodsNameConfigComponent implements OnInit { + @ViewChild('configTypeModal', { static: true }) + configTypeModal: any; + @ViewChild('configTypeItemModal', { static: true }) + configTypeItemModal: any; + @ViewChild('st', { static: true }) + st!: STComponent; + typeList: any[] = []; + selectedType: any = null; + parentId = null; + + columns: STColumn[] = [ + { title: '货物名称', index: 'name' }, + { title: '更新时间', index: 'modifyTime' }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.typeItemAction(item) + }, + { + text: '上移', + click: item => this.sortTypeItem(item, 3) + }, + { + text: '下移', + click: item => this.sortTypeItem(item, 4) + }, + { + text: '删除', + click: item => this.removeTypeItem(item) + } + ] + } + ]; + + configTypeName = ''; + configTypeItemName = ''; + searchName = ''; + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void { + this.getTypeList(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + configId: this.selectedType?.id + }); + if (this.searchName) { + Object.assign(requestOptions.body, { + name: this.searchName + }); + } + return requestOptions; + }; + + keydownEvent(event: any) { + if (event.keyCode === 13) { + this.st.load(1); + } + } + + getTypeList() { + this.service.request(this.service.$api_get_config_tree, { configFullKey: 'goods.name.config' }).subscribe((res: Array) => { + if (res?.length > 0) { + const typeData = res + .find(config => config.configFullKey === 'goods.name.config') + ?.children.find((type: any) => type.configFullKey === 'goods.name.config.type'); + if (typeData) { + this.typeList = typeData.children; + this.parentId = typeData.id; + this.selectedType = typeData.children[0]; + } + } + }); + } + + selectedTypeAction(item: any) { + this.selectedType = item; + this.st.load(1); + } + + /** + * 货物类型操作 + * @param item + */ + typeAction(item?: any) { + this.configTypeName = item?.name || ''; + this.nzModalService.create({ + nzTitle: item ? '编辑' : '新增', + nzContent: this.configTypeModal, + nzOnOk: () => { + if (!this.configTypeName) { + this.service.msgSrv.warning('请填写货物类型'); + return false; + } + if (item) { + this.service.request(this.service.$api_update_config, { ...item, name: this.configTypeName }).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新货物类型成功'); + this.getTypeList(); + } + }); + } else { + this.service.request(this.service.$api_add_config, { name: this.configTypeName, parentId: this.parentId }).subscribe(res => { + if (res) { + this.service.msgSrv.success('新增货物类型成功'); + this.getTypeList(); + } + }); + } + return true; + } + }); + } + + /** + * 货物名称操作 + * @param item + */ + typeItemAction(item?: any) { + this.configTypeItemName = item?.name || ''; + this.nzModalService.create({ + nzTitle: item ? '编辑' : '新增', + nzContent: this.configTypeItemModal, + nzOnOk: () => { + if (!this.configTypeItemName) { + this.service.msgSrv.warning('请填写货物名称'); + return false; + } + if (item) { + this.service.request(this.service.$api_update_config_item, { ...item, name: this.configTypeItemName }).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新货物名称成功'); + this.st.load(1); + } + }); + } else { + this.service + .request(this.service.$api_add_config_item, { + name: this.configTypeItemName, + configId: this.selectedType.id + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('新增货物名称成功'); + this.st.load(1); + } + }); + } + return true; + } + }); + } + + /** + * 删除货物类型 + * @param item + */ + removeType(item: any) { + this.nzModalService.warning({ + nzTitle: '确定删除该货物类型吗?', + nzContent: '分类下含有内容则无法删除,请确认', + nzOnOk: () => { + this.service.request(this.service.$api_remove_config, [item.id]).subscribe(res => { + if (res) { + this.getTypeList(); + this.service.msgSrv.success('删除货物类型成功'); + } + }); + } + }); + } + + /** + * 删除货物名称 + * @param item + */ + removeTypeItem(item: any) { + this.nzModalService.warning({ + nzTitle: '确定删除该货物名称吗?', + nzContent: '删除后不可恢复,谨慎操作', + nzOnOk: () => { + this.service.request(this.service.$api_remove_config_item, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除货物名称成功'); + this.st.load(1); + } + }); + } + }); + } + + /** + * 修改类型排序 + * @param item + * @param sortMode + */ + sortType(item: any, sortMode: 1 | 2 | 3 | 4) { + this.service.request(this.service.$api_update_config_sort, { id: item.id, sortMode }).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新排序成功'); + this.getTypeList(); + } else { + this.service.msgSrv.warning('更新排序失败'); + } + }); + } + + /** + * 修改类型详情排序 + * @param item + * @param sortMode + */ + sortTypeItem(item: any, sortMode: 1 | 2 | 3 | 4) { + this.service.request(this.service.$api_update_config_item_sort, { id: item.id, sortMode }).subscribe(res => { + if (res) { + this.service.msgSrv.success('更新排序成功'); + this.st.load(1); + } else { + this.service.msgSrv.warning('更新排序失败'); + } + }); + } +} diff --git a/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.html b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.html new file mode 100644 index 00000000..0d85c142 --- /dev/null +++ b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.html @@ -0,0 +1,66 @@ + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + 客户 + 供应商 +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.less b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.ts b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.ts new file mode 100644 index 00000000..56d71921 --- /dev/null +++ b/src/app/routes/sys-setting/components/insurance-set/insurance-set.component.ts @@ -0,0 +1,253 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFRadioWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { EAEnvironmentService, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-sys-setting-components-insurance-set', + templateUrl: './insurance-set.component.html', + styleUrls: ['./insurance-set.component.less'] +}) +export class InsuranceSetComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData :any; + isVisible = false; + edit = false; + editId = false; + + columns: STColumn[] = [ + { title: '公告标题', index: 'announcementTitle' }, + { title: '创建时间', index: 'createTime' }, + { title: '发送时间', index: 'sendTime' }, + { title: '公告内容', index: 'announcementContent' }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item, 2) + }, + { + text: '删除', + click: item => this.deleteAction(item) + }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams (){ + return { + ...this.sf?.value, + }}; + + constructor( + public service: SystemService, + private nzModalService: NzModalService, + public shipperservice: ShipperBaseService, + private envSrv: EAEnvironmentService, + ) {} + + ngOnInit(): void { + this.initSF() + this.initSFFre() + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF(){ + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + announcementTitle: { + type: 'string', + title: '按钮名称', + ui: { placeholder: '请输入' } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + } as SFDateWidgetSchema + }, + } + + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + appIdList: { + type: 'string', + title: '发布平台', + enum: [ + { label: '运营后台', value: this.envSrv.env.appId }, + // { label: '货主后台', value: this.envSrv.env.HzappId }, + // { label: '司机端', value: this.envSrv.env.sjappId } + ], + ui: { + widget: 'select', + mode: 'multiple', + errors: { required: '请选择' }, + placeholder: '请选择' + } + }, + announcementTitle: { + type: 'string', + title: '公告标题', + ui: { placeholder: '请输入' } + }, + announcementContent: { + type: 'string', + title: '公告内容', + ui: { placeholder: '请输入' } + }, + sendTime: { + title: '发送时间', + type: 'string', + format: 'date-time', + ui: { + allowClear: true, + } + }, + }, + required: ['name', 'i18n', 'text'] + }; +this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; +} + roleAction(value: any,item?: any) { + if(item === 1) { + this.edit = false; + this.editText = '新增'; + this.formData = {}; + } else { + this.service.request(this.service.$api_getAnnouncementInfoById_detail, {id: value.id}).subscribe((res: any) => { + console.log(res) + if(res) { + this.formData = res; + } + }) + this.edit = true; + this.editId = value.id; + this.editText = '编辑'; + } + this.isVisible = true; + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_delete_deleteAnnouncementInfoById, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功!'); + this.st.reload(1) + } + }) + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + handleCancel() { + this.isVisible = false + } + + handleOK() { + console.log(this.sfFre.value) + if(!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!') + return + } + var c = new Date(this.sfFre.value.sendTime); + this.sfFre.value.sendTime = + c.getFullYear() + + '-' + + this.addPreZero(c.getMonth() + 1) + + '-' + + this.addPreZero(c.getDate()) + + ' ' + + this.addPreZero(c.getHours()) + + ':' + + this.addPreZero(c.getMinutes()) + + ':' + + this.addPreZero(c.getSeconds()); + const params ={ + ...this.sfFre.value + } + if(this.editId) { + params.id = this.editId + console.log(params) + this.service.request(this.service.$api_modifyAnnouncementInfo, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } + }) + } else { + this.service.request(this.service.$api_addAnnouncementInfo, params).subscribe((res:any) => { + if(res) { + this.service.msgSrv.success('保存成功!') + this.isVisible = false + this.st.reload(); + } + } + )} +} + addPreZero(num: any) { + if (num < 10) { + return '0' + num; + } else { + return num; + } + } +} diff --git a/src/app/routes/sys-setting/components/network-freight/network-freight.component.html b/src/app/routes/sys-setting/components/network-freight/network-freight.component.html new file mode 100644 index 00000000..50da782f --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/network-freight.component.html @@ -0,0 +1,132 @@ + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + +
    + +
    + + +
    {{ item?.costRate ? item?.costRate + '%' : '' }}
    +
    + +
    货源单:{{ item?.goodsSurchargeRatio ? item?.goodsSurchargeRatio + '%' : '' }}
    +
    合同单:{{ item?.contractSurchargeRatio ? item?.contractSurchargeRatio + '%' : '' }}
    +
    + +
    {{ item?.ticketEnable ? '已开启' : '未开启' }}
    +
    + +
    {{ item?.insuranceEnable ? '已开启' : '未开启' }}
    +
    + +
    {{ item?.pinganEnable ? '已开启' : '未开启' }}
    +
    + +
    {{ item?.pufaEnable ? '已开启' : '未开启' }}
    +
    + + {{ item?.pinganAccount || '开通子账户' }} + + + {{ item?.pufaAccount || '开通子账户' }} + + +
    {{ item?.invoiceEnable ? '已开启' : '未开启' }}
    +
    + + 开通子账户 + + + 开通子账户 + +
    +
    + + + + + +
    +
    +
      +
    • + {{ item.name }} +
    • +
    +
    +
    + + + + + +
    +
    +
    + + + + +
    diff --git a/src/app/routes/sys-setting/components/network-freight/network-freight.component.less b/src/app/routes/sys-setting/components/network-freight/network-freight.component.less new file mode 100644 index 00000000..efdf7dd2 --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/network-freight.component.less @@ -0,0 +1,31 @@ +:host { + ::ng-deep { + .card-height { + min-height: 600px; + } + + .save-btn { + width : 100%; + text-align: right; + } + + .block-radio { + display : flex; + min-height: 32px; + } + + // input { + // width : 100px; + // margin-left: 10px; + // } + + .ant-form-item-control-input-content { + display: flex; + } + + .text-truncate { + white-space: normal; + } + } + +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/network-freight/network-freight.component.ts b/src/app/routes/sys-setting/components/network-freight/network-freight.component.ts new file mode 100644 index 00000000..72ec17f0 --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/network-freight.component.ts @@ -0,0 +1,706 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { + SFCascaderWidgetSchema, + SFComponent, + SFRadioWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFUISchema +} from '@delon/form'; +import { DynamicSettingModalComponent, SinglepageSettingModalComponent } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map, takeLast } from 'rxjs/operators'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-network-freight-component', + templateUrl: './network-freight.component.html', + styleUrls: ['./network-freight.component.less'] +}) +export class NetworkFreightComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + @ViewChild('sfTicket', { static: false }) sfTicket!: SFComponent; + @ViewChild('sfTax', { static: false }) sfTax!: SFComponent; + @ViewChild('sfNC', { static: false }) sfNC!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + ui3: SFUISchema = {}; + ui4: SFUISchema = {}; + ui5: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + ticketSchema: SFSchema = {}; + TaxSchema: SFSchema = {}; + NCSchema: SFSchema = {}; + _$expand: boolean = false; + taxStatus: boolean = false; + TicketStatus: boolean = true; + NCStatus: boolean = false; + formData: any; + ticketId: any; + ticketItem: any; + formDataTicket: any; + formDataNC: any; + formDataTax: any; + NCID: string = ''; + isVisible = false; + isVisibleTicket = false; + edit = false; + editId = false; + isLoading: boolean = false; + tabs: any[] = [{ name: '开票设置' }, { name: '税务设置' }, { name: 'NC设置' }]; + + columns: STColumn[] = [ + { + title: '公司名称', + width: '180px', + index: 'enterpriseName' + }, + { + title: '纳税人识别号', + width: '180px', + + index: 'taxCode' + }, + { + title: '成立日期', + width: '150px', + index: 'enterpriseRegistrationTime' + }, + { + title: '成本费率', + width: '150px', + render: 'costRate' + }, + { + title: '附加费率', + width: '150px', + render: 'goodsSurchargeRatio' + }, + { + title: '云开票', + width: '150px', + render: 'ticketEnable' + }, + { + title: '保险', + width: '150px', + render: 'insuranceEnable' + }, + { + title: '平安银行', + width: '150px', + render: 'pinganEnable' + }, + { + title: '浦发银行', + width: '150px', + render: 'pufaEnable' + }, + { + title: '平安电子账户', + width: '170px', + render: 'pinganAccountEnable' + }, + { + title: '浦发电子账户', + width: '170px', + render: 'pufaAccountEnable' + }, + { + title: '开票开关', + width: '150px', + render: 'invoiceEnable' + }, + { + title: '操作', + width: '110px', + fixed: 'right', + className: 'text-center', + buttons: [ + { type: 'divider' }, + { + text: '基础设置
    ', + click: item => this.creat(item) + }, + { + text: '财务设置
    ', + click: item => this.ticket(item) + }, + { + text: '充值账户
    ', + click: item => this.settingPay(item) + }, + { + text: '应用设置
    ', + click: item => this.settingApp(item) + }, + + { + text: '系统配置
    ', + click: item => this.settingAction(item) + }, + // { + // text: '合同设置', + // click: item => this.roleAction(item, 2) + // }, + ] + } + ]; + + selectedRows: any[] = []; + + get reqParams() { + return { + ...this.sf?.value + }; + } + + constructor(public service: SystemService, private nzModalService: NzModalService, private router: Router, private ar: ActivatedRoute) {} + + ngOnInit(): void { + this.initSF(); + this.initSFFre(); + // this.initSFTicket(); + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + type: 'string', + title: '公司名称', + ui: { placeholder: '请输入' } + }, + taxCode: { + type: 'string', + title: '纳税人识别号', + ui: { placeholder: '请输入' } + } + } + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFTicket() { + this.ticketSchema = { + properties: { + enterpriseName1: { + type: 'string', + title: '公司名称', + ui: { + widget: 'text' + }, + default: this.ticketItem?.enterpriseName + }, + taxCode2: { + type: 'string', + title: '纳税人识别号', + ui: { + widget: 'text' + }, + default: this.ticketItem?.taxCode + }, + bankName: { + type: 'string', + title: '开户银行', + ui: { placeholder: '请输入' } + }, + bankAccount: { + type: 'string', + title: '银行账号', + ui: { placeholder: '请输入' } + }, + registerAddress: { + type: 'string', + title: '注册地址', + ui: { placeholder: '请输入' } + }, + registerPhone: { + type: 'string', + title: '注册电话', + ui: { placeholder: '请输入' } + }, + taxClassificationVersion: { + type: 'string', + title: '税收分类版本号', + ui: { placeholder: '请输入' } + }, + taxClassificationCode: { + type: 'string', + title: '税收分类编码', + ui: { placeholder: '请输入' } + }, + invoiceTaxRate: { + type: 'number', + title: '发票税率', + ui: { placeholder: '请输入' } + }, + invoiceMaxAmount: { + type: 'number', + title: '发票面额上限', + ui: { placeholder: '请输入' } + }, + payee: { + type: 'string', + title: '收款人', + ui: { placeholder: '请输入' } + }, + reviewer: { + type: 'string', + title: '复核人', + ui: { placeholder: '请输入' } + }, + drawer: { + type: 'string', + title: '开票人', + ui: { placeholder: '请输入' } + }, + senderName: { + type: 'string', + title: '寄件人姓名', + ui: { placeholder: '请输入' } + }, + senderPhone: { + type: 'string', + title: '寄件人电话', + ui: { placeholder: '请输入' } + }, + senderRegionCode: { + type: 'number', + title: '寄件地区', + ui: { + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + asyncData: (node: any, index: any) => { + return new Promise(resolve => { + this.getRegionDetailByCode(node?.regionCode || '').subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1 })); + }, + _ => {}, + () => { + resolve(); + } + ); + }); + } + } as SFCascaderWidgetSchema + }, + senderAddress: { + type: 'string', + title: '详细地址', + ui: { placeholder: '请输入' } + } + }, + required: [ + 'enterpriseName', + 'taxCode', + 'bankName', + 'bankAccount', + 'registerAddress', + 'registerPhone', + 'senderName', + 'senderRegionCode', + 'senderPhone', + 'senderAddress', + 'taxClassificationVersion', + 'taxClassificationCode', + 'invoiceTaxRate', + 'invoiceMaxAmount', + 'payee', + 'reviewer', + 'drawer' + ] + }; + this.ui3 = { + '*': { spanLabelFixed: 150, grid: { span: 24 } }, + $taxClassificationVersion: { spanLabelFixed: 150, grid: { span: 24 } } + }; + } + initSFTax() { + this.TaxSchema = { + properties: { + enterpriseName1: { + type: 'string', + title: '公司名称', + ui: { + widget: 'text' + }, + default: this.ticketItem?.enterpriseName + } + }, + required: ['enterpriseName'] + }; + this.ui4 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSFNC() { + this.NCSchema = { + properties: { + crmCustomerId: { + type: 'string', + title: 'CRM客户编码', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + console.log(str); + + return this.service + .request(this.service.$api_get_crmCustomer_page, { customerName: str }) + .pipe(map((res: any) => (res.records as any[]).map(i => ({ label: i.customerName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + } + } as SFSelectWidgetSchema + } + }, + required: ['crmCustomerId'] + }; + this.ui5 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSFFre() { + this.addSchema = { + properties: { + enterpriseName: { + type: 'string', + title: '公司名称', + ui: { placeholder: '请输入' } + }, + taxCode: { + type: 'string', + title: '纳税人识别号', + ui: { placeholder: '请输入' } + }, + customerCode: { + type: 'string', + title: '税收分类编码', + ui: { placeholder: '请输入' } + }, + invoiceTaxRate: { + type: 'number', + title: '发票税率', + ui: { placeholder: '请输入' } + }, + surchargeRate: { + type: 'string', + title: '附加费比例', + ui: { placeholder: '请输入' } + } + }, + required: ['enterpriseName', 'taxCode', 'customerType', 'invoiceTaxRate', 'surchargeRate'] + }; + this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + roleAction(value: any, item?: any) { + this.service.request(this.service.$api_get_crmCustomer, { id: value.id }).subscribe((res: any) => { + console.log(res); + if (res) { + this.formData = res; + } + }); + this.edit = true; + this.editId = value.id; + this.isVisible = true; + } + // 财务设置 + ticket(value: any) { + this.formDataTicket = []; + this.formDataNC = []; + this.formDataTax = []; + this.ticketItem = value; + this.taxStatus = false; + this.TicketStatus = true; + this.NCStatus = false; + this.initSFTax(); + this.initSFNC(); + this.initSFTicket(); + this.NCID = value.id; + if (this.TicketStatus) { + console.log('9999999'); + + this.service.request(this.service.$api_getTicketByNetworkTransporterId, { id: value.id }).subscribe((res: any) => { + console.log(res); + if (res) { + let List = { + ...res + }; + delete List.senderRegionCode; + (List.senderRegionCode = this.getProvinceData(res?.senderRegionCode)), (this.formDataTicket = List); + this.ticketId = res.id; + } + }); + } + if (this.NCStatus) { + this.getNcSetData(); + } + this.isVisibleTicket = true; + } + getNcSetData() { + const List: any = []; + console.log(99999); + this.service.request(this.service.$api_get_crmCustomer, { id: this.ticketItem.crmCustomerId }).subscribe((res: any) => { + console.log(res); + if (res) { + List.push({ label: res.customerName, value: res.id }); + console.log(List); + + this.sfNC.getProperty('/crmCustomerId')!.schema.enum = List; + this.sfNC.getProperty('/crmCustomerId')!.widget.reset(List); + this.sfNC.setValue('/crmCustomerId', res?.id); + } + }); + } + getProvinceData(value: any) { + this.service.http.post(this.service.$api_getRegionDetailByCode, { regionCode: value }).subscribe(res => { + let enterpriseAddressCode: any = []; + let regioin = res?.data?.regionFullCodes.split(','); + regioin?.forEach((element: any) => { + enterpriseAddressCode.push(Number(element)); + }); + if (this.TicketStatus) { + this.sfTicket.setValue('/senderRegionCode', enterpriseAddressCode); + return enterpriseAddressCode; + } + }); + } + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + // 基础设置 + settingAction(item?: any) { + this.nzModalService.create({ + nzTitle: '系统配置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '1', + businessId: item.id + }, + nzFooter: null + }); + } + // 应用设置 + settingApp(item?: any) { + const modalRef = this.nzModalService.create({ + nzTitle: '应用设置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '1', + businessId: item.id, + configvalue: 'app' + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: boolean) => { + if (res) { + this.resetSF; + this.st.load(); + } + }) + } + // 重置账户 + settingPay(item?: any) { + this.nzModalService.create({ + nzTitle: '充值账户', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '1', + businessId: item.id, + configvalue: 'bankcard' + }, + nzFooter: null + }); + } + + createAccount(item: any, bankType: string, key: string) { + if (item[key]) { + return; + } + const params = { + accountType: 3, + bankType, + clientName: item.enterpriseName, + ctfId: item.taxCode, + ltdId: item.id, + roleId: item.id, + roleName: item.enterpriseName + }; + this.service + .request('/api/fcc/accountBalance/saveByLtd', { + ...params + }) + .subscribe(res => { + if (res) { + this.st.load(1); + this.service.msgSrv.success(bankType === '1' ? res?.paMsg : res?.pfMsg); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.isLoading = false + } + handleCancel() { + this.isVisible = false; + } + handleCancelTicket() { + this.isVisibleTicket = false; + } + handleOKTicket() { + console.log(this.taxStatus, this.TicketStatus, this.NCStatus); + if (this.TicketStatus) { + console.log(this.sfTicket); + console.log(this.sfTicket.value); + + if (!this.sfTicket.valid) { + this.service.msgSrv.warning('请正确填写完整!'); + return; + } + const params = { + ...this.sfTicket.value + }; + if (this.ticketId) { + params.id = this.ticketId; + } + params.senderRegionCode = this.sfTicket.value.senderRegionCode[2]; + console.log(params); + this.service.request(this.service.$api_networkTransporterTicket_save, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.isVisibleTicket = false; + this.st.reload(1); + } + }); + } else if (this.NCStatus) { + console.log(this.sfNC); + console.log(this.formDataNC); + console.log(this.sfNC?.value); + + if (!this.sfNC.valid) { + this.service.msgSrv.warning('请正确填写完整!'); + return; + } + const params = { + ...this.sfNC.value + }; + if (this.NCID) { + params.id = this.NCID; + } + console.log(params); + this.service.request(this.service.$api_setCrmCustomer, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.isVisibleTicket = false; + this.st.reload(1); + } + }); + // api_setCrmCustomer + } + } + + handleOK() { + console.log(this.sfFre.value); + if (!this.sfFre.valid) { + this.service.msgSrv.warning('请正确填写完整!'); + return; + } + const params = { + ...this.sfFre.value + }; + if (this.editId) { + params.id = this.editId; + } + this.service.request(this.service.$api_save_crmCustomer, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.isVisible = false; + this.st.reload(); + } else { + this.service.msgSrv.warning(res?.msg); + } + }); + } + // 云开票 + setMakeInvoice() {} + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + changeType(value: any) { + if (value.name === '税务设置') { + this.taxStatus = true; + this.TicketStatus = false; + this.NCStatus = false; + } else if (value.name === '开票设置') { + this.TicketStatus = true; + this.NCStatus = false; + this.taxStatus = false; + } else if (value.name === 'NC设置') { + this.getNcSetData(); + this.NCStatus = true; + this.TicketStatus = false; + this.taxStatus = false; + } + } + // 新增 + creat(value?: any) { + console.log(value); + this.router.navigate(['./new/' + value?.id], { relativeTo: this.ar }); + } +} diff --git a/src/app/routes/sys-setting/components/network-freight/new/new.component.html b/src/app/routes/sys-setting/components/network-freight/new/new.component.html new file mode 100644 index 00000000..2a2358b8 --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/new/new.component.html @@ -0,0 +1,76 @@ + + + + + +
    +
    +
    正面照
    +
    示例
    +
    +
    +
    +
    + +
    企业基本信息
    +
    + +
    + 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
    上传后系统会自动识别并填写
    +
    +
    + +
    万元
    +
    + + +
    营业执照法人信息
    +
    + + +
    +
    请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
    +
    上传后系统会自动识别并填写
    +
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    +
    + + + +
    其他信息
    +
    +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/network-freight/new/new.component.less b/src/app/routes/sys-setting/components/network-freight/new/new.component.less new file mode 100644 index 00000000..b1eab8b6 --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/new/new.component.less @@ -0,0 +1,71 @@ +:host { + ::ng-deep { + nz-card { + + .pr { + position: relative; + } + .pa { + position: absolute; + top : 50px; + left : 150px; + } + .pa2 { + position: absolute; + top: 28px; + left: 180px; + } + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + } + + .ant-form-item { + margin-left: 180px; + } + + nz-date-picker, + nz-input-number { + width: 100% !important; + } + + .input-back { + nz-form-item { + margin-left: 0px; + + .ant-form-item-label { + flex: 0 !important; + } + + .ant-form-item-control { + max-width : 100% !important; + margin-left: 20px !important; + } + } + } + + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/network-freight/new/new.component.ts b/src/app/routes/sys-setting/components/network-freight/new/new.component.ts new file mode 100644 index 00000000..00b3ccd8 --- /dev/null +++ b/src/app/routes/sys-setting/components/network-freight/new/new.component.ts @@ -0,0 +1,635 @@ +import { query } from '@angular/animations'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFCascaderWidgetSchema, + SFCheckboxWidgetSchema, + SFComponent, + SFDateWidgetSchema, + SFSchema, + SFStringWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { of } from 'rxjs'; +import { SystemService } from '../../../services/system.service'; + + +const IMAGECONFIG = { + previewFile: (file: NzUploadFile) => of(file.url), + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + name: 'multipartFile', + multiple: false, + listType: 'picture-card' +} as SFUploadWidgetSchema; + +const DATECONFIG = { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择' +}; + +@Component({ + selector: 'app-network-freight-new-component', + templateUrl: './new.component.html', + styleUrls: ['./new.component.less'] +}) +export class NetworkFreightNewComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('sf1', { static: false }) + sf1!: SFComponent; + sf1FormData: any = { + legalPersonIdentityVO: { + certificatePhotoFrontWatermark: '', + certificatePhotoBackWatermark: '', + }, + };; + subText = '确认新增' + TabText = '新增网络货运人' + sf2FormData: any = {}; + schema: SFSchema = this.initOthersSF(); + schema1: SFSchema = this.initBasicInfoSF(); + ui: SFUISchema = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 } + }, + $title1: { + spanLabelFixed: 0 + }, + $title99: { + spanLabelFixed: 0 + }, + $title2: { + spanLabelFixed: 0 + }, + $registrationCapital: { + spanLabelFixed: 180, + grid: { xxl: 13, xl: 18, lg: 22, md: 22 } + }, + $unit: { + grid: { xxl: 6, xl: 6, lg: 2, md: 2 } + }, + $isLoingDate: { + spanLabelFixed: 100, + grid: { xxl: 6, xl: 6, lg: 4, md: 6 } + } + }; + + constructor(private router: Router, public service: SystemService, private route: ActivatedRoute) {} + ngOnInit() { + if(this.route.snapshot.params.id !== 'undefined') { + this.dataListInit(this.route.snapshot.params.id) + this.subText = '确认编辑' + this.TabText = '编辑网络货运人' + } + } + dataListInit(id: any) { + this.service.request(this.service.$api_get_networkTransporter_getDetail,{id: id}).subscribe((res) => { + console.log(res); + this.sf2FormData = res + this.sf1FormData = res.enterpriseInfoVO + this.sf1FormData.isLoingDate = this.sf1FormData.operatingEndTime !== null ? false : true; + this.sf1FormData.licensePhotoWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.sf1FormData.licensePhotoWatermark, + response: this.sf1FormData.licensePhotoWatermark + }, + ]; + console.log(this.sf1FormData); + // 营业执照法人信息 + + this.sf1FormData.legalPersonIdentityVO.certificatePhotoFrontWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: res.enterpriseInfoVO.legalPersonIdentityVO.certificatePhotoFrontWatermark, + response: res.enterpriseInfoVO.legalPersonIdentityVO.certificatePhotoFrontWatermark + }, + ]; + this.sf1FormData.legalPersonIdentityVO.certificatePhotoBackWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.sf1FormData.legalPersonIdentityVO.certificatePhotoBackWatermark, + response: this.sf1FormData.legalPersonIdentityVO.certificatePhotoBackWatermark, + }, + ]; + const province = this.sf1FormData.fullRegionVO.provinceCode + const city = this.sf1FormData.fullRegionVO.cityCode + const area = this.sf1FormData.fullRegionVO.areaCode + this.sf1FormData.enterpriseAddressCode = [parseInt(province), parseInt(city), parseInt(area)]; + this.getRegionToThree(); + }) + } + getRegionToThree() { + // 获取一、二、三级地区详情 + this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { + if(this.sf1){ + this.sf1.getProperty('/enterpriseAddressCode')!.schema.enum = res.data; + this.sf1?.getProperty('/enterpriseAddressCode')?.widget.reset(res.data); + } + }); + } + submitForm() { + if (!this.sf1.valid || !this.sf.valid) { + this.sf.validator({ emitError: true }); + this.sf1.validator({ emitError: true }); + this.service.msgSrv.warning('请填写必填项!'); + return; + } + const enterpriseRegistrationTime = new Date(this.sf1.value.enterpriseRegistrationTime); + const operatingStartTime = new Date(this.sf1.value.operatingStartTime); + if (enterpriseRegistrationTime.getTime() > operatingStartTime.getTime()) { + this.service.msgSrv.warning('营业期限不能小于成立日期'); + return; + } + if (this.sf1.value.operatingEndTime) { + const operatingEndTime = new Date(this.sf1.value.operatingEndTime); + if (operatingStartTime.getTime() > operatingEndTime.getTime()) { + this.service.msgSrv.warning('营业期限不能小于期限开始日期'); + return; + } + } + if (this.sf1.value.isLoingDate) { + this.sf1.value.operatingEndTime = ''; + } + console.log(this.sf1.value) + console.log(this.sf1.valid) + console.log(this.sf.value) + console.log(this.sf.valid) + const sfVlaue = this.sf1.value; + const params: any = {}; + Object.assign( + params, + { + ...this.sf.value , + enterpriseInfoDTO: { + ...this.sf1.value, + legalPersonIdentityDTO: this.sf1.value.legalPersonIdentityVO + } + } + ); + delete params.enterpriseInfoDTO.legalPersonIdentityVO + console.log(params); + params.enterpriseInfoDTO.enterpriseAddressCode = this.sf1.value?.enterpriseAddressCode?.[2]; + if(this.route.snapshot.params.id !== 'undefined') { + params.id = this.route.snapshot.params.id + } + this.service.request(this.service.$api_networkTransporter_save, params).subscribe(res => { + if (res) { + if(this.route.snapshot.params.id !== 'undefined') { + this.service.msgSrv.success('修改成功'); + } else { + this.service.msgSrv.success('新增成功'); + } + this.goBack(); + } + }); + } + + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + if (type === 1) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf1.setValue('/legalPersonIdentityVO/name', res.name); + } + if (res.number) { + this.sf1.setValue('/legalPersonIdentityVO/certificateType', 0); + this.sf1.setValue('/legalPersonIdentityVO/certificateNumber', res.number); + } + } + } + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf.setValue('/name', res.name); + } + if (res.number) { + this.sf.setValue('/certificateNumber', res.number); + } + } + } + } + }); + } + + // 识别营业执照 + checkBusinessLicense(imgurl: any) { + console.log('触发了识别'); + + this.service.request(this.service.$api_ocr_recognize_business_license, { businessLicenseUrl: imgurl }).subscribe(res => { + if (res) { + if (res.registrationNumber) { + this.sf1.setValue('/unifiedSocialCreditCode', res.registrationNumber); + } + if (res.name) { + this.sf1.setValue('/enterpriseName', res.name); + } + if (res.addressRegionCodes) { + this.sf1.setValue('/enterpriseAddressCode', res.addressRegionCodes); + } + if (res.address) { + this.sf1.setValue('/enterpriseAddress', res.address); + } + if (res.registeredCapital) { + this.sf1.setValue('/registrationCapital', res.registeredCapital); + } + if (res.foundDate) { + this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); + } + if (res.businessTermStartDate) { + this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); + } + if (res.businessTermEndDate) { + this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); + } else { + this.sf1.setValue('/isLoingDate', true); + } + if (res.businessScope) { + this.sf1.setValue('/businessScope', res.businessScope); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + + private initBasicInfoSF(): SFSchema { + return { + properties: { + title1: { title: '', type: 'string', ui: { widget: 'custom' } }, + tips: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + licensePhoto: { title: '', type: 'string', ui: { hidden: true } }, + tipsS: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + licensePhotoWatermark: { + type: 'string', + title: '营业执照', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/licensePhoto', args.fileList[0].response.data.fullFilePath); + this.checkBusinessLicense(args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + }, + + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 1, + maxLength: 100, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入公司名称', + errors: { + required: '请输入公司名称' + } + } + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码' + } + } + }, + certificateType2: { + type: 'string', + title: '行业', + enum: [ + { label: '大陆身份证', value: 0 }, + { label: '港澳居民通行证', value: 1 }, + { label: '香港居民通行证', value: 2 } + ], + default: 0, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select' + } + }, + enterpriseAddressCode: { + type: 'number', + title: '营业执照所在地', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + asyncData: (node: any, index: any) => { + return new Promise(resolve => { + this.getRegionDetailByCode(node?.regionCode || '').subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1 })); + }, + _ => {}, + () => { + resolve(); + } + ); + }); + } + } as SFCascaderWidgetSchema + }, + enterpriseAddress: { + title: '营业执照详细地址', + type: 'string', + minLength: 1, + maxLength: 240, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'textarea', + autosize: { minRows: 2, maxRows: 5 }, + placeholder: '请输入营业执照上的完整详细地址', + errors: { + required: '请输入营业执照上的完整详细地址' + } + } as SFTextareaWidgetSchema + }, + registrationCapital: { + title: '注册资本', + type: 'number', + minimum: 1, + maximum: 99999999999999999999, + ui: { + grid: { xxl: 13, xl: 18, lg: 22, md: 22 }, + placeholder: '请输入营业执照上的注册资本', + errors: { + required: '请输入营业执照上的注册资本' + }, + precision: 0 + } + }, + staffNumber: { + title: '从业人数', + type: 'number', + minimum: 1, + maximum: 99999999999999999999, + ui: { + grid: { xxl: 13, xl: 18, lg: 22, md: 22 }, + placeholder: '请输入从业人数', + errors: { + required: '请输入从业人数' + }, + precision: 0 + } + }, + enterpriseRegistrationTime: { + title: '成立日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + + operatingStartTime: { + title: '营业期限', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + operatingEndTime: { + title: '', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 20, md: 18 }, + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf1?.setValue('/isLoingDate', false); + setTimeout(() => { + console.log(this.sf1.value); + }, 1000); + } + } as SFDateWidgetSchema + }, + isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + class: 'input-back', + widget: 'checkbox', + change: i => this.sf1?.setValue('/operatingEndTime', null) + } as SFCheckboxWidgetSchema + }, + businessScope: { + title: '经营范围', + type: 'string', + minLength: 1, + maxLength: 500, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'textarea', + autosize: { minRows: 3, maxRows: 5 }, + placeholder: '请输入营业执照上的营经营范围', + errors: { + required: '请输入营业执照上的营经营范围' + } + } as SFTextareaWidgetSchema + }, + taxAuthority: { + title: '税务机关', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入营业执照上的税务机关', + errors: { + required: '请输入营业执照上的税务机关' + } + } + }, + taxStatus: { + title: '纳税状态', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入纳税状态', + errors: { + required: '请输入纳税状态' + } + } + }, + + legalPersonIdentityVO: { + type: 'object', + properties: { + title2: { title: '', type: 'string', ui: { widget: 'custom' } }, + tipsC: { title: '法定代表人证件照', type: 'string', ui: { widget: 'custom' } }, + tipsA: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/legalPersonIdentityVO/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front', 1); + } + } + } as SFUploadWidgetSchema + }, + tipsB: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/legalPersonIdentityVO/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back', 1); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '法人姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入法人姓名' + } + }, + certificateType: { + type: 'string', + title: '法人证件类型', + enum: [ + { label: '大陆身份证', value: 0 }, + { label: '港澳居民通行证', value: 1 }, + { label: '香港居民通行证', value: 2 } + ], + default: 0, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select' + } + }, + certificateNumber: { + title: ' 法定代表人证件号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入法定代表人证件号' + } + } + }, + required: ['certificatePhotoFront', 'certificatePhotoBack', 'name', 'certificateType', 'certificateNumber','certificatePhotoFrontWatermark','certificatePhotoBackWatermark'] + } + }, + required: [ + 'licensePhotoWatermark', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'enterpriseAddressCode', + 'enterpriseAddress', + 'registrationCapital', + 'enterpriseRegistrationTime', + 'operatingStartTime', + 'businessScope', + 'taxStatus', + 'staffNumber', + 'taxAuthority' + ] + }; + } + + private initOthersSF(): SFSchema { + return { + properties: { + title99: { title: '', type: 'string', ui: { widget: 'custom' } }, + website: { + title: '平台网址', + type: 'string', + maxLength: 70, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入平台网址' + } + }, + costRate: { + title: '成本费率', + type: 'string', + addOnAfter: '%', + ui: { + addOnAfter: '%', + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入成本费率' + } + } + }, + required: ['website', 'costRate'] + }; + } +} diff --git a/src/app/routes/sys-setting/components/note-management/note-management.component.html b/src/app/routes/sys-setting/components/note-management/note-management.component.html new file mode 100644 index 00000000..edaddc44 --- /dev/null +++ b/src/app/routes/sys-setting/components/note-management/note-management.component.html @@ -0,0 +1,29 @@ + + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/note-management/note-management.component.less b/src/app/routes/sys-setting/components/note-management/note-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/note-management/note-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/note-management/note-management.component.ts b/src/app/routes/sys-setting/components/note-management/note-management.component.ts new file mode 100644 index 00000000..f93705dc --- /dev/null +++ b/src/app/routes/sys-setting/components/note-management/note-management.component.ts @@ -0,0 +1,75 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-09 14:05:33 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-09 15:18:38 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\sys-setting\\components\\note-management\\note-management.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-note-management', + templateUrl: './note-management.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class NoTeManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + cellphone: { + type: 'string', + title: '手机号', + maxLength: 11, + ui: { placeholder: '请输入' } + } + } + }; + + columns: STColumn[] = [ + { title: '手机号', className: 'text-center', index: 'cellphone' }, + { + title: '发送时间', + index: 'createTime', + type: 'date', + className: 'text-center' + }, + { title: '短信内容', className: 'text-center', index: 'content', + // format: (value) => { + // return JSON.parse(value?.templateParam)?.code + // } + }, + ]; + + constructor(public service: SystemService, private nzModalService: NzModalService, private route: ActivatedRoute) { + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + return requestOptions; + }; + + + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/role-management/edit/edit.component.html b/src/app/routes/sys-setting/components/role-management/edit/edit.component.html new file mode 100644 index 00000000..8291cad4 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/edit/edit.component.html @@ -0,0 +1,23 @@ + + +
    + +
    +
    + + + + + + +
    + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/edit/edit.component.ts b/src/app/routes/sys-setting/components/role-management/edit/edit.component.ts new file mode 100644 index 00000000..95aba48d --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/edit/edit.component.ts @@ -0,0 +1,119 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFSchemaEnumType, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { delay, map } from 'rxjs/operators'; +import { SystemService } from '../../../services/system.service'; +import { SettingMenuComponent } from '../menu/menu.component'; + +@Component({ + selector: 'app-cuc-edit', + templateUrl: './edit.component.html', + styleUrls: ['./edit.less'] +}) +export class SettingRoleEditComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('menu', { static: false }) + menu!: SettingMenuComponent; + roleInfoData: any = {}; + authorityAssistId: any[] = []; + params: any; + schema!: SFSchema; + authority: any[] = []; + constructor(private modal: NzModalRef, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(); + if (this.params.id) { + this.getRoleInfo(); + } + } + initSF() { + this.schema = { + properties: { + roleName: { + title: '角色名称', + type: 'string', + default: this.roleInfoData.roleName, + maxLength: 20, + ui: { + placeholder: '请输入角色名称' + } + }, + roleDescription: { + title: '角色描述', + type: 'string', + maxLength: 50, + default: this.roleInfoData.roleDescription, + ui: { + autosize: { minRows: 3 }, + hidden: this.params.lookType === 'detail', + placeholder: '请输入角色描述', + widget: 'textarea' + } + } + }, + required: ['roleName'] + }; + } + + getRoleInfo() { + const params = { + id: this.params.id + }; + this.service.request(this.params.infoUrl, params).subscribe(res => { + if (res) { + this.roleInfoData = res; + this.initSF(); + } + }); + } + getData(res: { authority: any[]; authorityAssistId: any[] }) { + this.authority = res.authority; + this.authorityAssistId = res.authorityAssistId; + } + close() { + this.modal.destroy(); + } + sure() { + if (!this.sf?.valid) { + this.service.msgSrv.warning('角色名称不能为空'); + return; + } + const auths = this.menu?.washTree(); + if (auths.authorityAssistId.length === 0) { + this.service.msgSrv.warning('请选择权限!'); + return; + } + const params: any = { + id: this.params.id, + ...this.sf.value, + authority: auths.authority, + authorityAssistId: auths.authorityAssistId + }; + if (this.params.id === 0) { + delete params.id; + } + if (this.params?.type === 'freight') { + Object.assign(params, { enterpriseId: 0, enterpriseProjectId: 0 }); + } + if (this.params.id) { + this.service.request(this.params.updateUrl, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('编辑成功'); + this.modal.close(true); + } + }); + } else { + this.service.request(this.params.addUrl, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('新增成功'); + this.modal.close(true); + } + }); + } + } +} diff --git a/src/app/routes/sys-setting/components/role-management/edit/edit.less b/src/app/routes/sys-setting/components/role-management/edit/edit.less new file mode 100644 index 00000000..a902f302 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/edit/edit.less @@ -0,0 +1,17 @@ +:host { + ::ng-deep { + .box { + width: 100%; + margin: 0 auto; + } + + .sv__label { + display: inline-block; + float: left; + width: 120px; + color: #000; + font-size: 13px; + text-align: right; + } + } +} diff --git a/src/app/routes/sys-setting/components/role-management/menu/menu.component.html b/src/app/routes/sys-setting/components/role-management/menu/menu.component.html new file mode 100644 index 00000000..9c6d6e48 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/menu/menu.component.html @@ -0,0 +1,21 @@ +
    +
    + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/menu/menu.component.ts b/src/app/routes/sys-setting/components/role-management/menu/menu.component.ts new file mode 100644 index 00000000..f867aee9 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/menu/menu.component.ts @@ -0,0 +1,413 @@ +import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzTreeComponent } from 'ng-zorro-antd/tree'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-cuc-menu', + templateUrl: './menu.component.html', + styleUrls: ['menu.less'] +}) +export class SettingMenuComponent implements OnInit, OnChanges { + @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; + origin: any = { buttonInfoList: [], dictList: [] }; + node: any = {}; + authority: any[] = []; + defaultSelectedKeys: any[] = []; + defaultExpandedKeys: any[] = []; + defaultCheckedKeys: any[] = []; + functionList: any[] = []; + allChecked = false; + indeterminate = true; + @Input() type = 'edit'; + @Input() source = ''; + @Input() appId = this.envSrv.env.appId; + @Input() isAuthorityIdDTOList: any[] = []; + @Input() authorityAssistId: any[] = []; + @Input() roleId: any; + @Output() changeData = new EventEmitter(); + constructor(public service: SystemService, private cdr: ChangeDetectorRef, private envSrv: EAEnvironmentService) {} + ngOnChanges(changes: SimpleChanges): void { + if (changes.isAuthorityIdDTOList) { + if (this.type === 'edit') { + this.authority = this.isAuthorityIdDTOList || []; + } + } + if (changes.authorityAssistId) { + this.defaultCheckedKeys = [...this.authorityAssistId]; + } + } + + ngOnInit() { + this.getAllFunction(); + } + getAllFunction() { + this.service + .request(this.service.$api_getAllFunctionInfoByAppId, { appId: this.appId || this.envSrv.env.appId }, 'POST', true, 'FORM') + .subscribe(res => { + // if (this.source === 'onlyRelationAuth') { + // this.addDisabledTree(res); + // } else { + // // this.addDisabledLeafTree(res); + // } + this.functionList = res; + this.defaultCheckedKeys = this.authorityAssistId; + this.cdr.detectChanges(); + }); + } + addAuthority(origin: { id: any; all: any }, node: { buttonInfoList: any[] }, item?: { checked: any; functionButtonId: any }) { + if (this.authority?.length && this.authority.filter(authItem => authItem.authorityId === origin.id).length) { + // 判断此菜单权限是否已经存在权限列表中 + // 当前操作菜单id存在权限列表里 + this.authority.forEach(menuItem => { + if (menuItem.authorityId === origin.id) { + menuItem.buttonAuthorityIds = menuItem.buttonAuthorityIds || []; // 防止属性不存在,给属性指定数据类型 + if (item) { + // 单选 + if (item.checked) { + if (menuItem.buttonAuthorityIds.indexOf(item.functionButtonId) === -1) { + // 如果该按钮在数据权限数组中不存在 + menuItem.buttonAuthorityIds.push(item.functionButtonId); + } + } else { + if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) { + menuItem.buttonAuthorityIds.forEach((btnItem: any, index: any) => { + if (btnItem === item.functionButtonId) { + menuItem.buttonAuthorityIds.splice(index, 1); + } + }); + } + } + } else { + // 全选 + if (origin.all) { + node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean }) => { + if (menuItem.buttonAuthorityIds.indexOf(nodeItem.id) === -1) { + menuItem.buttonAuthorityIds.push(nodeItem.id); + nodeItem.checked = true; + } + }); + } else { + if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) { + menuItem.buttonAuthorityIds = []; + node.buttonInfoList.forEach((nodeItem: { checked: boolean }) => { + nodeItem.checked = false; + }); + } + } + } + } + }); + } else { + // 数组为空的时候 + const buttonAuthorityIds = []; + if (item) { + // 全选 + buttonAuthorityIds.push(item.functionButtonId); + } else { + node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean; _isHalfChecked: boolean }) => { + if (origin.all) { + buttonAuthorityIds.push(nodeItem.id); + nodeItem.checked = true; + } + }); + } + const obj: any = { + authorityId: origin.id, + buttonAuthorityIds + }; + this.authority.push(obj); + } + this.checkTreeNode(node, origin); + } + + addDict(item: { checked: any; itemId: any; itemKey: any }, dictItem: { dictId: any }, origin: { id: any }, node: any) { + if (this.authority.length) { + // 判断此菜单权限是否已经存在权限列表中 + if (this.authority.filter(authItem => authItem.authorityId === origin.id).length) { + // 当前操作菜单id存在权限列表里 + this.authority.forEach((menuItem, menuIndex) => { + if (menuItem.authorityId === origin.id) { + menuItem.dataAuthority = menuItem.dataAuthority || []; // 防止属性不存在,给属性指定数据类型 + if (item.checked) { + if (menuItem.dataAuthority.filter((ele: { dictItemId: any }) => ele.dictItemId === item.itemId).length === 0) { + // 如果该按钮在数据权限数组中不存在 + menuItem.dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); + } + } else { + if (menuItem.dataAuthority && menuItem.dataAuthority.length) { + menuItem.dataAuthority.forEach((btnItem: { dictItemId: any }, index: any) => { + if (btnItem.dictItemId === item.itemId) { + menuItem.dataAuthority.splice(index, 1); + } + }); + } + } + } + }); + } else { + // 当前操作菜单id不存在权限列表里 + const dataAuthority = []; + dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); + const obj: any = { + authorityId: origin.id, + dataAuthority + }; + this.authority.push(obj); + } + } else { + // 数组为空的时候 + const dataAuthority = []; + dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); + const obj: any = { + authorityId: origin.id, + dataAuthority + }; + this.authority.push(obj); + } + this.checkTreeNode(node, origin); + } + + checkTreeNode(node: any, origin: { id: any }) { + const checkedNode: any = this.nzTreeComponent.getCheckedNodeList(); + const allCheckedArr: any[] = []; + this.overTree(checkedNode, allCheckedArr); + this.authority.forEach(authItem => { + if (authItem.authorityId === origin.id) { + if ( + (authItem.buttonAuthorityIds && authItem.buttonAuthorityIds.length) || + (authItem.dataAuthority && authItem.dataAuthority.length) + ) { + if (allCheckedArr.indexOf(node.key) === -1) { + allCheckedArr.push(node.key); + } + } else { + if (allCheckedArr.indexOf(node.key) !== -1) { + allCheckedArr.forEach((ele, index) => { + if (ele === origin.id) { + allCheckedArr.splice(index, 1); + } + }); + } + } + } + }); + this.defaultCheckedKeys = allCheckedArr; + } + + overTree(children: any[], a: any[]) { + children.forEach(item => { + a.push(item.key); + if (item.isLeaf) { + return; + } + if (item.children && item.children.length) { + this.overTree(item.children, a); + } + }); + } + + addDisabledTree(arr: any[]) { + arr.forEach((item: any) => { + item.disableCheckbox = true; + if (item.isLeaf) { + return; + } + if (item.children && item.children.length) { + this.addDisabledTree(item.children); + } + }); + } + addDisabledLeafTree(arr: any[]) { + arr.forEach((item: any) => { + if (item.isLeaf) { + return; + } + item.disableCheckbox = true; + if (item.children && item.children.length) { + this.addDisabledLeafTree(item.children); + } + }); + } + nzEvent(event: any): void { + this.origin = event.node.origin; + this.node = event.node.origin; + if (!event.node.origin.isLeaf) { + event.node.isExpanded = !event.node.isExpanded; + } else { + this.initButtonList(event.node.key, event.node.origin); + // this.initDictList(event.node.key, event.node.origin); + } + } + + washTree() { + const authorityMenu: any[] = []; // this.authority + const tempAuthorityIdDTOListMenu: any[] = []; + const checkedNode: any = this.nzTreeComponent.getCheckedNodeList(); + const halfCheckedNode: any = this.nzTreeComponent.getHalfCheckedNodeList(); + this.authorityAssistId = []; + halfCheckedNode.forEach((item: { key: any }) => { + authorityMenu.push({ authorityId: item.key }); + tempAuthorityIdDTOListMenu.push(item.key); + }); + this.overWashTree(checkedNode, tempAuthorityIdDTOListMenu, authorityMenu); + if (this.authority && this.authority.length) { + this.authority.forEach(item => { + if (tempAuthorityIdDTOListMenu.indexOf(item.authorityId) !== -1) { + tempAuthorityIdDTOListMenu.forEach((oldItem, oldIndex) => { + if (oldItem === item.authorityId) { + authorityMenu[oldIndex] = item; + } + }); + } + }); + } + const result = { + authority: authorityMenu, + authorityAssistId: this.authorityAssistId + }; + this.changeData.emit(result); + return result; + } + overWashTree(children: any[], tempAuthorityIdDTOListMenu: any[], authorityMenu: any[]) { + children.forEach((item: any) => { + this.authorityAssistId.push(item.key); + tempAuthorityIdDTOListMenu.push(item.key); + authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 1 }); + if (item.isLeaf) { + return; + } + if (item.children) { + this.overWashTree(item.children, tempAuthorityIdDTOListMenu, authorityMenu); + } + }); + } + + initButtonList(id: any, origin: any) { + if (origin.expanded) { + origin.children.forEach((item: any, index: number) => { + if (item.selected) { + if (origin.checked) { + this.authority.splice(index, 1); + const buttonAuthorityIds: any = []; + item.buttonInfoList.forEach((btnItem: any) => { + btnItem.checked = true; + buttonAuthorityIds.push(btnItem.functionButtonId); + }); + this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 }); + } else { + this.authority.splice(index, 1); + item.buttonInfoList.forEach((btnItem: any) => { + btnItem.checked = false; + }); + } + } + }); + } + const params = { + id + }; + this.service.request(this.service.$api_getFunctionButtonInfo, params).subscribe(res => { + if (res) { + origin.buttonInfoList = res; + origin.all = false; + // 判断此菜单下是否已有此按钮权限 + this.againGetBtn(id, origin); + } + }); + } + // 再次请求,需要判断暂存权限数组是否已有此权限 + againGetBtn(id: any, origin: any) { + if (this.authority && this.authority.length === 0) { + const buttonAuthorityIds: any = []; + if (origin.checked) { + origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { + btnItem.checked = true; + buttonAuthorityIds.push(btnItem.functionButtonId); + }); + this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 }); + } + } else { + if (origin.checked) { + //菜单勾选情况下 + if (this.authority.some(item => item.authorityId === id)) { + this.authority.forEach(item => { + if (item.authorityId === id) { + // 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id + if (item.buttonAuthorityIds && item.buttonAuthorityIds.length) { + // 如果当前菜单Id权限数组不为空 + origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { + // 判断已有权限id是否存在 + if (item.buttonAuthorityIds.indexOf(btnItem.functionButtonId) !== -1) { + btnItem.checked = true; + } else { + btnItem.checked = false; + } + }); + } + } + }); + } else { + this.authority.push({ authorityId: origin.key, buttonAuthorityIds: [], isUpdateAuthority: 1 }); + this.authority.forEach(item => { + origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { + btnItem.checked = true; + item.buttonAuthorityIds.push(btnItem.functionButtonId); + }); + }); + } + } else { + // 菜单未勾选,要删除权限 + this.authority.forEach((item, index) => { + if (item.authorityId === id) { + // 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id + this.authority.splice(index, 1); + origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { + btnItem.checked = false; + }); + } + }); + } + } + } + + initDictList(id: any, origin: any) { + const params = { + id + }; + this.service.request(this.service.$api_getFunctionDataInfo, params).subscribe(res => { + if (res) { + origin.dictList = res; + // 判断此菜单下是否已有此按钮权限 + this.againGetDict(id, origin); + } + }); + } + // 再次请求,需要判断暂存权限数组是否已有此权限 + againGetDict(id: any, origin: any) { + if (this.authority.length === 0) { + return; + } + this.authority.forEach(item => { + if (item.authorityId === id) { + // 如果当前菜单Id等于暂存权限数组的Id + if (item.dataAuthority && item.dataAuthority.length) { + // 如果当前菜单Id权限数组不为空 + origin.dictList.forEach((ele: { dictItem: any[] }) => { + // 判断已有权限id是否存在 + ele.dictItem.forEach((dictItem: { itemId: any; checked: boolean; cheked: boolean }) => { + item.dataAuthority.forEach((dataItem: { dictItemId: any }) => { + if (dataItem.dictItemId === dictItem.itemId) { + dictItem.checked = true; + } else { + dictItem.cheked = false; + } + }); + }); + }); + } + } + }); + } +} diff --git a/src/app/routes/sys-setting/components/role-management/menu/menu.less b/src/app/routes/sys-setting/components/role-management/menu/menu.less new file mode 100644 index 00000000..ea1914df --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/menu/menu.less @@ -0,0 +1,211 @@ +:host { + .toolbar-btn { + padding-left: 0; + } + + ::ng-deep { + .ant-checkbox-wrapper+.ant-checkbox-wrapper { + margin: 0; + } + + .listDiv { + cdk-virtual-scroll-viewport { + border: 1px solid rgba(242, 242, 240, 1); + } + + .selectedItem { + background: #e6f7ff; + + span { + a { + color: rgba(212, 72, 86, 1); + } + } + + ul>li>a>i { + color: rgba(212, 72, 86, 1); + } + } + + .listBottom { + height : 2.5rem; + overflow : hidden; + text-align : center; + background-color: rgba(245, 245, 245, 0.7); + + &:hover { + background-color: rgba(245, 245, 245, 1); + transition : all 1s; + } + } + } + + .ant-tabs-nav { + width : 100%; + margin: 0 !important; + } + + .buttons { + padding: 0; + + button { + display : block; + max-width: 10rem; + margin : 0.3rem 0.5rem 0 0; + } + + .ant-btn+.ant-btn:not(.ant-btn-link), + .ant-btn+nz-popconfirm, + nz-popconfirm+.ant-btn, + nz-popconfirm+nz-popconfirm, + .ant-btn+nz-button-group, + nz-button-group+.ant-btn, + .ant-btn+nz-dropdown, + nz-dropdown+.ant-btn, + nz-popconfirm+nz-button-group, + nz-button-group+nz-popconfirm { + margin-left: 0; + } + } + + .ant-tabs-bar { + margin: 0; + } + + // .ant-tree-node-selected { + // background: none !important; + // } + // .ant-tree-node-content-wrapper:hover { + // background: none; + // } + .ant-tree-node-content-wrapper { + width: 100%; + } + + .ant-tabs .ant-tabs-tabpane { + padding : 10px 10px 2px 10px; + background : #fdfdfd; + border-right : solid 1px #eee; + border-bottom: solid 1px #eee; + border-left : solid 1px #eee; + } + + // .ant-tabs-tab { + // width: 50%; + // text-align: center; + // } + // .ant-tabs-tab-arrow-show { + // display: none; + // } + ul { + margin : 0; + padding: 0; + } + } +} + +.firstStepBox { + width : 100%; + line-height: 50px; + text-align : center; + background : #f7f7f7; +} + +.itemBox { + width : 100%; + height : 50px; + padding : 0 0 0 60px; + color : #5f5f5f; + line-height: 50px; + cursor : pointer; + + &:hover { + background: #e6f7ff; + } +} + +.twoStepBox { + width : 100%; + line-height: 50px; + text-align : center; + background : #f7f7f7; + + span { + display: inline-block; + margin : 0 auto; + } + + >i { + float : right; + margin: 20px 20px 0 0; + } + + button { + float : right; + margin: 8px 20px 0 0; + } + + .blueFont { + color: #1890ff; + } +} + +.folder-desc i { + margin: 0 5px; +} + +.flexBox { + .titleBox { + display : flex; + justify-content: space-between; + + i { + margin: 0 8px; + } + } +} + +ul { + display: block; +} + +li { + line-height: 30px; + list-style : none; +} + +.dictData { + dl { + margin : 0; + padding: 0; + } + + dt { + margin : 0 0 5px 0; + padding : 3px 0; + color : #999; + font-weight : normal; + font-size : 13px; + border-bottom: solid 1px #eee; + } +} + +label { + color : #666; + font-size: 13px; +} + +.treeWrap { + display: flex; + width : 700px; + + .leftBox { + width : 40%; + // border-right: solid 1px #eee; + } + + .rightBox { + width : 60%; + padding: 0 0 0 20px; + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.html b/src/app/routes/sys-setting/components/role-management/role-management.component.html new file mode 100644 index 00000000..bc117b42 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.html @@ -0,0 +1,25 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.less b/src/app/routes/sys-setting/components/role-management/role-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.ts b/src/app/routes/sys-setting/components/role-management/role-management.component.ts new file mode 100644 index 00000000..c596fe85 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.ts @@ -0,0 +1,141 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { SettingRoleEditComponent } from './edit/edit.component'; + +@Component({ + selector: 'app-role-management', + templateUrl: './role-management.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class RoleManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + roleName: { + type: 'string', + title: '角色名称', + ui: { placeholder: '请输入' } + } + } + }; + + columns: STColumn[] = [ + { title: '角色名称', className: 'text-center', index: 'roleName' }, + { title: '角色描述', className: 'text-center', index: 'roleDescription' }, + { title: '企业数量', className: 'text-center', index: 'userNumber', iif: _ => this.type === 'freight' }, + { title: '创建人手机号', className: 'text-center', index: 'telephone' }, + { + title: '创建时间', + width: 170, + index: 'createTime', + type: 'date', + className: 'text-center' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.roleAction(item), + iif: item => item.roleName !== '超级管理员', + acl: { ability: ['SYSTEM-ROLE-edit'] } + }, + { + text: '删除', + click: item => this.deleteAction(item), + iif: item => item.roleName !== '超级管理员', + acl: { ability: ['SYSTEM-ROLE-delete'] } + } + ] + } + ]; + + type = 'user'; + params: any = { + listUrl: this.service.$api_get_role_page, + deleteUrl: this.service.$api_dalete_role, + infoUrl: this.service.$api_getRoleInfo, + addUrl: this.service.$api_save_role, + updateUrl: this.service.$api_update_role, + title: '角色管理', + type: 'user' + }; + + constructor(public service: SystemService, private nzModalService: NzModalService, private route: ActivatedRoute) { + route.params.subscribe(({ type }) => { + if (type) { + this.type = type; + if (type !== 'user') { + this.params = { + listUrl: this.service.$api_get_ent_role_page, + deleteUrl: this.service.$api_dalete_role, + infoUrl: this.service.$api_getRoleInfo, + addUrl: this.service.$api_save_role, + updateUrl: this.service.$api_update_role, + appId: 'A48F72F0A304427F921794BAD86B3522', + title: '企业角色管理', + type: 'freight' + }; + } + } + }); + } + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + if (requestOptions.body?.createTime) { + Object.assign(requestOptions.body, { sort: 'createTime.' + requestOptions.body.createTime }); + } + return requestOptions; + }; + + roleAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: SettingRoleEditComponent, + nzWidth: 900, + nzComponentParams: item ? { params: { ...item, ...this.params } } : { params: { id: 0, ...this.params } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + deleteAction(item: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.params.deleteUrl, [item.id]).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除角色成功'); + this.st.load(); + } + }); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.html b/src/app/routes/sys-setting/components/staff-management/staff-management.component.html new file mode 100644 index 00000000..3c1580bf --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.html @@ -0,0 +1,40 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    + +
    + + +
    +
    + +
    + + + 已选择 + {{ selectedRows.length }}项 + + +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.less b/src/app/routes/sys-setting/components/staff-management/staff-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts b/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts new file mode 100644 index 00000000..f29c7b7d --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts @@ -0,0 +1,194 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { SettingsService } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { SystemStaffStaffModalComponent } from './staff-modal/staff-modal.component'; +import { BuyerTranspowerComponent } from './transpower/transpower.component'; + +@Component({ + selector: 'app-staff-management', + templateUrl: './staff-management.component.html', + styleUrls: ['./staff-management.component.less'] +}) +export class StaffManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + searchSchema: SFSchema = { + properties: { + nameOrPhone: { + type: 'string', + title: '输入搜索', + ui: { placeholder: '手机号码 / 成员姓名' } + } + } + }; + + columns: STColumn[] = [ + { title: '', index: 'key', className: 'text-center', type: 'checkbox' }, + { title: '员工姓名', className: 'text-center', index: 'name' }, + { title: '手机号码', className: 'text-center', index: 'telephone' }, + { title: '角色', className: 'text-center', index: 'roleName' }, + { + title: '最后登录时间', + index: 'lastLoginDate', + className: 'text-center', + type: 'date', + format: item => `${item.lastLoginDate || '-'}` + }, + { + title: '成员状态', + className: 'text-center', + index: 'stateLocked', + type: 'badge', + badge: { + 0: { text: '正常', color: 'success' }, + 1: { text: '冻结', color: 'error' } + } + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '编辑', + click: item => this.staffAction(item), + acl: { ability: ['SYSTEM-STAFF-edit'] } + }, + { + text: '恢复', + iif: item => item.stateLocked === 1 && item.telephone !== this.user.phone, + click: item => this.action(item, 2), + acl: { ability: ['SYSTEM-STAFF-lock'] } + }, + { + text: '冻结', + iif: item => + item.stateLocked === 0 && item.roleCode.split(',').indexOf('Administrator') === -1 && item.telephone !== this.user.phone, + click: item => this.action(item, 1), + acl: { ability: ['SYSTEM-STAFF-lock'] } + }, + { + text: '超管转授', + iif: item => item.stateLocked === 0 && item.roleCode.split(',').indexOf('Administrator') === -1, + click: item => this.transpowerAction(item), + acl: { ability: ['SYSTEM-STAFF-shiftAdmin'] } + }, + { + text: '删除', + iif: item => + item.stateLocked === 0 && item.roleCode.split(',').indexOf('Administrator') === -1 && item.telephone !== this.user.phone, + click: item => this.action(item, 3), + acl: { ability: ['SYSTEM-STAFF-delete'] } + } + ] + } + ]; + + selectedRows: any[] = []; + + actionLabel = { + 1: { title: '确认冻结?', text: '冻结后用户在本系统将无法登录使用,请谨慎操作!' }, + 2: { title: '确认恢复?', text: '恢复后用户在本系统的权限将一并重新开启。' }, + 3: { title: '确认删除?', text: '删除后该用户ID将在本系统中将无法登录使用并删除,请谨慎操作!' } + }; + + user = this.setting.user; + constructor(public service: SystemService, private nzModalService: NzModalService, private setting: SettingsService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + action(item: any, type: 1 | 2 | 3) { + this.nzModalService.error({ + nzTitle: this.actionLabel[type].title, + nzContent: ``, + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + switch (type) { + case 1: + this.freeOrResumStaff({ appUserId: [item.appUserId], freezeOrResume: true }); + break; + case 2: + this.freeOrResumStaff({ appUserId: [item.appUserId], freezeOrResume: false }); + break; + case 3: + this.deleteStaff([item.appUserId]); + break; + + default: + break; + } + } + }); + } + + transpowerAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '超级管理员转授', + nzContent: BuyerTranspowerComponent, + nzComponentParams: { i: { ...item } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + staffAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: SystemStaffStaffModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: item.roleId ? (item.roleId as string)?.split(',') : null } } : { i: { userId: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + exportList() { + const params = { nameOrPhone: this.sf.value?.nameOrPhone }; + this.service.downloadFile(this.service.$api_export_staff, { ...params, pageSize: -1 }); + } + + private deleteStaff(params: any) { + this.service.request(this.service.$api_delete_staff, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功'); + this.st.load(); + } + }); + } + + private freeOrResumStaff(params: any) { + this.service.request(this.service.$api_free_or_resume_staff, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功'); + this.st.load(); + } + }); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html new file mode 100644 index 00000000..87d7b3b2 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html @@ -0,0 +1,10 @@ + +
    + +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts new file mode 100644 index 00000000..49b2cb27 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-system-add', + templateUrl: './staff-modal.component.html' +}) +export class SystemStaffStaffModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + staffName: { + title: '员工姓名', + type: 'string', + maxLength: 10, + ui: { widget: staff?.appUserId ? 'text' : 'string', placeholder: '请输入员工姓名' }, + default: staff.name + }, + telephone: { + title: '手机号码', + type: 'string', + maxLength: 11, + ui: { widget: staff?.appUserId ? 'text' : 'string', placeholder: '请输入员工手机号' }, + default: staff.telephone + }, + roleId: { + title: '角色', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择员工角色', + mode: 'multiple', + maxMultipleCount: 5, + asyncData: () => { + return this.service.request(this.service.$api_getAppRoleList).pipe( + map((res: any) => { + return res + .filter((role: any) => role.roleCode !== 'Administrator') + .map((item: any) => { + return { label: item.roleName, value: item.id }; + }); + }) + ); + } + }, + default: staff?.roleId || null + } + }, + required: ['staffName', 'telephone', 'roleId'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + } + + sure() { + if (!this.sf.value.roleId || this.sf.value.roleId.length === 0) { + this.service.msgSrv.error('员工角色不能为空!'); + return; + } + if (this.i.userId === 0) { + const params: any = { + ...this.sf.value + }; + this.service.request(this.service.$api_add_staff, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功!'); + this.modal.close(true); + } + }); + } else { + const params: any = { + appUserId: this.i.appUserId, + ...this.sf.value + }; + this.service.request(this.service.$api_edit_staff, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('编辑成功!'); + this.modal.close(true); + } + }); + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html new file mode 100644 index 00000000..47c06860 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html @@ -0,0 +1,22 @@ +
    + {{i.name}}({{i.telephone}}) + +
    为了账户安全,需超管手机验证({{ superPhone }})
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts new file mode 100644 index 00000000..ff704a04 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts @@ -0,0 +1,80 @@ +import { ChangeDetectorRef, Component, OnInit, TemplateRef } from '@angular/core'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { interval } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { DunHelper } from 'src/app/shared/components/captcha/dun.helper'; +import { EACaptchaService } from 'src/app/shared/services/business/captcha.service'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-buyer-transpower', + templateUrl: './transpower.component.html' +}) +export class BuyerTranspowerComponent implements OnInit { + count = 0; + i: any; + smsVerifyCode = ''; + superPhone = ''; + constructor( + private modal: NzModalRef, + public service: SystemService, + public eACaptchaService: EACaptchaService, + private dunHelper: DunHelper, + private cdr: ChangeDetectorRef + ) {} + + ngOnInit(): void { + this.getPhone(); + } + getPhone() { + this.service.request(this.service.$api_get_app_admin_info).subscribe(res => { + if (res) { + this.superPhone = res.telephone; + } + }); + } + sure() { + const params = { + appUserId: this.i.appUserId, + smsVerifyCode: this.smsVerifyCode, + telephone: this.i.telephone + }; + this.service.request(this.service.$api_set_shift_admin, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功!'); + this.modal.close(true); + } + }); + } + close() { + this.modal.destroy(); + } + /** + * 获取手机验证码 + */ + sendCode() { + this.eACaptchaService.request(this.eACaptchaService.$api_getAppLesseeAdminSMVerificationCode).subscribe(res => { + if (res.success && res.data.code === '1') { + this.eACaptchaService.msgSrv.success('发送验证码成功'); + this.createInterval(); + } else if (res.data.code === '503046') { + this.dunHelper.popUp().subscribe(_ => { + this.createInterval(); + this.dunHelper.destory(); + }); + } else { + this.eACaptchaService.msgSrv.warning(res.msg); + } + }); + } + + private createInterval() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } +} diff --git a/src/app/routes/sys-setting/components/system-config/system-config.component.html b/src/app/routes/sys-setting/components/system-config/system-config.component.html new file mode 100644 index 00000000..9606bc20 --- /dev/null +++ b/src/app/routes/sys-setting/components/system-config/system-config.component.html @@ -0,0 +1,187 @@ + +
    +
    +
      +
    • + {{ item.name }} +
    • +
    +
    + +
    + +

    货主端配置

    +

    图片配置

    + + + + + +
    可输入字符
    + +
    +
    +

    短信配置

    +
    +
    + +

    配置用户端登陆页注册帐号、修改密码、修改手机号时的短信内容

    + +
    +
    +
    +

    通知配置

    +
    +
    + + + + +
    +
    +

    客服电话配置

    +
    +
    + + + +
    +
    +
    + + +

    司机端配置

    +

    图片配置

    + + + + + +
    可输入字符
    + +
    +
    +

    短信配置

    +
    +
    + +

    配置用户端登陆页注册帐号、修改密码、修改手机号时的短信内容

    + +
    +
    +
    +

    通知配置

    +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +

    客服电话配置

    +
    +
    + + + +
    +
    +

    证件提醒配置

    +
    +
    + + 距离到期时间 + + 天开始提醒,每隔 + + 天提醒一次 + +
    +
    +
    + +
    + + +
    +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/system-config/system-config.component.less b/src/app/routes/sys-setting/components/system-config/system-config.component.less new file mode 100644 index 00000000..09e68362 --- /dev/null +++ b/src/app/routes/sys-setting/components/system-config/system-config.component.less @@ -0,0 +1,22 @@ +:host { + ::ng-deep { + .card-height { + min-height: 600px; + } + + .save-btn { + width : 100%; + text-align: right; + } + + .block-radio { + display : flex; + min-height : 32px; + } + + input { + width : 100px; + margin-left: 10px; + } + } + } \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/system-config/system-config.component.ts b/src/app/routes/sys-setting/components/system-config/system-config.component.ts new file mode 100644 index 00000000..f1a42dbf --- /dev/null +++ b/src/app/routes/sys-setting/components/system-config/system-config.component.ts @@ -0,0 +1,258 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-system-config', + templateUrl: './system-config.component.html', + styleUrls: ['./system-config.component.less'] +}) +export class SystemConfigComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + formDate: any = { + isAudit: false, + isEveryDay: false, + isEveryWeek: false + }; + tabs = [ + { + name: '货主端配置' + }, + { + name: '司机端配置' + } + ]; + selectedTab = 0; + + checkOptionsOne = [ + { label: '周一', value: '周一', checked: true }, + { label: '周二', value: '周二' }, + { label: '周三', value: '周三' }, + { label: '周四', value: '周四' }, + { label: '周五', value: '周五' }, + { label: '周六', value: '周六' }, + { label: '周日', value: '周日' } + ]; + + i: any; + schema!: SFSchema; + schema2!: SFSchema; + + imageConfig = { + widget: 'upload', + action: `/scm/cms/cms/upload/multipartFile/fileModel`, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + data: { + appId: this.service.envSrv.getEnvironment().appId + }, + multiple: false, + listType: 'picture-card', + showRequired: true + }; + constructor(private service: SystemService) {} + + ngOnInit() { + this.initSF(); + } + + changeType(type: number): void { + this.selectedTab = type; + } + + initSF() { + this.schema = { + properties: { + sysMinLogo: { + type: 'string', + title: '系统LOGO(大)', + // enum: [], + ui: { + ...this.imageConfig, + descriptionI18n: '大尺寸logo,支持JPG、PNG格式,文件小于2M(建议尺寸300*170px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, 'sysMinLogo'); + this.sf?.setValue('/sysMinLogo', avatar); + this.i.sysMinLogo = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo: { + type: 'string', + title: '用户默认头像', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸60*60px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo', avatar); + this.i.sysMaxLogo = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo1: { + type: 'string', + title: '用户默认头像', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于5M(建议尺寸375*773px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo1', avatar); + this.i.sysMaxLogo1 = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + }, + required: ['sysMinLogo', 'sysMaxLogo', 'sysMaxLogo1'] + }; + this.schema2 = { + properties: { + sysMinLogo: { + type: 'string', + title: '系统LOGO(小)', + // enum: [], + ui: { + ...this.imageConfig, + descriptionI18n: '小尺寸logo,支持JPG、PNG格式,文件小于2M(建议尺寸32*32px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, 'sysMinLogo'); + this.sf?.setValue('/sysMinLogo', avatar); + this.i.sysMinLogo = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo: { + type: 'string', + title: '系统LOGO(大)', + ui: { + ...this.imageConfig, + descriptionI18n: '小尺寸logo,支持JPG、PNG格式,文件小于2M(建议尺寸32*32px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo', avatar); + this.i.sysMaxLogo = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo1: { + type: 'string', + title: '用户默认头像', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸60*60px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo1', avatar); + this.i.sysMaxLogo1 = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo2: { + type: 'string', + title: '企业默认头像', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于2M(建议尺寸60*60px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo2', avatar); + this.i.sysMaxLogo2 = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo3: { + type: 'string', + title: '货主PC端登陆页海报', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于5M(建议尺寸1920*630px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo3', avatar); + this.i.sysMaxLogo3 = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + sysMaxLogo4: { + type: 'string', + title: 'APP开屏海报', + ui: { + ...this.imageConfig, + descriptionI18n: '支持JPG、PNG格式,文件小于5M(建议尺寸375*773px)。', + change: args => { + if (args.type === 'success') { + const avatar = this.getImageModel(args, -1); + this.sf?.setValue('/sysMaxLogo4', avatar); + this.i.sysMaxLogo4 = avatar; + } + }, + beforeUpload: this.uploadBefore + } as SFUploadWidgetSchema + }, + }, + required: ['sysMinLogo', 'sysMaxLogo', 'sysMaxLogo1', 'sysMaxLogo2', 'sysMaxLogo3', 'sysMaxLogo4'] + }; + } + + private uploadBefore = (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 2; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + // this.service.msgSrv.warning('图片需小于1M'); + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }; + + private getImageModel(args: any, key: any) { + return [ + { + uid: key, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url + } + } + ]; + } +} diff --git a/src/app/routes/sys-setting/services/system.service.ts b/src/app/routes/sys-setting/services/system.service.ts new file mode 100644 index 00000000..bad5ae64 --- /dev/null +++ b/src/app/routes/sys-setting/services/system.service.ts @@ -0,0 +1,191 @@ +/* + * @Author: your name + * @Date: 2021-12-20 17:18:43 + * @LastEditTime : 2022-02-18 13:42:49 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\sys-setting\\services\\system.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemService extends BaseService { + // 分页查询企业项目员工列表 + $api_get_enterprise_staff_page = '/api/mdc/cuc/userApp/getEnterpriseProjectStaffListPage'; + // 分页查询企业项目员工列表 + $api_export_staff = '/api/mdc/cuc/userApp/enterpriseProjectStaffExport'; + // 添加员工 + $api_add_staff = '/api/mdc/cuc/userApp/addStaff'; + // 编辑员工 + $api_edit_staff = '/api/mdc/cuc/userApp/editorStaff'; + // 删除应用用户(员工) + $api_delete_staff = '/api/mdc/cuc/userApp/deleteAppUser'; + // 冻结或恢复员工 + $api_free_or_resume_staff = '/api/mdc/cuc/userApp/freezeOrResumeStaff'; + // 获取应用企业的管理员用户 + $api_get_app_admin_info = `/api/mdc/cuc/userApp/getAppEnterpriseAdmin`; + // 运营管理后台转授超管角色 + $api_set_shift_admin = `/api/mdc/cuc/userAuthority/shiftAdmin`; + + + // 分页获取应用角色列表 + $api_get_role_page = '/api/mdc/cuc/roleInfo/getAppRoleInfoList'; + // 分页获取配置角色列表 + $api_get_ent_role_page = '/api/mdc/cuc/roleInfo/getConfigurationRoleList'; + // 新增角色 + $api_save_role = '/api/mdc/cuc/roleInfo/saveRoleInfo'; + // 编辑角色 + $api_update_role = '/api/mdc/cuc/roleInfo/updateRoleInfo'; + // 删除角色(含多个) + $api_dalete_role = '/api/mdc/cuc/roleInfo/removeRoleInfo'; + // 获取角色详情 + $api_getRoleInfo = '/api/mdc/cuc/roleInfo/getRoleInfo'; + // 获取角色列表 + $api_getAppRoleList = '/api/mdc/cuc/roleInfo/getRoleList'; + + // 查询字典选项列表 + $api_get_dict_page = '/api/mdc/pbc/dictItems/list/page'; + // 根据id批量删除字典选项 + $api_delete_dict_by_ids = '/api/mdc/pbc/dictItems/deleteBatchByIds'; + // 新增字典选项 + $api_add_dict = '/api/mdc/pbc/dictItems/save'; + // 更新字典选项 + $api_update_dict = '/api/mdc/pbc/dictItems/update'; + + // 获取CRM客户信息表 + $api_get_crmCustomer = '/api/mdc/cuc/crmCustomer/get'; + // 查询CRM客户信息表 + $api_get_crmCustomer_page = '/api/mdc/cuc/crmCustomer/list/page'; + // 保存CRM客户信息表 + $api_save_crmCustomer = '/api/mdc/cuc/crmCustomer/save'; + // 删除CRM客户信息表 + $api_deletebatch_crmCustomer = '/api/mdc/cuc/crmCustomer/deletebatch'; + + // 获取某个应用的所有菜单 + $api_getAllFunctionInfoByAppId: string = '/api/mdc/cuc/functionInfo/getAllFunctionInfoByAppIdNoHide'; + + // 查询网络货运信息表 + $api_networkTransporter_page = '/api/mdc/cuc/networkTransporter/list/page'; + // 获取网络货运信息表(id) + $api_get_networkTransporter = '/api/mdc/cuc/networkTransporter/get'; + // 获取网络货运信息表(id) + $api_get_networkTransporter_getDetail = '/api/mdc/cuc/networkTransporter/getDetail'; + // 批量获取网络货运信息 + $api_findNetworkTransporterByIds = '/api/mdc/cuc/networkTransporter/findNetworkTransporterByIds'; + // 查找所有网络货运信息(下拉) + $api_networkTransporter_findAll = '/api/mdc/cuc/networkTransporter/findAll'; + // 删除网络货运信息表 + $api_networkTransporter_deletebatch = '/api/mdc/cuc/networkTransporter/deletebatch'; + // 保存网络货运信息表 + $api_networkTransporter_save = '/api/mdc/cuc/networkTransporter/save'; + + // 查询结算客户表 + $api_settlementCustomer_page = '/api/mdc/cuc/settlementCustomer/list/page'; + // 获取结算客户表 + $api_settlementCustomer_get = '/api/mdc/cuc/settlementCustomer/get'; + // 保存结算客户表 + $api_settlementCustomer_save = '/api/mdc/cuc/settlementCustomer/save'; + // 删除结算客户表 + $api_settlementCustomer_deletebatch = '/api/mdc/cuc/settlementCustomer/deletebatch'; + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + + // 查询协议列表 + public $api_get_agreement_page = '/api/mdc/pbc/agreementInfo/list/page'; + // 编辑协议 + public $api_update_agreement = '/api/mdc/pbc/agreementInfo/modifyAgreementInfo'; + + // 根据FullKey获取系统子配置(树) + public $api_get_config_tree = '/api/mdc/pbc/sysConfig/getSysConfigTreeByParentFullKey'; + // 查找系统配置项列表 + public $api_get_config_by_parent_id = '/api/mdc/pbc/sysConfigItem/findSysConfigItemBySysConfigId'; + // 新增系统配置 + public $api_add_config = '/api/mdc/pbc/sysConfig/save'; + // 更新系统配置 + public $api_update_config = '/api/mdc/pbc/sysConfig/update'; + // 更新系统配置排序 + public $api_update_config_sort = '/api/mdc/pbc/sysConfig/updateSort'; + // 删除系统配置 + public $api_remove_config = '/api/mdc/pbc/sysConfig/deletebatch'; + // 查询系统配置项 + public $api_get_config_item_page = '/api/mdc/pbc/sysConfigItem/list/page'; + // 新增系统配置项 + public $api_add_config_item = '/api/mdc/pbc/sysConfigItem/save'; + // 更新系统配置项 + public $api_update_config_item = '/api/mdc/pbc/sysConfigItem/update'; + // 批量更新系统配置项 + public $api_update_config_batch = '/api/mdc/pbc/sysConfigItem/updateBatch'; + // 更新系统配置项排序 + public $api_update_config_item_sort = '/api/mdc/pbc/sysConfigItem/updateSort'; + // 删除系统配置项 + public $api_remove_config_item = '/api/mdc/pbc/sysConfigItem/deletebatch'; + + + // 根据网络货运人ID获取票务信息 + public $api_getTicketByNetworkTransporterId = '/api/mdc/cuc/networkTransporterTicket/getTicketByNetworkTransporterId'; + // 保存票务信息 + public $api_networkTransporterTicket_save = '/api/mdc/cuc/networkTransporterTicket/save'; + // 根据地区code查询列表 + $api_get_region_by_code = '/api/mdc/pbc/region/getRegionByCode'; + // 根据地区code查询地区详情 + $api_getRegionDetailByCode = '/api/mdc/pbc/region/getRegionDetailByCode'; + + + // 分页查询按钮列表 + $api_getButtonInfoPage = '/api/mdc/cuc/buttonInfo/getButtonInfoPage'; + // 新增编辑按钮信息 + $api_saveButtonInfo = '/api/mdc/cuc/buttonInfo/saveButtonInfo'; + // 获取按钮信息表(id) + $api_getButtonInfo_one = '/api/mdc/cuc/buttonInfo/getButtonInfo'; + // 删除按钮信息(id) + $api_deletebatchButton = '/api/mdc/cuc/buttonInfo/deletebatchButton'; + + + // 根据条件获取公告列表 + $api_getAnnouncementInfoList_page = '/api/mdc/pbc/announcementInfo/getAnnouncementInfoList'; + // 获取公告信息详情 + $api_getAnnouncementInfoById_detail = '/api/mdc/pbc/announcementInfo/getAnnouncementInfoById'; + // 删除公告信息 + $api_delete_deleteAnnouncementInfoById = '/api/mdc/pbc/announcementInfo/deleteAnnouncementInfoById'; + // 编辑公告信息 + $api_modifyAnnouncementInfo = '/api/mdc/pbc/announcementInfo/modifyAnnouncementInfo'; + // 新增公告信息 + $api_addAnnouncementInfo = '/api/mdc/pbc/announcementInfo/addAnnouncementInfo'; + + + // 查询保险配置 + $api_insuranceConfig_list = '/api/mdc/cuc/insuranceConfig/list'; + // 获取保险配置费率 + $api_getInsuranceRate = '/api/mdc/cuc/insuranceConfig/getInsuranceRate'; + // 获取保险配置(id) + $api_getInsuranceRate_get = '/api/mdc/cuc/insuranceConfig/get'; + // 删除保险配置(id) + $api_getInsuranceRate_deletebatch = '/api/mdc/cuc/insuranceConfig/deletebatch'; + // 批量保存保险配置 + $api_getInsuranceRate_saveBatch = '/api/mdc/cuc/insuranceConfig/saveBatch'; + + // 营业执照识别 + $api_ocr_recognize_business_license = '/api/mdc/pbc/hwc/ocr/recognizeBusinessLicense'; + // 短信发送列表 + $api_listSmsSendLog = '/api/mdc/pbc/smsSend/listSmsSendLog'; + // 身份证识别 + $api_ocr_recognize_id_card = '/api/mdc/pbc/hwc/ocr/recognizeIdCard'; + // 获取字典 + $api_getDictValue = '/api/mdc/pbc/dictItems/getDictValue'; + // 设置crm客户 + $api_setCrmCustomer = '/api/mdc/cuc/networkTransporter/setCrmCustomer'; + // 获取一、二、三级地区详情 + $api_getRegionToThree = '/api/mdc/pbc/region/getRegionToThree'; + $api_getRoleTemplateInfo: string = ''; + $api_getFunctionButtonInfo: string = '/api/mdc/cuc/functionButton/getFunctionButtonByFunctionId'; + $api_getFunctionDataInfo: string = ''; + $api_getAppList: string = ''; + $api_getRoleTemplateListByAppId: string = ''; + $api_updateRoleInfo: string = ''; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/sys-setting/sys-setting-routing.module.ts b/src/app/routes/sys-setting/sys-setting-routing.module.ts new file mode 100644 index 00000000..7be49b35 --- /dev/null +++ b/src/app/routes/sys-setting/sys-setting-routing.module.ts @@ -0,0 +1,54 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:23:05 + * @LastEditTime : 2022-02-23 17:17:53 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\sys-setting\\sys-setting-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AgreementConfigComponentsBaseComponent } from './components/agreement-config/agreement-config.component'; +import { AuditReasonConfigComponent } from './components/audit-reason-config/audit-reason-config.component'; +import { BasicConfigComponent } from './components/basic-config/basic-config.component'; +import { BasicSettingComponent } from './components/basic-setting/basic-setting.component'; +import { CartConfigComponent } from './components/cart-config/cart-config.component'; +import { CloseAccountComponent } from './components/close-account/close-account.component'; +import { CrmManagementComponent } from './components/crm-management/crm-management.component'; +import { GoodsNameConfigComponent } from './components/goods-name-config/goods-name-config.component'; +import { NetworkFreightComponent } from './components/network-freight/network-freight.component'; +import { RoleManagementComponent } from './components/role-management/role-management.component'; +import { StaffManagementComponent } from './components/staff-management/staff-management.component'; +import { SystemConfigComponent } from './components/system-config/system-config.component'; + +import { AnnouncementMessageComponent } from './components/announcement-message/announcement-message.component'; +import { InsuranceSetComponent } from './components/insurance-set/insurance-set.component'; +import { NetworkFreightNewComponent } from './components/network-freight/new/new.component'; +import { NoTeManagementComponent } from './components/note-management/note-management.component'; + +const routes: Routes = [ + { path: 'staff-management', component: StaffManagementComponent }, + { path: 'role-management/user/:type', component: RoleManagementComponent }, + { path: 'role-management/freight/:type', component: RoleManagementComponent }, + { path: 'basic-setting', component: BasicSettingComponent }, + { path: 'note-management', component: NoTeManagementComponent }, + { path: 'basic-config', component: BasicConfigComponent }, + { path: 'audit-reason-config', component: AuditReasonConfigComponent }, + { path: 'cart-config', component: CartConfigComponent }, + { path: 'agreement-config', component: AgreementConfigComponentsBaseComponent }, + { path: 'system-config', component: SystemConfigComponent }, + { path: 'goods-name-config', component: GoodsNameConfigComponent }, + { path: 'crm-management', component: CrmManagementComponent }, + { path: 'network-freight', component: NetworkFreightComponent }, + { path: 'network-freight/new/:id', component: NetworkFreightNewComponent }, + { path: 'close-account', component: CloseAccountComponent }, + // { path: 'btn-management', component: BtnManagementComponent }, + { path: 'announcement-message', component: AnnouncementMessageComponent }, + { path: 'insurance-set', component: InsuranceSetComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SysSettingRoutingModule {} diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts new file mode 100644 index 00000000..ecb6d87a --- /dev/null +++ b/src/app/routes/sys-setting/sys-setting.module.ts @@ -0,0 +1,68 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:23:05 + * @LastEditTime : 2022-03-09 14:08:38 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\sys-setting\\sys-setting.module.ts + */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { DynamicSettingModule, SharedModule } from '@shared'; +import { StaffManagementComponent } from './components/staff-management/staff-management.component'; +import { SysSettingRoutingModule } from './sys-setting-routing.module'; +import { BuyerTranspowerComponent } from './components/staff-management/transpower/transpower.component'; +import { SystemStaffStaffModalComponent } from './components/staff-management/staff-modal/staff-modal.component'; +import { RoleManagementComponent } from './components/role-management/role-management.component'; +import { BasicConfigComponent } from './components/basic-config/basic-config.component'; +import { AuditReasonConfigComponent } from './components/audit-reason-config/audit-reason-config.component'; +import { BasicConfigActionModalComponent } from './components/basic-config/basic-config-action-modal/basic-config-action-modal.component'; +import { AuditResonConfigActionModalComponent } from './components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component'; +import { CartConfigComponent } from './components/cart-config/cart-config.component'; +import { CartConfigActionModalComponent } from './components/cart-config/cart-config-action-modal/cart-config-action-modal.component'; +import { AgreementConfigComponentsBaseComponent } from './components/agreement-config/agreement-config.component'; +import { BasicSettingComponent } from './components/basic-setting/basic-setting.component'; +import { SystemConfigComponent } from './components/system-config/system-config.component'; +import { SettingRoleEditComponent } from './components/role-management/edit/edit.component'; +import { SettingMenuComponent } from './components/role-management/menu/menu.component'; +import { GoodsNameConfigComponent } from './components/goods-name-config/goods-name-config.component'; +import { CrmManagementComponent } from './components/crm-management/crm-management.component'; +import { NetworkFreightComponent } from './components/network-freight/network-freight.component'; +import { CloseAccountComponent } from './components/close-account/close-account.component'; +import { AnnouncementMessageComponent } from './components/announcement-message/announcement-message.component'; +import { InsuranceSetComponent } from './components/insurance-set/insurance-set.component'; +import { NetworkFreightNewComponent } from './components/network-freight/new/new.component'; +import { NoTeManagementComponent } from './components/note-management/note-management.component'; + +const COMPONENTS = [ + StaffManagementComponent, + RoleManagementComponent, + BasicConfigComponent, + AuditReasonConfigComponent, + CartConfigComponent, + AgreementConfigComponentsBaseComponent, + BasicSettingComponent, + SystemConfigComponent, + GoodsNameConfigComponent, + CrmManagementComponent, + NetworkFreightComponent, + CloseAccountComponent, + NetworkFreightNewComponent, + AnnouncementMessageComponent, + InsuranceSetComponent, + NoTeManagementComponent +]; +const NOTROUTECOMPONENTS = [ + BuyerTranspowerComponent, + SystemStaffStaffModalComponent, + BasicConfigActionModalComponent, + AuditResonConfigActionModalComponent, + CartConfigActionModalComponent, + SettingRoleEditComponent, + SettingMenuComponent +]; +@NgModule({ + declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, SysSettingRoutingModule, SharedModule, DynamicSettingModule] +}) +export class SysSettingModule {} diff --git a/src/app/routes/tax-management/components/individual-collect/individual-collect.component.html b/src/app/routes/tax-management/components/individual-collect/individual-collect.component.html new file mode 100644 index 00000000..149c130e --- /dev/null +++ b/src/app/routes/tax-management/components/individual-collect/individual-collect.component.html @@ -0,0 +1,51 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/tax-management/components/individual-collect/individual-collect.component.ts b/src/app/routes/tax-management/components/individual-collect/individual-collect.component.ts new file mode 100644 index 00000000..032f85fe --- /dev/null +++ b/src/app/routes/tax-management/components/individual-collect/individual-collect.component.ts @@ -0,0 +1,306 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TaxManagementService } from '../../services/tax-management.service'; + +@Component({ + selector: 'app-tax-management-individual-collect', + templateUrl: './individual-collect.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class TaxManagementIndividualCollectComponent implements OnInit { + _$expand = false; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabs: any[] = [ + { name: '待申报', value: '0' }, + { name: '待审核', value: '1' }, + { name: '已通过', value: '2' }, + { name: '不通过', value: '3' }, + { name: '全部', value: '' } + ]; + selectedIndex = '0'; + + selectedRows: any[] = []; + constructor(public service: TaxManagementService, private router: Router, private ar: ActivatedRoute, private modal: NzModalService) {} + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}, { + declareStatus: this.selectedIndex + }); + delete params._$expand; + return { ...params }; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + declareStatus: { + title: '申报状态', + type: 'string', + enum: [ + { value: '', label: '全部' }, + { value: '0', label: '待申报' }, + { value: '1', label: '待审核' }, + { value: '2', label: '已通过' }, + { value: '3', label: '不通过' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + containsAllLabel: true + }, + default: '' + }, + overdueStatus: { + title: '是否逾期', + type: 'string', + enum: [ + { value: '', label: '全部' }, + { value: false, label: '否' }, + { value: true, label: '是' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + containsAllLabel: true + }, + default: '' + }, + taxMonth: { + title: '税款所属期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + } as SFDateWidgetSchema + }, + sbrq: { + title: '申报日期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + nsrmc: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkEnterpriseName() + } + } + } + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px' }, + { + title: '申报状态', + index: 'declareStatus', + className: 'text-center', + width: '120px', + type: 'badge', + badge: { + '0': { text: '待申报', color: 'default' }, + '1': { text: '待审核', color: 'processing' }, + '2': { text: '已通过', color: 'success' }, + '3': { text: '不通过', color: 'error' } + } + }, + { + title: '是否逾期', + index: 'overdueStatus', + className: 'text-center', + width: '120px', + type: 'enum', + enum: { false: '否', true: '是' } + }, + { + title: '税款所属期起', + index: 'skssqq', + className: 'text-center', + width: '150px' + }, + { title: '税款所属期止', index: 'skssqz', className: 'text-center', width: '150px' }, + { + title: '纳税人名称', + index: 'nsrmc', + className: 'text-center', + width: '180px' + }, + { title: '纳税人识别号', index: 'nsrsbh', className: 'text-center', width: '200px' }, + { + title: '税率', + index: 'sl', + className: 'text-right', + width: '150px', + format: item => `${item.sl ? ((item.sl as number) * 100).toFixed(2) : 0}%` + }, + { title: '申报人数', index: 'sbrs', className: 'text-right', width: '150px' }, + { + title: '应税收入', + index: 'yssr', + className: 'text-right', + width: '150px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yssr }) } + }, + { + title: '应纳税额', + index: 'ynse', + className: 'text-right', + width: '180px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ynse }) } + }, + { + title: '累计已缴纳税额', + index: 'ljyjnse', + className: 'text-center', + width: '150px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ljyjnse }) } + }, + { + title: '本期应补退税额', + index: 'bqybtse', + className: 'text-center', + width: '150px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.bqybtse }) } + }, + { title: '申报日期', index: 'sbrq', className: 'text-center', width: '150px' } + ]; + } + + /** + *更正 + * @param record 记录实例 + */ + recall() { + if (this.selectedRows.length === 0) { + this.service.msgSrv.warning('请选择需要更正的数据'); + return; + } + // this.modal.confirm({ + // nzTitle: '撤回提示', + // nzContent: ' 撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + // nzOkText: '确定', + // nzCancelText: '取消', + // nzOnOk: () => { + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('撤销成功'); + // this.search(); + // } + // }); + // } + // }); + } + + selectChange(item: any) { + this.selectedIndex = item?.value || ''; + setTimeout(() => { + this.st.load(1); + }); + } + + /** + * 申报 + */ + upload() { + if (this.selectedRows.length === 0) { + this.service.msgSrv.warning('请选择需要申报的数据'); + return; + } + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('申报成功'); + // this.search(); + // } + // }) + } + + /** + * + * @param params 更新数据 + */ + uploadSetting() { + this.service.request(this.service.$api_get_updateData).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.search(); + } + }) + } + + search() { + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart(this.sf?.value, this.service.$api_async_export_order_reporting_list); + } +} diff --git a/src/app/routes/tax-management/components/individual-declare/individual-declare.component.html b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.html new file mode 100644 index 00000000..cd3d1cbb --- /dev/null +++ b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.html @@ -0,0 +1,78 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + {{ item?.billStatusLabel }} + {{ item?.billStatusLabel }} + 异常 + + + + {{ item?.billStatusLabel }} + {{ item?.billStatusLabel }} + + +
    {{ item?.amount | currency: ' ' }}
    +
    +
    +
    + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + + +
    +
    + + + +
    司机姓名:张三/13812345678
    +
    是否确认要将该司机的起征点同步调整为超过15万?
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/tax-management/components/individual-declare/individual-declare.component.less b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.less new file mode 100644 index 00000000..43a47df4 --- /dev/null +++ b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.less @@ -0,0 +1,5 @@ +:host { + .text-black { + color: #000; + } +} diff --git a/src/app/routes/tax-management/components/individual-declare/individual-declare.component.spec.ts b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.spec.ts new file mode 100644 index 00000000..23f9fc25 --- /dev/null +++ b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.spec.ts @@ -0,0 +1,34 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-30 14:45:52 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-31 10:36:54 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\tax-management\\components\\individual-declare\\individual-declare.component.spec.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TaxManagementIndividualDeclareComponent } from './individual-declare.component'; + +describe('TaxManagementIndividualDeclareComponent', () => { + let component: TaxManagementIndividualDeclareComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ TaxManagementIndividualDeclareComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TaxManagementIndividualDeclareComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/tax-management/components/individual-declare/individual-declare.component.ts b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.ts new file mode 100644 index 00000000..703a2fa2 --- /dev/null +++ b/src/app/routes/tax-management/components/individual-declare/individual-declare.component.ts @@ -0,0 +1,496 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { TaxManagementService } from '../../services/tax-management.service'; +// import { DatatableReportingUploadSettingComponent } from '../upload-setting/upload-setting.component'; +// import { DatatableReportingVerifyResultComponent } from '../verify-result/verify-result.component'; + +@Component({ + selector: 'app-tax-management-individual-declare', + templateUrl: './individual-declare.component.html', + styleUrls: ['./individual-declare.component.less'] +}) +export class TaxManagementIndividualDeclareComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType!: string; + tabs: any[] = [ + { name: '待申报', value: '0' }, + { name: '待审核', value: '1' }, + { name: '已通过', value: '2' }, + { name: '不通过', value: '3' }, + { name: '全部', value: '' } + ]; + selectedIndex = ''; //选择的项目 + serviceTel = ''; + isVisible: boolean = false; + constructor( + public service: TaxManagementService, + private router: Router, + private ar: ActivatedRoute, + public shipperservice: ShipperBaseService, + private modal: NzModalService, + public shipperSrv: ShipperBaseService + ) {} + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + console.log(); + + const params = Object.assign({}, this.sf?.value || {}); + if (this.selectedIndex) { + params.declareStatus = this.selectedIndex; + } + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item: any) => item.checked) || []; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + const object1: any = {}; + const object2: any = {}; + Object.defineProperty(object1, 'name', { writable: false, value: 'wang' }); + Object.defineProperty(object2, 'xxoo', { writable: false, value: 'wang' }); + console.log(object1); + console.log(object1.name); + console.log(object2); + console.log(object2.xxoo); + object1.name = 'ming'; + object2.xxoo = 'ming'; + console.log(object1); + console.log(object2); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + driverName: { title: '司机姓名', type: 'string', ui: { placeholder: '请输入' } }, + telephone: { + type: 'string', + title: '联系电话', + ui: { + placeholder: '请输入' + } + }, + cardNumber: { + title: '证件号码', + type: 'string', + ui: { + placeholder: '请输入证件号码' + } + }, + declareStatus: { + title: '申报状态', + type: 'string', + ui: { + placeholder: '请选择', + widget: 'dict-select', + params: { dictKey: 'taxincome:declare:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + + isOvertime: { + title: '是否逾期', + type: 'string', + enum: [ + { value: '', label: '全部' }, + { value: false, label: '否' }, + { value: true, label: '是' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + }, + default: '' + }, + taxDate: { + title: '税款所属期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + declareDate: { + title: '申报日期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + } + } + }; + this.ui = { + '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.search() }, + $time: { grid: { span: 24 } } + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px' }, + { + title: '申报状态', + index: 'declareStatus', + className: 'text-center', + width: '120px', + type: 'badge', + badge: { + '0': { text: '待申报', color: 'default' }, + '1': { text: '待审核', color: 'processing' }, + '2': { text: '已通过', color: 'success' }, + '3': { text: '不通过', color: 'error' } + } + }, + { + title: '是否逾期', + index: 'overdueStatus', + className: 'text-center', + width: '120px', + type: 'enum', + enum: { false: '否', true: '是' } + }, + { + title: '税款所属期起', + index: 'skssqq', + className: 'text-center', + width: '150px' + }, + { title: '税款所属期止', index: 'skssqz', className: 'text-center', width: '150px' }, + { + title: '纳税人名称', + index: 'nsrmc', + className: 'text-center', + width: '180px' + }, + { title: '纳税人识别号', index: 'nsrsbh', className: 'text-center', width: '200px' }, + { title: '姓名', index: 'xm', className: 'text-center', width: '200px' }, + { title: '证件类型', index: 'sfzjlx', className: 'text-center', width: '200px' }, + { title: '证件号码', index: 'sfzjhm', className: 'text-center', width: '200px' }, + { title: '联系电话', index: 'lxdh', className: 'text-center', width: '200px' }, + { title: '国家(地区)', index: ' gjdq', className: 'text-center', width: '200px' }, + { title: '所属行业', index: 'hy', className: 'text-center', width: '200px' }, + { title: '征收项目', index: 'zsxm', className: 'text-center', width: '200px' }, + { title: '征收品目', index: 'zsmp', className: 'text-center', width: '200px' }, + { + title: '计税依据', + index: 'jsyj', + className: 'text-center', + width: '200px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ynse }) } + }, + { + title: '税率', + index: 'sl', + render: 'sl', + className: 'text-center', + width: '200px', + format: item => `${item.sl ? ((item.sl as number) * 100).toFixed(2) : 0}%` + }, + { + title: '应纳税额', + index: 'ynse', + className: 'text-center', + width: '180px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ynse }) } + }, + { + title: '减免税额', + index: 'jmse', + className: 'text-center', + width: '180px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.jmse }) } + }, + { + title: '已缴纳税额', + index: 'yjnse', + className: 'text-center', + width: '180px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yjnse }) } + }, + { + title: '应代征税额', + index: 'dzse', + className: 'text-center', + width: '180px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.dzse }) } + }, + { + title: '已代征税额', + index: 'ydzse', + className: 'text-center', + width: '150px', + type: 'widget', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ydzse }) } + }, + { title: '申报日期', render: 'sbrq', className: 'text-center', width: '150px' } + ]; + } + + /** + *更正 + * @param record 记录实例 + */ + recall() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要更正的数据'); + return; + } + // this.modal.confirm({ + // nzTitle: '撤回提示', + // nzContent: ' 撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + // nzOkText: '确定', + // nzCancelText: '取消', + // nzOnOk: () => { + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('撤销成功'); + // this.search(); + // } + // }); + // } + // }); + } + /** + *修改 + * @param record 记录实例 + */ + uploadSetting() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要修改的数据!'); + return; + } + // this.isVisible = true + } + /** + *撤销 + * @param record 记录实例 + */ + unnormal(value: any) { + this.modal.confirm({ + nzTitle: '税务审核结果', + nzContent: '订单结算时间所在月份与申报月份不一致', + nzOkText: '确定', + nzCancelText: '', + nzOnOk: () => { + this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('撤销成功'); + this.search(); + } + }); + } + }); + } + + selectChange(item: any) { + this.selectedIndex = item?.value || ''; + setTimeout(() => { + this.st.load(1); + }); + } + + /** + * 查看当行数据 + */ + view(record: STData) { + // this.router.navigate(['../view', record.uuid], { relativeTo: this.ar }); + this.router.navigate(['../detail'], { + queryParams: { + id: record.id + }, + relativeTo: this.ar + }); + } + + // appeal(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '申诉', + // nzWidth: '40%', + // nzContent: CtcAppealComponent, + // nzComponentParams: { + // i: item, + // status: 'add' + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe(res => { + // if (res) { + // this.search({ representationsStatus: '' }); + // } + // }) + // } + + /** + * 申报 + */ + upload() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要申报的数据'); + return; + } + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('申报成功'); + // this.search(); + // } + // }) + } + + /** + * + * @param params 更新数据 + */ + resetData() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要更新的数据'); + return; + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + this.service.request(this.service.$api_get_taxDeclaration_updateAll, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.st.load(1); + } + }); + } + + /** + * 查看校验结果 + */ + viewResult(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '本地校验结果', + // nzWidth: 1200, + // nzContent: TaxManagementOrderVerifyResultComponent, + // nzComponentParams: { + // record: item + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe(res => { + // }) + } + + /** + * 查看监管审核结果 + */ + viewAuditResult(record: any) { + if (record?.billStatus !== '2') { + return; + } + this.openWainingModal('监管审核结果', record?.result); + } + + search() { + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart(this.sf?.value, this.service.$api_async_export_order_reporting_list); + } + + openWainingModal(content: string, title = '提示') { + this.modal.warning({ + nzMask: false, + nzTitle: title, + nzContent: content + }); + } + handleOK() {} + handleCancel() { + this.isVisible = false; + } +} diff --git a/src/app/routes/tax-management/components/individual-income/individual-income.component.html b/src/app/routes/tax-management/components/individual-income/individual-income.component.html new file mode 100644 index 00000000..3087e371 --- /dev/null +++ b/src/app/routes/tax-management/components/individual-income/individual-income.component.html @@ -0,0 +1,65 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + + +
    +
    + + + +
    司机姓名:张三/13812345678
    +
    是否确认要将该司机的起征点同步调整为超过15万?
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/tax-management/components/individual-income/individual-income.component.ts b/src/app/routes/tax-management/components/individual-income/individual-income.component.ts new file mode 100644 index 00000000..15583442 --- /dev/null +++ b/src/app/routes/tax-management/components/individual-income/individual-income.component.ts @@ -0,0 +1,383 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TaxManagementService } from '../../services/tax-management.service'; + +@Component({ + selector: 'app-tax-management-individual-income', + templateUrl: './individual-income.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class TaxManagementIndividualIncomeComponent implements OnInit { + _$expand = false; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + isLoading: boolean = false; + tabs: any[] = [ + { name: '待申报', value: '0' }, + { name: '待审核', value: '1' }, + { name: '已通过', value: '2' }, + { name: '不通过', value: '3' }, + { name: '全部', value: '' } + ]; + selectedIndex = '0'; //选择的项目 + isVisible: boolean = false; + + selectedRows: any[] = []; + + constructor(public service: TaxManagementService) {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { declareStatus: this.selectedIndex }); + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + delete requestOptions.body._$expand; + } + this.selectedRows = []; + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + driverName: { title: '司机姓名', type: 'string', ui: { placeholder: '请输入' } }, + telephone: { + type: 'string', + title: '联系电话', + ui: { + placeholder: '请输入' + } + }, + cardNumber: { + title: '证件号码', + type: 'string', + ui: { + placeholder: '请输入证件号码' + } + }, + declareStatus: { + title: '申报状态', + type: 'string', + enum: [ + { value: '', label: '全部' }, + { value: '0', label: '待申报' }, + { value: '1', label: '待审核' }, + { value: '2', label: '已通过' }, + { value: '3', label: '不通过' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + }, + default: '' + }, + // declareStatu1s: { + // title: '申报结果', + // type: 'string', + // ui: { + // placeholder: '请选择', + // widget: 'dict-select', + // params: { dictKey: 'service:type' }, + // containsAllLabel: true, + // visibleIf: { + // _$expand: (value: boolean) => value + // } + // } + // }, + isOvertime: { + title: '是否逾期', + type: 'string', + enum: [ + { value: '', label: '全部' }, + { value: '0', label: '否' }, + { value: '1', label: '是' } + ], + ui: { + placeholder: '请选择', + widget: 'select', + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + }, + default: '' + }, + taxDate: { + title: '税款所属期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + declareDate: { + title: '申报日期', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder() + } + } + } + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px' }, + { + title: '申报状态', + index: 'declareStatus', + className: 'text-center', + width: '120px', + type: 'badge', + badge: { + '0': { text: '待申报', color: 'default' }, + '1': { text: '待审核', color: 'processing' }, + '2': { text: '已通过', color: 'success' }, + '3': { text: '不通过', color: 'error' } + } + }, + { title: '是否逾期', index: 'overtime', className: 'text-center', width: '120px', type: 'enum', enum: { '0': '否', '1': '是' } }, + { title: '税款所属期起', index: 'skssqq', className: 'text-center', width: '150px' }, + { title: '税款所属期止', index: 'skssqz', className: 'text-center', width: '150px' }, + { title: '纳税人名称', index: 'nsrmc', className: 'text-center', width: '180px' }, + { title: '纳税人识别号', index: 'nsrsbh', className: 'text-center', width: '200px' }, + { title: '行业', index: 'hy', className: 'text-center', width: '200px' }, + { title: '行政区划', index: 'xzqh', className: 'text-center', width: '120px' }, + { title: '街道乡镇', index: 'jdxz', className: 'text-center', width: '350px' }, + { title: '税务机关', index: 'swjg', className: 'text-center', width: '180px' }, + { title: '姓名', index: 'xm', className: 'text-center', width: '180px' }, + { title: '证件类型', index: 'sfzjlx', className: 'text-center', width: '250px' }, + { title: '证件号码', index: 'sfzjhm', className: 'text-center', width: '200px' }, + { title: '联系电话', index: 'lxdh', className: 'text-center', width: '200px' }, + { title: '国籍(地区)', index: 'gjdq', className: 'text-center', width: '150px' }, + { title: '生产经营地行政区划', index: 'scjydxzqh', className: 'text-center', width: '180px' }, + { + title: '当月应税收入', + index: 'dyyssr', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.dyyssr }) } + }, + { + title: '应税收入', + index: 'yssr', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yssr }) } + }, + { + title: '应税所得率', + index: 'yssdl', + className: 'text-right', + width: '250px', + format: item => `${item.yssdl ? ((item.yssdl as number) * 100).toFixed(2) : 0}%` + }, + { + title: '计税依据', + index: 'jsyj', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.jsyj }) } + }, + { + title: '税率', + index: 'sl', + className: 'text-right', + width: '150px', + format: item => `${item.sl ? ((item.sl as number) * 100).toFixed(2) : 0}%` + }, + { title: '速算扣除数', index: 'sskcs', className: 'text-right', width: '150px' }, + { + title: '应纳税额', + index: 'ynse', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ynse }) } + }, + { + title: '累计已缴纳税额', + index: 'ljyjnse', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ljyjnse }) } + }, + { + title: '本期应补退税额', + index: 'bqybtse', + width: '150px', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.bqybtse }) } + }, + { title: '申报日期', index: 'sbrq', className: 'text-center', width: '150px' } + ]; + } + + /** + *更正 + * @param record 记录实例 + */ + corrections() { + // if (this.selectedRows.length === 0) { + // this.openWainingModal('请选择需要撤回的数据'); + // return; + // } + // this.modal.confirm({ + // nzTitle: '撤回提示', + // nzContent: ' 撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + // nzOkText: '确定', + // nzCancelText: '取消', + // nzOnOk: () => { + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('撤销成功'); + // this.search(); + // } + // }); + // } + // }); + } + /** + *修改起征点 + * @param record 记录实例 + */ + resetData() { + // if (this.selectedRows.length === 0) { + // this.openWainingModal('请选择需要更新的数据!'); + // return; + // } + // this.isVisible = true; + } + + selectChange(item: any) { + this.selectedIndex = item?.value || ''; + setTimeout(() => { + this.st.load(1); + }); + } + + /** + * 申报 + */ + upload() { + if (this.selectedRows.length === 0) { + this.service.msgSrv.warning('请选择需要申报的数据'); + return; + } + // this.modal.warning({ + // nzTitle: '申报提示', + // nzContent: '订单结算时间所在月份与申报月份不一致......' + // }); + // this.service.request(this.service.$api_recall_reporting, { rows: this.selectedRows }).subscribe((res: any) => { + // if (res) { + // this.service.msgSrv.success('申报成功'); + // this.search(); + // } + // }) + } + + /** + * + * @param params 更新数据 + */ + uploadSetting() { + this.service.request(this.service.$api_update_individual_income_page).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.search(); + } + }); + } + + search() { + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart(this.sf?.value, this.service.$api_async_export_order_reporting_list); + } + + handleOK() {} + handleCancel() { + this.isVisible = false; + } +} diff --git a/src/app/routes/tax-management/components/order-reporting/order-reporting.component.html b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.html new file mode 100644 index 00000000..953a2464 --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.html @@ -0,0 +1,108 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + 待上传 + 已上传 + 上传中 + 上传异常 + + + + + 校验中 + 通过 + + 不通过 + + + +
    {{ item?.driverName }}{{ item?.driverPhone ? "/" + item?.driverPhone : '' }}
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    {{item?.orderAmount | currency }}
    +
    +
    +
    + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据 +
    + + + + +
    +
    diff --git a/src/app/routes/tax-management/components/order-reporting/order-reporting.component.less b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.less new file mode 100644 index 00000000..94ec07e0 --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.less @@ -0,0 +1,22 @@ +:host { + .text-black { + color: #000; + } + .icon { + display: inline-block; + width: 1em; + height: 1em; + stroke-width: 0; + stroke: currentColor; + /* stylelint-disable-next-line order/properties-order */ + fill: currentColor; + } + ::ng-deep { + .imgBox { + display: flex; + img { + width: 60px !important; + } + } + } +} diff --git a/src/app/routes/tax-management/components/order-reporting/order-reporting.component.spec.ts b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.spec.ts new file mode 100644 index 00000000..2c07610f --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableOrderReportingComponent } from './order-reporting.component'; + +describe('DatatableOrderReportingComponent', () => { + let component: DatatableOrderReportingComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DatatableOrderReportingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableOrderReportingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/tax-management/components/order-reporting/order-reporting.component.ts b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.ts new file mode 100644 index 00000000..4477e8e8 --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/order-reporting.component.ts @@ -0,0 +1,531 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { TaxManagementService } from '../../services/tax-management.service'; +import { TaxManagementUploadSettingComponent } from './upload-setting/upload-setting.component'; +import { TaxManagementOrderVerifyResultComponent } from './verify-result/verify-result.component'; +// import { DatatableReportingUploadSettingComponent } from '../upload-setting/upload-setting.component'; +// import { DatatableReportingVerifyResultComponent } from '../verify-result/verify-result.component'; + +@Component({ + selector: 'app-tax-management-order-reporting', + templateUrl: './order-reporting.component.html', + styleUrls: ['./order-reporting.component.less'] +}) +export class TaxManagementOrderReportingComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType!: string; + isLoading: boolean = false; + tabs: any[] = [ + { name: '待上传', value: '0' }, + { name: '上传中', value: '3' }, + { name: '已上传', value: '1' }, + { name: '异常', value: '2' }, + { name: '全部', value: '' } + ]; + selectedIndex = ''; //选择的项目 + serviceTel = ''; + constructor( + public service: TaxManagementService, + private router: Router, + private ar: ActivatedRoute, + public shipperservice: ShipperBaseService, + private modal: NzModalService, + public shipperSrv: ShipperBaseService + ) { + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}, { + putStatus: this.selectedIndex, + }); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item: any) => item.checked) || []; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.isLoading = true + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + billCode: { title: '订单号', type: 'string', ui: { placeholder: '请输入' } }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入', + }, + }, + shipperId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + + } as SFSelectWidgetSchema + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + placeholder: '请输入司机姓名/手机号', visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + carNo: { + title: '车牌号', + type: 'string', + maxLength: 9, + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + collectionUserName: { + title: '收款人', + type: 'string', + maxLength: 9, + ui: { + placeholder: '请输入', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + // putStatus: { + // title: '上传状态', + // type: 'string', + // enum: [ + // {label: '待上传',value: 0}, + // {label: '已上传',value: 1}, + // {label: '上传异常',value: 2}, + // ], + // ui: { + // widget:'select', + // placeholder: '请选择', + // visibleIf: { + // _$expand: (value: boolean) => value, + // }, + // } + // }, + checkStatus: { + title: '本地校验', + type: 'string', + enum: [ + {label: '校验中',value: 0}, + {label: '通过',value: 1}, + {label: '不通过',value: 2}, + ], + ui: { + widget:'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + networkTransporter: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + recentlyPutTime: { + title: '上传时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + orderPayTime: { + title: '结束时间', + type: 'string', + ui: { + widget: 'sl-from-to', + type: 'date', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + }, + }; + this.ui = { + '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.search() }, + $time: { grid: { span: 24 } }, + }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', className: 'text-center', width: '60px', }, + { title: '上传状态', render: 'putStatus', className: 'text-center', width: '120px', }, + { title: '本地校验', render: 'checkStatus', className: 'text-center', width: '120px', }, + { + title: '订单号', + index: 'billCode', + className: 'text-center', + width: '150px', + }, + { title: '运单号', index: 'wayBillCode', className: 'text-center', width: '150px', }, + { + title: '网络货运人', + index: 'networkTransporterName', + className: 'text-center', + width: '180px', + }, + { + title: '档案编号', + index: 'archivesNo', + className: 'text-center', + width: '180px', + }, + { + title: '品牌型号', + index: 'carBrand', + className: 'text-center', + width: '180px', + }, + { title: '装货地', index: 'loadingAddress', render: 'loadingPlace', className: 'text-center', width: '200px' }, + { title: '装货地详细地址', index: 'loadingDetailedAddress', render: 'loadingPlace', className: 'text-center', width: '200px' }, + { title: '卸货地', index: 'unloadAddress', render: 'dischargePlace', className: 'text-center', width: '120px' }, + { title: '卸货地详细地址', index: 'unloadDetailedAddress', className: 'text-center', width: '180px' }, + { title: '货主名称', index: 'shipperName', className: 'text-center', width: '180px' }, + { title: '货主纳税人识别号', index: 'shipperProvinceCode', className: 'text-center', width: '180px' }, + { title: '录单时间', index: 'recordTime', className: 'text-center', width: '250px' }, + { title: '接单时间', index: 'wayBillCreateTime', className: 'text-center', width: '200px' }, + { title: '发车时间', index: 'loadTime', className: 'text-center', width: '200px' }, + { title: '到车时间', index: 'unloadTime', className: 'text-center', width: '150px' }, + { title: '结束时间', index: 'payeeName', className: 'text-center', width: '150px' }, + { title: '订单金额', render: 'orderAmount', className: 'text-center', width: '120px' }, + { title: '司机姓名', render: 'driverName', className: 'text-center', width: '150px' }, + { title: '司机身份证号', index: 'transpdriverCertificateNumberortInfo', className: 'text-center', width: '180px' }, + { title: '车牌号', index: 'carNo', className: 'text-center', width: '100px' }, + { title: '货物信息', render: 'transportInfo', className: 'text-center', width: '200px' }, + { title: '运费金额', render: 'payeeName', className: 'text-center', width: '100px' }, + { title: '装卸方式', index: 'loadingUnloadWay', className: 'text-center', width: '180px' }, + { title: '支付方式', index: 'payMent', className: 'text-center', width: '150px' }, + { title: '支付账号', index: 'paymentAccount', className: 'text-center', width: '200px' }, + { title: '银行流水号', index: 'bankSerialNumber', className: 'text-center', width: '150px' }, + { title: '收款人姓名', index: 'collectionUserName', className: 'text-center', width: '250px' }, + { title: '收款人身份证号码', index: 'collectionUserCertificateNumber', className: 'text-center', width: '180px' }, + { title: '装货照片', render: 'loadingPicture', className: 'text-center', width: '100px' }, + { title: '卸货照片', render: 'unloadPicture', className: 'text-center', width: '100px' }, + { title: '提货单', render: 'loadingLadingBill', className: 'text-center', width: '100px' }, + { title: '签收单', render: 'signatureForm', className: 'text-center', width: '100px' }, + { title: '上传次数', index: 'putNumber', className: 'text-center', width: '100px' }, + { title: '最近上传时间', index: 'recentlyPutTime', className: 'text-center', width: '180px' }, + ]; + } + + + + /** + *撤回 + * @param record 记录实例 + */ + recall() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要撤回的数据'); + return; + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + this.modal.confirm({ + nzTitle: '撤回提示', + nzContent: ' 撤回后可以重新上传,重新上传会覆盖已上传数据,确定要撤回?', + nzOkText: '确定', + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_get_recessionTaxOrder, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('撤销成功'); + this.search(); + } + }) + } + }); + + } + /** + *撤销 + * @param record 记录实例 + */ + resetData() { + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要更新的数据!'); + return; + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.billId); + }); + this.service.request(this.service.$api_get_renewalOrderById, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('更新成功'); + this.st.load(1); + } + }) + } + /** + *撤销 + * @param record 记录实例 + */ + unnormal(value: any) { + // if (this.selectedRows.length === 0) { + // this.openWainingModal('请选择需要更新的数据!'); + // return; + // } + console.log(this.selectedRows); + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + this.modal.confirm({ + nzTitle: '税务审核结果', + nzContent: '订单结算时间所在月份与申报月份不一致', + nzOkText: '确定', + nzCancelText: '', + nzOnOk: () => { + this.service.request(this.service.$api_get_recessionTaxOrder, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('撤销成功'); + this.search(); + } + }) + } + }); + + } + + selectChange(item: any) { + console.log(item); + + this.selectedIndex = item?.value || ''; + setTimeout(() => { + this.st.load(); + }) + } + + /** + * 查看当行数据 + */ + view(record: STData) { + // this.router.navigate(['../view', record.uuid], { relativeTo: this.ar }); + this.router.navigate(['../detail'], { + queryParams: { + id: record.id, + }, + relativeTo: this.ar + }); + } + + // appeal(item: any) { + // const modalRef = this.modal.create({ + // nzTitle: '申诉', + // nzWidth: '40%', + // nzContent: CtcAppealComponent, + // nzComponentParams: { + // i: item, + // status: 'add' + // }, + // nzFooter: null + // }); + // modalRef.afterClose.subscribe(res => { + // if (res) { + // this.search({ representationsStatus: '' }); + // } + // }) + // } + + /** + * 上传 + */ + upload() { + let status = false + if (this.selectedRows.length === 0) { + this.openWainingModal('请选择需要上传的数据'); + return; + } + this.selectedRows.forEach(item => { + if (item?.putStatus != '0') { + status = true + } + + }); + if(status) { + this.service.msgSrv.warning('选择了已上传,请重新勾选!'); + return; + } + let params: any[] = []; + this.selectedRows.forEach(item => { + params.push(item.id); + }); + this.service.request(this.service.$api_get_uploadingTaxOrder, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('上传成功'); + this.st.load(); + } + }) + } + + + /** + * + * @param params 上传设置 + */ + uploadSetting() { + const modalRef = this.modal.create({ + nzTitle: '税务上传设置', + nzWidth: 600, + nzContent: TaxManagementUploadSettingComponent, + nzComponentParams: {}, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }) + } + + /** + * 查看校验结果 + */ + viewResult(item: any) { + const modalRef = this.modal.create({ + nzTitle: '本地校验结果', + nzWidth: 1200, + nzContent: TaxManagementOrderVerifyResultComponent, + nzComponentParams: { + record: item + }, + nzFooter: null + }); + modalRef.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }) + } + + /** + * 查看监管审核结果 + */ + viewAuditResult(record: any) { + if (record?.billStatus !== '2') { + return; + } + this.openWainingModal('监管审核结果', record?.result) + } + + + search() { + this.st.load(1); + } + + /** + * 异步导出 + */ + export() { + this.service.exportStart(this.sf?.value, this.service.$api_async_export_order_reporting_list); + } + + openWainingModal(content: string, title = '提示') { + this.modal.warning({ + nzMask: false, + nzTitle: title, + nzContent: content, + }) + } + +} diff --git a/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.html b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.html new file mode 100644 index 00000000..a4f5ae6e --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.spec.ts b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.spec.ts new file mode 100644 index 00000000..aeb5cf2c --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingUploadSettingComponent } from './upload-setting.component'; + +describe('DatatableReportingUploadSettingComponent', () => { + let component: DatatableReportingUploadSettingComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingUploadSettingComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingUploadSettingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.ts b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.ts new file mode 100644 index 00000000..f171259e --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/upload-setting/upload-setting.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit } from '@angular/core'; +import { SFSchema, SFUISchema } from '@delon/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { TaxManagementService } from '../../../services/tax-management.service'; + + +@Component({ + selector: 'app-datatable-upload-setting', + templateUrl: './upload-setting.component.html', +}) +export class TaxManagementUploadSettingComponent implements OnInit { + record: any = {}; + i: any = {}; + schema!: SFSchema; + ui!: SFUISchema; + + constructor( + private modal: NzModalRef, + public service: TaxManagementService + ) { } + + ngOnInit(): void { + this.initSF(); + // this.loadData(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + no: { + type: 'string', + title: '订单数据', + enum: [ + { + label: '手动上传', + value: '1' + }, + { + label: '自动上传', + value: '2' + } + ], + description: '开启自动上传后,订单将在支付完成且风险单校验通过后自动上传', + ui: { + widget: 'radio', + + } + }, + owner: { + type: 'string', + title: '资金数据', + enum: [ + { + label: '手动上传', + value: '1' + }, + { + label: '自动上传', + value: '2' + } + ], + description: '开启自动上传后,订单将在支付完成且风险单校验通过后自动上传', + ui: { + widget: 'radio', + + } + }, + }, + required: ['owner', 'no'], + } + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 24 }, + }, + }; + } + + /** + * 获取设置数据 + */ + loadData() { + this.service.request(this.service.$api_get_upload_setting, {}).subscribe(res => { + if (res) { + this.i = res; + + } + }) + } + + /** + * 修改 + * @param value + */ + save(value: any): void { + this.service.request(this.service.$api_upload_setting_save, { ...value }).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功'); + this.modal.close(true); + } + }) + } + + close(): void { + this.modal.destroy(); + } +} diff --git a/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.html b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.html new file mode 100644 index 00000000..d2113932 --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.html @@ -0,0 +1,40 @@ + +
    +
    + + + +
    +
    + + +
    +
    {{ item.expenseName }}:{{ item.price | currency }}
    +
    +
    +
    +
    +
    + diff --git a/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.spec.ts b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.spec.ts new file mode 100644 index 00000000..48b1e9e5 --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { DatatableReportingVerifyResultComponent } from './verify-result.component'; + +describe('DatatableReportingVerifyResultComponent', () => { + let component: DatatableReportingVerifyResultComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [DatatableReportingVerifyResultComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatatableReportingVerifyResultComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.ts b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.ts new file mode 100644 index 00000000..9bb45bcc --- /dev/null +++ b/src/app/routes/tax-management/components/order-reporting/verify-result/verify-result.component.ts @@ -0,0 +1,149 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-30 14:26:01 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-09 14:10:37 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\tax-management\\components\\order-reporting\\verify-result\\verify-result.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { SFSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { TaxManagementService } from '../../../services/tax-management.service'; + +@Component({ + selector: 'app-tax-management-order-reporting-verify-result', + templateUrl: './verify-result.component.html', +}) +export class TaxManagementOrderVerifyResultComponent implements OnInit { + searchSchema: SFSchema = { + properties: { + no: { + type: 'string', + title: '编号' + } + } + }; + @ViewChild('st') private readonly st!: STComponent; + columns: STColumn[] = []; + record: any = {} + subjectType: string = '0'; + tabs: any[] = [ + { name: '平台信息', value: '0' }, + { name: '货主信息', value: '1' }, + { name: '司机信息', value: '2' }, + { name: '订单信息', value: '3' }, + ]; + + // get reqParams() { + // console.log(this.subjectType); + // const params ={ + // subjectId: this.record?.shipperId, + // subjectType: this.subjectType, + // } + // return params; + // } + beforeReq = (requestOptions: STRequestOptions) => {let a: string = ''; + switch (this.subjectType) { + case '0': + a = this.record?.networkTransporterId; + break + case '1': + a = this.record?.shipperId; + break + case '2': + a = this.record?.driverId; + break + case '3': + a = this.record?.wayBillId; + break + } + Object.assign(requestOptions.body, { + subjectId: a , + subjectType: this.subjectType, + }); + return requestOptions; + }; + afterRes = (data: any[], rawData?: any) => { + console.log(data) + return data.map(item => ({ + ...item, + })); + }; + constructor(public service: TaxManagementService, private modalRef: NzModalRef, public router: Router) { + } + + ngOnInit(): void { + console.log(this.record); + + this.initST(); + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '序号', type: 'no', className: 'text-center', width: '60px', }, + { title: '校验字段', index: 'checkFieldName', className: 'text-center', width: '120px', }, + { + title: '是否必填', + index: 'requiredStatus', + className: 'text-center', + width: '100px', + type: 'enum', + enum: { + 0: '否', + 1: '是' + } + }, + { title: '上传值', index: 'fieldValue', className: 'text-center', width: '150px', }, + { + title: '本地校验', index: 'checkStatus', className: 'text-center', width: '100px', + type: 'enum', + enum: { + 0: '校验中', + 1: '通过', + 2: '不通过' + } + }, + { title: '错误内容', index: 'remark', className: 'text-center', width: '150px', }, + ] + } + + + add(): void { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + + selectTab(e: any) { + setTimeout(() => { + console.log(e?.value); + + this.subjectType = e?.value; + console.log(this.subjectType); + this.st.load(1); + }) + } + + update() { + if (this.record?.billType === '1') { + window.open(location.origin + `/#/order-management/vehicle-detailChange/${this.record?.id}`) + + } else if (this.record.billType === '2') { + window.open(location.origin + `/#/order-management/bulk-detailChange/${this.record?.id}`); + } + } + close(): void { + this.modalRef.destroy(); + } + + +} diff --git a/src/app/routes/tax-management/services/tax-management.service.ts b/src/app/routes/tax-management/services/tax-management.service.ts new file mode 100644 index 00000000..5cfd0639 --- /dev/null +++ b/src/app/routes/tax-management/services/tax-management.service.ts @@ -0,0 +1,62 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2021-12-27 10:30:56 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-19 14:19:44 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\tax-management\\services\\tax-management.service.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ + +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class TaxManagementService extends ShipperBaseService { + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + // + public $api_order_reporting_page = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + + // 查询运营报表 + $api_listOperationalReportPage = `/api/sdc/report/listOperationalReportPage`; + + // 查询个税申报明细 + $api_get_individual_income_page = `/api/sdc/taxIncome/list/page`; + // 更新所有数据个税申报明细 + $api_update_individual_income_page = `/api/sdc/taxIncome/updateAll`; + + // 查询个税汇总 + $api_get_individual_collect_page = `/api/sdc/taxSummary/list/page`; + // 更新所有数据个税汇总 + $api_update_individual_collect_page = `/api/sdc/taxIncome/updateAll`; + + // 订单上报列表 + $api_getTaxOrderPage_page = `/api/sdc/taxOrder/getTaxOrderPage`; + // 根据订单Id更新税务订单 + $api_get_renewalOrderById = `/api/sdc/taxOrder/renewalOrderById`; + // 撤回税务订单 + $api_get_recessionTaxOrder = `/api/sdc/tax/recessionTaxOrder`; + // 上传税务订单 + $api_get_uploadingTaxOrder = `/api/sdc/tax/uploadingTaxOrder`; + // 上传税务订单 + $api_get_getTaxFieldCheckList = `/api/sdc/taxFieldCheck/getTaxFieldCheckList`; + + // 查询税务申报 + $api_get_taxDeclaration = `/api/sdc/taxDeclaration/list/page`; + // 更新所有税务申报 + $api_get_taxDeclaration_updateAll = `/api/sdc/taxDeclaration/updateAll`; + // 更新所有个税汇总 + $api_get_updateData = `/api/sdc/taxSummary/updateData`; + $api_recall_reporting = ``; // 撤回 + $api_async_export_order_reporting_list = ``; // 导出订单上报 + $api_get_upload_setting = ``; // 修改上传设置 + $api_upload_setting_save = ``; // 修改上传设置 + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/tax-management/tax-management-routing.module.ts b/src/app/routes/tax-management/tax-management-routing.module.ts new file mode 100644 index 00000000..84b09d08 --- /dev/null +++ b/src/app/routes/tax-management/tax-management-routing.module.ts @@ -0,0 +1,31 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-30 13:58:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-31 10:37:24 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\tax-management\\tax-management-routing.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { TaxManagementIndividualCollectComponent } from './components/individual-collect/individual-collect.component'; +import { TaxManagementIndividualDeclareComponent } from './components/individual-declare/individual-declare.component'; +import { TaxManagementIndividualIncomeComponent } from './components/individual-income/individual-income.component'; +import { TaxManagementOrderReportingComponent } from './components/order-reporting/order-reporting.component'; + + +const routes: Routes = [ + { path: 'orderReport', component: TaxManagementOrderReportingComponent }, + { path: 'income', component: TaxManagementIndividualIncomeComponent }, + { path: 'collect', component: TaxManagementIndividualCollectComponent }, + { path: 'declare', component: TaxManagementIndividualDeclareComponent }, +]; + + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class TaxManagementModuleRoutingModule { } diff --git a/src/app/routes/tax-management/taxmanagement.module.ts b/src/app/routes/tax-management/taxmanagement.module.ts new file mode 100644 index 00000000..92dbda10 --- /dev/null +++ b/src/app/routes/tax-management/taxmanagement.module.ts @@ -0,0 +1,40 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-30 13:58:28 + * @LastEditors : Shiming + * @LastEditTime : 2022-03-30 14:35:17 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\tax-management\\taxmanagement.module.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { NgModule, Type } from '@angular/core'; +import { SharedModule, SHARED_G2_MODULES } from '@shared'; +import { TaxManagementIndividualCollectComponent } from './components/individual-collect/individual-collect.component'; +import { TaxManagementIndividualDeclareComponent } from './components/individual-declare/individual-declare.component'; +import { TaxManagementIndividualIncomeComponent } from './components/individual-income/individual-income.component'; +import { TaxManagementOrderReportingComponent } from './components/order-reporting/order-reporting.component'; +import { TaxManagementUploadSettingComponent } from './components/order-reporting/upload-setting/upload-setting.component'; +import { TaxManagementOrderVerifyResultComponent } from './components/order-reporting/verify-result/verify-result.component'; +import { TaxManagementModuleRoutingModule } from './tax-management-routing.module'; + + +const COMPONENTS: Type[] = [ + TaxManagementOrderReportingComponent, + TaxManagementOrderVerifyResultComponent, + TaxManagementUploadSettingComponent, + TaxManagementIndividualIncomeComponent, + TaxManagementIndividualCollectComponent, + TaxManagementIndividualDeclareComponent +] + + +@NgModule({ + imports: [ + SharedModule, + TaxManagementModuleRoutingModule, + SHARED_G2_MODULES + ], + declarations: COMPONENTS, +}) +export class TaxManagementModule { } diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.html b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.html new file mode 100644 index 00000000..bd28cc3d --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.html @@ -0,0 +1,105 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 张发票   发票金额总计 + {{totalCallNo }} + 清空 +
    + + +
    +
    + + + + + {{ item.vatinvcode }}
    + +
    +
    +
    + + +
    +
    + + {{openInfo?.artoname}} + + + {{openInfo?.artotaxno}} + + + {{openInfo?.artoadd}} + + + {{openInfo?.artotel}} + + + {{openInfo?.artobank}} + + + {{openInfo?.artoacc}} + + + {{openInfo?.vatnameLabel}} + + + {{openInfo?.vatremarks}} + + + {{openInfo?.otherremarks}} + + + {{openInfo?.isdetail?'需要':'不需要'}} + + + {{openInfo?.vatmoney | currency}} + + + + + + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.less b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.less new file mode 100644 index 00000000..40095399 --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.less @@ -0,0 +1,26 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } + + .text-truncate { + white-space: normal; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.ts b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.ts new file mode 100644 index 00000000..f38bbe2b --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/cancellation-invoice.component.ts @@ -0,0 +1,432 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFSelectWidgetSchema, SFSchemaEnum } from '@delon/form'; +import { dateTimePickerUtil } from '@delon/util'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { TicketService } from '../../services/ticket.service'; +import { RequestedInvoiceModalComponent } from '../invoice-requested/requested-invoice-modal/requested-invoice-modal.component'; +import { PushInvoiceComponent } from './push-invoice/push-invoice.component'; + +@Component({ + selector: 'app-cancellation-invoice', + templateUrl: './cancellation-invoice.component.html', + styleUrls: ['./cancellation-invoice.component.less'] +}) +export class CancellationInvoiceComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('requestedModal', { static: false }) + requestedModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + resourceStatus: any = ''; + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + + openInfo: any = { invoicedate: null, invoiceno: null, invoiceno2: null }; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + if (this.resourceStatus) { + Object.assign(requestOptions.body, { + sts: this.resourceStatus + }); + } else { + delete requestOptions.body.sts; + } + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + return data.map(node => ({ ...node, disabled: node.sts === '3' })); + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.vatmoney, 0).toFixed(2); + break; + } + } + + selectChange(e: any) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + + /** + * 手工开票 + * @param item + */ + requestedAction(item: any) { + this.openInfo = { invoicedate: null, invoiceno: null, invoiceno2: null }; + this.service.request(this.service.$api_get_apply_fico_info, { id: item.vatappHId }).subscribe(info => { + if (info) { + Object.assign(this.openInfo, { ...info }); + const modal = this.nzModalService.create({ + nzTitle: '发票确认', + nzContent: this.requestedModal, + nzOnOk: () => { + if (!this.openInfo?.invoicedate || !this.openInfo?.invoiceno) { + this.service.msgSrv.warning('请填开票信息'); + return false; + } + const params = { + invoiceno: this.openInfo.invoiceno, + invoicedate: dateTimePickerUtil.format(this.openInfo.invoicedate), + invoiceno2: this.openInfo.invoiceno2 + }; + this.service + .request(this.service.$api_apply_fico_invoic, { + id: item.id, + vatinvcode: item.vatinvcode, + ...params + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('开票成功'); + this.st.load(1); + modal.destroy(); + } + }); + + return false; + } + }); + } + }); + } + + /** + * 批量推送发票 + */ + batchPush() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择推送开票单'); + return; + } + if (this.selectedRows.find(item => item.sts !== '1')) { + this.service.msgSrv.warning('请勿选择非待处理申请'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定将所选待处理开票申请推送开票?', + nzContent: '推送开票后发票信息不可修改,待系统开票完成后会自动返回开票结果', + nzOnOk: () => { + this.service + .request( + this.service.$api_batch_push_invoic, + this.selectedRows.map(row => row.id) + ) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('推送开票成功'); + this.st.load(1); + } + }); + } + }); + } + + /** + * 撤回 + * @param item + * @returns + */ + batchWithdraw(item?: any) { + if (this.selectedRows?.length <= 0 && !item) { + this.service.msgSrv.warning('请选择开票申请'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定将所选待确认开票申请撤回?', + nzContent: '提交税控后发票信息不可修改,待税控开票完成后返回开票结果', + nzOnOk: () => {} + }); + } + + /** + * 移除 + * @returns + */ + batchRemove() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择开票申请'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定将所选待确认开票申请撤回?', + nzContent: '提交税控后发票信息不可修改,待税控开票完成后返回开票结果', + nzOnOk: () => {} + }); + } + + /** + * 作废发票 + * @param item + * @returns + */ + removeInvocie(item?: any) { + const modal = this.nzModalService.warning({ + nzTitle: '确定将所选已确认开票申请作废?', + nzContent: '作废后发票信息不可修改', + nzOnOk: () => { + this.service.request(this.service.$api_cancel_invoic, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('发票作废成功'); + this.st.load(1); + modal.destroy(); + } + }); + return false; + } + }); + } + + downLoadDetail(item: any) { + this.service.exportStart({ id: item.id }, this.service.$api_export_invoic_detail); + } + + /** + * 推送发票 + * @param item + */ + pushInvoiceAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '推送开票', + nzContent: PushInvoiceComponent, + nzComponentParams: { id: item.vatappHId }, + nzWidth: 1200, + nzOnOk: () => { + this.service.request(this.service.$api_push_invoic, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('推送开票成功'); + this.st.load(1); + } + }); + return false; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + vatappHCode: { + type: 'string', + title: '申请编号', + ui: { + placeholder: '请输入' + } + }, + arto: { + type: 'string', + title: '购买人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }) + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + sts: { + title: '发票状态', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'vatinv:status' }, + containAllLable: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + // or2derSn: { + // type: 'string', + // title: '订单号', + // ui: { + // placeholder: '请输入', + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // }, + createTime: { + title: '申请时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', fixed: 'left', width: 50, className: 'text-center' }, + { title: '分票编号', render: 'vatinvcode', width: 220 }, + { + title: '申请编号', + index: 'vatappHCode', + width: 220, + type: 'link', + click: item => this.router.navigate(['/ticket/invoice-requested/detail/' + item?.vatappHId]) + }, + { title: '申请时间', index: 'createTime', type: 'date', width: 150 }, + { title: '发票类型', index: 'vatapptypeLabel', width: 150 }, + { title: '网络货运人', index: 'ltdName', width: 220 }, + { title: '购买人', index: 'artoname', width: 220 }, + { title: '订单数', index: 'ordlines', width: 90, className: 'text-right' }, + { + title: '价税合计', + index: 'vatmoney', + width: 140, + type: 'widget', + className: 'text-right font-weight-bold', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatmoney }) } + }, + { + title: '金额', + index: 'vatnotax', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatnotax }) } + }, + // { + // title: '税率', + // index: 'billvatrate', + // width: 120, + // className: 'text-right', + // format: item => `${item.billvatrate ? ((item.billvatrate as number) * 100).toFixed(2) : 0}%` + // }, + { + title: '税额', + index: 'vattax', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vattax }) } + }, + { title: '服务名称', index: 'vatname', width: 120 }, + { title: '销货清单', index: 'isdetail', width: 120, type: 'enum', enum: { 1: '是', 0: '否' }, className: 'text-center' }, + { title: '票面备注', index: 'remarks', width: 300 }, + { title: '其他要求', index: 'otherremarks', width: 100 }, + { + title: '操作', + width: '120px', + fixed: 'right', + className: 'text-center', + buttons: [ + { type: 'divider' }, + { + text: '查看明细
    ', + click: item => + this.router.navigate(['ticket/cancellation-invoice/detail/' + item.id], { + queryParams: { type: 1, expressno: item.expressno, ltdId: item.shipperId } + }) + }, + { + text: '销货清单
    ', + iif: item => item.isdetail, + click: item => this.downLoadDetail(item) + }, + { + text: '手工开票
    ', + iif: item => item.sts != '3', + click: item => this.requestedAction(item) + } + // { + // text: '推送开票
    ', + // iif: item => item.sts === '1', + // click: item => this.pushInvoiceAction(item) + // } + // { + // text: '作废发票', + // iif: item => item.sts === '3', + // click: item => this.removeInvocie(item) + // } + // { + // text: '确认' + // // click: item => this.rejectAction(item) + // }, + // { + // text: '撤回', + // click: item => this.batchWithdraw(item) + // } + ] + } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.html b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.html new file mode 100644 index 00000000..b0c00a7b --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.html @@ -0,0 +1,56 @@ +
    +
    + + {{info?.artoName}} + + + {{info?.taxNumber}} + + + {{info?.registerAddr}} + + + {{info?.registerPhone}} + + + {{info?.bankName}} + + + {{info?.bankAccount}} + + + {{info?.vatremarks}} + +
    +
    + + {{info?.ltdidName}} + + + {{info?.vatappcode}} + + + {{info?.vatinvBillNum}}笔 + + + {{info?.vatinvHNumAmount | currency}}元 + + + {{info?.vatnameLabel}} + + + {{info?.isdetail?'是':'否'}} + + + {{info?.otherremarks}} + + +
    +
    + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.less b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.less new file mode 100644 index 00000000..41a8c3bb --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.less @@ -0,0 +1,16 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + + .text-truncate { + white-space: normal; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.ts b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.ts new file mode 100644 index 00000000..dec8b28f --- /dev/null +++ b/src/app/routes/ticket-management/components/cancellation-invoice/push-invoice/push-invoice.component.ts @@ -0,0 +1,62 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-push-invoice', + templateUrl: './push-invoice.component.html', + styleUrls: ['./push-invoice.component.less'], + providers: [CurrencyPipe] +}) +export class PushInvoiceComponent implements OnInit { + @ViewChild('st', { static: false }) + st!: STComponent; + columns!: STColumn[]; + + info: any = {}; + id!: number; + + constructor(public service: TicketService, private nzModalService: NzModalService, private currencyPipe: CurrencyPipe) {} + + ngOnInit(): void { + this.loadHeader(this.id); + setTimeout(() => { + this.columns = this.initST(); + }, 100); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { vatinvHId: this.id }); + return requestOptions; + }; + + loadHeader(id: number) { + this.service.request(this.service.$api_ficoVatinv_header, { id }).subscribe(res => { + console.log(res); + + if (res) { + this.info = res; + } + }); + } + + private initST(): STColumn[] { + return [ + { title: '服务名称', index: 'vatname', width: 100 }, + { title: '规格型号', index: 'vatmodel', width: 150 }, + { title: '单位', index: 'vatunit', width: 90, className: 'text-center' }, + { title: '数量', index: 'vatqty', width: 90, className: 'text-right' }, + { title: '金额', index: 'vatnotax', width: 90, type: 'currency', format: item => `${this.currencyPipe.transform(item.vatnotax)}` }, + { + title: '税率', + index: 'vatrate', + width: 90, + className: 'text-right', + format: item => `${item.vatrate ? ((item.vatrate as number) * 100).toFixed(2) : 0}%` + }, + { title: '税额', index: 'vattax', width: 90, type: 'currency', format: item => `${this.currencyPipe.transform(item.vattax)}` } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.html b/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.html new file mode 100644 index 00000000..43a41742 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.html @@ -0,0 +1,15 @@ +
    +
    + +
    +
    + + +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.ts b/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.ts new file mode 100644 index 00000000..2910a0ab --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/add-cart/add-cart.component.ts @@ -0,0 +1,74 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-add-cart', + templateUrl: './add-cart.component.html' +}) +export class AddCartComponent implements OnInit { + data = []; + selectedData: any[] = []; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '车牌号', index: 'carNo' }, + { title: '车辆所有人', index: 'carOwner' } + ]; + searchSchema: SFSchema = { + properties: { + carNo: { + title: '', + type: 'string', + ui: { + placeholder: '请输入车牌号' + } + }, + carOwner: { + title: '', + type: 'string', + ui: { + placeholder: '请输入车辆所有人' + } + } + } + }; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + return data.map(item => ({ ...item, disabled: item.isWhiteList })); + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedData = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.html b/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.html new file mode 100644 index 00000000..c1bc3d77 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.html @@ -0,0 +1,15 @@ +
    +
    + +
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.ts b/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.ts new file mode 100644 index 00000000..02136e3a --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/add-owner/add-owner.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-add-owner', + templateUrl: './add-owner.component.html' +}) +export class AddOwnerComponent implements OnInit { + data = []; + selectedData: any[] = []; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '企业名称', index: 'enterpriseName' }, + { title: '联系人姓名', index: 'contacter' }, + { title: '联系人手机号', index: 'mobile' }, + { + title: '认证状态', + index: 'approvalStatus', + type: 'enum', + enum: { 1: '未上传', 0: '草稿', 10: '待审核', 20: '已审核', 30: '已驳回', 40: '证件过期' } + } + ]; + searchSchema: SFSchema = { + properties: { + enterpriseName: { + title: '', + type: 'string', + ui: { + placeholder: '请输入企业名称' + } + }, + contactName: { + title: '', + type: 'string', + ui: { + placeholder: '请输入姓名' + } + }, + mobile: { + title: '', + type: 'string', + ui: { + placeholder: '请输入手机号' + } + } + } + }; + + constructor(public service: TicketService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { + listSource: 2, + approvalStatus: '20' + }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedData = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.html b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.html new file mode 100644 index 00000000..94d5cf5f --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.html @@ -0,0 +1,57 @@ + + + + + + + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + +
    + + +
    + 已选择 + {{ selectedRows.length }} 条数据 + 清空 +
    +
    + +
    diff --git a/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.less b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.less new file mode 100644 index 00000000..20e631b8 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.less @@ -0,0 +1,10 @@ +:host::ng-deep { + + .tabs-wrap>.ant-tabs-nav { + margin-bottom: 0; + } + + h1 { + margin: 0; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.ts b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.ts new file mode 100644 index 00000000..ad17492a --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-blacklist/etc-blacklist.component.ts @@ -0,0 +1,306 @@ +import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; +import { TicketService } from '../../services/ticket.service'; +import { AddCartComponent } from './add-cart/add-cart.component'; +import { AddOwnerComponent } from './add-owner/add-owner.component'; + +@Component({ + selector: 'app-etc-blacklist', + templateUrl: './etc-blacklist.component.html', + styleUrls: ['../../../commom/less/box.less', './etc-blacklist.component.less'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ETCBlacklistComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + tabs = [ + { + name: '货主', + type: 1, + isActived: false + }, + { + name: '车辆', + type: 2, + isActived: false + } + ]; + tabType = 1; + + searchSchema: SFSchema = this.initSF(); + + columns: STColumn[] = this.initST(); + + selectedRows: any[] = []; + + constructor(public service: TicketService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + this.selectedRows = []; + return requestOptions; + }; + + // 切换Tab + changeTab(item: any) { + this.tabType = item.type; + this.sf?.setValue('/tabType', item.type); + this.sf?.reset(); + this.selectedRows = []; + setTimeout(() => { + this.tabs.forEach(i => (i.isActived = false)); + item.isActived = !item.isActived; + // this.st.load(1); + this.st.resetColumns(); + }, 500); + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + configAction(item?: any) { + if (this.tabType === 1) { + this.addOwnerAction(item); + } else { + this.addCartAction(item); + } + } + + addOwnerAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '选择货主', + nzContent: AddOwnerComponent, + nzWidth: 850, + nzComponentParams: { data: [] }, + nzOnOk: com => { + if (com.selectedData?.length <= 0) { + this.service.msgSrv.warning('请选择货主'); + return false; + } + const ids = com.selectedData.map(node => node.id); + this.service.request(this.service.$api_save_etc_shipper, { shipperAppUserIdList: ids }).subscribe(res => { + if (res) { + this.service.msgSrv.success('添加成功'); + modal.destroy(); + this.st.load(1); + } + }); + return false; + } + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + addCartAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '选择车辆', + nzContent: AddCartComponent, + nzWidth: 700, + nzComponentParams: { data: [] }, + nzOnOk: com => { + if (com.selectedData?.length <= 0) { + this.service.msgSrv.warning('请选择车辆'); + return false; + } + const ids = com.selectedData.map(node => node.carId); + this.service.request(this.service.$api_save_etc_cart, { carIds: ids }).subscribe(res => { + if (res) { + this.service.msgSrv.success('添加成功'); + modal.destroy(); + this.st.load(1); + } + }); + return false; + } + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + deleteAction(item?: any) { + let ids: Array = []; + if (item) { + ids = [item.id]; + } else { + ids = this.selectedRows.map(node => node.id); + } + if (ids?.length <= 0) { + this.service.msgSrv.warning('请选择ETC白名单'); + return; + } + + const modal = this.nzModalService.warning({ + nzTitle: this.tabType === 1 ? '确定将所选货主从ETC白名单中剔除?' : '确定将所选车辆从ETC白名单中剔除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + if (this.tabType === 1) { + this.service.request(this.service.$api_delete_etc_shipper, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功'); + this.st.load(1); + this.selectedRows = []; + modal.destroy(); + } + }); + } else { + this.service.request(this.service.$api_delete_etc_cart, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('删除成功'); + this.st.load(1); + this.selectedRows = []; + modal.destroy(); + } + }); + } + return false; + }, + nzOkText: '确定' + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + private initSF(): SFSchema { + return { + properties: { + tabType: { + type: 'number', + ui: { + hidden: true + } + }, + shipperAppUserName: { + title: '企业名称', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 1 + } + } + }, + contactName: { + title: '联系人姓名', + type: 'string', + ui: { + placeholder: '姓名/手机/车牌号', + visibleIf: { + tabType: (value: number) => this.tabType === 1 + } + } + }, + contactPhoneNumber: { + title: '联系人手机号', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 1 + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 2 + } + } + }, + carOwner: { + title: '车辆所有人', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 2 + } + } + } + // params6: { + // title: '手机号', + // type: 'string', + // ui: { + // placeholder: '请输入', + // visibleIf: { + // tabType: (value: number) => this.tabType === 2 + // } + // } + // } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '企业名称', index: 'shipperAppUserName', iif: () => this.tabType === 1 }, + { title: '联系人姓名', index: 'contactName', iif: () => this.tabType === 1 }, + { title: '联系人手机号', index: 'contactPhoneNumber', iif: () => this.tabType === 1 }, + { + title: '认证状态', + className: 'text-center', + index: 'certificationStatus', + type: 'enum', + enum: { 1: '未上传', 0: '草稿', 10: '待审核', 20: '已审核', 30: '已驳回', 40: '证件过期' }, + iif: () => this.tabType === 1 + }, + { title: '车牌号', index: 'carNo', iif: () => this.tabType === 2 }, + { title: '车辆所有人', index: 'carOwner', iif: () => this.tabType === 2 }, + { title: '创建者', index: 'createUserIdLabel' }, + { + title: '创建时间', + index: 'createTime', + type: 'date' + }, + { + title: '操作', + className: 'text-center', + buttons: [ + { + text: '删除', + click: item => this.deleteAction(item) + } + ] + } + ]; + } + // 导出 + exprot() { + if (this.tabType == 1) { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_aficoShipperWhiteList_asyncExport); + } else { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_get_ficoCarWhiteList_asyncExport); + } + } +} diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html new file mode 100644 index 00000000..daaaf323 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html @@ -0,0 +1,34 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + {{item.driverName}}
    {{item.driverTelephone}} +
    + + {{item.licenseCarNo}}
    {{item.licenseBelonging}} +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts new file mode 100644 index 00000000..f8aab8ac --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts @@ -0,0 +1,199 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; +import { TransactionDetailsComponent } from './transaction-details/transaction-details.component'; + +@Component({ + selector: 'app-etc-invoiced-list', + templateUrl: './etc-invoiced-list.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class ETCInvoicedListComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + return requestOptions; + }; + + showDetail(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '运单交易明细', + nzContent: TransactionDetailsComponent, + nzNoAnimation: true, + nzWidth: 950, + nzComponentParams: { data: item }, + nzOnOk: com => { + console.log(com.selectedData); + }, + nzOkText: '导出' + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + autocomplete: 'off' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off' + } + }, + billType: { + type: 'string', + title: '订单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bill:type' }, + placeholder: '请选择' + } + }, + invoicingStatus: { + type: 'string', + title: '开票状态', + ui: { + widget: 'dict-select', + params: { dictKey: 'etc:invoicing:status' }, + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + shipperId: { + type: 'string', + title: '托运人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '运单号', index: 'wayBillCode', width: 200 }, + { title: '订单号', index: 'billCode', width: 200 }, + { + title: '开票状态', + index: 'invoicingStatus', + type: 'enum', + enum: { '0': '待开票', '1': '开票中', '2': '已开票', '3': '开票失败' }, + width: 120 + }, + { title: '订单类型', index: 'billTypeLabel', width: 120 }, + { title: '装货地', index: 'loadingPlace', width: 200 }, + { title: '卸货地', index: 'dischargePlace', width: 200 }, + { title: '司机信息', render: 'call1No', width: 200 }, + { title: '车辆信息', render: 'call12No', width: 200 }, + { title: '托运人', index: 'shipperAppUserName', width: 200 }, + { title: '网络货运人', index: 'enterpriseInfoName', width: 200 }, + { + title: '开票金额', + index: 'invoicingAmount', + width: 100, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.invoicingAmount }) } + }, + { + title: '开票张数', + index: 'invoicingNumber', + width: 100, + className: 'text-right' + }, + { title: '申请时间', index: 'orderReceivingTime', type: 'date', width: 200 }, + { + title: '操作', + className: 'text-center', + width: 120, + buttons: [ + { + text: '交易明细', + click: item => this.showDetail(item) + } + ] + } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf?.value, pageSize: -1 }, this.service.$api_get_asyncExportEtcApplyRecordList); + } +} diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html new file mode 100644 index 00000000..fa1ba654 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html @@ -0,0 +1,32 @@ + +
    +
    + +
    +
    + + +
    + + +
    diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.less b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts new file mode 100644 index 00000000..27ac6d3e --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts @@ -0,0 +1,100 @@ +/* + * @Description : + * @Version : 1.0 + * @Author : Shiming + * @Date : 2022-03-14 14:17:38 + * @LastEditors : Shiming + * @LastEditTime : 2022-04-11 21:33:13 + * @FilePath : \\tms-obc-web\\src\\app\\routes\\ticket-management\\components\\etc-invoiced-list\\transaction-details\\transaction-details.component.ts + * Copyright (C) 2022 huzhenhong. All rights reserved. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-transaction-details', + templateUrl: './transaction-details.component.html' +}) +export class TransactionDetailsComponent implements OnInit { + data: any = []; + selectedData = []; + url = `/api/fcc/ficoEtcInvoiceH/list/page`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '交易id', index: 'tradeId' }, + { title: '交易流水号', index: 'tradeFlowNo' }, + { + title: '交易金额', + index: 'fee', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fee }) } + }, + { title: '开票状态', index: 'stateLabel' }, + { title: '交易时间', index: 'exTime', type: 'date' } + ]; + searchSchema: SFSchema = { + properties: { + state: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待开具', value: '1' }, + { label: '开具中', value: '2' }, + { label: '已开具', value: '3' }, + { label: '交易异常', value: '4' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + exTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void { + console.log(this.data); + } + get reqParams() { + const a: any = {}; + if (this.data?.id) { + a.waybillId = this.data?.wayBillId; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + exTime: { + start: this.sf?.value?.exTime?.[0] || '', + end: this.sf?.value?.exTime?.[1] || '' + } + }; + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html new file mode 100644 index 00000000..9384773b --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html @@ -0,0 +1,32 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + {{item.driverName}}
    {{item.driverCellphone}} +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts new file mode 100644 index 00000000..c3c7c253 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts @@ -0,0 +1,217 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; + +@Component({ + selector: 'app-etc-invoiced-logs', + templateUrl: './etc-invoiced-logs.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class ETCInvoicedLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + exTime: { + start: this.sf.value.exTime?.[0] || '', + end: this.sf.value.exTime?.[1] || '' + }, + invoiceMakeTime: { + start: this.sf.value.invoiceMakeTime?.[0] || '', + end: this.sf.value.invoiceMakeTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + routeTo(item: any) { + return; + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + exportList() { + const params = { listSource: 1, pageSize: -1 }; + if (this.sf) { + Object.assign(params, { + ...this.sf.value + }); + } + this.service.downloadFile(this.service.$api_export_invoice_logs_page, params); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + invoiceNum: { + type: 'string', + title: '发票号码', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + waybillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入' + } + }, + carNo: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + exTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + invoiceMakeTime: { + title: '开票日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + sellerName: { + type: 'string', + title: '销售方', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '发票号码', index: 'invoiceNum', width: 100, type: 'link', click: item => this.routeTo(item) }, + { title: '发票代码', index: 'invoiceCode', width: 130 }, + { title: '订单号', index: 'billCode', width: 180 }, + { title: '运单号', index: 'waybillCode', width: 180 }, + { title: '入站口', index: 'enStationName', width: 100 }, + { title: '出站口', index: 'exStationName', width: 100 }, + { title: '司机', render: 'call3No', width: 140 }, + { title: '车牌号', index: 'carNo', width: 100 }, + // { title: '里程(km)', index: 'mileage', width: 120 }, + { title: '交易id', index: 'tradeId', width: 200 }, + { + title: '交易金额(元)', + index: 'fee', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fee }) } + }, + { title: '税率', index: 'taxRate', width: 90, format: item => `${item.taxRate ? ((item.taxRate as number) * 100).toFixed(2) : 0}%` }, + { + title: '金额(元)', + index: 'invoiceAmount', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.invoiceAmount }) } + }, + { + title: '税额(元)', + index: 'totalTaxAmount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.totalTaxAmount }) } + }, + { + title: '价税合计(元)', + index: 'totalAmount', + width: 150, + type: 'widget', + className: 'text-right font-weight-bold', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.totalAmount }) } + }, + { title: '交易时间', index: 'exTime', type: 'date', width: 150 }, + { title: '开票日期', index: 'invoiceMakeTime', type: 'date', width: 150 }, + { title: '销售方', index: 'sellerName', width: 150 }, + { title: '网络货运人', index: 'enterpriseInfoName', width: 220 } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html new file mode 100644 index 00000000..24197616 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html @@ -0,0 +1,53 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 条运单 + 清空 +
    +
    + + + + {{item.driverName}}
    {{item.driverTelephone}} +
    + + {{item.licenseCarNo}}
    {{item.licenseBelonging}} +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts new file mode 100644 index 00000000..08ea0663 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts @@ -0,0 +1,240 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; + +@Component({ + selector: 'app-etc-invoiced-requested', + templateUrl: './etc-invoiced-requested.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class ETCInvoicedRequestedComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + this.selectedRows = []; + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + auditAction() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择申请记录'); + return; + } + const modal = this.nzModalService.warning({ + nzTitle: '确定对已选运单批量申请开票?', + nzOnOk: () => { + this.service + .request(this.service.$api_get_apply_invoice, { wayBillIds: this.selectedRows.map(item => item.id) }, 'POST', false) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('申请开票成功'); + this.st.load(1); + } + modal.destroy(); + }); + + return false; + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + billType: { + type: 'string', + title: '订单类型', + ui: { + widget: 'dict-select', + params: { dictKey: 'bill:type' }, + placeholder: '请选择' + } + }, + driverName: { + type: 'string', + title: '司机姓名', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + driverPhone: { + type: 'string', + title: '司机手机', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + licenseCarNo: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + licenseBelonging: { + type: 'string', + title: '车辆所有人', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + shipperId: { + type: 'string', + title: '托运人', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + enterpriseInfoName: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: '60px' }, + { title: '运单号', index: 'wayBillCode', width: '170px' }, + { title: '订单号', index: 'billCode', width: '170px' }, + { title: '订单类型', index: 'billTypeLabel', width: '140px' }, + { title: '装货地', index: 'loadingPlace', width: '220px' }, + { title: '卸货地', index: 'dischargePlace', width: '220px' }, + { title: '司机信息', render: 'call1No', width: '140px' }, + { title: '车辆信息', render: 'call1N2o', width: '200px' }, + { title: '车牌颜色', index: 'licenseCarNOColorLabel', width: '140px' }, + { title: '车辆是否已备案', index: 'putOnRecord', width: '150px', type: 'enum', enum: { false: '否', true: '是' } }, + { title: '托运人', index: 'shipperAppUserName', width: '140px' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '220px' }, + { title: '接单时间', index: 'orderReceivingTime', type: 'date', width: '150px' }, + { title: '装货时间', index: 'loadingTime', type: 'date', width: '150px' }, + { title: '卸货时间', index: 'unloadingTime', type: 'date', width: '150px' }, + { title: '签收时间', index: 'submissionTime', type: 'date', width: '150px' } + ]; + } + // 导出 + exprot() { + this.service.exportStart({ ...this.sf?.value, pageSize: -1 }, this.service.$api_get_asyncExportEtcApplyList); + } +} diff --git a/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.html b/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.html new file mode 100644 index 00000000..5d9aec99 --- /dev/null +++ b/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.html @@ -0,0 +1,16 @@ +
    +
    + +
    +
    + + +
    + +
    + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.less b/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.ts b/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.ts new file mode 100644 index 00000000..ee5bc68d --- /dev/null +++ b/src/app/routes/ticket-management/components/express-info/express-detail-modal/express-detail-modal.component.ts @@ -0,0 +1,113 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-express-detail-modal', + templateUrl: './express-detail-modal.component.html', + styleUrls: ['./express-detail-modal.component.less'] +}) +export class ExpressDetailModalComponent implements OnInit { + data = []; + selectedData = []; + url = `/api/fcc/ficoExpressH/getFicoVatinvHByExpress`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '发票号码', index: 'invoiceno', width: 160, className: 'text-left' }, + { title: '发票代码', index: 'invoiceno2', width: 160, className: 'text-left' }, + { title: '申请编号', index: 'vatinvcode', width: 160, className: 'text-left' }, + { title: '网络货运人', index: 'ltdName', width: 120, className: 'text-left' }, + { title: '购买人', index: 'artoname', width: 120, className: 'text-left' }, + { + title: '价税合计', + index: 'vatmoney', + width: 120, + type: 'widget', + className: 'text-right font-weight-bold', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatmoney }) } + }, + { + title: '金额', + index: 'vatnotax', + width: 90, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatnotax }) } + }, + { + title: '税率', + index: 'tax', + width: 90, + className: 'text-right', + format: item => `${item.tax ? ((item.tax as number) * 100).toFixed(2) : 0}%` + }, + { + title: '税额', + index: 'vattax', + width: 90, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vattax }) } + }, + { title: '开票日期', index: 'invoicedate', type: 'date', width: 150, className: 'text-center' } + ]; + searchSchema: SFSchema = { + properties: { + invoiceno: { + title: '', + type: 'string', + ui: { + placeholder: '发票号码' + } + }, + expressno: { + title: '', + type: 'string', + ui: { + placeholder: '申请编号' + } + }, + createTime: { + title: '', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + expressCode!: any; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { expressno: this.expressCode }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf.value.createTime?.[0] || null, + end: this.sf.value.createTime?.[1] || null + } + }); + } + return requestOptions; + }; + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/express-info/express-info.component.html b/src/app/routes/ticket-management/components/express-info/express-info.component.html new file mode 100644 index 00000000..e19f3d85 --- /dev/null +++ b/src/app/routes/ticket-management/components/express-info/express-info.component.html @@ -0,0 +1,24 @@ + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + +
    + +
    + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/express-info/express-info.component.less b/src/app/routes/ticket-management/components/express-info/express-info.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/ticket-management/components/express-info/express-info.component.ts b/src/app/routes/ticket-management/components/express-info/express-info.component.ts new file mode 100644 index 00000000..6277ed0a --- /dev/null +++ b/src/app/routes/ticket-management/components/express-info/express-info.component.ts @@ -0,0 +1,160 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; +import { ExpressDetailModalComponent } from './express-detail-modal/express-detail-modal.component'; + +@Component({ + selector: 'app-express-info', + templateUrl: './express-info.component.html', + styleUrls: ['../../../commom/less/box.less'] +}) +export class ExpressInfoComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/api/fcc/ficoExpressH/getListPage`; + + searchSchema: SFSchema = { + properties: { + expressCode: { + title: '快递单号', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox', width: 50 }, + { title: '快递单号', index: 'expressCode', width: 170 }, + { title: '快递公司', index: 'expresscompany', width: 120 }, + { title: '快递费用', index: 'description', width: 120 }, + { + title: '发票数量', + index: 'quantity', + width: 120, + type: 'link', + click: (record: any) => this.showDetail(record.expressCode), + className: 'text-right' + }, + { title: '寄件人姓名', index: 'sname', width: 150 }, + { title: '寄件人电话', index: 'stel', width: 150 }, + { + title: '寄件人地址', + index: 'saddress', + width: 150, + format: item => `${item.sprovince}${item.scity}${item.scounty || ''}${item.saddress}` + }, + { title: '收件人姓名', index: 'rname', width: 150 }, + { title: '收件人电话', index: 'rtel', width: 150 }, + { + title: '收件人地址', + index: 'raddress', + width: 150, + format: item => `${item.rprovince}${item.rcity}${item.rcounty || ''}${item.raddress}` + }, + { + title: '下单时间', + index: 'createTime', + type: 'date', + width: 180 + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: TicketService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createtime: { + start: this.sf.value.createtime?.[0] || null, + end: this.sf.value.createtime?.[1] || null + } + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + showDetail(expressCode: any) { + const modal = this.nzModalService.create({ + nzTitle: '发票明细', + nzContent: ExpressDetailModalComponent, + nzNoAnimation: true, + nzWidth: 1100, + nzComponentParams: { expressCode }, + nzOnOk: com => { + console.log(com.selectedData); + }, + nzOkText: '导出' + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + printOrder() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择快递单'); + return; + } + this.nzModalService.warning({ + nzTitle: '确认打印面单所选快递单?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + this.service + .request( + this.service.$api_get_print_pdf, + this.selectedRows.map(item => item.expressCode) + ) + .subscribe(res => { + if (res?.pdfUrl) { + this.service.reviewPDF(res.pdfUrl); + } else { + this.service.msgSrv.warning('下载失败'); + } + }); + } + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.html b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.html new file mode 100644 index 00000000..d5bac178 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.html @@ -0,0 +1,7 @@ +
    + +
    + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.less b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.less new file mode 100644 index 00000000..7b4dbb78 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.less @@ -0,0 +1,5 @@ +:host::ng-deep { + nz-date-picker { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.ts b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.ts new file mode 100644 index 00000000..422930cd --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component.ts @@ -0,0 +1,102 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-add-collection-invoice-modal', + templateUrl: './add-collection-invoice-modal.component.html', + styleUrls: ['./add-collection-invoice-modal.component.less'] +}) +export class AddCollectionInvoiceModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public service: TicketService) {} + + ngOnInit(): void { + this.initSF(); + } + initSF() { + this.schema = { + properties: { + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + ltd2Id: { + type: 'string', + title: '销售方', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + ltd2I1d: { + type: 'string', + title: '收票类型', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + createTime: { + title: '发票日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + vatinvcode: { + type: 'string', + title: '发票号', + ui: { + placeholder: '请输入' + } + }, + vatinvc2ode: { + type: 'string', + title: '收票备注', + ui: { + placeholder: '请输入' + } + } + }, + required: ['ltdId', 'ltd2Id', 'createTime', 'ltd2I1d', 'vatinvcode'] + }; + } + + sure() { + const params: any = { + ...this.sf.value + }; + // this.service.request(this.service.$api_add_staff, params).subscribe(res => { + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // }); + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.html b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.html new file mode 100644 index 00000000..9963406c --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.html @@ -0,0 +1,22 @@ +
    +
    + +
    +
    + + +
    +
    + + + + {{index+1}} + + + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.less b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.less new file mode 100644 index 00000000..36315a59 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.less @@ -0,0 +1,6 @@ +.expend-options { + max-width: 400px; + position : absolute; + right : 20px; + top : 160px; +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.ts b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.ts new file mode 100644 index 00000000..3ca21dbf --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/add-cost-detail/add-cost-detail.component.ts @@ -0,0 +1,111 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-add-cost-detail', + templateUrl: './add-cost-detail.component.html', + styleUrls: ['./add-cost-detail.component.less'] +}) +export class AddCostDetailComponent implements OnInit { + selectedData: any[] = []; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + constructor(public service: TicketService) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedData = e.checkbox!; + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + private initSF(): SFSchema { + return { + properties: { + enterpriseName: { + title: '费用单号', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + enterprise2Name: { + title: '订单号', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + contactName: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + contac2tName: { + title: '订单日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + mobile: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: 60 }, + { title: '序号', render: 'no', width: 60 }, + { title: '费用号', index: 'enterpriseName', width: 120 }, + { title: '费用日期', index: 'contacter', width: 120 }, + { title: '订单号', index: 'mobile', width: 120 }, + { title: '订单日期', index: 'mobile', width: 120 }, + { title: '结算客户', index: 'mobile', width: 120 }, + { title: '费用科目', index: 'mobile', width: 120 }, + { title: '费用金额', index: 'mobile', width: 120 }, + { title: '已收金额', index: 'mobile', width: 120 }, + { title: '未收金额', index: 'mobile', width: 120 }, + { title: '收票金额', render: 'mo1bile', width: 150, fixed: 'right' } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.html b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.html new file mode 100644 index 00000000..bf66f00c --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.html @@ -0,0 +1,55 @@ + + + + + + + +
    +
    + +
    +
    + + +
    +
    +
    + + + +
    +
    + +
    +
    + + +
    +
    +
    + + +
    + + +
    + + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.less b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.less new file mode 100644 index 00000000..7b4dbb78 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.less @@ -0,0 +1,5 @@ +:host::ng-deep { + nz-date-picker { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.ts b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.ts new file mode 100644 index 00000000..e91458f6 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/edit-collection-invoice/edit-collection-invoice.component.ts @@ -0,0 +1,210 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; +import { AddCostDetailComponent } from '../add-cost-detail/add-cost-detail.component'; + +@Component({ + selector: 'app-edit-collection-invoice', + templateUrl: './edit-collection-invoice.component.html', + styleUrls: ['./edit-collection-invoice.component.less', '../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class EditCollectionInvoiceComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('infoSf', { static: false }) + infoSf!: SFComponent; + infoSchema: SFSchema = this.initInfoSF(); + @ViewChild('searchSf', { static: false }) + searchSf!: SFComponent; + searchSchema: SFSchema = this.initSearchSF(); + columns: STColumn[] = this.initST(); + + selectedRows: any[] = []; + _$expand = false; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.searchSf) { + Object.assign(requestOptions.body, { ...this.searchSf.value }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + addCostDetailAction() { + const modal = this.nzModalService.create({ + nzTitle: '添加核销明细', + nzContent: AddCostDetailComponent, + nzWidth: 850, + nzOkText: '保存', + nzOnOk: com => { + return false; + } + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + goBack() { + history.go(-1); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.searchSf?.setValue('/expand', this._$expand); + } + + private initInfoSF(): SFSchema { + return { + properties: { + orderSn: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'text' + }, + default: '天津怡亚通物流科技有限公司' + }, + orde1rSn: { + type: 'string', + title: '销售方', + ui: { + widget: 'text' + }, + default: '天津怡亚通物流科技有限公司' + }, + ord0erSn1: { + type: 'string', + title: '收票类型', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + orderSn2: { + title: '发票日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true + } as SFDateWidgetSchema + }, + orderS3: { + type: 'string', + title: '发票号', + ui: { + placeholder: '请输入' + } + }, + orderSn4: { + type: 'string', + title: '收票备注', + ui: { + placeholder: '请输入' + } + } + }, + required: [''] + }; + } + + private initSearchSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '费用单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + orderS2n: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + } + }, + createTime: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTi2me: { + title: '订单日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '序号', index: 'no', type: 'link' }, + { title: '费用号', index: 'no' }, + { title: '费用日期', index: 'no', type: 'date' }, + { title: '订单号', index: 'callNo' }, + { title: '订单日期', index: 'callNo' }, + { title: '结算客户', render: 'call1No' }, + { title: '费用科目', render: 'call1N2o' }, + { title: '费用金额', index: 'callNo' }, + { title: '收票金额', index: 'updatedAt', type: 'date' }, + { title: '收票税额', index: 'updatedAt' } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.html b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.html new file mode 100644 index 00000000..4d858c37 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.html @@ -0,0 +1,67 @@ + + + + + + + +
    +
    + + {{headerInfo?.ltdid}} + + + {{headerInfo?.invdate}} + +
    +
    + + {{headerInfo?.hrtoName}} + + + {{headerInfo?.invoiceno}} + +
    +
    + + {{headerInfo?.invtype}} + + + {{headerInfo?.remarks}} + +
    +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + {{index+1}} + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.less b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.less new file mode 100644 index 00000000..aebf12ee --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.ts b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.ts new file mode 100644 index 00000000..384fa720 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/input-invoice-detail/input-invoice-detail.component.ts @@ -0,0 +1,151 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; +import { RequestedDetailComponent } from '../../invoice-requested/requested-detail/requested-detail.component'; + +@Component({ + selector: 'app-input-invoice-detail', + templateUrl: './input-invoice-detail.component.html', + styleUrls: ['./input-invoice-detail.component.less', '../../../../commom/less/expend-but.less', '../../../../commom/less/box.less'] +}) +export class InputInvoiceDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + id = null; + headerInfo: any = {}; + constructor(public service: TicketService, private route: ActivatedRoute) { + this.id = route.snapshot.params.id; + this.loadHeadInfo(); + } + + ngOnInit(): void {} + + loadHeadInfo() { + this.service.request(this.service.$api_get_input_invoice_header, { id: this.id }).subscribe(res => { + console.log(res); + if (res) { + this.headerInfo = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + billTime: { + start: this.sf.value.billTime?.[0] || null, + end: this.sf.value.billTime?.[1] || null + }, + feedate: { + start: this.sf.value.feedate?.[0] || null, + end: this.sf.value.feedate?.[1] || null + } + }); + } + return requestOptions; + }; + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + feecode: { + type: 'string', + title: '费用单', + ui: { + placeholder: '请输入' + } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + cno: { + type: 'string', + title: '结算客户', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCloseAccount(), + }, + default: '' + }, + feedate: { + title: '费用日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + billTime: { + title: '订单日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '序号', render: 'billHCode', width: 80 }, + { title: '费用号', index: 'feecode', width: 100 }, + { title: '费用日期', index: 'feedate', type: 'date', width: 150 }, + { title: '订单号', index: 'billHCode', width: 100 }, + { title: '订单日期', index: 'billTime', width: 150 }, + { title: '结算客户', index: 'cnoName', width: 90 }, + { title: '费用科目', index: 'feesubname', width: 100 }, + { title: '收票金额', index: 'invmoney', width: 140 }, + { title: '收票税额', index: 'invtax', width: 100 } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.html b/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.html new file mode 100644 index 00000000..5c6ac9d3 --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.html @@ -0,0 +1,38 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 张发票 + 清空 +
    +
    + + + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.ts b/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.ts new file mode 100644 index 00000000..ec8c927c --- /dev/null +++ b/src/app/routes/ticket-management/components/input-invoice/input-invoice.component.ts @@ -0,0 +1,269 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; +import { AddCollectionInvoiceModalComponent } from './add-collection-invoice-modal/add-collection-invoice-modal.component'; + +@Component({ + selector: 'app-input-invoice', + templateUrl: './input-invoice.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class InputInvoiceComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createtime: { + start: this.sf.value.createtime?.[0] || '', + end: this.sf.value.createtime?.[1] || '' + }, + invdate: { + start: this.sf.value.invdate?.[0] || '', + end: this.sf.value.invdate?.[1] || '' + } + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + addInvoice() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择申请记录'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '收票信息', + nzContent: AddCollectionInvoiceModalComponent, + nzComponentParams: { i: { userId: 0 } }, + nzFooter: null + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + inpinvcode: { + type: 'string', + title: '收票单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + ltdid: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + invoiceno: { + type: 'string', + title: '发票号码', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + invtype: { + type: 'string', + title: '发票类型', + enum: [ + { value: '', label: '全部' }, + { value: '1', label: '运输专票' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + hrto: { + type: 'string', + title: '销售方', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getCRMCustomerId(), + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createtime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + sts: { + type: 'string', + title: '收票状态', + enum: [ + { value: '', label: '全部' }, + { value: '1', label: '新建' }, + { value: '2', label: '关闭' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + invdate: { + type: 'string', + title: '发票日期', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + remarks: { + type: 'string', + title: '收票备注', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + feecode: { + type: 'string', + title: '费用号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox', width: 60, className: 'text-center', fixed: 'left' }, + { title: '收票单号', index: 'inpinvcode', type: 'link', width: 190 }, + { title: '网络货运人', index: 'ltdName', width: 220 }, + { title: '发票日期', index: 'invdate', type: 'date', width: 150, className: 'text-center' }, + { title: '发票号', index: 'invoiceno', width: 130 }, + { + title: '发票金额', + index: 'invmoney', + width: 100, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.invmoney }) } + }, + { + title: '税额', + index: 'invtax', + width: 100, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.invtax }) } + }, + { title: '发票类型', index: 'invtype', width: 150, className: 'text-center' }, + { title: '销售方', index: 'hrtoName', width: 200 }, + { title: '创建时间', index: 'createtime', type: 'date', width: 150, className: 'text-center' }, + { title: '创建人', index: 'createbyname', width: 120 }, + { title: '收票状态', index: 'stsLabel', width: 120, className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { + text: '浏览', + click: item => this.router.navigate(['/ticket/input-invoice/detail/' + item.id]) + }, + { + text: '修改', + click: item => this.router.navigate(['/ticket/input-invoice/edit/1']) + } + ] + } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.html b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.html new file mode 100644 index 00000000..160bf708 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.html @@ -0,0 +1,147 @@ + + + + + + + +
    +
    + + {{ headerInfo?.ltdName }} + + + {{ headerInfo?.vatappHCode }} + + + {{ headerInfo?.invoiceno }} + + + {{ headerInfo?.invoiceno2 }} + + + {{ headerInfo?.invoicedate }} + + + {{ headerInfo?.vatmoney | currency }} + + + {{ headerInfo?.vattax | currency }} + + + {{ headerInfo?.remarks }} + +
    +
    + + {{ headerInfo?.artoname }} + + + {{ headerInfo?.artotaxno }} + + + {{ headerInfo?.artoadd }} + + + {{ headerInfo?.artotel }} + + + {{ headerInfo?.artobank }} + + + {{ headerInfo?.artoacc }} + + + {{headerInfo?.otherremarks || '-'}} + +
    +
    + + + + + + + +
    +
    +
    + + + + +
    +
    + +
    +
    + + + +
    +
    + + +
    + +
    +
    + +
    +
    + + + +
    +
    + + + + {{ item.billLTypeLabel }}: {{ item.vatmoney |currency }} + + vatmoney +
    + + + + + + + {{ item.vatnameLabel || item.vatname }} + + + + {{ item.vatmodel }} + + + + {{ item.vatunit }} + + + + {{ item.vatqty }} + + + + +

    顺丰快递: {{ routesInfo?.mailNo }} 已签收 + +

    + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.less b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.less new file mode 100644 index 00000000..23fd589a --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.less @@ -0,0 +1,39 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 8px; + padding-top : 8px; + } + } + + + .statistics-box { + .ant-card-body { + padding-bottom: 8px; + padding-top : 8px; + } + + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + + .text-truncate { + white-space: normal; + } +} + +.expend-options { + margin-top: 0px; +} + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.ts b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.ts new file mode 100644 index 00000000..f5115ec0 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-detail/invoice-detail.component.ts @@ -0,0 +1,310 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; + +@Component({ + selector: 'app-invoice-detail', + templateUrl: './invoice-detail.component.html', + styleUrls: ['./invoice-detail.component.less'] +}) +export class InvoiceDetailComponent implements OnInit { + @ViewChild('orderST', { static: true }) + orderST!: STComponent; + @ViewChild('orderSf', { static: false }) + orderSf!: SFComponent; + orderColumns: STColumn[] = this.initOrderST(); + orderSchema: SFSchema = this.initOrderSF(); + + @ViewChild('costST', { static: true }) + costST!: STComponent; + @ViewChild('costSf', { static: false }) + costSf!: SFComponent; + costColumns: STColumn[] = this.initCostST(); + costSchema: SFSchema = this.initCostSF(); + + @ViewChild('invoiceST', { static: true }) + invoiceST!: STComponent; + invoiceColumns: STColumn[] = this.initInvoiceST(); + + isCanEdit = false; + isEdit = false; + + headerInfo: any = {}; + routesInfo: any = { + mailNo: '', + routes: [] + }; + id: any = null; + ltdId: any = null; + type: any = 1; + + selectedIndex = 0; + + services: any[] = []; + constructor(public service: TicketService, private route: ActivatedRoute) { + this.isCanEdit = route.snapshot.queryParams.type === '1'; + const expressno = route.snapshot.queryParams.expressno; + this.type = route.snapshot.queryParams.type; + this.id = route.snapshot.params.id; + this.ltdId = route.snapshot.queryParams.ltdId; + this.loadInvoiceHeader(this.id); + if (expressno) { + this.loadRoutes(expressno); + } + } + + ngOnInit(): void { + this.getDictByKey(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { vatinvHId: this.id }); + if (this.orderSf) { + Object.assign(requestOptions.body, { ...this.orderSf.value }); + } + if (this.costSf) { + Object.assign(requestOptions.body, { ...this.costSf.value }); + } + return requestOptions; + }; + + getDictByKey() { + this.service.request('/api/mdc/pbc/dictItems/getDictValue', { dictKey: 'invoice:service:type' }).subscribe(res => { + this.services = res; + }); + } + + loadInvoiceHeader(id: string) { + this.service.request(this.service.$api_get_invoice_header_detail, { id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + loadRoutes(expressno: string) { + this.service.request(this.service.$api_get_express_routes, expressno).subscribe(res => { + if (res) { + res.routes = res.routes.map((route: any) => ({ time: route.acceptTime, value: route.remark + route.acceptAddress, color: 'gray' })); + this.routesInfo = res; + } + }); + } + goBack() { + history.go(-1); + } + + saveInvoices() { + const list = this.invoiceST._data.map(item => { + const rs = { ...item }; + delete rs._values; + return rs; + }); + this.service + .request(this.service.$api_update_evatinh, { + id: this.id, + updatEvatinvDetailDTO: list + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.invoiceST.load(1); + this.isEdit = false; + } + }); + } + + /** + * 重置表单 + */ + resetSF(tab: number) { + switch (tab) { + case 1: + this.orderSf.reset(); + break; + case 2: + this.costSf.reset(); + break; + + default: + break; + } + } + + exportList() { + const params = { listSource: 1, pageSize: -1, vatinvHId: this.id }; + if (this.orderSf) { + Object.assign(params, { + ...this.orderSf.value + }); + } + this.service.exportStart(params, this.service.$api_export_invoice_order_detail); + } + + private initOrderSF(): SFSchema { + return { + properties: { + billHCode: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off' + } + }, + billType: { + type: 'string', + title: '订单类型', + enum: [ + { label: '全部', value: '' }, + { label: '整车', value: 1 }, + { label: '大宗', value: 2 } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + projectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getEnterpriseProject({ id: this.ltdId }) + }, + default: '' + } + } + }; + } + + private initOrderST(): STColumn[] { + return [ + { title: '订单号', index: 'billHCode', width: 180 }, + { title: '订单完成日期', index: 'billTime', type: 'date', width: 150 }, + { title: '所属项目', index: 'projectIdName', width: 180 }, + { title: '订单类型', index: 'billTypeLabel', width: 120 }, + { title: '装货地', index: 'loadingfrom', width: 200 }, + { title: '卸货地', index: 'loadingto', width: 220 }, + { title: '货物信息', index: 'goodsinfo', width: 140 }, + { title: '承运司机', index: 'driverinfo', width: 280 }, + // { + // title: '税额', + // index: 'billvatrate', + // width: 120, + // className: 'text-right', + // format: item => `${item.billvatrate ? ((item.billvatrate as number) * 100).toFixed(2) : 0}%` + // }, + { + title: '申请金额', + index: 'billkpnotax', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: this.type === '2' ? record.billkpmoney : record.billkpnotax }) } + }, + { + title: '运输费', + index: 'fjfmoney2', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney2 }) } + }, + { + title: '附加费', + index: 'fjfmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney }) } + }, + { + title: '开票金额', + index: 'billkpmoney', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.billkpmoney }) } + } + ]; + } + + private initCostSF(): SFSchema { + return { + properties: { + billHCode: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off' + } + }, + feeHId: { + type: 'string', + title: '费用号', + ui: { + autocomplete: 'off' + } + } + } + }; + } + + private initCostST(): STColumn[] { + return [ + { title: '费用号', index: 'feeHId' }, + { title: '订单号', index: 'billHCode' }, + { title: '订单日期', index: 'createTime', type: 'date' }, + { title: '计费日期', index: 'feeDate', type: 'date' }, + { title: '税率', index: 'vatrate', format: item => `${item.vatrate ? ((item.vatrate as number) * 100).toFixed(2) : 0}%` }, + { + title: '申请金额', + render: 'vatmoney' + }, + { + title: '开票金额', + index: 'vatmoney', + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatmoney }) } + } + ]; + } + + private initInvoiceST(): STColumn[] { + return [ + { title: '服务名称', render: 'vatnameLabel', width: 350 }, + { title: '规格型号', render: 'vatmodel' }, + { title: '单位', render: 'vatunit', width: 100 }, + { title: '数量', render: 'vatqty', width: 140, className: 'text-right' }, + { + title: '金额', + index: 'vattax', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vattax }) } + }, + { + title: '税率', + index: 'vatrate', + width: 140, + className: 'text-right', + format: item => `${item.vatrate ? ((item.vatrate as number) * 100).toFixed(2) : 0}%` + }, + { + title: '税额', + index: 'vatnotax', + width: 140, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatnotax }) } + } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html new file mode 100644 index 00000000..b22492f3 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html @@ -0,0 +1,118 @@ + + + + + + + +
    +
    + + + {{headerInfo?.ltdidName}} + + + + {{headerInfo?.vatinvHNum}} / {{headerInfo?.ordlines}} + + + {{headerInfo?.vatinvHAmount |currency}} / {{headerInfo?.vatinvHNumAmount |currency}} + + + {{headerInfo?.vatinvHNum}} + + + {{headerInfo?.reciname}}/{{headerInfo?.recitel}} + + + {{headerInfo?.provinceName}}{{headerInfo?.cityName}}{{headerInfo?.areaName}}{{headerInfo?.reciaddr}} + +
    +
    + + {{headerInfo?.artoName}} + + + {{headerInfo?.taxNumber}} + + + {{headerInfo?.vatappcode}} + + + {{headerInfo?.registerAddr}} + + + {{headerInfo?.registerPhone}} + + + {{headerInfo?.bankName}} + + + {{headerInfo?.bankAccount}} + +
    +
    + + {{headerInfo?.vatnameLabel}} + + + {{headerInfo?.isdetail?'是':'否'}} + + + {{headerInfo?.otherremarks}} + + + {{headerInfo?.vatremarks}} + + +
    +
    +
    + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    + + + +
    + 已选择 + {{ selectedRows.length }} 条数据   开票金额总计 {{ + totalCallNo |currency }} + 清空 +
    +
    + + + + {{ item.billHCode }} + + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less new file mode 100644 index 00000000..aebf12ee --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts new file mode 100644 index 00000000..b02371b5 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts @@ -0,0 +1,353 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Router, Params } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFTextWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/ticket.service'; +import { RequestedDetailComponent } from '../requested-detail/requested-detail.component'; + +@Component({ + selector: 'app-invoice-requested-detail', + templateUrl: './invoice-requested-detail.component.html', + styleUrls: ['./invoice-requested-detail.component.less', '../../../../commom/less/expend-but.less', '../../../../commom/less/box.less'] +}) +export class InvoiceRequestedDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + detail: any = {}; + + selectedRows: any[] = []; + totalCallNo = '0'; + _$expand = false; + + id = null; + sts = null; + headerInfo: any = {}; + constructor( + public service: TicketService, + private nzModalService: NzModalService, + private route: ActivatedRoute, + private router: Router + ) { + this.id = route.snapshot.params.id; + this.sts = route.snapshot.queryParams.sts; + this.loadHeadInfo(); + } + + ngOnInit(): void {} + + loadHeadInfo() { + this.service.request(this.service.$api_get_invoice_requested_header_detail, { id: this.id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + this.totalCallNo = '0'; + this.selectedRows = []; + Object.assign(requestOptions.body, { vatappHId: this.id }); + if (this.sf) { + Object.assign(requestOptions.body, { ...this.sf.value }); + } + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + // this.totalCallNo = data.reduce((total, cv) => total + cv.billkpmoney, 0).toFixed(2); + return data.map(item => ({ + ...item + })); + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + if (this.selectedRows?.length > 0) { + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.billkpmoney, 0).toFixed(2); + } else { + this.totalCallNo = this.st._data.reduce((total, cv) => total + cv.billkpmoney, 0).toFixed(2); + } + break; + case 'filter': + this.st.load(); + break; + } + } + + openRequestedModal(status: any) { + if (status === '2' && this.selectedRows.length == 0) { + this.service.msgSrv.warning('请选择订单!'); + return; + } + let rows: any[] = []; + if (status === '1') { + rows = this.st._data.map(item => { + const rs = Object.assign({}, { ...item }); + delete rs._values; + return rs; + }); + } else { + rows = [...this.selectedRows]; + } + const modal = this.nzModalService.create({ + nzTitle: '开票', + nzContent: RequestedDetailComponent, + nzWidth: 800, + nzComponentParams: { + i: rows, + status: status, + Id: this.id + }, + nzFooter: [ + { + type: 'default', + label: '手工处理', + onClick: () => { + const params = { + ficoVatappBillVOList: rows, + id: this.id + }; + this.service.request(this.service.$api_get_applyFicoVatinv, params).subscribe((res: any) => { + if (res) { + this.loadHeadInfo(); + this.st.load(1); + this.service.msgSrv.success('提交成功'); + modal.destroy(); + } + }); + } + }, + { + type: 'primary', + label: '自动开票', + onClick: () => { + const params = { + ficoVatappBillVOList: rows, + id: this.id + }; + this.service.request(this.service.$api_get_applyFicoVatinv, params).subscribe((res: any) => { + if (res) { + this.loadHeadInfo(); + this.st.load(1); + this.service.msgSrv.success('提交成功'); + modal.destroy(); + } + }); + } + } + ] + }); + } + + /** + * 移除订单 + * @returns + */ + removeOrder() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择订单'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定从当前批次中移除所选订单?', + nzContent: '移除后相关订单可以重新提交开票申请', + nzOnOk: () => { + const ids = this.selectedRows.map(order => order.billHId); + this.service.request(this.service.$api_remove_bill, ids).subscribe(res => { + if (res) { + this.service.msgSrv.success('移除成功'); + this.loadHeadInfo(); + this.st.reload(); + } + }); + } + }); + } + + goBack() { + history.go(-1); + } + + routeToOrder(item: any) { + if (item.billType === '1') { + this.router.navigate(['/order-management/vehicle/vehicle-detail/' + item.billHId]); + } else { + this.router.navigate(['/order-management/bulk/bulk-detail/' + item.billHId]); + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + vatappSts: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择' + }, + default: '' + }, + vatinvcode: { + type: 'string', + title: '发票号码', + ui: { + placeholder: '请输入' + } + }, + billType: { + type: 'string', + title: '订单类型', + enum: [ + { label: '全部', value: '' }, + { label: '整车', value: '1' }, + { label: '大宗', value: '2' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + driverinfo: { + type: 'string', + title: '承运司机', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + drivercarinfo: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + projectId: { + title: '所属项目', + type: 'string', + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getEnterpriseProject() + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '订单号', render: 'billHCode', width: 170 }, + { title: '订单完成日期', index: 'billTime', type: 'date', width: 150 }, + { title: '开票状态', index: 'vatappStsLabel', width: 100 }, + { title: '所属项目', index: 'projectIdName', width: 140 }, + { title: '订单类型', index: 'billType', width: 100, type: 'enum', enum: { 1: '整车', 2: '大宗' } }, + { title: '装货地', index: 'loadingfrom', width: 220 }, + { title: '卸货地', index: 'loadingto', width: 220 }, + { title: '货物信息', index: 'goodsinfo', width: 150 }, + { title: '承运司机', index: 'driverinfo', width: 140 }, + { + title: '申请金额', + index: 'billkpmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.billkpmoney }) } + }, + { + title: '运输费', + index: 'fjfmoney2', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney2 }) } + }, + { + title: '附加费', + index: 'fjfmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney }) } + }, + { + title: '开票金额', + index: 'billkpmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.billkpmoney }) } + }, + { + title: '税率', + index: 'billvatrate', + width: 90, + format: item => `9.00%` + // bugfix 6976 + // format: item => `${item.billvatrate ? ((item.billvatrate as number) * 100).toFixed(2) : 0}%` + }, + { title: '发票号码', index: 'vatinvcode', width: 100 }, + { title: '开票日期', index: 'vatinvtime', type: 'date', width: 150 } + ]; + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html new file mode 100644 index 00000000..8b2f989e --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html @@ -0,0 +1,77 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + +
    +
    + 已选择 + {{ selectedRows.length }} 条数据   开票金额总计 + {{ totalCallNo }} + 清空 +
    + + + + +
    +
    + + + + {{ item.vatappcode }}
    + +
    +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less new file mode 100644 index 00000000..370d3cae --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less @@ -0,0 +1,7 @@ +:host::ng-deep { + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts new file mode 100644 index 00000000..f36ec08c --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts @@ -0,0 +1,544 @@ +import { query } from '@angular/animations'; +import { CurrencyPipe } from '@angular/common'; +import { Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema } from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { isTemplateRef } from 'ng-zorro-antd/core/util'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; + +import { TicketService } from '../../services/ticket.service'; +import { PrintOrderModalComponent } from './print-order-modal/print-order-modal.component'; +import { RequestedInvoiceModalComponent } from './requested-invoice-modal/requested-invoice-modal.component'; +import { UpdateAddressModalComponent } from './update-address-modal/update-address-modal.component'; + +@Component({ + selector: 'app-invoice-requested', + templateUrl: './invoice-requested.component.html', + styleUrls: ['./invoice-requested.component.less', '../../../commom/less/box.less'] +}) +export class InvoiceRequestedComponent { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('rejectModal', { static: false }) + rejectModal!: any; + resourceStatus: any = '1'; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + totalCallNo = 0; + selectedRows: any[] = []; + + rejectReason = ''; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.resourceStatus) { + Object.assign(requestOptions.body, { sts: this.resourceStatus }); + } + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }); + } + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + this.totalCallNo = 0; + this.selectedRows = []; + return data.map(item => ({ + ...item, + disabled: item.expressHSts + })); + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.applyAmount, 0).toFixed(2); + break; + } + } + + rejectAction(item: any[]) { + this.rejectReason = ''; + if (item.length <= 0) { + this.service.msgSrv.warning('请选择开票申请'); + return; + } + if (item.find(item => item.sts !== '1')) { + this.service.msgSrv.warning('请勿选择非待处理订单'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '驳回', + nzContent: this.rejectModal, + nzOkLoading: this.service.http.loading, + nzOnOk: () => { + if (!this.rejectReason) { + this.service.msgSrv.warning('请填写驳回原因'); + return false; + } + let ids = item.map(row => row.id); + this.service.request(this.service.$api_reject_invoice, { id: ids, rejectContent: this.rejectReason }).subscribe(res => { + if (res) { + this.service.msgSrv.success('驳回成功'); + modal.destroy(true); + } + }); + + return false; + } + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + /** + * 修改地址 + * @param item + */ + changeAddress(item: any[]) { + this.rejectReason = ''; + if (item.length <= 0) { + this.service.msgSrv.warning('请选择开票申请'); + return; + } + // if (item.find(item => item.sts !== '1')) { + // this.service.msgSrv.warning('请勿选择非待处理订单'); + // return; + // } + const modal = this.nzModalService.create({ + nzTitle: '修改地址', + nzContent: UpdateAddressModalComponent, + nzOkLoading: this.service.http.loading, + nzOnOk: component => { + if (!component.sf.valid) { + component.sf.validator({ emitError: true }); + // this.service.msgSrv.warning('表单校验错误'); + return false; + } + this.service + .request(this.service.$api_update_invoice_address, { + ...component.sf.value, + ids: item.map(i => i.id) + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + modal.destroy(true); + } + }); + + return false; + } + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + printOrder(item: any[]) { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择订单'); + return; + } + if (this.selectedRows.find(item => item.sts !== '3')) { + this.service.msgSrv.warning('请勿选择非已完成订单'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '快递下单', + nzContent: PrintOrderModalComponent, + nzWidth: 650, + nzComponentParams: { vatappcodes: this.selectedRows.map(item => item.vatappcode) }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(); + } + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + batchRequested() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择订单'); + return; + } + if (this.selectedRows.find(item => item.sts !== '1')) { + this.service.msgSrv.warning('请勿选择非待处理订单'); + return; + } + const modal = this.nzModalService.create({ + nzTitle: '开票', + nzContent: '确认对所有申请单进行批量开票?', + nzFooter: [ + { + type: 'default', + label: '手工处理', + onClick: () => { + const params = { + ficoVatappHVOList: this.selectedRows.map(item => { + const i = Object.assign({}, { ...item }); + delete i._values; + delete i._rowClassName; + delete i.checked; + delete i.disabled; + return i; + }) + // id: this.id + }; + this.service.request(this.service.$api_get_applyBatchFicoVatinv, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('提交成功!'); + modal.destroy(); + this.st.load(1); + } + }); + } + }, + { + type: 'primary', + label: '自动开票', + onClick: () => { + const params = { + ficoVatappHVOList: this.selectedRows.map(item => { + const i = Object.assign({}, { ...item }); + delete i._values; + delete i._rowClassName; + delete i.checked; + delete i.disabled; + return i; + }) + // id: this.id + }; + this.service.request(this.service.$api_get_applyBatchFicoVatinv, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('提交成功!'); + modal.destroy(); + this.st.load(1); + } + }); + } + } + ] + }); + } + + requestedInvoiceAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '开票受理', + nzContent: RequestedInvoiceModalComponent, + nzNoAnimation: true, + nzWidth: 1200, + nzComponentParams: { + id: item.id + }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(1); + } + }); + } + + downloadPdf(item: any) { + this.service.request(this.service.$api_downloadPdf, { vatappHId: item.id }).subscribe(res => { + if (res?.reconciliationUrl) { + this.service.reviewPDF(res.reconciliationUrl); + } else { + this.service + .request(this.service.$api_download_Reconciliatio_pdf, { vatappHId: item.id, esignFlowId: res.esignFlowId }) + .subscribe(rs => { + if (rs?.reconciliationUrl) { + this.service.reviewPDF(rs.reconciliationUrl); + } else { + // this.service.msgSrv.warning('获取对账单失败'); + } + }); + // this.service.msgSrv.warning('获取对账单失败'); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + // 导出 + exprot() { + this.service.exportStart({ ...this.sf.value, pageSize: -1 }, this.service.$api_export_invoice_requested_page); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + vatappcode: { + type: 'string', + title: '申请编号', + ui: { + placeholder: '请输入' + } + }, + billHCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入' + } + }, + feeHCode: { + type: 'string', + title: '费用号', + ui: { + placeholder: '请输入' + } + }, + projectId: { + title: '项目', + type: 'string', + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getEnterpriseProject() + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + }, + otherremarks: { + type: 'string', + title: '其他需求', + ui: { + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '申请时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + isdetail: { + type: 'string', + title: '销货清单', + enum: [ + { label: '全部', value: '' }, + { label: '需要', value: 1 }, + { label: '不需要', value: 0 } + ], + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + arto: { + type: 'string', + title: '货主名称', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => this.service.getEnterpriceList({ enterpriseName: q }), + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '申请编号', render: 'vatappcode', width: 190 }, + { title: '发票类型', index: 'vatapptypeLabel', width: 140 }, + { title: '网络货运人', index: 'ltdName', width: 170 }, + { title: '货主名称', index: 'artoName', width: 170 }, + { title: '订单数', index: 'ordlines', width: 90 }, + { + title: '申请金额', + index: 'applyAmount', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.applyAmount }) } + }, + { + title: '运输费', + index: 'fjfmoney2', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney2 }) } + }, + { + title: '附加费', + index: 'fjfmoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.fjfmoney }) } + }, + { + title: '已开票金额', + index: 'invoicedMoney', + width: 150, + type: 'widget', + className: 'text-right', + widget: { + type: 'currency-chy', + params: ({ record }) => ({ value: record.invoicedMoney }) + } + }, + { title: '已开票张数', className: 'text-right', index: 'invoicedNum', width: 160 }, + { title: '开户行', index: 'bankName', width: 160 }, + { title: '银行账户', index: 'bankAccount', width: 140 }, + { title: '注册地址', index: 'registerAddr', width: 140 }, + { title: '注册电话', index: 'registerPhone', width: 130 }, + { title: '服务名称', index: 'vatnameLabel', width: 150 }, + { + title: '销货清单', + index: 'isdetail', + width: 100, + format: item => { + return item.isdetail === 0 ? '不需要' : '需要'; + } + }, + { title: '其他要求', index: 'otherremarks', width: 100 }, + { title: '申请人', index: 'applyName', width: 90 }, + { title: '申请时间', index: 'applyTime', type: 'date', width: 150 }, + { + title: '快递是否下单成功', + index: 'expressHSts', + width: 170, + className: 'text-center', + type: 'enum', + enum: { true: '是', false: '否' } + }, + { + title: '操作', + width: 125, + fixed: 'right', + className: 'text-center', + buttons: [ + { type: 'divider' }, + { + text: '开票受理
    ', + click: item => this.requestedInvoiceAction(item), + iif: item => item.sts === '1' + }, + { + text: '驳回申请
    ', + click: item => this.rejectAction([item]), + iif: item => item.sts === '1' + }, + { + text: '订单明细
    ', + click: item => this.router.navigate([`/ticket/invoice-requested/detail/${item?.id}`], { queryParams: { sts: item.sts } }) + }, + { + text: '查看原因
    ', + click: item => this.showReason(item), + iif: item => item.sts === '4' + }, + { + text: '下载对账单', + iif: item => item.sts === '3', + click: item => this.downloadPdf(item) + } + ] + } + ]; + } + selectChange(e: any) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.html b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.html new file mode 100644 index 00000000..592208d6 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.html @@ -0,0 +1,48 @@ +
    +
    + + + + + + + + {{type===1?'分批下单系统会根据网络货运人、货主以及收件地址自动拆分成多个包裹下单':'汇总下单系统会将所选申请单汇总成一个包裹下单'}} + + + + + + {{item.contact}}      {{item.tel}}
    + {{item.province}} {{item.city}} {{item.county}} {{item.address}} +
    +
    + + {{data.rcontactInfo.contact}}      {{data.rcontactInfo.tel}}
    + {{data.rcontactInfo.province}} {{data.rcontactInfo.city}} {{data.rcontactInfo.county}} + {{data.rcontactInfo.address}} +
    +
    + + + + {{item.contact}}      {{item.tel}}
    + {{item.province}} {{item.city}} {{item.county}} {{item.address}} +
    +
    + + {{data.scontactInfo.contact}}      {{data.scontactInfo.tel}}
    + {{data.scontactInfo.province}} {{data.scontactInfo.city}} {{data.scontactInfo.county}} + {{data.scontactInfo.address}} +
    +
    +
    + +
    +
    + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.less b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.less new file mode 100644 index 00000000..a9a87774 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.less @@ -0,0 +1,10 @@ + +app-print-order-modal{ + nz-select-top-control { + height: 65px !important; + } + + cdk-virtual-scroll-viewport { + height: 100px !important; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.ts b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.ts new file mode 100644 index 00000000..c7e8acc9 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/print-order-modal/print-order-modal.component.ts @@ -0,0 +1,96 @@ +import { Component, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-print-order-modal', + templateUrl: './print-order-modal.component.html', + styleUrls: ['./print-order-modal.component.less'], + encapsulation: ViewEncapsulation.None +}) +export class PrintOrderModalComponent implements OnInit { + data: any = {}; + + type = 1; + + rcontactInfos: any[] = []; + scontactInfos: any[] = []; + + @Input() + vatappcodes: string[] = []; + + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public service: TicketService) {} + + ngOnInit(): void { + this.loadAddress(); + } + + loadAddress() { + this.service.request(this.service.$api_get_order_summary_path, this.vatappcodes).subscribe(res => { + if (res) { + this.rcontactInfos = res.rcontactInfos || []; + this.scontactInfos = res.scontactInfos || []; + } + }); + } + + sure() { + if (this.type === 1) { + this.service.request(this.service.$api_create_express + '?_allow_badcode=true', this.vatappcodes).subscribe(res => { + if (res.status === 200) { + if (res?.data?.length > 0) { + this.getPDF(res.data); + } else { + this.service.msgSrv.success('快递下单成功,请到快递信息页面打印'); + this.modal.destroy(true); + } + } + }); + } else { + if (!this.data.rcontactInfo || !this.data.scontactInfo) { + this.service.msgSrv.warning('请选择收件地址和寄件地'); + return; + } + const params = { + rcontactInfo: this.data.rcontactInfo, + ltdId: this.data.scontactInfo.ltdId, + shipperId: this.data.scontactInfo.shipperId, + vatappcodes: this.vatappcodes, + scontactInfo: this.data.scontactInfo + }; + delete this.data.scontactInfo.ltdId; + delete this.data.scontactInfo.shipperId; + delete this.data.scontactInfo.id; + this.service.request(this.service.$api_get_order_summary + '?_allow_badcode=true', params).subscribe(res => { + if (res.status === 200) { + if (res?.data?.length > 0) { + this.service.reviewPDF(res?.data); + } else { + this.service.msgSrv.success('快递下单成功,请到快递信息页面打印'); + this.modal.destroy(true); + } + } + }); + } + } + + getPDF(ids: Array) { + this.service.request(this.service.$api_get_print_pdf, ids).subscribe(res => { + if (res?.pdfUrl) { + this.service.msgSrv.success('操作成功'); + this.modal.destroy(true); + this.service.reviewPDF(res.pdfUrl); + } else { + this.service.msgSrv.success('快递下单成功,请到快递信息页面打印'); + this.modal.destroy(true); + } + }); + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.html b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.html new file mode 100644 index 00000000..737e5eef --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.html @@ -0,0 +1,54 @@ + +
    +
    + + {{headerInfo?.artoName}} + + + {{headerInfo?.taxNumber}} + + + {{headerInfo?.registerAddr}} + + + {{headerInfo?.registerPhone}} + + + {{headerInfo?.bankName}} + + + {{headerInfo?.bankAccount}} + + + {{headerInfo?.vatremarks}} + +
    +
    + + {{headerInfo?.ltdidName}} + + + {{headerInfo?.ordlines}} + + + {{headerInfo?.vatinvHNumAmount | currency}} + + + {{headerInfo?.vatnameLabel}} + + + {{headerInfo?.isdetail?'是':'否'}} + + + {{headerInfo?.otherremarks}} + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.less b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.less new file mode 100644 index 00000000..aebf12ee --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.ts b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.ts new file mode 100644 index 00000000..675783d0 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-detail/requested-detail.component.ts @@ -0,0 +1,50 @@ +import { Input } from '@angular/core'; +/* + * @Author: your name + * @Date: 2021-12-23 16:50:17 + * @LastEditTime: 2021-12-31 13:15:13 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\ticket-management\components\invoice-requested\requested-detail\requested-detail.component.ts + */ +import { Component, OnInit } from '@angular/core'; +import { TicketService } from '../../../services/ticket.service'; + + +@Component({ + selector: 'app-requested-detail', + templateUrl: './requested-detail.component.html', + styleUrls: ['./requested-detail.component.less'] +}) +export class RequestedDetailComponent implements OnInit { + i: any; + status: any; + Id: any; + @Input() id: any; + headerInfo: any; + constructor( + public service: TicketService, + ) { } + + ngOnInit(): void { + this.initData(); + } + initData() { + if(this.id) { + this.service.request(this.service.$api_get_invoice_requested_header_detail, { id: this.id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + if(this.Id) { + this.service.request(this.service.$api_get_invoice_requested_header_detail, { id: this.Id }).subscribe(res => { + if (res) { + this.headerInfo = res; + } + }); + } + + } + +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.html b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.html new file mode 100644 index 00000000..d1f3a8c1 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.html @@ -0,0 +1,26 @@ + + + + + + + {{ item.billHCode }} + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.less b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.less new file mode 100644 index 00000000..41a8c3bb --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.less @@ -0,0 +1,16 @@ +:host::ng-deep { + + .statistics-box { + .ant-form-item { + margin-bottom: 0; + + .ant-form-item-control-input-content { + color: #f5222d; + } + } + } + + .text-truncate { + white-space: normal; + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.ts b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.ts new file mode 100644 index 00000000..a46d003c --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component.ts @@ -0,0 +1,166 @@ +/* + * @Author: your name + * @Date: 2021-12-23 16:50:17 + * @LastEditTime : 2022-01-26 10:36:10 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\ticket-management\\components\\invoice-requested\\requested-invoice-modal\\requested-invoice-modal.component.ts + */ +import { ChangeDetectorRef, Component, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STRequestOptions } from '@delon/abc/st'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; + +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-requested-invoice-modal', + templateUrl: './requested-invoice-modal.component.html', + styleUrls: ['./requested-invoice-modal.component.less'] +}) +export class RequestedInvoiceModalComponent { + @ViewChild('st1', { static: false }) + st1!: STComponent; + columns: STColumn[] = this.initST(); + id: any; + selectedRows: any[] = []; + + constructor( + public service: TicketService, + private nzModalService: NzModalService, + private modal: NzModalRef, + private router: Router, + private cdr: ChangeDetectorRef + ) {} + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { vatappHId: this.id }); + return requestOptions; + }; + + afterRes = (data: any[], rawData?: any) => { + return data.map(item => ({ ...item, isDelete: data?.length > 1 })); + }; + + /** + * 移除订单 + * + * @returns + */ + removeOrder(item: any[]) { + if (this.st1.total <= 1 || item?.length === this.st1.total) { + this.service.msgSrv.warning('开票申请记录不能少于一个订单'); + return; + } + if (item?.length <= 0) { + this.service.msgSrv.warning('请选择要移除订单'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定从当前批次中移除所选订单?', + nzContent: '移除后相关订单可以重新提交开票申请', + nzOnOk: () => { + const ids = item.map(order => order.billHCode); + this.service.request(this.service.$api_remove_bill, { billHcodes: ids }).subscribe(res => { + if (res) { + this.service.msgSrv.success('移除成功'); + this.modal.destroy(true); + } else { + this.service.msgSrv.warning('移除失败'); + } + }); + } + }); + } + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st1.load(); + break; + } + } + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '订单号', index: 'billHCode', width: 150 }, + { title: '订单完成日期', index: 'billTime', type: 'date', width: 150 }, + { title: '所属项目', index: 'projectIdName', width: 250 }, + { title: '订单类型', index: 'billTypeName', width: 90 }, + { title: '装货地', index: 'loadingfrom', width: 250 }, + { title: '卸货地', index: 'loadingto', width: 250 }, + { title: '货物信息', index: 'goodsinfo', width: 170 }, + { title: '承运司机', index: 'driverinfo', width: 280 }, + { + title: '总费用', + index: 'billkpmoney', + width: 90, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }: any) => ({ value: record.billkpmoney }) } + }, + { + title: '运输费', + index: 'fjfmoney2', + width: 90, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }: any) => ({ value: record.fjfmoney2 }) } + }, + { + title: '附加费', + index: 'fjfmoney', + width: 90, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }: any) => ({ value: record.fjfmoney }) } + }, + { + title: '操作', + width: 80, + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '移除', + click: (item: any) => this.removeOrder([item]), + iif: item => item.isDelete + } + ] + } + ]; + } + saveManage() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择订单'); + return; + } + const selectedRows = this.selectedRows.map(item => { + return { ...item }; + }); + const params = { + ficoVatappBillVOList: selectedRows.map(item => { + delete item._values; + return item; + }), + id: this.id + }; + this.service.request(this.service.$api_get_applyFicoVatinv, params).subscribe((res: any) => { + if (res) { + this.nzModalService.confirm({ + nzTitle: '是否进入销票处理页面完成开票', + nzOnOk: () => { + this.service.msgSrv.success('提交成功'); + this.modal.destroy(true); + this.router.navigate(['/ticket/cancellation-invoice']); + }, + nzOnCancel: () => { + this.modal.destroy(true); + } + }); + } + }); + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.html b/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.html new file mode 100644 index 00000000..c31df344 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.less b/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.ts b/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.ts new file mode 100644 index 00000000..ce376d0b --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/update-address-modal/update-address-modal.component.ts @@ -0,0 +1,102 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFCascaderWidgetSchema, SFComponent, SFSchema } from '@delon/form'; +import { TicketService } from '../../../services/ticket.service'; + +@Component({ + selector: 'app-update-address-modal', + templateUrl: './update-address-modal.component.html', + styleUrls: ['./update-address-modal.component.less'] +}) +export class UpdateAddressModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + schema: SFSchema = this.initSF(); + + constructor(public service: TicketService) {} + + ngOnInit(): void {} + + private initSF(): SFSchema { + return { + properties: { + reciname: { + type: 'string', + title: '收件人姓名', + ui: { + placeholder: '请输入' + } + }, + recitel: { + type: 'string', + title: '联系电话', + format: 'mobile', + minLength: 1, + maxLength: 11, + ui: { + placeholder: '请输入', + errors: { required: '请输入注册电话', format: '手机号格式错误' } + } + }, + provinceCode: { type: 'string', ui: { hidden: true } }, + provinceName: { type: 'string', ui: { hidden: true } }, + cityCode: { type: 'string', ui: { hidden: true } }, + cityName: { type: 'string', ui: { hidden: true } }, + areaCode: { type: 'string', ui: { hidden: true } }, + areaName: { type: 'string', ui: { hidden: true } }, + enterpriseAddressCode: { + type: 'number', + title: '收件人地区', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'cascader', + valueProperty: 'regionCode', + placeholder: '请选择', + labelProperty: 'name', + asyncData: (node: any, index: any) => { + return new Promise(resolve => { + this.getRegionDetailByCode(node?.regionCode || '').subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1 })); + }, + _ => {}, + () => { + resolve(); + } + ); + }); + }, + selectionChange: (node: any[]) => { + console.log(node); + + if (node?.length > 0) { + this.sf.setValue('/provinceCode', node[0]?.regionCode); + this.sf.setValue('/provinceName', node[0]?.name); + this.sf.setValue('/cityCode', node[1]?.regionCode); + this.sf.setValue('/cityName', node[1]?.name); + this.sf.setValue('/areaCode', node[2]?.regionCode); + this.sf.setValue('/areaName', node[2]?.name); + } + } + } as SFCascaderWidgetSchema + }, + reciaddr: { + type: 'string', + title: '详细地址', + ui: { + visibleIf: { + expand: (value: boolean) => value + } + } + } + }, + required: ['reciname', 'recitel', 'reciaddr', 'enterpriseAddressCode'] + }; + } + + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } +} diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html new file mode 100644 index 00000000..1dff8e97 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html @@ -0,0 +1,75 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    + + +
    + + + + {{ item.no }} + 预览发票 + + + {{ item.expresscompany }}
    + {{ item.expressno }} +
    +
    +
    + + +

    + 顺丰快递: {{ routesInfo?.mailNo }} + 已签收 +

    + +
    + + +
    +
    + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts new file mode 100644 index 00000000..ddc9df8a --- /dev/null +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts @@ -0,0 +1,367 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/ticket.service'; + +@Component({ + selector: 'app-invoiced-list', + templateUrl: './invoiced-list.component.html', + styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] +}) +export class InvoicedListComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('logosticsLogsModal', { static: false }) + logosticsLogsModal!: any; + columns: STColumn[] = this.initST(); + searchSchema: SFSchema = this.initSF(); + + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + + routesInfo: any = { + mailNo: '', + routes: [] + }; + + @ViewChild('requestedModal', { static: false }) + requestedModal!: any; + openInfo: any = { expresscompany: null, expressno: null }; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value, + invoicedate: { + start: this.sf.value.invoicedate?.[0] || '', + end: this.sf.value.invoicedate?.[1] || '' + } + }); + } + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.vatnotax, 0).toFixed(2); + break; + } + } + + deletedInvoice(item: any) { + // if (this.selectedRows?.length <= 0) { + // this.service.msgSrv.warning('请选择发票'); + // return; + // } + const modal = this.nzModalService.warning({ + nzTitle: '确定将所选发票作废?', + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_delete_invoice, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('发票作废成功'); + } + modal.destroy(); + this.st.load(1); + }); + return false; + } + }); + } + + canceInvoice(item: any) { + // if (this.selectedRows?.length <= 0) { + // this.service.msgSrv.warning('请选择发票'); + // return; + // } + const modal = this.nzModalService.warning({ + nzTitle: '确定取消所选发票?', + nzCancelText: '取消', + nzOnOk: () => { + this.service.request(this.service.$api_cancel_invoice, { id: item.id }).subscribe(res => { + if (res) { + this.service.msgSrv.success('取消发票成功'); + } + modal.destroy(); + this.st.load(1); + }); + return false; + } + }); + } + + /** + * 填写物流/修改物流 + * @param item + */ + requestedAction(item: any) { + this.openInfo = { expresscompany: item.expresscompany || null, expressno: item.expressno || null }; + const modal = this.nzModalService.create({ + nzTitle: item.expresscompany ? '修改物流' : '填写物流', + nzContent: this.requestedModal, + nzOnOk: () => { + if (!this.openInfo?.expresscompany || !this.openInfo?.expressno) { + this.service.msgSrv.warning('请填快递信息'); + return false; + } + const params = { + expresscompany: this.openInfo.expresscompany, + expressno: this.openInfo.expressno + }; + this.service + .request(this.service.$api_update_Express, { + id: item.id, + ...params + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(item.expresscompany ? '修改成功' : '填写成功'); + this.st.load(1); + modal.destroy(); + } + }); + + return false; + } + }); + } + + invoiceHongChong() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择发票'); + return; + } + this.nzModalService.warning({ + nzTitle: '确定将所选发票红冲?', + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + + showlogosticsLogs(item: any) { + this.service.request(this.service.$api_get_express_routes, item.expressno).subscribe(res => { + console.log(res); + if (res) { + res.routes = res.routes.map((route: any) => ({ time: route.acceptTime, value: route.remark + route.acceptAddress, color: 'gray' })); + this.routesInfo = res; + this.nzModalService.create({ + nzTitle: '查看物流', + nzWidth: 600, + nzContent: this.logosticsLogsModal, + nzFooter: [] + }); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + invoiceno: { + type: 'string', + title: '发票号码', + ui: { + autocomplete: 'off' + } + }, + invoiceno2: { + type: 'string', + title: '发票代码', + ui: { + autocomplete: 'off' + } + }, + vatappHCode: { + type: 'string', + title: '申请编号', + ui: { + autocomplete: 'off' + } + }, + invoicedate: { + title: '开票日期', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + artoname: { + type: 'string', + title: '购买人', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + ltdId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + }, + asyncData: () => this.service.getNetworkFreightForwarder({}, true) + }, + default: '' + }, + vatinvcode: { + type: 'string', + title: '分票编号', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '发票号码', index: 'invoiceno', width: 150 }, + { title: '发票代码', index: 'invoiceno2', width: 150 }, + { + title: '申请编号', + index: 'vatappHCode', + width: 190, + type: 'link', + click: item => + this.router.navigate(['/ticket/invoice-list/detail/' + item.id], { + queryParams: { type: 1, expressno: item.expressno } + }) + }, + { title: '申请时间', index: 'createTime', type: 'date', width: 150 }, + { title: '发票类型', index: 'invoicetypeLabel', className: 'text-center', width: 140 }, + { title: '网络货运人', index: 'ltdName', width: 170 }, + { title: '购买人', index: 'artoname', width: 170 }, + { title: '订单数', index: 'ordlines', className: 'text-right', width: 90 }, + { + title: '价税合计', + index: 'vatmoney', + width: 130, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatmoney }) } + }, + { + title: '金额', + index: 'vatnotax', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vatnotax }) } + }, + { + title: '税率', + index: 'billvatrate', + className: 'text-right', + width: 90, + format: item => `${item.billvatrate ? ((item.billvatrate as number) * 100).toFixed(2) : 0}%` + }, + { + title: '税额', + index: 'vattax', + width: 120, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.vattax }) } + }, + { title: '开票日期', index: 'invoicedate', type: 'date', width: 150 }, + { + title: '快递信息', + render: 'expresscompany', + width: 180 + }, + { title: '状态', index: 'stsLabel', width: 90 }, + { + title: '操作', + fixed: 'right', + className: 'text-center', + width: 120, + buttons: [ + { type: 'divider' }, + { + text: '查看明细
    ', + click: item => + this.router.navigate(['/ticket/invoice-list/detail/' + item.id], { + queryParams: { expressno: item.expressno, type: 2, ltdId: item.shipperId } + }) + }, + { + text: '取消开票
    ', + click: item => this.canceInvoice(item), + iif: item => item.sts === '1' + }, + { + text: '发票作废
    ', + click: item => this.deletedInvoice(item), + iif: item => item.sts === '3' + }, + { + text: '查看物流
    ', + click: item => this.showlogosticsLogs(item), + iif: item => item.expresscompany + }, + { + text: '填写物流
    ', + click: item => this.requestedAction(item), + iif: item => !item.expresscompany + }, + { + text: '修改物流
    ', + click: item => this.requestedAction(item), + iif: item => item.expresscompany + } + ] + } + ]; + } +} diff --git a/src/app/routes/ticket-management/services/ticket.service.ts b/src/app/routes/ticket-management/services/ticket.service.ts new file mode 100644 index 00000000..2c1222e5 --- /dev/null +++ b/src/app/routes/ticket-management/services/ticket.service.ts @@ -0,0 +1,175 @@ +/* + * @Author: your name + * @Date: 2021-12-29 13:12:35 + * @LastEditTime : 2022-04-11 16:41:43 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\ticket-management\\services\\ticket.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { EACacheService, ShipperBaseService } from '@shared'; + +@Injectable({ + providedIn: 'root' +}) +export class TicketService extends ShipperBaseService { + $mock_url = '/rule?_allow_anonymous=true'; + + // 运营端查询发票申请记录 + $api_get_invoice_requested_page = '/api/fcc/ficoVatappH/queryOperateVatappHList'; + // 导出发票申请记录 + $api_export_invoice_requested_page = '/api/fcc/ficoVatappH/reportOperateVatappHList'; + // 获取开票申请订单明细头部信息 + $api_get_invoice_requested_header_detail = '/api/fcc/ficoVatappBill/getDetailHeadByVatappHId'; + // 货主/运营端获取开票申请订单明细 + $api_get_invoice_requested_order_detail = '/api/fcc/ficoVatappBill/getDetailByVatapp'; + // 删除开票申请订单明细 + // $api_remove_bill = '/api/fcc/ficoVatappBill/deletebatch'; + // $api_remove_bill = '/api/fcc/ficoVatappH/remove'; + $api_remove_bill = '/api/fcc/ficoVatappBill/removeVatappBill'; + // 运营端单个/批量驳回 + $api_reject_invoice = '/api/fcc/ficoVatappH/rejectInvoiceApple'; + // 运营端修改开票地址 + $api_update_invoice_address = '/api/fcc/ficoVatappH/updateInvoiceAddr'; + + // 运营端销票处理-订单明细页面 + $api_ficoVatinvHList = '/api/fcc/ficoVatinvH/ficoVatinvHList'; + // 获取开票申请订单明细头部信息 + $api_ficoVatinv_header = '/api/fcc/ficoVatappBill/getDetailHeadByVatappHId'; + // 获取分票发票明细 + $api_ficoVatinv_Detail = '/api/fcc/ficoVatinvL/getDetailByVatinvHId'; + // 运营端订单明细开票处理 + $api_apply_fico = '/api/fcc/ficoVatinvH/crmPushInvo'; + // 手工开票获取开票申请信息展示 + $api_get_apply_fico_info = '/api/fcc/ficoVatappH/get'; + // 运营端手工开票/确认/E税云开票成功后的回调 + $api_apply_fico_invoic = '/api/fcc/ficoVatinvH/operateAffirmVatinv'; + // 运营端推送开票-E税云开票 + $api_push_invoic = '/api/fcc/ficoVatinvH/crmPushInvo'; + // 运营端批量推送开票-E税云开票 + $api_batch_push_invoic = '/api/fcc/ficoVatinvH/crmPushInvoBath'; + // 发票作废 + $api_cancel_invoic = '/api/fcc/ficoVatinvH/inpinvHCancel'; + // 运营端销票处理导出销售清单 + $api_export_invoic_detail = '/api/fcc/ficoVatinvH/reportVatinvHByOperator'; + + // 获取汇总下单路径 + $api_get_order_summary_path = '/api/fcc/ficoExpressH/getSummaryOrderAddress'; + // 新建快递单 + $api_create_express = '/api/fcc/ficoExpressH/save'; + // 获取汇总下单 + $api_get_order_summary = '/api/fcc/ficoExpressH/summaryOrder'; + // 打印快递面单 + $api_get_print_pdf = '/api/fcc/ficoExpressH/printData'; + + // 已开发票查询 + $api_get_invoice_page = '/api/fcc/ficoVatinvH/list/page'; + + // 更新快递信息 + $api_update_Express = '/api/fcc/ficoVatinvH/updateExpress'; + + // 发票作废 + $api_delete_invoice = '/api/fcc/ficoVatinvH/inpinvHCancel'; + // 发票取消 + $api_cancel_invoice = '/api/fcc/ficoVatinvH/cancel'; + // 获取销项发票抬头 + $api_get_invoice_header_detail = '/api/fcc/ficoVatinvH/get'; + // 获取分票发票抬头开票申请订单明细 + $api_get_invoice_order_detail = '/api/fcc/ficoVatappBill/getDetailByVatinvHId'; + // 货主/运营端获取开票申请订单明细导出 + $api_export_invoice_order_detail = '/api/fcc/ficoVatappBill/reportDetailByVatinvHId'; + // 获取分票发票抬头开票申请费用明细 + $api_get_invoice_cost_detail = '/api/fcc/ficoVatappFee/getDetailByVatinvHId'; + // 获取分票发票明细 + $api_get_invoice_details = '/api/fcc/ficoVatinvL/getDetailByVatinvHId'; + // 运营端订单明细开票处理 + $api_get_applyFicoVatinv = '/api/fcc/ficoVatinvH/applyFicoVatinv'; + // 开票申请列表批量开票 + $api_get_applyBatchFicoVatinv = '/api/fcc/ficoVatinvH/applyBatchFicoVatinv'; + // 删除销项发票抬头 + $api_delete_deletebatch = '/api/fcc/ficoVatinvH/deletebatch'; + // 保存开票申请费用明细 + $api_ficoVatappFee_save = '/api/fcc/ficoVatappFee/save'; + // 更新销项发票信息 + $api_update_evatinh = '/api/fcc/ficoVatinvH/updatEvatinvH'; + + // 查询ETC白名单(货主) + $api_get_etc_shipper_list = '/api/fcc/ficoShipperWhiteList/list/page'; + // 删除ETC白名单(货主) + $api_delete_etc_shipper = '/api/fcc/ficoShipperWhiteList/deleteBatch'; + // 保存ETC白名单(货主) + $api_save_etc_shipper = '/api/fcc/ficoShipperWhiteList/save'; + // 查询ETC企业列表 + $api_get_etc_list = '/api/mdc/cuc/enterpriseInfo/operate/etcList'; + // 查询ETC认证车辆信息筛选 + $api_get_etc_cart_list = '/api/mdc/cuc/carLicense/operate/findCarLicenseScreenList'; + // 查询ETC认证车辆信息筛选 + $api_get_etc_cart_page = '/api/fcc/ficoCarWhiteList/list/page'; + // 保存ETC白名单(车辆) + $api_save_etc_cart = '/api/fcc/ficoCarWhiteList/save'; + // 删除ETC白名单(车辆) + $api_delete_etc_cart = '/api/fcc/ficoCarWhiteList/deleteBatch'; + + // ETC申请开票界面查询 + $api_get_apply_invoice_page = '/api/sdc/invoiceEtcOperate/list/listEtcApplyPageList'; + // ETC开票申请 + $api_get_apply_invoice = '/api/sdc/invoiceEtcOperate/applyForInvoicingBatch'; + // ETC开票记录界面查询 + $api_get_invoice_record_page = '/api/sdc/invoiceEtcOperate/list/listEtcRecordPageList'; + // 查询ETC发票明细表 + $api_get_invoice_logs_page = '/api/fcc/ficoEtcInvoiceL/list/page'; + // 导出ETC发票明细表 + $api_export_invoice_logs_page = '/api/fcc/ficoEtcInvoiceL/asyncExport'; + + // 进项发票查询 + $api_get_input_invoice_page = '/api/fcc/ficoInpinvH/getListPage'; + // 根据ID获取进项发票详情 + $api_get_input_invoice_header = '/api/fcc/ficoInpinvH/getFicoInpinvHByid'; + // 查询进项发票明细 + $api_get_input_invoice_detail_page = '/api/fcc/ficoInpinvL/list/page'; + + // 查询快递轨迹 + $api_get_express_routes = '/api/fcc/ficoExpressH/searchRoutes'; + // 下载对账单文件 + $api_downloadPdf = '/api/fcc/ficoVatappBill/downloadPdf'; + // 对账单文件下载 + $api_download_Reconciliatio_pdf = '/api/fcc/ficoVatappBill/downloadReconciliationPdf'; + + // 根据地区code查询列表 + $api_get_region_by_code = '/api/mdc/pbc/region/getRegionByCode'; + // ETC申请开票导出 + $api_get_asyncExportEtcApplyList = '/api/sdc/invoiceEtcOperate/asyncExportEtcApplyList'; + // ETC开票记录导出 + $api_get_asyncExportEtcApplyRecordList = '/api/sdc/invoiceEtcOperate/asyncExportEtcApplyRecordList'; + // ETC白名单(货主)导出接口 + $api_get_aficoShipperWhiteList_asyncExport = '/api/fcc/ficoEtcInvoiceL/asyncExportWhiteList'; + // ETC白名单(车辆)导出接口 + $api_get_ficoCarWhiteList_asyncExport = '/api/fcc/ficoEtcInvoiceL/asyncExportCarWhiteList'; + + constructor(public injector: Injector) { + super(injector); + } + + public reviewPDF(url: string) { + if (!url) { + return; + } + this.openURL(url); + // const uA = window.navigator.userAgent; // 判断浏览器内核 + // const isIE = + // /msie\s|trident\/|edge\//i.test(uA) && + // !!('uniqueID' in document || 'documentMode' in document || 'ActiveXObject' in window || 'MSInputMethodContext' in window); + // const objectUrl = url; + // const a = document.createElement('a'); + // document.body.appendChild(a); + // a.href = objectUrl; + // a.download = '面单.pdf'; + // if (isIE) { + // // 兼容IE11无法触发下载的问题 + // (navigator as any).msSaveBlob(url, a.download); + // } else { + // a.click(); + // } + // a.remove(); + } +} diff --git a/src/app/routes/ticket-management/ticket-management-routing.module.ts b/src/app/routes/ticket-management/ticket-management-routing.module.ts new file mode 100644 index 00000000..5cbcd7d0 --- /dev/null +++ b/src/app/routes/ticket-management/ticket-management-routing.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { CancellationInvoiceComponent } from './components/cancellation-invoice/cancellation-invoice.component'; +import { ETCBlacklistComponent } from './components/etc-blacklist/etc-blacklist.component'; +import { ETCInvoicedListComponent } from './components/etc-invoiced-list/etc-invoiced-list.component'; +import { ETCInvoicedLogsComponent } from './components/etc-invoiced-logs/etc-invoiced-logs.component'; +import { ETCInvoicedRequestedComponent } from './components/etc-invoiced-requested/etc-invoiced-requested.component'; +import { ExpressInfoComponent } from './components/express-info/express-info.component'; +import { EditCollectionInvoiceComponent } from './components/input-invoice/edit-collection-invoice/edit-collection-invoice.component'; +import { InputInvoiceDetailComponent } from './components/input-invoice/input-invoice-detail/input-invoice-detail.component'; +import { InputInvoiceComponent } from './components/input-invoice/input-invoice.component'; +import { InvoiceDetailComponent } from './components/invoice-detail/invoice-detail.component'; +import { InvoiceRequestedDetailComponent } from './components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component'; +import { InvoiceRequestedComponent } from './components/invoice-requested/invoice-requested.component'; +import { InvoicedListComponent } from './components/invoiced-list/invoiced-list.component'; + +const routes: Routes = [ + { path: 'invoice-requested', component: InvoiceRequestedComponent }, + { path: 'invoice-requested/detail/:id', component: InvoiceRequestedDetailComponent }, + { path: 'invoice-list', component: InvoicedListComponent }, + { path: 'invoice-list/detail/:id', component: InvoiceDetailComponent }, + { path: 'cancellation-invoice', component: CancellationInvoiceComponent }, + { path: 'cancellation-invoice/detail/:id', component: InvoiceDetailComponent }, + { path: 'etc-invoice-requested', component: ETCInvoicedRequestedComponent }, + { path: 'etc-invoice-list', component: ETCInvoicedListComponent }, + { path: 'etc-invoiced-logs', component: ETCInvoicedLogsComponent }, + { path: 'etc-blacklist', component: ETCBlacklistComponent }, + { path: 'input-invoice', component: InputInvoiceComponent }, + { path: 'input-invoice/detail/:id', component: InputInvoiceDetailComponent }, + { path: 'input-invoice/edit/:id', component: EditCollectionInvoiceComponent }, + { path: 'express-info', component: ExpressInfoComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class TicketManagementRoutingModule {} diff --git a/src/app/routes/ticket-management/ticket-management.module.ts b/src/app/routes/ticket-management/ticket-management.module.ts new file mode 100644 index 00000000..e0d47e51 --- /dev/null +++ b/src/app/routes/ticket-management/ticket-management.module.ts @@ -0,0 +1,62 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared'; +import { TicketManagementRoutingModule } from './ticket-management-routing.module'; +import { ETCInvoicedListComponent } from './components/etc-invoiced-list/etc-invoiced-list.component'; +import { ETCInvoicedRequestedComponent } from './components/etc-invoiced-requested/etc-invoiced-requested.component'; +import { ETCInvoicedLogsComponent } from './components/etc-invoiced-logs/etc-invoiced-logs.component'; +import { ETCBlacklistComponent } from './components/etc-blacklist/etc-blacklist.component'; +import { InvoicedListComponent } from './components/invoiced-list/invoiced-list.component'; +import { InvoiceRequestedComponent } from './components/invoice-requested/invoice-requested.component'; +import { InvoiceRequestedDetailComponent } from './components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component'; +import { TransactionDetailsComponent } from './components/etc-invoiced-list/transaction-details/transaction-details.component'; +import { RequestedInvoiceModalComponent } from './components/invoice-requested/requested-invoice-modal/requested-invoice-modal.component'; +import { RequestedDetailComponent } from './components/invoice-requested/requested-detail/requested-detail.component'; +import { InvoiceDetailComponent } from './components/invoice-detail/invoice-detail.component'; +import { CancellationInvoiceComponent } from './components/cancellation-invoice/cancellation-invoice.component'; +import { PushInvoiceComponent } from './components/cancellation-invoice/push-invoice/push-invoice.component'; +import { AddOwnerComponent } from './components/etc-blacklist/add-owner/add-owner.component'; +import { AddCartComponent } from './components/etc-blacklist/add-cart/add-cart.component'; +import { InputInvoiceComponent } from './components/input-invoice/input-invoice.component'; +import { InputInvoiceDetailComponent } from './components/input-invoice/input-invoice-detail/input-invoice-detail.component'; +import { AddCollectionInvoiceModalComponent } from './components/input-invoice/add-collection-invoice-modal/add-collection-invoice-modal.component'; +import { EditCollectionInvoiceComponent } from './components/input-invoice/edit-collection-invoice/edit-collection-invoice.component'; +import { AddCostDetailComponent } from './components/input-invoice/add-cost-detail/add-cost-detail.component'; +import { PrintOrderModalComponent } from './components/invoice-requested/print-order-modal/print-order-modal.component'; +import { ExpressInfoComponent } from './components/express-info/express-info.component'; +import { ExpressDetailModalComponent } from './components/express-info/express-detail-modal/express-detail-modal.component'; +import { UpdateAddressModalComponent } from './components/invoice-requested/update-address-modal/update-address-modal.component'; + +const COMPONENTS: any = [ + ETCInvoicedListComponent, + ETCInvoicedRequestedComponent, + ETCInvoicedLogsComponent, + ETCBlacklistComponent, + InvoiceRequestedComponent, + InvoicedListComponent, + InvoiceRequestedDetailComponent, + InvoiceDetailComponent, + CancellationInvoiceComponent, + PushInvoiceComponent, + InputInvoiceComponent, + InputInvoiceDetailComponent, + EditCollectionInvoiceComponent, + ExpressInfoComponent +]; +const NOTROUTECOMPONENTS: any = [ + TransactionDetailsComponent, + RequestedInvoiceModalComponent, + RequestedDetailComponent, + AddOwnerComponent, + AddCartComponent, + AddCollectionInvoiceModalComponent, + AddCostDetailComponent, + PrintOrderModalComponent, + ExpressDetailModalComponent, + UpdateAddressModalComponent +]; +@NgModule({ + declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, TicketManagementRoutingModule, SharedModule] +}) +export class TicketManagementModule {} diff --git a/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.html b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.html new file mode 100644 index 00000000..e5021ee6 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.html @@ -0,0 +1,52 @@ + + +
    + + +
    +
    +
    正面照
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照
    +
    示例
    +
    +
    +
    +
    +
    + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.less b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.less new file mode 100644 index 00000000..856acdf9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.less @@ -0,0 +1,57 @@ +.sfBox{ + position: relative; +} +.pr { + position: relative; +} + +.pa { + position: absolute; + top: 35px; + left: 150px; + img{border: solid 1px #ebf0fb;} +} + +.tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } +} +.drivercard{ + position: absolute; + top: 710px; + left: 330px; + border: solid 1px #ebf0fb; +} +.jopcard{ + position: absolute; + top: 1115px; + left: 330px; + border: solid 1px #ebf0fb; +} +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + .setCustom .ant-form-item-control{ + margin-left: -100px !important + } + .borderImg{ + border: solid 1px #ebf0fb; + } + } +} diff --git a/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.spec.ts b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.spec.ts new file mode 100644 index 00000000..7c61267f --- /dev/null +++ b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CarSettleAddDriverComponent } from './add-driver.component'; + +describe('CarSettleAddDriverComponent', () => { + let component: CarSettleAddDriverComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CarSettleAddDriverComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CarSettleAddDriverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.ts b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.ts new file mode 100644 index 00000000..ed202b46 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/add-driver/add-driver.component.ts @@ -0,0 +1,715 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { cacheConf } from '@conf/cache.conf'; +import { SFComponent, SFUISchema, SFSchema, SFUploadWidgetSchema, SFDateWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EACacheService, EAEnvironmentService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { UsermanageService } from '../../../services/usercenter.service'; + +@Component({ + selector: 'app-car-add-driver', + templateUrl: './add-driver.component.html', + styleUrls: ['./add-driver.component.less'] +}) +export class CarSettleAddDriverComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; + record: any = {}; + i: any; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + ui3: SFUISchema = {}; + schema: SFSchema = {}; + schema1: SFSchema = {}; + schema2: SFSchema = {}; + showCardFlag = false; + showJopFlag = false; + detailData: any = { + identityInfoDTO: {}, + userDriverLicenseDTO: {}, + userPracticeSeniorityDTO: {} + }; + companyData: any = {}; + constructor( + private modal: NzModalRef, + public service: UsermanageService, + private envSrv: EAEnvironmentService, + private eaCacheSrv: EACacheService + ) {} + + ngOnInit(): void { + this.companyData = this.eaCacheSrv.get(cacheConf.env); + this.initSF(); + } + initSF() { + this.schema = { + properties: { + titleA: { + title: '司机信息(必填)', + type: 'string', + ui: { + widget: 'text' + }, + default: '照片上传后会自动识别文字并填充下列内容栏' + }, + mobile: { + title: '手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + widget: '' + } + }, + showName: { + title: '身份证照片', + type: 'string', + readOnly: true, + ui: { + widget: 'textarea', + borderless: true, + showRequired: true + }, + default: '请上传身份证原件的高清照片,若上传复印件,则需加盖公司印章及法人签字;上传后系统会自动识别并填写' + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6 + } + }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoFrontWatermark', avatar); + this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath; + this.checkIdCard(args.file.response.data.fullFilePath, 'front', 0); + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + } + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6 + } + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoBackWatermark', avatar); + this.detailData.certificatePhotoBack = args.file.response.data.fullFilePath; + this.checkIdCard(args.file.response.data.fullFilePath, 'back', 0); + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + } + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + name: { + title: '姓名', + type: 'string', + maxLength: 32, + ui: { + widget: '', + placeholder: '请输入姓名' + } + }, + certificateNumber: { + title: '身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + widget: '', + placeholder: '请输入法定代表人证件号', + errors: { + required: '请输入18位身份证号码' + } + } + }, + bankCardNo: { + title: '银行卡号', + type: 'string', + maxLength: 18, + ui: { + widget: '', + placeholder: '请输入银行卡号' + // change: (val: any) =>{ + // const value = val.replace(/\D/g,'') + // this.sf.setValue('/bankCardNo', value) + // }, + }, + default: '' + }, + bankName: { + title: '开户行', + type: 'string', + ui: { + widget: '' + }, + default: '' + } + }, + required: ['mobile','certificatePhotoFrontWatermark', 'certificatePhotoBackWatermark', 'name', 'certificateNumber', 'bankCardNo'] + }; + this.schema1 = { + properties: { + titleB: { + title: '驾驶证信息(必填)', + type: 'string', + ui: { + widget: 'text' + }, + default: '照片上传后会自动识别文字并填充下列内容栏' + }, + certificatePhotoWatermark: { + type: 'string', + title: '驾驶证照片', + ui: { + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传驾驶证照片,支持JPG、PNG格式,文件小于5M。照片信息缺失、拼凑、过度PS、模糊不清,都不会通过审核。', + data: { + appId: this.envSrv.env.appId + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf1?.setValue('/certificatePhotoWatermark', avatar); + this.detailData.userDriverLicenseDTO.certificatePhoto = args.file.response.data.fullFilePath; + this.checkDriverCard(args.file.response.data.fullFilePath, 'front', 0); + } else { + this.detailData.userDriverLicenseDTO.certificatePhoto = ''; + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt4M = file.size / 1024 / 1024 < 4; + if (!isLt4M) { + this.service.msgSrv.warning('图片大小超过4M!'); + observer.complete(); + return; + } + observer.next(isLt4M); + observer.complete(); + }); + } + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + roadImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + licenseNo: { + title: '驾驶证号', + type: 'string', + ui: { + // widget: 'text', + placeholder: '请输入' + } + // default: this.ar.snapshot.queryParams.licenseNo + }, + driverModel: { + title: '准驾车型', + type: 'string', + ui: { + widget: 'select', + mode: 'multiple', + containsAllLabel: false, + placeholder: '请选择准驾车型', + asyncData: () => + this.service.request(this.service.$api_getDictValue, { dictKey: 'driverModel' }).pipe( + map(data => { + return data.map((m: any) => { + return { label: m.label, value: m.label }; + }); + }) + ) + } + }, + validStartTime: { + title: '有效期起', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择起始日期' + }, + change: i => {} + } as SFDateWidgetSchema + }, + validEndTime: { + title: '有效期止', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择终止日期' + }, + change: i => {} + } as SFDateWidgetSchema + }, + signingOrganization: { + title: '签发机关', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入' + } + } + }, + required: ['certificatePhotoWatermark', 'licenseNo', 'driverModel', 'validStartTime', 'validEndTime'] + }; + this.schema2 = { + properties: { + titleC: { + title: '从业资格证(选填)', + type: 'string', + ui: { + widget: 'text' + }, + default: '照片上传后会自动识别文字并填充下列内容栏' + }, + certificatePhotoWatermark: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFilePath', + urlReName: 'data.fullFilePath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + appId: this.envSrv.env.appId + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf2?.setValue('/certificatePhotoWatermark', avatar); + this.detailData.userPracticeSeniorityDTO.certificatePhoto = args.file.response.data.fullFilePath; + this.checkQualificationCertificate(args.file.response.data.fullFilePath); + } else { + this.detailData.userPracticeSeniorityDTO.certificatePhoto = ''; + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + // previewFile: (file: NzUploadFile) => of() + } + }, + agreeImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + licenseNo: { + title: '从业资格证号', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入' + } + }, + regionCode: { + title: '签发省份', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择', + asyncData: () => this.getProvinceData() + } as SFDateWidgetSchema + }, + validStartTime: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择起始日期' + }, + change: i => {} + } as SFDateWidgetSchema + }, + validEndTime: { + title: '有效期止', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择终止日期' + }, + change: i => {} + } as SFDateWidgetSchema + } + }, + required: [] + }; + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 }, + width: 700 + }, + $title1: { + spanLabelFixed: 0 + }, + $title2: { + spanLabelFixed: 0 + }, + $title3: { + spanLabelFixed: 0 + }, + $title4: { + spanLabelFixed: 0 + }, + $enterpriseRegistrationTime: { + width: 680 + }, + $operatingEndTime: { + grid: { span: 9 } + }, + $dateType: { + grid: { span: 4 } + }, + $validEndTime: { + grid: { span: 9 } + }, + $dateType01: { + grid: { span: 4 } + }, + $registrationCapital: { + grid: { span: 12 } + }, + $unit: { + spanLabelFixed: 20, + grid: { span: 3 } + } + }; + this.ui2 = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $titleB:{ + grid: { span: 24 }, + }, + $certificatePhotoWatermark: { + grid: { span: 12 }, + }, + $roadImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + }; + this.ui3 = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $titleC:{ + grid: { span: 24 }, + }, + $certificatePhotoWatermark: { + grid: { span: 12 }, + }, + $agreeImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + }; + } + getRegionToThree() { + // 获取一、二、三级地区详情 + this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { + if(this.sf1){ + this.sf1.getProperty('/enterpriseAddressCode')!.schema.enum = res.data; + this.sf1?.getProperty('/enterpriseAddressCode')?.widget.reset(res.data); + } + }); + } + getProvinceData() { + return this.service.request(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( + map(res => { + const result: any = []; + if (res) { + res.map((m: any) => { + const item = { label: m.name, value: m.regionCode }; + result.push(item); + }); + } + return result; + }) + ); + } + checkIdCard(imgurl: any, side: any, type: any) { + // 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardUrl: imgurl, + side + }; + this.service.request(this.service.$api_checkIdCard, params).subscribe(res => { + if (res) { + if (type === 0) { + // 法定代表人身份证 + if (side === 'front') { + // 正面 + this.sf.setValue('/name', res.name); + this.sf.setValue('/certificateNumber', res.number); + } + } + } + }); + } + checkQualificationCertificate(imgurl: any) { + // 识别从业资格证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + qualificationCertificateUrl: imgurl + }; + this.service.request(this.service.$api_recognizeQualificationCertificate, params).subscribe(res => { + console.log(res); + + if (res) { + this.sf2.setValue('/licenseNo', res.certificateNumber); + this.sf2.setValue('/regionCode', res.addressRegionCodes?.[0]); + } + }); + } + + checkDriverCard(imgurl: any, side: any, type: any) { + // 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + driverLicenseUrl: imgurl, + side + }; + this.service.request(this.service.$api_recognizeDriverLicense, params).subscribe(res => { + if (res) { + if (type === 0) { + // 法定代表人身份证 + if (side === 'front') { + // 正面 + this.sf1.setValue('/licenseNo', res.number); + this.sf1.setValue('/driverModel', [res.classType?.toUpperCase()]); + this.sf1.setValue('/validStartTime', res.validFrom); + this.sf1.setValue('/validEndTime', res.validTo); + this.sf1.setValue('/signingOrganization', res.issuingAuthority); + } + } + } + }); + } + close(): void { + this.modal.destroy(); + } + showExample() { + this.showCardFlag = !this.showCardFlag; + } + showJopExample() { + this.showJopFlag = !this.showJopFlag; + } + submitForm() { + const items: any = this.sf.value; + items.certificatePhotoFrontWatermark = this.sf.value?.certificatePhotoFrontWatermark?.data?.fullFilePath || this.sf.value?.certificatePhotoFrontWatermark; + items.certificatePhotoBackWatermark = this.sf.value?.certificatePhotoBackWatermark?.data?.fullFilePath || this.sf.value?.certificatePhotoBackWatermark; + const items2: any = this.sf1.value; + items2.certificatePhotoWatermark = this.sf1.value?.certificatePhotoWatermark?.data?.fullFilePath || this.sf1.value?.certificatePhotoWatermark; + const items3: any = this.sf2.value; + items3.certificatePhotoWatermark = this.sf2.value?.certificatePhotoWatermark?.data?.fullFilePath || this.sf2.value?.certificatePhotoWatermark; + const params: any = { + source: 2, + mobile: this.sf.value.mobile, + bankCardNo: this.sf.value.bankCardNo, + bankName: this.sf.value.bankName, + identityInfoDTO: { + ...items, + certificatePhotoFront: this.detailData.certificatePhotoFront, + certificatePhotoBack: this.detailData.certificatePhotoBack + }, + userDriverLicenseDTO: { + ...items2, + certificatePhoto: this.detailData.userDriverLicenseDTO.certificatePhoto + }, + userPracticeSeniorityDTO: { + ...items3, + certificatePhoto: this.detailData.userPracticeSeniorityDTO.certificatePhoto + } + }; + if (params.userPracticeSeniorityDTO.certificatePhoto === '' || params.userPracticeSeniorityDTO.certificatePhotoWatermark === '') { + delete params.userPracticeSeniorityDTO.certificatePhotoWatermark; + delete params.userPracticeSeniorityDTO.certificatePhoto; + } + params.userDriverLicenseDTO.driverModel = params.userDriverLicenseDTO.driverModel.join(','); + delete params.identityInfoDTO.showName; + delete params.identityInfoDTO.titleA; + delete params.userDriverLicenseDTO.titleB; + delete params.userPracticeSeniorityDTO.titleC; + delete params.userDriverLicenseDTO.tipsA; + delete params.userPracticeSeniorityDTO.tipsC; + if (JSON.stringify(params.userPracticeSeniorityDTO) === '{}') { + params.userPracticeSeniorityDTO = null; + } + this.service.request(this.service.$api_driver_add, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('添加成功'); + this.modal.close(true); + } + }); + } +} diff --git a/src/app/routes/usercenter/components/driver/captain/add/add.component.html b/src/app/routes/usercenter/components/driver/captain/add/add.component.html new file mode 100644 index 00000000..fdc58217 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/add/add.component.html @@ -0,0 +1,39 @@ + + +
    + + +
    +
    +
    正面照
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照
    +
    示例
    +
    +
    +
    +
    +
    +
    + diff --git a/src/app/routes/usercenter/components/driver/captain/add/add.component.less b/src/app/routes/usercenter/components/driver/captain/add/add.component.less new file mode 100644 index 00000000..fd19d3c9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/add/add.component.less @@ -0,0 +1,41 @@ +.pr { + position: relative; +} + +.pa { + position: absolute; + top: 35px; + left: 150px; + img{border: solid 1px #ebf0fb;} +} + +.tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } +} +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + .hideBtn .ant-upload-list-item-actions button{ + &:last-child{ + display: none; + } + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/captain/add/add.component.spec.ts b/src/app/routes/usercenter/components/driver/captain/add/add.component.spec.ts new file mode 100644 index 00000000..763d7784 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/add/add.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CtcCaptatinAddComponent } from './add.component'; + +describe('CtcCaptatinAddComponent', () => { + let component: CtcCaptatinAddComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CtcCaptatinAddComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CtcCaptatinAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/captain/add/add.component.ts b/src/app/routes/usercenter/components/driver/captain/add/add.component.ts new file mode 100644 index 00000000..8a477dc9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/add/add.component.ts @@ -0,0 +1,409 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { SFComponent, SFSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer, Subject } from 'rxjs'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; +import { debounceTime } from 'rxjs/operators'; + + +@Component({ + selector: 'app-ctc-add', + templateUrl: './add.component.html', + styleUrls: ['./add.component.less'] +}) +export class CtcCaptatinAddComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + record: any = {}; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + readFlag = false; + changeSub = new Subject(); + detailData: any = { + bankCardNo: '', + bankName: '', + mobile: '', + remark: '', + identityInfoDTO: { + certificatePhotoBackWatermark: '', + certificatePhotoFrontWatermark: '', + certificatePhotoFront: '', + certificatePhotoBack: '', + certificateNumber: '', + name: '', + } + } + + constructor( + private modal: NzModalRef, + private envSrv: EAEnvironmentService, + public service: UsermanageService + ) { } + + ngOnInit(): void { + this.initData() + this.initSF(); + this.changeEndKmAction(); + } + initData() { + if (this.i && this.i.id) { + this.service.request(this.service.$api_captainrDetail, { id: this.i.id }).subscribe(res => { + if (res) { + this.detailData = res + this.detailData.identityInfoDTO.certificatePhotoFrontWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.identityInfoDTO.certificatePhotoFrontWatermark, + response: this.detailData.identityInfoDTO.certificatePhotoFrontWatermark, + }, + ]; + this.detailData.identityInfoDTO.certificatePhotoBackWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.identityInfoDTO.certificatePhotoBackWatermark, + response: this.detailData.identityInfoDTO.certificatePhotoBackWatermark, + }, + ]; + this.initSF(); + } + }) + } + + } + initSF() { + this.schema = { + properties: { + mobile: { + title: '手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + widget: this.i.id ? 'text' : '', + placeholder: '请输入手机号', + blur: () => { + if(!this.sf.value.mobile) { + return + } + this.service.request(this.service.$api_getByMobile, { mobile: this.sf.value.mobile }).subscribe(res => { + if (res.certificateNumber) { + this.readFlag = true + this.detailData = { + mobile: this.sf.value.mobile, + bankName: this.sf.value.bankName, + bankCardNo: this.sf.value.bankCardNo, + remark: this.sf.value.remark, + identityInfoDTO: { + certificatePhotoFrontWatermark: [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: res.certificatePhotoFrontWatermark, + response: res.certificatePhotoFrontWatermark, + }], + certificatePhotoBackWatermark: [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: res.certificatePhotoBackWatermark, + response: res.certificatePhotoBackWatermark, + }], + name: res.name, + certificateNumber: res.certificateNumber, + certificatePhotoFront: res.certificatePhotoFront, + certificatePhotoBack: res.certificatePhotoBack, + } + } + this.initSF() + } else { + this.readFlag = false + this.detailData = { + mobile: this.sf.value.mobile, + bankName: this.sf.value.bankName, + bankCardNo: this.sf.value.bankCardNo, + remark: this.sf.value.remark, + identityInfoDTO: { + certificatePhotoFrontWatermark: '', + certificatePhotoBackWatermark: '', + name: '', + certificateNumber: '', + certificatePhotoFront: '', + certificatePhotoBack: '', + } + } + this.initSF() + } + }) + } + }, + default: this.detailData.mobile + }, + name: { + title: '姓名', + type: 'string', + ui: { + widget: this.i.id && (this.i.driverLicenseStatus === 10 || this.i.driverLicenseStatus === 20) ? 'text' : '', + placeholder: '请输入姓名', + }, + readOnly: this.readFlag, + default: this.detailData.identityInfoDTO.name + }, + bankCardNo: { + title: '银行卡号', + type: 'string', + ui: { + widget: '', + placeholder: '请输入银行卡号', + change: (val: any) => { + const value = val.replace(/\D/g, '') + this.sf.setValue('/bankCardNo', value) + }, + errors: { + required: '请输入银行账号', + }, + }, + default: this.detailData.bankCardNo + }, + bankName: { + title: '开户行', + type: 'string', + ui: { + widget: '', + placeholder: '请输入开户行', + }, + default: this.detailData.bankName + }, + showName: { + title: '身份证照片', + type: 'string', + readOnly: true, + ui: { + widget: 'textarea', + showRequired: true, + borderless: true, + }, + default: '请上传身份证原件的高清照片,若上传复印件,则需加盖公司印章及法人签字;上传后系统会自动识别并填写', + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + readOnly: (this.i.id && (this.i.driverLicenseStatus === 10 || this.i.driverLicenseStatus === 20)) || this.readFlag, + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.identityInfoDTO.certificatePhotoFront = args.file.response.data.fullFilePath + this.checkIdCard(args.file.response.data.fullFilePath, 'front'); + } else { + this.detailData.identityInfoDTO.certificatePhotoFront = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: any) => { } + }, + default: this.detailData.identityInfoDTO.certificatePhotoFrontWatermark + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + readOnly: (this.i.id && (this.i.driverLicenseStatus === 10 || this.i.driverLicenseStatus === 20)) || this.readFlag, + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + this.detailData.identityInfoDTO.certificatePhotoBack = args.file.response.data.fullFilePath + } else { + this.detailData.identityInfoDTO.certificatePhotoBack = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: any) => { } + }, + default: this.detailData.identityInfoDTO.certificatePhotoBackWatermark + }, + certificateNumber: { + title: '身份证号', + type: 'string', + readOnly: (this.i.id && (this.i.driverLicenseStatus === 10 || this.i.driverLicenseStatus === 20)) || this.readFlag, + ui: { + widget: this.i.id && (this.i.driverLicenseStatus !== 10 && this.i.driverLicenseStatus !== 20) ? 'text' : '', + placeholder: '请输入身份证号', + }, + default: this.detailData.identityInfoDTO.certificateNumber + }, + remark: { + title: '备注', + type: 'string', + maxLength: 100, + ui: { + widget: 'textarea', + placeholder: '请输入备注', + autosize: { minRows: 2, maxRows: 6 }, + }, + default: this.detailData.remark + }, + }, + required: ['name', 'mobile', 'bankCardNo', 'certificateNumber', 'certificatePhotoBackWatermark', 'certificatePhotoFrontWatermark'], + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 }, + }, + }; + // setTimeout(() => { + // if (this.readFlag) { + // this.detailData.identityInfoDTO.certificatePhotoFrontWatermark = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: this.detailData.certificatePhotoFrontWatermark, + // response: this.detailData.certificatePhotoFrontWatermark, + // }, + // ]; + // this.detailData.identityInfoDTO.certificatePhotoBackWatermark = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: this.detailData.certificatePhotoBackWatermark, + // response: this.detailData.certificatePhotoBackWatermark, + // }, + // ]; + // this.sf.setValue('/mobile', this.detailData.mobile) + // this.sf.setValue('/name', this.detailData.name) + // this.sf.setValue('/certificateNumber', this.detailData.certificateNumber) + // this.sf.setValue('/certificatePhotoFrontWatermark', this.detailData.identityInfoDTO.certificatePhotoFrontWatermark) + // this.sf.setValue('/certificatePhotoBackWatermark', this.detailData.identityInfoDTO.certificatePhotoBackWatermark) + // } + // }, 500) + + } + + checkIdCard(imgurl: any, side: any) { + // 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardUrl: imgurl, + side, + }; + this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => { + if (res) { + this.sf.setValue('/name', res.name); + this.sf.setValue('/certificateNumber', res.number); + } + }); + } + close(): void { + this.modal.destroy(); + } + changeEndKmAction() { + this.changeSub.pipe(debounceTime(500)).subscribe((res: string) => { + if (res) { + const params: any = { + bankCardNo: this.sf.value.bankCardNo, + bankName: this.sf.value.bankName, + mobile: this.sf.value.mobile, + remark: this.sf.value.remark, + identityInfoDTO: { + certificatePhotoBackWatermark: this.sf.value?.certificatePhotoBackWatermark?.data?.fullFilePath || this.sf.value?.certificatePhotoBackWatermark, + certificatePhotoFrontWatermark: this.sf.value?.certificatePhotoFrontWatermark?.data?.fullFilePath ||this.sf.value?.certificatePhotoFrontWatermark, + certificatePhotoFront: this.detailData.certificatePhotoFront, + certificatePhotoBack: this.detailData.certificatePhotoBack, + certificateNumber: this.sf.value.certificateNumber, + name: this.sf.value.name, + } + } + if (this.i.id) { + params.id = this.i.id + } + delete params.showName + this.service.request(this.service.$api_saveCaptainr_new, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('保存成功') + this.modal.close(true) + } + }) + } + }); + } + sure() { + this.changeSub.next('500'); + } +} diff --git a/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.html b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.html new file mode 100644 index 00000000..0e8b40a9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + +
    + + 个人信息 + + +
    + + + + + + + + + +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    + + + 银行结算信息(暂无银行信息) + + + {{ item.bankName }} + + + {{ item?.bankCardNumber }} + + + + +
    + + +
    +
    + + {{ userIdentityDetail?.name }} + + + + +
    +
    +
    + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.less b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.less new file mode 100644 index 00000000..c0580085 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.less @@ -0,0 +1,24 @@ +@import '../../../../less/edit.less'; + +:host { + ::ng-deep { + + .sv__title { + font-weight: 600; + } + + + .user-info { + display : flex; + font-size: 16px; + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.ts b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.ts new file mode 100644 index 00000000..b5179dd0 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain-detail/captain-detail.component.ts @@ -0,0 +1,227 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; + +@Component({ + selector: 'app-captain-detail', + templateUrl: './captain-detail.component.html', + styleUrls: ['./captain-detail.component.less'], + providers: [DatePipe] +}) +export class CaptainDetailComponent implements OnInit { + userDetail: any; + userIdentityDetail: any = {}; + tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + bankList: any[] = []; + + @ViewChild('redectModal', { static: false }) + redectModal!: any; + @ViewChild('rejectedDriverModal', { static: false }) + rejectedDriverModal!: any; + approvalOpinion = ''; + + isEditUser = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + constructor( + private nzModalService: NzModalService, + public service: UsermanageService, + private route: ActivatedRoute, + private datePipe: DatePipe, + private nzImageService: NzImageService + ) {} + + ngOnInit() { + this.initData(); + } + initData() { + // 获取司机头部信息 + this.service + .request(this.service.$api_get_user_detail, { + appUserId: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.userDetail = res; + } + }); + // 获取用户个人信息 + this.service + .request(this.service.$api_get_user_identity, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.userIdentityDetail = res; + this.tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + } + }); + // 获取用户银行信息 + this.service + .request(this.service.$api_get_user_bank_list, { + roleId: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.bankList = res; + } + }); + } + + /** 启用/冻结司机 */ + userAction(status: number) { + this.nzModalService.warning({ + nzTitle: status === 1 ? '确定启用该司机吗?' : '确定冻结该司机吗?', + nzContent: status === 1 ? '启用后,该司机将恢复正常使用功能,请再次确认!' : '冻结后,司机将被限制使用,无法登陆,请谨慎操作!', + nzOnOk: () => { + this.service + .request(this.service.$api_lock_or_free_user, { + appUserId: [this.userDetail.appUserId], + freezeOrResume: !!!status, + pageName: '司机详情', + telephone: this.userDetail.phone + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功'); + } + this.initData(); + }); + } + }); + } + + /** 审核通过个人信息 */ + approveUser() { + this.nzModalService.confirm({ + nzTitle: '审核通过', + nzContent: `是否确认通过(姓名:${this.userIdentityDetail.name})审核`, + nzOnOk: () => { + this.adjuctUser({ auditStatus: 0, auditType: 0, identityId: this.userIdentityDetail?.id }, '审核通过'); + } + }); + } + + /** 驳回个人信息 */ + rejectedUser() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.adjuctUser( + { + auditStatus: 1, + auditType: 0, + identityId: this.userIdentityDetail?.id, + certificationOpinions: this.approvalOpinion + }, + '审核驳回成功' + ); + return; + } + }); + } + + /** 个人信息审核 */ + private adjuctUser(params: any, msg: string) { + this.service.request(this.service.$api_approve_identity, { ...params }).subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + } + this.initData(); + }); + } + + /** + * 开启修改 + */ + ratify() { + this.isEditUser = true; + } + + /** + * 需求修改 + */ + reset() { + this.userIdentityDetail = { ...this.tempalateUserIdentityDetail }; + this.isEditUser = false; + } + + saveUser() { + const userIdentity = this.userIdentityDetail; + const params = { + certificateNumber: userIdentity.certificateNumber, + certificatePhotoBack: userIdentity.certificatePhotoBack, + certificatePhotoBackWatermark: userIdentity.certificatePhotoBackWatermark, + certificatePhotoFront: userIdentity.certificatePhotoFront, + certificatePhotoFrontWatermark: userIdentity.certificatePhotoFrontWatermark, + certificateType: userIdentity.certificateType, + handCertificate: userIdentity.handCertificate, + id: userIdentity.id, + name: userIdentity.name, + souceType: userIdentity.souceType, + sourceAppId: userIdentity.sourceAppId, + tenantId: userIdentity.tenantId, + userId: userIdentity.userId, + validEndTime: + userIdentity.validEndTime?.length === 10 + ? userIdentity.validEndTime + : this.datePipe.transform(userIdentity.validEndTime, 'yyyy-MM-dd'), + validStartTime: + userIdentity.validStartTime?.length === 10 + ? userIdentity.validStartTime + : this.datePipe.transform(userIdentity.validStartTime, 'yyyy-MM-dd') + }; + this.service.request(this.service.$api_update_driver_identity, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.isEditUser = false; + this.initData(); + } + }); + } + + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + } + } + + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + + goBack() { + window.history.go(-1); + } +} diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.html b/src/app/routes/usercenter/components/driver/captain/captain.component.html new file mode 100644 index 00000000..35a6123f --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.html @@ -0,0 +1,77 @@ + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + + + + {{ item.promotersTelephone || '添加' }} + + + +
    + + +
    +
    + + + +
    +
    +
    diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.less b/src/app/routes/usercenter/components/driver/captain/captain.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.ts b/src/app/routes/usercenter/components/driver/captain/captain.component.ts new file mode 100644 index 00000000..7191198c --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.ts @@ -0,0 +1,243 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { DynamicSettingModalComponent } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +import { CtcCaptatinAddComponent } from './add/add.component'; +@Component({ + selector: 'app-usercenter-components-driver-captain', + templateUrl: './captain.component.html', + styleUrls: ['./captain.component.less'] +}) +export class UserCenterComponentsDriverCaptainComponent implements OnInit { + _$expand = false; + + ui: SFUISchema = { '*': { spanLabelFixed: 120, grid: { lg: 8, md: 12, sm: 12, xs: 24 } } }; + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + @ViewChild('promoterModal', { static: false }) + promoterModal!: any; + promotersTelephone = ''; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute, private modalHelper: ModalHelper,) {} + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value) + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + + ngOnInit() { + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + + addPromoter(item?: any) { + this.promotersTelephone = item?.promotersTelephone; + const modal = this.modal.create({ + nzTitle: '推广业务员', + nzContent: this.promoterModal, + nzOnOk: () => { + if (!!!this.promotersTelephone) { + return false; + } + if (typeof this.promotersTelephone === 'string' && !/(^1\d{10}$)/.test(this.promotersTelephone)) { + this.service.msgSrv.error('手机格式错误'); + return false; + } + this.service + .request(this.service.$api_add_user_salesman, { userId: item.userId, mobile: this.promotersTelephone }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(item?.promotersTelephone ? '添加推广员成功' : '修改推广员成功'); + } + this.st.load(); + }); + return; + } + }); + } + + settingAction(item?: any) { + this.modal.create({ + nzTitle: '基础设置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '4', + businessId: item.id + }, + nzFooter: null + }); + } + + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + exportList() { + const params = this.reqParams; + this.service.downloadFile(this.service.$api_export_driver_cap, {...params, pageSize: -1}); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + name: { title: '车队长姓名', type: 'string', ui: { placeholder: '请输入', showRequired: false } }, + mobile: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入' + } + }, + identityNo: { + title: '身份证号', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + promotersTelephone: { + title: '业务员手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + identityStatus: { + type: 'string', + title: '实名认证状态', + enum: [ + { label: '全部', value: '' }, + { label: '待审核', value: 0 }, + { label: '审核通过', value: 1 }, + { label: '驳回', value: 2 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + source: { + type: 'string', + title: '注册渠道', + enum: [ + { label: '全部', value: '' }, + { label: '用户注册', value: 1 }, + { label: '货主添加', value: 2 }, + { label: '运营添加', value: 3 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '车队长姓名', className: 'text-center', index: 'name' }, + { title: '手机号', className: 'text-center', index: 'mobile' }, + { title: '身份证号', className: 'text-center', index: 'identityNo' }, + { + title: '实名认证状态', + className: 'text-center', + index: 'identityStatus', + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 0: { text: '待审核', color: 'processing' }, + 1: { text: '审核通过', color: 'success' }, + 2: { text: '驳回', color: 'warning' } + } + }, + { title: '推广业务员', className: 'text-center', render: 'promotersTelephone' }, + { title: '注册渠道', className: 'text-center', index: 'source', type: 'enum', enum: { 1: '用户注册', 2: '货主添加' , 3: '运营添加'} }, + { title: '注册时间', className: 'text-center', index: 'createTime' }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: item => { + this.router.navigate(['/usercenter/driver/captain/detail', item.appUserId]); + }, + acl: { ability: ['USERCENTER-DRIVER-CAPTAIN-view'] } + }, + // { + // text: '基础设置', + // click: item => this.settingAction(item), + // acl: { ability: ['USERCENTER-DRIVER-CAPTAIN-basicSetting'] } + // } + ] + } + ]; + } + /** + * 新增单个实例 + */ + add() { + this.modalHelper.create(CtcCaptatinAddComponent, { i: { id: '' } }, { size: 900 }).subscribe(res => { + this.st.reload(); + }); + } +} diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.html b/src/app/routes/usercenter/components/driver/detail/detail.component.html new file mode 100644 index 00000000..141ab9bc --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + +
    + + 个人信息 + + + + + + + +
    + + + + + + + + + +
    +
    + + + + + + + + + + - + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + + +
    + + 驾驶证信息 + + +
    + + + + + + + + + +
    +
    + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + +
    + + + + 从业资格证信息 + + + + + + + + + + + + + + + + {{licenseDetail?.regionCodeName }} + + + + + + - + + + + + + + + + + + + + + + + +
    + + + + 载具信息 + + + {{ carDatail?.carNo }} + + + {{ carDatail?.carNoColor }} + + + {{ carDatail?.carModel }} + + + {{ carDatail?.carLength }} + + + {{ carDatail?.isDefault?'是':'否' }} + + + {{ carDatail?.isSelf?'否':'是' }} + + + + + + + + + + + + + + + + + + 银行结算信息 (暂无银行信息) + + + + {{ item.bankName }} + + + {{ item?.bankCardNumber }} + + + + + + + 服务评级 + (暂无评级) + + + + + + + + 关联企业 + + + +
    + + + +
    +
    + + {{ userIdentityDetail?.name }} + + + + +
    +
    +
    + + +
    +
    + + {{driverDetail?.licenseNo }} + + + {{ licenseDetail?.licenseNo }} + + + + +
    +
    +
    + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.less b/src/app/routes/usercenter/components/driver/detail/detail.component.less new file mode 100644 index 00000000..3fc40149 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.less @@ -0,0 +1,33 @@ +@import '../../../less/edit.less'; + +:host { + ::ng-deep { + + .sv__title { + font-weight: 600; + } + + + .user-info { + display : flex; + font-size: 16px; + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + } + + .imgBox { + display: flex; + + img { + width : 200px !important; + height: 160px; + } + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.ts new file mode 100644 index 00000000..dc7ee992 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.ts @@ -0,0 +1,503 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFTagWidgetSchema, SFTextWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { Subject } from 'rxjs'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { UsermanageService } from '../../../services/usercenter.service'; +import { debounceTime } from 'rxjs/operators'; + +@Component({ + selector: 'app-usercenter-components-driver-detail', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'], + providers: [DatePipe] +}) +export class UserCenterComponentsDriverDetailComponent implements OnInit { + detailData: any; + userDetail: any; + contencarModel: any; + facetext: any; + faceStatus: any = 0; + userIdentityDetail: any = {}; + tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + driverDetail: any = { + licenseNo: '', + driverModel: [], + validStartTime: '', + validEndTime: '', + signingOrganization: '', + certificatePhotoWatermark: '' + }; + tempalateDriverData = { ...this.driverDetail }; + licenseDetail: any = { + licenseNo: '', + validStartTime: '', + validEndTime: '', + certificatePhotoWatermark: '', + regionCode: '' + }; + tempalateLicenseDetail = { ...this.licenseDetail }; + columns: STColumn[] = [ + { title: '企业名称', className: 'text-center', index: 'enterpriseName' }, + { title: '项目名称', className: 'text-center', index: 'projectName' }, + { title: '角色', className: 'text-center', index: 'roleName' } + ]; + carList: any = []; + + @ViewChild('redectModal', { static: false }) + redectModal!: any; + @ViewChild('rejectedDriverModal', { static: false }) + rejectedDriverModal!: any; + adressCodeList: any = []; + billEvaluateList: any = []; + approvalOpinion = ''; + bankList: any[] = []; + isEditUser = false; + isEditDriver = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + constructor( + private nzModalService: NzModalService, + public service: UsermanageService, + public route: ActivatedRoute, + private datePipe: DatePipe, + private nzImageService: NzImageService + ) {} + + ngOnInit() { + this.initData(); + this.initDetailByCode(); + } + initData() { + // 获取司机头部信息 + this.service.request(this.service.$api_get_user_detail, { appUserId: this.route.snapshot.params.id }).subscribe(res => { + if (res) { + this.userDetail = res; + } + }); + this.service.request(this.service.$api_getDictValue, { dictKey: 'driverModel' }).subscribe(res => { + if (res) { + this.contencarModel = res; + } + }); + // 获取人脸识别结果 + this.service.request(this.service.$api_getFaceFlowQuery, { id: this.route.snapshot.params.id }).subscribe(res => { + if (res) { + this.faceStatus = res.status; + if (res.status == 4) { + this.facetext = res.failReason; + } + } + }); + // 获取用户个人信息 + this.service.request(this.service.$api_get_user_identity, { id: this.route.snapshot.params.id }).subscribe(res => { + if (res) { + this.userIdentityDetail = res; + this.tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + } + }); + // 获取驾驶证信息 + this.service.request(this.service.$api_get_driver_license, { appUserId: this.route.snapshot.params.id }).subscribe(res => { + if (res?.id) { + Object.assign(res, { driverModel: res.driverModel ? res.driverModel.split(',') : [] }); + this.driverDetail = res; + + this.tempalateDriverData = { ...this.driverDetail }; + } + }); + // 获取从业资格证信息 + this.service.request(this.service.$api_get_driver_practice_seniority, { appUserId: this.route.snapshot.params.id }).subscribe(res => { + if (res?.id) { + this.licenseDetail = res; + this.tempalateLicenseDetail = { ...this.licenseDetail }; + } + }); + // 获取载具信息 + this.service.request(this.service.$api_get_driver_car_license, { appUserId: [this.route.snapshot.params.id] }).subscribe(res => { + if (res) { + this.carList = res; + } + }); + // 获取评价信息 + this.service + .request(this.service.$api_get_driver_billEvaluate, { passiveUserId: this.route.snapshot.params.id }, 'POST', false) + .subscribe(res => { + if (res) { + this.billEvaluateList = res; + } + }); + + // 获取用户银行信息 + this.service + .request(this.service.$api_get_user_bank_list, { + roleId: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.bankList = res; + } + }); + } + + /** 启用/冻结司机 */ + userAction(status: number) { + this.nzModalService.warning({ + nzTitle: status === 1 ? '确定启用该司机吗?' : '确定冻结该司机吗?', + nzContent: status === 1 ? '启用后,该司机将恢复正常使用功能,请再次确认!' : '冻结后,司机将被限制使用,无法登陆,请谨慎操作!', + nzOnOk: () => { + this.service + .request(this.service.$api_lock_or_free_user, { + appUserId: [this.userDetail.appUserId], + freezeOrResume: !!!status, + pageName: '司机详情', + telephone: this.userDetail.phone + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功'); + } + this.initData(); + }); + } + }); + } + + /** 审核通过个人信息 */ + approveUser() { + this.nzModalService.confirm({ + nzTitle: '审核通过', + nzContent: `是否确认通过(姓名:${this.userIdentityDetail.name})审核`, + nzOnOk: () => { + this.adjuctUser({ auditStatus: 0, auditType: 0, identityId: this.userIdentityDetail?.id }, '审核通过'); + } + }); + } + + /** 驳回个人信息 */ + rejectedUser() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + this.service.msgSrv.warning('请填写备注'); + return false; + } + this.adjuctUser( + { + auditStatus: 1, + auditType: 0, + identityId: this.userIdentityDetail?.id, + certificationOpinions: this.approvalOpinion + }, + '审核驳回成功' + ); + return; + } + }); + } + + /** 审核通过驾驶员信息 */ + approveDriver() { + + this.nzModalService.confirm({ + nzTitle: '审核通过', + nzContent: `

    驾驶证号:${this.driverDetail?.licenseNo}

    从业资格证号:${this.licenseDetail?.licenseNo}

    是否确认通过审核`, + nzOnOk: () => { + this.adjuctDriverLicense( + { + approvalStatus: 20, + appUserId: this.userDetail?.appUserId + }, + '审核成功' + ); + } + }); + } + + /** 驳回驾驶员信息 */ + rejectedDriver() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.rejectedDriverModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.adjuctDriverLicense( + { + approvalStatus: 30, + appUserId: this.userDetail?.appUserId, + approvalOpinion: this.approvalOpinion + }, + '审核驳回成功' + ); + return; + } + }); + } + + /** 个人信息审核 */ + private adjuctUser(params: any, msg: string) { + this.service.request(this.service.$api_approve_identity, { ...params }).subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + } + this.initData(); + }); + } + + /** 驾驶员审核 */ + private adjuctDriverLicense(params: any, msg: string) { + this.service.request(this.service.$api_approve_driver_license, { ...params }).subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + } + this.initData(); + }); + } + + /** + * 开启修改 + * @param type 修改类型 + */ + ratify(type: number) { + if (type) { + this.isEditDriver = true; + } else { + this.isEditUser = true; + } + } + + /** + * 需求修改 + * @param type 修改类型 + */ + reset(type: number) { + if (type) { + this.driverDetail = { ...this.tempalateDriverData }; + this.licenseDetail = { ...this.tempalateLicenseDetail }; + this.isEditDriver = false; + } else { + this.userIdentityDetail = { ...this.tempalateUserIdentityDetail }; + this.isEditUser = false; + } + } + /* + * 根据地区code查询地区详情 + * code:请求参数 + * type:参数 name:获取省市区名称,fullcode:获取省市区code + * num:参数 1:第一个地区选择,2:第二个地区选择 + */ + initDetailByCode() { + // 根据地区code查询地区详情 + this.service.request(this.service.$api_get_region_by_code, { regionCode: '' }).subscribe((res: any) => { + this.adressCodeList = res; + }); + } + + /** + * 修改驾驶证,从业资格证信息 + */ + saveDriver() { + const driverDetail = this.driverDetail; + const licenseDetail = this.licenseDetail; + // console.log(this.driverDetail); + if (driverDetail.validStartTime && driverDetail.validEndTime) { + let validStartTime = driverDetail.validStartTime; + let validEndTime = driverDetail.validEndTime; + if (typeof driverDetail.validStartTime === 'string') { + validStartTime = new Date(driverDetail.validStartTime); + } + if (typeof driverDetail.validEndTime === 'string') { + validEndTime = new Date(driverDetail.validEndTime); + } + if (validStartTime?.getTime() >= validEndTime?.getTime()) { + this.service.msgSrv.warning('结束时间必须大于开始时间'); + return; + } + } + if ( + !driverDetail.licenseNo || + !driverDetail.driverModel || + !driverDetail.validStartTime || + !driverDetail.signingOrganization || + !driverDetail.certificatePhotoWatermark + ) { + this.service.msgSrv.warning('请完善驾驶证信息'); + return; + } + + if (!licenseDetail.licenseNo || !licenseDetail.validStartTime || !licenseDetail.certificatePhotoWatermark) { + this.service.msgSrv.warning('请完善从业资格证信息'); + return; + } + + const params: any = { + userId: this.route.snapshot.params.id, + mobile: this.userDetail?.phone, + appUserId: driverDetail.appUserId || this.route.snapshot.params.id, + userDriverLicenseDTO: { + appUserId: driverDetail?.appUserId || this.route.snapshot.params.id, + certificatePhoto: driverDetail.certificatePhoto, + certificatePhotoWatermark: driverDetail.certificatePhotoWatermark, + driverModel: driverDetail.driverModel.join(','), + id: driverDetail.id, + licenseNo: driverDetail.licenseNo, + signingOrganization: driverDetail.signingOrganization, + validEndTime: + driverDetail.validEndTime?.length === 10 + ? driverDetail.validEndTime + : this.datePipe.transform(driverDetail.validEndTime, 'yyyy-MM-dd'), + validStartTime: + driverDetail.validStartTime?.length === 10 + ? driverDetail.validStartTime + : this.datePipe.transform(driverDetail.validStartTime, 'yyyy-MM-dd') + }, + userPracticeSeniorityDTO: { + appUserId: licenseDetail.appUserId || this.route.snapshot.params.id, + approvalStatus: licenseDetail.approvalStatus, + certificatePhoto: licenseDetail.certificatePhoto, + certificatePhotoWatermark: licenseDetail.certificatePhotoWatermark, + id: licenseDetail.id, + licenseNo: licenseDetail.licenseNo, + regionCode: licenseDetail.regionCode, + validEndTime: + licenseDetail.validEndTime?.length === 10 + ? licenseDetail.validEndTime + : this.datePipe.transform(licenseDetail.validEndTime, 'yyyy-MM-dd'), + validStartTime: + licenseDetail.validStartTime?.length === 10 + ? licenseDetail.validStartTime + : this.datePipe.transform(licenseDetail.validStartTime, 'yyyy-MM-dd') + } + }; + // if (licenseDetail.approvalStatus && licenseDetail.licenseNo && licenseDetail.regionCode) { + // params.userPracticeSeniorityDTO = { + // appUserId: licenseDetail.appUserId || this.route.snapshot.params.id, + // approvalStatus: licenseDetail.approvalStatus, + // certificatePhoto: licenseDetail.certificatePhoto, + // certificatePhotoWatermark: licenseDetail.certificatePhotoWatermark, + // id: licenseDetail.id, + // licenseNo: licenseDetail.licenseNo, + // regionCode: licenseDetail.regionCode, + // validEndTime: + // licenseDetail.validEndTime?.length === 10 + // ? licenseDetail.validEndTime + // : this.datePipe.transform(licenseDetail.validEndTime, 'yyyy-MM-dd'), + // validStartTime: + // licenseDetail.validStartTime?.length === 10 + // ? licenseDetail.validStartTime + // : this.datePipe.transform(licenseDetail.validStartTime, 'yyyy-MM-dd') + // }; + // } + console.log(params); + this.service.request(this.service.$api_update_driver_license, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.isEditDriver = false; + this.initData(); + } + }); + } + + saveUser() { + const userIdentity = this?.userIdentityDetail; + const params = { + certificateNumber: userIdentity?.certificateNumber, + certificatePhotoBack: userIdentity?.certificatePhotoBack, + certificatePhotoBackWatermark: userIdentity?.certificatePhotoBackWatermark, + certificatePhotoFront: userIdentity?.certificatePhotoFront, + certificatePhotoFrontWatermark: userIdentity?.certificatePhotoFrontWatermark, + certificateType: userIdentity?.certificateType, + handCertificate: userIdentity?.handCertificate, + id: userIdentity?.id, + name: userIdentity?.name, + souceType: userIdentity?.souceType, + sourceAppId: userIdentity?.sourceAppId, + tenantId: userIdentity?.tenantId, + userId: userIdentity?.userId, + validEndTime: + userIdentity?.validEndTime?.length === 10 + ? userIdentity?.validEndTime + : this.datePipe.transform(userIdentity?.validEndTime, 'yyyy-MM-dd'), + validStartTime: + userIdentity?.validStartTime?.length === 10 + ? userIdentity?.validStartTime + : this.datePipe.transform(userIdentity?.validStartTime, 'yyyy-MM-dd') + }; + this.service.request(this.service.$api_update_driver_identity, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.isEditUser = false; + this.initData(); + } + }); + } + + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string, id: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + if (id === 'certificateBackFront' || id === 'certificateBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'certificateBackFront' ? 'front' : 'back', 0); + } + } + } + + showImg(url: any) { + this.nzImageService.preview([{ src: url }]); + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + + goBack() { + window.history.go(-1); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.userIdentityDetail.name = res.name; + } + if (res.number) { + this.userIdentityDetail.certificateNumber = res.number; + } + } + } + } + }); + } +} diff --git a/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.html b/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.html new file mode 100644 index 00000000..b98f1832 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.html @@ -0,0 +1,51 @@ + + + + + + +

    +
    + +
    +
    + + + + +
    +
    + + + + + +
    {{item?.monthFreightAmount | currency}}
    +
    + +
    {{item?.dayWithdrawalAmount | currency}}
    +
    + +
    {{item?.monthWithdrawalAmount | currency}}
    +
    + +
    {{item?.monthReceivableAmount | currency}}
    +
    + +
    {{item?.isCaptain == 1 ? '车队长' : '司机'}}
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.less b/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.ts b/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.ts new file mode 100644 index 00000000..66161971 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver-config/driver-config.component.ts @@ -0,0 +1,128 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { DynamicSettingModalComponent } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +@Component({ + selector: 'app-usercenter-components-driver-config', + templateUrl: './driver-config.component.html', + styleUrls: ['./driver-config.component.less'] +}) +export class UserCenterComponentsDriverConfigComponent implements OnInit { + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: UsermanageService, private modal: NzModalService) {} + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + auditStatus: 20, + ...(this.sf && this.sf.value) + }; + delete params.effectiveDate; + delete params.expand; + return params; + } + + ngOnInit() {} + + settingAction(item?: any) { + const modal = this.modal.create({ + nzTitle: '配置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '3', + businessId: item.appUserId, + configvalue: 'sys.config' + }, + nzFooter: null + }); + + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(1); + } + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } + + exportList() { + const params = this.reqParams; + this.service.downloadFile(this.service.$api_driver_exportConfig, { ...params, pageSize: -1 }); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + name: { title: '司机姓名', type: 'string', ui: { placeholder: '请输入', showRequired: false } }, + mobile: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入' + } + }, + isCaptain: { + type: 'string', + title: '类型', + enum: [ + { label: '全部', value: '' }, + { label: '车队长', value: 1 }, + { label: '司机', value: 0 } + ], + default: '', + ui: { + widget: 'select' + } + } + } + }; + } + + private initST(): STColumn[] { + return [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '司机姓名', className: 'text-center', width: '170px', index: 'name' }, + { title: '手机号', className: 'text-center', width: '170px', index: 'mobile' }, + { title: '类型', className: 'text-center', width: '170px',render: 'isCaptain' }, + { title: '月承运金额上限(元)', className: 'text-center', width: '200px', render: 'monthFreightAmount' }, + { title: '日提现金额上限(元)', className: 'text-center', width: '200px', render: 'dayWithdrawalAmount' }, + { title: '月提现金额上限(元)', className: 'text-center', width: '200px', render: 'monthWithdrawalAmount' }, + { title: '月收款金额上限(元)', className: 'text-center', width: '200px', render: 'monthReceivableAmount' }, + { + title: '操作', + width: '170px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '配置', + click: item => this.settingAction(item), + acl: { ability: ['USERCENTER-DRIVER-CONFIG-config'] } + } + ] + } + ]; + } +} diff --git a/src/app/routes/usercenter/components/driver/driver.component.html b/src/app/routes/usercenter/components/driver/driver.component.html new file mode 100644 index 00000000..32666512 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.html @@ -0,0 +1,66 @@ + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + {{ item.promotersTelephone || '添加' }} + + + {{ item?.carNo }} + + + + + +
    +
    + + + +
    +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/driver.component.less b/src/app/routes/usercenter/components/driver/driver.component.less new file mode 100644 index 00000000..757a5529 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.less @@ -0,0 +1,28 @@ +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + max-width : 400px; + position : absolute; + right : 0; + bottom : 30px; + } + +} + +:host::ng-deep { + + nz-range-picker { + width: 100%; + } + + .content-box { + .ant-card-body { + padding-top: 6px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/driver.component.ts b/src/app/routes/usercenter/components/driver/driver.component.ts new file mode 100644 index 00000000..b4956e3c --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.ts @@ -0,0 +1,355 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { DynamicSettingModalComponent } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { UsermanageService } from '../../services/usercenter.service'; +import { CarSettleAddDriverComponent } from './add-driver/add-driver.component'; +@Component({ + selector: 'app-usercenter-components-driver', + styleUrls: ['./driver.component.less'], + templateUrl: './driver.component.html' +}) +export class UserCenterComponentsDriverComponent implements OnInit { + _$expand = false; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + ui: SFUISchema = { '*': { spanLabelFixed: 130, grid: { lg: 8, md: 12, sm: 12, xs: 24 }, enter: () => this.st.load() } }; + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + + @ViewChild('promoterModal', { static: false }) + promoterModal!: any; + promotersTelephone = ''; + + resourceStatus: any = 10; + constructor( + public service: UsermanageService, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + private modalHelper: ModalHelper + ) {} + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value), + auditStatus: this.resourceStatus + }; + if (this.sf?.value.effectiveDate) { + Object.assign(params, { + createTime: { + start: this.sf?.value.effectiveDate[0], + end: this.sf?.value.effectiveDate[1] + } + }); + // params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + // params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + ngOnInit() { + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + + selectChange(e: any) { + this.resourceStatus = e; + setTimeout(() => { + this.st.load(); + }, 200); + } + + addPromoter(item?: any) { + this.promotersTelephone = item?.promotersTelephone; + const modal = this.modal.create({ + nzTitle: '推广业务员', + nzContent: this.promoterModal, + nzOnOk: () => { + if (!!!this.promotersTelephone) { + this.service.msgSrv.error('请填写手机号!'); + return false; + } + if (typeof this.promotersTelephone === 'string' && !/(^1\d{10}$)/.test(this.promotersTelephone)) { + this.service.msgSrv.error('手机格式错误'); + return false; + } + this.service + .request(this.service.$api_add_user_salesman, { userId: item.userId, mobile: this.promotersTelephone }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(item?.promotersTelephone ? '添加推广员成功' : '修改推广员成功'); + } + this.st.load(); + }); + return; + } + }); + } + + settingAction(item?: any) { + this.modal.create({ + nzTitle: '基础设置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '3', + businessId: item.appUserId + }, + nzFooter: null + }); + } + + showAccountDetail(item: any) { + console.log(item); + + this.modal.create({ + nzTitle: '资金账户', + nzContent: AccountDetailComponent, + nzNoAnimation: true, + nzWidth: 600, + nzComponentParams: { + isCanCreate: true, + url: '/api/fcc/accountBalance/getDriverAccountDetailByOperator', + params: { accountType: 2, roleId: item.appUserId, ctfId: item.identityNo, clientName: item.name } + }, + nzFooter: null + }); + } + + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + exportList() { + const params = this.reqParams; + this.service.downloadFile(this.service.$api_export_driver, { ...params, pageSize: -1 }); + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + name: { title: '司机姓名', type: 'string', ui: { placeholder: '请输入', showRequired: false } }, + mobile: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入' + } + }, + identityStatus: { + type: 'string', + title: '实名状态', + enum: [ + { label: '全部', value: '' }, + { label: '待审核', value: 0 }, + { label: '通过', value: 1 }, + { label: '驳回', value: 2 } + ], + default: '', + ui: { + widget: 'select' + } + }, + driverLicenseStatus: { + type: 'string', + title: '驾驶证状态', + enum: [ + { label: '全部', value: '' }, + { label: '待审核', value: 10 }, + { label: '审核通过', value: 20 }, + { label: '驳回', value: 30 }, + { label: '证件过期', value: 40 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + practiceSenioritLicenseStatus: { + type: 'string', + title: '从业资格证状态', + enum: [ + { label: '全部', value: '' }, + { label: '未提交 ', value: -1 }, + { label: '已提交', value: 1 }, + { label: '已通过', value: 2 }, + { label: '已过期', value: 3 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + promotersTelephone: { + title: '推广业务员', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + source: { + type: 'string', + title: '注册渠道', + enum: [ + { label: '全部', value: '' }, + { label: '用户注册', value: 1 }, + { label: '货主添加', value: 2 }, + { label: '运营添加', value: 3 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + effectiveDate: { + title: '申请时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + add() { + this.modalHelper.create(CarSettleAddDriverComponent, { size: 900 }).subscribe(res => { + this.st.load(); + }); + } + private initST(): STColumn[] { + return [ + { title: '司机姓名', className: 'text-center', index: 'name', width: 150 }, + { title: '手机号', className: 'text-center', index: 'mobile', width: 150 }, + { title: '身份证号码', className: 'text-center', index: 'identityNo', width: 200 }, + { title: '当前车辆', className: 'text-center', render: 'carNo', width: 200 }, + { title: '驾驶证审核人', className: 'text-center', index: 'approvalUserName', width: 200 }, + { title: '审核时间', className: 'text-center', index: 'approvalTime', width: 200 }, + { + title: '实名认证状态', + className: 'text-center', + index: 'identityStatus', + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 0: { text: '待审核', color: 'default' }, + 1: { text: '通过', color: 'success' }, + 2: { text: '驳回', color: 'warning' } + }, + width: 180 + }, + { + title: '驾驶证状态', + className: 'text-center', + index: 'driverLicenseStatus', + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 10: { text: '待审核', color: 'default' }, + 20: { text: '审核通过', color: 'success' }, + 30: { text: '驳回', color: 'warning' }, + 40: { text: '证件过期', color: 'error' } + }, + width: 180 + }, + { + title: '从业资格证状态', + className: 'text-center', + index: 'practiceSenioritLicenseStatus', + type: 'badge', + badge: { + '-1': { text: '未提交', color: 'default' }, + 1: { text: '已提交', color: 'processing' }, + 2: { text: '已通过', color: 'success' }, + 3: { text: '已过期', color: 'error' }, + // 10: { text: '待审核', color: 'default' }, + // 20: { text: '审核通过', color: 'success' }, + // 30: { text: '驳回', color: 'warning' }, + // 40: { text: '证件过期', color: 'error' } + }, + width: 180 + }, + { title: '推广业务员', className: 'text-center', render: 'promotersTelephone', width: 180 }, + { + title: '注册渠道', + className: 'text-center', + index: 'source', + type: 'enum', + enum: { 1: '用户注册', 2: '货主添加', 3: '运营添加' }, + width: 150 + }, + { title: '注册时间', className: 'text-center', index: 'createTime', width: 200 }, + { + title: '操作', + width: '110px', + className: 'text-center', + fixed: 'right', + buttons: [ + { + text: '查看
    ', + click: item => { + this.router.navigate(['./detail', item.appUserId], { relativeTo: this.ar }); + }, + acl: { ability: ['USERCENTER-DRIVER-LIST-view'] } + }, + // { + // text: '基础设置', + // click: item => this.settingAction(item), + // acl: { ability: ['USERCENTER-DRIVER-LIST-basicSetting'] }, + // }, + { + text: '资金账户', + click: item => this.showAccountDetail(item), + acl: { ability: ['USERCENTER-DRIVER-LIST-account'] } + } + ] + } + ]; + } + viewCar(item: any) { + this.router.navigate(['/vehicle/list/detail/' + item.carId]); + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.html new file mode 100644 index 00000000..7fbdaa18 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.html @@ -0,0 +1,16 @@ + + + + + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.ts new file mode 100644 index 00000000..39364f6f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/audit-admin/audit-admin.component.ts @@ -0,0 +1,121 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; + +@Component({ + selector: 'app-audit-admin', + templateUrl: './audit-admin.component.html', + styleUrls: ['./audit-admin.component.less'] +}) +export class AuditAdminComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 20 } + } + }; + isReadOnly = false; + constructor(public msgSrv: NzMessageService, private nzModalService: NzModalService, public service: UsermanageService) {} + + ngOnInit(): void { + this.loadUserInfo(); + } + + loadUserInfo() { + this.service.request(this.service.$api_get_enterprise_user_by_id, { id: this.i.id }).subscribe(res => { + if (res) { + this.initSF(res); + } + }); + } + + show(src: string) { + if (!src) { + return; + } + const params = { + imgList: [src], + index: 0 + }; + this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + initSF(user?: any) { + // console.log(user); + + this.schema = { + properties: { + expand: { type: 'boolean', ui: { hidden: true } }, + oldAdminName: { + title: '当前管理员', + type: 'string', + ui: { widget: 'text' }, + default: user.oldAdminName + }, + oldAdminMobile: { + title: '手机号', + type: 'string', + ui: { widget: 'text' }, + default: user.oldAdminMobile + }, + oldAdminIdNo: { + title: '身份证号', + type: 'string', + ui: { widget: 'text' }, + default: user.oldAdminIdNo + }, + newAdminName: { + title: '转授对象', + type: 'string', + ui: { widget: 'text' }, + default: user.newAdminName + }, + newAdminMobile: { + title: '手机号', + type: 'string', + ui: { widget: 'text' }, + default: user.newAdminMobile + }, + newAdminIdNo: { + title: '身份证号', + type: 'string', + ui: { widget: 'text' }, + default: user.newAdminIdNo + }, + newPhotoFrontWatermark: { + title: '身份证照', + type: 'string', + ui: { widget: 'custom' }, + default: user + }, + creditPhoto: { + title: '企业授权函', + type: 'string', + ui: { widget: 'custom' }, + default: user.creditPhoto + }, + approvalOpinion: { + title: this.isReadOnly ? '驳回原因' : '备注', + type: 'string', + maxLength: 100, + ui: { + placeholder: '审核不通过需要说明原因', + widget: this.i?.approvalStatus === 30 && this.isReadOnly ? 'text' : 'textarea', + autosize: { minRows: 3, maxRows: 6 }, + visibleIf: { + expand: (value: boolean) => !this.isReadOnly || this.i?.approvalStatus === 30 + } + }, + default: user.approvalOpinion + } + } + }; + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html new file mode 100644 index 00000000..707f5bc4 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + +
    + +
    + +

    +
    +
    +
    +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less new file mode 100644 index 00000000..52b6737d --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less @@ -0,0 +1,32 @@ +:host { + ::ng-deep { + .tabs-wrap>.ant-tabs-nav { + margin-bottom: 0; + } + + .myForm .ant-upload.ant-upload-select-picture-card>.ant-upload { + flex-direction: column !important; + } + + span { + word-break: break-all + } + + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + max-width : 400px; + position : absolute; + right : 0; + bottom : 30px; + } + +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts new file mode 100644 index 00000000..5b2aaca8 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts @@ -0,0 +1,546 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +import { AuditAdminComponent } from './audit-admin/audit-admin.component'; + +@Component({ + selector: 'app-Freight-components-enterprise-audit', + templateUrl: './enterprise-audit.component.html', + styleUrls: ['./enterprise-audit.component.less'] +}) +export class FreightComponentsEnterpriseAuditComponent implements OnInit { + _$expand = false; + ui: SFUISchema = { '*': { spanLabelFixed: 90, grid: { lg: 8, md: 12, sm: 12, xs: 24 } } }; + schema: SFSchema = this.initSF(); + enterColumns: STColumn[] = this.initEnterST(); + adminColumns: STColumn[] = this.initAdminST(); + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType = 1; + tabs = [ + { + name: '企业审核', + type: 1, + isActived: false + }, + { + name: '企业管理员审核', + type: 2, + isActived: false + } + ]; + + @ViewChild('approvedModal', { static: false }) + approvedModal!: any; + @ViewChild('redectModal', { static: false }) + redectModal!: any; + ltdId: any = []; + roles: any = []; + customerServices: any = []; + detailData: any = null; + approvalOpinion = ''; + networkTransporter = null; + roleId = null; + customerServiceId = null; + constructor(public service: UsermanageService, private router: Router, private modal: NzModalService) {} + + beforeReq = (requestOptions: STRequestOptions) => { + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime?.[0] || '', + end: this.sf.value.createTime?.[1] || '' + } + }); + } + } + Object.assign(requestOptions.body, { flag: this.tabType, listSource: 2 }); + return requestOptions; + }; + + /** + * 伸缩查询条件 + */ + expandToggle(status: boolean) { + this._$expand = status; + this.sf?.setValue('/expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.loadltdId(); + this.loadRoles(); + this.loadCustomerServices(); + } + + loadltdId() { + this.service.getNetworkFreightForwarder().subscribe(res => { + if (res) { + this.ltdId = res; + } + }); + } + loadRoles() { + this.service.getRoles({ enterpriseId: 0, projectId: 0 }).subscribe(res => { + if (res) { + this.roles = res; + } + }); + } + + loadCustomerServices() { + this.service.getStaffList({}, false).subscribe(res => { + if (res) { + this.customerServices = res; + } + }); + } + + /** + * 查看详情 + */ + ViewAdimin(record: any, isReadOnly = false) { + const modal = this.modal.create({ + nzTitle: isReadOnly ? '查看' : '审核', + nzContent: AuditAdminComponent, + nzWidth: 650, + nzComponentParams: { i: { ...record }, isReadOnly }, + nzFooter: isReadOnly + ? [] + : [ + { + label: '驳回', + type: 'primary', + onClick: instance => { + if (!instance?.sf.value.approvalOpinion) { + this.service.msgSrv.warning('请填写备注'); + return false; + } + this.adminAuditUser( + { + id: record.id, + approvalStatus: '30', + approvalOpinion: instance?.sf.value.approvalOpinion + }, + modal + ); + return; + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + this.adminAuditUser( + { + id: record.id, + approvalStatus: '20' + }, + modal + ); + } + } + ] + }); + modal.afterClose.subscribe(res => { + // this.st.load(1); + }); + } + + auditPass(item: any) { + this.detailData = item; + this.networkTransporter = null; + this.roleId = null; + this.modal.create({ + nzTitle: '审核通过', + nzContent: this.approvedModal, + nzOnOk: () => { + if (!this.networkTransporter || !this.roleId || !this.customerServiceId) { + return false; + } + this.auditEnterprise(20); + return; + } + }); + } + auditNo(item: any) { + this.detailData = item; + this.approvalOpinion = ''; + this.roleId = null; + this.modal.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.auditEnterprise(30); + return; + } + }); + } + + private auditEnterprise(status: number) { + this.service + .request(this.service.$api_audit_freight, { + approvalStatus: status, + id: this.detailData.id, + approvalOpinion: this.approvalOpinion, + networkTransporter: this.networkTransporter, + customerServiceId: this.customerServiceId, + roleId: this.roleId || null + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(status === 20 ? '审核通过' : '驳回成功'); + } + this.st.load(1); + }); + } + + View(record: any) { + this.router.navigate([`/usercenter/freight/enterprise/detail/${record.id}`]); + } + + // 切换Tab + changeTab(item: any) { + this.tabType = item.type; + this.expandToggle(false); + this.sf?.reset(); + this.st.data = this.tabType === 1 ? this.service.$api_get_freight_list : this.service.$api_get_enterprise_admin_list; + setTimeout(() => { + this.st.load(1); + }, 100); + } + + private adminAuditUser(params: any, modal: any) { + this.service.request(this.service.$api_audit_enterprise_admin, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('审核成功'); + modal.destroy(); + this.st.load(1); + } + }); + } + + exportList() { + const params = { ...this.sf.value, flag: this.tabType, listSource: 2, pageSize: -1 }; + this.service.downloadFile(this.service.$api_export_enterprise, params); + } + + /** + * 初始化数据列表 + */ + initEnterST(): STColumn[] { + return [ + { title: '企业名称', className: 'text-center', index: 'enterpriseName', width: 350 }, + { title: '统一社会信用代码', className: 'text-center', index: 'unifiedSocialCreditCode', width: 200 }, + { + title: '公司所在地', + className: 'text-center', + index: 'province', + width: 200, + format: item => `${item.provinceName}${item.cityName}${item.areaName}` + }, + { + title: '企业类型', + className: 'text-center', + index: 'enterpriseType', + width: 200, + type: 'enum', + enum: { 1: '物流企业', 2: '货运代理', 3: '生产型企业', 4: '贸易类企业', 5: '科技型企业', 6: '化学化工企业', 7: '其他' } + }, + { title: '管理员', className: 'text-center', index: 'contacter', width: 150, format: item => `${item.contacter}
    /${item.mobile}` }, + { + title: '常用服务', + className: 'text-center', + index: 'oftenUsedServices', + type: 'enum', + enum: { 10: '整车发货', 20: '大宗发货' }, + width: 140 + }, + { title: '业务员', className: 'text-center', index: 'promotersTelephone', width: 150 }, + { + title: '注册渠道', + className: 'text-center', + index: 'source', + type: 'enum', + enum: { 1: '货主注册', 2: '平台添加', 3: '运营添加' }, + width: 130 + }, + { title: '申请时间', className: 'text-center', index: 'createTime', width: 180, type: 'date' }, + { title: '审核时间', className: 'text-center', index: 'approvalTime', width: 180, type: 'date' }, + { title: '审核人', className: 'text-center', index: 'approvalUserName', width: 130 }, + { + title: '审核状态', + className: 'text-center', + render: 'approvalStatus', + width: 160 + }, + { + title: '常用服务', + className: 'text-center', + index: 'oftenUsedServices', + type: 'enum', + enum: { 10: '整车发货', 20: '大宗发货' }, + width: 140 + }, + { title: '推广业务员', className: 'text-center', index: 'promotersTelephone', width: 150 }, + { + title: '操作', + fixed: 'right', + width: '180px', + className: 'text-center', + buttons: [ + { text: '查看', click: _record => this.View(_record), acl: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-view'] } }, + { + text: '通过', + click: _record => this.auditPass(_record), + acl: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-D-audit'] }, + iif: item => item.approvalStatus === 10 + }, + { + text: '驳回', + click: _record => this.auditNo(_record), + acl: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-D-audit'] }, + iif: item => item.approvalStatus === 10 + } + ] + } + ]; + } + + initAdminST(): STColumn[] { + return [ + { title: '企业名称', className: 'text-center', index: 'enterpriseName' }, + { title: '当前管理员', className: 'text-center', index: 'oldAdminName', width: 140 }, + { title: '当前管理员手机号', className: 'text-center', index: 'oldAdminMobile', width: 170 }, + { title: '转授对象', className: 'text-center', index: 'newAdminName', width: 140 }, + { title: '转授对象手机号', className: 'text-center', index: 'newAdminMobile', width: 150 }, + { title: '申请时间', className: 'text-center', index: 'createTime', width: 170 }, + { + title: '状态', + className: 'text-center', + index: 'approvalStatus', + type: 'badge', + badge: { + 10: { text: '待审核', color: 'processing' }, + 20: { text: '已成功', color: 'success' }, + 30: { text: '已驳回', color: 'warning' } + }, + width: 130 + }, + { + title: '操作', + fixed: 'right', + width: '180px', + className: 'text-center', + buttons: [ + { + text: '审核', + click: _record => this.ViewAdimin(_record), + acl: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-adminAudit'] }, + iif: (item: any) => item.approvalStatus === 10 + }, + { + text: '查看', + click: _record => this.ViewAdimin(_record, true) + } + ] + } + ]; + } + + /** + * 初始化查询表单 + */ + initSF(): SFSchema { + return { + properties: { + expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + title: '企业名称', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + contactName: { + title: '管理员', + type: 'string', + ui: { + placeholder: '请输入' + } + }, + enterpriseType: { + type: 'string', + title: '企业类型', + enum: [ + { label: '全部', value: '' }, + { label: '物流企业', value: 1 }, + { label: '货运代理', value: 2 }, + { label: '生产型企业', value: 3 }, + { label: '贸易类企业', value: 4 }, + { label: '科技型企业', value: 5 }, + { label: '化学化工企业', value: 6 }, + { label: '其他', value: 7 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => this.tabType === 1 + } + } + }, + enterpriseAddressCode: { + type: 'string', + title: '公司所在地', + enum: [{ label: '全部', value: '' }], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } + }, + oftenUsedServices: { + type: 'string', + title: '常用服务', + enum: [ + { label: '全部', value: '' }, + { label: '整车发货', value: 10 }, + { label: '大宗发货', value: 20 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } + }, + // approval11St11atus: { + // type: 'string', + // title: '客户类型', + // enum: [{ label: '全部', value: '' }], + // default: '', + // ui: { + // widget: 'select', + // visibleIf: { + // expand: (value: boolean) => this.tabType === 1 && value + // } + // } + // }, + promotersTelephone: { + title: '业务员', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } + }, + mobile: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => this.tabType === 2 + } + } + }, + approvalUserName: { + title: '审核人', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } + }, + createTime: { + title: '申请时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + approvalTime: { + title: '审核时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } as SFDateWidgetSchema + }, + approvalStatus: { + type: 'string', + title: '审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '待审核', value: 10 }, + { label: '已撤销', value: 15 }, + { label: '已成功', value: 20 }, + { label: '审核失败', value: 30 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + source: { + type: 'string', + title: '注册渠道', + enum: [ + { label: '全部', value: '' }, + { label: '货主注册', value: 1 }, + { label: '平台添加', value: 2 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => this.tabType === 1 && value + } + } + } + } + }; + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html new file mode 100644 index 00000000..90e39e1c --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html @@ -0,0 +1,269 @@ + + + + + + + + + + + + + 企业管理员信息 + + + + + + + + + + +
    + + + + +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + {{detailData?.registrationCapital}} + + 万元 + + + + + + + + + +
    + {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} +
    +
    长期
    +
    {{ detailData?.operatingStartTime + }} 至 长期
    +
    +
    + + + + + + + {{ detailData?.fullRegionVO?.provinceName }}{{ detailData?.fullRegionVO?.cityName }}{{ + detailData?.fullRegionVO?.areaName }} + + + + + +
    + + + + + + + + + + + + + + + 企业法人信息 + + + + + + + + {{ detailData?.legalPersonIdentityVO?.validStartTime }} - + {{ detailData?.legalPersonIdentityVO?.validEndTime || '长期' }} + + +
    + + + + +
    +
    +
    + + + 企业开票信息 + + + + + + + + + + + + + +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + + + +
    +
    +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + +
    +
    +
    + + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less new file mode 100644 index 00000000..33632d37 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less @@ -0,0 +1,132 @@ +:host { + ::ng-deep { + sv-title { + font-weight: 700; + } + + .user-info { + display : flex; + font-size: 16px; + + .enterprise-name { + margin-right: 15px; + } + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + .user-info-des { + margin-bottom: 5px; + } + } + + .sv__label, + .sv__detail { + line-height: 30px; + } + + .edit-box { + input { + max-width: 250px; + } + + nz-date-picker { + min-width: 250px; + } + } + + .readOnly-box { + input { + padding-left: 0; + color : #000; + border : 0; + } + + nz-select-top-control { + padding-left: 0px !important; + } + } + + .ant-select { + min-width: 250px; + + nz-select-top-control { + cursor: text !important; + color : #000 !important; + } + } + + // 图片展示工具样式改造 + .ant-upload.ant-upload-disabled { + cursor: pointer; + } + + .ant-upload.ant-upload-select-picture-card { + width : 200px; + height: 160px; + } + + .ant-upload-picture-card-wrapper { + width: auto; + } + } +} + +.image-hover { + .delete-icon { + border-radius : 50%; + color : #F55656; + font-size : 28px; + position : absolute; + top : -15px; + right : -15px; + background-color: #ffffff; + cursor : pointer; + } + + .show-icon { + color : #ffffff; + font-size: 30px; + cursor : pointer; + } +} + +.image-hover:hover .mask { + opacity: 0.8; +} + +.mask { + width : 200px; + height : 160px; + background-color : #4F4F4F; + opacity : 0; + position : absolute; + // top : 6px; + // left : 12px; + border-radius : 6px; + margin-top : -160px; +} + +.mask-over { + width : 200px; + height : 160px; + position : absolute; + // top : 6px; + // left : 12px; + border-radius : 6px; + display : flex; + justify-content : center; + align-items : center; + margin-top : -160px; + + label { + font-size : 20px; + line-height : 24px; + letter-spacing: 0.7px; + color : #FFFFFF; + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts new file mode 100644 index 00000000..891b1f83 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts @@ -0,0 +1,243 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { + SFComponent, + SFSchema, + SFDateWidgetSchema, + SFUISchema, + SFUploadWidgetSchema, + SFSelectWidgetSchema, + SFTextWidgetSchema, + SFTagWidgetSchema +} from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { apiConf } from '@conf/api.conf'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { NzCascaderOption } from 'ng-zorro-antd/cascader'; +import { NzImageService } from 'ng-zorro-antd/image'; +@Component({ + selector: 'app-Freight-components-EnterpriseAudit-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'] +}) +export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { + @ViewChild('approvedModal', { static: false }) + approvedModal!: any; + @ViewChild('redectModal', { static: false }) + redectModal!: any; + + approvalOpinion = ''; + networkTransporter = null; + + detailData: any = this.initDefalutData(); + tempalateData = { ...this.detailData }; + + statusE: any = { + 10: '待审核', + 20: '审核通过', + 30: '审核失败' + }; + + isEdit = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + + values: string[] | null = null; + ltdId: any[] = []; + constructor( + private nzModalService: NzModalService, + public service: UsermanageService, + private route: ActivatedRoute, + private nzImageService: NzImageService + ) {} + + ngOnInit() { + this.initData(); + // this.launchSign(); + } + + loadltdId() { + this.service.getNetworkFreightForwarder().subscribe(res => { + if (res) { + this.ltdId = res; + } + }); + } + + initData() { + this.service + .request(this.service.$api_get_freight_detail, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.detailData = res; + this.tempalateData = { ...this.detailData }; + } + }); + } + + auditPass() { + this.networkTransporter = null; + this.nzModalService.create({ + nzTitle: '审核通过', + nzContent: this.approvedModal, + nzOnOk: () => { + if (!this.networkTransporter) { + return false; + } + this.auditEnterprise(20); + return; + } + }); + } + auditNo() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.auditEnterprise(30); + return; + } + }); + } + + private auditEnterprise(status: number) { + this.service + .request(this.service.$api_audit_freight, { + approvalStatus: status, + id: this.detailData.id, + approvalOpinion: this.approvalOpinion, + networkTransporter: this.networkTransporter + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(status === 20 ? '审核通过' : '驳回成功'); + } + this.initData(); + }); + } + + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + deleteImg(key: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + this.detailData[key] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + + changeUpload({ file, fileList, type }: any, key: string) { + if (type === 'success') { + this.detailData[key] = file.response.data.fullFileWatermarkPath; + } + } + + changeTime(event: any) { + console.log(event); + } + + changeCascader(event: any) { + console.log(event); + } + + /* + * 根据地区code查询地区详情 + * code:请求参数 + * type:参数 name:获取省市区名称,fullcode:获取省市区code + * num:参数 1:第一个地区选择,2:第二个地区选择 + */ + getRegionDetailByCode(regionCode: any) { + // 根据地区code查询地区详情 + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + + loadData = (node: any, index: number) => { + return new Promise(resolve => { + this.getRegionDetailByCode(node?.regionCode || '').subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1, value: item.regionCode, label: item.name })); + }, + _ => {}, + () => { + resolve(node); + } + ); + }); + }; + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save() { + this.isEdit = false; + } + + ratify() { + this.isEdit = true; + } + + goBack() { + window.history.go(-1); + } + + private initDefalutData() { + return { + adminUserInfo: { + name: '', + mobile: '', + certificatePhotoFrontWatermark: '', + certificatePhotoBackWatermark: '' + }, + legalPersonIdentityVO: { + certificateNumber: '' + }, + enterpriseName: '', + enterpriseType: '', + unifiedSocialCreditCode: '', + registrationCapital: null, + enterpriseRegistrationTime: '', + + driverLicenseSigningOrg: '', + carDistinguishCode: '', + carLoad: '', + curbWeight: '', + roadTransportNo: '', + roadTransportLicenceNo: '', + carOwner: '', + isTrailer: null, + useNature: null, + driverLicenseRegisterTime: null, + driverLicenseGetTime: null, + driverLicenseEndTime: null, + roadTransportStartTime: null, + roadTransportEndTime: null, + carFrontPhotoWatermark: '' + }; + } +} diff --git a/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.html b/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.html new file mode 100644 index 00000000..05a199c9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.html @@ -0,0 +1,72 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + +
    + + +
    + 已选择 + {{ selectedRows.length }} 条数据 + 清空 +
    +
    + + + +
    + + +
    +
    + + + + + +
    +
    +
    + + +
    +
    + + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.ts b/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.ts new file mode 100644 index 00000000..1f605413 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/freight-config/freight-config.component.ts @@ -0,0 +1,322 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent, STRequestOptions, STData, STChange } from '@delon/abc/st'; +import { SFUISchema, SFSchema, SFComponent, SFDateWidgetSchema } from '@delon/form'; +import { ShipperBaseService, DynamicSettingModalComponent } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { UsermanageService } from '../../../services/usercenter.service'; + +@Component({ + selector: 'app-freight-config', + templateUrl: './freight-config.component.html', + styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/expend-but.less'] +}) +export class FreightConfigComponent implements OnInit { + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + selectedRows: any[] = []; + + @ViewChild('IWModal', { static: false }) + IWModal!: any; + @ViewChild('roleModal', { static: false }) + roleModal!: any; + ltdId: any = []; + roles: any = []; + networkTransporter = null; + roleId = null; + _$expand = false; + constructor(public service: UsermanageService, private modal: NzModalService, public shipperservice: ShipperBaseService) {} + + ngOnInit() { + this.initST(); + this.loadltdId(); + this.loadRoles(); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { listSource: 1 }); + if (this.sf?.value) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf?.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf?.value.createTime[0], + end: this.sf?.value.createTime[1] + } + }); + } + } + this.selectedRows = []; + return requestOptions; + }; + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + } + } + + settingAction(item?: any) { + const modal = this.modal.create({ + nzTitle: '配置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '2', + spareBusinessId: item.networkTransporter, + businessId: item.id, + formatTypeList: (item: any[]) => [ + ...item, + { + name: '权限配置', + configType: 1, + items: [ + { + itemType: 999 + } + ] + }, + { + name: '费率变更记录', + configType: 2, + items: [ + { + itemType: 999 + } + ] + } + ] + }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + if (res) { + this.st.load(1); + } + }); + } + + editRoleBatch() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择企业'); + return; + } + this.roleId = null; + const modal = this.modal.create({ + nzTitle: '修改角色', + nzContent: this.roleModal, + nzOnOk: () => { + if (!this.roleId) { + return false; + } + this.service + .request(this.service.$api_update_enter_role_batch, { + enterpriseIdList: this.selectedRows.map(i => i.id), + roleId: this.roleId + }) + .subscribe((res: Array) => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.st.load(1); + modal.destroy(); + } + }); + return false; + } + }); + } + + editIWBatch() { + if (this.selectedRows?.length <= 0) { + this.service.msgSrv.warning('请选择企业'); + return; + } + this.networkTransporter = null; + const modal = this.modal.create({ + nzTitle: '修改网络货运人', + nzContent: this.IWModal, + nzOnOk: () => { + if (!this.networkTransporter) { + return false; + } + this.service + .request(this.service.$api_update_enter_newowork_batch, { + enterpriseIdList: this.selectedRows.map(i => i.id), + networkTransporterId: this.networkTransporter + }) + .subscribe((res: Array) => { + if (res && res.length === 0) { + this.service.msgSrv.success('修改成功'); + this.st.load(1); + modal.destroy(); + } else { + this.service.msgSrv.error(`企业${res?.join(',')}修改失败`); + modal.destroy(); + this.st.load(); + } + }); + return false; + } + }); + } + + exportList() { + const params = { listSource: 1, pageSize: -1 }; + if (this.sf) { + Object.assign(params, { + ...this.sf.value + }); + } + this.service.downloadFile(this.service.$api_export_freight_config, params); + } + loadltdId() { + this.service.getNetworkFreightForwarder().subscribe(res => { + if (res) { + this.ltdId = res; + } + }); + } + loadRoles() { + this.service.getRoles({ enterpriseId: 0, projectId: 0 }).subscribe(res => { + if (res) { + this.roles = res; + } + }); + } + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + private initSF(): SFSchema { + return { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + enterpriseName: { + title: '企业名称', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + networkTransporter: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + goodsSurchargeRatio: { + title: '货源单费率', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + contractSurchargeRatio: { + title: '合同单费率', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + createTime: { + title: '注册时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd', + placeholder: '请选择', + nzShowTime: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + initST(): STColumn[] { + return [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '企业名称', className: 'text-center', index: 'enterpriseName', width: 350 }, + { title: '网络货运人', className: 'text-center', index: 'netTranName', width: 160 }, + { + title: '货源单费率', + className: 'text-right', + index: 'goodsSurchargeRatio', + width: 130, + format: item => `${item.goodsSurchargeRatio}%` + }, + { + title: '合同单费率', + className: 'text-right', + index: 'contractSurchargeRatio', + width: 130, + format: item => `${item.contractSurchargeRatio}%` + }, + { + title: '合同单业务量(万元)', + index: 'contractQuota', + width: 170, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.contractQuota }) } + }, + { + title: '货源单业务量(万元)', + index: 'goodsQuota', + width: 170, + type: 'widget', + className: 'text-right', + widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.goodsQuota }) } + }, + { + title: '注册时间', + index: 'createTime', + width: 180, + className: 'text-right' + }, + { + title: '操作', + width: '90px', + fixed: 'right', + className: 'text-center', + buttons: [ + { + text: '配置', + click: item => this.settingAction(item) + } + ] + } + ]; + } +} diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.html b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html new file mode 100644 index 00000000..056ca944 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + 四要素验证: + + + +

    +
    + + + + + + {{detailData.enterpriseName}} + + + + + + + + {{detailData.unifiedSocialCreditCode}} + + + + + + + + + + + + + + + + + + + + {{detailData?.registrationCapital}} + + 万元 + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ detailData?.fullRegionVO?.provinceName }}{{ detailData?.fullRegionVO?.cityName }}{{ + detailData?.fullRegionVO?.areaName }} + + + + + + + + {{ detailData?.fullRegionVO?.provinceName }}{{ + detailData?.fullRegionVO?.cityName }}{{ + detailData?.fullRegionVO?.areaName }}{{detailData.enterpriseAddress}} + + + + + + + + {{detailData.businessScope}} + + + + + + + + + + + + + +
    + + + 法人信息 + + + + + + + + + + + - + + + + + + + + + +
    + + + + +
    +
    +
    + + + 企业管理员信息 + + + + + + + {{detailData.adminUserInfo?.mobile}} + + + + + +
    + + + + +
    +
    +
    + + + + 企业开票信息 + + + + + + + + + + + + + + + + 服务评级 + (暂无评级) + + + + + + + + 合伙人信息 + + {{partnerInfo.partnerEnterpriseName}} + + + + + + + + + + + + + + + + + 渠道销售信息 + + + + + + + + + + +
    + + + + + + {{ item.remark + }} + -- + + + + + + + {{ item.remark + }} + -- + + + + + + +
    + +
    {{title}} +
    +
    + {{content}} +
    +
    +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + {{ detailData?.enterpriseName }} + + + + +
    +
    +
    + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.less b/src/app/routes/usercenter/components/freight/list/detail/detail.component.less new file mode 100644 index 00000000..6231c9e2 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.less @@ -0,0 +1,58 @@ +@import '../../../../less/edit.less'; + +.user-info { + font-size: 16px; + + .enterprise-name { + margin-right: 15px; + } + + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + + .user-info-des { + margin-bottom: 5px; + } +} + +::ng-deep { + .affix { + position: fixed; + top: 20px !important; + right: 25px; + left: 25px; + z-index: 999 !important; + } + + .alain-pro__menu-side .alain-pro__main { + .affix { + position: fixed; + top: 20px !important; + right: 25px; + left: 250px; + z-index: 999 !important; + } + } + + .aside-collapsed.alain-pro__menu-side .alain-pro__main { + .affix { + left: 106px; + } + } + .overflowText { + display: -webkit-box; + max-width: 155px; + height: 40px; + overflow: hidden; + text-align: left; + text-overflow: -o-ellipsis-lastline; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + line-clamp: 2; + -webkit-box-orient: vertical; + } +} diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts new file mode 100644 index 00000000..cd82f249 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts @@ -0,0 +1,538 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { DatePipe, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { fromEvent, Subscription } from 'rxjs'; +import { UsermanageService } from '../../../../services/usercenter.service'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'], + providers: [DatePipe] +}) +export class FreightComponentsListDetailComponent implements OnInit, OnDestroy { + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('st1') private readonly st1!: STComponent; + @ViewChild('approvedModal', { static: false }) + approvedModal!: any; + @ViewChild('redectModal', { static: false }) + redectModal!: any; + columns: STColumn[] = []; + recordColumns!: STColumn[]; + detailData: any = { adminUserInfo: { name: '' }, legalPersonIdentityVO: { name: '' } }; + tempalateData = { ...this.detailData }; + suppliersData: any = {}; + + isEdit = false; + + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + enterpriseAddressCode: any = []; + ltdId: any = []; + roles: any = []; + customerServices: any = []; + billEvaluateList: any = []; + approvalOpinion = ''; + networkTransporter = null; + roleId = null; + customerServiceId = null; + partnerInfo: any = {}; + esignCheckStatus: any = { + 0: '不通过', + 1: '通过', + 2: '未认证' + }; + + billEvaluate = null; + scrollTop = 0; + subscribeScoll!: Subscription; + /** + * 查询参数 + */ + get reqParamsCar() { + const params = { + id: this.route.snapshot.params.id, + bindType: 0 + } + return { ...params }; + } + get reqParams() { + const params = { + id: this.route.snapshot.params.id, + } + return { ...params }; + } + constructor( + public service: UsermanageService, + private route: ActivatedRoute, + private nzModalService: NzModalService, + private router: Router, + private datePipe: DatePipe + ) { } + ngOnDestroy(): void { + this.subscribeScoll.unsubscribe(); + } + + ngOnInit() { + this.route.params.subscribe(({ params }) => { + this.initData(); + this.loadltdId(); + this.loadRoles(); + this.initST(); + this.initRecordST() + this.loadCustomerServices(); + this.loadPartnerInfo() + }); + this.subscribeScoll = fromEvent(window, 'scroll').subscribe(event => { + this.scrollTop = document.documentElement.scrollTop; + }); + } + + /** +* 初始化数据列表 +*/ + initST() { + this.columns = [ + { title: '修改后合伙人', index: 'newPartnerName', className: 'text-center' }, + { title: '修改前合伙人', index: 'originalPartnerNamel', className: 'text-center' }, + { title: '备注', render: 'remark', className: 'text-center' }, + { title: '结算起算日', index: 'settStartTime', className: 'text-center' }, + { title: '生效节点', index: 'effectiveNode', className: 'text-center', type: 'enum', enum: { + 1: '立即生效', + 2: 'CRM审核后生效', + 3: '审核通过生效', + } }, + { + title: 'CRM审核状态', index: 'effectiveStatus', + type: 'enum', + enum: { + 0: '已失效', + 1: '未生效', + 2: '已生效', + }, + className: 'text-center' + }, + { title: '修改时间', render: 'modifyTime', className: 'text-center' }, + { title: '生效时间', render: 'effectiveTime', className: 'text-center' }, + { title: '操作人', render: 'approvalUser', className: 'text-center' }, + + ]; + } + /** + * 初始化数据列表 + */ + initRecordST() { + this.recordColumns = [ + { title: '修改后渠道销售', index: 'newChannelName', className: 'text-center' }, + { title: '修改前渠道销售地', index: 'originalChannelName', className: 'text-center' }, + { title: '备注', render: 'remark', className: 'text-center' }, + { title: '生效节点', index: 'effectiveNode', className: 'text-center', type: 'enum', enum: { + 1: '立即生效', + 2: 'CRM审核后生效', + 3: '审核通过生效', + } }, + { + title: 'CRM审核状态', index: 'effectiveStatus', + type: 'enum', + enum: { + 0: '已失效', + 1: '未生效', + 2: '已生效', + }, + className: 'text-center' + }, + { title: '修改时间', render: 'mybidDetailInfo', className: 'text-center' }, + { title: '生效时间', index: 'eeffectiveTime', className: 'text-center' }, + { title: '操作人', index: 'approvalUser', className: 'text-center' } + ]; + } + loadPartnerInfo(){ + this.service.request(this.service.$api_getEnterpriceRel, {id: this.route.snapshot.params.id}).subscribe(res => { + if (res) { + this.partnerInfo = res; + } + }); + } + loadltdId() { + this.service.getNetworkFreightForwarder().subscribe(res => { + if (res) { + this.ltdId = res; + } + }); + } + loadRoles() { + this.service.getRoles({ enterpriseId: 0, projectId: 0 }).subscribe(res => { + if (res) { + this.roles = res; + } + }); + } + loadCustomerServices() { + this.service.getStaffList({}, false).subscribe(res => { + if (res) { + this.customerServices = res; + } + }); + } + + initData() { + this.service + .request(this.service.$api_get_freight_detail, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.detailData = res; + this.tempalateData = { ...this.detailData }; + this.enterpriseAddressCode = [ + Number(this.detailData.fullRegionVO?.provinceCode), + Number(this.detailData.fullRegionVO?.cityCode), + Number(this.detailData.fullRegionVO?.areaCode) + ]; + } + }); + + // 获取评价信息 + this.service + .request(this.service.$api_get_driver_billEvaluate, { passiveUserId: this.route.snapshot.params.id }, 'POST', false) + .subscribe(res => { + if (res?.length > 0) { + this.service.request(this.service.$api_get_freight_billEvaluate, res).subscribe(billEvaluate => { + if (billEvaluate) { + this.billEvaluate = billEvaluate.totalScore; + this.billEvaluateList = res; + } + }); + } + }); + } + + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_lock_freight, { + id: this.route.snapshot.params.id, + statedLocked: !!type + }) + .subscribe(res => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else { + this.service.msgSrv.success(`冻结成功!`); + } + this.initData(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + /** + * 支付权限 + */ + PayOrResume(type: number) { + this.service.http + .post(this.service.$api_lock_freight, { + id: this.route.snapshot.params.id, + statedLocked: !!type + }) + .subscribe(res => { + if (res.data === true) { + if (type === 1) { + this.service.msgSrv.success(`开启成功!`); + } else { + this.service.msgSrv.success(`关闭成功!`); + } + this.initData(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + auditPass(isSave: boolean) { + this.networkTransporter = null; + this.roleId = null; + this.customerServiceId = null; + this.nzModalService.create({ + nzTitle: '审核通过', + nzContent: this.approvedModal, + nzOnOk: () => { + if (!this.networkTransporter || !this.roleId || !this.customerServiceId) { + return false; + } + if (isSave) { + this.save({ + passSave: true, + roleId: this.roleId, + networkTransporter: this.networkTransporter + }); + } else { + this.auditEnterprise(20); + } + return; + } + }); + } + auditNo() { + this.approvalOpinion = ''; + this.roleId = null; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.auditEnterprise(30); + return; + } + }); + } + + private auditEnterprise(status: number) { + this.service + .request(this.service.$api_audit_freight, { + approvalStatus: status, + id: this.detailData.id, + approvalOpinion: this.approvalOpinion, + networkTransporter: this.networkTransporter, + customerServiceId: this.customerServiceId, + roleId: this.roleId || null + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(status === 20 ? '审核通过' : '驳回成功'); + this.refreshData(status); + } + }); + } + + ratify() { + this.isEdit = true; + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string, id: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + if (id === 'legalFront' || id === 'legalBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'legalFront' ? 'front' : 'back', 1); + } + if (id === 'certificateBackFront' || id === 'certificateBack') { + this.checkIdCard(file.response.data?.fullFilePath, id === 'certificateBackFront' ? 'front' : 'back', 0); + } + if (id === 'detailPhoto') { + this.checkBusinessLicense(file.response.data?.fullFilePath); + } + } + } + + /** + * 级联获取地区数据 + * @param node 节点 + * @param index 层级 + * @returns + */ + loadRegionData = (node: any, index: number) => { + return new Promise(resolve => { + this.service.request(this.service.$api_get_region_by_code, { regionCode: node?.regionCode || '' }).subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1, value: item.regionCode, label: item.name })); + }, + _ => { }, + () => { + resolve(node); + } + ); + }); + }; + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save(data: any) { + const dateil = { ...this.detailData }; + Object.assign(dateil.legalPersonIdentityVO, { + validStartTime: this.datePipe.transform(dateil.legalPersonIdentityVO.validStartTime, 'yyyy-MM-dd'), + validEndTime: this.datePipe.transform(dateil.legalPersonIdentityVO.validEndTime, 'yyyy-MM-dd') + }); + if (!this.detailData?.enterpriseName || !this.detailData?.enterpriseAddress) { + this.service.msgSrv.error('请完善企业基本信息!') + return false; + } + if (!this.detailData.legalPersonIdentityVO.name || !this.detailData.legalPersonIdentityVO.certificateNumber) { + this.service.msgSrv.error('请完善法人信息!') + return false; + } + if (!this.detailData.createBank || !this.detailData.bankAccount) { + this.service.msgSrv.error('请完善企业开票信息!') + return false; + } + const params = {}; + Object.assign(params, { + adminMobile: dateil.adminMobile, + adminAppUserId: dateil.adminAppUserId, + adminUserInfo: { ...dateil.adminUserInfo }, + bankAccount: dateil.bankAccount, + businessScope: dateil.businessScope, + createBank: dateil.createBank, + creditPhoto: dateil.creditPhoto, + creditPhotoWatermark: dateil.creditPhotoWatermark, + enterpriseAddress: dateil.enterpriseAddress, + enterpriseAddressCode: this.enterpriseAddressCode[2], + enterpriseLogo: dateil.enterpriseLogo, + enterpriseName: dateil.enterpriseName, + enterpriseRegistrationTime: this.datePipe.transform(dateil.enterpriseRegistrationTime, 'yyyy-MM-dd'), + enterpriseType: dateil.enterpriseType, + id: dateil.id, + legalPersonIdentityDTO: { ...dateil.legalPersonIdentityVO }, + licensePhoto: dateil.licensePhoto, + licensePhotoWatermark: dateil.licensePhotoWatermark, + networkTransporter: dateil.networkTransporter, + oftenUsedServices: dateil.oftenUsedServices, + operatingEndTime: this.datePipe.transform(dateil.operatingEndTime, 'yyyy-MM-dd'), + operatingStartTime: this.datePipe.transform(dateil.operatingStartTime, 'yyyy-MM-dd'), + promotersTelephone: dateil.promotersTelephone, + registerAddress: dateil.registerAddress, + registerPhone: dateil.registerPhone, + registrationCapital: dateil.registrationCapital, + taxAuthority: dateil.taxAuthority, + unifiedSocialCreditCode: dateil.unifiedSocialCreditCode + }); + Object.assign(params, { ...data }); + this.service.request(this.service.$api_save_enterprise_admin, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('企业修改成功'); + this.refreshData(data.passSave ? 20 : 10); + this.isEdit = false; + } + }); + return + } + + private refreshData(status: number) { + if (status === 20) { + this.service.request(this.service.$api_get_next_audit_freight, { id: this.route.snapshot.params.id }).subscribe(res => { + if (res?.id) { + this.router.navigate(['/usercenter/freight/enterprise/detail/' + res.id]); + } else { + this.initData(); + } + }); + } else { + this.initData(); + } + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + if (type === 1) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.detailData.legalPersonIdentityVO.name = res.name; + } + if (res.number) { + this.detailData.legalPersonIdentityVO.certificateNumber = res.number; + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.detailData.legalPersonIdentityVO.validStartTime = res.validFrom; + } + if (res.validTo) { + this.detailData.legalPersonIdentityVO.validEndTime = res.validTo; + } else { + this.detailData.legalPersonIdentityVO.validEndTime = null; + } + } + } + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.detailData.adminUserInfo.name = res.name; + } + if (res.number) { + this.detailData.adminUserInfo.certificateNumber = res.number; + } + } + } + } + }); + } + + // 识别营业执照 + checkBusinessLicense(imgurl: any) { + this.service.request(this.service.$api_ocr_recognize_business_license, { businessLicenseUrl: imgurl }).subscribe(res => { + if (res) { + if (res.registrationNumber) { + this.detailData.unifiedSocialCreditCode = res.registrationNumber; + } + if (res.name) { + this.detailData.enterpriseName = res.name; + } + if (res.type) { + this.detailData.enterpriseType = res.type; + } + if (res.addressRegionCodes) { + this.detailData.enterpriseAddressCode = res.addressRegionCodes; + } + if (res.address) { + this.detailData.enterpriseAddress = res.address; + } + if (res.registeredCapital) { + this.detailData.registrationCapital = res.registeredCapital; + } + if (res.foundDate) { + this.detailData.enterpriseRegistrationTime = res.foundDate; + } + if (res.businessTermStartDate) { + this.detailData.operatingStartTime = res.businessTermStartDate; + } + if (res.businessTermEndDate) { + this.detailData.operatingEndTime = res.businessTermEndDate; + } else { + this.detailData.operatingEndTime = null; + } + if (res.businessScope) { + this.detailData.businessScope = res.businessScope; + } + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.html b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.html new file mode 100644 index 00000000..8953e1f8 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.html @@ -0,0 +1,9 @@ + +
    + 1.如果修改前后的合伙人不是在同一个渠道销售下,修改后客户的渠道销售会随着修改后的合伙人绑定到新的渠道销售下,系统也会同步发起CRM《客户转移》流程;
    +2.结算起算日:指给合伙人结算佣金的起算时间,如果是修改合伙人,该日期是当前合伙人的结算起算日,同时也是上一个合伙人的结算结束时间。 +
    + \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.less b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.less new file mode 100644 index 00000000..b9186e57 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.less @@ -0,0 +1,7 @@ +.info{ + width: 80%; + margin:0 auto; + color: #333; + font-size: 12px; + line-height: 24px;; +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.spec.ts b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.spec.ts new file mode 100644 index 00000000..a77b2be7 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EditPartnerComponentsAddComponent } from './editPartner.component'; + +describe('EditPartnerComponentsAddComponent', () => { + let component: EditPartnerComponentsAddComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditPartnerComponentsAddComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditPartnerComponentsAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.ts b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.ts new file mode 100644 index 00000000..a55f960b --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editPartner/editPartner.component.ts @@ -0,0 +1,122 @@ +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import format from 'date-fns/format'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { apiConf } from '@conf/api.conf'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; +import { NzModalRef } from 'ng-zorro-antd/modal'; + +@Component({ + selector: 'app-ad-components-partner', + templateUrl: './editPartner.component.html', + styleUrls: ['./editPartner.component.less'] +}) +export class EditPartnerComponentsAddComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema: SFSchema = {}; + detailData: any = {} + ui: SFUISchema = {}; + + constructor( + public msgSrv: NzMessageService, + public http: _HttpClient, + private route: ActivatedRoute, + private router: Router, + public service: UsermanageService, + private envSrv: EAEnvironmentService, + private modal: NzModalRef, + ) { } + + + ngOnInit(): void { + this.initDetailData() + this.initSF(); + } + initDetailData() { + const params = { + id: this.i.id + } + this.service.request(this.service.$api_partnerChannelUpdateDetaiList, params).subscribe(res => { + if(res) { + this.detailData = res + } else { + this.service.msgSrv.error(res.msg) + } + }) + } + initSF() { + this.schema = { + properties: { + channelId: { + type: 'string', + title: '合伙人修改为', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '全部可见', value: 1 }, + { label: '合伙人可见', value: 2 }, + { label: '销售渠道可见', value: 3 }, + ], + }, + remark: { + type: 'string', + title: '备注', + ui: { + widget: 'textarea', + placeholder: '请不要超过50个字', + maxLength: 50, + autosize: { minRows: 2, maxRows: 6 }, + }, + }, + effectiveNode: { + type: 'string', + title: '生效节点', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '修改成功后立即生效', value: 1 }, + { label: 'CRM流程审核通过后生效', value: 2 } + ], + }, + }, + required: ['channelId', 'remark', 'effectiveNode'], + }; + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + } + }; + } + get reqParams() { + return {}; + } + close(): void { + this.modal.close(true) + } + save() { + const params = { + ...this.sf.value + } + this.service.request(this.service.$api_batchUpdateEnterpricePartner, params).subscribe(res => { + if(res) { + this.service.msgSrv.success('修改成功') + } else { + this.service.msgSrv.error(res.msg) + } + }) + } +} diff --git a/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.html b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.html new file mode 100644 index 00000000..5e45b66a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.html @@ -0,0 +1,8 @@ + +
    + 修改渠道销售:客户修改渠道销售后,会跟原合伙人解绑,成为新渠道销售的直客。同时系统会同步发起CRM《客户转移》流程。 +
    + \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.less b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.less new file mode 100644 index 00000000..0a08567b --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.less @@ -0,0 +1,7 @@ + .info{ + width: 80%; + margin:0 auto; + color: #333; + font-size: 12px; + line-height: 24px;; + } \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.spec.ts b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.spec.ts new file mode 100644 index 00000000..1661b321 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EditSaleComponentsAddComponent } from './editSale.component'; + +describe('EditSaleComponentsAddComponent', () => { + let component: EditSaleComponentsAddComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditSaleComponentsAddComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditSaleComponentsAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.ts b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.ts new file mode 100644 index 00000000..d1bab1b8 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/editSale/editSale.component.ts @@ -0,0 +1,130 @@ +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EAEnvironmentService } from '@shared'; +import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; +import format from 'date-fns/format'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { apiConf } from '@conf/api.conf'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; +import { NzModalRef } from 'ng-zorro-antd/modal'; + +@Component({ + selector: 'app-ad-components-Sale', + templateUrl: './editSale.component.html', + styleUrls: ['./editSale.component.less'] +}) +export class EditSaleComponentsAddComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema: SFSchema = {}; + detailData: any = {} + ui: SFUISchema = {}; + + constructor( + public msgSrv: NzMessageService, + public http: _HttpClient, + private route: ActivatedRoute, + private router: Router, + public service: UsermanageService, + private envSrv: EAEnvironmentService, + private modal: NzModalRef, + + ) { } + + + ngOnInit(): void { + this.initDetailData() + this.initSF(); + } + initDetailData() { + const params = { + id: this.i.id + } + this.service.request(this.service.$api_partnerChannelUpdateDetaiList, params).subscribe(res => { + if(res) { + this.detailData = res + } else { + this.service.msgSrv.error(res.msg) + } + }) + } + initSF() { + this.schema = { + properties: { + channelId: { + type: 'string', + title: '渠道销售修改为', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '全部可见', value: 1 }, + { label: '合伙人可见', value: 2 }, + { label: '销售渠道可见', value: 3 }, + ], + }, + remark: { + type: 'string', + title: '备注', + ui: { + widget: 'textarea', + placeholder: '请不要超过50个字', + maxLength: 50, + autosize: { minRows: 2, maxRows: 6 }, + }, + }, + effectiveNode: { + type: 'string', + title: '生效节点', + ui: { + widget: 'radio', + showRequired: true, + } as SFRadioWidgetSchema, + enum: [ + { label: '修改成功后立即生效', value: 1 }, + { label: 'CRM流程审核通过后生效', value: 2 } + ], + }, + }, + required: ['channelId', 'remark', 'effectiveNode'], + }; + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + } + }; + } + get reqParams() { + return {}; + } + save() { + this.service.nzModalService.create({ + nzTitle: '确定提交吗?', + nzClosable: false, + nzOnOk: () => { + const params = { + ...this.sf.value + } + this.service.request(this.service.$api_batchUpdateEnterpriceChannel, params).subscribe(res => { + if(res) { + this.service.msgSrv.success('修改成功') + } else { + this.service.msgSrv.error(res.msg) + } + }) + } + }); + } + + close(): void { + this.modal.close(true) + } +} diff --git a/src/app/routes/usercenter/components/freight/list/list.component.html b/src/app/routes/usercenter/components/freight/list/list.component.html new file mode 100644 index 00000000..a6d0ea7c --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.html @@ -0,0 +1,75 @@ + + + + + + +
    +
    + +
    +
    + + + + + +
    +
    +
    + + + + + + +
    + + + + +

    暂无评价

    +
    +
    + +
    + + 已过期 + +
    + + {{ item.contacter }}
    /{{item.mobile}} +
    + + {{ item.promotersTelephone + || '添加' }} + +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/list.component.less b/src/app/routes/usercenter/components/freight/list/list.component.less new file mode 100644 index 00000000..07d74cbd --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.less @@ -0,0 +1,19 @@ +:host{ + ::ng-deep{ + .btnBox { + st-td{ + // display: flex; + // align-items: center; + st-td>span{ + display: inline-block; + width: 95px; + text-align: center; + margin: 0 10px; + } + } + .st__btn-text span{ + white-space: nowrap; + } + } + } +} diff --git a/src/app/routes/usercenter/components/freight/list/list.component.ts b/src/app/routes/usercenter/components/freight/list/list.component.ts new file mode 100644 index 00000000..4df4f161 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.ts @@ -0,0 +1,541 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STColumnBadge, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { DynamicSettingModalComponent, ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; +import { UsermanageService } from '../../../services/usercenter.service'; +import { EditPartnerComponentsAddComponent } from './editPartner/editPartner.component'; +import { EditSaleComponentsAddComponent } from './editSale/editSale.component'; +import { ShowServiceComponent } from './showService/showservice.component'; +@Component({ + selector: 'app-Freight-components-list', + templateUrl: './list.component.html', + styleUrls: ['../../../../commom/less/expend-but.less'] +}) +export class FreightComponentsListComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + @ViewChild('promoterModal', { static: false }) + promoterModal!: any; + promotersTelephone = ''; + + loadingList = true; + constructor( + public service: UsermanageService, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + public shipperservice: ShipperBaseService + ) {} + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { listSource: 1 }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf.value.createTime) { + Object.assign(requestOptions.body, { + createTime: { + start: this.sf.value.createTime[0], + end: this.sf.value.createTime[1] + } + }); + } + if (this.sf.value.approvalTime) { + Object.assign(requestOptions.body, { + approvalTime: { + start: this.sf.value.approvalTime[0], + end: this.sf.value.approvalTime[1] + } + }); + } + } + this.loadingList = true; + return requestOptions; + }; + + dataProcess = (data: STData[]): STData[] => { + this.loadingList = false; + return data; + }; + + settingAction(item?: any) { + this.modal.create({ + nzTitle: '基础设置', + nzContent: DynamicSettingModalComponent, + nzWidth: 900, + nzComponentParams: { + extendType: '2', + businessId: item.id + }, + nzFooter: null + }); + } + + showAccountDetail(item: any) { + this.modal.create({ + nzTitle: '资金账户', + nzContent: AccountDetailComponent, + nzNoAnimation: true, + nzWidth: 600, + nzComponentParams: { + isCanCreate: true, + url: '/api/fcc/accountBalance/getShipperAccountDetailByOperator', + params: { + accountType: 1, + roleId: item.id, + ctfId: item.unifiedSocialCreditCode, + clientName: item.enterpriseName, + projectId: item.mainProjectId, + ltdId: item.networkTransporter + } + }, + nzFooter: null + }); + } + showService(record: any) { + const modalRef = this.modal.create({ + nzTitle: '分配客服人员', + nzContent: ShowServiceComponent, + nzWidth: 600, + nzComponentParams: { + i: record + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + if (res) { + this.st.load(1); + } + }); + } + editPartner(record: any) { + const modalRef = this.modal.create({ + nzTitle: '修改合伙人', + nzContent: EditPartnerComponentsAddComponent, + nzWidth: 800, + nzComponentParams: { + i: record + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + if (res) { + this.st.load(1); + } + }); + } + editSale(record: any) { + const modalRef = this.modal.create({ + nzTitle: '修改渠道销售', + nzContent: EditSaleComponentsAddComponent, + nzWidth: 800, + nzComponentParams: { + i: record + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((res: any) => { + if (res) { + this.st.load(1); + } + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + enterpriseName: { + title: '企业名称', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + contactName: { + title: '管理员', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + enterpriseType: { + type: 'string', + title: '企业类型', + enum: [ + { label: '全部', value: '' }, + { label: '物流企业', value: 1 }, + { label: '货运代理', value: 2 }, + { label: '生产型企业', value: 3 }, + { label: '贸易类企业', value: 4 }, + { label: '科技型企业', value: 5 }, + { label: '化学化工企业', value: 6 }, + { label: '其他', value: 7 } + ], + default: '', + ui: { + widget: 'select' + } + }, + enterpriseAddressCode: { + type: 'string', + title: '公司所在地', + enum: [{ label: '全部', value: '' }], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + oftenUsedServices: { + type: 'string', + title: '常用服务', + enum: [ + { label: '全部', value: '' }, + { label: '整车发货', value: 10 }, + { label: '大宗发货', value: 20 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + customerType: { + type: 'string', + title: '客户类型', + enum: [ + { label: '全部', value: '' }, + { label: '直客', value: 1 }, + { label: '渠道客户', value: 20 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + promotersTelephone: { + title: '业务员', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + partnerNamee: { + title: '合伙人', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + customerServiceId: { + title: '客服人员', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + approvalUserName: { + title: '审核人', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '申请时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + approvalTime: { + title: '审核时间', + type: 'string', + ui: { + widget: 'sl-from-to-search', + format: 'yyyy-MM-dd HH:mm:ss', + nzShowTime: true, + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + lockedStatus: { + type: 'string', + title: '企业状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + source: { + type: 'string', + title: '注册渠道', + enum: [ + { label: '全部', value: '' }, + { label: '货主注册', value: 1 }, + { label: '平台添加', value: 2 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + isExpired: { + type: 'string', + title: '证件是否过期', + enum: [ + { label: '全部', value: '' }, + { label: '是', value: true }, + { label: '否', value: false } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + networkTransporter: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { lg: 8, md: 12, sm: 12, xs: 24 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '企业名称', render: 'enterpriseName', width: 350 }, + { title: '统一社会信用代码', className: 'text-center', render: 'unifiedSocialCreditCode', width: 200 }, + { + title: '公司所在地', + className: 'text-center', + index: 'province', + width: 200, + format: item => `${item.provinceName}${item.cityName}${item.areaName}` + }, + { + title: '企业类型', + className: 'text-center', + index: 'enterpriseType', + width: 200, + type: 'enum', + enum: { 1: '物流企业', 2: '货运代理', 3: '生产型企业', 4: '贸易类企业', 5: '科技型企业', 6: '化学化工企业', 7: '其他' } + }, + { title: '管理员', className: 'text-center', render: 'contacter', width: 150 }, + { + title: '常用服务', + className: 'text-center', + index: 'oftenUsedServices', + type: 'enum', + enum: { 10: '整车发货', 20: '大宗发货' }, + width: 140 + }, + { title: '业务员', className: 'text-center', render: 'promotersTelephone', width: 150 }, + { title: '合伙人', className: 'text-center', render: 'partnerName', width: 150 }, + { title: '客服人员', className: 'text-center', render: 'customerServiceId', width: 150 }, + { title: '网络货运人', className: 'text-center', index: 'netTranName', width: 180 }, + { + title: '注册渠道', + className: 'text-center', + index: 'source', + type: 'enum', + enum: { 1: '货主注册', 2: '平台添加', 3: '运营添加' }, + width: 130 + }, + { title: '申请时间', className: 'text-center', index: 'createTime', width: 180, type: 'date' }, + { title: '审核时间', className: 'text-center', index: 'approvalTime', width: 180, type: 'date' }, + { title: '审核人', className: 'text-center', index: 'approvalUserName', width: 130 }, + { + title: '保险认证状态', + className: 'text-center', + index: 'insuranceAuthState', + type: 'badge', + badge: { + 10: { text: '成功', color: 'success' }, + 20: { text: '失败', color: 'error' } + }, + width: 130 + }, + { + title: '企业状态', + className: 'text-center', + index: 'lockedStatus', + type: 'badge', + badge: { + 0: { text: '正常', color: 'success' }, + 1: { text: '冻结', color: 'error' } + }, + width: 130 + }, + { + title: '操作', + width: '200px', + className: 'text-center block-td', + fixed: 'right', + buttons: [ + { + text: '查看', + acl: { ability: ['USERCENTER-FREIGHT-LIST-view'] }, + click: item => { + this.router.navigate(['./detail', item.id], { relativeTo: this.ar }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + } + }, + // { + // acl: { ability: ['USERCENTER-FREIGHT-LIST-basicSetting'] }, + // text: '基础设置', + // click: item => this.settingAction(item) + // }, + { + acl: { ability: ['USERCENTER-FREIGHT-LIST-balance'] }, + text: '资金账户', + click: item => this.showAccountDetail(item) + }, + { + text: '分配客服人员', + click: item => this.showService(item) + }, + { + text: '修改合伙人', + click: item => this.editPartner(item) + }, + { + text: '修改渠道销售', + click: item => this.editSale(item) + } + ] + } + ]; + } + daoyun(item: any) { + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + } + + addPromoter(item?: any) { + this.promotersTelephone = item?.promotersTelephone; + const modal = this.modal.create({ + nzTitle: '推广业务员', + nzContent: this.promoterModal, + nzOnOk: () => { + if (!!!this.promotersTelephone) { + return false; + } + if (typeof this.promotersTelephone === 'string' && !/(^1\d{10}$)/.test(this.promotersTelephone)) { + this.service.msgSrv.error('手机格式错误'); + return false; + } + this.service.request(this.service.$api_add_salesman, { ids: [item.id], salesmanMobile: this.promotersTelephone }).subscribe(res => { + if (res) { + this.service.msgSrv.success(item?.promotersTelephone ? '添加推广员成功' : '修改推广员成功'); + } + this.st.load(); + }); + return; + } + }); + } + + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new'], { relativeTo: this.ar }); + } + + exportList() { + const params = { listSource: 1, pageSize: -1 }; + if (this.sf) { + Object.assign(params, { + ...this.sf.value + }); + } + this.service.downloadFile(this.service.$api_export_enterprise, params); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + this.st.reload(); + } +} diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.html b/src/app/routes/usercenter/components/freight/list/new/new.component.html new file mode 100644 index 00000000..ccc6cf71 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.html @@ -0,0 +1,95 @@ + + + + +
    企业基本信息
    +
    + +
    + 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
    上传后系统会自动识别并填写
    +
    +
    + +
    万元
    +
    + + +
    营业执照法人信息
    +
    + +
    +
    请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
    +
    上传后系统会自动识别并填写
    +
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    +
    + + + +
    企业开票信息
    +
    + +
    企业管理员信息
    +
    + + +
    +
    请上传该企业授权您成为本系统企业管理员的文件的高清照片,需加盖公司印章
    +
    上传后系统会自动识别并填写
    +
    +
    +
    +
    + +
    +
    请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
    +
    上传后系统会自动识别并填写
    +
    +
    + +
    +
    +
    正面照(人像面)
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    背面照(国徽面)
    +
    示例
    +
    +
    +
    +
    +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.less b/src/app/routes/usercenter/components/freight/list/new/new.component.less new file mode 100644 index 00000000..78a0db6d --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.less @@ -0,0 +1,68 @@ +:host { + ::ng-deep { + nz-card { + + .pr { + position: relative; + } + + .pa { + position: absolute; + top : 50px; + left : 150px; + } + + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + } + + .ant-form-item { + margin-left: 180px; + } + + nz-date-picker, + nz-input-number { + width: 100% !important; + } + + .input-back { + nz-form-item { + margin-left: 0px; + + .ant-form-item-label { + flex: 0 !important; + } + + .ant-form-item-control { + max-width : 100% !important; + margin-left: 20px !important; + } + } + } + + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.ts b/src/app/routes/usercenter/components/freight/list/new/new.component.ts new file mode 100644 index 00000000..59359454 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.ts @@ -0,0 +1,745 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFCascaderWidgetSchema, + SFCheckboxWidgetSchema, + SFComponent, + SFDateWidgetSchema, + SFSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema +} from '@delon/form'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { of } from 'rxjs'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; + +const IMAGECONFIG = { + previewFile: (file: NzUploadFile) => of(file.url), + action: apiConf.waterFileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + name: 'multipartFile', + multiple: false, + listType: 'picture-card' +} as SFUploadWidgetSchema; + +const DATECONFIG = { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择' +}; + +@Component({ + selector: 'app-account-components-freight-new', + templateUrl: './new.component.html', + styleUrls: ['./new.component.less'] +}) +export class FreightComponentsListNewComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('sf1', { static: false }) + sf1!: SFComponent; + schema: SFSchema = this.initOthersSF(); + schema1: SFSchema = this.initBasicInfoSF(); + ui: SFUISchema = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 } + }, + $title1: { + spanLabelFixed: 0 + }, + $title99: { + spanLabelFixed: 0 + }, + $title2: { + spanLabelFixed: 0 + }, + $registrationCapital: { + spanLabelFixed: 180, + grid: { xxl: 13, xl: 18, lg: 22, md: 22 } + }, + $unit: { + grid: { xxl: 6, xl: 6, lg: 2, md: 2 } + }, + $isLoingDate: { + spanLabelFixed: 100, + grid: { xxl: 6, xl: 6, lg: 4, md: 6 } + } + }; + + constructor(private router: Router, public service: UsermanageService) {} + ngOnInit() {} + + submitForm() { + if (!this.sf1.valid || !this.sf.valid) { + this.sf.validator({ emitError: true }); + this.sf1.validator({ emitError: true }); + this.service.msgSrv.warning('请修改填写错误信息'); + return; + } + const enterpriseRegistrationTime = new Date(this.sf1.value.enterpriseRegistrationTime); + const operatingStartTime = new Date(this.sf1.value.operatingStartTime); + if (enterpriseRegistrationTime.getTime() > operatingStartTime.getTime()) { + this.service.msgSrv.warning('营业期限不能小于成立日期'); + return; + } + if (this.sf1.value.operatingEndTime) { + const operatingEndTime = new Date(this.sf1.value.operatingEndTime); + if (operatingStartTime.getTime() > operatingEndTime.getTime()) { + this.service.msgSrv.warning('营业期限不能小于期限开始日期'); + return; + } + } + const validStartTime = new Date(this.sf1.value.legalPersonIdentityDTO.validStartTime); + if (this.sf1.value.legalPersonIdentityDTO.validEndTime) { + const validEndTime = new Date(this.sf1.value.legalPersonIdentityDTO.validEndTime); + if (validStartTime.getTime() > validEndTime.getTime()) { + this.service.msgSrv.warning('法人证件有效截止日期小于开始日期'); + return; + } + } + const sfVlaue = this.sf.value; + const params = {}; + Object.assign( + params, + { ...this.sf1.value }, + { ...this.sf.value }, + { + enterpriseAddressCode: this.sf1.value.enterpriseAddressCode[2], + oftenUsedServices: sfVlaue.oftenUsedServices, + registerAddress: sfVlaue.registerAddress, + registerPhone: sfVlaue.registerPhone, + creditPhoto: sfVlaue.creditPhoto, + creditPhotoWatermark: sfVlaue.creditPhotoWatermark, + promotersTelephone: sfVlaue.promotersTelephone, + networkTransporter: sfVlaue.networkTransporter, + adminUserInfo: { + certificateNumber: sfVlaue.certificateNumber, + certificatePhotoBack: sfVlaue.certificatePhotoBack, + certificatePhotoBackWatermark: sfVlaue.certificatePhotoBackWatermark, + certificatePhotoFront: sfVlaue.certificatePhotoFront, + certificatePhotoFrontWatermark: sfVlaue.certificatePhotoFrontWatermark, + name: sfVlaue.name + } + } + ); + this.service.request(this.service.$api_save_enterprise_admin, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('企业新增成功'); + this.goBack(); + } + }); + } + + /* + * 根据地区code查询地区列表 + */ + getRegionDetailByCode(regionCode: any) { + return this.service.request(this.service.$api_get_region_by_code, { regionCode }); + } + + // 识别身份证 参数isFront:front-正面、back-背面;type:0-申请人身份证,1-法定代表人身份证 + checkIdCard(imgurl: any, isFront: string, type: number) { + const params = { + idCardUrl: imgurl, + side: isFront + }; + this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => { + if (res) { + if (type === 1) { + // 法定代表人证件照 + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf1.setValue('/legalPersonIdentityDTO/name', res.name); + } + if (res.number) { + this.sf1.setValue('/legalPersonIdentityDTO/certificateType', 0); + this.sf1.setValue('/legalPersonIdentityDTO/certificateNumber', res.number); + } + } + if (isFront === 'back') { + // 背面 + if (res.validFrom) { + this.sf1.setValue('/legalPersonIdentityDTO/validStartTime', res.validFrom); + } + if (res.validTo) { + this.sf1.setValue('/legalPersonIdentityDTO/validEndTime', res.validTo); + this.sf1.setValue('/legalPersonIdentityDTO/isLoingDate', false); + } else { + this.sf1.setValue('/legalPersonIdentityDTO/isLoingDate', true); + } + } + } + // 企业管理员证件照 + if (type === 0) { + if (isFront === 'front') { + // 正面 + if (res.name) { + this.sf.setValue('/name', res.name); + } + if (res.number) { + this.sf.setValue('/certificateNumber', res.number); + } + } + } + } + }); + } + + // 识别营业执照 + checkBusinessLicense(imgurl: any) { + this.service.request(this.service.$api_ocr_recognize_business_license, { businessLicenseUrl: imgurl }).subscribe(res => { + if (res) { + if (res.registrationNumber) { + this.sf1.setValue('/unifiedSocialCreditCode', res.registrationNumber); + } + if (res.name) { + this.sf1.setValue('/enterpriseName', res.name); + } + // if (res.type) { + // this.sf1.setValue('/enterpriseType', res.type); + // } + if (res.addressRegionCodes) { + this.sf1.setValue('/enterpriseAddressCode', res.addressRegionCodes); + } + if (res.address) { + this.sf1.setValue('/enterpriseAddress', res.address); + } + if (res.registeredCapital) { + this.sf1.setValue('/registrationCapital', res.registeredCapital); + } + if (res.foundDate) { + this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); + } + if (res.businessTermStartDate) { + this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); + } + if (res.businessTermEndDate) { + this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); + } else { + this.sf1.setValue('/isLoingDate', true); + } + if (res.businessScope) { + this.sf1.setValue('/businessScope', res.businessScope); + } + } + }); + } + + goBack() { + window.history.go(-1); + } + + private initBasicInfoSF(): SFSchema { + return { + properties: { + title1: { title: '', type: 'string', ui: { widget: 'custom' } }, + tips: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + licensePhoto: { title: '', type: 'string', ui: { hidden: true } }, + licensePhotoWatermark: { + type: 'string', + title: '营业执照', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/licensePhoto', args.fileList[0].response.data.fullFilePath); + this.checkBusinessLicense(args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码' + } + } + }, + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 1, + maxLength: 100, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入公司名称', + errors: { + required: '请输入公司名称' + } + } + }, + enterpriseType: { + title: '公司类型', + type: 'string', + enum: [ + { label: '物流企业', value: 1 }, + { label: '货运代理', value: 2 }, + { label: '生产型企业', value: 3 }, + { label: '贸易类企业', value: 4 }, + { label: '科技型企业', value: 5 }, + { label: '化学化工企业', value: 6 }, + { label: '其他', value: 7 } + ], + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select', + placeholder: '请选择公司类型', + errors: { + required: '请选择公司类型' + } + } + }, + enterpriseAddressCode: { + type: 'number', + title: '营业执照所在地', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + asyncData: (node: any, index: any) => { + return new Promise(resolve => { + this.getRegionDetailByCode(node?.regionCode || '').subscribe( + res => { + node.children = res.map((item: any) => ({ ...item, isLeaf: index === 1 })); + }, + _ => {}, + () => { + resolve(); + } + ); + }); + } + } as SFCascaderWidgetSchema + }, + enterpriseAddress: { + title: '营业执照详细地址', + type: 'string', + minLength: 1, + maxLength: 240, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'textarea', + autosize: { minRows: 2, maxRows: 5 }, + placeholder: '请输入营业执照上的完整详细地址', + errors: { + required: '请输入营业执照上的完整详细地址' + } + } as SFTextareaWidgetSchema + }, + registrationCapital: { + title: '注册资本', + type: 'number', + minimum: 1, + maximum: 99999999999999999999, + ui: { + grid: { xxl: 13, xl: 18, lg: 22, md: 22 }, + placeholder: '请输入营业执照上的注册资本', + errors: { + required: '请输入营业执照上的注册资本' + }, + precision: 0 + } + }, + enterpriseRegistrationTime: { + title: '成立日期', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + blank1: { + type: 'string', + ui: { widget: 'text', grid: { xxl: 11, xl: 6, md: 0, sm: 0 }, class: 'input-back' }, + default: ' ' + }, + operatingStartTime: { + title: '营业期限', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + operatingEndTime: { + title: '', + type: 'string', + ui: { + ...DATECONFIG, + grid: { xxl: 13, xl: 18, lg: 20, md: 18 }, + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf1?.setValue('/isLoingDate', false); + setTimeout(() => { + console.log(this.sf1.value); + }, 1000); + } + } as SFDateWidgetSchema + }, + isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + class: 'input-back', + widget: 'checkbox', + change: i => this.sf1?.setValue('/operatingEndTime', null) + } as SFCheckboxWidgetSchema + }, + businessScope: { + title: '经营范围', + type: 'string', + minLength: 1, + maxLength: 500, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'textarea', + autosize: { minRows: 3, maxRows: 5 }, + placeholder: '请输入营业执照上的营经营范围', + errors: { + required: '请输入营业执照上的营经营范围' + } + } as SFTextareaWidgetSchema + }, + taxAuthority: { + title: '税务机关', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入营业执照上的税务机关', + errors: { + required: '请输入营业执照上的税务机关' + } + } + }, + + legalPersonIdentityDTO: { + type: 'object', + properties: { + title2: { title: '', type: 'string', ui: { widget: 'custom' } }, + tipsC: { title: '法定代表人证件照', type: 'string', ui: { widget: 'custom' } }, + tipsA: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/legalPersonIdentityDTO/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front', 1); + } + } + } as SFUploadWidgetSchema + }, + tipsB: { title: '', type: 'string', ui: { widget: 'custom', offsetControl: 6 } }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf1.setValue('/legalPersonIdentityDTO/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back', 1); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '法人姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入法人姓名' + } + }, + certificateType: { + type: 'string', + title: '法人证件类型', + enum: [ + { label: '大陆身份证', value: 0 }, + { label: '港澳居民通行证', value: 1 }, + { label: '香港居民通行证', value: 2 } + ], + default: 0, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select' + } + }, + certificateNumber: { + title: ' 法定代表人证件号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入法定代表人证件号' + } + }, + validStartTime: { + title: '法人证件有效开始日期', + type: 'string', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择开始日期' + } + } as SFDateWidgetSchema + }, + validEndTime: { + title: '法人证件有效截止日期', + type: 'string', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择截止日期' + }, + change: i => { + this.sf1?.setValue('/legalPersonIdentityDTO/isLoingDate', false); + } + } as SFDateWidgetSchema + }, + isLoingDate: { + title: '长期', + type: 'boolean', + ui: { + spanLabelFixed: 100, + grid: { span: 6 }, + class: 'input-back', + widget: 'checkbox', + change: i => this.sf1?.setValue('/legalPersonIdentityDTO/validEndTime', null) + } as SFCheckboxWidgetSchema + } + }, + required: ['certificatePhotoFront', 'certificatePhotoBack', 'name', 'certificateType', 'certificateNumber', 'validStartTime'] + } + }, + required: [ + 'licensePhotoWatermark', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'enterpriseType', + 'enterpriseAddressCode', + 'enterpriseAddress', + 'registrationCapital', + 'enterpriseRegistrationTime', + 'operatingStartTime', + 'businessScope' + ] + }; + } + + private initOthersSF(): SFSchema { + return { + properties: { + title1: { title: '', type: 'string', ui: { widget: 'custom' } }, + createBank: { + title: '开户银行', + type: 'string', + ui: { grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, placeholder: '请输入银行账号' } + }, + bankAccount: { + title: '银行账号', + type: 'string', + ui: { grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, placeholder: '请输入银行账号' } + }, + registerAddress: { + title: ' 注册地址', + type: 'string', + ui: { grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, placeholder: '请输入注册地址' } + }, + registerPhone: { + title: ' 注册电话', + type: 'string', + format: 'mobile', + minLength: 1, + maxLength: 11, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入注册电话', + errors: { required: '请输入注册电话', format: '手机号格式错误' } + } + }, + + title99: { title: '', type: 'string', ui: { widget: 'custom' } }, + tipsA: { + title: '企业管理员证件照', + type: 'string', + ui: { + widget: 'custom' + } + }, + certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/certificatePhotoFront', args.fileList[0].response.data.fullFilePath); + this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front', 0); + } + } + } as SFUploadWidgetSchema + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6 + } + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/certificatePhotoBack', args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + }, + name: { + title: '企业管理员姓名', + type: 'string', + maxLength: 8, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员姓名' + } + }, + adminMobile: { + title: ' 企业管理员手机号', + type: 'string', + minLength: 1, + format: 'mobile', + maxLength: 11, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员手机号', + errors: { required: '请输入企业管理员手机号', format: '手机号格式错误' } + } + }, + certificateNumber: { + title: '企业管理员身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入企业管理员身份证号' + } + }, + tipsD: { title: '企业授权函', type: 'string', ui: { widget: 'custom' }, default: 1 }, + creditPhoto: { title: '', type: 'string', ui: { hidden: true } }, + creditPhotoWatermark: { + type: 'string', + title: '', + ui: { + ...IMAGECONFIG, + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + change: args => { + if (args.type === 'success') { + this.sf.setValue('/creditPhoto', args.fileList[0].response.data.fullFilePath); + } + } + } as SFUploadWidgetSchema + }, + oftenUsedServices: { + type: 'string', + title: '常用服务', + enum: [ + { label: '整车发货', value: 10 }, + { label: '大宗发货', value: 20 } + ], + default: '', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + promotersTelephone: { + title: '邀请码', + type: 'string', + minLength: 1, + format: 'mobile', + maxLength: 11, + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + placeholder: '请输入邀请码', + errors: { required: '请输入邀请码', format: '手机号格式错误' } + } + }, + networkTransporter: { + type: 'string', + title: '网络货运人', + ui: { + grid: { xxl: 13, xl: 18, lg: 24, md: 24 }, + widget: 'select', + placeholder: '请选择', + allowClear: true, + asyncData: () => this.service.getNetworkFreightForwarder() + }, + default: '' + } + }, + required: ['createBank', 'bankAccount', 'adminMobile', 'name', 'certificateNumber', 'tipsD', 'creditPhoto', 'networkTransporter'] + }; + } +} diff --git a/src/app/routes/usercenter/components/freight/list/showService/showService.component.html b/src/app/routes/usercenter/components/freight/list/showService/showService.component.html new file mode 100644 index 00000000..82ea63f2 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/showService/showService.component.html @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/showService/showService.component.less b/src/app/routes/usercenter/components/freight/list/showService/showService.component.less new file mode 100644 index 00000000..6b46d577 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/showService/showService.component.less @@ -0,0 +1,129 @@ +.sfBox { + position: relative; + .example { + position: absolute; + top: 215px; + right: 265px; + color: #1890ff; + cursor: pointer; + .popBox { + position: absolute; + top: -170px; + left: -125px; + width: 300px; + padding: 20px; + text-align: center; + background: #fff; + border: solid 1px #eee; + border-radius: 6px; + box-shadow: 0 1px 5px 1px #ececec; + &::before { + position: absolute; + bottom: -5px; + left: 50%; + width: 10px; + height: 10px; + margin-left: -5px; + background: #fff; + box-shadow: 0 1px 5px 1px #ececec; + transform: rotate(45deg); + content: ''; + } + &::after { + position: absolute; + bottom: 0; + left: 0; + z-index: 10; + width: 100%; + height: 10px; + background: #fff; + content: ''; + } + img { + max-width: 100%; + max-height: 200px; + } + } + } + .positionSet{ + top: 356px; + right: 235px; + } + .positionSet01{ + top: 500px; + right: 200px; + } + .positionSet02{ + top: 664px; + right: 265px; + } + .positionSet03{ + top: 808px; + right: 205px; + + } +} +.exaA{ + position: absolute; + top: 0; + left: 300px +} +.pr { + position: relative; +} + +.pa { + position: absolute; + top: 35px; + left: 150px; +} + +.tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } +} +.drivercard{ + position: absolute; + top: 0; + left: 330px; + border: solid 1px #ebf0fb; +} +.jopcard{ + position: absolute; + top: 1356px; + left: 330px; + border: solid 1px #ebf0fb; +} +.agreement{ + position: absolute; + top: 425px; + left: 330px; + border: solid 1px #ebf0fb; +} +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + } + } +.serviceBox{ + display: flex; + align-items: center; + justify-content: space-between; + width: 350px; +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/list/showService/showservice.component.spec.ts b/src/app/routes/usercenter/components/freight/list/showService/showservice.component.spec.ts new file mode 100644 index 00000000..8be64dc5 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/showService/showservice.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CarCarauthComponent } from './carauth.component'; + +describe('CarCarauthComponent', () => { + let component: CarCarauthComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CarCarauthComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CarCarauthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/showService/showservice.component.ts b/src/app/routes/usercenter/components/freight/list/showService/showservice.component.ts new file mode 100644 index 00000000..ce6e942a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/showService/showservice.component.ts @@ -0,0 +1,93 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { cacheConf } from '@conf/cache.conf'; +import { SFUISchema, SFSchema, SFUploadWidgetSchema, SFComponent, SFSelectWidgetSchema, SFSchemaEnum } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EACacheService, EAEnvironmentService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { UsermanageService } from 'src/app/routes/usercenter/services/usercenter.service'; + +@Component({ + selector: 'app-car-showService', + templateUrl: './showService.component.html', + styleUrls: ['./showService.component.less'] +}) +export class ShowServiceComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + appUserId = '' + record: any = {}; + i: any; + ui!: SFUISchema; + schema!: SFSchema; + + constructor( + private modal: NzModalRef, + public service: UsermanageService, + ) { } + + ngOnInit(): void { + this.initSF() + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + customerServiceId: { + title: '客服人员', + type: 'string', + ui: { + widget: 'select', + asyncData: () => { + const params = { + // enterpriseId: 1, + // enterpriseProjectId: this.i.mainProjectId, + } + return this.service.request(this.service.$api_getStaffList, params).pipe( + map((res: any) => { + return res.map((i: any) => { + let name = i.name ? `${i.name} / ` : ''; + return { label: `${name}${i.telephone}`, value: i.appUserId }; + }); + }), + ); + // serverSearch: true, + // searchDebounceTime: 300, + // searchLoadingText: '搜索中...', + // onSearch: (q: any) => { + // if (!!q) { + // return this.service + // .request(this.service.$api_getStaffList, { + // nameOrPhone: q + // }) + // .pipe(map((res: any) => (res?.records as any[]).map(i => ({ name: i.name, value: i.appUserId } as SFSchemaEnum)))) + // .toPromise(); + // } else { + // return of([]); + // } + }, + } as SFSelectWidgetSchema + } + }, + required: ['customerServiceId'] + }; + } + close(): void { + this.modal.close(true) + } + submitForm() { + const params: any = { + ...this.sf.value, + enterpriseIdList: [this.i.id] + }; + this.service.request(this.service.$api_distributionCusService, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('分配成功') + this.modal.close(true) + } + }) + } +} diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.html b/src/app/routes/usercenter/components/freight/list/view/view.component.html new file mode 100644 index 00000000..96d0bc91 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + +

    道路运输经营许可证

    + +
    + + +
    +
    +
    + + diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.less b/src/app/routes/usercenter/components/freight/list/view/view.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts b/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts new file mode 100644 index 00000000..6e2a7782 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListViewComponent } from './view.component'; + +describe('FreightComponentsListViewComponent', () => { + let component: FreightComponentsListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.ts b/src/app/routes/usercenter/components/freight/list/view/view.component.ts new file mode 100644 index 00000000..0874ddda --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.ts @@ -0,0 +1,257 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +@Component({ + selector: 'app-Freight-components-list-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'], +}) +export class FreightComponentsListViewComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any = { + status: 0 + }; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['FreightsType']; + FreightsData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + this.initData(); + this.initSF(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + name: { + title: '许可证号', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入角色名称', + }, + }, + phone: { + title: '业户名称', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入业户名称', + }, + }, + roleDescription: { + title: '地址', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入地址', + widget: 'textarea', + }, + }, + effectiveDate: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + phone3: { + title: '有效期', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone4: { + title: '有效期截止', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone5: { + title: '经营范围', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + avatar: { + type: 'string', + title: '证照', + ui: { + // action: environment.UPLOAD_URL, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + }, + required: ['name', 'phone'], + }; + this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_one, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_get_one, { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + status: type, + }) + .subscribe((res) => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else if (type === 1) { + this.service.msgSrv.success(`冻结成功!`); + } + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_get_one, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html new file mode 100644 index 00000000..42bfb9b9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + 个人信息 + + +
    + + + + + + + + + +
    +
    + + + + + + + +
    + + + + +
    +
    +
    + + + 关联企业 + + + + +
    +
    + + +
    +
    + + {{ userIdentityDetail?.name }} + + + + + + + {{ tag }} + + +
    +
    +
    + + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.less b/src/app/routes/usercenter/components/freight/user/detail/detail.component.less new file mode 100644 index 00000000..e30f5583 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.less @@ -0,0 +1,25 @@ +@import '../../../../less/edit.less'; + +:host { + ::ng-deep { + .user-info { + display : flex; + font-size: 16px; + + .enterprise-name { + margin-right: 15px; + } + + img { + width : 64px; + height : 64px; + margin-right : 15px; + border-radius: 50%; + } + + .user-info-des { + margin-bottom: 5px; + } + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts new file mode 100644 index 00000000..67e0fe6d --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts @@ -0,0 +1,200 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { UsermanageService } from '../../../../services/usercenter.service'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'] +}) +export class FreightComponentsUserDetailComponent implements OnInit { + @ViewChild('redectModal', { static: false }) + redectModal!: any; + + userDetail: any = {}; + userIdentityDetail: any = {}; + tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + @ViewChild('st', { static: false }) st!: STComponent; + columns: STColumn[] = [ + { title: '企业名称', className: 'text-center', index: 'enterpriseName' }, + { title: '项目名称', className: 'text-center', index: 'projectName' }, + { title: '角色', className: 'text-center', index: 'roleName' } + ]; + + approvalOpinion = ''; + reasonTags = ['身份证照片太丑', '姓名与身份证号不匹配']; + + isEditUser = false; + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + constructor( + private nzModalService: NzModalService, + public service: UsermanageService, + public route: ActivatedRoute, + private nzImageService: NzImageService + ) {} + + ngOnInit() { + this.initData(); + // this.launchSign(); + } + async initData() { + // 获取司机头部信息 + this.service + .request(this.service.$api_get_user_detail, { + appUserId: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.userDetail = res; + } + }); + // 获取用户个人信息 + this.service + .request(this.service.$api_get_user_identity, { + id: this.route.snapshot.params.id + }) + .subscribe(res => { + if (res) { + this.userIdentityDetail = res; + this.tempalateUserIdentityDetail = { ...this.userIdentityDetail }; + } + }); + } + + userAction(status: number) { + this.nzModalService.warning({ + nzTitle: status === 1 ? '确定启用该用户吗?' : '确定冻结该用户吗?', + nzContent: + status === 1 + ? '启用后,该用户将恢复正常使用功能,请再次确认' + : '停用后,该用户将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作', + nzOnOk: () => { + this.service + .request(this.service.$api_lock_or_free_user, { + appUserId: [this.userDetail.appUserId], + freezeOrResume: !!!status, + pageName: '货主员工', + telephone: this.userDetail.phone + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('操作成功'); + } + this.initData(); + }); + } + }); + } + + auditPass() { + this.nzModalService.confirm({ + nzTitle: '审核通过', + nzContent: `是否确认通过(姓名:${this.userIdentityDetail?.name})审核`, + nzOnOk: () => { + this.auditEnterprise(0); + } + }); + } + + auditNo() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + return false; + } + this.auditEnterprise(1); + return; + } + }); + } + + private auditEnterprise(auditStatus: number) { + this.service + .request(this.service.$api_approve_identity, { + auditStatus: auditStatus, + identityId: this.userIdentityDetail.id, + auditType: 0, + certificationOpinions: this.approvalOpinion + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(auditStatus === 0 ? '审核通过' : '驳回成功'); + } + this.initData(); + }); + } + + /** + * 开启修改 + * @param type 修改类型 + */ + ratify() { + this.isEditUser = true; + } + + /** + * 需求修改 + * @param type 修改类型 + */ + reset() { + this.userIdentityDetail = { ...this.tempalateUserIdentityDetail }; + this.isEditUser = false; + } + + saveUser() { + const params = { ...this.userIdentityDetail }; + this.service.request(this.service.$api_update_driver_identity, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('修改成功'); + this.isEditUser = false; + this.initData(); + } + }); + } + + changeUpload({ file, fileList, type }: any, data: any, key: string, key2: string) { + if (type === 'success') { + data[key] = file.response.data?.fullFileWatermarkPath; + data[key2] = file.response.data?.fullFilePath; + } + } + + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + deleteImg(data: any, key: string, key2: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + data[key] = ''; + data[key2] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + + goBack() { + window.history.go(-1); + } +} diff --git a/src/app/routes/usercenter/components/freight/user/user.component.html b/src/app/routes/usercenter/components/freight/user/user.component.html new file mode 100644 index 00000000..aebe3d5a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.html @@ -0,0 +1,68 @@ + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + +
    +
    + {{ item.enterpriseName }} +
    +
    +
    + + + {{ item.promotersTelephone || '添加' }} + + +
    + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/user.component.less b/src/app/routes/usercenter/components/freight/user/user.component.less new file mode 100644 index 00000000..6bcd149d --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.less @@ -0,0 +1,12 @@ +:host::ng-deep { + + nz-range-picker { + width: 100%; + } + + .content-box { + .ant-card-body { + padding-top: 6px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/user.component.ts b/src/app/routes/usercenter/components/freight/user/user.component.ts new file mode 100644 index 00000000..73b44001 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.ts @@ -0,0 +1,245 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +@Component({ + selector: 'app-Freight-components-user', + styleUrls: ['./user.component.less'], + templateUrl: './user.component.html' +}) +export class FreightComponentsUserComponent implements OnInit { + _$expand = false; + ui: SFUISchema = { '*': { spanLabelFixed: 120, grid: { lg: 8, md: 12, sm: 12, xs: 24 }, enter: () => this.st.load() } }; + schema: SFSchema = this.initSF(); + columns: STColumn[] = this.initST(); + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + @ViewChild('promoterModal', { static: false }) + promoterModal!: any; + promotersTelephone = ''; + + resourceStatus: any = 0; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + + ngOnInit() { + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, { certificationStatus: this.resourceStatus }); + if (this.sf) { + Object.assign(requestOptions.body, { + ...this.sf.value + }); + if (this.sf?.value.effectiveDate) { + Object.assign(requestOptions.body, { + time: { + start: this.sf?.value.effectiveDate[0], + end: this.sf?.value.effectiveDate[1] + } + }); + } + delete requestOptions.body.effectiveDate; + delete requestOptions.body.expand; + } + return requestOptions; + }; + + selectChange(e: any) { + this.resourceStatus = e; + this.st.load(); + } + + addPromoter(item?: any) { + this.promotersTelephone = item?.promotersTelephone; + const modal = this.modal.create({ + nzTitle: '推广业务员', + nzContent: this.promoterModal, + nzOnOk: () => { + if (!!!this.promotersTelephone) { + return false; + } + if (typeof this.promotersTelephone === 'string' && !/(^1\d{10}$)/.test(this.promotersTelephone)) { + this.service.msgSrv.error('手机格式错误'); + return false; + } + this.service + .request(this.service.$api_add_user_salesman, { userId: item.userId, mobile: this.promotersTelephone }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(item?.promotersTelephone ? '添加推广员成功' : '修改推广员成功'); + } + this.st.load(); + }); + return; + } + }); + } + + userAction(status: number, appUserId: Array) { + this.modal.warning({ + nzTitle: status === 1 ? '确定启用该用户吗?' : '确定冻结该用户吗?', + nzContent: + status === 1 + ? '启用后,该用户将恢复正常使用功能,请再次确认' + : '停用后,该用户将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作', + nzOnOk: () => { + this.service + .request(this.service.$api_lock_or_free_user, { + appUserId, + freezeOrResume: !!!status, + pageName: '货主员工列表' + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(status === 1 ? '启用成功' : '冻结成功'); + this.st.reload(); + } + }); + } + }); + } + + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + private initSF(): SFSchema { + return { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + name: { + title: '用户姓名', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + enterpriseName: { + title: '企业名称', + type: 'string', + ui: { + placeholder: '请输入', + showRequired: false + } + }, + telephone: { + title: '手机号', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入' + } + }, + stateLocked: { + type: 'string', + title: '状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 } + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + promotersTelephone: { + title: '推广业务员', + type: 'string', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + effectiveDate: { + title: '申请时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + } + + private initST(): STColumn[] { + return [ + { title: '用户姓名', className: 'text-center', index: 'name' }, + { title: '手机号', className: 'text-center', index: 'telephone' }, + { title: '身份证件号', className: 'text-center', index: 'certificateNumber' }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '推广业务员', className: 'text-center', index: 'promotersTelephone', render: 'promotersTelephone' }, + { title: '申请时间', className: 'text-center', index: 'createTime', type: 'date' }, + { + title: '状态', + className: 'text-center', + index: 'certificationStatus', + type: 'badge', + badge: { + 0: { text: '待审核', color: 'processing' }, + 1: { text: '已成功', color: 'success' }, + 2: { text: '已驳回', color: 'warning' } + } + }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (item: any) => { + this.router.navigate(['./view', item.appUserId], { relativeTo: this.ar }); + }, + acl: { ability: ['USERCENTER-FREIGHT-USER-view'] }, + }, + { + text: '冻结', + iif: item => item.stateLocked === 0, + click: (item: any) => this.userAction(0, [item.appUserId]), + acl: { ability: ['USERCENTER-FREIGHT-USER-lock'] }, + }, + { + text: '启用', + iif: item => item.stateLocked === 1, + click: (item: any) => this.userAction(1, [item.appUserId]), + acl: { ability: ['USERCENTER-FREIGHT-USER-lock'] }, + } + ] + } + ]; + } +} diff --git a/src/app/routes/usercenter/less/edit.less b/src/app/routes/usercenter/less/edit.less new file mode 100644 index 00000000..22cfcaf0 --- /dev/null +++ b/src/app/routes/usercenter/less/edit.less @@ -0,0 +1,117 @@ +:host { + ::ng-deep { + sv-title { + font-weight: 700; + } + + + .sv__label, + .sv__detail { + line-height: 30px; + } + + .edit-box { + input { + max-width: 250px; + } + + nz-date-picker { + min-width: 250px; + } + + .calendar { + min-width: 130px; + } + } + + .readOnly-box { + input { + padding-left: 0; + color : #000; + border : 0; + } + + nz-select-top-control { + padding-left: 0px !important; + } + } + + .ant-select { + min-width: 250px; + + nz-select-top-control { + cursor: text !important; + color : #000 !important; + } + } + + // 图片展示工具样式改造 + .ant-upload.ant-upload-disabled { + cursor: pointer; + } + + .ant-upload.ant-upload-select-picture-card { + width : 200px; + height: 160px; + } + + .ant-upload-picture-card-wrapper { + width: auto; + } + } +} + +.image-hover { + .delete-icon { + border-radius : 50%; + color : #F55656; + font-size : 28px; + position : absolute; + top : -15px; + right : -15px; + background-color: #ffffff; + cursor : pointer; + } + + .show-icon { + color : #ffffff; + font-size: 30px; + cursor : pointer; + } +} + +.image-hover:hover .mask { + opacity: 0.8; +} + +.mask { + width : 200px; + height : 160px; + background-color : #4F4F4F; + opacity : 0; + position : absolute; + // top : 6px; + // left : 12px; + border-radius : 6px; + margin-top : -160px; +} + +.mask-over { + width : 200px; + height : 160px; + position : absolute; + // top : 6px; + // left : 12px; + border-radius : 6px; + display : flex; + justify-content : center; + align-items : center; + margin-top : -160px; + + label { + font-size : 20px; + line-height : 24px; + letter-spacing: 0.7px; + color : #FFFFFF; + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/services/usercenter.service.ts b/src/app/routes/usercenter/services/usercenter.service.ts new file mode 100644 index 00000000..db00ea06 --- /dev/null +++ b/src/app/routes/usercenter/services/usercenter.service.ts @@ -0,0 +1,182 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime : 2022-04-09 14:54:17 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\usercenter\\services\\usercenter.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { cacheConf } from '@conf/cache.conf'; +import { _HttpClient } from '@delon/theme'; +import { EACacheService, ShipperBaseService } from '@shared'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +@Injectable({ + providedIn: 'root' +}) +export class UsermanageService extends ShipperBaseService { + // 获取一、二、三级地区详情 + $api_getRegionToThree = '/api/mdc/pbc/region/getRegionToThree'; + // 查询企业列表 + $api_get_freight_list = '/api/mdc/cuc/enterpriseInfo/operate/list/page'; + // 导出企业列表 + $api_export_freight_list = '/api/mdc/cuc/enterpriseInfo/operate/export'; + // 查询企业详情 + $api_get_freight_detail = '/api/mdc/cuc/enterpriseInfo/operate/detail'; + // 查询车队长列表-运营后台 + $api_get_user_expand = '/api/mdc/userDriverExpand/list/page'; + // 添加企业业务员 + $api_add_salesman = '/api/mdc/cuc/enterpriseInfo/operate/addSalesman'; + // 添加货主,司机,车队长业务员 + $api_add_user_salesman = '/api/mdc/cuc/user/addPromoter'; + // 冻结/启用企业业 + $api_lock_freight = '/api/mdc/cuc/enterpriseInfo/operate/lock'; + // 企业审核 + $api_audit_freight = '/api/mdc/cuc/enterpriseInfo/operate/audit'; + // 查询下一个待审核的企业ID + $api_get_next_audit_freight = '/api/mdc/cuc/enterpriseInfo/operate/getNextWaitAuditId'; + + // 查询货主配置列表 + $api_freight_config_page = '/api/mdc/cuc/enterpriseInfo/operate/list/configPage'; + // 导出货主配置列表 + $api_export_freight_config = '/api/mdc/cuc/enterpriseInfo/operate/exportConfig'; + // 更新企业超级管理员权限 + $api_update_enter_role_batch = '/api/mdc/cuc/enterpriseInfo/operate/updateRole'; + // 批量更新企业网络货运人 + $api_update_enter_newowork_batch = '/api/mdc/cuc/enterpriseInfo/operate/updatnNetworkTransporter'; + + // 货主员工列表(运营后台) + $api_get_user_list = '/api/mdc/cuc/userApp/getShipperUserList'; + // 冻结或恢复员工 + $api_lock_staff = '/api/mdc/cuc/userApp/freezeOrResumeStaff'; + // 冻结或恢复应用用户 + $api_lock_app_user = '/api/mdc/cuc/userApp/freezeOrResume'; + // 冻结/启用用户 + $api_lock_user = '/api/mdc/cuc/enterpriseInfo/operate/lock'; + + // 查询司机列表 + $api_get_driver_list = '/api/mdc/cuc/driver/list/page'; + // 根据应用用户id获取用户详情 + $api_get_user_detail = '/api/mdc/cuc/user/getUserDetailByAppUserId'; + // 根据应用用户ID获取身份信息表 + $api_get_user_identity = '/api/mdc/cuc/identityInfo/getIdentityInfoByAppUserId'; + // 司机详情查看-驾驶证 + $api_get_driver_license = '/api/mdc/cuc/driver/getDriversLicense'; + // 司机详情查看-从业资格证信息 + $api_get_driver_practice_seniority = '/api/mdc/cuc/driver/getDriversPracticeSeniority'; + // 司机详情查看-载具信息 + $api_get_driver_car_license = '/api/mdc/cuc/carLicense/getUserCatListByUserIds'; + // 司机详情查看-获取用户关联的企业项目角色信息 + $api_get_driver_projects = '/api/mdc/cuc/user/getEnterpriceProjectInfo'; + + // 根据应用用户ID获取银行信息表 + $api_get_user_bank_list = '/api/fcc/bankInfoOBC/list/page'; + + // 获取服务评级 + $api_get_driver_billEvaluate = '/api/sdc/billEvaluate/getServiceRating'; + // 总评分 + $api_get_freight_billEvaluate = '/api/sdc/billEvaluate/getTotalScore'; + + // 修改实名认证-运营管理后台 + $api_update_driver_identity = '/api/mdc/cuc/identityInfo/operatorAlterIdentity'; + // 修改驾驶证信息 + $api_update_driver_license = '/api/mdc/cuc/driver/updateDriverLicense'; + + // 冻结或恢复应用用户 + $api_lock_or_free_user = '/api/mdc/cuc/userApp/freezeOrResume'; + // 人工审核实名认证 + $api_approve_identity = '/api/mdc/cuc/identityInfo/identityAudit'; + // 审核驾驶证信息 + $api_approve_driver_license = '/api/mdc/cuc/driver/auditDriverLicense'; + + // 查询企业管理员审核信息 + $api_get_enterprise_admin_list = '/api/mdc/cuc/enterpriseAdmin/operate/list/page'; + // 根据主键ID获取企业管理员审核信息 + $api_get_enterprise_user_by_id = '/api/mdc/cuc/enterpriseAdmin/operate/get'; + // 审核企业管理员 + $api_audit_enterprise_admin = '/api/mdc/cuc/enterpriseAdmin/operate/audit'; + // 保存企业信息表 + $api_save_enterprise_admin = '/api/mdc/cuc/enterpriseInfo/operate/save'; + + // 根据地区code查询列表 + $api_get_region_by_code = '/api/mdc/pbc/region/getRegionByCode'; + // 根据地区code查询地区详情 + $api_get_region_detail_by_code = '/api/mdc/pbc/region/getRegionDetailByCode'; + + // 导出企业 + $api_export_enterprise = '/api/mdc/cuc/enterpriseInfo/operate/export'; + // 司机列表导出 + $api_export_driver = '/api/mdc/cuc/driver/export'; + // 车队长导出-运营后台 + $api_export_driver_cap = '/api/mdc/userDriverExpand/export'; + // 司机配置列表导出-运营后台 + $api_driver_exportConfig = '/api/mdc/cuc/driver/exportConfig'; + + // 营业执照识别 + $api_ocr_recognize_business_license = '/api/mdc/pbc/hwc/ocr/recognizeBusinessLicense'; + // 身份证识别 + $api_ocr_recognize_id_card = '/api/mdc/pbc/hwc/ocr/recognizeIdCard'; + // 获取字典 + $api_getDictValue = '/api/mdc/pbc/dictItems/getDictValue'; + // 获取个人刷脸结果 + $api_getFaceFlowQuery = '/api/mdc/pbc/factorsVerify/getFaceFlowQuery'; + + /////////////////// + // 识别身份证 + $api_checkIdCard = '/api/mdc/pbc/hwc/ocr/recognizeIdCard'; + // 从业资格证 + $api_recognizeQualificationCertificate = '/api/mdc/pbc/hwc/ocr/recognizeQualificationCertificate'; + // 驾驶证识别 + $api_recognizeDriverLicense = `/api/mdc/pbc/hwc/ocr/recognizeDriverLicense`; + // 根据地区code查询列表 + $api_getRegionByCode = '/api/mdc/pbc/region/getRegionByCode'; + // 新增熟车 + $api_enterpriseVehicleSave = `/api/mdc/cuc/enterpriseVehicle/save`; + + // 结算单-新增车队长 + $api_saveCaptainr = '/api/mdc/cuc/enterpriseSettleDriver/saveCaptainr'; + // 结算单-车队长详情 + $api_captainrDetail = '/api/mdc/cuc/enterpriseSettleDriver/captainrDetail'; + // 根据手机号码查询结算单司机 + $api_getByMobile = '/api/mdc/cuc/identityInfo/getByMobile'; + + // 添加司机 + $api_driver_add = '/api/mdc/cuc/driver/add'; + // 添加车队长 + $api_saveCaptainr_new = '/api/mdc/userDriverExpand/saveCaptainr'; + + // 查询司机配置列表 + $api_configPage = '/api/mdc/cuc/driver/list/configPage'; + + // 批量修改企业渠道 + $api_batchUpdateEnterpriceChannel = '/api/mdc/enterpriceRelLog/batchUpdateEnterpriceChannel'; + // 批量修改企业合伙人 + $api_batchUpdateEnterpricePartner = '/api/mdc/enterpriceRelLog/batchUpdateEnterpricePartner'; + // 渠道销售修改详情 + $api_partnerChannelUpdateDetaiList = '/api/mdc/enterpriceRelLog/partnerChannelUpdateDetaiList'; + // 查询企业修改合伙人记录 + $api_findEnterpricePartnerRelLog = '/api/mdc/enterpriceRelLog/findEnterpricePartnerRelLog'; + // 查询企业修改渠道记录 + $api_findEnterpriceChannelRelLog = '/api/mdc/enterpriceRelLog/findEnterpriceChannelRelLog'; + // 查询企业合伙人渠道关系信息 + $api_getEnterpriceRel = '/api/mdc/enterpriceRelLog/getEnterpriceRel'; + // 员工列表 + $api_getStaffList = '/api/mdc/cuc/userApp/getStaffList'; + // 分配客服人员 + $api_distributionCusService = '/api/mdc/cuc/enterpriseInfo/operate/distributionCusService'; + + constructor(public injector: Injector, public nzModalService: NzModalService, private nzImageService: NzImageService) { + super(injector); + } + + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } +} diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts new file mode 100644 index 00000000..3034830b --- /dev/null +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -0,0 +1,82 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-11-30 20:36:06 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { CaptainDetailComponent } from './components/driver/captain/captain-detail/captain-detail.component'; +import { UserCenterComponentsDriverCaptainComponent } from './components/driver/captain/captain.component'; +import { UserCenterComponentsDriverDetailComponent } from './components/driver/detail/detail.component'; +import { UserCenterComponentsDriverConfigComponent } from './components/driver/driver-config/driver-config.component'; +import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; +import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; +import { FreightConfigComponent } from './components/freight/freight-config/freight-config.component'; +import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; + +import { FreightComponentsListComponent } from './components/freight/list/list.component'; +import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; +import { FreightComponentsUserDetailComponent } from './components/freight/user/detail/detail.component'; +import { FreightComponentsUserComponent } from './components/freight/user/user.component'; + +const routes: Routes = [ + { path: 'freight/list', component: FreightComponentsListComponent, data: { guard: { ability: ['USERCENTER-FREIGHT-LIST-list'] } } }, + // data: { guard: { ability: ['USERCENTER-FREIGHT-LIST-list'] } } + // { path: 'freight/list/view/:id', component: FreightComponentsListViewComponent }, + { path: 'freight/list/new', component: FreightComponentsListNewComponent, data: { guard: { ability: ['USERCENTER-FREIGHT-NEW-save'] } } }, + { + path: 'freight/list/detail/:id', + component: FreightComponentsListDetailComponent, + data: { guard: { ability: ['USERCENTER-FREIGHT-LIST-DETAIL-view'] } } + }, + { + path: 'freight/enterprise/detail/:id', + component: FreightComponentsListDetailComponent, + data: { guard: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-view'] } } + }, + { + path: 'freight/enterprise', + component: FreightComponentsEnterpriseAuditComponent, + data: { guard: { ability: ['USERCENTER-FREIGHT-ENTERPRISE-list', 'USERCENTER-FREIGHT-ENTERPRISE-adminList'] } } + }, + { + path: 'freight/config', + component: FreightConfigComponent + }, + { path: 'freight/user', component: FreightComponentsUserComponent, data: { guard: { ability: ['USERCENTER-FREIGHT-USER-list'] } } }, + { + path: 'freight/user/view/:id', + component: FreightComponentsUserDetailComponent, + data: { guard: { ability: ['USERCENTER-FREIGHT-USER-D-view'] } } + }, + { path: 'driver', component: UserCenterComponentsDriverComponent, data: { guard: { ability: ['USERCENTER-DRIVER-LIST-list'] } } }, + { + path: 'driver/detail/:id', + component: UserCenterComponentsDriverDetailComponent, + data: { guard: { ability: ['USERCENTER-DRIVER-LIST-DETAIL-view'] } } + }, + { + path: 'driver/captain', + component: UserCenterComponentsDriverCaptainComponent, + data: { guard: { ability: ['USERCENTER-DRIVER-CAPTAIN-list'] } } + }, + { + path: 'driver/captain/detail/:id', + component: CaptainDetailComponent, + data: { guard: { ability: ['USERCENTER-DRIVER-CAPTAIN-DETAIL-view'] } } + }, + { + path: 'driver/config', + component: UserCenterComponentsDriverConfigComponent, + data: { guard: { ability: ['USERCENTER-DRIVER-CAPTAIN-list'] } } + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class UsercenterRoutingModule {} diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts new file mode 100644 index 00000000..e8f55744 --- /dev/null +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -0,0 +1,56 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-11-30 20:35:42 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts + */ +import { NgModule } from '@angular/core'; +import { DynamicSettingModule, SharedModule } from '@shared'; +import { UserCenterComponentsDriverCaptainComponent } from './components/driver/captain/captain.component'; +import { UserCenterComponentsDriverDetailComponent } from './components/driver/detail/detail.component'; +import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; +import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; +import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; +import { FreightComponentsListComponent } from './components/freight/list/list.component'; +import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; +import { FreightComponentsUserDetailComponent } from './components/freight/user/detail/detail.component'; +import { FreightComponentsUserComponent } from './components/freight/user/user.component'; +import { UsercenterRoutingModule } from './usercenter-routing.module'; +import { AuditAdminComponent } from './components/freight/enterprise-audit/audit-admin/audit-admin.component'; +import { CaptainDetailComponent } from './components/driver/captain/captain-detail/captain-detail.component'; +import { CarSettleAddDriverComponent } from './components/driver/add-driver/add-driver.component'; +import { CtcCaptatinAddComponent } from './components/driver/captain/add/add.component'; +import { FreightConfigComponent } from './components/freight/freight-config/freight-config.component'; +import { UserCenterComponentsDriverConfigComponent } from './components/driver/driver-config/driver-config.component'; +import { ShowServiceComponent } from './components/freight/list/showService/showservice.component'; +import { EditPartnerComponentsAddComponent } from './components/freight/list/editPartner/editPartner.component'; +import { EditSaleComponentsAddComponent } from './components/freight/list/editSale/editSale.component'; + +const COMPONENTS = [ + FreightComponentsListComponent, + // FreightComponentsListViewComponent, + FreightComponentsListNewComponent, + FreightComponentsListDetailComponent, + FreightComponentsEnterpriseAuditComponent, + // FreightComponentsEnterpriseAuditViewComponent, + FreightComponentsUserComponent, + FreightComponentsUserDetailComponent, + UserCenterComponentsDriverComponent, + UserCenterComponentsDriverDetailComponent, + UserCenterComponentsDriverCaptainComponent, + CaptainDetailComponent, + AuditAdminComponent, + CarSettleAddDriverComponent, + CtcCaptatinAddComponent, + FreightConfigComponent, + UserCenterComponentsDriverConfigComponent +]; +const COMPONENTS_NOROUNT = [ShowServiceComponent, EditPartnerComponentsAddComponent, EditSaleComponentsAddComponent]; + +@NgModule({ + imports: [SharedModule, UsercenterRoutingModule, DynamicSettingModule], + declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT] +}) +export class UsercenterModule {} diff --git a/src/app/routes/vehicle/components/audit/audit.component.html b/src/app/routes/vehicle/components/audit/audit.component.html new file mode 100644 index 00000000..2b2bfb44 --- /dev/null +++ b/src/app/routes/vehicle/components/audit/audit.component.html @@ -0,0 +1,79 @@ + + + + + + +
    + +
    + + +
    + + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + + + +
    {{item?.carModelLabel}}-{{item?.carLengthLabel? item?.carLengthLabel + '米' : ''}}-{{ item?.carLoad? + item?.carLoad + '吨' : ''}}
    +
    + +
    {{item?.isSelf ? '是' : '否'}}
    +
    + +
    + {{ item.contactsPhone }} +
    +
    + + 冻结 + 正常 + +
    +
    + + +
    + +
    +
    diff --git a/src/app/routes/vehicle/components/audit/audit.component.spec.ts b/src/app/routes/vehicle/components/audit/audit.component.spec.ts new file mode 100644 index 00000000..e815b19d --- /dev/null +++ b/src/app/routes/vehicle/components/audit/audit.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-12-01 20:05:59 + * @LastEditTime: 2021-12-01 20:35:33 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\vehicle\components\list\list.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { VehicleComponentsListComponent } from './list.component'; + +describe('VehicleComponentsListComponent', () => { + let component: VehicleComponentsListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VehicleComponentsListComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VehicleComponentsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/audit/audit.component.ts b/src/app/routes/vehicle/components/audit/audit.component.ts new file mode 100644 index 00000000..95ad7e8b --- /dev/null +++ b/src/app/routes/vehicle/components/audit/audit.component.ts @@ -0,0 +1,259 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of, Subject } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VehicleService } from '../../../vehicle/services/vehicle.service'; +import { CarSettleCarauthComponent } from '../list/carauth/carauth.component'; +@Component({ + selector: 'app-Vehicle-components-audit', + templateUrl: './audit.component.html' +}) +export class VehicleComponentsAuditComponent implements OnInit { + _$expand = false; + resourceStatus: any = 1; + defaultTabs = 1; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor( + public service: VehicleService, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + private modalHelper: ModalHelper + ) {} + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus === 1) { + a.approvalStatus = 10; + } else if (this.resourceStatus === 2) { + a.approvalStatus = 20; + } else if (this.resourceStatus === 3) { + a.approvalStatus = 30; + } + return { + ...a, + ...this.sf?.value + }; + } + + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + if (!!q) { + return this.service + .request(this.service.$api_get_getCarLicenseListByCarNo_audit, { + carNo: q + }) + .pipe(map((res: any) => (res?.records as any[]).map(i => ({ label: i.carNo, value: i.carNo } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + carNoColor: { + type: 'string', + title: '车牌颜色', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:color' }, + containsAllLabel: true + } + }, + isSelf: { + type: 'string', + title: '是否挂靠', + enum: [ + { label: '是', value: 1 }, + { label: '否', value: 0 } + ], + ui: { + widget: 'select', + allowClear: true + } + }, + saveUser: { + type: 'string', + title: '录入人员', + ui: { + visibleIf: { + expand: (value: boolean) => value + } + } + }, + // approvalStatus: { + // type: 'string', + // title: '审核状态', + // enum: [ + // { label: '未提交', value: '-1' }, + // { label: '草稿', value: 0}, + // { label: '待审核', value: 10 }, + // { label: '审核通过', value: 20 }, + // { label: '驳回', value: 30 }, + // { label: '证件过期', value: 40 }, + // ], + // default: '', + // ui: { + // widget: 'select', + // visibleIf: { + // expand: (value: boolean) => value, + // }, + // }, + // }, + // approvalPassTime: { + // type: 'string', + // title: '审核通过时间', + // ui: { + // widget: 'sl-from-to-search', + // format: 'yyyy-MM-dd', + // placeholder: '请选择', + // nzShowTime: true, + // visibleIf: { + // expand: (value: boolean) => value + // } + // } as SFDateWidgetSchema + // } + } + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '车牌号', width: '180px', className: 'text-center', index: 'carNo' }, + { title: '车牌颜色', width: '180px', className: 'text-center', index: 'carNoColorLabel' }, + { title: '车型-车长-载重', width: '180px', className: 'text-center', render: 'carLength' }, + { title: '是否挂靠', width: '180px', className: 'text-center', render: 'isSelf' }, + { title: '所有人', width: '180px', className: 'text-center', index: 'carOwner' }, + { title: '录入人员', width: '180px', className: 'text-center', index: 'saveUser' }, + { + title: '审核状态', + className: 'text-center', + index: 'approvalStatus', + width: '180px', + type: 'badge', + badge: { + '-1': { text: '未上传', color: 'default' }, + 0: { text: '草稿', color: 'warning' }, + 15: { text: '已撤销', color: 'warning' }, + 10: { text: '待审核', color: 'warning' }, + 20: { text: '已审核', color: 'success' }, + 30: { text: '已驳回', color: 'error' }, + 40: { text: '证件过期', color: 'error' } + } + }, + { title: '申请时间', width: '180px', className: 'text-center', index: 'createTime' }, + { title: '审核通过时间', width: '180px', className: 'text-center', index: 'approvalPassTime' }, + { + title: '操作', + fixed: 'right', + width: '100px', + className: 'text-center', + buttons: [ + { + text: '查看', + acl: { ability: ['VEHICLE-AUDIT-view'] }, + click: item => { + this.router.navigate(['./detail', item.id], { relativeTo: this.ar, queryParams: { carId: item.carId } }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + } + } + ] + } + ]; + } + selectChange(e: number) { + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); + } + daoyun(item: any) { + this.router.navigate(['./view', item], { relativeTo: this.ar }); + } + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new'], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + // 导出 + exportFire() { + let params = Object.assign({}, this.reqParams || {}); + params.pageSize = -1; + this.service.exportStart(params, this.service.$api_carLicenseAudit_export); + } + addModal() { + const i = { + appUserId: '' + }; + this.modalHelper.create(CarSettleCarauthComponent, { i }, { size: 900 }).subscribe(res => { + this.st.load(); + }); + } +} diff --git a/src/app/routes/vehicle/components/audit/detail/detail.component.html b/src/app/routes/vehicle/components/audit/detail/detail.component.html new file mode 100644 index 00000000..1bda3ea9 --- /dev/null +++ b/src/app/routes/vehicle/components/audit/detail/detail.component.html @@ -0,0 +1,245 @@ + + + + + + + +

    车牌号:{{detailData?.carNo}}

    + + 未上传 + 草稿 + 待审核 + 已审核 + 已驳回 + 证件过期 +
    + + + + + + + + + +
    +
    + + {{ detailData?.createTime }} + + + {{ detailData?.saveUser }} + +
    +
    +
    + + + + + 车辆基础信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 行驶证信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 道路运输证信息 + + + + + + + + + + + + + + + + + + + + + + 认证司机 + + + +
    + 未上传 + 草稿 + 待审核 + 已审核 + 已驳回 + 证件过期 +
    +
    +
    +
    + + + +
    +
    + + {{ detailData?.carNo }} + + + + +
    +
    +
    + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/vehicle/components/audit/detail/detail.component.less b/src/app/routes/vehicle/components/audit/detail/detail.component.less new file mode 100644 index 00000000..e2c82609 --- /dev/null +++ b/src/app/routes/vehicle/components/audit/detail/detail.component.less @@ -0,0 +1,142 @@ +:host { + ::ng-deep { + + .sv__label, + .sv__detail { + line-height: 30px; + } + + .edit-box { + input { + max-width: 250px; + } + + nz-date-picker { + min-width: 250px; + } + } + + .readOnly-box { + input { + padding-left: 0; + color : #000; + } + + nz-select-top-control { + padding-left: 0 !important; + } + } + + .ant-select { + min-width: 250px; + + nz-select-top-control { + color : #000 !important; + cursor: text !important; + } + } + + // 图片展示工具样式改造 + .ant-upload.ant-upload-disabled { + cursor: pointer; + } + + .ant-upload.ant-upload-select-picture-card { + width : 200px; + height: 160px; + } + + .ant-upload-picture-card-wrapper { + width: auto; + } + } +} + +.image-hover { + .delete-icon { + position : absolute; + top : -15px; + right : -15px; + color : #F55656; + font-size : 28px; + background-color: #fff; + border-radius : 50%; + cursor : pointer; + } + + .show-icon { + color : #fff; + font-size: 30px; + cursor : pointer; + } +} + +.image-hover:hover .mask { + opacity: 0.8; +} + +.mask { + position : absolute; + width : 200px; + height : 160px; + margin-top : -160px; + background-color : #4F4F4F; + // top : 6px; + // left : 12px; + border-radius : 6px; + opacity : 0; +} + +.mask-over { + position : absolute; + display : flex; + align-items : center; + justify-content : center; + width : 200px; + height : 160px; + margin-top : -160px; + // top : 6px; + // left : 12px; + border-radius : 6px; + + label { + color : #FFF; + font-size : 20px; + line-height : 24px; + letter-spacing: 0.7px; + } +} + +input { + width: 200px; +} + +.sv__container { + padding-top: 10px; +} + +::ng-deep { + .affix { + position: fixed; + top : 20px !important; + right : 25px; + left : 25px; + z-index : 999 !important; + } + + .alain-pro__menu-side .alain-pro__main { + .affix { + position: fixed; + top : 20px !important; + right : 25px; + left : 250px; + z-index : 999 !important; + } + } + + .aside-collapsed.alain-pro__menu-side .alain-pro__main { + .affix { + left: 106px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/vehicle/components/audit/detail/detail.component.spec.ts b/src/app/routes/vehicle/components/audit/detail/detail.component.spec.ts new file mode 100644 index 00000000..df98f9ac --- /dev/null +++ b/src/app/routes/vehicle/components/audit/detail/detail.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 20:19:08 + * @LastEditTime: 2021-12-13 09:58:36 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { VehicleComponentsAuditDetailComponent } from './detail.component'; + +describe('VehicleComponentsAuditDetailComponent', () => { + let component: VehicleComponentsAuditDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VehicleComponentsAuditDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VehicleComponentsAuditDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/audit/detail/detail.component.ts b/src/app/routes/vehicle/components/audit/detail/detail.component.ts new file mode 100644 index 00000000..d870e234 --- /dev/null +++ b/src/app/routes/vehicle/components/audit/detail/detail.component.ts @@ -0,0 +1,276 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { VehicleService } from '../../../services/vehicle.service'; +// import { VehicleComponentsListEditComponent } from '../edit/edit.component'; +// import { VehicleImgViewComponent } from '../img-view/img-view.component'; +import { EADateUtil } from '@shared'; +import { VehicleImgViewComponent } from '../../list/img-view/img-view.component'; +import { VehicleComponentsListEditComponent } from '../../list/edit/edit.component'; +import { NzImageService } from 'ng-zorro-antd/image'; +import { fromEvent, Subscription } from 'rxjs'; + +@Component({ + selector: 'app-Vehicle-components-Audit-detail', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'] +}) +export class VehicleComponentsAuditDetailComponent implements OnInit, OnDestroy { + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('redectModal', { static: false }) redectModal!: any; + columns!: STColumn[]; + detailData: any = this.initData(); + tempalateData: any; + contenCarNoColor: any; + contencarModel: any; + contenCarLength: any; + isEdit = false; + approvalOpinion = ''; + uploadURl = apiConf.waterFileUpload; + disabledUpload = false; + + + scrollTop = 0; + subscribeScoll!: Subscription; + constructor( + public service: VehicleService, + private route: ActivatedRoute, + private nzModalService: NzModalService, + private modal: ModalHelper, + private nzImageService: NzImageService + ) {} + ngOnDestroy(): void { + this.subscribeScoll.unsubscribe(); + } + + ngOnInit() { + this.getSelectList(); + this.getDetailList(); + this.initST(); + this.subscribeScoll = fromEvent(window, 'scroll').subscribe(event => { + this.scrollTop = document.documentElement.scrollTop; + }); + } + + initST() { + this.columns = [ + { title: '司机姓名', index: 'name', className: 'text-center' }, + { title: '司机手机号', index: 'mobile', className: 'text-center' }, + { title: '身份证号', index: 'idCardNo', className: 'text-center' }, + { title: '挂靠协议', render: 'auditStatusEnum', className: 'text-center' }, + { + title: '车主申明/挂靠协议', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '查看协议', + click: _record => this.viewEvaluate(_record), + iif: item => item.auditStatusEnum == 10 || item.auditStatusEnum == 20 + }, + { + text: '上传协议', + click: _record => this.updateEvaluate(_record), + iif: item => item.auditStatusEnum == -1 + } + ] + } + ]; + } + + getDetailList() { + const params = { + id: this.route.snapshot?.params?.id + }; + this.service.request(`${this.service.$api_get_operate_getaudit}`, params).subscribe(res => { + this.detailData = res; + this.tempalateData = res; + }); + } + + approveDriver() { + this.nzModalService.confirm({ + nzTitle: '审核通过', + nzContent: `

    车牌号:${this.detailData?.carNo}

    是否确认通过审核`, + nzOnOk: () => { + this.adjuctUser( + { + approvalStatus: 20, + id: this.route.snapshot?.params?.id + }, + '审核成功' + ); + } + }); + } + + rejectedDriver() { + this.approvalOpinion = ''; + this.nzModalService.create({ + nzTitle: '审核驳回', + nzContent: this.redectModal, + nzOnOk: () => { + if (!this.approvalOpinion) { + this.service.msgSrv.error('请填写备注!') + return false; + } + this.adjuctUser( + { + id: this.route.snapshot?.params?.id, + approvalStatus: 30, + approvalOpinion: this.approvalOpinion + }, + '审核驳回成功' + ); + return; + } + }); + } + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save() { + this.detailData.driverLicenseRegisterTime = EADateUtil.yearToDate(this.detailData?.driverLicenseRegisterTime); + + this.detailData.driverLicenseEndTime = EADateUtil.yearToDate(this.detailData?.driverLicenseEndTime); + + this.detailData.driverLicenseGetTime = EADateUtil.yearToDate(this.detailData?.driverLicenseGetTime); + + this.detailData.roadTransportStartTime = EADateUtil.yearToDate(this.detailData?.roadTransportStartTime); + + this.detailData.roadTransportEndTime = EADateUtil.yearToDate(this.detailData?.roadTransportEndTime); + console.log(this.detailData.roadTransportStartTime) + if((this.detailData.roadTransportStartTime > this.detailData.roadTransportEndTime) || (this.detailData.driverLicenseRegisterTime > this.detailData.driverLicenseEndTime)) { + this.service.msgSrv.error('发证日期起始不能大于结束日期!') + return; + } + this.service.request(this.service.$api_get_update_audit, this.detailData).subscribe(res => { + if (res) { + this.getDetailList(); + this.isEdit = false; + this.service.msgSrv.success('修改成功!'); + } + }); + } + + ratify() { + this.isEdit = true; + } + + changeUpload({ file, fileList, type }: any, key: string) { + if (type === 'success') { + this.detailData[key] = file.response.data.fullFileWatermarkPath; + } + } + + goBack() { + window.history.go(-1); + } + /** + * 查询参数 + */ + get reqParams() { + return { id: this.route.snapshot.queryParams.carId }; + } + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + deleteImg(key: string) { + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + this.detailData[key] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + + private adjuctUser(params: any, msg: string) { + this.service.request(this.service.$api_get_operate_audit, { ...params }).subscribe(res => { + if (res) { + this.service.msgSrv.success(msg); + } + this.getDetailList(); + }); + } + + private initData() { + return { + carNo: '', + carNoColor: '', + carModel: '', + carLength: '', + archivesNo: '', + driverLicenseSigningOrg: '', + carDistinguishCode: '', + carLoad: '', + curbWeight: '', + roadTransportNo: '', + roadTransportLicenceNo: '', + carOwner: '', + isTrailer: null, + useNature: null, + driverLicenseRegisterTime: null, + driverLicenseGetTime: null, + driverLicenseEndTime: null, + roadTransportStartTime: null, + roadTransportEndTime: null, + carFrontPhotoWatermark: '' + }; + } + // 获取录单员 + getSelectList() { + this.Serveice('car:color'); + this.Serveice('car:model'); + this.Serveice('car:length'); + } + Serveice(param: any) { + let value: any; + this.service + .request(`${this.service.$api_get_getDictValue}`, { + dictKey: param + }) + .subscribe(res => { + if (param === 'car:color') { + this.contenCarNoColor = res; + } else if (param === 'car:model') { + this.contencarModel = res; + } else if (param === 'car:length') { + this.contenCarLength = res; + } + }); + return value; + } + viewEvaluate(item: any) { + this.modal.createStatic(VehicleImgViewComponent, { i: item }).subscribe(i => { + this.st.reload(); + this.getDetailList(); + }); + } + updateEvaluate(item: any) { + this.modal.createStatic(VehicleComponentsListEditComponent, { i: item }).subscribe(i => { + this.st.reload(); + this.getDetailList(); + }); + } +} diff --git a/src/app/routes/vehicle/components/list/carauth/carauth.component.html b/src/app/routes/vehicle/components/list/carauth/carauth.component.html new file mode 100644 index 00000000..9eda46b1 --- /dev/null +++ b/src/app/routes/vehicle/components/list/carauth/carauth.component.html @@ -0,0 +1,47 @@ + +

    + +
    + + +
    +
    +
    行驶证首页
    +
    示例
    +
    +
    +
    +
    + +
    +
    +
    行驶证副页
    +
    示例
    +
    +
    +
    +
    + + + + + + +
    + + + \ No newline at end of file diff --git a/src/app/routes/vehicle/components/list/carauth/carauth.component.less b/src/app/routes/vehicle/components/list/carauth/carauth.component.less new file mode 100644 index 00000000..ee4cb587 --- /dev/null +++ b/src/app/routes/vehicle/components/list/carauth/carauth.component.less @@ -0,0 +1,129 @@ +.sfBox { + position: relative; + .example { + position: absolute; + top: 215px; + right: 265px; + color: #1890ff; + cursor: pointer; + .popBox { + position: absolute; + top: -170px; + left: -125px; + width: 300px; + padding: 20px; + text-align: center; + background: #fff; + border: solid 1px #eee; + border-radius: 6px; + box-shadow: 0 1px 5px 1px #ececec; + &::before { + position: absolute; + bottom: -5px; + left: 50%; + width: 10px; + height: 10px; + margin-left: -5px; + background: #fff; + box-shadow: 0 1px 5px 1px #ececec; + transform: rotate(45deg); + content: ''; + } + &::after { + position: absolute; + bottom: 0; + left: 0; + z-index: 10; + width: 100%; + height: 10px; + background: #fff; + content: ''; + } + img { + max-width: 100%; + max-height: 200px; + } + } + } + .positionSet{ + top: 356px; + right: 235px; + } + .positionSet01{ + top: 500px; + right: 200px; + } + .positionSet02{ + top: 664px; + right: 265px; + } + .positionSet03{ + top: 808px; + right: 205px; + + } +} +.exaA{ + position: absolute; + top: 0; + left: 300px +} +.pr { + position: relative; +} + +.pa { + position: absolute; + top: 35px; + left: 140px; +} + +.tips { + display: flex; + margin-bottom: 0; + color: #333; + + dt { + width: 150px; + } + + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } +} +.drivercard{ + position: absolute; + top: 0; + left: 325px; + border: solid 1px #ebf0fb; +} +.jopcard{ + position: absolute; + top: 1356px; + left: 330px; + border: solid 1px #ebf0fb; +} +.agreement{ + position: absolute; + top: 425px; + left: 330px; + border: solid 1px #ebf0fb; +} +:host{ + ::ng-deep { + .ant-input-borderless{ + padding: 0; + padding-top: 4px; + color: black; + resize:none; + } + .setCustom .ant-form-item-control{ + margin-left: -100px !important + } + .borderImg{ + border: solid 1px #ebf0fb; + } + } +} \ No newline at end of file diff --git a/src/app/routes/vehicle/components/list/carauth/carauth.component.spec.ts b/src/app/routes/vehicle/components/list/carauth/carauth.component.spec.ts new file mode 100644 index 00000000..3d248eed --- /dev/null +++ b/src/app/routes/vehicle/components/list/carauth/carauth.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CarSettleCarauthComponent } from './carauth.component'; + +describe('CarSettleCarauthComponent', () => { + let component: CarSettleCarauthComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ CarSettleCarauthComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CarSettleCarauthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/list/carauth/carauth.component.ts b/src/app/routes/vehicle/components/list/carauth/carauth.component.ts new file mode 100644 index 00000000..49342fda --- /dev/null +++ b/src/app/routes/vehicle/components/list/carauth/carauth.component.ts @@ -0,0 +1,729 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { cacheConf } from '@conf/cache.conf'; +import { SFUISchema, SFSchema, SFUploadWidgetSchema, SFComponent, SFSelectWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { EACacheService, EAEnvironmentService } from '@shared'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { NzUploadFile } from 'ng-zorro-antd/upload'; +import { Observable, Observer, of } from 'rxjs'; +import { VehicleService } from '../../../services/vehicle.service'; + +@Component({ + selector: 'app-car-carauth', + templateUrl: './carauth.component.html', + styleUrls: ['./carauth.component.less'] +}) +export class CarSettleCarauthComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + ui: SFUISchema = {}; + schema: SFSchema = {}; + showCardFlag = false; + showJopFlag = false; + companyData: any = {}; + detailData: any = {}; + carNo = '' + + constructor( + private modal: NzModalRef, + public service: VehicleService, + private envSrv: EAEnvironmentService, + private eaCacheSrv: EACacheService, + ) { } + + ngOnInit(): void { + this.initData() + this.initSF() + } + initData() { + if (this.i.id) { + this.companyData = this.eaCacheSrv.get(cacheConf.env) + const params = { + id: this.i.id, + } + this.service.request(this.service.$api_shipperCarGet, params).subscribe(res => { + this.detailData = res + this.detailData.isSelf = res.isSelf ? 1 : 0 + this.detailData.isTrailer = res.isTrailer ? 1 : 0 + this.detailData.carFrontPhotoWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.carFrontPhotoWatermark, + response: this.detailData.carFrontPhotoWatermark, + }, + ]; + this.detailData.carProtocalWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.carProtocalWatermark, + response: this.detailData.carProtocalWatermark, + }, + ]; + this.detailData.certificatePhotoFrontWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.certificatePhotoFrontWatermark, + response: this.detailData.certificatePhotoFrontWatermark, + }, + ]; + this.detailData.certificatePhotoBackWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.certificatePhotoBackWatermark, + response: this.detailData.certificatePhotoBackWatermark, + }, + ]; + this.detailData.roadTransportPhotoWatermark = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: this.detailData.roadTransportPhotoWatermark, + response: this.detailData.roadTransportPhotoWatermark, + }, + ]; + }) + } + } + initSF() { + this.schema = { + properties: { + carFrontPhotoWatermark: { + type: 'string', + title: '车头照照片', + ui: { + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传车头照照片,支持JPG、PNG格式,文件小于5M。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + console.log(args); + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/carFrontPhotoWatermark', avatar); + this.detailData.carFrontPhoto = args.file.response.data.fullFilePath + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + console.log(_fileList) + + observer.next(isLt2M); + observer.complete(); + }); + }, + // previewFile: (file: NzUploadFile) => of( + // file?.response?.data?.fullFilePath + // ), + } + }, + carNo: { + title: '车牌号', + maxLength: 9, + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + carNoColor: { + title: '车牌颜色', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:color' }, + placeholder: '请选择车牌颜色', + containsAllLabel:false, + } as SFSelectWidgetSchema, + }, + carModel: { + title: '车型', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:model' }, + placeholder: '请选择车型', + containsAllLabel:false, + } as SFSelectWidgetSchema, + }, + carLength: { + title: '车长', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:length' }, + placeholder: '请选择车长', + containsAllLabel:false, + } as SFSelectWidgetSchema, + }, + carLoad: { + title: '载重', + type: 'string', + maxLength: 6, + ui: { + placeholder: '请输入', + addOnAfter: '吨', + change: (val: any) =>{ + const value = val.replace(/\D/g,'') + this.sf.setValue('/carLoad', value) + }, + } + }, + isSelf: { + title: '是否挂靠', + type: 'string', + enum: [ + { label: '否', value: 0 }, + { label: '是', value: 1 }, + ], + ui: { + widget: 'select', + placeholder: '请选择', + } + }, + isTrailer: { + title: '是否为挂车', + type: 'string', + enum: [ + { label: '否', value: 0 }, + { label: '是', value: 1 }, + ], + ui: { + widget: 'select', + placeholder: '请选择', + } + }, + carProtocalWatermark: { + type: 'string', + title: '挂靠协议', + ui: { + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传挂靠协议,支持JPG、PNG格式,文件小于5M。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/carProtocalWatermark', avatar); + this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + previewFile: (file: NzUploadFile) => of(file.url), + } + }, + agreeImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + titleA: { + title: '行驶证信息(必填)', + type: 'string', + ui: { + widget: 'text', + }, + default: '照片上传后会自动识别文字并填充下列内容栏', + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFrontWatermark: { + type: 'string', + title: '行驶证首页照片', + ui: { + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传行驶证首页照片,支持JPG、PNG格式,文件小于5M。照片信息缺失、拼凑、过度PS、模糊不清,都不会通过审核。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoFrontWatermark', avatar); + this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath + this.checkCarCard(args.file.response.data.fullFilePath, 'front'); + } else { + this.detailData.certificatePhotoFront = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBackWatermark: { + type: 'string', + title: '行驶证副页照片', + ui: { + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传行驶证副业照片,支持JPG、PNG格式,文件小于5M。', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/certificatePhotoBackWatermark', avatar); + this.detailData.certificatePhotoBack = args.file.response.data.fullFilePath + this.checkCarCard(args.file.response.data.fullFilePath, 'back'); + } else { + this.detailData.certificatePhotoBack = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + driverLicenseRegisterTime: { + title: '行驶证注册日期', + type: 'string', + format: 'date', + ui: { + placeholder: '请输入', + }, + }, + driverLicenseGetTime: { + title: '行驶证发证日期', + type: 'string', + format: 'date', + ui: { + placeholder: '请输入', + }, + }, + driverLicenseEndTime: { + title: '行驶证到期日期', + type: 'string', + format: 'date', + maxLength: 30, + ui: { + placeholder: '请输入', + }, + }, + driverLicenseSigningOrg: { + title: '行驶证签发机关', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入', + }, + }, + carDistinguishCode: { + title: '车辆识别代码', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入', + }, + }, + useNature: { + title: '使用性质', + type: 'string', + maxLength: 30, + enum: [ + { label: '非营运', value: 0 }, + { label: '营运', value: 1 }, + ], + ui: { + widget: 'select', + placeholder: '请选择', + }, + }, + curbWeight: { + title: '整备质量', + type: 'string', + ui: { + placeholder: '请输入', + }, + }, + carOwner: { + title: '所有人', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入', + }, + }, + titleB: { + title: '道运证(选填)', + type: 'string', + ui: { + widget: 'text', + }, + default: '照片上传后会自动识别文字并填充下列内容栏', + }, + roadTransportPhotoWatermark: { + type: 'string', + title: '道运证照片', + ui: { + action: apiConf.waterFileUpload, + accept: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + widget: 'upload', + descriptionI18n: '请上传道运证照片,支持JPG、PNG格式,文件小于5M。蓝牌绿牌车辆,可不用传道运证', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.file.response.data.fullFileWatermarkPath, + response: { + url: args.file.response.data.fullFileWatermarkPath, + }, + }, + ]; + this.sf?.setValue('/roadTransportPhotoWatermark', avatar); + this.detailData.roadTransportPhoto = args.file.response.data.fullFilePath + this.checkTransCard(args.file.response.data.fullFilePath); + } else { + this.detailData.roadTransportPhoto = '' + } + }, + beforeUpload: (file: any, _fileList: any) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + // previewFile: (file: NzUploadFile) => of(file.url), + } + }, + roadImg: { + title: '', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'custom', + } + }, + roadTransportNo: { + title: '道运证号码', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入', + }, + }, + roadTransportLicenceNo: { + title: '经营许可证号', + type: 'string', + maxLength: 30, + ui: { + // widget: this.detailData.commitFlag !== 0 ? 'text' : '', + placeholder: '请输入', + }, + }, + roadTransportStartTime: { + title: '发证日期', + type: 'string', + format: 'date', + ui: { + placeholder: '请输入', + }, + }, + roadTransportEndTime: { + title: '有效期至', + type: 'string', + format: 'date', + ui: { + placeholder: '请输入', + }, + }, + }, + required: [ + 'carFrontPhotoWatermark', + 'carNo', + 'carNoColor', + 'carModel', + 'carLength', + 'carLoad', + 'isSelf', + 'isTrailer', + 'certificatePhotoFrontWatermark', + 'certificatePhotoBackWatermark', + 'driverLicenseRegisterTime', + 'driverLicenseGetTime', + 'driverLicenseEndTime', + 'driverLicenseSigningOrg', + 'carDistinguishCode', + 'useNature', + 'carOwner' + ], + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 18 }, + width: 600, + }, + $title1: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $isTrailer:{ + grid: { span: 24 }, + }, + $carProtocalWatermark: { + grid: { span:12 }, + }, + $agreeImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + $titleB:{ + grid: { span: 24 }, + }, + $roadTransportPhotoWatermark: { + grid: { span: 12 }, + }, + $roadImg: { + grid: { span: 4 }, + class: 'setCustom' + }, + + }; + } + // 道路运输证识别 + checkTransCard(imgurl: any) { + const params = { + transportationLicenseUrl: imgurl, + }; + this.service.request(this.service.$api_recognizeTransportationLicense, params).subscribe((res: any) => { + if (res) { + this.sf.setValue('/roadTransportNo', res.number); + this.sf.setValue('/roadTransportLicenceNo', res.businessCertificate); + this.sf.setValue('/roadTransportStartTime', res.issueDate); + if(this.carNo === '') { + this.carNo = res.number + } else if(this.carNo && res.vehicleNumber.indexOf(this.carNo) === -1) { + this.service.msgSrv.warning('请上传同一认证车辆的相关证件') + } + } + }); + } + // 行驶证识别 + checkCarCard(imgurl: any, side: any) { + const params = { + vehicleLicenseUrl: imgurl, + side, + }; + this.service.request(this.service.$api_recognizeVehicleLicense, params).subscribe((res: any) => { + if (res) { + if (side === 'front') { // 正面 + this.sf.setValue('/driverLicenseRegisterTime', res.registerDate); + this.sf.setValue('/carNo', res.number); + this.sf.setValue('/driverLicenseGetTime', res.issueDate); + this.sf.setValue('/driverLicenseSigningOrg', res.issuingAuthority); + this.sf.setValue('/carDistinguishCode', res.vin); + this.sf.setValue('/carOwner', res.name); + this.sf.setValue('/useNature', res.useCharacter === '非营运' ? 0 : 1); + + } else { + this.sf.setValue('/curbWeight', res.unladenMass); + } + if(this.carNo === '') { + this.carNo = res.number + } else if(this.carNo && this.carNo !== res.number) { + this.service.msgSrv.warning('请上传同一认证车辆的相关证件') + } + } + }); + } + + close(): void { + this.modal.close(true); + } + showExample() { + this.showCardFlag = !this.showCardFlag + } + showJopExample() { + this.showJopFlag = !this.showJopFlag + } + submitForm() { + const params: any = { + appUserId: this.i.appUserId, + ...this.sf.value, + bindType: this.i.bindType + }; + params.carFrontPhoto = this.detailData.carFrontPhoto + params.carProtocal = this.detailData.carProtocal + params.certificatePhotoFront = this.detailData.certificatePhotoFront + params.certificatePhotoBack = this.detailData.certificatePhotoBack + params.roadTransportPhoto = this.detailData.roadTransportPhoto + delete params.titleA + delete params.titleB + console.log(params); + + this.service.request(this.service.$api_saveUpdateShipperCar, params).subscribe((res: any) => { + if (res) { + this.service.msgSrv.success('添加成功') + this.modal.close(true) + } + }) + } +} diff --git a/src/app/routes/vehicle/components/list/detail/detail.component.html b/src/app/routes/vehicle/components/list/detail/detail.component.html new file mode 100644 index 00000000..56a65d87 --- /dev/null +++ b/src/app/routes/vehicle/components/list/detail/detail.component.html @@ -0,0 +1,254 @@ + + + + + + + + + +
    + + + + + + + +
    +
    +
    + + + 车辆基础信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + 行驶证信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 道路运输证信息 + + + + + + + + + + + + + + + + + + + + + + + + + 认证司机 + + + +
    + 未上传 + 草稿 + 待审核 + 已审核 + 已驳回 + 证件过期 +
    +
    +
    +
    +
    + + + + + +
    + 评分: +
    评价内容:
    +
    +
    + +
    + 暂无评价内容 +
    +
    +
    +
    + + + + +
    + + + + + +
    上传
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/vehicle/components/list/detail/detail.component.less b/src/app/routes/vehicle/components/list/detail/detail.component.less new file mode 100644 index 00000000..a472c0b0 --- /dev/null +++ b/src/app/routes/vehicle/components/list/detail/detail.component.less @@ -0,0 +1,115 @@ +:host { + ::ng-deep { + + .sv__label, + .sv__detail { + line-height: 30px; + } + + .edit-box { + input { + max-width: 250px; + } + + nz-date-picker { + min-width: 250px; + } + } + + .readOnly-box { + input { + padding-left: 0; + color : #000; + } + + nz-select-top-control { + padding-left: 0 !important; + } + } + + .ant-select { + min-width: 250px; + + nz-select-top-control { + color : #000 !important; + cursor: text !important; + } + } + + // 图片展示工具样式改造 + .ant-upload.ant-upload-disabled { + cursor: pointer; + } + + .ant-upload.ant-upload-select-picture-card { + width : 200px; + height: 160px; + } + + .ant-upload-picture-card-wrapper { + width: auto; + } + } +} + +.image-hover { + .delete-icon { + position : absolute; + top : -15px; + right : -15px; + color : #F55656; + font-size : 28px; + background-color: #fff; + border-radius : 50%; + cursor : pointer; + } + + .show-icon { + color : #fff; + font-size: 30px; + cursor : pointer; + } +} + +.image-hover:hover .mask { + opacity: 0.8; +} + +.mask { + position : absolute; + width : 200px; + height : 160px; + margin-top : -160px; + background-color : #4F4F4F; + // top : 6px; + // left : 12px; + border-radius : 6px; + opacity : 0; +} + +.mask-over { + position : absolute; + display : flex; + align-items : center; + justify-content : center; + width : 200px; + height : 160px; + margin-top : -160px; + // top : 6px; + // left : 12px; + border-radius : 6px; + + label { + color : #FFF; + font-size : 20px; + line-height : 24px; + letter-spacing: 0.7px; + } + +} +input { + width: 200px; +} +.sv__container { + padding-top: 10px; +} \ No newline at end of file diff --git a/src/app/routes/vehicle/components/list/detail/detail.component.spec.ts b/src/app/routes/vehicle/components/list/detail/detail.component.spec.ts new file mode 100644 index 00000000..00666a0b --- /dev/null +++ b/src/app/routes/vehicle/components/list/detail/detail.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 20:19:08 + * @LastEditTime: 2021-11-29 20:31:00 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListDetailComponent } from './detail.component'; + +describe('FreightComponentsListDetailComponent', () => { + let component: FreightComponentsListDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/list/detail/detail.component.ts b/src/app/routes/vehicle/components/list/detail/detail.component.ts new file mode 100644 index 00000000..a07c9e7d --- /dev/null +++ b/src/app/routes/vehicle/components/list/detail/detail.component.ts @@ -0,0 +1,302 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { VehicleService } from '../../../services/vehicle.service'; +import { VehicleComponentsListEditComponent } from '../edit/edit.component'; +import { VehicleImgViewComponent } from '../img-view/img-view.component'; +import { apiConf } from '@conf/api.conf'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { ImageViewComponent } from 'src/app/shared/components/imagelist'; +import { EADateUtil } from '@shared'; +import { NzImageService } from 'ng-zorro-antd/image'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'] +}) +export class VehicleComponentsListDetailComponent implements OnInit { + i: any; + @ViewChild('st', { static: false }) st!: STComponent; + isShow = false; + isVisible = false; + isEdit = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + columns!: STColumn[]; + uploadURl = apiConf.fileUpload; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['suppliersType']; + suppliersData: any = {}; + disabledUpload = false; + detailData: any = this.initData(); + tempalateData: any; + contenCarNoColor: any; + contencarModel: any; + contenCarLength: any; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: VehicleService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + private nzModalService: NzModalService, + private nzImageService: NzImageService + ) {} + + ngOnInit() { + this.getSelectList(); + this.getDetailList(); + this.initSF(); + this.initSF1(); + this.initST(); + } + /** + * 查询参数 + */ + get reqParams() { + return { id: this.route.snapshot?.params?.id }; + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + effectiveDate: { + title: '有效期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00' + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema + } + }, + required: ['effectiveDate'] + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initST() { + this.columns = [ + { title: '司机姓名', index: 'name', width: 300, className: 'text-center' }, + { title: '司机手机号', index: 'mobile', width: 300, className: 'text-center' }, + { title: '挂靠协议', render: 'auditStatusEnum', className: 'text-center' }, + { title: '录入人员', index: 'saveUser', className: 'text-center' }, + { + title: '车主申明/挂靠协议', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '查看协议', + click: _record => this.viewEvaluate(_record), + iif: item => item.auditStatusEnum == 10 || item.auditStatusEnum == 20 + }, + { + text: '上传协议', + click: _record => this.updateEvaluate(_record), + iif: item => item.auditStatusEnum == -1 + } + ] + } + ]; + } + initSF1() { + this.schema1 = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + suppliersType: { + type: 'string', + title: '类型', + enum: [ + { label: '非外部供应商', value: 0 }, + { label: '外部供应商', value: 1 } + ], + default: '', + ui: { + widget: 'select', + change: (args: any) => { + console.log(args, 'args'); + this.suppliersData.suppliersType = args; + if (args === 1) { + this.validData = ['suppliersType', 'externalSuppliersId']; + } else { + this.validData = ['suppliersType']; + this.suppliersData.externalSuppliersId = ''; + } + this.initSF1(); + } + } + }, + externalSuppliersId: { + title: '外部供应商id', + type: 'string', + default: '', + ui: { + visibleIf: { suppliersType: (value: any) => value === 1 } + } + } + }, + required: this.validData + }; + } + // 获取录单员 + getSelectList() { + this.Serveice('car:color'); + this.Serveice('car:model'); + this.Serveice('car:length'); + } + Serveice(param: any) { + let value: any; + this.service + .request(`${this.service.$api_get_getDictValue}`, { + dictKey: param + }) + .subscribe(res => { + if (param === 'car:color') { + this.contenCarNoColor = res; + } else if (param === 'car:model') { + this.contencarModel = res; + } else if (param === 'car:length') { + this.contenCarLength = res; + } + }); + return value; + } + // + getDetailList() { + console.log(this.route.snapshot?.params?.id); + const params = { + id: this.route.snapshot?.params?.id + }; + this.service.request(`${this.service.$api_get_operate_get}`, params).subscribe(res => { + this.detailData = res; + this.tempalateData = res; + }); + } + + goBack() { + window.history.go(-1); + } + + handleCancel(name: any) {} + + /** + *查看评价 + */ + viewEvaluate(item: any) { + this.modal.createStatic(VehicleImgViewComponent, { i: item }).subscribe(() => { + this.st.reload(); + this.getDetailList(); + }); + } + /** + *查看评价 + */ + updateEvaluate(item: any) { + this.modal.createStatic(VehicleComponentsListEditComponent, { i: item }).subscribe(() => { + this.st.reload(); + this.getDetailList(); + }); + } + handleOK() {} + ratify() { + this.isEdit = true; + } + changeUpload({ file, fileList, type }: any, key: string) { + console.log({ file, fileList, type }); + if (type === 'success') { + this.detailData[key] = file.response.data.fullFilePath; + } + } + deleteImg(key: string) { + console.log(key); + this.nzModalService.warning({ + nzTitle: '是否确认删除该图片', + nzOnOk: () => { + this.disabledUpload = true; + this.detailData[key] = ''; + setTimeout(() => { + this.disabledUpload = false; + }, 100); + } + }); + } + showImg(url: any) { + const params = { + imgList: [url], + index: 0 + }; + this.nzImageService.preview([{ src: url }]); + // this.nzModalService.create({ nzContent: ImageViewComponent, nzComponentParams: { params } }); + } + + reset() { + this.detailData = { ...this.tempalateData }; + this.isEdit = false; + } + + save() { + console.log(this.detailData); + this.detailData.driverLicenseRegisterTime = EADateUtil.yearToDate(this.detailData?.driverLicenseRegisterTime); + + this.detailData.driverLicenseEndTime = EADateUtil.yearToDate(this.detailData?.driverLicenseEndTime); + + this.detailData.driverLicenseGetTime = EADateUtil.yearToDate(this.detailData?.driverLicenseGetTime); + + this.detailData.roadTransportStartTime = EADateUtil.yearToDate(this.detailData?.roadTransportStartTime); + + this.detailData.roadTransportEndTime = EADateUtil.yearToDate(this.detailData?.roadTransportEndTime); + console.log(this.detailData); + console.log(this.detailData.roadTransportStartTime) + if((this.detailData.roadTransportStartTime > this.detailData.roadTransportEndTime) || (this.detailData.driverLicenseRegisterTime > this.detailData.driverLicenseEndTime)) { + this.service.msgSrv.error('发证日期起始不能大于结束日期!') + return; + } + this.service.request(this.service.$api_get_update, this.detailData).subscribe(res => { + console.log(res); + if (res) { + this.getDetailList(); + this.isEdit = false; + this.service.msgSrv.success('修改成功!'); + } + }); + } + + private initData() { + return { + carNo: '', + carNoColor: '', + carModel: '', + carLength: '', + archivesNo: '', + driverLicenseSigningOrg: '', + carDistinguishCode: '', + carLoad: '', + curbWeight: '', + roadTransportNo: '', + roadTransportLicenceNo: '', + carOwner: '', + isTrailer: null, + useNature: null, + driverLicenseRegisterTime: null, + driverLicenseGetTime: null, + driverLicenseEndTime: null, + roadTransportStartTime: null, + roadTransportEndTime: null, + carFrontPhotoWatermark: '' + }; + } +} diff --git a/src/app/routes/vehicle/components/list/edit/edit.component.html b/src/app/routes/vehicle/components/list/edit/edit.component.html new file mode 100644 index 00000000..3442af67 --- /dev/null +++ b/src/app/routes/vehicle/components/list/edit/edit.component.html @@ -0,0 +1,19 @@ + + +
    + + +
    + diff --git a/src/app/routes/vehicle/components/list/edit/edit.component.spec.ts b/src/app/routes/vehicle/components/list/edit/edit.component.spec.ts new file mode 100644 index 00000000..688a7662 --- /dev/null +++ b/src/app/routes/vehicle/components/list/edit/edit.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { UcenterComponentsInfoEditComponent } from './edit.component'; + +describe('UcenterComponentsInfoEditComponent', () => { + let component: UcenterComponentsInfoEditComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [UcenterComponentsInfoEditComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UcenterComponentsInfoEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/list/edit/edit.component.ts b/src/app/routes/vehicle/components/list/edit/edit.component.ts new file mode 100644 index 00000000..ef6b14f3 --- /dev/null +++ b/src/app/routes/vehicle/components/list/edit/edit.component.ts @@ -0,0 +1,124 @@ +import { Params } from '@angular/router'; +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema, SFUploadWidgetSchema, SFTextareaWidgetSchema } from '@delon/form'; +import { EAEnvironmentService, CaptchaComponent, EAUserService } from '@shared'; +import { Observable, Observer } from 'rxjs'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { apiConf } from '@conf/api.conf'; +import { VehicleService } from '../../../services/vehicle.service'; +@Component({ + selector: 'app-setting-components-info-edit', + templateUrl: './edit.component.html', +}) +export class VehicleComponentsListEditComponent implements OnInit { + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any = {}; + infoData: any = {}; + schema!: SFSchema; + ui!: SFUISchema; + formData: any = {}; + interval$: any; + phone!: string; + + constructor( + private modal: NzModalRef, + public msgSrv: NzMessageService, + public service: VehicleService, + private envSrv: EAEnvironmentService, + ) {} + + ngOnInit(): void { + console.log('init:', this.i, this.infoData); + // 设置初始值 + this.initInfo(); + this.initSF(); + } + initInfo() { + if (this.infoData.carProtocal) { + this.formData = { + carProtocal: [ + { + uid: 'logo', + name: 'LOGO', + status: 'done', + url: this.infoData.carProtocal, + response: { + url: this.infoData.carProtocal, + }, + }, + ], + }; + } + } + initSF() { + // 依据类型初始表单 + this.schema = { + properties: { + carProtocal: { + type: 'string', + title: '车主申明/挂靠协议', + ui: { + widget: 'upload', + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + limit: 1, + limitFileCount: 1, + resReName: 'data.fullFileWatermarkPath', + urlReName: 'data.fullFileWatermarkPath', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + appId: this.envSrv.env.appId, + }, + name: 'multipartFile', + beforeUpload: (file: any, fileList: any) => { + return new Observable((observer: Observer) => { + const isLt1M = file.size / 1024 / 1024 < 5; + const fileType = 'image/png,image/jpeg'; + if (fileType.indexOf(file.type) === -1) { + this.service.msgSrv.warning('图片格式不正确!'); + observer.complete(); + return; + } + if (!isLt1M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt1M); + observer.complete(); + }); + }, + multiple: false, + listType: 'picture-card', + showRequired: true, + } as SFUploadWidgetSchema, + }, + }, + required: ['carProtocal'], + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 }, + }, + }; + } + + close() { + this.modal.destroy(); + } + sure() { + const params ={ + carProtocal: this.sf.value.carProtocal?.data?.fullFilePath, + id: this.i.id + } + this.service.request(this.service.$api_get_upLoadCarProtocal, params).subscribe((res) => { + if(res) { + this.modal.destroy(true); + this.service.msgSrv.success('上传协议成功!') + } + }) + } +} diff --git a/src/app/routes/vehicle/components/list/img-view/img-view.component.html b/src/app/routes/vehicle/components/list/img-view/img-view.component.html new file mode 100644 index 00000000..9065b2fe --- /dev/null +++ b/src/app/routes/vehicle/components/list/img-view/img-view.component.html @@ -0,0 +1,34 @@ + + + +
    +
    +
    +
    + + + + + +
    + diff --git a/src/app/routes/vehicle/components/list/img-view/img-view.component.ts b/src/app/routes/vehicle/components/list/img-view/img-view.component.ts new file mode 100644 index 00000000..26149480 --- /dev/null +++ b/src/app/routes/vehicle/components/list/img-view/img-view.component.ts @@ -0,0 +1,58 @@ +/* + * @Author: your name + * @Date: 2021-12-07 17:30:18 + * @LastEditTime: 2022-01-18 16:36:27 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\vehicle\components\list\img-view\img-view.component.ts + */ +import { Component, OnInit } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { VehicleService } from '../../../services/vehicle.service'; + +@Component({ + selector: 'app-setting-components-info-img-view', + templateUrl: './img-view.component.html', +}) +export class VehicleImgViewComponent implements OnInit { + record: any = {}; + i: any; + + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public http: _HttpClient, public service: VehicleService) {} + + ngOnInit(): void { + console.log(this.i); + } + + cancel() { + this.modal.destroy(true); + } + // 驳回 + reject() { + const params ={ + approvalStatus: 30, + id: this.i.id + } + this.service.request(this.service.$api_get_auditCarProtocal_audit, params).subscribe((res) => { + if(res) { + this.modal.destroy(true); + this.service.msgSrv.success('已驳回') + } + }) + } + // 通过 + okCancel() { + const params ={ + approvalStatus: 20, + id: this.i.id + } + this.service.request(this.service.$api_get_auditCarProtocal_audit, params).subscribe((res) => { + if(res) { + this.modal.destroy(true); + this.service.msgSrv.success('已通过') + } + }) + } +} diff --git a/src/app/routes/vehicle/components/list/list.component.html b/src/app/routes/vehicle/components/list/list.component.html new file mode 100644 index 00000000..e2e98417 --- /dev/null +++ b/src/app/routes/vehicle/components/list/list.component.html @@ -0,0 +1,86 @@ + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + +
    {{ item?.carModelLabel }}-{{ item?.carLengthLabel ? item?.carLengthLabel + '米' : '' }}-{{ + item?.carLoad ? item?.carLoad + '吨' : '' + }}
    +
    + +
    + {{ item?.isSelf ? '是' : '否' }} +
    +
    + +
    + {{ item?.putOnRecord ? '是' : '否' }} +
    +
    + +
    + 未上传 + 草稿 + 待审核 + 已撤销 + 已审核 + 已驳回 + 证件过期 + - +
    +
    + + 冻结 + 正常 + +
    +
    diff --git a/src/app/routes/vehicle/components/list/list.component.ts b/src/app/routes/vehicle/components/list/list.component.ts new file mode 100644 index 00000000..5a871858 --- /dev/null +++ b/src/app/routes/vehicle/components/list/list.component.ts @@ -0,0 +1,315 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VehicleService } from '../../../vehicle/services/vehicle.service'; +@Component({ + selector: 'app-Vehicle-components-list', + templateUrl: './list.component.html' +}) +export class VehicleComponentsListComponent implements OnInit { + _$expand = false; + + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: VehicleService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value) + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe(params => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + if (!!q) { + return this.service + .request(this.service.$api_get_getCarLicenseListByCarNo, { + carNo: q + }) + .pipe(map((res: any) => (res?.records as any[]).map(i => ({ label: i.carNo, value: i.carNo } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + } + } as SFSelectWidgetSchema + }, + carNoColor: { + type: 'string', + title: '车牌颜色', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'car:color' } + } + }, + carStatus: { + title: '运营状态', + type: 'string', + enum: [ + { label: '空闲', value: 0 }, + { label: '运输中', value: 1 } + ], + ui: { + allowClear: true, + widget: 'select' + } + }, + carModel: { + title: '车型', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:model' }, + containsAllLabel: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + carLength: { + title: '车长', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'car:length' }, + containsAllLabel: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + carLoad: { + title: '载重', + type: 'string', + ui: { + visibleIf: { + expand: (value: boolean) => value + } + } + }, + isSelf: { + type: 'string', + title: '是否挂靠', + enum: [ + { label: '是', value: 1 }, + { label: '否', value: 0 } + ], + ui: { + widget: 'select', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + driverLicenseStatus: { + type: 'string', + title: '行驶证到期状态', + enum: [ + { label: '正常', value: 1 }, + { label: '即将到期', value: 2 }, + { label: '已到期', value: 3 } + ], + default: '', + ui: { + widget: 'select', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + roadTransportStatus: { + type: 'string', + title: '道运证到期状态', + enum: [ + { label: '正常', value: 1 }, + { label: '即将到期', value: 2 }, + { label: '已到期', value: 3 } + ], + ui: { + widget: 'select', + allowClear: true, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + // isSelfs: { + // type: 'string', + // title: '是否入网', + // enum: [ + // { label: '全部', value: '' }, + // { label: '是', value: 1 }, + // { label: '否', value: 0 } + // ], + // ui: { + // widget: 'select', + // allowClear: true, + // visibleIf: { + // expand: (value: boolean) => value + // } + // } + // } + // putOnRecord: { + // type: 'string', + // title: '是否已备案', + // enum: [ + // { label: '是', value: 1 }, + // { label: '否', value: 0 }, + // ], + // ui: { + // widget: 'select', + // visibleIf: { + // expand: (value: boolean) => value, + // }, + // }, + // }, + } + }; + this.ui = { '*': { spanLabelFixed: 130, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '车牌号', width: '150px', className: 'text-center', index: 'carNo' }, + { title: '车牌颜色', width: '150px', className: 'text-center', index: 'carNoColorLabel' }, + { title: '车型-车长-载重', width: '180px', className: 'text-center', render: 'carLength' }, + { + title: '运营状态', + width: '150px', + className: 'text-center', + index: 'carStatus', + type: 'badge', + badge: { + true: { text: '运输中', color: 'success' }, + false: { text: '空闲', color: 'default' } + } + }, + // { title: '道运证', width: '150px', className: 'text-center', index: 'roadTransportNo' }, + // { title: '审核人', width: '150px', className: 'text-center', index: 'approvalUserName' }, + + { + title: '行驶证到期状态', + width: '180px', + className: 'text-center', + index: 'driverLicenseStatus', + type: 'badge', + badge: { + 1: { text: '正常', color: 'success' }, + 2: { text: '即将到期', color: 'warning' }, + 3: { text: '已到期', color: 'error' } + } + }, + { + title: '道运证到期状态', + width: '180px', + className: 'text-center', + index: 'roadTransportStatus', + type: 'badge', + badge: { + 1: { text: '正常', color: 'success' }, + 2: { text: '即将到期', color: 'warning' }, + 3: { text: '已到期', color: 'error' } + } + }, + // { title: '是否入网', width: '200px', className: 'text-center', index: 'carOwner' }, + { title: '所有人', width: '200px', className: 'text-center', index: 'carOwner' }, + { title: '是否挂靠', width: '150px', className: 'text-center', render: 'isSelf' }, + { title: '挂靠协议', width: '150px', className: 'text-center', render: 'approvalAuditStatus' }, + // { title: '是否已备案', className: 'text-center', render: 'putOnRecord', }, + { + title: '操作', + fixed: 'right', + width: '100px', + className: 'text-center', + buttons: [ + { + text: '查看', + acl: { ability: ['VEHICLE-LIST-view'] }, + click: item => { + this.router.navigate(['/vehicle/list/detail/' + item.id]); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + } + } + // { + // text: '申请备案', + // click: (item) => { + + // }, + // }, + ] + } + ]; + } + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new'], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + // 导出 + exportFire() { + let params = Object.assign({}, this.reqParams || {}); + params.pageSize = -1; + this.service.exportStart(params, this.service.$api_carLicense_export); + } +} diff --git a/src/app/routes/vehicle/services/vehicle.service.ts b/src/app/routes/vehicle/services/vehicle.service.ts new file mode 100644 index 00000000..2e95a0e3 --- /dev/null +++ b/src/app/routes/vehicle/services/vehicle.service.ts @@ -0,0 +1,72 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime : 2022-02-17 15:38:07 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\vehicle\\services\\vehicle.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root' +}) +export class VehicleService extends BaseService { + // 查询车辆认证表 + $api_get_operate_list = `/api/mdc/cuc/carLicense/operate/list/page`; + // 查询用户车辆认证表(审核列表) + $api_get_userCarLicense_list = `/api/mdc/cuc/carLicenseAudit/operate/list/page`; + // 获取车辆认证表 + $api_get_operate_get = `/api/mdc/cuc/carLicense/operate/get`; + // 获取车辆认证表(审核列表) + $api_get_operate_getaudit = `/api/mdc/cuc/carLicenseAudit/operate/get`; + + // 获取车辆认证司机列表 + // $api_get_queryDriverByCarId = `/api/mdc/cuc/carLicenseAudit/operate/queryDriverByCarId`; + $api_get_queryDriverByCarId = `/api/mdc/cuc/carLicenseAudit/operate/queryDriverByCarId`; + // 详情需要的下拉框数据 + $api_get_getDictValue = `/api/mdc/pbc/dictItems/getDictValue`; + // 审核司机车辆认证(审核列表) + $api_get_operate_audit = `/api/mdc/cuc/carLicenseAudit/operate/audit`; + // 审核司机挂靠协议(审核列表) + $api_get_auditCarProtocal_audit = `/api/mdc/cuc/carLicenseAudit/operate/auditCarProtocal`; + + // 更新司机车辆审核信息(审核列表) + $api_get_update_audit = `/api/mdc/cuc/carLicenseAudit/operate/update`; + // 更新司机车辆审核信息 + $api_get_update = `/api/mdc/cuc/carLicense/operate/update`; + + // 上传司机挂靠协议 + $api_get_upLoadCarProtocal = `/api/mdc/cuc/carLicenseAudit/operate/upLoadCarProtocal`; + + // 根据车牌号查询车辆信息(车辆认证表) + $api_get_getCarLicenseListByCarNo = `/api/mdc/cuc/carLicense/findCarLicenseByCarNo`; + // /api/mdc/cuc/carLicense/findCarLicenseByCarNo + // 根据车牌号查询车辆信息(车辆审核认证表) + $api_get_getCarLicenseListByCarNo_audit = `/api/mdc/cuc/carLicenseAudit/operate/findCarLicenseAuditListByCarNo`; + + // 导出(车辆认证表) + $api_carLicense_export = `/api/mdc/cuc/carLicense/operate/export`; + // 导出(车辆审核认证表) + $api_carLicenseAudit_export = `/api/mdc/cuc/carLicenseAudit/operate/export`; + + // 获取货主车辆信息 + $api_shipperCarGet = '/api/mdc/shipperCar/get'; + // 根据地区code查询列表 + $api_getRegionByCode = '/api/mdc/pbc/region/getRegionByCode'; + // 道路运输证识别 + $api_recognizeTransportationLicense = '/api/mdc/pbc/hwc/ocr/recognizeTransportationLicense'; + // 行驶证识别 + $api_recognizeVehicleLicense = '/api/mdc/pbc/hwc/ocr/recognizeVehicleLicense'; + // 保存货主车辆关联表 + $api_saveUpdateShipperCar = '/api/mdc/shipperCar/saveUpdateShipperCar'; + // 添加车辆信息 + $api_addOrUpdateCarLicenseInfo = '/api/mdc/cuc/carLicenseAudit/operate/addOrUpdateCarLicenseInfo'; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/vehicle/vehicle-routing.module.ts b/src/app/routes/vehicle/vehicle-routing.module.ts new file mode 100644 index 00000000..9f3dad48 --- /dev/null +++ b/src/app/routes/vehicle/vehicle-routing.module.ts @@ -0,0 +1,27 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-12-13 09:56:49 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { VehicleComponentsAuditComponent } from './components/audit/audit.component'; +import { VehicleComponentsAuditDetailComponent } from './components/audit/detail/detail.component'; +import { VehicleComponentsListDetailComponent } from './components/list/detail/detail.component'; +import { VehicleComponentsListComponent } from './components/list/list.component'; + +const routes: Routes = [ + { path: 'list', component: VehicleComponentsListComponent }, + { path: 'list/detail/:id', component: VehicleComponentsListDetailComponent }, + { path: 'audit', component: VehicleComponentsAuditComponent }, + { path: 'audit/detail/:id', component: VehicleComponentsAuditDetailComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class VehicleRoutingModule {} diff --git a/src/app/routes/vehicle/vehicle.module.ts b/src/app/routes/vehicle/vehicle.module.ts new file mode 100644 index 00000000..72ab6e09 --- /dev/null +++ b/src/app/routes/vehicle/vehicle.module.ts @@ -0,0 +1,35 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-12-13 09:58:58 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts + */ +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { VehicleComponentsAuditComponent } from './components/audit/audit.component'; +import { VehicleComponentsAuditDetailComponent } from './components/audit/detail/detail.component'; +import { CarSettleCarauthComponent } from './components/list/carauth/carauth.component'; +import { VehicleComponentsListDetailComponent } from './components/list/detail/detail.component'; +import { VehicleComponentsListEditComponent } from './components/list/edit/edit.component'; +import { VehicleImgViewComponent } from './components/list/img-view/img-view.component'; +import { VehicleComponentsListComponent } from './components/list/list.component'; +import { VehicleRoutingModule } from './vehicle-routing.module'; + + +const COMPONENTS = [ + VehicleComponentsListComponent, + VehicleComponentsListDetailComponent, + VehicleComponentsListEditComponent, + VehicleImgViewComponent, + VehicleComponentsAuditComponent, + VehicleComponentsAuditDetailComponent, + CarSettleCarauthComponent +]; + +@NgModule({ + imports: [SharedModule, VehicleRoutingModule], + declarations: [...COMPONENTS], +}) +export class VehicleModule {} diff --git a/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.html b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.html new file mode 100644 index 00000000..5681c18e --- /dev/null +++ b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.html @@ -0,0 +1,140 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + +
    +
    +
    +
    + + + + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + + {{itemInfo.exceptionCode}} + + + {{itemInfo.loadingAddressArr}} + + + {{itemInfo.unloadingAddressArr}} + + + {{itemInfo.exceptionContent}} + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + {{itemInfo.replyContent}} + + + {{itemInfo.replyAppUserName}} + + + {{itemInfo.replyTime}} + + + +
    +
    +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.less b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.less new file mode 100644 index 00000000..45ff72e1 --- /dev/null +++ b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.less @@ -0,0 +1,21 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } + .imgBox { + display: flex; + img { + width: 60px !important; + height: 60px !important; + } + } + +} \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.ts b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.ts new file mode 100644 index 00000000..a9d112ba --- /dev/null +++ b/src/app/routes/waybill-management/components/abnormal-appear/abnormal-appear.component.ts @@ -0,0 +1,389 @@ +import { Component, OnInit, ViewChild, Type } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { + SFComponent, + SFDateWidgetSchema, + SFRadioWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFUISchema +} from '@delon/form'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { WaybillManagementServe } from '../../services/waybill-management.service'; + +@Component({ + selector: 'app-abnormal-appear', + templateUrl: './abnormal-appear.component.html', + styleUrls: ['./abnormal-appear.component.less'] +}) +export class WaybillManagementAbnormalAppearComponent implements OnInit { + @ViewChild('detailModal', { static: true }) + detailModal!: any; + @ViewChild('replyModal', { static: true }) + replyModal!: any; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('st2', { static: true }) + st2!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + ui: SFUISchema = {}; + ui2: SFUISchema = {}; + schema: SFSchema = {}; + addSchema: SFSchema = {}; + _$expand = false; + editText = ''; + formData: any; + isVisible = false; + edit = false; + editId = false; + selectedIndex = 0; + isLoading: boolean = false; + tabs = { + stayQuantity: 0, + receivedQuantity: 0 + }; + + columns: STColumn[] = [ + { + title: '异常编号', + index: 'exceptionCode', + width: '180px', + className: 'text-left', + type: 'link', + click: item => this.reviewDetailAction(item) + }, + { title: '异常类型', index: 'exceptionTypeLabel', width: '180px', className: 'text-left' }, + { + title: '关联运单号', + index: 'wayBillCode', + width: '180px', + className: 'text-left', + type: 'link', + click: item => this.routeToBill(item) + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '250px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '250px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '220px', className: 'text-left' }, + { title: '卸货地', index: 'unloadingAddressArr', width: '220px', className: 'text-left' }, + { title: '承运司机', index: 'driver', width: '250px', className: 'text-left' }, + { title: '异常信息', index: 'exceptionContent', width: '250px', className: 'text-left' }, + { title: '异常图片', render: 'exceptionCertificateFirstFilePath', width: '300px', className: 'text-left' }, + { title: '上报时间', index: 'createTime', width: '180px', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + width: '100px', + className: 'text-center', + buttons: [{ text: '回复', click: item => this.replyAction(item) }] + } + ]; + columns2: STColumn[] = [ + { + title: '异常编号', + index: 'exceptionCode', + width: '180px', + className: 'text-left', + type: 'link', + click: item => this.reviewDetailAction(item) + }, + { title: '异常类型', index: 'exceptionTypeLabel', width: '180px', className: 'text-left' }, + { + title: '关联运单号', + index: 'wayBillCode', + width: '180px', + className: 'text-left', + type: 'link', + click: item => this.routeToBill(item) + }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '180px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingAddressArr', width: '180px', className: 'text-left' }, + { title: '卸货地', index: 'unloadingAddressArr', width: '180px', className: 'text-left' }, + { title: '承运司机', index: 'driver', width: '200px', className: 'text-left' }, + { title: '异常信息', index: 'exceptionContent', width: '250px', className: 'text-left' }, + { title: '异常图片', render: 'exceptionCertificateFirstFilePath', width: '220px', className: 'text-left' }, + { title: '上报时间', index: 'createTime', width: '180px', className: 'text-left' }, + { title: '回复内容', index: 'replyContent', width: '180px', className: 'text-left' }, + { title: '回复人', index: 'replyAppUserName', width: '180px', className: 'text-left' }, + { title: '回复时间', index: 'replyTime', width: '180px', className: 'text-left' } + ]; + resourceStatus: number | undefined; + + get reqParams() { + return { + ...this.sf?.value, + replyStatus: this.resourceStatus || 0, + reportingTime: { + start: this.sf?.value?.reportingTime?.[0] || '', + end: this.sf?.value?.reportingTime?.[1] || '' + } + }; + } + get reqParams2() { + return { + ...this.sf?.value, + replyStatus: this.resourceStatus || 1, + reportingTime: { + start: this.sf?.value?.reportingTime?.[0] || '', + end: this.sf?.value?.reportingTime?.[1] || '' + } + }; + } + itemInfo: any = {}; + replyContent = ''; + constructor( + public service: WaybillManagementServe, + private nzModalService: NzModalService, + public shipperSrv: ShipperBaseService, + private router: Router + ) {} + + ngOnInit(): void { + this.initSF(); + this.getGoodsSourceStatistical(); + } + + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + reviewDetailAction(item: any) { + this.itemInfo = {}; + this.service.request(`${this.service.$api_get_listOperate_detail}${item.id}`, {}, 'GET').subscribe(res => { + if (res) { + this.itemInfo = res; + const modal = this.nzModalService.create({ + nzContent: this.detailModal, + nzWidth: 600, + nzTitle: '异常详情', + nzFooter: [] + }); + } + }); + } + + replyAction(item: any) { + this.replyContent = ''; + const modal = this.nzModalService.create({ + nzContent: this.replyModal, + nzTitle: '回复', + nzOnOk: () => { + if (!this.replyContent) { + this.service.msgSrv.warning('请填写回复内容'); + return false; + } + this.service + .request(this.service.$api_operate_reply, [ + { + id: item.id, + replyContent: this.replyContent + } + ]) + .subscribe(res => { + if (res) { + this.service.msgSrv.success('回复成功'); + this.st.load(1); + this.getGoodsSourceStatistical(); + } + }); + return true; + } + }); + } + + routeToBill(item: any) { + if (item.billType === '1') { + this.router.navigate([`/waybill-management/vehicle/vehicle-detail/${item.wayBillId}`]); + } else { + this.router.navigate([`/waybill-management/bulk/bulk-detail/${item.wayBillId}`]); + } + } + + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + exceptionCode: { + type: 'string', + title: '异常编号', + ui: { placeholder: '请输入' } + }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { placeholder: '请输入' } + }, + exceptionType: { + title: '异常类型', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLable: true, + params: { dictKey: 'exception:report:type' } + } as SFSelectWidgetSchema + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + reportingTime: { + title: '上报时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.shipperSrv.getNetworkFreightForwarder() + } + } + } + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + selectChange(e: number) { + console.log(e); + this.resourceStatus = e; + setTimeout(() => { + this?.st?.load(1); + this?.st2?.load(1); + }, 0); + } + getGoodsSourceStatistical() { + this.tabs = { + stayQuantity: 0, + receivedQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.replyStatus; + this.service.request(this.service.$api_get_listOperateStatus, params).subscribe(res => { + if (res) { + res.forEach((element: any) => { + if (element.replyStatus === '1') { + this.tabs.receivedQuantity = element.quantity; + } else if (element.replyStatus === '0') { + this.tabs.stayQuantity = element.quantity; + } + }); + } + }); + } + search() { + if (this.selectedIndex === 0) { + this.st?.load(1); + } else { + this.st2?.load(1); + } + this.getGoodsSourceStatistical(); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.isLoading = true; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } +} diff --git a/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.html b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.html new file mode 100644 index 00000000..bd5a1802 --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.html @@ -0,0 +1,268 @@ + + + + + + +
    + +

    运单号: {{ i?.wayBillCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.enterpriseInfoName }} + {{ i?.shippername }} + {{i?.enterpriseProjectName}} + {{i?.serviceTypeLabel}} + {{i?.dispatchName}} /{{i?.dispatchPhone}} + {{ i?.externalBillCode }} + {{ i?.resourceCode }} + {{ i?.paymentDays }} +
    + + + + + + + + + + + + +
    +
    +
    + +
    +
    +   + + + +
    +
    +
    + + + + + {{i?.goodsInfos?.[0]?.goodsName}} + + + + + {{i?.goodsInfos?.[0]?.weight}}吨,{{i?.goodsInfos?.[0]?.volume}}方,{{i?.goodsInfos?.[0]?.number}}件 + + + {{i?.goodsInfos?.[0]?.carModelLabel}}{{ i?.goodsInfos?.[0]?.carLength ? '/' + i?.goodsInfos?.[0]?.carLength + '米': + ''}} + + + {{i?.driver?.name}}/{{i?.driver?.phone}} + + + {{i?.car?.carModelLabel}},{{i?.car?.carLengthLabel}}米,{{i?.car?.carLoad ? i?.car?.carLoad +'吨': ''}} + + + + {{ i?.acceptWeight }}吨,{{ i?.acceptVolume }}方 + + + {{ i?.loadWeight }}吨,{{ i?.loadVolume }}方 + + + {{ i?.settlementWeight }}吨,{{ i?.settlementVolume }}方 + + +
    +

    装货卸货信息 + ( + + + ) + +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{item?.province}}{{item.city}}{{item.area}}{{item.detailedAddress}}

    +

    联系人:{{item.appUserName}}/{{item.contractTelephone}}

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{item?.province}}{{item.city}}{{item.area}}{{item.detailedAddress}}

    +

    联系人:{{item.appUserName}}/{{item.contractTelephone}}

    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + 运费信息到货后{{i?.goodsResource.paymentDays}}天内支付运费 + +
    + {{ i?.freightPrice }}{{ i?.freightTypeLabel }} ({{ + i?.settlementBasisLabel }},{{ + i?.ruleLabel + }}) +
    + + + {{ item.price + item.surcharge | currency }} + + 到付 + {{item.price | currency}} + {{item.surcharge | currency}} + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ i?.totalRate * 100 | number: '0.2-2' }}%) +
    +
    车队长:{{ i?.payeeName }}/{{ i?.payeePhone }}
    +
    + + + + 查看附件      + 补充协议 + + + + + + + + + + + + + + + + + {{i?.receiptType == 1 ?'是':'否'}} + + + {{i?.receiptTypeLabel}} + + + {{i?.receiptUser}} / {{i?.receiptUserPhone}} + + + {{i?.receiptPlace}} + + + {{i?.receiptAddress}} + + + + + + + + + {{i?.goodsResource?.remarks}} + + + + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + +
    暂无附件信息
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.less b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.less new file mode 100644 index 00000000..b8327013 --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.less @@ -0,0 +1,70 @@ +:host{ + .btn-size{ + font-size: 14px; + } + .bdr{ + border-right: 1px solid #ccc; + } + .bdl{ + border-left: 1px solid #ccc; + } + .source-info{ + p{ + margin-bottom: .5em; + } + } + .freight-info-box{ + width: 95%; + } + .freigth-label{ + display: inline-block; + width: 50px; + text-align: right; + } + + ::ng-deep{ + .approval-status{ + .ant-steps{ + width: 70%; + margin: 0 auto; + } + } + } + .leftPadding { + padding-right: 100px; + } + .handling-info { + min-height: 100px; + border: 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width: 32px; + height: 32px; + margin-right: 24px; + color: #fff; + line-height: 32px; + text-align: center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.spec.ts b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.spec.ts new file mode 100644 index 00000000..8556cf2d --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkeDetailComponent } from './bulk-detail.component'; + +describe('OrderManagementBulkeDetailComponent', () => { + let component: OrderManagementBulkeDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkeDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkeDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.ts new file mode 100644 index 00000000..9adba23c --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk-detail/bulk-detail.component.ts @@ -0,0 +1,217 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:31:52 + * @LastEditTime : 2022-03-23 14:47:57 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\waybill-management\\components\\bulk-detail\\bulk-detail.component.ts + */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import format from 'date-fns/format'; +import { VehicleSureArriveComponent } from 'src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component'; +import { VehicleSureDepartComponent } from 'src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component'; +import { WaybillManagementServe } from '../../services/waybill-management.service'; +@Component({ + selector: 'app-supply-management-bulk-detail', + templateUrl: './bulk-detail.component.html', + styleUrls: ['./bulk-detail.component.less', '../../../commom/less/trajectory.less'] +}) +export class WaybillManagementBulkeDetailComponent implements OnInit { + id = this.route.snapshot.params.id; + i: any; + totalObj: any; + attObj: any; + isVisible = false; + MapList: any[] = []; + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + billExpenses: any[] = []; //运费信息表格信息 + imges: any; + modalcontent: any; + modalTitle: string = ''; + unLoadingPlaceVOList: any = []; + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + logColumns: STColumn[] = [ + { title: '款项', index: 'costCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatus', + type: 'badge', + width: '120px', + badge: { + '1': { text: '待申请', color: 'warning' }, + '2': { text: '已支付', color: 'success' }, + '3': { text: '已拒绝', color: 'warning' }, + '4': { text: '申请中', color: 'warning' } + } + } + ]; + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private modal: NzModalService, + private service: WaybillManagementServe, + private modalService: NzModalService + ) {} + + ngOnInit(): void { + this.initData(); + this.getTrajectory(); + } + initData() { + const params = { + id: this.id + }; + this.service.request(this.service.$api_get_getBulkDetail, params).subscribe(res => { + console.log(res); + this.unLoadingPlaceVOList.push(...res.loadingPlace); + this.unLoadingPlaceVOList.push(...res.dischargePlace); + console.log(this.unLoadingPlaceVOList); + this.i = res; + this.billExpenses = this.i?.billExpenseDetails?.filter((data: any) => data.costCode === 'TRA'); + this.i.scheduleVOList = this.i?.scheduleVOList?.filter((data: any) => data.displayStatus !== 'HIDE'); + }); + } + + hand() { + this.modalService.create({ + nzTitle: '', + // nzContent: OrderManagementGaodeMapComponent, + nzWidth: 1200 + }); + } + + goBack() { + window.history.go(-1); + } + agreement(value: any) { + if (value === '1') { + this.modalTitle = '附件信息'; + this.modalcontent = this.i?.contractContent?.contractContent; + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + } + this.isVisible = true; + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + } + } + // *确认发车 + sureDepart(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认发车', + nzWidth: '50%', + nzContent: VehicleSureDepartComponent, + nzComponentParams: { + i: item, + Status: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.initData(); + }); + } + // 确认到车 + sureArrive(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认到车', + nzWidth: '50%', + nzContent: VehicleSureArriveComponent, + nzComponentParams: { + i: item, + Status: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.initData(); + }); + } + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res.parkArray; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/waybill-management/components/bulk/bulk.component.html b/src/app/routes/waybill-management/components/bulk/bulk.component.html new file mode 100644 index 00000000..cbc5221f --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk/bulk.component.html @@ -0,0 +1,109 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + + +
    + + +
    {{ item?.createUserName }}/{{ item?.createUserPhone }}
    +
    + +
    {{ item?.driverName }}/{{ item?.driverTelephone }}/{{ item?.driverLicenseCarNo }}
    +
    + +
    {{ item?.payeeName }}/{{ item?.payeePhone }}
    +
    + + {{ item?.wayBillCode }} +
    + {{item?.wayBillStatusLabel}} +
    +
    + {{item?.resourceTypeLabel}}{{item?.serviceTypeLabel}} +
    +
    + + {{ item?.freightPrice }}/吨 +
    {{item?.settlementBasisLabel}}
    +
    + +
    +

    + {{ data.costName }}:{{ data.price | currency }} + {{ data.paymentStatusLabel }} +

    +
    +
    + + {{ item?.wayBillCode }} + + +
    {{ item?.goodsInfos?.goodsName }}
    +
    {{ item?.goodsInfos?.weight }}{{ item?.goodsInfos?.volume? '/' +item?.goodsInfos?.volume : '' }}{{ item?.goodsInfos?.number ? '/' + item?.goodsInfos?.number : '' }}
    +
    + +
    装 | {{ item?.loadingTime }}
    +
    卸 | {{ item?.unloadingTime }}
    +
    +
    +
    +
    diff --git a/src/app/routes/waybill-management/components/bulk/bulk.component.less b/src/app/routes/waybill-management/components/bulk/bulk.component.less new file mode 100644 index 00000000..45669c6a --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk/bulk.component.less @@ -0,0 +1,16 @@ + + :host ::ng-deep{ + ::ng-deep nz-range-picker{ + width: 100%; + } + p{ + margin-bottom: 0 + } + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } + } \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/bulk/bulk.component.spec.ts b/src/app/routes/waybill-management/components/bulk/bulk.component.spec.ts new file mode 100644 index 00000000..7027c72e --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk/bulk.component.spec.ts @@ -0,0 +1,40 @@ +/* + * @Author: your name + * @Date: 2021-12-06 20:03:28 + * @LastEditTime : 2022-01-20 19:09:36 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\waybill-management\\components\\bulk\\bulk.component.spec.ts + */ +/* + * @Author: your name + * @Date: 2021-12-06 19:39:49 + * @LastEditTime: 2021-12-06 19:41:08 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { WaybillManagementBulkComponent } from './bulk.component'; + +describe('WaybillManagementBulkComponent', () => { + let component: WaybillManagementBulkComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ WaybillManagementBulkComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WaybillManagementBulkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/waybill-management/components/bulk/bulk.component.ts b/src/app/routes/waybill-management/components/bulk/bulk.component.ts new file mode 100644 index 00000000..e3b993be --- /dev/null +++ b/src/app/routes/waybill-management/components/bulk/bulk.component.ts @@ -0,0 +1,485 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VehicleSureArriveComponent } from 'src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component'; +import { VehicleSureDepartComponent } from 'src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component'; +import { WaybillManagementServe } from '../../services/waybill-management.service'; + + +@Component({ + selector: 'app-supply-management-bulk', + templateUrl: './bulk.component.html', + styleUrls: ['./bulk.component.less'] +}) +export class WaybillManagementBulkComponent implements OnInit { + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + isVisibleEvaluate = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + resourceStatus: any; + tabs = { + signQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + totalQuantity: 0, + compolatelQuantity: 0, + deltQuantity: 0 + }; + constructor( + public service: WaybillManagementServe, + private modal: NzModalService, + public shipperservice: ShipperBaseService) { } + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.wayBillStatus = this.resourceStatus + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '', + }, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.getGoodsSourceStatistical() + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '最多100个运单,空号隔开' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '最多100个单号,空号隔开' + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + console.log(q) + let str =q.replace(/^\s+|\s+$/g,""); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str}) + .pipe(map((res: any) => (res as any[]).map((i) => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + + } as SFSelectWidgetSchema, + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + licenseCarNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + paymentstatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFSelectWidgetSchema, + }, + serviceType: { + title: '服务类型', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'service:type' }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + + riskStatus: { + type: 'string', + title: '是否风险单', + enum: [ + { label: '全部', value: '' }, + { label: '是', value: '3' }, + { label: '否', value: '1' } + ], + ui: { + widget: 'select', + allowClear: true, + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + }, + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder(), + }, + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + }, + type: 'object', + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '运单号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'wayBillCode' + }, + { + title: '运费明细', + width: '250px', + className: 'text-right', + render: 'billExpenseDetails' + }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '220px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '180px', className: 'text-left' }, + { title: '关联订单号', index: 'billCode', width: '180px', className: 'text-left' }, + { title: '货源编号', index: 'resourceCode', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingPlace', width: '220px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '220px', + index: 'dischargePlace' + }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsInfos' + }, + { + title: '运费单价', + className: 'text-right', + width: '150px', + render: 'freightPrice' + }, + { + title: '接单数量', + index: 'orderReceivingQuantity', + width: '200px', + className: 'text-left', + }, + { + title: '结算数量', + index: '结算数量', + width: '200px', + className: 'text-left', + format: (item: any) => + `${item.settlementWeight || ''}` + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '200px', + render: 'payeeName', + }, + { + title: '装卸货时间', + className: 'text-left', + width: '200px', + render: 'loadingTime' + }, + { + title: '创建时间', + width: '180px', + className: 'text-left', + index: 'createTime', + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '确认发车', + click: (_record) => this.sureDepart(_record), + iif: item => item.wayBillStatus == '2', + acl: { ability: ['WAYBILL-BULK-insertBulkStartCarInfo'] }, + }, + { + text: '确认到车', + click: (_record) => this.sureArrive(_record), + iif: item => item.wayBillStatus == '3', + acl: { ability: ['WAYBILL-BULK-insertBulkUnloadCarInfo'] }, + }, + ], + }, + ]; + } + search() { + this.st?.load(1); + this.getGoodsSourceStatistical() + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item) + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + selectChange(e: number) { + console.log(e); + if (e >= 1) { + this.resourceStatus = e + 1; + } else { + this.resourceStatus = 0 + } + this.initST(); + setTimeout(() => { + this.st.load(1); + }, 500); + } + /** + * 导入货源 + */ + importGoodsSource() { + + } + audit(item: any) { + console.log(item) + } + /** +* 审核通过按钮 +*/ + handleOK() { + + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item) + this.isVisibleEvaluate = true + } + getGoodsSourceStatistical() { + this.tabs = { + signQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + totalQuantity: 0, + compolatelQuantity: 0, + deltQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.wayBillStatus + this.service.request(this.service.$api_get_getBulkStatistics, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((ele: any) => { + switch (ele.wayBillStatus) { + case '2': + this.tabs.receivedQuantity = ele?.count; + break; + case '3': + this.tabs.cancelQuantity = ele?.count; + break; + case '4': + this.tabs.signQuantity = ele?.count; + break; + case '5': + this.tabs.compolatelQuantity = ele?.count; + break; + case '6': + this.tabs.deltQuantity = ele?.count; + break; + } + totalCount += ele.count + }); + this.tabs.totalQuantity = totalCount + } + }) + } + // *确认发车 + + sureDepart(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认发车', + nzWidth: '50%', + nzContent: VehicleSureDepartComponent, + nzComponentParams: { + i: item, + Status: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical() + }); + } + // 确认到车 + sureArrive(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认到车', + nzWidth: '50%', + nzContent: VehicleSureArriveComponent, + nzComponentParams: { + i: item, + Status: 2 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical() + }); + } + // 导出 + exprot() { + this.service.exportStart(this.reqParams,this.service.$api_asyncExportBulkList) + } +} diff --git a/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.html new file mode 100644 index 00000000..a59aa3f7 --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.html @@ -0,0 +1,237 @@ + + + + + + +
    + +

    运单号: {{ i?.wayBillCode }}

    +
    +
    +
    + + +
    +
    +
    +
    + {{ i?.enterpriseInfoName }} + {{ i?.shippername }} + {{i?.enterpriseProjectName}} + {{i?.serviceTypeLabel}} + {{i?.dispatchName}}{{ i?.dispatchPhone ? '/' + i?.dispatchPhone : '' }} + {{ i?.resourceCode }} + {{ i?.paymentDays }} +
    + + + + + + + + + + + + +
    +
    +
    + +
    +
    +   +   +   +   +
    +
    +
    + + + + + {{i?.goodsInfos?.[0]?.goodsName}} + + + + + {{i?.goodsInfos?.[0]?.weight}}吨,{{i?.goodsInfos?.[0]?.volume}}方,{{i?.goodsInfos?.[0]?.number}}件 + + + {{i?.goodsInfos?.[0]?.carModelLabel}}{{ i?.goodsInfos?.[0]?.carLength ? '/' + i?.goodsInfos?.[0]?.carLength + '米': + ''}} + + + {{i?.driverVo?.name}}{{ i?.driverVo?.phone ? '/' + i?.driverVo?.phone : ''}} + + + {{ i?.carVO?.carModelLabel ? i?.carVO?.carModelLabel +',': ''}}{{ i?.carVO?.carLengthLabel ? + i?.carVO?.carLengthLabel +'米,': ''}}{{i?.carVO?.carLoad ? i?.carVO?.carLoad +'吨': ''}} + + + {{i?.loadingTime}} + + + {{i?.unloadingTime}} + + +
    +

    装货卸货信息 + ( + + + ) + +

    +
    +
    +
    +
    +
    +
    +
    +

    装货地:{{item?.province}}{{item.city}}{{item.area}}{{item.detailedAddress}}

    +

    联系人:{{item.appUserName}}/{{item.contractTelephone}}

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    卸货地:{{item?.province}}{{item.city}}{{item.area}}{{item.detailedAddress}}

    +

    联系人:{{item.appUserName}}/{{item.contractTelephone}}

    +
    +
    +
    +
    +
    +
    +
    +
    + + + + {{i?.insuranceTypeLabel}} + + + {{i?.goodsValue !==null?(i?.goodsValue|currency)+'元':'-'}} + + + {{i?.insurancePremium!==null?(i?.insurancePremium |currency)+'元':'-'}} + + + + + + + {{ item.price | currency }} + + + {{ item.price + item.surcharge | currency }} + + + {{ item.surcharge | currency }} + + +
    + 总计:{{ i?.totalAmount | currency }} (运费{{ i?.totalFreight | + currency }}, + 附加费{{ i?.totalSurcharge | currency }},附加费率{{ (i?.totalRate * 100).toFixed(2)}}% ) +
    +
    车队长:{{ i?.payee?.name }}/{{ i?.payee?.phone + }}/{{ i?.payee?.idNo }}
    +
    + + + + + 查看附件      + 补充协议 + + + + + + + + + + + + + + + + + {{ i?.supplementaryInformationVO?.stateReceipt ? '是' : '否' }} + + + {{ i?.supplementaryInformationVO?.receiptType === '1' ? '电子回单' : '纸质回单' }} + + {{ + i?.supplementaryInformationVO?.receiptUserName }} / {{ i?.supplementaryInformationVO?.phon }} + + {{ i?.supplementaryInformationVO?.area }} + + + {{ i?.supplementaryInformationVO?.address }} + + + + + + + + {{ i?.supplementaryInformationVO?.remarks }} + + + + + +

    | 轨迹信息

    +
    +
    + + + + + + + + +
    +
    +
    + + + +
    暂无附件信息
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.less b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.less new file mode 100644 index 00000000..50b12799 --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.less @@ -0,0 +1,103 @@ +:host { + .btn-size { + font-size: 14px; + } + + .bdr { + border-right: 1px solid #ccc; + } + + .bdl { + border-left: 1px solid #ccc; + } + + .source-info { + p { + margin-bottom: .5em; + } + } + + .freight-info-box { + width: 95%; + } + + .freigth-label { + display : inline-block; + width : 50px; + text-align: right; + } + + ::ng-deep { + .approval-status { + .ant-steps { + width : 70%; + margin: 0 auto; + } + } + } + + .leftPadding { + padding-right: 100px; + } + + .handling-info { + min-height: 100px; + border : 1px solid #ccc; + + .loading-row { + display: flex; + } + + .handling-info-icon { + width : 32px; + height : 32px; + margin-right : 24px; + color : #fff; + line-height : 32px; + text-align : center; + border-radius: 50%; + + &.loading-bg { + background-color: #50D4AB; + } + + &.unloaing-bg { + background: #F66F6A; + } + } + + .info { + flex: 1; + } + + .time-info { + margin-left: 56px; + } + } +} + +::ng-deep { + // .affix { + // position: fixed; + // top : 20px !important; + // right : 25px; + // left : 25px; + // z-index : 999 !important; + // } + + // .alain-pro__menu-side .alain-pro__main { + // .affix { + // position: fixed; + // top : 20px !important; + // right : 25px; + // left : 250px; + // z-index : 999 !important; + // } + // } + + // .aside-collapsed.alain-pro__menu-side .alain-pro__main { + // .affix { + // left: 106px; + // } + // } +} \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.spec.ts b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.spec.ts new file mode 100644 index 00000000..8d8ab6b6 --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.spec.ts @@ -0,0 +1,32 @@ +/* + * @Author: your name + * @Date: 2021-12-07 14:52:29 + * @LastEditTime: 2021-12-07 14:56:17 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\waybill-management\components\vehicle-detail\vehicle-detail.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { WaybillManagementVehicleDetailComponent } from './vehicle-detail.component'; + +describe('WaybillManagementVehicleDetailComponent', () => { + let component: WaybillManagementVehicleDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ WaybillManagementVehicleDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WaybillManagementVehicleDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.ts new file mode 100644 index 00000000..8cf59d1b --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle-detail/vehicle-detail.component.ts @@ -0,0 +1,215 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:31:52 + * @LastEditTime : 2022-04-01 11:11:14 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\waybill-management\\components\\vehicle-detail\\vehicle-detail.component.ts + */ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import format from 'date-fns/format'; +import { NzCardComponent } from 'ng-zorro-antd/card'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { Subscription, fromEvent } from 'rxjs'; +import { VehicleSureArriveComponent } from 'src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component'; +import { VehicleSureDepartComponent } from 'src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component'; +import { WaybillManagementServe } from '../../services/waybill-management.service'; +@Component({ + selector: 'app-supply-management-vehicle-detail', + templateUrl: './vehicle-detail.component.html', + styleUrls: ['./vehicle-detail.component.less', '../../../commom/less/trajectory.less'] +}) +export class WaybillManagementVehicleDetailComponent implements OnInit, OnDestroy { + id = this.route.snapshot.params.id; + MapList: any[] = []; + trajectory = 'car'; + mapList: any[] = []; //地图点位数据组 + addressItems: any[] = []; //打点地址数据组 + i: any; + totalObj: any; + attObj: any; + isVisible = false; + imges: any; + unLoadingPlaceVOList: any = []; + logColumns2: STColumn[] = [ + { title: '时间', index: 'parkBte' }, + { title: '地点', index: 'parkAdr' } + ]; + modalcontent: any; + modalTitle: string = ''; + billExpenses: any[] = []; //运费信息表格信息 + logColumns: STColumn[] = [ + { title: '款项', index: 'costCodeLabel' }, + { title: '小计(元)', render: 'prices' }, + { title: '运输费(元)', render: 'price' }, + { title: '附加费(元)', render: 'surcharge' }, + { title: '支付时间', index: 'paymentTime' }, + { + title: '支付状态', + className: 'text-center', + index: 'paymentStatusLabel' + } + ]; + + scrollTop = 0; + subscribeScoll!: Subscription; + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private service: WaybillManagementServe, + private modal: NzModalService + ) {} + + ngOnDestroy(): void { + this.subscribeScoll.unsubscribe(); + } + + ngOnInit(): void { + this.initData(); + this.getTrajectory(); + this.subscribeScoll = fromEvent(window, 'scroll').subscribe(event => { + this.scrollTop = document.documentElement.scrollTop; + }); + } + initData() { + const params = { + id: this.id + }; + this.service.request(this.service.$api_get_getWholeDetail, params).subscribe(res => { + console.log(res); + this.unLoadingPlaceVOList.push(...res.loadingPlace); + this.unLoadingPlaceVOList.push(...res.dischargePlace); + console.log(this.unLoadingPlaceVOList); + this.i = res; + this.billExpenses = this.i?.billExpenseDetails?.filter( + (data: any) => data.costCode === 'PRE' || data.costCode === 'RECE' || data.costCode === 'BACK' + ); + this.i.scheduleVOList = this.i?.scheduleVOList?.filter((data: any) => data.displayStatus !== 'HIDE'); + }); + } + + goBack() { + window.history.go(-1); + } + agreement(value: any) { + if (value === '1') { + this.modalTitle = '附件信息'; + this.modalcontent = this.i?.contractContent?.contractContent; + } else if (value === '2') { + this.modalTitle = '补充协议'; + this.modalcontent = this.i?.supplementContent?.contractContent; + } + this.isVisible = true; + } + handleCancel() { + this.isVisible = false; + } + handleOK() { + this.isVisible = false; + } + goDistance(elf: any) { + if (elf) { + elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); + } + } + // *确认发车 + + sureDepart(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认发车', + nzWidth: '50%', + nzContent: VehicleSureDepartComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.initData(); + }); + } + // 确认到车 + sureArrive(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认到车', + nzWidth: '50%', + nzContent: VehicleSureArriveComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.initData(); + }); + } + + // 获取车辆轨迹 + getTrajectory() { + this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => { + if (res) { + const points = res.trackArray; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + this.addressItems = res.parkArray; + if (this.addressItems && this.addressItems.length > 0) { + this.addressItems.forEach(item => { + item.parkBte = this.getLocalTime(item.parkBte); + }); + } + } + }); + } + + // 获取司机轨迹 + getDriverTrajectory() { + this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => { + if (res) { + const points = res.tracks; + let list: any[] = []; + points?.forEach((item: any) => { + list.push({ + name: item.hgt, + lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))], + time: item.gtm + }); + }); + this.mapList = list; + const addressItems = [...res.tracks]; + if (addressItems) { + addressItems.forEach(item => { + // item.parkBte = item.gtm; + item.parkBte = this.getLocalTime(item.gtm); + item.parkAdr = item.appAdress; + }); + this.addressItems = [...addressItems]; + } else { + this.addressItems = []; + } + } + }); + } + trajectoryChange(event: any) { + if (event === 'car') { + this.getTrajectory(); + } else if (event === 'driver') { + this.getDriverTrajectory(); + } + } + getLocalTime(time: any) { + return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss'); + } +} diff --git a/src/app/routes/waybill-management/components/vehicle/vehicle.component.html b/src/app/routes/waybill-management/components/vehicle/vehicle.component.html new file mode 100644 index 00000000..709cbfcd --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle/vehicle.component.html @@ -0,0 +1,114 @@ + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + + + +
    + + +
    {{ item?.createUserName }}/{{ item?.createUserPhone }}
    +
    + +
    {{ item?.createUserName }}/{{ item?.createUserPhone }}
    +
    + +
    {{ item?.driverName }}/{{ item?.driverTelephone }}/{{ item?.driverLicenseCarNo }}
    +
    + +
    {{ item?.payeeName }}/{{ item?.payeePhone }}
    +
    + +
    +

    {{ data?.expenseName }}:{{ data?.price | currency }}

    +
    +
    + +
    +

    + {{ data?.costName }}:{{ data?.price | currency }} + {{ data?.paymentStatusLabel }} +

    +
    +
    + + {{ item?.wayBillCode }} +
    + {{item?.wayBillStatusLabel}} +
    +
    + {{item?.resourceTypeLabel}}{{item?.serviceTypeLabel}} +
    +
    + + {{ item?.billCode }} + + +
    {{ item?.goodsInfos?.goodsName }}
    +
    {{ item?.goodsInfos?.weight }}{{ item?.goodsInfos?.volume? '/' +item?.goodsInfos?.volume : '' }}{{ item?.goodsInfos?.number ? '/' + item?.goodsInfos?.number : '' }}
    +
    + +
    装 | {{ item?.loadingTime }}
    +
    卸 | {{ item?.unloadingTime }}
    +
    +
    +
    +
    diff --git a/src/app/routes/waybill-management/components/vehicle/vehicle.component.less b/src/app/routes/waybill-management/components/vehicle/vehicle.component.less new file mode 100644 index 00000000..118c2a31 --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle/vehicle.component.less @@ -0,0 +1,8 @@ +:host ::ng-deep{ + p{ + margin-bottom: 0 + } + ::ng-deep nz-range-picker{ + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/routes/waybill-management/components/vehicle/vehicle.component.spec.ts b/src/app/routes/waybill-management/components/vehicle/vehicle.component.spec.ts new file mode 100644 index 00000000..c8fb27ed --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle/vehicle.component.spec.ts @@ -0,0 +1,32 @@ +/* + * @Author: your name + * @Date: 2021-12-07 14:52:29 + * @LastEditTime: 2022-01-12 13:14:49 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\waybill-management\components\vehicle\vehicle.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { WaybillManagementVehicleComponent } from './vehicle.component'; + +describe('WaybillManagementVehicleComponent', () => { + let component: WaybillManagementVehicleComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ WaybillManagementVehicleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WaybillManagementVehicleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/waybill-management/components/vehicle/vehicle.component.ts b/src/app/routes/waybill-management/components/vehicle/vehicle.component.ts new file mode 100644 index 00000000..eb87999f --- /dev/null +++ b/src/app/routes/waybill-management/components/vehicle/vehicle.component.ts @@ -0,0 +1,494 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { ShipperBaseService } from '@shared'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { NzUploadChangeParam } from 'ng-zorro-antd/upload'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VehicleSureArriveComponent } from 'src/app/routes/order-management/modal/vehicle/sure-arrive/sure-arrive.component'; +import { VehicleSureDepartComponent } from 'src/app/routes/order-management/modal/vehicle/sure-depart/sure-depart.component'; +import { WaybillManagementServe } from '../../services/waybill-management.service'; + +@Component({ + selector: 'app-supply-management-vehicle', + templateUrl: './vehicle.component.html', + styleUrls: ['./vehicle.component.less', '../../../commom/less/expend-but.less', '../../../commom/less/box.less'] +}) +export class WaybillManagementVehicleComponent implements OnInit { + ui: SFUISchema = {}; + schema: SFSchema = {}; + isVisibleEvaluate = false; + isVisible = false; + _$expand = false; + resourceStatus: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + tabs = { + signQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + totalQuantity: 0, + compolatelQuantity: 0, + deltQuantity: 0 + }; + constructor(public service: WaybillManagementServe, private modal: NzModalService, public shipperservice: ShipperBaseService) {} + + /** + * 查询参数 + */ + get reqParams() { + const a: any = {}; + if (this.resourceStatus) { + a.wayBillStatus = this.resourceStatus; + } + const params: any = Object.assign({}, this.sf?.value || {}); + delete params._$expand; + return { + ...a, + ...params, + createTime: { + start: this.sf?.value?.createTime?.[0] || '', + end: this.sf?.value?.createTime?.[1] || '' + } + }; + } + get selectedRows() { + return this.st?.list.filter(item => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.getGoodsSourceStatistical(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + wayBillCode: { + type: 'string', + title: '运单号', + ui: { + placeholder: '最多100个运单,空号隔开' + } + }, + billCode: { + type: 'string', + title: '订单号', + ui: { + placeholder: '最多100个单号,空号隔开' + } + }, + resourceCode: { + type: 'string', + title: '货源编号' + }, + shipperAppUserId: { + type: 'string', + title: '货主', + ui: { + widget: 'select', + serverSearch: true, + searchDebounceTime: 300, + searchLoadingText: '搜索中...', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + }, + onSearch: (q: any) => { + let str = q.replace(/^\s+|\s+$/g, ''); + if (str) { + return this.service + .request(this.service.$api_enterpriceList, { enterpriseName: str }) + .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) + .toPromise(); + } else { + return of([]); + } + }, + change: (q: any) => { + this.getRegionCode(q); + } + } as SFSelectWidgetSchema + }, + enterpriseProjectId: { + type: 'string', + title: '所属项目', + ui: { + widget: 'select', + placeholder: '请先选择货主', + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + loadingPlace: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + dischargePlace: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + + driverName: { + title: '承运司机', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + licenseCarNo: { + title: '车牌号', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + carCaptainName: { + title: '车队长', + type: 'string', + ui: { + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + paymentstatus: { + title: '支付状态', + type: 'string', + ui: { + widget: 'dict-select', + params: { dictKey: 'overall:payment:status' }, + containsAllLabel: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + serviceType: { + title: '服务类型', + type: 'string', + ui: { + widget: 'dict-select', + containsAllLabel: true, + params: { dictKey: 'service:type' }, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFSelectWidgetSchema + }, + + riskStatus: { + type: 'string', + title: '是否风险单', + enum: [ + { label: '全部', value: '' }, + { label: '是', value: '3' }, + { label: '否', value: '1' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } + }, + enterpriseInfoId: { + type: 'string', + title: '网络货运人', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value + }, + allowClear: true, + asyncData: () => this.shipperservice.getNetworkFreightForwarder() + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + allowClear: true, + visibleIf: { + _$expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + }, + type: 'object' + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + // 获取城市列表 + getRegionCode(regionCode: any) { + console.log(regionCode); + return this.service + .request(this.service.$api_get_enterprise_project, { id: regionCode }) + .pipe( + map(res => + res.map((item: any) => ({ + label: item.projectName, + value: item.id + })) + ) + ) + .subscribe(res => { + this.sf.getProperty('/enterpriseProjectId')!.schema.enum = res; + this.sf.getProperty('/enterpriseProjectId')!.widget.reset(res); + // if (this.enterpriseProjectIds) { + // this.sf1.setValue('/enterpriseProjectId', this.enterpriseProjectIds); + // } + }); + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', fixed: 'left', width: '50px', className: 'text-center' }, + { + title: '运单号', + width: '180px', + fixed: 'left', + className: 'text-left', + render: 'wayBillCode' + }, + { + title: '货源编号', + width: '150px', + className: 'text-left', + index: 'resourceCode' + }, + { + title: '货主出价', + width: '250px', + className: 'text-right', + render: 'billExpenseDetailVOList2' + }, + { + title: '费用明细', + width: '250px', + className: 'text-right', + render: 'billExpenseDetailVOList' + }, + { title: '录单员', render: 'createUserName', width: '200px', className: 'text-left' }, + { title: '网络货运人', index: 'enterpriseInfoName', width: '220px', className: 'text-left' }, + { title: '货主', index: 'shipperAppUserName', width: '200px', className: 'text-left' }, + { title: '关联订单号', index: 'billCode', width: '180px', className: 'text-left' }, + { title: '装货地', index: 'loadingPlace', width: '180px', className: 'text-left' }, + { + title: '卸货地', + className: 'text-left', + width: '180px', + index: 'dischargePlace' + }, + { + title: '货物信息', + className: 'text-left', + width: '250px', + render: 'goodsInfos' + }, + { + title: '承运司机', + className: 'text-left', + width: '250px', + render: 'driverName' + }, + { + title: '车队长', + className: 'text-left', + width: '200px', + render: 'payeeName' + }, + { + title: '装卸货时间', + className: 'text-left', + width: '200px', + render: 'loadingTime' + }, + { + title: '创建时间', + width: '180px', + className: 'text-left', + index: 'createTime' + }, + { + title: '操作', + fixed: 'right', + width: '110px', + className: 'text-center', + buttons: [ + { + text: '确认发车', + click: _record => this.sureDepart(_record), + iif: item => item.wayBillStatus == '2', + acl: { ability: ['WAYBILL-VEHICLE-wholeStartCarInfo'] } + }, + { + text: '确认到车', + click: _record => this.sureArrive(_record), + iif: item => item.wayBillStatus == '3', + acl: { ability: ['WAYBILL-VEHICLE-wholeUnloadCarInfo'] } + } + ] + } + ]; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item); + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + search() { + this.st?.load(1); + this.getGoodsSourceStatistical(); + } + selectChange(e: number) { + console.log(e); + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(1); + }, 500); + } + /** + * 导入货源 + */ + importGoodsSource() {} + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item); + this.isVisibleEvaluate = true; + } + getGoodsSourceStatistical() { + this.tabs = { + signQuantity: 0, + cancelQuantity: 0, + receivedQuantity: 0, + stayQuantity: 0, + totalQuantity: 0, + compolatelQuantity: 0, + deltQuantity: 0 + }; + const params: any = Object.assign({}, this.reqParams || {}); + delete params.wayBillStatus; + this.service.request(this.service.$api_get_getWholeStatistics, params).subscribe(res => { + if (res) { + let totalCount = 0; + res.forEach((ele: any) => { + switch (ele.wayBillStatus) { + case '1': + this.tabs.stayQuantity = ele?.count; + break; + case '2': + this.tabs.receivedQuantity = ele?.count; + break; + case '3': + this.tabs.cancelQuantity = ele?.count; + break; + case '4': + this.tabs.signQuantity = ele?.count; + break; + case '5': + this.tabs.compolatelQuantity = ele?.count; + break; + case '6': + this.tabs.deltQuantity = ele?.count; + break; + } + totalCount += ele.count; + }); + this.tabs.totalQuantity = totalCount; + } + }); + } + // *确认发车 + + sureDepart(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认发车', + nzWidth: '50%', + nzContent: VehicleSureDepartComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical(); + }); + } + // 确认到车 + sureArrive(item: any) { + const modalRef = this.modal.create({ + nzTitle: '确认到车', + nzWidth: '50%', + nzContent: VehicleSureArriveComponent, + nzComponentParams: { + i: item, + Status: 1 + }, + nzFooter: null + }); + modalRef.afterClose.subscribe((result: any) => { + this.st.load(1); + this.getGoodsSourceStatistical(); + }); + } + // 导出 + exprot() { + this.service.exportStart(this.reqParams, this.service.$api_asyncExportWholeList); + } +} diff --git a/src/app/routes/waybill-management/services/waybill-management.service.ts b/src/app/routes/waybill-management/services/waybill-management.service.ts new file mode 100644 index 00000000..dea375df --- /dev/null +++ b/src/app/routes/waybill-management/services/waybill-management.service.ts @@ -0,0 +1,76 @@ +import { WaybillManagementBulkComponent } from './../components/bulk/bulk.component'; +/* + * @Author: your name + * @Date: 2021-12-07 14:52:29 + * @LastEditTime : 2022-03-28 11:13:50 + * @LastEditors : Shiming + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath : \\tms-obc-web\\src\\app\\routes\\waybill-management\\services\\waybill-management.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services'; + +@Injectable({ + providedIn: 'root' +}) +export class WaybillManagementServe extends BaseService { + $api_get_enterprise_project = `/api/mdc/cuc/enterpriseProject/getEnterpriseProjectList `; // 所属项目列表 + // 据 手机号/姓名 查询 车队长/司机 + $api_get_getDriverInfo = `/api/mdc/cuc/user/getDriverInfo`; + // 查询整车运单-运营后台 + $api_get_wholePage = `/api/sdc/wayBillOperate/listWholePage`; + // 查询整车运单详情-运营后台 + $api_get_getWholeDetail = `/api/sdc/wayBillOperate/getWholeDetail`; + + // 查询大宗运单-运营后台 + $api_get_Bulkpage = `/api/sdc/wayBillOperate/listBulkPage`; + // 查询大宗运单详情-运营后台 + $api_get_getBulkDetail = `/api/sdc/wayBillOperate/getBulkDetail`; + + // 整车运单分类统计 + $api_get_getWholeStatistics = `/api/sdc/wayBillOperate/getWholeStatistics`; + // 大宗运单分类统计 + $api_get_getBulkStatistics = `/api/sdc/wayBillOperate/getBulkStatistics`; + + // 根据车牌号查询车辆信息 + $api_get_getCarLicenseListByCarNo = `/api/mdc/cuc/carLicense/findCarLicenseByCarNo`; + + // 大宗确认发车 + $api_get_insertBulkStartCarInfo = `/api/sdc/wayBillOperate/insertBulkStartCarInfo`; + // 整车确认发车 + $api_get_insertWholeStartCarInfo = `/api/sdc/wayBillOperate/insertWholeStartCarInfo`; + // 整车确认到车 + $api_get_insertWholeUnloadCarInfo = `/api/sdc/wayBillOperate/insertWholeUnloadCarInfo`; + // 大宗确认到车 + $api_get_insertBulkUnloadCarInfo = `/api/sdc/wayBillOperate/insertBulkUnloadCarInfo`; + // 确认到车界面信息(两个只能看的图片) + $api_get_getUnloadCarInfo = `/api/sdc/wayBillOperate/getUnloadCarInfo`; + + // 查询CRM客户信息表 + $api_get_crmCustomer_page = '/api/mdc/cuc/crmCustomer/list/page'; + + // 查询运营端异常上报 + $api_get_listOperatePage = '/api/sdc/exceptionReport/listOperatePage'; + // 查询运营端异常上报详情 + $api_get_listOperate_detail = '/api/sdc/exceptionReport/operateDetail/'; + // 运营端异常回复 + $api_operate_reply = '/api/sdc/exceptionReport/operateReply'; + // 查询运营端异常上报数据统计 + $api_get_listOperateStatus = '/api/sdc/exceptionReport/listOperateStatus'; + // // 查询运营端已回复异常上报 + // $api_get_listOperateReplyPage = '/api/sdc/exceptionReport/listOperateReplyPage'; + // 获取轨迹 + $api_get_getTrajectory = `/api/sdc/billShipper/getTrajectoryByBillId`; + // 获取订单司机轨迹 + $api_get_getAppDriverPosition = `/api/sdc/wayBillOperate/getAppDriverPosition`; + // 获取货主企业列表 + public $api_enterpriceList = '/api/mdc/cuc/enterpriseInfo/operate/enterpriceList'; + + // 异步导出运营后台大宗运单列表 + public $api_asyncExportBulkList = '/api/sdc/wayBillOperate/asyncExportBulkList'; + // 异步导出运营后台整车运单列表 + public $api_asyncExportWholeList = '/api/sdc/wayBillOperate/asyncExportWholeList'; + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/waybill-management/waybill-management-routing.module.ts b/src/app/routes/waybill-management/waybill-management-routing.module.ts new file mode 100644 index 00000000..f2b1025f --- /dev/null +++ b/src/app/routes/waybill-management/waybill-management-routing.module.ts @@ -0,0 +1,28 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:31:52 + * @LastEditTime: 2021-12-07 14:56:57 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\order-management-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { WaybillManagementAbnormalAppearComponent } from './components/abnormal-appear/abnormal-appear.component'; +import { WaybillManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { WaybillManagementBulkComponent } from './components/bulk/bulk.component'; +import { WaybillManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; +import { WaybillManagementVehicleComponent } from './components/vehicle/vehicle.component'; + +const routes: Routes = [ + { path: 'vehicle', component: WaybillManagementVehicleComponent }, + { path: 'vehicle/vehicle-detail/:id', component: WaybillManagementVehicleDetailComponent }, + { path: 'bulk', component: WaybillManagementBulkComponent }, + { path: 'bulk/bulk-detail/:id', component: WaybillManagementBulkeDetailComponent }, + { path: 'abnormal-appear', component: WaybillManagementAbnormalAppearComponent }, +] +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class WaybillManagementRoutingModule { } diff --git a/src/app/routes/waybill-management/waybill-management.module.ts b/src/app/routes/waybill-management/waybill-management.module.ts new file mode 100644 index 00000000..38974b09 --- /dev/null +++ b/src/app/routes/waybill-management/waybill-management.module.ts @@ -0,0 +1,34 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:31:52 + * @LastEditTime: 2021-12-07 15:20:01 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\order-management.module.ts + */ +import { NgModule, Type } from '@angular/core'; +import { SharedModule } from '@shared'; +import { WaybillManagementAbnormalAppearComponent } from './components/abnormal-appear/abnormal-appear.component'; +import { WaybillManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { WaybillManagementBulkComponent } from './components/bulk/bulk.component'; + +import { WaybillManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; + +import { WaybillManagementVehicleComponent } from './components/vehicle/vehicle.component'; +import { WaybillManagementRoutingModule } from './waybill-management-routing.module'; +const COMPONENTS: Type[] = [ + WaybillManagementVehicleComponent, + WaybillManagementVehicleDetailComponent, + WaybillManagementBulkComponent, + WaybillManagementBulkeDetailComponent, + WaybillManagementAbnormalAppearComponent +]; + +@NgModule({ + imports: [ + SharedModule, + WaybillManagementRoutingModule + ], + declarations: COMPONENTS, +}) +export class WaybillManagementModule { } diff --git a/src/app/shared/README.md b/src/app/shared/README.md new file mode 100644 index 00000000..2819b60c --- /dev/null +++ b/src/app/shared/README.md @@ -0,0 +1,30 @@ +# ShareModule + +**应** 包含定义: + ++ 应用通用自定义业务组件 + +**应** 导出所有包含的模块。 + +**不应** 有 `providers` 属性。 + +## 自定义全局组件或指令 + +每一个组件或指令应该有一个完整的说明文件,**建议**一个合理的目录结构应该是: + +``` +├── components +│   ├── comp1 +│   │   ├── index.ts +│   │   ├── README.md +│   ├── comp2 +│   │   ├── index.ts +│   │   ├── README.md +├── directives +│   ├── dire1 +│   │   ├── index.ts +│   │   ├── README.md +│   ├── dire2 +│   │   ├── index.ts +│   │   ├── README.md +``` diff --git a/src/app/shared/components/account-detail/account-detail.component.html b/src/app/shared/components/account-detail/account-detail.component.html new file mode 100644 index 00000000..a9bc8438 --- /dev/null +++ b/src/app/shared/components/account-detail/account-detail.component.html @@ -0,0 +1,22 @@ + + + + {{ item.paAccount || '添加' }} + + + {{ item.pfAccount || '添加' }} + + \ No newline at end of file diff --git a/src/app/shared/components/account-detail/account-detail.component.ts b/src/app/shared/components/account-detail/account-detail.component.ts new file mode 100644 index 00000000..a0b1a133 --- /dev/null +++ b/src/app/shared/components/account-detail/account-detail.component.ts @@ -0,0 +1,106 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { BaseService } from '../../services'; + +@Component({ + selector: 'app-account-detail', + templateUrl: './account-detail.component.html', + providers: [CurrencyPipe] +}) +export class AccountDetailComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + columns: STColumn[] = []; + + url = '/api/fcc/accountBalance/getDriverAccountDetailByOperator'; + + isCanCreate = false; + params: any = {}; + constructor(public service: BaseService, public currencyPipe: CurrencyPipe, private modalHelp: NzModalRef) { + this.initST(); + } + + ngOnInit(): void {} + createAccount(item: any, type: '1' | '2') { + if ((type === '1' && item.paAccount) || (type === '2' && item.pfAccount)) { + return; + } + const params = { + ltdId: item.ltdId || this.params.ltdId, + roleId: item.roleId || this.params.roleId, + projectId: item.projectId || this.params.projectId, + enterpriseId: item.enterpriseId || this.params.roleId, + ctfId: this.params.ctfId, + clientName: this.params.clientName, + roleName: this.params.clientName + }; + if (this.params.accountType === 1) { + this.service + .request('/api/fcc/accountBalance/saveByShipper', { + accountType: this.params.accountType, + bankType: type, + isProjectMain: 0, + ...params + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(type === '1' ? res?.paMsg : res?.pfMsg); + this.modalHelp.destroy(); + } + }); + } + if (this.params.accountType === 2) { + this.service + .request('/api/fcc/accountBalance/saveByDriver', { + accountType: this.params.accountType, + bankType: type, + ...params + }) + .subscribe(res => { + if (res) { + this.service.msgSrv.success(type === '1' ? res?.paMsg : res?.pfMsg); + this.modalHelp.destroy(); + } + }); + } + } + + beforeReq = (requestOptions: STRequestOptions) => { + Object.assign(requestOptions.body, this.params); + return requestOptions; + }; + + initST() { + this.columns = [ + { title: '网络货运人', index: 'ltdName', className: 'text-center' }, + { + title: '平安资金账户', + render: 'paAccount', + className: 'text-center', + iif: _ => this.isCanCreate + }, + { + title: '浦发资金账户', + render: 'pfAccount', + className: 'text-center', + iif: _ => this.isCanCreate + }, + { + title: '平安账户余额', + render: 'paBalance', + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.paBalance)}`, + iif: _ => !this.isCanCreate + }, + { + title: '浦发账户余额', + render: 'pfBalance', + className: 'text-right', + format: item => `${this.currencyPipe.transform(item.pfBalance)}`, + iif: _ => !this.isCanCreate + } + ]; + } +} diff --git a/src/app/shared/components/address/address.component.html b/src/app/shared/components/address/address.component.html new file mode 100644 index 00000000..70f0fb82 --- /dev/null +++ b/src/app/shared/components/address/address.component.html @@ -0,0 +1,16 @@ + diff --git a/src/app/shared/components/address/address.component.ts b/src/app/shared/components/address/address.component.ts new file mode 100644 index 00000000..6800e8bb --- /dev/null +++ b/src/app/shared/components/address/address.component.ts @@ -0,0 +1,84 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, OnInit } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { BooleanInput, InputBoolean } from '@delon/util'; +import { + NzCascaderExpandTrigger, + NzCascaderOption, + NzCascaderSize, + NzCascaderTriggerType, + NzShowSearchOptions +} from 'ng-zorro-antd/cascader'; + +import { AddressService, AddressType } from './address.service'; + +@Component({ + selector: 'address', + templateUrl: './address.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => AddressComponent), + multi: true + } + ], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AddressComponent implements OnInit, ControlValueAccessor { + static ngAcceptInputType_allowClear: BooleanInput; + static ngAcceptInputType_autoFocus: BooleanInput; + static ngAcceptInputType_disabled: BooleanInput; + + private onChangeFn?: (val: string) => void; + private onTouchedFn?: () => void; + value: string[] = []; + data?: NzCascaderOption[]; + + // #region fields + + @Input() type: AddressType = 'pca'; + + // Original attributes + @Input() @InputBoolean() allowClear = true; + @Input() @InputBoolean() autoFocus = false; + @Input() @InputBoolean() disabled = false; + @Input() expandTrigger: NzCascaderExpandTrigger = 'click'; + @Input() notFoundContent?: string; + @Input() size: NzCascaderSize = 'default'; + @Input() showSearch!: boolean | NzShowSearchOptions; + @Input() placeHolder = '请选择所在地'; + @Input() mouseEnterDelay = 150; // ms + @Input() mouseLeaveDelay = 150; // ms + @Input() triggerAction: NzCascaderTriggerType | NzCascaderTriggerType[] = ['click'] as NzCascaderTriggerType[]; + + // #endregion + + constructor(private srv: AddressService, private cdr: ChangeDetectorRef) {} + + change(): void { + this.onChangeFn!(this.value.pop()!); + } + + ngOnInit(): void { + this.srv[this.type].subscribe(res => { + this.data = res; + this.cdr.markForCheck(); + }); + } + + writeValue(geo: string): void { + if (geo == null) { + this.value = []; + return; + } + this.value = this.srv.toValueArr(geo, this.type); + } + registerOnChange(fn: any): void { + this.onChangeFn = fn; + } + registerOnTouched(fn: any): void { + this.onTouchedFn = fn; + } + setDisabledState?(isDisabled: boolean): void { + this.disabled = isDisabled; + } +} diff --git a/src/app/shared/components/address/address.module.ts b/src/app/shared/components/address/address.module.ts new file mode 100644 index 00000000..e69c1506 --- /dev/null +++ b/src/app/shared/components/address/address.module.ts @@ -0,0 +1,15 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { NzCascaderModule } from 'ng-zorro-antd/cascader'; + +import { AddressComponent } from './address.component'; + +const COMPONENTS = [AddressComponent]; + +@NgModule({ + imports: [CommonModule, FormsModule, NzCascaderModule], + declarations: COMPONENTS, + exports: COMPONENTS +}) +export class AddressModule {} diff --git a/src/app/shared/components/address/address.service.ts b/src/app/shared/components/address/address.service.ts new file mode 100644 index 00000000..27e11a82 --- /dev/null +++ b/src/app/shared/components/address/address.service.ts @@ -0,0 +1,79 @@ +import { Injectable } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { ArrayService } from '@delon/util'; +import { NzCascaderOption } from 'ng-zorro-antd/cascader'; +import { Observable, of } from 'rxjs'; +import { map } from 'rxjs/operators'; + +export interface PCCode { + code?: string; + name?: string; + value?: string; + label?: string; + isLeaf?: boolean; + children?: PCCode[]; +} + +export type AddressType = 'pc' | 'pca'; +const MAXLENGTH = 6; + +@Injectable({ providedIn: 'root' }) +export class AddressService { + private _pcCode?: NzCascaderOption[]; + private _pcaCode?: NzCascaderOption[]; + + /** + * “省份、城市” 二级联动数据,数据来源于 [pc-code.json](https://github.com/modood/Administrative-divisions-of-China/blob/master/dist/pc-code.json) + */ + get pc(): Observable { + return this._pcCode ? of(this._pcCode) : this.getPcCode(); + } + + /** + * “省份、城市、区县” 三级联动数据,数据来源于 [pc-code.json](https://github.com/modood/Administrative-divisions-of-China/blob/master/dist/pca-code.json) + */ + get pca(): Observable { + return this._pcaCode ? of(this._pcaCode) : this.getPcaCode(); + } + + constructor(private http: _HttpClient, private arrSrv: ArrayService) {} + + /** + * 始终保持 6 位数,不足补 `0` + */ + fixValue(val: string): string { + return `${val}000000`.substr(0, MAXLENGTH); + } + + toValueArr(val: string, type: AddressType): string[] { + val = this.fixValue(val); + const res: string[] = []; + if (type === 'pc') { + res.push(val.substr(0, 2), val); + } else { + for (let i = 0; i < MAXLENGTH; i += 2) { + res.push(val.substr(0, i + 2)); + } + } + return res.map(this.fixValue); + } + + private map = (res: PCCode[]): NzCascaderOption[] => { + this.arrSrv.visitTree(res, (item: PCCode) => { + item.value = this.fixValue(item.code!); + item.label = item.name; + if (!item.children) { + item.isLeaf = true; + } + }); + return res; + }; + + private getPcCode(): Observable { + return this.http.get('./assets/tmp/pc-code.json').pipe(map(this.map)); + } + + private getPcaCode(): Observable { + return this.http.get('./assets/tmp/pca-code.json').pipe(map(this.map)); + } +} diff --git a/src/app/shared/components/address/index.en-US.md b/src/app/shared/components/address/index.en-US.md new file mode 100644 index 00000000..aebdbca4 --- /dev/null +++ b/src/app/shared/components/address/index.en-US.md @@ -0,0 +1,26 @@ +--- +order: 110 +title: address +type: Component +--- + +China address picker, support two styles of “province, city” or “province, city, district”, refer to the account management example. + +## API + +| Property | Description | Type | Default | +|----------|----|----------|--------| +| `[ngModel]` | selected value, return the city or district code | `string` | - | +| `[type]` | Type of address | `pc,pca` | `pca` | +| `[allowClear]` | whether allow clear | `boolean` | `true` | +| `[autoFocus]` | whether auto focus the input box | `boolean` | `false` | +| `[disabled]` | whether disabled select | `boolean` | `false` | +| `[expandTrigger]` | expand current item when click or hover, one of 'click' 'hover' | `'click'|'hover'` | `'click'` | +| `[notFoundContent]` | Specify content to show when no result matches. | `string` | - | +| `[placeHolder]` | input placeholder | `string` | `'请选择所在地'` | +| `[showSearch]` | Whether support search. Cannot be used with `[nzLoadData]` at the same time | `boolean|NzShowSearchOptions` | `false` | +| `[size]` | input size, one of `large` `default` `small` | `'large'|'small'|'default'` | `'default'` | + +## sf widget + +Widget name: `address`. \ No newline at end of file diff --git a/src/app/shared/components/address/index.ts b/src/app/shared/components/address/index.ts new file mode 100644 index 00000000..912a8f05 --- /dev/null +++ b/src/app/shared/components/address/index.ts @@ -0,0 +1,3 @@ +export * from './address.service'; +export * from './address.component'; +export * from './address.module'; diff --git a/src/app/shared/components/address/index.zh-CN.md b/src/app/shared/components/address/index.zh-CN.md new file mode 100644 index 00000000..467f93a5 --- /dev/null +++ b/src/app/shared/components/address/index.zh-CN.md @@ -0,0 +1,26 @@ +--- +order: 110 +title: address +type: Component +--- + +地址选择器,支持“省份、城市”或“省份、城市、区县”两种风格,参考账号管理示例。 + +## API + +| 参数 | 说明 | 类型 | 默认值 | +|----------|----|----------|--------| +| `[ngModel]` | 指定选中项,返回城市或区县代码 | `string` | - | +| `[type]` | 类型 | `pc,pca` | `pca` | +| `[allowClear]` | 是否支持清除 | `boolean` | `true` | +| `[autoFocus]` | 是否自动聚焦,当存在输入框时 | `boolean` | `false` | +| `[disabled]` | 禁用 | `boolean` | `false` | +| `[expandTrigger]` | 次级菜单的展开方式,可选 'click' 和 'hover' | `'click'|'hover'` | `'click'` | +| `[notFoundContent]` | 当下拉列表为空时显示的内容 | `string` | - | +| `[placeHolder]` | 输入框占位文本 | `string` | `'请选择所在地'` | +| `[showSearch]` | 是否支持搜索,默认情况下对 `label` 进行全匹配搜索,不能和 `[nzLoadData]` 同时使用 | `boolean|NzShowSearchOptions` | `false` | +| `[size]` | 输入框大小,可选 `large` `default` `small` | `'large'|'small'|'default'` | `'default'` | + +## sf 小部件 + +小部件名称:`address`。 diff --git a/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.html b/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.html new file mode 100644 index 00000000..2b5b369d --- /dev/null +++ b/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.html @@ -0,0 +1,15 @@ + +
    +
    +
    巡航倍数 :
    +
    \ No newline at end of file diff --git a/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.less b/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.ts b/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.ts new file mode 100644 index 00000000..f1b990ac --- /dev/null +++ b/src/app/shared/components/amap/amap-path-simplifier/amap-path-simplifier.component.ts @@ -0,0 +1,326 @@ +import AMapLoader from '@amap/amap-jsapi-loader'; +import { Component, Input, OnChanges, OnInit, Output, SimpleChanges, EventEmitter, OnDestroy } from '@angular/core'; +import { amapConf } from '@conf/amap.config'; +import { InputNumber } from '@delon/util'; +import { throwError } from 'rxjs'; +import { BaseService } from 'src/app/shared/services'; +import { AmapService, InfoItem, MapList, PathList, POI } from '../amap.service'; +declare var AMap: any; +declare var AMapUI: any; +declare var Loca: any; + +const CONFIG = amapConf; +@Component({ + selector: 'amap-path-simplifier', + templateUrl: './amap-path-simplifier.component.html', + styleUrls: ['./amap-path-simplifier.component.less'] +}) +export class AmapPathSimplifierComponent implements OnInit, OnChanges, OnDestroy { + aMap: any; + pathSimplifierIns: any; + geocoder: any; + navigator: any; + infoWindow: any; + markerList: any; + SimpleMarker: any; + // 简单路径信息 + @Input() + mapList: MapList[] = []; + // 完整路线图信息 + @Input() + pathList: PathList[] = []; + // 当前选中路线图下标 + @Input() + selectedIndex = 0; + // 巡航倍数 + @InputNumber() + navSpeed = 1; + // 标点数组 + @Input() + pois: POI[] = []; + private _pois: any = []; + + @Input() + mapWidth = '800px'; + @Input() + mapHeight = '500px'; + + @Output() + readonly clcikPointEvent = new EventEmitter(); + + constructor(public service: BaseService, private amapService: AmapService) { + this.mapInit(); + } + ngOnChanges(changes: SimpleChanges): void { + // 路线图变更: 设置路线图, 指定路线图 + if (changes?.pathList?.currentValue && this?.pathSimplifierIns) { + this.setData(changes.pathList?.currentValue); + this.setPathIndex(this.selectedIndex); + } + + // 路径信息变更: 更新路线图, 设置路线图, 指定路线图, 获取终点地址信息并标点 + if (changes?.mapList?.currentValue) { + // console.log(this.mapList); + this.pathList = [ + { + name: '路线1', + points: changes.mapList?.currentValue + } + ]; + if (this?.pathSimplifierIns) { + this.setData(this.pathList); + if (changes.mapList?.currentValue.length > 0) { + this.setPathIndex(this.selectedIndex); + this.getPoiByPositon('起', 'blue', this.mapList[0]?.lnglat, '时间:' + this.amapService.formatTime(this.mapList[0]?.time)); + this.getPoiByPositon( + '终', + 'red', + this.mapList[this.mapList?.length - 1]?.lnglat, + '时间:' + this.amapService.formatTime(this.mapList[this.mapList?.length - 1]?.time) + ); + } + } + } + // 标点列表变更: 更新标点数据, 绘画标点 + if (changes?.pois?.currentValue) { + this._pois = changes?.pois?.currentValue; + if (this?.markerList && this._pois.length > 0) { + this.markerList.render(this._pois); + } + } + } + ngOnInit(): void {} + ngOnDestroy(): void { + // 销毁地图数据 + if (this.aMap) { + this.aMap.destroy(); + } + } + + /** 地图初始化 */ + mapInit() { + AMapLoader.load({ + key: CONFIG.key, + version: CONFIG.version, + plugins: [ + // 需要使用的的插件列表,如比例尺'AMap.Scale'等 + 'AMap.PathSimplifier', + 'AMap.InfoWindow', + 'AMap.Geocoder' + ], + AMapUI: { + version: CONFIG.AMapUIVersion, + plugins: ['misc/PathSimplifier'] // 需要加载的 AMapUI ui插件 + } + }) + .then(AMap => { + this.aMap = new AMap.Map('container', { + zoom: 10 + }); + + this.aMap.on('complete', () => { + // this.service.msgSrv.info('地图加载完成 !'); + // 信息窗口 + this.infoWindow = new AMap.InfoWindow({ + offset: new AMap.Pixel(0, -40) + }); + // 初始化定位工具 + this.geocoder = new AMap.Geocoder({ + radius: 500 //范围,默认:500 + }); + this.pathInit(); + this.setPOIS(); + }); + }) + .catch(e => { + throwError(e); + }); + } + + /** 初始化路径工具 */ + pathInit() { + this.pathSimplifierIns = new AMapUI.PathSimplifier({ + zIndex: 100, + //autoSetFitView:false, + map: this.aMap, + // 重组路径数据 + getPath: (pathData: PathList, pathIndex: number) => pathData.points.map(points => points.lnglat), + // 鼠标悬浮事件 + getHoverTitle: (pathData: PathList, pathIndex: number, pointIndex: number) => '', + renderOptions: { + renderAllPointsIfNumberBelow: 20 //绘制路线节点,如不需要可设置为-1 + } + }); + this.setData(this.pathList); + + if (this.mapList.length > 0) { + this.setPathIndex(this.selectedIndex); + this.getPoiByPositon('起', 'blue', this.mapList[0]?.lnglat, '时间:' + this.amapService.formatTime(this.mapList[0]?.time)); + this.getPoiByPositon( + '终', + 'red', + this.mapList[this.mapList?.length - 1]?.lnglat, + '时间:' + this.amapService.formatTime(this.mapList[this.mapList?.length - 1]?.time) + ); + } + + this.pathSimplifierIns.on('pointClick', (e: any, info: any) => { + this.clcikPointEvent.emit({ e, info }); + // 弹出信息窗口 + if (info) { + this.geocoder.getAddress(info.pathData.points[info.pointIndex].lnglat, (status: any, result: any) => { + if (status === 'complete' && result.info === 'OK') { + // result中对应详细地理坐标信息 + this.selectedPOI({ + position: info.pathData.points[info.pointIndex].lnglat, + content: ` +