车辆对接

This commit is contained in:
wangshiming
2021-12-24 15:49:47 +08:00
parent 5ef6635df8
commit 4011f13d30
9 changed files with 1 additions and 2715 deletions

View File

@ -3,7 +3,6 @@ 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 { SettingRoleEditComponent } from './edit/edit.component';
@Component({
selector: 'app-crm-management',
@ -73,7 +72,7 @@ export class CrmManagementComponent implements OnInit {
roleAction(item?: any) {
const modal = this.nzModalService.create({
nzContent: SettingRoleEditComponent,
// nzContent: SettingRoleEditComponent,
nzWidth: 900,
nzComponentParams: item ? { i: { ...item } } : { i: { id: 0 } },
nzFooter: null

View File

@ -1,23 +0,0 @@
<div class="modal-header">
<div class="modal-title">{{ i.id === 0 ? '新增角色' : '编辑角色' }}</div>
</div>
<nz-spin *ngIf="!i" class="modal-spin"></nz-spin>
<div *ngIf="i">
<sf #sf [compact]="true" [ui]="ui" [schema]="schema" [button]="'none'"> </sf>
</div>
<div class="box">
<se-container se-container="1">
<se label="角色权限" required [labelWidth]="120">
<app-cuc-menu #menu (changeData)="getData($event)" [type]="i.id === 0 ? 'add' : 'edit'" [source]="source"
[roleId]="i.id" [isAuthorityIdDTOList]="roleInfoData.authority"
[authorityAssistId]="roleInfoData.authorityAssistId">
</app-cuc-menu>
</se>
</se-container>
</div>
<div class="modal-footer">
<button nz-button type="button" (click)="close()">{{ source === 'onlyAuth' ? '关闭' : '取消' }}</button>
<button nz-button type="button" nzType="primary" (click)="sure()" *ngIf="source !== 'onlyAuth'"
[disabled]="!sf?.valid">确定</button>
</div>

View File

@ -1,23 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { CucRoleEditComponent } from './edit.component';
describe('CucRoleEditComponent', () => {
let component: CucRoleEditComponent;
let fixture: ComponentFixture<CucRoleEditComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [CucRoleEditComponent],
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CucRoleEditComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,151 +0,0 @@
import { AfterViewInit, ChangeDetectorRef, Component, OnChanges, OnInit, ViewChild } from '@angular/core';
import { SFComponent, SFSchema, SFSchemaEnumType, SFUISchema } from '@delon/form';
import { _HttpClient } from '@delon/theme';
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;
record: any = {};
roleInfoData: any = {};
authorityAssistId: any[] = [];
appList: any[] = [];
source = '';
i: any;
schema!: SFSchema;
authority: any[] = [];
roleTplData: any[] = [];
appId = '';
ui!: SFUISchema;
constructor(private modal: NzModalRef, public service: SystemService, public http: _HttpClient, private cdr: ChangeDetectorRef) {}
ngOnInit(): void {
console.log('i', this.i, this.source);
if (this.i.id) {
this.getRoleInfo();
} else {
this.getTplList();
}
if (this.source === '') {
this.initSF();
}
}
initSF() {
this.schema = {
properties: {
roleName: {
title: '角色名称',
type: 'string',
default: this.roleInfoData.roleName,
maxLength: 20,
ui: {
placeholder: '请输入角色名称'
}
},
roleDescription: {
title: '角色描述',
type: 'string',
maxLength: 100,
default: this.roleInfoData.roleDescription,
ui: {
autosize: { minRows: 3 },
hidden: this.i.lookType === 'detail',
placeholder: '请输入角色描述',
widget: 'textarea'
}
}
},
required: ['roleName']
};
this.ui = {
'*': {
spanLabelFixed: 120,
grid: { span: 24 }
}
};
}
getAppList() {
const params = {
pageSize: 10000,
pageIndex: 1
};
return this.service.request(this.service.$api_getAppList, params).pipe(
map(res => {
this.appList = res;
const versionArr: any[] = [];
const resArr = res;
if (resArr && resArr.length) {
resArr.forEach((item: any) => {
versionArr.push({
label: item.appName,
value: item.appId
});
});
}
return versionArr;
})
);
}
getTplList() {
// this.menu.getAllFunction();
}
getRoleInfo() {
const params = {
id: this.i.id
};
this.service.request(this.service.$api_getRoleInfo, params).subscribe(res => {
this.roleInfoData = res;
this.roleInfoData.authority = res.authority || [];
this.roleInfoData.authorityAssistId = res.authorityAssistId || [];
if (this.source === '') {
this.initSF();
}
this.getTplList();
});
}
getData(res: { authority: any[]; authorityAssistId: any[] }) {
this.authority = res.authority;
this.authorityAssistId = res.authorityAssistId;
}
close() {
this.modal.destroy();
}
sure() {
this.menu.washTree();
if (this.authorityAssistId.length === 0) {
this.service.msgSrv.warning('请选择权限!');
return;
}
const params: any = {
id: this.i.id,
...this.sf.value,
authority: this.authority,
authorityAssistId: this.authorityAssistId
};
if (this.sf) {
this.appList.forEach(item => {
if (item.appId === this.sf.value.appId) {
params.tenantId = item.tenantId;
}
});
}
delete params.tplId;
if (this.i.id === 0) {
delete params.id;
}
this.service.request(this.service.$api_updateRoleInfo, params).subscribe(res => {
this.modal.close(true);
});
}
}

View File

@ -1,17 +0,0 @@
: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;
}
}
}

View File

@ -1,39 +0,0 @@
<div class="treeWrap">
<div class="leftBox">
<nz-tree #nzTreeComponent [nzData]="functionList" (nzClick)="nzEvent($event)" nzCheckable
[nzCheckedKeys]="defaultCheckedKeys" [nzExpandedKeys]="defaultExpandedKeys">
</nz-tree>
</div>
<div class="rightBox">
<nz-tabset [nzSize]="'small'">
<nz-tab nzTitle="操作权限">
<div *ngFor="let item of origin?.buttonInfoList">
<label nz-checkbox [(ngModel)]="item.checked" (ngModelChange)="addAuthority(origin, node, item)">{{ item.title
}}</label>
</div>
<nz-empty nzNotFoundImage="simple" *ngIf="origin?.buttonInfoList?.length === 0">
</nz-empty>
</nz-tab>
<nz-tab nzTitle="数据权限">
<div *ngIf="origin.dictList?.length>0" se-container [labelWidth]="100">
<se [col]="1" label="用户范围" style="margin-bottom: 8px;" required>
<nz-select>
<nz-option nzValue="仅可见自己创建的数据" nzLabel="仅可见自己创建的数据"></nz-option>
<nz-option nzValue="可见全部人创建的数据" nzLabel="可见全部人创建的数据"></nz-option>
</nz-select>
</se>
<se [col]="1" label="运营主体" style="margin-bottom: 8px;" required>
<nz-select nzMode="multiple" nzShowSearch>
<nz-option nzValue="全部" nzLabel="全部"></nz-option>
<nz-option nzValue="天津" nzLabel="天津"></nz-option>
<nz-option nzValue="山西" nzLabel="山西"></nz-option>
<nz-option nzValue="北京" nzLabel="北京"></nz-option>
</nz-select>
</se>
</div>
<p *ngIf="origin?.dictList?.length === 0">此应用功能模块无数据权限限制,如需添加,请联系系统管理员。</p>
</nz-tab>
</nz-tabset>
</div>
</div>
<nz-empty nzNotFoundImage="simple" *ngIf="functionList.length === 0"></nz-empty>

View File

@ -1,361 +0,0 @@
import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core';
import { ModalHelper, _HttpClient } from '@delon/theme';
import { NzFormatEmitEvent, NzTreeNodeOptions } from 'ng-zorro-antd/core/tree';
import { NzTreeComponent } from 'ng-zorro-antd/tree';
import { SystemService } from '../../../services/system.service';
import { Funcs } from './funcs';
@Component({
selector: 'app-cuc-menu',
templateUrl: './menu.component.html',
styleUrls: ['menu.less']
})
export class SettingMenuComponent implements OnInit {
@ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent;
origin: any = { buttonInfoList: Funcs[0].children, dictList: Funcs[0].children };
node: any = {};
authority: any[] = [];
defaultSelectedKeys: any[] = [];
defaultExpandedKeys: any[] = [];
defaultCheckedKeys: any[] = [];
functionList: any[] = Funcs;
selectProject: any = {};
selectApp: any = {};
@Input() type = 'edit';
@Input() source = '';
@Input() isAuthorityIdDTOList: any[] = [];
@Input() authorityAssistId: any[] = [];
@Input() roleId: any;
@Output() changeData = new EventEmitter();
constructor(public service: SystemService, private cdr: ChangeDetectorRef) {}
ngOnInit() {
if (this.type === 'edit') {
this.authority = this.isAuthorityIdDTOList;
}
}
getAllFunction() {
this.service.request(this.service.$api_getAllFunctionInfoByAppId, { 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; id: any }) {
if (this.authority.length && this.authority.filter(authItem => authItem.authorityId === origin.id).length) {
// 判断此菜单权限是否已经存在权限列表中
// 当前操作菜单id存在权限列表里
this.authority.forEach((menuItem, menuIndex) => {
if (menuItem.authorityId === origin.id) {
menuItem.buttonAuthorityIds = menuItem.buttonAuthorityIds || []; // 防止属性不存在,给属性指定数据类型
if (item) {
// 单选
if (item.checked) {
if (menuItem.buttonAuthorityIds.indexOf(item.id) === -1) {
// 如果该按钮在数据权限数组中不存在
menuItem.buttonAuthorityIds.push(item.id);
}
} else {
if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) {
menuItem.buttonAuthorityIds.forEach((btnItem: any, index: any) => {
if (btnItem === item.id) {
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.id);
} else {
node.buttonInfoList.forEach((nodeItem: { id: any; checked: 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;
}
addAuthorityAll(origin: any, node: { checked: any; buttonInfoList: any[] }) {
if (node.checked) {
node.buttonInfoList.forEach((item: any) => {});
} else {
}
}
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);
}
});
}
// 获取角色模板权限
getRoleTpl(id: any) {
const params = {
id
};
this.service.request(this.service.$api_getRoleTemplateInfo, params).subscribe(res => {
this.authority = res.authority;
this.defaultCheckedKeys = res.authorityAssistId;
});
}
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 {
const ele = event.event.target as HTMLElement;
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);
}
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 });
if (item.isLeaf) {
return;
}
if (item.children) {
this.overWashTree(item.children, tempAuthorityIdDTOListMenu, authorityMenu);
}
});
}
initButtonList(id: any, origin: any) {
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.length === 0) {
return;
}
this.authority.forEach(item => {
if (item.authorityId === id) {
// 如果当前菜单Id等于暂存权限数组的Id
if (item.buttonAuthorityIds && item.buttonAuthorityIds.length) {
// 如果当前菜单Id权限数组不为空
origin.buttonInfoList.forEach((btnItem: { id: any; checked: boolean }) => {
// 判断已有权限id是否存在
if (item.buttonAuthorityIds.indexOf(btnItem.id) !== -1) {
btnItem.checked = true;
} else {
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;
}
});
});
});
}
}
});
}
}

View File

@ -1,202 +0,0 @@
: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;
}
label {
color : #666;
font-size: 13px;
}
.treeWrap {
display: flex;
width : 700px;
.leftBox {
width : 250px;
border : 1px solid #d1d1d1;
max-height: 500px;
overflow : auto;
}
.rightBox {
flex : 1;
margin : 0 0 0 20px;
padding-left: 12px;
border : 1px solid #d1d1d1;
max-height : 500px;
overflow : auto;
}
}