53 次代码提交 6e799d4eb9 ... 619c6b52a0

作者 SHA1 备注 提交日期
  yanym 619c6b52a0 生产积分系统放开 1 月之前
  yanym e28b6a80b7 Merge branch '添加生图积分和服务商切换' into 20260415生产发布版本 1 月之前
  yanym 69325782b5 免费生图次数判断修改 1 月之前
  yanym 33de9fbe5b 免费生图次数判断修改 1 月之前
  yanym f3007d22b6 Merge branch '内墙设计回显修改' into 20260415生产发布版本 1 月之前
  yanym f5e4fb2d78 内墙设计回显修改 1 月之前
  yanym 6135768676 外墙设计生图所需积分修改 1 月之前
  yanym f27256fb34 外墙设计生图所需积分修改 1 月之前
  yanym 1ce33c289b Merge branch '历史记录内墙样式与外墙同步' into 20260415生产发布版本 1 月之前
  yanym 019c8f21a6 Merge branch '添加生图积分和服务商切换' into 20260415生产发布版本 1 月之前
  yanym 430de4907f 调整内外墙提交设计后,默认等待时间为20秒、一键诊断时间为10秒 1 月之前
  yanym 07bce974ec 确认ai设计传参修改 1 月之前
  yanym 4d613bc540 图片预览优化 1 月之前
  yanym 37199dee32 服务商切换优化 1 月之前
  yanym 9994d05927 原图效果图预览修改 1 月之前
  yanym b17dbed72b Merge branch '添加生图积分和服务商切换' into 20260415生产发布版本 1 月之前
  yanym 1d2d159e1f 切换服务商修改 1 月之前
  yanym ec8483052d Merge branch '我要报备跳转链接修改' into 20260415生产发布版本 1 月之前
  yanym 3b0d51e168 Merge branch '添加生图积分和服务商切换' into 20260415生产发布版本 1 月之前
  yanym 030a0a5495 切换服务商修改 1 月之前
  yanym 606f5be3ea GetOrderAddress接口添加servicecode参数 1 月之前
  yanym 4bef1e1857 设计页面去掉积分相关 1 月之前
  yanym 88bc3e511e Merge branch '添加生图积分和服务商切换' into 20260415生产发布版本 1 月之前
  yanym fcea8d0a57 Merge branch '外墙设计墙面分割线显示判断修改' into 20260415生产发布版本 1 月之前
  yanym 1b80289580 Merge branch '历史记录内墙样式与外墙同步' into 20260415生产发布版本 1 月之前
  yanym 3bb9b4e381 Merge branch '内墙设计增加墙顶一色选择开关' into 20260415生产发布版本 1 月之前
  yanym abd64277b3 standard/aidesign/outside/GetOrderAddress接口添加servicecode参数 1 月之前
  yanym ad01f7809c 一键反馈样式修改 1 月之前
  yanym 0cd0f75fe5 外墙设计回显修改 1 月之前
  yanym 149a21a174 一键反馈修改 1 月之前
  yanym 832ce92b4c 外墙重新设计后,选项居中显示 1 月之前
  yanym 0b032b2199 外墙重新设计后,选项居中显示 1 月之前
  yanym acd6adf1c6 报备项目列表边框样式优化 1 月之前
  yanym 6b6aea022f 增加一键反馈页面 1 月之前
  yanym 5979548a8f 重新生成回到设计页面自动切换对应服务商 1 月之前
  yanym b9ae57bf47 重新生成回到设计页面自动切换对应服务商 1 月之前
  yanym ea30235286 重新生成回到设计页面也获取积分 1 月之前
  yanym 120236e51e 服务商切换修改 1 月之前
  yanym e5013b4fe6 服务商切换修改 1 月之前
  yanym 68e3b91e4a 历史生成,内墙样式与外墙同步 1 月之前
  yanym 54fb86b62a 外墙设计增加服务商切换功能 1 月之前
  yanym 05ea6f11bb 外墙设计增加服务商切换功能 1 月之前
  yanym 8c214bb3c8 外墙设计增加服务商切换功能 1 月之前
  yanym 95482e8b3a 外墙设计增加服务商切换功能 1 月之前
  yanym ec4d5ff220 内墙设计墙顶一色选项样式修改 1 月之前
  yanym 2a887a566b 内墙设计添加墙顶一色选项 1 月之前
  yanym c70122634d 我要报备跳转链接修改,改成跳转小程序 2 月之前
  yanym ef206f871d 我要报备跳转链接修改,改成跳转小程序 2 月之前
  yanym c0cd8cffa7 外墙设计风格选中样式修改,隐藏测试环境控制台 2 月之前
  yanym 2e0220dc3c 外墙设计积分生图失败提示修改 2 月之前
  yanym 34284ee0d4 外墙设计添加积分机制修改 2 月之前
  yanym 0536bffe44 外墙设计添加积分机制 2 月之前
  yanym d3b722949b 外墙设计-设计风格,字体显示优化 2 月之前

+ 1 - 0
.env

@@ -1,6 +1,7 @@
 VUE_APP_PublicTitle=AI设计
 VUE_APP_PublicTitle=AI设计
 #  DIS小程序appid:gh_4eaccc0824ca
 #  DIS小程序appid:gh_4eaccc0824ca
 VUE_APP_BASE_DISID6=wx818da06b25f30cf5
 VUE_APP_BASE_DISID6=wx818da06b25f30cf5
+VUE_APP_BASE_DISID9=wx0e5521113960dc82
 #企业微信 
 #企业微信 
 # 应用appID
 # 应用appID
 VUE_APP_APPID=ww5444eb205d75e730
 VUE_APP_APPID=ww5444eb205d75e730

+ 28 - 3
src/api/indexAI.js

@@ -334,9 +334,35 @@ export function GetProductInfo(query) {
     })
     })
 }
 }
 
 
+// 获取生成图片剩余积分
+export function GetPoints(query) {
+    return request({
+        url: '/aidesign/outside/GetPoints',
+        method: 'post',
+        data:query
+    })
+}
+
+// 外墙提交反馈信息
+export function outsideUpdateFeedBack(query) {
+    return request({
+        url: '/aidesign/outside/UpdateFeedBack',
+        method: 'post',
+        data: query
+    })
+}
+
+// 内墙提交反馈信息
+export function insideUpdateFeedBack(query) {
+    return request({
+        url: '/aidesign/inside/UpdateFeedBack',
+        method: 'post',
+        data: query
+    })
+}
+
 //获取确认下单地址
 //获取确认下单地址
-export function GetOrderAddress() {
-    const formData = new FormData();
+export function GetOrderAddress(formData) {
     const auth = getAuthCredentials();
     const auth = getAuthCredentials();
     formData.append('loginMark', auth.loginMark);
     formData.append('loginMark', auth.loginMark);
     formData.append('token', auth.token);
     formData.append('token', auth.token);
@@ -348,4 +374,3 @@ export function GetOrderAddress() {
         data: formData
         data: formData
     })
     })
 }
 }
-

二进制
src/assets/AIDesign/feedback_icon.png


二进制
src/assets/AIDesign/feedback_result.png


二进制
src/assets/AIDesign/point-dialog-icon-fail.png


二进制
src/assets/AIDesign/point-dialog-icon-success.png


+ 5 - 3
src/main.ts

@@ -48,7 +48,7 @@ Vue.component('el-collapse', ElCollapse);
 Vue.component('el-collapse-item', ElCollapseItem);
 Vue.component('el-collapse-item', ElCollapseItem);
 Vue.component('el-image', ElImage);
 Vue.component('el-image', ElImage);
 // 引入并初始化 vConsole(仅在非生产环境启用,避免线上暴露调试工具)
 // 引入并初始化 vConsole(仅在非生产环境启用,避免线上暴露调试工具)
-if (process.env.NODE_ENV !== 'production') {
+if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'development') {
   const VConsole = require('vconsole')
   const VConsole = require('vconsole')
   new VConsole() // 初始化后,移动端页面会出现 vConsole 悬浮按钮
   new VConsole() // 初始化后,移动端页面会出现 vConsole 悬浮按钮
 }
 }
@@ -84,7 +84,8 @@ import {
   CheckboxGroup,
   CheckboxGroup,
   ActionSheet,
   ActionSheet,
   Search,
   Search,
-  Overlay,
+    Overlay,
+    Switch,
   Lazyload
   Lazyload
 } from "vant";
 } from "vant";
 
 
@@ -123,7 +124,8 @@ import {
   ActionSheet,
   ActionSheet,
   Search,
   Search,
   Overlay,
   Overlay,
-  Lazyload
+    Switch,
+    Lazyload
 ].forEach(x => Vue.use(x));
 ].forEach(x => Vue.use(x));
 
 
 Vue.config.productionTip = false;
 Vue.config.productionTip = false;

+ 6 - 0
src/router/index.ts

@@ -82,6 +82,12 @@ const router = new VueRouter({
           component: () => import("../views/AIDesign/diagnoseResult.vue"),
           component: () => import("../views/AIDesign/diagnoseResult.vue"),
           meta: { requiresAuth: true } // 标记需要登录的页面
           meta: { requiresAuth: true } // 标记需要登录的页面
         },
         },
+        //反馈页面
+          {
+              path: "/AIDesign/feedback",
+              component: () => import("../views/AIDesign/feedback.vue"),
+              meta: { requiresAuth: true }
+          },
         // 生成方案
         // 生成方案
         {
         {
           path: "/AIDesign/GeneratePlan",
           path: "/AIDesign/GeneratePlan",

+ 2 - 2
src/utils/index.ts

@@ -144,7 +144,7 @@ export const toLBHome = () => {
   }
   }
 }
 }
 
 
-export const toXiaoChengxu = (appid) => {
+export const toXiaoChengxu = (appid,pageUrl='') => {
   let url = window.location.href.split("#")[0];
   let url = window.location.href.split("#")[0];
   const formData = new FormData();
   const formData = new FormData();
   formData.append('url', url);
   formData.append('url', url);
@@ -165,7 +165,7 @@ export const toXiaoChengxu = (appid) => {
             "launchMiniprogram",
             "launchMiniprogram",
             {
             {
               appid: appid, // 需跳转的小程序appid
               appid: appid, // 需跳转的小程序appid
-              path: "" // 所需跳转的小程序内页面路径及参数。非必填
+              path: pageUrl // 所需跳转的小程序内页面路径及参数。非必填
             },
             },
             function (res) {
             function (res) {
               if (res.err_msg == "launchMiniprogram:ok") {
               if (res.err_msg == "launchMiniprogram:ok") {

+ 3 - 1
src/views/AIDesign/GeneratePlan.vue

@@ -263,7 +263,9 @@ export default class GeneratePlan extends Vue {
             formData.append('eventdata', JSON.stringify(eventdataObj));//事件数据
             formData.append('eventdata', JSON.stringify(eventdataObj));//事件数据
             AddTrackEvent(formData)//埋点
             AddTrackEvent(formData)//埋点
             // 获取确认下单地址
             // 获取确认下单地址
-            GetOrderAddress().then((res) => {
+            const formDataGetOrderAddress = new FormData();
+            formDataGetOrderAddress.append('servicecode', that.$route.query.serviceCode)
+            GetOrderAddress(formDataGetOrderAddress).then((res) => {
                 if (res.StatusCode == 200 && res.Data) {
                 if (res.StatusCode == 200 && res.Data) {
                     window.location.href = res.Data;
                     window.location.href = res.Data;
                 } else {
                 } else {

+ 453 - 89
src/views/AIDesign/design.vue

@@ -18,11 +18,17 @@
       </div>
       </div>
       <!-- 关联项目 -->
       <!-- 关联项目 -->
       <div class="image-selection padded-lr-20" v-show="projectBoxShow">
       <div class="image-selection padded-lr-20" v-show="projectBoxShow">
-        <div class="project-placeholder">
+        <div class="project-box">
+          <div class="project-overlay" v-show="overlayShow"></div>
           <div class="project-add-box">
           <div class="project-add-box">
-            <span style="font-weight: 700;"><span style="color: red;margin-right: 5px;">*</span>关联项目</span>
+            <div class="fws-change-box" @click="overlayShow = !overlayShow">
+              <span class="fws-code">{{fwsCode}}</span>
+              <span class="change-txt">切换</span>
+              <van-icon v-show="!overlayShow" name="arrow-down" color="#0057BA" />
+              <van-icon v-show="overlayShow" name="arrow-up" color="#0057BA" />
+            </div>
             <van-popover placement="bottom-end" :offset="[17, 4]" v-model="showProjectPopover" theme="dark"
             <van-popover placement="bottom-end" :offset="[17, 4]" v-model="showProjectPopover" theme="dark"
-              trigger="click">
+                         trigger="click">
               <div role="menu" class="van-popover__content">
               <div role="menu" class="van-popover__content">
                 <div role="menuitem" class="van-popover__action van-popover__action--with-icon" @click="toProjectLink">
                 <div role="menuitem" class="van-popover__action van-popover__action--with-icon" @click="toProjectLink">
                   <img width="30px" :src="require('@/assets/AIDesign/projectIcon.png')" alt="">
                   <img width="30px" :src="require('@/assets/AIDesign/projectIcon.png')" alt="">
@@ -34,29 +40,50 @@
               </template>
               </template>
             </van-popover>
             </van-popover>
           </div>
           </div>
-          <div class="list-item-checked" v-if="checkedProject != null">
-            <div class="title-item" v-show="checkedProject.fulladdress">
-              <span class="title" style="text-align: left;">{{ checkedProject.fulladdress }}</span>
-              <span class="status">已报备</span>
-            </div>
-            <div class="user-item" v-show="checkedProject.contact">
-              <van-icon name="user-o" />
-              <span class="txt">{{ checkedProject.contact }}</span>
+          <div class="check-list-box" v-show="overlayShow">
+            <van-radio-group v-model="fwsRadioValue">
+              <van-cell-group>
+                <van-cell clickable v-for="(item,index) in fwsList" :key="index" @click="radioClick(item.shop_code,item.shop_name)">
+                  <template #icon>
+                    <van-radio :name="item.shop_code" />
+                  </template>
+                  <template #title>
+                    <div :class="fwsRadioValue == item.shop_code ? 'list-label-checked' : 'list-label'">
+                      <span class="code">{{item.shop_code}}</span>
+                      <span class="value">{{item.shop_name}}</span>
+                    </div>
+                  </template>
+                </van-cell>
+              </van-cell-group>
+            </van-radio-group>
+          </div>
+          <div class="project-placeholder">
+            <div style="font-weight: 700;width: 100%;text-align: left;margin-bottom: 10px;"><span style="color: red;margin-right: 5px;">*</span>关联项目</div>
+            <div class="point-box">已有积分:<span>{{projectPoint}}</span></div>
+            <div class="list-item-checked" v-if="checkedProject != null">
+              <div class="title-item" v-show="checkedProject.fulladdress">
+                <span class="title" style="text-align: left;">{{ checkedProject.fulladdress }}</span>
+                <span class="status">已报备</span>
+              </div>
+              <div class="user-item" v-show="checkedProject.contact">
+                <van-icon name="user-o" />
+                <span class="txt">{{ checkedProject.contact }}</span>
+              </div>
+              <div class="user-item" v-show="checkedProject.tel">
+                <van-icon name="phone-o" />
+                <span class="txt">{{ checkedProject.tel }}</span>
+              </div>
+              <div class="user-item">
+                <van-icon name="info-o" color="#D43030" />
+                <span class="txt" style="color: #D43030;">已生成套数:{{ checkedProject.DesignCount }}</span>
+              </div>
             </div>
             </div>
-            <div class="user-item" v-show="checkedProject.tel">
-              <van-icon name="phone-o" />
-              <span class="txt">{{ checkedProject.tel }}</span>
+            <div class="placeholder" style="width: 100%">
+              <p v-if="checkedProject == null" class="placeholder-text">当前暂无已关联的项目,请选择已报备项目</p>
+              <van-button type="primary" color="#2484F2" block @click="chooseProject" :loading="showChooseProject"
+                          :disabled="showChooseProject" loading-type="spinner" loading-text="选择项目"
+                          style="width: 80%;margin-left: 10%;">选择项目</van-button>
             </div>
             </div>
-            <!-- <div class="user-item">
-              <van-icon name="info-o" color="#D43030" />
-              <span class="txt" style="color: #D43030;">剩余免费生成次数:{{ checkedProject.AvailableQuantity }}</span>
-            </div> -->
-          </div>
-          <div class="placeholder" style="width: 100%">
-            <p v-if="checkedProject == null" class="placeholder-text">当前暂无已关联的项目,请选择已报备项目</p>
-            <van-button type="primary" color="#2484F2" block @click="chooseProject" :loading="showChooseProject"
-              :disabled="showChooseProject" loading-type="spinner" loading-text="选择项目"
-              style="width: 80%;margin-left: 10%;">选择项目</van-button>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
@@ -103,16 +130,29 @@
               </template>
               </template>
             </van-popover>
             </van-popover>
           </div>
           </div>
-          <div class="option-grid stone-colors-grid" ref="designsRef">
+
+          <div class="option-grid stone-colors-grid" ref="designsRef" @mousedown="handleMouseDown"
+               @mousemove="handleMouseMove" @mouseup="handleMouseUp" @mouseleave="handleMouseUp">
             <div v-for="(style, index) in designStyles" :key="index" class="option-item"
             <div v-for="(style, index) in designStyles" :key="index" class="option-item"
-              :class="{ active: DesignStyle === style.value }" @click="selectStyle(style.value, 'designsRef', index)">
+                 :class="{ active: DesignStyle === style.value }" @click="selectStyle(style.value, 'designsRef', index)">
               <img :src="imgBaseUrl + style.imgPath" alt="" class="style-image" />
               <img :src="imgBaseUrl + style.imgPath" alt="" class="style-image" />
-              <div class="style-name">{{ style.text }}</div>
-            </div>
-            <div class="rightArrows">
-              <img width="12" :src="require('@/assets/AIDesign/rightjt.png')" />
+              <div class="split-name">{{ style.text }}</div>
             </div>
             </div>
           </div>
           </div>
+          <div class="rightArrows">
+            <img width="12" :src="require('@/assets/AIDesign/rightjt.png')" />
+          </div>
+
+          <!--<div class="option-grid stone-colors-grid" ref="designsRef">-->
+            <!--<div v-for="(style, index) in designStyles" :key="index" class="option-item"-->
+              <!--:class="{ active: DesignStyle === style.value }" @click="selectStyle(style.value, 'designsRef', index)">-->
+              <!--<img :src="imgBaseUrl + style.imgPath" alt="" class="style-image" />-->
+              <!--<div class="style-name">{{ style.text }}</div>-->
+            <!--</div>-->
+            <!--<div class="rightArrows">-->
+              <!--<img width="12" :src="require('@/assets/AIDesign/rightjt.png')" />-->
+            <!--</div>-->
+          <!--</div>-->
         </div>
         </div>
 
 
         <!-- 仿石漆电子色卡 -->
         <!-- 仿石漆电子色卡 -->
@@ -316,7 +356,7 @@
       <div class="generate-section padded-lr-20">
       <div class="generate-section padded-lr-20">
         <van-button v-show="AIBtnDisabled" type="primary" block color="#E87838" disabled loading loading-type="spinner"
         <van-button v-show="AIBtnDisabled" type="primary" block color="#E87838" disabled loading loading-type="spinner"
           loading-text="AI生成"></van-button>
           loading-text="AI生成"></van-button>
-        <van-button v-show="!AIBtnDisabled" type="primary" block @click="generateDesign"
+        <van-button v-show="!AIBtnDisabled" type="primary" block @click="beforeGenerateDesign"
           color="#E87838">AI生成</van-button>
           color="#E87838">AI生成</van-button>
         <div class="btn-note">*效果图仅供参考, 不作为交付标准</div>
         <div class="btn-note">*效果图仅供参考, 不作为交付标准</div>
       </div>
       </div>
@@ -355,7 +395,7 @@
             <van-button type="primary" size="mini" color="#2484F2" class="btn" @click="onSearch">搜索</van-button>
             <van-button type="primary" size="mini" color="#2484F2" class="btn" @click="onSearch">搜索</van-button>
           </div>
           </div>
         </div>
         </div>
-        <div style="width: 90%;height: 50px;"></div>
+        <div style="width: 90%;height: 55px;"></div>
         <div class="list-item" :style="checkedProjectId == index ? 'border: 1px solid #2484F2;' : ''"
         <div class="list-item" :style="checkedProjectId == index ? 'border: 1px solid #2484F2;' : ''"
           v-for="(item, index) in projectList" :key="index" @click="checkedProjectId = index">
           v-for="(item, index) in projectList" :key="index" @click="checkedProjectId = index">
           <div class="title-item">
           <div class="title-item">
@@ -370,10 +410,10 @@
             <van-icon name="phone-o" />
             <van-icon name="phone-o" />
             <span class="txt">{{ item.tel }}</span>
             <span class="txt">{{ item.tel }}</span>
           </div>
           </div>
-          <!-- <div class="user-item">
+          <div class="user-item">
             <van-icon name="info-o" color="#D43030" />
             <van-icon name="info-o" color="#D43030" />
-            <span class="txt" style="color: #D43030;">剩余免费生成次数:{{ item.AvailableQuantity }}</span>
-          </div> -->
+            <span class="txt" style="color: #D43030;">已生成套数:{{ item.DesignCount }}</span>
+          </div>
           <div class="img-item" v-show="checkedProjectId == index">
           <div class="img-item" v-show="checkedProjectId == index">
             <img src="../../assets/AIDesign/project_checked.png" class="img-checked">
             <img src="../../assets/AIDesign/project_checked.png" class="img-checked">
           </div>
           </div>
@@ -394,12 +434,39 @@
         <div class="dialog-btn" @click="dialogShow = false">知道了</div>
         <div class="dialog-btn" @click="dialogShow = false">知道了</div>
       </div>
       </div>
     </van-dialog>
     </van-dialog>
+    <van-dialog v-model="pointDialogShow1" :show-confirm-button="false" style="overflow: visible;">
+      <div class="dialog-point-box">
+        <div class="title">AI生图<span class="txt-color1">  积分轻松抵</span></div>
+        <div class="content">已有积分:<span class="txt-color2">{{projectPoint}}</span></div>
+        <div class="content">成功生图限时折扣
+          <img src="../../assets/AIDesign/point-dialog-icon-success.png" class="point-icon-small">
+          <span class="txt-color1" style="font-size: 22px;">100</span>
+          <span class="txt-color1">/次</span>
+          <span class="txt-color2" style="text-decoration: line-through;color: #999999;margin-left: 5px;">500</span>
+        </div>
+        <div class="content" style="font-size: 12px;">*AI设计属虚拟产品,生图成功后无法退还积分</div>
+        <div class="dialog-btn-point1" @click="pointDialogSure">确认生成</div>
+        <div class="dialog-btn-point2" @click="pointDialogShow1 = false">稍后再说</div>
+        <img src="../../assets/AIDesign/point-dialog-icon-success.png" class="point-icon">
+      </div>
+    </van-dialog>
+    <van-dialog v-model="pointDialogShow2" :show-confirm-button="false" style="overflow: visible;">
+      <div class="dialog-point-box">
+        <div class="title txt-color1">本次生图失败</div>
+        <div class="content">失败原因:您的积分不足</div>
+        <div class="content">使用积分:<span class="txt-color2">0</span></div>
+        <div class="content">剩余积分:<span class="txt-color2">{{projectPoint}}</span></div>
+        <div class="content">小提示:可完成项目交付获取更多积分~</div>
+        <div class="dialog-btn-point2" style="margin-top: 20px;" @click="pointDialogShow2 = false">我知道了</div>
+        <img src="../../assets/AIDesign/point-dialog-icon-fail.png" class="point-icon">
+      </div>
+    </van-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script lang="ts">
 <script lang="ts">
 import { Component, Vue } from "vue-property-decorator";
 import { Component, Vue } from "vue-property-decorator";
-import { CreateDesign, GetEntity, GetReadState, UpdateReadState, GetProjectlist, GetDictList } from "@/api/indexAI";
+import { CreateDesign, GetEntity, GetReadState, UpdateReadState, GetProjectlist, GetDictList, GetPoints } from "@/api/indexAI";
 import { ImagePreview, Popover } from 'vant';
 import { ImagePreview, Popover } from 'vant';
 import { Dialog } from 'vant';
 import { Dialog } from 'vant';
 import { getWecomType, toLBHome, toXiaoChengxu } from '@/utils/index';
 import { getWecomType, toLBHome, toXiaoChengxu } from '@/utils/index';
@@ -447,6 +514,7 @@ export default class extends Vue {
   private dialogContent = '';
   private dialogContent = '';
   private AIBtnDisabled = false;
   private AIBtnDisabled = false;
   private projectBoxShow = false;
   private projectBoxShow = false;
+  private freetimes = 0;
   private save_projectBoxShow_org = false;
   private save_projectBoxShow_org = false;
   private projectSearchValue = '';
   private projectSearchValue = '';
   private checkedProjectId = null;
   private checkedProjectId = null;
@@ -503,7 +571,16 @@ export default class extends Vue {
   private popover_actions = [{ text: "风格主要对应罗马柱类型,请按需选择", className: "actionsTit" }];
   private popover_actions = [{ text: "风格主要对应罗马柱类型,请按需选择", className: "actionsTit" }];
   private showChooseProject = false;
   private showChooseProject = false;
   private showProjectPopover = false;
   private showProjectPopover = false;
-  created() {
+    private projectPoint = '';
+    private pointDialogShow1 = false;
+    private pointDialogShow2 = false;
+    private fwsCode = '';
+    private fwsName = '';
+    private fwsList = [];
+    private fwsRadioValue = '';
+    private overlayShow = false;
+
+    created() {
     // 图片头
     // 图片头
     if (window.location.href.indexOf('aidesign.') > -1) {
     if (window.location.href.indexOf('aidesign.') > -1) {
       this.imgBaseUrl = 'https://aidesign.nipponpaint.com.cn'
       this.imgBaseUrl = 'https://aidesign.nipponpaint.com.cn'
@@ -530,6 +607,7 @@ export default class extends Vue {
     this.AIBtnDisabled = false;
     this.AIBtnDisabled = false;
     this.checkedProjectId = null;
     this.checkedProjectId = null;
     this.checkedProject = null;
     this.checkedProject = null;
+    this.freetimes = 0;
     this.oldf_id = null;
     this.oldf_id = null;
     this.Userfile1 = null;
     this.Userfile1 = null;
     this.DesignStyle = null;
     this.DesignStyle = null;
@@ -549,6 +627,7 @@ export default class extends Vue {
     this.startIndex = 0;
     this.startIndex = 0;
     this.currentIndex = 0;
     this.currentIndex = 0;
     this.currentTitle = null;
     this.currentTitle = null;
+    this.overlayShow = false;
     this.activeName = "外墙质感";// tab选中的项
     this.activeName = "外墙质感";// tab选中的项
     this.color_selItem = null;//选中的外墙平涂
     this.color_selItem = null;//选中的外墙平涂
     this.color_options = [];//外墙平涂列表
     this.color_options = [];//外墙平涂列表
@@ -574,7 +653,9 @@ export default class extends Vue {
   private getServiceCode() {
   private getServiceCode() {
     let that = this;
     let that = this;
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
-    let serviceCodeArray = [];
+      const checkedFwsInfo: any = JSON.parse(window.localStorage.getItem("pageDesignfwsRadioValue")!);
+      let serviceCodeArray = [];
+      let serviceObjArray = [];
     // if (userInfo && userInfo.loginTypeList && userInfo.loginTypeList.length > 0) {
     // if (userInfo && userInfo.loginTypeList && userInfo.loginTypeList.length > 0) {
     //   userInfo.loginTypeList.forEach(item => {
     //   userInfo.loginTypeList.forEach(item => {
     //     if (item.shopType == 'stoneLikePaint') {
     //     if (item.shopType == 'stoneLikePaint') {
@@ -586,8 +667,25 @@ export default class extends Vue {
     // }
     // }
     if (userInfo && userInfo.ServiceCode) {
     if (userInfo && userInfo.ServiceCode) {
       serviceCodeArray = userInfo.ServiceCode.split(',').map(item => item.trim()).filter(item => item !== '');
       serviceCodeArray = userInfo.ServiceCode.split(',').map(item => item.trim()).filter(item => item !== '');
+        userInfo.ServiceCode.split(',').forEach((item,index)=>{
+            let obj = {};
+            obj.shop_code = item;
+            obj.shop_name = userInfo.ServiceName.split(',')[index];
+            serviceObjArray.push(obj);
+        })
     }
     }
+    that.fwsList = serviceObjArray;
     that.serviceCodeArray = serviceCodeArray;
     that.serviceCodeArray = serviceCodeArray;
+    if (checkedFwsInfo){
+        const serviceCodeIndex = serviceObjArray.findIndex(item => item.shop_code == checkedFwsInfo.shop_code);
+        if (serviceCodeIndex == -1){
+            that.radioClick(serviceObjArray[0].shop_code,serviceObjArray[0].shop_name,true);
+        } else {
+            that.radioClick(checkedFwsInfo.shop_code,checkedFwsInfo.shop_name,true);
+        }
+    } else {
+        that.radioClick(serviceObjArray[0].shop_code,serviceObjArray[0].shop_name,true);
+    }
   }
   }
   // 处理文件选择(对应 beforeRead + afterRead)
   // 处理文件选择(对应 beforeRead + afterRead)
   handleFileChange(e) {
   handleFileChange(e) {
@@ -665,6 +763,24 @@ export default class extends Vue {
     ImagePreview([url]);
     ImagePreview([url]);
   }
   }
 
 
+    radioClick(code,value,isClearCheckedProject = true){
+        let that = this;
+        that.fwsName = value;
+        that.fwsCode = code;
+        that.fwsRadioValue = code;
+        let overviewRadioValue = {
+            shop_code:code,
+            shop_name:value
+        }
+        that.GetPointsFn();
+        if (isClearCheckedProject){
+            that.checkedProject = null;
+            that.checkedProjectId = null;
+        }
+        window.localStorage.setItem("pageDesignfwsRadioValue", JSON.stringify(overviewRadioValue));
+        that.overlayShow = false;
+    }
+
   // 处理罗马柱
   // 处理罗马柱
   openComponentPreview(initIndex: number, list) {
   openComponentPreview(initIndex: number, list) {
     if (list.length > 0) {
     if (list.length > 0) {
@@ -684,6 +800,18 @@ export default class extends Vue {
     this.currentTitle = this.titlesArray[index] || "无标题";
     this.currentTitle = this.titlesArray[index] || "无标题";
     this.currentIndex = index;
     this.currentIndex = index;
   }
   }
+
+    GetPointsFn(){
+      let that = this;
+        const formData = new FormData();
+        formData.append('serviceCode', that.fwsCode);
+        GetPoints(formData).then(response => {
+            if (response.StatusCode == 200) {
+                that.projectPoint = response.Data.point;
+            }
+        });
+    }
+
   GetReadStateFn() {
   GetReadStateFn() {
     const formData = new FormData();
     const formData = new FormData();
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
@@ -719,36 +847,85 @@ export default class extends Vue {
           if (response.Data.F_UserFilePath) {
           if (response.Data.F_UserFilePath) {
             this.selectedImage = response.Data.BaseUrl + response.Data.F_UserFilePath;
             this.selectedImage = response.Data.BaseUrl + response.Data.F_UserFilePath;
           }
           }
+          //设计风格
           if (response.Data.F_Color) {
           if (response.Data.F_Color) {
             this.DesignStyle = this.designStyles[0].value;
             this.DesignStyle = this.designStyles[0].value;
           } else {
           } else {
-              this.DesignStyle = this.cardValueFindIndex(response.Data.F_DesignStyle,this.designStyles) == -1 ? this.designStyles[0].value : response.Data.F_DesignStyle;
-            // this.DesignStyle = response.Data.F_DesignStyle || this.designStyles[0].value;
+              let DesignStyleIndex = this.cardValueFindIndex(response.Data.F_DesignStyle,this.designStyles);
+              if (DesignStyleIndex == -1){
+                  this.DesignStyle = this.designStyles[0].value;
+              } else {
+                  this.selectStyle(response.Data.F_DesignStyle,'designsRef',DesignStyleIndex);
+              }
+          }
+          //仿石漆电子色卡
+          let ColorCardIndex = this.cardValueFindIndex(response.Data.F_ColorCard,this.stoneColors);
+          if (ColorCardIndex == -1) {
+              this.ColorCard = this.stoneColors[0].value;
+          }else {
+              this.selectColor(response.Data.F_ColorCard,'stoneColorsRef',ColorCardIndex);
+          }
+          //墙面工艺
+          let selectedProcessIndex = this.cardValueFindIndex(response.Data.F_DeepGrooveTech,this.deepSlotProcesses);
+          if (selectedProcessIndex == -1){
+              this.selectedProcess = this.deepSlotProcesses[0].value;
+          }else {
+              this.selectProcess(response.Data.F_DeepGrooveTech,'processesRef',selectedProcessIndex);
           }
           }
-            this.ColorCard = this.cardValueFindIndex(response.Data.F_ColorCard,this.stoneColors) == -1 ? this.stoneColors[0].value : response.Data.F_ColorCard;
-          // this.ColorCard = response.Data.F_ColorCard || this.stoneColors[0].value;
-            this.selectedProcess = this.cardValueFindIndex(response.Data.F_DeepGrooveTech,this.deepSlotProcesses) == -1 ? this.deepSlotProcesses[0].value : response.Data.F_DeepGrooveTech;
-            // this.selectedProcess = response.Data.F_DeepGrooveTech || this.deepSlotProcesses[0].value;
           // 有墙面工艺
           // 有墙面工艺
             if (this.selectedProcess && this.selectedProcess != '平涂') {
             if (this.selectedProcess && this.selectedProcess != '平涂') {
                 const selectedProcessSelctIndex = this.deepSlotProcesses.findIndex(item => item.value === this.selectedProcess);
                 const selectedProcessSelctIndex = this.deepSlotProcesses.findIndex(item => item.value === this.selectedProcess);
                 // 墙面分割线选项
                 // 墙面分割线选项
                 this.splitWays = this.deepSlotProcesses[selectedProcessSelctIndex].subitems;
                 this.splitWays = this.deepSlotProcesses[selectedProcessSelctIndex].subitems;
-                this.selectedSplit = this.cardValueFindIndex(response.Data.F_DivisionMethod,this.splitWays) == -1 ? this.splitWays[0].value : response.Data.F_DivisionMethod;
-                // this.selectedSplit = response.Data.F_DivisionMethod || this.splitWays[0].value;
+                let selectedSplitIndex = this.cardValueFindIndex(response.Data.F_DivisionMethod,this.splitWays);
+                if (selectedSplitIndex == -1){
+                    this.selectedSplit = this.splitWays[0].value;
+                } else {
+                    this.selectSplit(response.Data.F_DivisionMethod,'splitsRef',selectedSplitIndex);
+                }
+            }
+            //窗套颜色
+            let selectedWindowFrameIndex = this.cardValueFindIndex(response.Data.F_WindowsColor,this.windowFrames);
+            if (selectedWindowFrameIndex == -1){
+                this.selectedWindowFrame = this.windowFrames[0].value;
+            } else {
+                this.selectWindowFrame(response.Data.F_WindowsColor,'windowsRef',selectedWindowFrameIndex);
+            }
+            //栏杆
+            let selectedRailingIndex = this.cardValueFindIndex(response.Data.F_CastRailing,this.railings);
+            if (selectedRailingIndex == -1){
+                this.selectedRailing = this.railings[0].value;
+            } else {
+                this.selectRailing(response.Data.F_CastRailing,'railingsRef',selectedRailingIndex);
+            }
+            //新琉璃瓦
+            let selectedTileIndex = this.cardValueFindIndex(response.Data.F_GlazedTile,this.tiles);
+            if (selectedTileIndex == -1){
+                this.selectedTile = this.tiles[0].value;
+            } else {
+                this.selectTile(response.Data.F_GlazedTile,'tilesRef',selectedTileIndex);
+            }
+            //墙裙
+            let selectedSkirtTypeIndex = this.cardValueFindIndex(response.Data.F_SkirtType,this.skirtTypes);
+            if (selectedSkirtTypeIndex == -1){
+                this.selectedSkirtType = this.skirtTypes[0].value;
+            } else {
+                this.selectSkirtType(response.Data.F_SkirtType,'skirtTypesRef',selectedSkirtTypeIndex);
+            }
+            //浮雕
+            let selectedReliefTypeIndex = this.cardValueFindIndex(response.Data.F_carvingType,this.outsideRelief);
+            if (selectedReliefTypeIndex == -1){
+                this.selectedReliefType = this.outsideRelief[0].value;
+            } else {
+                this.selectReliefType(response.Data.F_carvingType, 'outsideReliefRef', selectedReliefTypeIndex)
+            }
+            //窗套样式
+            let selectedWindowStyleIndex = this.cardValueFindIndex(response.Data.F_WindowsStyle,this.WindowStyle);
+            if (selectedWindowStyleIndex == -1){
+                this.selectedWindowStyle = this.WindowStyle[0].value;
+            } else {
+                this.selectWindowStyle(response.Data.F_WindowsStyle, 'WindowStyleRef', selectedWindowStyleIndex)
             }
             }
-            this.selectedWindowFrame = this.cardValueFindIndex(response.Data.F_WindowsColor,this.windowFrames) == -1 ? this.windowFrames[0].value : response.Data.F_WindowsColor;
-            // this.selectedWindowFrame = response.Data.F_WindowsColor || this.windowFrames[0].value;
-            this.selectedRailing = this.cardValueFindIndex(response.Data.F_CastRailing,this.railings) == -1 ? this.railings[0].value : response.Data.F_CastRailing;
-            // this.selectedRailing = response.Data.F_CastRailing || this.railings[0].value;
-            this.selectedTile = this.cardValueFindIndex(response.Data.F_GlazedTile,this.tiles) == -1 ? this.tiles[0].value : response.Data.F_GlazedTile;
-            // this.selectedTile = response.Data.F_GlazedTile || this.tiles[0].value;//新琉璃瓦
-            this.selectedSkirtType = this.cardValueFindIndex(response.Data.F_SkirtType,this.skirtTypes) == -1 ? this.skirtTypes[0].value : response.Data.F_SkirtType;
-            // this.selectedSkirtType = response.Data.F_SkirtType || this.skirtTypes[0].value;//墙裙
-            this.selectedReliefType = this.cardValueFindIndex(response.Data.F_carvingType,this.outsideRelief) == -1 ? this.outsideRelief[0].value : response.Data.F_carvingType;
-            // this.selectedReliefType = response.Data.F_carvingType || this.outsideRelief[0].value;//浮雕
-            this.selectedWindowStyle = this.cardValueFindIndex(response.Data.F_WindowsStyle,this.WindowStyle) == -1 ? this.WindowStyle[0].value : response.Data.F_WindowsStyle;
-            // this.selectedWindowStyle = response.Data.F_WindowsStyle || this.WindowStyle[0].value;//窗套样式
           this.oldf_id = response.Data.F_ID;
           this.oldf_id = response.Data.F_ID;
           this.color_selValue = response.Data.F_Color || null;// 外墙平涂选中的值
           this.color_selValue = response.Data.F_Color || null;// 外墙平涂选中的值
           if (this.color_selValue) {
           if (this.color_selValue) {
@@ -796,7 +973,12 @@ export default class extends Vue {
               this.ColumnTypes = [];
               this.ColumnTypes = [];
             }
             }
           }
           }
-            this.selectedColumnType = this.cardValueFindIndex(F_ColumnType,this.ColumnTypes) == -1 ? this.ColumnTypes[0].value : F_ColumnType;
+          let selectedColumnTypeIndex = this.cardValueFindIndex(F_ColumnType,this.ColumnTypes);
+          if (selectedColumnTypeIndex == -1){
+              this.selectedColumnType = this.ColumnTypes[0].value;
+          } else {
+              this.selectColumnType(F_ColumnType, 'ColumnTypeRef', selectedColumnTypeIndex)
+          }
           // this.selectedColumnType = F_ColumnType;//罗马柱
           // this.selectedColumnType = F_ColumnType;//罗马柱
         }
         }
       }
       }
@@ -839,7 +1021,6 @@ export default class extends Vue {
   //   console.log('拍摄图片');
   //   console.log('拍摄图片');
   // }
   // }
   private autoScrollToActive(refsName: string, selcIndex: number) {
   private autoScrollToActive(refsName: string, selcIndex: number) {
-    // console.log("refsName=", refsName)
     const container = this.$refs[refsName];
     const container = this.$refs[refsName];
     const activeItem = container.children[selcIndex];
     const activeItem = container.children[selcIndex];
     const itemWidth = activeItem.offsetWidth * 1.1;
     const itemWidth = activeItem.offsetWidth * 1.1;
@@ -850,13 +1031,13 @@ export default class extends Vue {
     const isFullyVisibleL = itemRect.left >= containerRect.left;
     const isFullyVisibleL = itemRect.left >= containerRect.left;
     const isFullyVisibleR = itemRect.right <= containerRect.right;
     const isFullyVisibleR = itemRect.right <= containerRect.right;
     if (!isFullyVisibleL) {
     if (!isFullyVisibleL) {
-      container.scrollBy({
-        left: -itemWidth, // 右边滑一格多的距离
+        container.scrollBy({
+        left: -(containerRect.left - itemRect.left + itemWidth), // 右边滑一格多的距离
         behavior: 'smooth' // 平滑滚动
         behavior: 'smooth' // 平滑滚动
       });
       });
     } else if (!isFullyVisibleR) {
     } else if (!isFullyVisibleR) {
       container.scrollBy({
       container.scrollBy({
-        left: itemWidth, // 左滑一格多的距离
+        left: itemRect.right - containerRect.right + itemWidth, // 左滑一格多的距离
         behavior: 'smooth' // 平滑滚动
         behavior: 'smooth' // 平滑滚动
       });
       });
     }
     }
@@ -890,7 +1071,9 @@ export default class extends Vue {
 
 
   private selectSplit(value: string, refsName: string, selcIndex: number) {
   private selectSplit(value: string, refsName: string, selcIndex: number) {
     this.selectedSplit = value;
     this.selectedSplit = value;
-    this.autoScrollToActive(refsName, selcIndex); // 选中后触发自动滚动
+    setTimeout(function () {
+        this.autoScrollToActive(refsName, selcIndex); // 选中后触发自动滚动
+    },1000)
   }
   }
 
 
   private selectWindowStyle(value: string, refsName: string, selcIndex: number) {
   private selectWindowStyle(value: string, refsName: string, selcIndex: number) {
@@ -968,24 +1151,51 @@ export default class extends Vue {
     this.currentScrollElement = null;
     this.currentScrollElement = null;
   }
   }
 
 
+  //积分提醒弹框确认事件
+    private pointDialogSure(){
+        let that = this;
+        if (that.projectPoint >= 100){
+            that.generateDesign();
+            that.pointDialogShow1 = false;
+        } else {
+            that.pointDialogShow1 = false;
+            that.pointDialogShow2 = true;
+        }
+    }
+
+  private beforeGenerateDesign(){
+        let that = this;
+      if (!this.Userfile1 && !this.oldf_id) {
+          this.$toast.fail('请选择图片');
+          return;
+      }else if (that.projectBoxShow == true && this.activeName === '外墙质感') {
+          if (that.checkedProject == null) {
+              that.$toast.fail('请选择关联项目');
+              return;
+          } else if (that.checkedProject != null && that.checkedProject.AvailableQuantity <= 0){
+              const formData = new FormData();
+              formData.append('serviceCode', that.fwsCode);
+              GetPoints(formData).then(response => {
+                  if (response.StatusCode == 200) {
+                      that.projectPoint = response.Data.point;
+                      that.pointDialogShow1 = true;
+                      return;
+                  }else {
+                      return;
+                  }
+              });
+          } else {
+              that.generateDesign();
+          }
+      }else {
+          that.generateDesign();
+      }
+  }
+
   private generateDesign() {
   private generateDesign() {
     let that = this;
     let that = this;
     // console.log(this.Userfile1);
     // console.log(this.Userfile1);
     // 实现AI生成功能
     // 实现AI生成功能
-    if (that.projectBoxShow == true && this.activeName === '外墙质感') {
-      if (that.checkedProject == null) {
-        that.$toast.fail('请选择关联项目');
-        return;
-      }
-      // if (that.checkedProject.AvailableQuantity == 0) {
-      //   this.projectActionNumShow = true;
-      //   return;
-      // }
-    }
-    if (!this.Userfile1 && !this.oldf_id) {
-      this.$toast.fail('请选择图片');
-      return;
-    }
     // const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     // const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     const formData = new FormData();
     const formData = new FormData();
     if (this.activeName === '外墙质感') {
     if (this.activeName === '外墙质感') {
@@ -1150,11 +1360,18 @@ export default class extends Vue {
     let that = this;
     let that = this;
     const formData = new FormData();
     const formData = new FormData();
     // const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     // const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
-    formData.append('ServiceCode', that.serviceCodeArray.join(','));
+    // formData.append('ServiceCode', that.serviceCodeArray.join(','));
+      formData.append('servicecode', that.fwsCode);
     formData.append('projectid', projectId);
     formData.append('projectid', projectId);
     GetProjectlist(formData).then(response => {
     GetProjectlist(formData).then(response => {
       if (response.StatusCode == 200) {
       if (response.StatusCode == 200) {
-        that.checkedProject = response.Data[0];
+        const serviceCodeIndex = that.fwsList.findIndex(item => item.shop_code == response.Data[0].servicecode);
+        if (serviceCodeIndex == -1){
+            that.radioClick(that.fwsList[0].shop_code,'',true);
+        }else {
+            that.checkedProject = response.Data[0];
+            that.radioClick(response.Data[0].servicecode,'',false);
+        }
       } else {
       } else {
         // console.log(response.Info)
         // console.log(response.Info)
       }
       }
@@ -1166,7 +1383,8 @@ export default class extends Vue {
     let that = this;
     let that = this;
     const formData = new FormData();
     const formData = new FormData();
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
     const userInfo: any = JSON.parse(window.localStorage.getItem("userInfoV1")!);
-    formData.append('ServiceCode', that.serviceCodeArray.join(','));
+    // formData.append('ServiceCode', that.serviceCodeArray.join(','));
+      formData.append('servicecode', that.fwsCode);
     if (that.projectSearchValue.trim().length != 0) {
     if (that.projectSearchValue.trim().length != 0) {
       formData.append('keyWord', that.projectSearchValue);
       formData.append('keyWord', that.projectSearchValue);
     }
     }
@@ -1193,7 +1411,8 @@ export default class extends Vue {
   //跳转项目报备链接
   //跳转项目报备链接
   private toProjectLink() {
   private toProjectLink() {
     this.showProjectPopover = false;
     this.showProjectPopover = false;
-    window.location.href = this.addProjectLink;
+    // window.location.href = this.addProjectLink;
+      toXiaoChengxu(`${process.env.VUE_APP_BASE_DISID9}`,'packageC/projectFiling/index');
   }
   }
 
 
   //获取风格选项图片列表
   //获取风格选项图片列表
@@ -1218,6 +1437,7 @@ export default class extends Vue {
     GetDictList(formData).then(response => {
     GetDictList(formData).then(response => {
       if (response.StatusCode == 200) {
       if (response.StatusCode == 200) {
         that.isNeedProject = response.Data.isNeedProject;
         that.isNeedProject = response.Data.isNeedProject;
+        that.freetimes = response.Data.freetimes;
         that.addProjectLink = response.Data.projectAddress;
         that.addProjectLink = response.Data.projectAddress;
         // 字典获取选择列表
         // 字典获取选择列表
         // 设计风格
         // 设计风格
@@ -1258,6 +1478,9 @@ export default class extends Vue {
             that.projectBoxShow = false;
             that.projectBoxShow = false;
           } else {
           } else {
             that.projectBoxShow = that.isNeedProject;
             that.projectBoxShow = that.isNeedProject;
+            if (that.projectBoxShow == true){
+                that.GetPointsFn();
+            }
           }
           }
           that.save_projectBoxShow_org = that.projectBoxShow;
           that.save_projectBoxShow_org = that.projectBoxShow;
           this.zgInitData();
           this.zgInitData();
@@ -1351,6 +1574,18 @@ export default class extends Vue {
   flex-direction: column;
   flex-direction: column;
 }
 }
 
 
+.point-box{
+  width: 100%;
+  box-sizing: border-box;
+  font-size: 14px;
+  color: #999;
+  text-align: left;
+  margin-left: 20px;
+  span{
+    color: #000;
+  }
+}
+
 .container {
 .container {
   // padding: 0 20px;
   // padding: 0 20px;
 }
 }
@@ -1437,6 +1672,85 @@ export default class extends Vue {
   text-align: center;
   text-align: center;
 }
 }
 
 
+.project-box{
+  position: relative;
+  .project-overlay{
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    z-index: 100;
+    background-color: rgba(0, 0, 0, 0.7);
+    border-radius: 12px;
+  }
+  .project-add-box {
+    flex-direction: row;
+    display: flex;
+    justify-content: space-between;
+    border-radius: 12px 12px 0 0;
+    align-items: center;
+    padding: 10px;
+    z-index: 200;
+    position: relative;
+    background-color: #ffffff;
+    .fws-change-box{
+      flex-direction: row;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      .fws-code{
+        font-size: 12px;
+        color: #0057ba;
+        border: 1px solid #0057ba;
+        border-radius: 10px;
+        padding: 2px 4px;
+      }
+      .change-txt{
+        font-size: 12px;
+        color: #0057BA;
+        margin-left: 5px;
+        margin-right: 5px;
+      }
+    }
+  }
+  .check-list-box{
+    width: 100%;
+    flex-direction: column;
+    display: flex;
+    box-sizing: border-box;
+    margin-bottom: 10px;
+    padding: 10px 10px 5px 10px;
+    /*background-color: red;*/
+    z-index: 200;
+    position: absolute;
+    top: 42px;
+    background: linear-gradient(135deg, #ecf1f4 0%, #e7ecfb 100%);
+    .list-label{
+      text-align: left;
+      margin-left: 15px;
+      .code{
+        color: #666666;
+      }
+      .value{
+        color: #666666;
+        margin-left: 5px;
+      }
+    }
+    .list-label-checked{
+      text-align: left;
+      margin-left: 15px;
+      .code{
+        color: #0057BA;
+        font-weight: 700;
+      }
+      .value{
+        color: #0057BA;
+        font-weight: 700;
+        margin-left: 5px;
+      }
+    }
+  }
+}
+
 .image-placeholder {
 .image-placeholder {
   position: relative;
   position: relative;
   display: flex;
   display: flex;
@@ -1467,13 +1781,13 @@ export default class extends Vue {
   padding-bottom: 30px;
   padding-bottom: 30px;
 }
 }
 
 
-.project-add-box {
-  width: 100%;
-  flex-direction: row;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20px;
+.van-cell-group{
+  background-color: transparent;
+}
+
+.van-cell{
+  margin-bottom: 5px;
+  border-radius: 8px;
 }
 }
 
 
 ::v-deep .van-button--normal {
 ::v-deep .van-button--normal {
@@ -2038,6 +2352,56 @@ export default class extends Vue {
   }
   }
 }
 }
 
 
+.dialog-point-box{
+  flex-direction: column;
+  display: flex;
+  box-sizing: border-box;
+  position: relative;
+  padding: 20px 15px;
+  position: relative;
+  .title{
+    font-size: 22px;
+  }
+  .content{
+    font-size: 14px;
+    margin-top: 10px;
+    color: #999;
+  }
+  .txt-color1{
+    color: #E55B2A;
+  }
+  .txt-color2{
+    color: #000;
+  }
+  .dialog-btn-point1{
+    background-color: #E55B2A;
+    border-radius: 10px;
+    font-size: 18px;
+    color:#fff;
+    margin-top: 20px;
+    padding: 6px 0;
+    box-sizing: border-box;
+    text-align: center;
+  }
+  .dialog-btn-point2{
+    border-radius: 10px;
+    font-size: 16px;
+    margin-top: 10px;
+    padding: 6px 0;
+    box-sizing: border-box;
+    text-align: center;
+  }
+  .point-icon{
+    width: 120px;
+    position: absolute;
+    top: -55px;
+    right: -10px;
+  }
+  .point-icon-small{
+    width: 20px;
+  }
+}
+
 .dialog-box {
 .dialog-box {
   flex-direction: column;
   flex-direction: column;
   display: flex;
   display: flex;

+ 2 - 2
src/views/AIDesign/diagnoseResult.vue

@@ -312,7 +312,7 @@ export default class DiagnosisPage extends Vue {
                     }
                     }
                     that.timer = setTimeout(() => {
                     that.timer = setTimeout(() => {
                         that.startPolling();
                         that.startPolling();
-                    }, 20000);
+                    }, 10000);
                 } else {
                 } else {
                     this.StateCode = response.Data.StateCode;
                     this.StateCode = response.Data.StateCode;
                     that.UserFilePathUrl = response.Data.F_UserFilePath;
                     that.UserFilePathUrl = response.Data.F_UserFilePath;
@@ -334,7 +334,7 @@ export default class DiagnosisPage extends Vue {
                     if (response.Data.StateCode == 1) {
                     if (response.Data.StateCode == 1) {
                         let createTime = new Date(response.Data.CreateDate);
                         let createTime = new Date(response.Data.CreateDate);
                         let currentTime = new Date().getTime();
                         let currentTime = new Date().getTime();
-                        if (currentTime - createTime > 20000) {
+                        if (currentTime - createTime > 10000) {
                             that.startPolling();
                             that.startPolling();
                         } else {
                         } else {
                             if (that.timer) {
                             if (that.timer) {

+ 150 - 0
src/views/AIDesign/feedback.vue

@@ -0,0 +1,150 @@
+<template>
+    <div class="resout-container AI-Design-container">
+        <div class="header">
+            <van-nav-bar title="一键反馈" left-arrow @click-left="returnPage" @click-right="toHome">
+                <template #right>
+                    <van-icon name="wap-home-o" color="#333" size="26" />
+                </template>
+            </van-nav-bar>
+        </div>
+        <div class="card" style="padding-top: 15px;">
+            <div v-if="feedbackResult == 0" class="title">写反馈</div>
+            <van-field
+                    v-if="feedbackResult == 0"
+                    v-model="feedbackMessage"
+                    rows="12"
+                    autosize
+                    @input="messageInput"
+                    style="padding: 0;"
+                    type="textarea"
+                    maxlength="300"
+                    :placeholder="textareaPlaceholder"
+                    show-word-limit
+            />
+            <img v-if="feedbackResult == 1" src="@/assets/AIDesign/feedback_result.png" class="feedback-result-img" />
+            <div v-if="feedbackResult == 1" class="feedback-result-txt">您已成功提交反馈,我们将尽快处理~</div>
+        </div>
+        <van-button
+                v-if="feedbackResult == 0"
+                type="primary"
+                size="large"
+                color="#2484F2"
+                :disabled="isBtnDisabled"
+                style="width: 90%;margin-top: 20px;border-radius: 15px;"
+                @click="applyFeedback">
+            提交反馈
+        </van-button>
+    </div>
+</template>
+
+<script lang="ts">
+    import { Component, Vue } from "vue-property-decorator";
+    import { outsideUpdateFeedBack, insideUpdateFeedBack } from "@/api/indexAI";
+    import { toLBHome } from '@/utils/index';
+    @Component
+    export default class extends Vue {
+
+        private isBtnDisabled = true;
+        private feedbackMessage = '';
+        private feedbackResult = 0;
+        private wallType: '';
+        private textareaPlaceholder = '差点意思?再生成一张会更好\n也可以在此提出您的宝贵意见...'
+
+        // 处理内外墙api
+        private applyFeedbackApi = {
+            outside: outsideUpdateFeedBack,
+            inside: insideUpdateFeedBack
+        };
+
+        activated(){
+            this.wallType = this.$route.query.wallType;
+            this.feedbackResult =  this.$route.query.feedbackResult;
+            this.initialize();
+        }
+
+        //初始化页面数据
+        private initialize() {
+            this.feedbackMessage = '';
+            this.isBtnDisabled = true;
+        }
+        
+        applyFeedback(){
+            let that = this;
+            const F_ID = this.$route.query.F_id || "";
+            const formData = new FormData();
+            formData.append('F_id', F_ID);
+            formData.append('Feedback', that.feedbackMessage);
+            that.applyFeedbackApi[that.wallType](formData).then(response => {
+                if (response.StatusCode == 200) {
+                    that.feedbackResult = 1;
+                }
+            })
+        }
+
+        messageInput(value){
+            let that = this;
+            if (value.trim() === "") {
+                that.isBtnDisabled = true;
+            }else {
+                that.isBtnDisabled = false;
+            }
+        }
+
+        returnPage() {
+            this.$router.back();
+        }
+
+        toHome() {
+            toLBHome()
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .resout-container {
+        background: linear-gradient(to bottom, #dffef6, #e7f8f4);
+        min-height: 100vh;
+        flex-direction: column;
+        display: flex;
+        align-items: center;
+    }
+    .header {
+        border-bottom: 1px solid #f8f8f8;
+        .van-nav-bar__title {
+            font-size: 20px;
+            color: #333;
+        }
+        .van-icon {
+            font-size: 20px;
+            color: #333 !important;
+        }
+    }
+    .card{
+        width: 90%;
+        height: 60vh;
+        min-height: 60vh;
+        background-color: #FFFFFF;
+        border-radius: 15px;
+        margin-top: 70px;
+        flex-direction: column;
+        display: flex;
+        box-sizing: border-box;
+        padding: 15px;
+        .title{
+            font-size: 20px;
+            font-weight: 700;
+            margin-bottom: 15px;
+        }
+        .feedback-result-img{
+            width: 70%;
+            margin-left: 15%;
+            margin-top: 10%;
+        }
+        .feedback-result-txt{
+            font-size: 16px;
+            color: rgb(134, 144, 156);
+            text-align: center;
+            margin-top: 15px;
+        }
+    }
+</style>

+ 43 - 6
src/views/AIDesign/insideDesign.vue

@@ -126,6 +126,17 @@
           </van-radio-group>
           </van-radio-group>
         </div>
         </div>
       </div>
       </div>
+      <van-cell v-show="activeName != '风格'" style="margin-top: 10px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);">
+        <template #title>
+          <span class="qdys-checked-title">墙顶一色</span>
+        </template>
+        <template #right-icon>
+          <van-switch v-model="qdysChecked" active-color="#76EE59" size="20" />
+        </template>
+        <template #label>
+          <span class="qdys-checked-tip">*不开启则墙顶默认白色,开启则跟随所选色卡</span>
+        </template>
+      </van-cell>
       <!-- AI生成按钮 -->
       <!-- AI生成按钮 -->
       <div class="generate-section">
       <div class="generate-section">
         <van-button v-show="AIBtnDisabled" type="primary" block color="#E87838" disabled loading loading-type="spinner"
         <van-button v-show="AIBtnDisabled" type="primary" block color="#E87838" disabled loading loading-type="spinner"
@@ -198,7 +209,7 @@ export default class extends Vue {
   private isEchoAssign: boolean = false;// 新增:标记是否为代码回显赋值(默认 false)
   private isEchoAssign: boolean = false;// 新增:标记是否为代码回显赋值(默认 false)
   private textureCode_selItem_index = 0;//纹理一级分类的选中索引
   private textureCode_selItem_index = 0;//纹理一级分类的选中索引
   private color_selItem = null;//选中的色卡
   private color_selItem = null;//选中的色卡
-
+  private qdysChecked = false;//墙顶一色开关
 
 
   // 当前选中的选项
   // 当前选中的选项
   private oldf_id = null;
   private oldf_id = null;
@@ -250,6 +261,7 @@ export default class extends Vue {
     this.isEchoAssign = false;
     this.isEchoAssign = false;
     this.textureCode_selItem_index = 0;
     this.textureCode_selItem_index = 0;
     this.color_selItem = null;
     this.color_selItem = null;
+    this.qdysChecked = false;
   }
   }
 
 
   tabsChange(value: string) {
   tabsChange(value: string) {
@@ -484,6 +496,7 @@ export default class extends Vue {
   }
   }
 
 
   GetEntityData(F_id) {
   GetEntityData(F_id) {
+      let that = this;
     const formData = new FormData();
     const formData = new FormData();
     formData.append('F_id', F_id);
     formData.append('F_id', F_id);
     insideGetEntity(formData).then(response => {
     insideGetEntity(formData).then(response => {
@@ -498,18 +511,22 @@ export default class extends Vue {
           this.DesignStyle_selValue = response.Data.F_Style;// 风格选中的值
           this.DesignStyle_selValue = response.Data.F_Style;// 风格选中的值
           // this.textureCode_selValue = response.Data.F_TextureCode;// 深槽工艺选中的值
           // this.textureCode_selValue = response.Data.F_TextureCode;// 深槽工艺选中的值
           this.color_selValue = response.Data.F_Color;// 电子色卡选中的值
           this.color_selValue = response.Data.F_Color;// 电子色卡选中的值
+            this.qdysChecked = response.Data.F_WallCeilingSameColor == 1 ? true : false;// 是否开启墙顶一色
           const F_TextureCodeWithColor = response.Data.F_TextureCodeWithColor;
           const F_TextureCodeWithColor = response.Data.F_TextureCodeWithColor;
           // 处理纹理
           // 处理纹理
           if (F_TextureCodeWithColor) {
           if (F_TextureCodeWithColor) {
-            this.textureCode_selValue = F_TextureCodeWithColor.split("-")[1];
+            // this.textureCode_selValue = F_TextureCodeWithColor.split("-")[1];
             // 找到选中的纹理项和索引
             // 找到选中的纹理项和索引
             let selectedItem = null;
             let selectedItem = null;
             let selectedIndex = -1;
             let selectedIndex = -1;
             this.textureCode_options.forEach((item, index) => {
             this.textureCode_options.forEach((item, index) => {
-              if (item.text === this.textureCode_selValue) {
-                selectedItem = item;
-                selectedIndex = index;
-              }
+                item.subitems.forEach((childItem,childIndex) => {
+                    if (childItem.value === F_TextureCodeWithColor) {
+                        that.textureCode_selValue = item.text;
+                        selectedItem = item;
+                        selectedIndex = index;
+                    }
+                })
             });
             });
             this.textureCode_selItem_index = selectedIndex;
             this.textureCode_selItem_index = selectedIndex;
             // 找到选中的纹理颜色
             // 找到选中的纹理颜色
@@ -653,6 +670,13 @@ export default class extends Vue {
     } else {
     } else {
       formData.append('oldf_id', this.oldf_id);
       formData.append('oldf_id', this.oldf_id);
     }
     }
+    if (this.activeName != '风格'){
+        if (this.qdysChecked){
+            formData.append('wallCeilingSameColor', 1);
+        } else {
+            formData.append('wallCeilingSameColor', 0);
+        }
+    }
     // 企微类型
     // 企微类型
     // const agentFrom = window.localStorage.getItem('agentFromAI');
     // const agentFrom = window.localStorage.getItem('agentFromAI');
     // const wecomType = getWecomType(agentFrom);
     // const wecomType = getWecomType(agentFrom);
@@ -1312,6 +1336,19 @@ export default class extends Vue {
   }
   }
 }
 }
 
 
+.qdys-checked-title{
+  font-size: 16px;
+  font-weight: 500;
+  line-height: 14px;
+  color: #000;
+}
+
+.qdys-checked-tip{
+  font-size: 12px;
+  line-height: 14px;
+  color: #86909C;
+}
+
 .color-plus {
 .color-plus {
   margin: 0px auto 10px;
   margin: 0px auto 10px;
 
 

+ 84 - 28
src/views/AIDesign/result.vue

@@ -10,7 +10,7 @@
 
 
     <div class="container">
     <div class="container">
       <!-- 历史生图 -->
       <!-- 历史生图 -->
-      <div class="history-section padded-lr-20" v-if="wallType === 'outside'">
+      <div class="history-section padded-lr-20" v-if="wallType === 'outside' || wallType === 'inside'">
         <div class="history-header" @click="viewHistory">
         <div class="history-header" @click="viewHistory">
           <van-icon name="clock-o" color="#EC8868" />
           <van-icon name="clock-o" color="#EC8868" />
           <span>历史生图</span>
           <span>历史生图</span>
@@ -29,13 +29,13 @@
             </div>
             </div>
           </div>
           </div>
           <div class="imgbox-b">
           <div class="imgbox-b">
-            <div class="image-wrapper" @click="imgClick(UserFilePathUrl)">
+            <div class="image-wrapper" @click="imgClick(0)">
               <img :src="UserFilePathUrl" alt="房屋效果图" class="house-image" @error="handleImageError" />
               <img :src="UserFilePathUrl" alt="房屋效果图" class="house-image" @error="handleImageError" />
               <div v-on="{
               <div v-on="{
                 'click.stop': imgHasErr ? () => reloadImage('userFile') : () => { }
                 'click.stop': imgHasErr ? () => reloadImage('userFile') : () => { }
               }"></div>
               }"></div>
             </div>
             </div>
-            <div class="image-wrapper" @click="imgClick(imageUrl)">
+            <div class="image-wrapper" @click="imgClick(1)">
               <img :src="imageUrlSmall" alt="房屋效果图" class="house-image" @error="handleImageError" />
               <img :src="imageUrlSmall" alt="房屋效果图" class="house-image" @error="handleImageError" />
               <div v-on="{
               <div v-on="{
                 'click.stop': imgHasErr ? () => reloadImage('imageSmall') : () => { }
                 'click.stop': imgHasErr ? () => reloadImage('imageSmall') : () => { }
@@ -49,13 +49,18 @@
             '生成失败,\n' + StateInfo :
             '生成失败,\n' + StateInfo :
             '正在为您加速生成中,先喝杯茶吧~\n退出本页不影响生成')) : '加载中...' }}</p>
             '正在为您加速生成中,先喝杯茶吧~\n退出本页不影响生成')) : '加载中...' }}</p>
         </div>
         </div>
+        <div v-if="imageUrl" class="feedback" @click="toFeedback">
+          <img src="@/assets/AIDesign/feedback_icon.png" class="feedback-icon" />
+          <span v-if="F_Feedback == null">一键反馈</span>
+          <span v-if="F_Feedback != null">查看反馈</span>
+        </div>
       </div>
       </div>
 
 
       <!-- 功能按钮组 -->
       <!-- 功能按钮组 -->
       <!-- 外墙 -->
       <!-- 外墙 -->
-      <div class="button-group-outside" v-if="wallType === 'outside'">
+      <div class="button-group-outside" v-if="wallType === 'outside' || wallType === 'inside'">
         <button class="action-button-big flex-center" @click="handleAIfun"
         <button class="action-button-big flex-center" @click="handleAIfun"
-          v-if="agentFrom === 'stoneLikePaint' && allRes && allRes.F_DesignStyle != 'CHANGE_COLOR' && StateCode == 2">
+          v-if="agentFrom === 'stoneLikePaint' && allRes && allRes.F_DesignStyle != 'CHANGE_COLOR' && StateCode == 2 && wallType === 'outside'">
           <img src="@/assets/AIDesign/file-excel-line.png" class="icon" />
           <img src="@/assets/AIDesign/file-excel-line.png" class="icon" />
           <div>
           <div>
             <div class="title">确认AI设计</div>
             <div class="title">确认AI设计</div>
@@ -73,7 +78,7 @@
           </button>
           </button>
           <!-- :class="projectDisableFlag == true ? 'save-button-disabled' : ''"  :disabled="projectDisableFlag"-->
           <!-- :class="projectDisableFlag == true ? 'save-button-disabled' : ''"  :disabled="projectDisableFlag"-->
           <button class="action-button-middle flex-center" @click="manualDesign"
           <button class="action-button-middle flex-center" @click="manualDesign"
-            v-if="showArtificial && StateCode == 2 && !projectDisableFlag">
+            v-if="showArtificial && StateCode == 2 && !projectDisableFlag && wallType === 'outside'">
             <img src="@/assets/AIDesign/bsIcon.png" class="iconbig" />
             <img src="@/assets/AIDesign/bsIcon.png" class="iconbig" />
             <div>
             <div>
               <div class="title">转人工设计
               <div class="title">转人工设计
@@ -84,20 +89,32 @@
         </div>
         </div>
       </div>
       </div>
       <!-- 内墙 -->
       <!-- 内墙 -->
-      <div class="button-group" v-if="wallType === 'inside'">
-        <button class="action-button" :disabled="regenerateDisable"
-          :class="regenerateDisable == true ? 'save-button-disabled' : ''" @click="regenerate">
-          <van-icon class="icon" name="replay" />
-          <span class="text">重新生成</span>
-        </button>
-        <button class="action-button" @click="viewHistory">
-          <van-icon class="icon" name="clock-o" />
-          <span class="text">历史生图</span>
-          <span v-if="!readState" class="badge-dot"></span>
-        </button>
-      </div>
-
+      <!--<div class="button-group" v-if="wallType === 'inside'">-->
+        <!--<button class="action-button" :disabled="regenerateDisable"-->
+          <!--:class="regenerateDisable == true ? 'save-button-disabled' : ''" @click="regenerate">-->
+          <!--<van-icon class="icon" name="replay" />-->
+          <!--<span class="text">重新生成</span>-->
+        <!--</button>-->
+        <!--<button class="action-button" @click="viewHistory">-->
+          <!--<van-icon class="icon" name="clock-o" />-->
+          <!--<span class="text">历史生图</span>-->
+          <!--<span v-if="!readState" class="badge-dot"></span>-->
+        <!--</button>-->
+      <!--</div>-->
     </div>
     </div>
+    <van-image-preview
+            v-model="showImagePreview"
+            :images="imagePreviewArray"
+            :loop="true"
+            :start-position="imagePreviewIndex"
+            @change="imagePreviewOnChange">
+      <template v-slot:index>
+        <div class="image-preview-header">
+          <div>{{imagePreviewIndex+1}}/{{imagePreviewArray.length}}</div>
+          <div>{{imagePreviewIndex == 0 ? '原图' : '效果图'}}</div>
+        </div>
+      </template>
+    </van-image-preview>
   </div>
   </div>
 </template>
 </template>
 <script lang="ts">
 <script lang="ts">
@@ -107,7 +124,11 @@ import { GetEntity, GetReadState, UpdateReadState, insideGetEntity, insideGetRea
 import { getWecomType, toLBHome, toXiaoChengxu, getWxconfig, getWecomTypeName, checkAndSaveUserWecomType } from '@/utils/index';
 import { getWecomType, toLBHome, toXiaoChengxu, getWxconfig, getWecomTypeName, checkAndSaveUserWecomType } from '@/utils/index';
 import axios from "axios";
 import axios from "axios";
 declare let wx: any;
 declare let wx: any;
-@Component
+@Component({
+    components: {
+        [ImagePreview.Component.name]: ImagePreview.Component,
+    }
+})
 export default class extends Vue {
 export default class extends Vue {
   private readState = true;
   private readState = true;
   // 数据属性
   // 数据属性
@@ -124,8 +145,12 @@ export default class extends Vue {
   private type = '';
   private type = '';
   private wallType = '';
   private wallType = '';
   private F_OutsideType = null;
   private F_OutsideType = null;
+  private F_Feedback = null;
   private defaultImg = require('@/assets/AIDesign/imgErrIcon.jpg'); // 替换为实际图片路径
   private defaultImg = require('@/assets/AIDesign/imgErrIcon.jpg'); // 替换为实际图片路径
   private imgHasErr = false;
   private imgHasErr = false;
+  private showImagePreview = false;
+  private imagePreviewArray = [];
+  private imagePreviewIndex = 0
   // 处理内外墙api
   // 处理内外墙api
   private GetEntityToApi = {
   private GetEntityToApi = {
     outside: GetEntity,
     outside: GetEntity,
@@ -146,7 +171,7 @@ export default class extends Vue {
   };
   };
 
 
   private designTimer = {
   private designTimer = {
-    outside: 30000,
+    outside: 20000,
     inside: 20000
     inside: 20000
   };
   };
   private showArtificial = false;
   private showArtificial = false;
@@ -322,9 +347,14 @@ export default class extends Vue {
   toHome() {
   toHome() {
     toLBHome()
     toLBHome()
   }
   }
-  imgClick(url) {
-    ImagePreview([url]);
+  imgClick(index) {
+      this.showImagePreview = true;
+      this.imagePreviewIndex = index;
+    // ImagePreview([this.UserFilePathUrl,this.imageUrl],index);
   }
   }
+    imagePreviewOnChange(index){
+      this.imagePreviewIndex = index;
+    }
   private startPolling(): void {
   private startPolling(): void {
     // 立即执行一次检查
     // 立即执行一次检查
     this.GetEntityData();
     this.GetEntityData();
@@ -372,11 +402,12 @@ export default class extends Vue {
           this.StateInfo = response.Data.Description;
           this.StateInfo = response.Data.Description;
           this.projectId = response.Data.ProjectID;
           this.projectId = response.Data.ProjectID;
           this.F_OutsideType = response.Data.F_OutsideType;
           this.F_OutsideType = response.Data.F_OutsideType;
+          this.F_Feedback = response.Data.F_Feedback;
           let DesignCount = response.Data.DesignCount || 0;
           let DesignCount = response.Data.DesignCount || 0;
           // 外墙-服务商随身邦
           // 外墙-服务商随身邦
           if (this.agentFrom === 'stoneLikePaint' && this.wallType === 'outside') {
           if (this.agentFrom === 'stoneLikePaint' && this.wallType === 'outside') {
             if (that.isNeedProjectFlag) {
             if (that.isNeedProjectFlag) {
-              if (DesignCount >= 3) {
+              if (DesignCount >= 6) {
                 that.projectDisableFlag = false;//有项目判断>=3出现
                 that.projectDisableFlag = false;//有项目判断>=3出现
               }
               }
             } else {
             } else {
@@ -388,6 +419,7 @@ export default class extends Vue {
             that.imageUrl = response.Data.BaseUrl + high_Definition_img;
             that.imageUrl = response.Data.BaseUrl + high_Definition_img;
             that.imageUrlSmall = response.Data.BaseUrl + response.Data.F_ResultSmallFilePath;
             that.imageUrlSmall = response.Data.BaseUrl + response.Data.F_ResultSmallFilePath;
             that.UserFilePathUrl = response.Data.BaseUrl + response.Data.F_UserFilePath;
             that.UserFilePathUrl = response.Data.BaseUrl + response.Data.F_UserFilePath;
+            that.imagePreviewArray = [that.UserFilePathUrl,that.imageUrl];
           }
           }
           if (response.Data.StateCode == 1) {
           if (response.Data.StateCode == 1) {
             let createTime = new Date(response.Data.CreateDate);
             let createTime = new Date(response.Data.CreateDate);
@@ -430,12 +462,13 @@ export default class extends Vue {
           this.StateCode = response.Data.StateCode;
           this.StateCode = response.Data.StateCode;
           this.StateInfo = response.Data.Description;
           this.StateInfo = response.Data.Description;
           this.F_OutsideType = response.Data.F_OutsideType;
           this.F_OutsideType = response.Data.F_OutsideType;
+          this.F_Feedback = response.Data.F_Feedback;
           this.projectId = response.Data.ProjectID;
           this.projectId = response.Data.ProjectID;
           let DesignCount = response.Data.DesignCount || 0;
           let DesignCount = response.Data.DesignCount || 0;
           // 外墙-服务商随身邦
           // 外墙-服务商随身邦
           if (this.agentFrom === 'stoneLikePaint' && this.wallType === 'outside') {
           if (this.agentFrom === 'stoneLikePaint' && this.wallType === 'outside') {
             if (that.isNeedProjectFlag) {
             if (that.isNeedProjectFlag) {
-              if (DesignCount >= 3) {
+              if (DesignCount >= 6) {
                 that.projectDisableFlag = false;//有项目判断>=3出现
                 that.projectDisableFlag = false;//有项目判断>=3出现
               }
               }
             } else {
             } else {
@@ -447,6 +480,7 @@ export default class extends Vue {
             that.imageUrl = response.Data.BaseUrl + high_Definition_img;
             that.imageUrl = response.Data.BaseUrl + high_Definition_img;
             that.imageUrlSmall = response.Data.BaseUrl + response.Data.F_ResultSmallFilePath;
             that.imageUrlSmall = response.Data.BaseUrl + response.Data.F_ResultSmallFilePath;
             that.UserFilePathUrl = response.Data.BaseUrl + response.Data.F_UserFilePath;
             that.UserFilePathUrl = response.Data.BaseUrl + response.Data.F_UserFilePath;
+            that.imagePreviewArray = [that.UserFilePathUrl,that.imageUrl];
           }
           }
           if (response.Data.StateCode == 2 || response.Data.StateCode == 3 || response.Data.StateCode == 4) {
           if (response.Data.StateCode == 2 || response.Data.StateCode == 3 || response.Data.StateCode == 4) {
             that.regenerateDisable = false;
             that.regenerateDisable = false;
@@ -556,6 +590,12 @@ export default class extends Vue {
     });
     });
   }
   }
 
 
+  private toFeedback(){
+      let that = this;
+      const F_ID = this.$route.query.F_id || "";
+      this.$router.push({ path: '/AIDesign/feedback', query: { F_id: F_ID, feedbackResult: that.F_Feedback == null ? 0 : 1, wallType: this.wallType } });
+  }
+
   private viewHistory(): void {
   private viewHistory(): void {
     this.UpdateReadStateFn();
     this.UpdateReadStateFn();
     // console.log('查看历史生成');
     // console.log('查看历史生成');
@@ -590,7 +630,7 @@ export default class extends Vue {
     AddTrackEvent(formData)//埋点
     AddTrackEvent(formData)//埋点
     let allRes = JSON.stringify(this.allRes);
     let allRes = JSON.stringify(this.allRes);
     sessionStorage.setItem("planParams", allRes);
     sessionStorage.setItem("planParams", allRes);
-    this.$router.push({ path: '/AIDesign/GeneratePlan' });
+    this.$router.push({ path: '/AIDesign/GeneratePlan', query: { serviceCode: this.allRes.ServiceCode } });
   }
   }
 }
 }
 </script>
 </script>
@@ -663,7 +703,16 @@ export default class extends Vue {
   border-radius: 10px;
   border-radius: 10px;
   overflow: hidden;
   overflow: hidden;
   box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
   box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
-
+  .feedback{
+    padding: 15px 10px 15px 10px;
+    font-size: 16px;
+    color: rgba(22, 93, 255, 1);
+    .feedback-icon{
+      width: 20px;
+      margin-right: 5px;
+      margin-bottom: -5px;
+    }
+  }
   .comparisonWrapper {
   .comparisonWrapper {
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
@@ -933,9 +982,16 @@ export default class extends Vue {
   }
   }
 }
 }
 
 
-
+.image-preview-header{
+  flex-direction: column;
+  display: flex;
+  align-items: center;
+}
 .van-nav-bar__title {
 .van-nav-bar__title {
   font-size: 20px;
   font-size: 20px;
   color: #333;
   color: #333;
 }
 }
+::v-deep .van-swipe__track{
+  transition-duration: 300ms!important;
+}
 </style>
 </style>