| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 | import {	MessageBox} from 'mint-ui';import {	Toast} from 'mint-ui';export default {	data() {		return {			timeOut: 50000, //超时时间			subType: 0, //0 首次 1 再次			aiPicId: "", // 图生图任务ID			count: 0, //轮询次数			randomTimer: null,			timer: null,			currentImg: null, //当次生成图的结果			startCreate:false,	//是否开始生成AI图了			// myloading: false, //加载中			loadingMsg: '', //加载中的话术			reqList: [{				model: 'batouresearch/sdxl-controlnet-lora',				level: '5',				aiPicId: '',				resultImg: '',			}],			reqListReset: [{				model: 'deployments/elabgroup/elab-sdxl-controlnet-lora',				level: '3',				aiPicId: '',				resultImg: '',			}, {				model: 'batouresearch/sdxl-controlnet-lora',				level: '5',				aiPicId: '',				resultImg: '',			}],			createTabIndex:0,	//生成AI图时记录下当前AI图的类型序号			createOptionIndex:0,//生成AI图时记录下当前AI图的选项序号			paramObj:null,	//启动参数-外界传进来的		}	},	methods: {		//前置逻辑		async prevHandle(parmas) {			//不是首次请求,则无需前置判断 用户上传的也不需要前置处理			if (this.subType != 0) {				return '';			}			return new Promise(async (resolve, reject) => {				let _data = JSON.parse(JSON.stringify(parmas))				delete _data.webhook;				let res = await requestConfig("img2img_local", _data);				if (res.success) {					if (res.success && res.single) {						let resultImg = res.single;						resolve(resultImg);					} else {						resolve('');					}				} else {					resolve('');				}			})		},		//随机处理		randomHandle(resultImg) {			if (this.timer || !resultImg) {				return false;			}			let self = this;			var count = 1;			var process = 0; //进度			var randomNum = Math.floor(Math.random() * 4 + 5); //5-8随机数			this.randomTimer = setInterval(function() {				process = parseInt(count * 100 / (randomNum));				if (process >= 100) {					process = 99;				}				if (count < randomNum) { //没有到上限					// self.myloading = true;					self.loadingMsg = '生成中…' + process + '%';				} else {					// self.myloading = false;					this.loadingMsg = '生成中…100%';					self.resultHandle(resultImg);				}				count = count + 1;			}, 1000);		},		//开始图生图流程		async startServer(obj) {			if (!obj || !obj.imgUrl || !obj.prompt || !obj.negativePrompt) {				Toast({					message: '数据不全',				});				return false			}			// if(this.$parent.pvCurPageName!="room_show"){//说明用户切换页面了			// 	console.warn("***用户已经退出页面***")			// 	return false;			// }			let imgUrl = obj.imgUrl;			let subType = this.subType;			let session_hash = Date.now();			let prompt = obj.prompt;			let noPromot = obj.negativePrompt;			// let unit = 768 / this.screenWidth;			// this.imageWidth = parseInt((this.screenWidth * unit).toFixed());			// this.imageHeight = parseInt((this.$parent.canvasHeight * unit).toFixed());			if(this.startCreate){				return false			}			this.startCreate = true;			this.paramObj = obj;			this.loadingMsg = '启动中';			this.createTabIndex = obj.tabIndex;			this.createOptionIndex = obj.optionIndex;			var parmas = {				negativePrompt: noPromot,				prompt: prompt,				"batchSize": 1,				brandId: $config.brandId,				height: 1,				width: 1,				"moduleType": "AI_Biography",				"steps": 20,				"sampler": "DDIM",				"controlNetSessionHash": session_hash,				"cfgScale": 12,				"denoising": 0.9,				image: imgUrl,				// styleImage:imgUrl,				keyword: "zhiqite",				model: 'controlnet',			};			let result = await this.prevHandle(parmas);			console.warn("***prevHandle***", result)			if (result && result.length > 0) { //匹配到了,则随机处理				this.randomHandle(result)				return false;			} else {				this.otherHandle(parmas); //发送其他AI请求				let res = await requestConfig("generateTaskImgToImgForAliyun", parmas);				console.log("图生图结果:", res);				let that = this;				if (res.success && res.single) {					this.aiPicId = res.single;					if (subType == 0) { //首次						this.reqList[0].aiPicId = this.aiPicId;					} else { //重试						this.reqListReset[0].aiPicId = this.aiPicId;					}					if (this.aiPicId) {						this.startInterval(); //开始轮询AI生成图的结果					} else {						this.stopInterval()					}				} else {					this.stopInterval()					// this.showToast("渲染失败,请重试")				}			}		},		stopInterval() {			if (this.randomTimer) {				clearInterval(this.randomTimer);				this.randomTimer = null;			}			if (this.timer) {				// clearInterval(this.timer);				this.timer = null;			}			if (this.outTimer) {				clearTimeout(this.outTimer)				this.outTimer = null			}			this.subType = 0;			this.reqList.forEach(it => {				it.aiPicId = '';				it.resultImg = '';			})			this.reqListReset.forEach(it => {				it.aiPicId = '';				it.resultImg = '';			})			// this.myloading = false;			// this.aiFlag = false;			this.startCreate = false;//释放标志		},		//从请求接口队列里面挨个发出请求		otherHandle(parmas) {			let reqList = [];			if (this.subType == 0) { //首次				reqList = this.reqList;			} else { //重试				reqList = this.reqListReset;			}			reqList.forEach(async (it, index) => {				let _data = JSON.parse(JSON.stringify(parmas));				if (index > 0) {					_data.model = it.model;					let res = await requestConfig("generateTaskImgToImgForAliyun", _data);					if (res.success) {						console.log('生成结果123:', res);						it.aiPicId = res.single || '';					}				}			})		},		//开始生成AI图的轮询,每隔1s轮询一次		startInterval() {			if (this.timer) {				return false;			}			let self = this;			this.count = 1; //轮询次数			var random = 0;			this.currentImg = false; //当次生成图还没有结果			this.timer = 1; //标志进入了轮询流程			this.getOutPicture(); //不在轮询,而是等结果			this.setOutTimer(); //设置超时逻辑		},		//设置一个超时逻辑,到底指定时间后停止轮询,当前是90s		setOutTimer() {			if (this.outTimer) {				clearTimeout(this.outTimer)				this.outTimer = null			}			var self = this;			this.outTimer = setTimeout(function() {				if (self.timer) {					let hasResult = false;					let reqList = [];					if (self.subType == 0) { //首次						reqList = self.reqList;					} else { //重试						reqList = self.reqListReset;					}					reqList.some((item, index) => {						if (item.resultImg) {							hasResult = true;							self.resultHandle(item.resultImg)						}					});					console.warn("***hasResult***", hasResult)					if (!hasResult) { //没有结果						self.stopInterval(); //停止轮询						MessageBox.confirm('', {							title: '提示',							message: '当前AI使用火爆,请继续尝试?',							showCancelButton: true,							confirmButtonText: '继续尝试',							cancelButtonText: '取消等待',						}).then(action => {							console.warn("***MessageBox-action***", action)							if (action == 'confirm') {								self.confirmHandle(1);							}						}).catch(err => {							console.warn("***MessageBox-err***", err)							if (err == 'cancel') {								self.cancelHandle();							}						});					}				}				clearTimeout(self.outTimer);				self.outTimer = null			}, this.timeOut);		},		confirmHandle(type) {			this.subType = type || 0;			this.startServer(this.paramObj);		},		cancelHandle() {			this.subType = 0;		},		//获取生成图结果		getOutPicture() {			if (this.timer == null) {				console.warn("***当前轮询已经结束了1***")				return false;			}			let reqList = [];			if (this.subType == 0) { //首次				reqList = this.reqList;			} else { //重试				reqList = this.reqListReset;			}			reqList.forEach((item, index) => {				this.singleHandle(item)			});		},		//发出获取结果请求获取AI生成结果		async singleHandle(model) {			if (!model || !model.aiPicId) {				return false;			}			var parmas = {				id: model.aiPicId,			};			let res = await requestConfig("getPredictions", parmas);			if (res.success && res.single) {				if (this.currentImg) { //当前已经有生成图了					console.warn("***当前已经有最高级生成图了***")					return false;				}				if (this.timer == null) {					console.warn("***当前轮询已经结束了***")					return false;				}				if (res.single.status == 'succeeded' && res.single.output) {					model.resultImg = res.single.output; //把生成图结果记录到请求接口对象里面					if (model.level == '5') { //最高级的生成图,可以直接用						this.currentImg = true;						setTimeout(() => {							this.resultHandle(res.single.output)						}, 1500)					}					console.warn("***有生成图了***", model)				}				if (model.level == '5') { //最高优先级的接口返回的结果					this.processHandle(res.single);				}			} else if (!res.success && model.level == '5') { //最高优先级的接口返回失败				this.stopInterval(); //停止轮询				// this.showToast("渲染失败,请重试")			}		},		//进度处理		processHandle(single) {			console.warn("***single***", single.status, single.progress, this.count, single);			let self = this;			if (single.status == 'starting') { //启动中的逻辑				if (this.count >= 20) {					this.stopInterval(); //停止轮询					MessageBox.confirm('', {						title: '提示',						message: 'AI开了小差,是否重新生成?',						showCancelButton: true,						confirmButtonText: '继续生成',						cancelButtonText: '放弃生成',					}).then(action => {						console.warn("***MessageBox-action***", action)						if (action == 'confirm') { //继续生成							this.confirmHandle(0);						}					}).catch(err => {						if (err == 'cancel') {							this.cancelHandle();						}					});				} else {					// this.myloading = true;					this.loadingMsg = '启动中';				}				this.count = this.count + 1;                setTimeout(()=>{                    this.getOutPicture();                },10000)			} else if (single.status == 'processing') {				let random = single.progress || 0;				if (random >= 100) {					random = 99;				}				// this.myloading = true;				this.loadingMsg = '生成中…' + parseInt(random) + '%';				setTimeout(()=>{				    this.getOutPicture();				},10000)			} else if (single.status == 'succeeded') {				// this.myloading = true;				this.loadingMsg = '生成中…100%';			}		},		//返回结果处理		resultHandle(resultImg) {			this.currentImg = true;			this.aiImage = resultImg;			this.stopInterval();			let newImage = resultImg;			// let aiStyleName = this.styleList[this.curStyleIndex].styleName;			let _data = {				imageUrl: newImage,				checked: false,				type:'AI',//表示AI生成的			}			// this.aiImagesList.push(_data);			this.paramObj = null;//生成成功后,清楚外界传入参数			// this.tabData[this.createTabIndex].options[this.createOptionIndex].hardboundEffect.push(_data);			if (this.createTabIndex == this.tabIndex) {				let len = this.aiImagesList.length;				this.aiImagesList.push(_data);				setTimeout(() => {					this.$refs.carousel.setActiveItem(len); //切换到最后一张				}, 200);			}else{				this.tabData[this.createTabIndex].options[this.createOptionIndex].hardboundEffect.push(_data);			}			// this.subDataList[this.tabIndex].hardboundEffect.push(_data);//把数据同步到对应的待提交对象中		},	}}
 |