Pārlūkot izejas kodu

图片识别异常部主管反馈内容修改

zhujindu 7 mēneši atpakaļ
vecāks
revīzija
da3467b2eb

+ 13 - 0
src/router/index.js

@@ -480,8 +480,21 @@ const router = new VueRouter({
         {
           path: '/AIImageDetail',
           name: 'AIImageDetail',
+          meta: { title: '新的识别反馈-店招' },
           component: () => import('@/views/AIImage/AIImageDetail.vue'),
         },
+        {
+          path: '/historyAIImageDetail',
+          name: 'historyAIImageDetail',
+          meta: { title: '旧的识别反馈' },
+          component: () => import('@/views/AIImage/historyAIImageDetail.vue'),
+        },
+        {
+          path: '/AIImageDetailTSJ',
+          name: 'AIImageDetailTSJ',
+          meta: { title: '新的识别反馈-调色机' },
+          component: () => import('@/views/AIImage/AIImageDetailTSJ.vue'),
+        },
       ],
     },
   ],

+ 16 - 38
src/views/AIImage/AIImageDetail.vue

@@ -57,19 +57,11 @@
           <span style="color: red">*</span>
           <span>请核查并确认店招异常原因:</span>
         </div>
-        <template v-if="data.historyFeedback == '0'">
-          <van-radio-group v-model="AIResult" :disabled="approveState == '1'">
-            <van-radio name="1">正确</van-radio>
-            <van-radio name="0">不正确</van-radio>
-          </van-radio-group>
-        </template>
-        <template v-if="data.historyFeedback == '1'">
-          <van-radio-group v-model="AIResult" :disabled="approveState == '1'">
-            <van-radio :name="item.dictValue" v-for="item in AIResultOption">{{
-              item.dictLabel
-            }}</van-radio>
-          </van-radio-group>
-        </template>
+        <van-radio-group v-model="abnormalReason" :disabled="approveState == '1'">
+          <van-radio :name="item.dictValue" v-for="item in AIResultOption">{{
+            item.dictLabel
+          }}</van-radio>
+        </van-radio-group>
       </div>
       <div class="cause" v-if="data.abnormalStoreSolutionImg">
         <div class="title">
@@ -85,8 +77,7 @@
       </div>
       <div class="cause">
         <div class="title">
-          <span style="color: red">*</span>
-          <span>{{ causeTitle }}</span>
+          <span>反馈:</span>
         </div>
         <van-field
           v-model="causeMessage"
@@ -94,7 +85,7 @@
           rows="1"
           autosize
           type="textarea"
-          :placeholder="'请输入' + causeTitle" />
+          placeholder="如ai识别错误、门店异常原因等,均可在此反馈,本部相关负责人会查看" />
       </div>
     </div>
     <div class="confirmBtn" v-if="approveState == '0'">
@@ -112,25 +103,13 @@ export default {
     return {
       data: null,
       photoApproveId: null,
-      AIResult: '1',
+      abnormalReason: '1',
       causeTitle: '',
       causeMessage: '',
       approveState: '0',
       AIResultOption: [],
     };
   },
-  watch: {
-    AIResult: {
-      handler(val) {
-        if (val == 1) {
-          this.causeTitle = '拜访照异常原因及解决方案';
-        } else {
-          this.causeTitle = '反馈AI识别结果有误';
-        }
-      },
-      immediate: true,
-    },
-  },
   filters: {
     filterType(val) {
       if (val == 1) {
@@ -162,9 +141,10 @@ export default {
           this.data = res.data;
           this.approveState = res.data.approveState; //反馈状态:0 未审批 1已审批
           if (this.approveState == '0') {
+            // latestPhotoApprove 上次反馈内容 反显
             let latestPhotoApprove = res.data.latestPhotoApprove;
             if (latestPhotoApprove) {
-              this.AIResult = latestPhotoApprove.resultCorrect || '1';
+              this.abnormalReason = latestPhotoApprove.resultCorrect || '1';
               this.causeMessage =
                 latestPhotoApprove.reasonsSolutions || latestPhotoApprove.feedbackError;
               this.$dialog
@@ -179,7 +159,7 @@ export default {
                 .then(() => {});
             }
           } else {
-            this.AIResult = res.data.resultCorrect || '1';
+            this.abnormalReason = res.data.resultCorrect || '1';
             this.causeMessage = res.data.reasonsSolutions || res.data.feedbackError;
           }
         }
@@ -189,16 +169,14 @@ export default {
       ImagePreview([val]);
     },
     confirm() {
-      if (!this.causeMessage) {
-        this.$toast('请输入' + this.causeTitle);
-        return;
-      }
+      this.toastLoading(0, '加载中...', true);
       savePhotoApprove({
         photoApproveId: this.photoApproveId, //	long	主键
-        resultCorrect: this.AIResult, //	string	AI识别是否正确: 1 正确 0不正确
-        reasonsSolutions: this.AIResult == '1' ? this.causeMessage : '', //	string	原因及解决方案
-        feedbackError: this.AIResult == '0' ? this.causeMessage : '', //	string	反馈AI识别不正确
+        resultCorrect: this.abnormalReason, //	string	AI识别是否正确: 1 正确 0不正确
+        reasonsSolutions: '',
+        feedbackError: this.causeMessage, //	string	反馈AI识别不正确
       }).then((res) => {
+        this.toastLoading().clear();
         if (res.code == 200) {
           this.$toast.loading({
             duration: 1000,

+ 248 - 0
src/views/AIImage/AIImageDetailTSJ.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="AIImageDetail" v-if="data">
+    <van-nav-bar class="navBar" title="异常反馈" left-arrow @click-left="onClickLeft">
+    </van-nav-bar>
+    <div class="message">
+      <div class="storeTitle">
+        <div class="storeName">{{ data.storeName }}</div>
+        <div class="storeCode" style="margin-left: 5px; margin-top: 2px">
+          (<span style="color: #0057ba; vertical-align: -1px">{{ data.storeCode }}</span
+          >)
+        </div>
+      </div>
+      <div class="item">
+        <div class="label">门店类型:</div>
+        <div class="value">{{ data.storeCategoryName }}</div>
+      </div>
+      <div class="item">
+        <div class="label">地址:</div>
+        <div class="value">{{ data.addressLine }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拜访人:</div>
+        <div class="value">{{ data.visitUserNickName }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拜访时间:</div>
+        <div class="value">{{ data.createTime }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拍摄类型:</div>
+        <div class="value">{{ data.identifyType | filterType }}</div>
+      </div>
+      <div class="item" style="color: red">
+        <div class="label">识别结果:</div>
+        <div class="value">{{ data.unqualifiedReason }}</div>
+      </div>
+      <div class="item">
+        <div class="label">业务员反馈AI识别不正确:{{ data.feedbackMessage || '未反馈' }}</div>
+      </div>
+      <div class="item" style="display: flex; justify-content: center">
+        <van-image
+          v-if="data.fileUrl"
+          height="400px"
+          :src="data.fileUrl"
+          @click="previewImgs(data.fileUrl)"
+          fit="contain">
+          <template v-slot:loading>
+            <van-loading type="spinner" size="40" />
+          </template>
+        </van-image>
+      </div>
+    </div>
+    <p class="titleText">请主管了解情况后回复原因及解决方案</p>
+    <div class="feedbackReason">
+      <!-- <div class="result">
+        <div class="title">
+          <span style="color: red">*</span>
+          <span>AI识别结果</span>
+        </div>
+        <van-radio-group v-model="AIResult" :disabled="approveState == '1'">
+          <van-radio name="1">正确</van-radio>
+          <van-radio name="0">不正确</van-radio>
+        </van-radio-group>
+      </div> -->
+      <div class="cause">
+        <div class="title">
+          <span style="color: red">*</span>
+          <span>反馈原因及解决方案</span>
+        </div>
+        <van-field
+          v-model="causeMessage"
+          :disabled="approveState == '1'"
+          rows="1"
+          autosize
+          type="textarea"
+          placeholder="请反馈原因及解决方案" />
+      </div>
+    </div>
+    <div class="confirmBtn" v-if="approveState == '0'">
+      <van-button type="info" @click="confirm">提交</van-button>
+    </div>
+  </div>
+</template>
+<script>
+import { ImagePreview } from 'vant';
+import { getPhotoApproveDetail, savePhotoApprove } from '@/api/AIImage';
+export default {
+  name: 'AIImageDetail',
+  data() {
+    return {
+      data: null,
+      photoApproveId: null,
+      AIResult: '1',
+      causeTitle: '',
+      causeMessage: '',
+      approveState: '0',
+    };
+  },
+  watch: {
+    AIResult: {
+      handler(val) {
+        if (val == 1) {
+          this.causeTitle = '拜访照异常原因及解决方案';
+        } else {
+          this.causeTitle = '反馈AI识别结果有误';
+        }
+      },
+      immediate: true,
+    },
+  },
+  filters: {
+    filterType(val) {
+      if (val == 1) {
+        return '店招内容识别';
+      } else if (val == 2) {
+        return '门店代码识别';
+      } else if (val == 3) {
+        return '调色机识别';
+      } else if (val == 4) {
+        return '更换店招';
+      }
+    },
+  },
+  activated() {
+    this.photoApproveId = this.$route.query.photoApproveId;
+    this.getDeytail();
+  },
+  mounted() {},
+  methods: {
+    getDeytail() {
+      this.toastLoading(0, '加载中...', true);
+      getPhotoApproveDetail({ photoApproveId: this.photoApproveId }).then((res) => {
+        this.toastLoading().clear();
+        if (res.code == 200) {
+          this.data = res.data;
+          this.approveState = res.data.approveState; //反馈状态:0 未审批 1已审批
+          if (this.approveState == '0') {
+            let latestPhotoApprove = res.data.latestPhotoApprove;
+            if (latestPhotoApprove) {
+              this.AIResult = latestPhotoApprove.resultCorrect || '1';
+              this.causeMessage =
+                latestPhotoApprove.reasonsSolutions || latestPhotoApprove.feedbackError;
+              this.$dialog
+                .confirm({
+                  title: '系统提示',
+                  message:
+                    latestPhotoApprove.approveTime +
+                    '已反馈该店拜访照异常原因及解决方案,此次拜访照仍异常,请及时跟进',
+                  confirmButtonText: '确定',
+                  showCancelButton: false,
+                })
+                .then(() => {});
+            }
+          } else {
+            this.AIResult = res.data.resultCorrect || '1';
+            this.causeMessage = res.data.reasonsSolutions || res.data.feedbackError;
+          }
+        }
+      });
+    },
+    previewImgs(val) {
+      ImagePreview([val]);
+    },
+    confirm() {
+      if (!this.causeMessage) {
+        this.$toast('请输入' + this.causeTitle);
+        return;
+      }
+      savePhotoApprove({
+        photoApproveId: this.photoApproveId, //	long	主键
+        resultCorrect: '', //	string	AI识别是否正确: 1 正确 0不正确
+        reasonsSolutions: this.causeMessage, //	string	原因及解决方案
+        feedbackError: '', //	string	反馈AI识别不正确
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$toast.loading({
+            duration: 1000,
+            message: '已反馈给本部',
+            forbidClick: true,
+            onClose: () => {
+              this.onClickLeft();
+            },
+          });
+        } else {
+          this.$toast('提交失败');
+        }
+      });
+    },
+    onClickLeft() {
+      this.$router.replace({
+        path: '/AIImage',
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.AIImageDetail {
+  .message {
+    padding: 10px;
+    background: #fff;
+    .storeTitle {
+      display: flex;
+      font-size: 16px;
+      font-weight: bold;
+      padding: 5px 0;
+    }
+    .item {
+      display: flex;
+      font-size: 13px;
+      padding: 3px 0;
+      .label {
+        /* width: 80px; */
+        text-align: left;
+      }
+      .value {
+        flex: 1;
+      }
+    }
+  }
+  .titleText {
+    padding: 10px;
+    font-size: 16px;
+    font-weight: 600;
+    margin: 0;
+  }
+  .feedbackReason {
+    padding: 10px;
+    background: #fff;
+    font-size: 16px;
+    .title {
+      padding: 8px 0;
+    }
+    .van-radio {
+      padding: 5px 0 5px 10px;
+    }
+  }
+  .confirmBtn {
+    position: sticky;
+    bottom: 0;
+    padding-top: 20px;
+    button {
+      width: 100%;
+      background-color: #1a77cc;
+    }
+  }
+}
+</style>

+ 248 - 0
src/views/AIImage/historyAIImageDetail.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="AIImageDetail" v-if="data">
+    <van-nav-bar class="navBar" title="异常反馈" left-arrow @click-left="onClickLeft">
+    </van-nav-bar>
+    <div class="message">
+      <div class="storeTitle">
+        <div class="storeName">{{ data.storeName }}</div>
+        <div class="storeCode" style="margin-left: 5px; margin-top: 2px">
+          (<span style="color: #0057ba; vertical-align: -1px">{{ data.storeCode }}</span
+          >)
+        </div>
+      </div>
+      <div class="item">
+        <div class="label">门店类型:</div>
+        <div class="value">{{ data.storeCategoryName }}</div>
+      </div>
+      <div class="item">
+        <div class="label">地址:</div>
+        <div class="value">{{ data.addressLine }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拜访人:</div>
+        <div class="value">{{ data.visitUserNickName }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拜访时间:</div>
+        <div class="value">{{ data.createTime }}</div>
+      </div>
+      <div class="item">
+        <div class="label">拍摄类型:</div>
+        <div class="value">{{ data.identifyType | filterType }}</div>
+      </div>
+      <div class="item" style="color: red">
+        <div class="label">识别结果:</div>
+        <div class="value">{{ data.unqualifiedReason }}</div>
+      </div>
+      <div class="item">
+        <div class="label">业务员反馈AI识别不正确:{{ data.feedbackMessage || '未反馈' }}</div>
+      </div>
+      <div class="item" style="display: flex; justify-content: center">
+        <van-image
+          v-if="data.fileUrl"
+          height="400px"
+          :src="data.fileUrl"
+          @click="previewImgs(data.fileUrl)"
+          fit="contain">
+          <template v-slot:loading>
+            <van-loading type="spinner" size="40" />
+          </template>
+        </van-image>
+      </div>
+    </div>
+    <p class="titleText">请主管了解情况后回复原因及解决方案</p>
+    <div class="feedbackReason">
+      <div class="result">
+        <div class="title">
+          <span style="color: red">*</span>
+          <span>AI识别结果</span>
+        </div>
+        <van-radio-group v-model="AIResult" :disabled="approveState == '1'">
+          <van-radio name="1">正确</van-radio>
+          <van-radio name="0">不正确</van-radio>
+        </van-radio-group>
+      </div>
+      <div class="cause">
+        <div class="title">
+          <span style="color: red">*</span>
+          <span>{{ causeTitle }}</span>
+        </div>
+        <van-field
+          v-model="causeMessage"
+          :disabled="approveState == '1'"
+          rows="1"
+          autosize
+          type="textarea"
+          :placeholder="'请输入' + causeTitle" />
+      </div>
+    </div>
+    <div class="confirmBtn" v-if="approveState == '0'">
+      <van-button type="info" @click="confirm">提交</van-button>
+    </div>
+  </div>
+</template>
+<script>
+import { ImagePreview } from 'vant';
+import { getPhotoApproveDetail, savePhotoApprove } from '@/api/AIImage';
+export default {
+  name: 'AIImageDetail',
+  data() {
+    return {
+      data: null,
+      photoApproveId: null,
+      AIResult: '1',
+      causeTitle: '',
+      causeMessage: '',
+      approveState: '0',
+    };
+  },
+  watch: {
+    AIResult: {
+      handler(val) {
+        if (val == 1) {
+          this.causeTitle = '拜访照异常原因及解决方案';
+        } else {
+          this.causeTitle = '反馈AI识别结果有误';
+        }
+      },
+      immediate: true,
+    },
+  },
+  filters: {
+    filterType(val) {
+      if (val == 1) {
+        return '店招内容识别';
+      } else if (val == 2) {
+        return '门店代码识别';
+      } else if (val == 3) {
+        return '调色机识别';
+      } else if (val == 4) {
+        return '更换店招';
+      }
+    },
+  },
+  activated() {
+    this.photoApproveId = this.$route.query.photoApproveId;
+    this.getDeytail();
+  },
+  mounted() {},
+  methods: {
+    getDeytail() {
+      this.toastLoading(0, '加载中...', true);
+      getPhotoApproveDetail({ photoApproveId: this.photoApproveId }).then((res) => {
+        this.toastLoading().clear();
+        if (res.code == 200) {
+          this.data = res.data;
+          this.approveState = res.data.approveState; //反馈状态:0 未审批 1已审批
+          if (this.approveState == '0') {
+            let latestPhotoApprove = res.data.latestPhotoApprove;
+            if (latestPhotoApprove) {
+              this.AIResult = latestPhotoApprove.resultCorrect || '1';
+              this.causeMessage =
+                latestPhotoApprove.reasonsSolutions || latestPhotoApprove.feedbackError;
+              this.$dialog
+                .confirm({
+                  title: '系统提示',
+                  message:
+                    latestPhotoApprove.approveTime +
+                    '已反馈该店拜访照异常原因及解决方案,此次拜访照仍异常,请及时跟进',
+                  confirmButtonText: '确定',
+                  showCancelButton: false,
+                })
+                .then(() => {});
+            }
+          } else {
+            this.AIResult = res.data.resultCorrect || '1';
+            this.causeMessage = res.data.reasonsSolutions || res.data.feedbackError;
+          }
+        }
+      });
+    },
+    previewImgs(val) {
+      ImagePreview([val]);
+    },
+    confirm() {
+      if (!this.causeMessage) {
+        this.$toast('请输入' + this.causeTitle);
+        return;
+      }
+      savePhotoApprove({
+        photoApproveId: this.photoApproveId, //	long	主键
+        resultCorrect: this.AIResult, //	string	AI识别是否正确: 1 正确 0不正确
+        reasonsSolutions: this.AIResult == '1' ? this.causeMessage : '', //	string	原因及解决方案
+        feedbackError: this.AIResult == '0' ? this.causeMessage : '', //	string	反馈AI识别不正确
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$toast.loading({
+            duration: 1000,
+            message: '已反馈给本部',
+            forbidClick: true,
+            onClose: () => {
+              this.onClickLeft();
+            },
+          });
+        } else {
+          this.$toast('提交失败');
+        }
+      });
+    },
+    onClickLeft() {
+      this.$router.replace({
+        path: '/AIImage',
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.AIImageDetail {
+  .message {
+    padding: 10px;
+    background: #fff;
+    .storeTitle {
+      display: flex;
+      font-size: 16px;
+      font-weight: bold;
+      padding: 5px 0;
+    }
+    .item {
+      display: flex;
+      font-size: 13px;
+      padding: 3px 0;
+      .label {
+        /* width: 80px; */
+        text-align: left;
+      }
+      .value {
+        flex: 1;
+      }
+    }
+  }
+  .titleText {
+    padding: 10px;
+    font-size: 16px;
+    font-weight: 600;
+    margin: 0;
+  }
+  .feedbackReason {
+    padding: 10px;
+    background: #fff;
+    font-size: 16px;
+    .title {
+      padding: 8px 0;
+    }
+    .van-radio {
+      padding: 5px 0 5px 10px;
+    }
+  }
+  .confirmBtn {
+    position: sticky;
+    bottom: 0;
+    padding-top: 20px;
+    button {
+      width: 100%;
+      background-color: #1a77cc;
+    }
+  }
+}
+</style>

+ 26 - 6
src/views/AIImage/list.vue

@@ -107,12 +107,32 @@ export default {
     },
     // 详情
     toDetail(item) {
-      this.$router.push({
-        path: '/AIImageDetail',
-        query: {
-          photoApproveId: item.photoApproveId,
-        },
-      });
+      // historyFeedback == 0 旧的识别反馈 =1 新的识别反馈
+      if (item.historyFeedback == '0') {
+        this.$router.push({
+          path: '/historyAIImageDetail',
+          query: {
+            photoApproveId: item.photoApproveId,
+          },
+        });
+      } else if (item.historyFeedback == '1') {
+        // 调色机
+        if (item.identifyType == 3) {
+          this.$router.push({
+            path: '/AIImageDetailTSJ',
+            query: {
+              photoApproveId: item.photoApproveId,
+            },
+          });
+        } else {
+          this.$router.push({
+            path: '/AIImageDetail',
+            query: {
+              photoApproveId: item.photoApproveId,
+            },
+          });
+        }
+      }
     },
     onClickLeft() {
       this.$router.replace({

+ 26 - 7
src/views/historicalVisit/historicalDetails.vue

@@ -150,12 +150,22 @@
             <div style="padding: 10px 16px; font-size: 16px; font-weight: bold">
               {{ filterTitle(item.identifyType) }}
             </div>
-            <van-cell-group>
-              <van-cell> AI识别结果: {{ item.resultCorrect == 1 ? '正确' : '不正确' }} </van-cell>
-              <van-cell>
-                拜访照异常原因及解决方案: {{ item.feedbackError || item.reasonsSolutions }}
-              </van-cell>
-            </van-cell-group>
+            <template v-if="item.historyFeedback == '0'">
+              <van-cell-group>
+                <van-cell> AI识别结果: {{ item.resultCorrect == 1 ? '正确' : '不正确' }} </van-cell>
+                <van-cell>
+                  拜访照异常原因及解决方案: {{ item.feedbackError || item.reasonsSolutions }}
+                </van-cell>
+              </van-cell-group>
+            </template>
+            <template v-if="item.historyFeedback == '1'">
+              <van-cell-group>
+                <van-cell v-if="item.identifyType == 1">
+                  店招异常原因: {{ resultCorrect(item.resultCorrect) }}
+                </van-cell>
+                <van-cell> 反馈: {{ item.feedbackError || item.reasonsSolutions }} </van-cell>
+              </van-cell-group>
+            </template>
           </template>
         </div>
       </template>
@@ -194,7 +204,7 @@ import {
   getListHistoryList,
   getCollectionShowHistory,
 } from '@/api/index';
-
+import { getDictOption } from '@/api/index';
 export default {
   components: { deleteUploadImg },
   data() {
@@ -218,6 +228,7 @@ export default {
       remarkShow: false,
       ListHistoryList: [],
       list: null,
+      AIResultOption: [],
     };
   },
   created() {
@@ -236,8 +247,16 @@ export default {
   // },
   activated() {
     this.getVisitsDetailFn();
+    // 获取店招异常原因字典
+    getDictOption({}, 'feedback_error_msg').then((res) => {
+      this.AIResultOption = res.data;
+    });
   },
   methods: {
+    resultCorrect(resultCorrect) {
+      let data = this.AIResultOption.find((item) => item.dictValue == resultCorrect);
+      return data ? data.dictLabel : '';
+    },
     filterTitle(item) {
       switch (item) {
         case 1: