上海预案管理平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
6.3 KiB

/*
* @Descripttion:
* @version:
* @Author: sueRimn
* @Date: 2021-06-16 13:56:54
* @LastEditors: sueRimn
* @LastEditTime: 2021-06-17 10:01:26
*/
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-create-plan-online-five',
templateUrl: './create-plan-online-five.component.html',
styleUrls: ['./create-plan-online-five.component.scss']
})
export class CreatePlanOnlineFiveComponent implements OnInit {
constructor(private http: HttpClient, private route: ActivatedRoute) { }
planName: string //预案名称
planLevel: string//预案级别
ngOnInit(): void {
this.planName = this.route.snapshot.queryParams.planName
this.planLevel = this.route.snapshot.queryParams.planCategory
console.log('级别', this.planLevel)
this.getTemplateData()
this.getUnitData()
}
//获得单位信息
unitData: any
getUnitData() {
let paramsdata: any = {
Name: this.route.snapshot.queryParams.unitName || '',
}
this.http.get("/api/Companies", { params: paramsdata }).subscribe((data: any) => {
data.items.forEach(element => {
if (element.id == this.route.snapshot.queryParams.companyId) {
this.unitData = element
console.log('单位列表信息', this.unitData)
}
});
})
}
selectedItem: string = '封面'
clickTitleItem(item) {
item == '封面' ? this.selectedItem = '封面' : this.selectedItem = item.groupName
}
planTemplateData: any
//获得模板信息
getTemplateData() {
this.http.get('/api/PlanTemplate').subscribe(data => {
this.planTemplateData = JSON.parse(data[2].data).filter(item =>
item.completed == true
)
console.log(this.planTemplateData)
this.planTemplateData.forEach(element => {
if (element.groupName == '重点图示') {
if (!element.attribute) {
element.attribute = [{ name: '', imgArr: [] }]
}
}
});
})
}
//重点图示增加分组
addkeyImgItem() {
this.planTemplateData.forEach(element => {
if (element.groupName == '重点图示') {
element.attribute.push({ name: '', imgArr: [] })
}
});
}
//重点图示删除指定分组
deleteItem(key) {
let isDelete = window.confirm('确定要删除该分组吗?分组下上传的图片将一同被删除!')
if (isDelete) {
this.planTemplateData.forEach(element => {
if (element.groupName == '重点图示') {
element.attribute.splice(key, 1)
}
});
}
}
//重点图示上传图片
file: any
filechange(e) {
this.file = e.target.files[0] || null //上传的文件
let file = e.target.files[0] || null //获取上传的文件
let fileSize = file.size || null //上传文件的总大小
let maxSize = 5 * 1024 * 1024 //5MB一个分片
let tenSize = 100 * 1024 * 1024 //100MB限制
if (file && fileSize <= maxSize) { //上传文件<=5MB时
let upload = this.uploadFile(this.route.snapshot.queryParams.companyId, this.route.snapshot.queryParams.companyId, file)
upload.then(res => {
console.log('小于5M', res)
//图片地址 /api/Objects/PlanPlatform/res.objectName
})
} else { //上传文件>5MB时
let upload = this.sectionUpload(this.route.snapshot.queryParams.companyId, this.route.snapshot.queryParams.companyId, file)
upload.then(res => {
// this.renovateBaseMap('/api/Objects/PlanPlatform/' + res, item)
console.log('大于5M', res)
})
}
// else {
// const config = new MatSnackBarConfig();
// config.verticalPosition = 'top';
// config.duration = 3000
// this.snackBar.open('上传底图需小于100MB', '确定', config);
// }
}
async uploadFile(companyId: string, planId: string, file) {
let formData = new FormData()
formData.append("file", file)
return new Promise((resolve, reject) => {
this.http.post(`/api/Objects/PlanPlatform/${companyId}/${planId}`, formData).subscribe((data: any) => {
resolve(data)
})
})
}
//input key值,一个字符焦点消失问题
trackByFn(index){
return index
}
//分段上传
sectionUpload(companyId: string, planId: string, file) {
let data = { filename: file.name }
return new Promise((resolve, reject) => {
this.http.post(`/api/NewMultipartUpload/PlanPlatform/${companyId}/${planId}`, {}, { params: data }).subscribe(async (data: any) => { //初始化分段上传
let objectName = data.objectName
let uploadId = data.uploadId
let PartNumberETag = []; //每次返回需要保存的信息
//分块 处理
let fileSize = file.size || null //上传文件的总大小
let shardSize = 5 * 1024 * 1024 //5MB一个分片
let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段
for (let i = 0; i < allSlice; i++) { //循环分段上传
let start = i * shardSize //切割文件开始位置
let end = Math.min(fileSize, start + shardSize); //切割文件结束位置
let formData = new FormData()
formData.append("file", file.slice(start, end))
//同步写法实现异步调用
let result = await new Promise((resolve, reject) => {
// await 需要后面返回一个 promise 对象
this.http.post(`/api/MultipartUpload/PlanPlatform/${objectName}?uploadId=${uploadId}&partNumber=${i + 1}`, formData).subscribe((data: any) => {
let msg = { "partNumber": data.partNumber || null, "eTag": data.eTag || null }
resolve(msg) // 调用 promise 内置方法处理成功
})
});
PartNumberETag.push(result)
if (PartNumberETag.length === allSlice) { //分块上传完成
let data = PartNumberETag
let paramsData = { uploadId: uploadId }
this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${objectName}`, data, { params: paramsData }).subscribe(data => {
resolve(objectName)
})
}
}//for循环
//分块 处理
})
})
}
}
export interface unitData {
name: string,
organizationName: number,
buildingTypes: buildingTypes[]
}
export interface buildingTypes {
id: string,
name: string,
}