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);//把数据同步到对应的待提交对象中
- },
- }
- }
|