Browse Source

图像识别

zhujindu 9 months ago
parent
commit
31e43e5b7d

+ 10 - 0
src/api/AIImage.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request';
+
+// 不想写
+export function getPhotoApproveList(query) {
+  return request({
+    url: 'mobile/visit/getPhotoApproveList',
+    method: 'get',
+    params: query,
+  });
+}

+ 51 - 220
src/views/AIImage/AIImageDetail.vue

@@ -10,264 +10,95 @@
       </div>
       <div class="item">
         <div class="label">门店类型:</div>
-        <div class="value">{{ data.storeType }}</div>
+        <div class="value">{{ data.storeCategoryName }}</div>
       </div>
       <div class="item">
         <div class="label">地址:</div>
-        <div class="value">{{ data.storeAddress }}</div>
+        <div class="value">{{ data.addressLine }}</div>
       </div>
       <div class="item">
         <div class="label">拜访人:</div>
-        <div class="value">{{ data.visitName }}</div>
+        <div class="value">{{ data.visitUserNickName }}</div>
       </div>
       <div class="item">
         <div class="label">拜访时间:</div>
-        <div class="value">{{ data.visitTime }}</div>
+        <div class="value">{{ data.approveTime }}</div>
       </div>
+      <div class="item">
+        <div class="label">拍摄类型:</div>
+        <div class="value">{{ data.identifyType }}</div>
+      </div>
+      <div class="item">
+        <div class="label">识别结果:</div>
+        <div class="value">{{ data.cheatType }}</div>
+      </div>
+      <p>业务员反馈AI识别不正确:</p>
       <div class="item">
         <van-image
           width="100%"
-          height="160"
+          height="360"
           :src="data.imageUrl"
           @click="previewImgs(data.imageUrl)" />
       </div>
-      <div class="item">
+      <!-- <div class="item">
         <div class="label">识别结果:</div>
         <div class="value">{{ data.result }}</div>
       </div>
       <div class="item">
         <div class="label">反馈不准确原因:</div>
         <div class="value">{{ data.feedback }}</div>
-      </div>
+      </div> -->
     </div>
-    <p class="titleText">反馈不一致原因</p>
+    <p class="titleText">请主管了解情况后回复原因及解决方案</p>
     <div class="feedbackReason">
-      <radioGroup :clueOptionList="customerClueItemList"></radioGroup>
+      <div class="result">
+        <div class="title"><span>*</span><span>AI识别是否正确</span></div>
+        <van-radio-group v-model="AIResult">
+          <van-radio name="1">正确</van-radio>
+          <van-radio name="2">不正确</van-radio>
+        </van-radio-group>
+      </div>
+      <div class="cause">
+        <div class="title">
+          <span>*</span>
+          <span>{{ causeTitle }}</span>
+        </div>
+        <van-field
+          v-model="causeMessage"
+          rows="1"
+          autosize
+          type="textarea"
+          :placeholder="'请输入' + causeTitle" />
+      </div>
     </div>
     <div class="confirmBtn"><van-button type="info">提交</van-button></div>
   </div>
 </template>
 <script>
 import { ImagePreview } from 'vant';
-import radioGroup from './radioGroup.vue';
 export default {
   name: 'AIImageDetail',
-  components: { radioGroup },
   data() {
     return {
       data: {},
       storeId: null,
-      customerClueItemList: [
-        {
-          searchValue: null,
-          createBy: 'admin',
-          createTime: '2024-12-18 13:55:04',
-          updateBy: '',
-          updateTime: null,
-          remark: '',
-          params: {},
-          pageSize: null,
-          pageNum: null,
-          customerClueItemId: 357,
-          customerClueId: 72,
-          customerClueInfoId: 263,
-          customerClueName: 'Ai识别是否正檐',
-          itemOptionParentId: null,
-          isMust: '0',
-          answerType: 'dx',
-          minTextLength: null,
-          answerValue: null,
-          sort: 1,
-          delFlag: null,
-          fileIdList: null,
-          customerClueOptionList: [
-            {
-              searchValue: null,
-              createBy: 'admin',
-              createTime: '2024-12-18 13:55:04',
-              updateBy: '',
-              updateTime: null,
-              remark: null,
-              params: {},
-              pageSize: null,
-              pageNum: null,
-              customerClueOptionId: 470,
-              customerClueItemId: 357,
-              customerClueOption: '是',
-              value: 'N',
-              checked: false,
-              customerClueItemList: [],
-            },
-            {
-              searchValue: null,
-              createBy: 'admin',
-              createTime: '2024-12-18 13:55:04',
-              updateBy: '',
-              updateTime: null,
-              remark: null,
-              params: {},
-              pageSize: null,
-              pageNum: null,
-              customerClueOptionId: 471,
-              customerClueItemId: 357,
-              customerClueOption: '否',
-              value: 'N',
-              checked: false,
-              customerClueItemList: [],
-            },
-          ],
-          fileInfoList: null,
-          max: false,
-          del: true,
-        },
-        {
-          searchValue: null,
-          createBy: 'admin',
-          createTime: '2024-12-18 13:55:04',
-          updateBy: '',
-          updateTime: null,
-          remark: '',
-          params: {},
-          pageSize: null,
-          pageNum: null,
-          customerClueItemId: 358,
-          customerClueId: 72,
-          customerClueInfoId: 263,
-          customerClueName: '处理情况',
-          itemOptionParentId: null,
-          isMust: '0',
-          answerType: 'dx',
-          minTextLength: null,
-          answerValue: null,
-          sort: 2,
-          delFlag: null,
-          fileIdList: null,
-          customerClueOptionList: [
-            {
-              searchValue: null,
-              createBy: 'admin',
-              createTime: '2024-12-18 13:55:04',
-              updateBy: '',
-              updateTime: null,
-              remark: null,
-              params: {},
-              pageSize: null,
-              pageNum: null,
-              customerClueOptionId: 472,
-              customerClueItemId: 358,
-              customerClueOption: '处理中',
-              value: 'N',
-              checked: false,
-              customerClueItemList: [
-                {
-                  searchValue: null,
-                  createBy: 'admin',
-                  createTime: '2024-12-18 13:55:04',
-                  updateBy: '',
-                  updateTime: null,
-                  remark: '请输入进度',
-                  params: {},
-                  pageSize: null,
-                  pageNum: null,
-                  customerClueItemId: 359,
-                  customerClueId: 72,
-                  customerClueInfoId: null,
-                  customerClueName: '处理进度',
-                  itemOptionParentId: 472,
-                  isMust: '0',
-                  answerType: 'wb',
-                  minTextLength: null,
-                  answerValue: null,
-                  sort: 3,
-                  delFlag: null,
-                  fileIdList: null,
-                  customerClueOptionList: [],
-                  fileInfoList: null,
-                  max: false,
-                  del: true,
-                },
-              ],
-            },
-            {
-              searchValue: null,
-              createBy: 'admin',
-              createTime: '2024-12-18 13:55:04',
-              updateBy: '',
-              updateTime: null,
-              remark: null,
-              params: {},
-              pageSize: null,
-              pageNum: null,
-              customerClueOptionId: 473,
-              customerClueItemId: 358,
-              customerClueOption: '已解决',
-              value: 'N',
-              checked: false,
-              customerClueItemList: [
-                {
-                  searchValue: null,
-                  createBy: 'admin',
-                  createTime: '2024-12-18 13:55:04',
-                  updateBy: '',
-                  updateTime: null,
-                  remark: '解决方案请输入10字以上',
-                  params: {},
-                  pageSize: null,
-                  pageNum: null,
-                  customerClueItemId: 360,
-                  customerClueId: 72,
-                  customerClueInfoId: null,
-                  customerClueName: '解决方案',
-                  itemOptionParentId: 473,
-                  isMust: '0',
-                  answerType: 'wb',
-                  minTextLength: 10,
-                  answerValue: null,
-                  sort: 3,
-                  delFlag: null,
-                  fileIdList: null,
-                  customerClueOptionList: [],
-                  fileInfoList: null,
-                  max: false,
-                  del: true,
-                },
-              ],
-            },
-          ],
-          fileInfoList: null,
-          max: false,
-          del: true,
-        },
-        {
-          searchValue: null,
-          createBy: 'admin',
-          createTime: '2024-12-18 13:54:13',
-          updateBy: 'admin',
-          updateTime: '2024-12-18 13:55:04',
-          remark: '',
-          params: {},
-          pageSize: null,
-          pageNum: null,
-          customerClueItemId: 361,
-          customerClueId: 72,
-          customerClueInfoId: 263,
-          customerClueName: '结果照片上传',
-          itemOptionParentId: null,
-          isMust: '1',
-          answerType: 'zp',
-          minTextLength: null,
-          answerValue: null,
-          sort: 4,
-          delFlag: null,
-          fileIdList: null,
-          customerClueOptionList: [],
-          fileInfoList: null,
-          max: false,
-          del: true,
-        },
-      ],
+      AIResult: 1,
+      causeTitle: '',
+      causeMessage: '',
     };
   },
+  watch: {
+    AIResult: {
+      handler(val) {
+        if (val == 1) {
+          this.causeTitle = '原因及解决方案';
+        } else {
+          this.causeTitle = '反馈不准确原因';
+        }
+      },
+      immediate: true,
+    },
+  },
   mounted() {
     this.storeId = this.$route.query.storeId;
     this.getDeytail();

+ 51 - 30
src/views/AIImage/list.vue

@@ -21,26 +21,36 @@
           </div>
           <div class="item">
             <div class="label">门店类型:</div>
-            <div class="value">{{ item.storeType }}</div>
+            <div class="value">{{ item.storeCategoryName }}</div>
           </div>
           <div class="item">
             <div class="label">地址:</div>
-            <div class="value">{{ item.storeAddress }}</div>
+            <div class="value">{{ item.addressLine }}</div>
           </div>
           <div class="item">
             <div class="label">拜访人:</div>
-            <div class="value">{{ item.visitName }}</div>
+            <div class="value">{{ item.visitUserNickName }}</div>
           </div>
           <div class="item">
             <div class="label">拜访时间:</div>
-            <div class="value">{{ item.visitTime }}</div>
+            <div class="value">{{ item.approveTime }}</div>
+          </div>
+          <div class="item">
+            <div class="label">拍摄类型:</div>
+            <div class="value">{{ item.identifyType }}</div>
+          </div>
+          <div class="item">
+            <div class="label">识别结果:</div>
+            <div class="value">{{ item.cheatType }}</div>
           </div>
         </div>
+        <van-empty description="暂无数据" v-if="listData.length == 0" />
       </van-pull-refresh>
     </div>
   </div>
 </template>
 <script>
+import { getPhotoApproveList } from '@/api/AIImage';
 export default {
   name: 'list',
   data() {
@@ -51,43 +61,47 @@ export default {
       isLoading: false,
     };
   },
-  activated() {},
-  created() {
+  activated() {
     this.getList();
   },
+  created() {},
   mounted() {},
   methods: {
     tabChange(tab) {
       this.getList();
     },
-    onRefresh() {},
+    onRefresh() {
+      this.getList();
+    },
     getList() {
-      this.tabVal;
       this.toastLoading(0, '加载中...', true);
-      setTimeout(() => {
+      getPhotoApproveList({ approveState: this.tabVal }).then((res) => {
         this.toastLoading().clear();
         this.isLoading = false;
-        this.listData = [
-          {
-            storeName: '和兴建材',
-            storeCode: '123456',
-            storeType: '铂金店',
-            storeAddress:
-              '河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东',
-            visitName: '都雷闪',
-            visitTime: '2025-02-0614:41:53',
-            storeId: 882005,
-          },
-          {
-            storeName: '和兴建材',
-            storeCode: '123456',
-            storeType: '铂金店',
-            storeAddress: '河南省新乡市长葛县中心小学东20米路东',
-            visitName: '都雷闪',
-            visitTime: '2025-02-0614:41:53',
-            storeId: 882005,
-          },
-        ];
+        if (res.code == 200) {
+          this.listData = res.rows;
+          this.listData = [
+            {
+              storeName: '和兴建材',
+              storeCode: '123456',
+              storeCategoryName: '铂金店',
+              addressLine:
+                '河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东河南省新乡市长葛县中心小学东20米路东',
+              visitUserNickName: '都雷闪',
+              approveTime: '2025-02-0614:41:53',
+              storeId: 882005,
+            },
+            {
+              storeName: '和兴建材',
+              storeCode: '123456',
+              storeCategoryName: '铂金店',
+              addressLine: '河南省新乡市长葛县中心小学东20米路东',
+              visitUserNickName: '都雷闪',
+              approveTime: '2025-02-0614:41:53',
+              storeId: 882005,
+            },
+          ];
+        }
       }, 1000);
     },
     // 详情
@@ -139,3 +153,10 @@ export default {
   }
 }
 </style>
+<style lang="scss">
+.AIImage {
+  .van-pull-refresh {
+    height: 100%;
+  }
+}
+</style>

+ 0 - 232
src/views/AIImage/radioGroup.vue

@@ -1,232 +0,0 @@
-<template>
-  <div class="radioGroup">
-    <template v-for="(val, ind) in clueOptionList">
-      <!-- <div class="title" v-if="val.customerClueName">
-          <span class="van-f-red" v-if="val.isMust == 0">*</span>
-          {{ val.customerClueName }}
-        </div> -->
-      <template v-if="val.answerType == 'dx'">
-        <div class="title" v-if="val.customerClueName">
-          <span class="van-f-red" v-if="val.isMust == 0">*</span>
-          {{ val.customerClueName }}
-        </div>
-        <van-radio-group v-model="val.searchValue" @change="radioGroupChange">
-          <template v-for="(item, index) in val.customerClueOptionList">
-            <van-radio :name="item.customerClueOptionId" @click="radioClick" :key="index">
-              {{ item.customerClueOption }}
-            </van-radio>
-            <radioGroup
-              :clueOptionList="item.customerClueItemList"
-              :parentOptionList="val"
-              :parentId="item.customerClueOptionId"
-              v-if="val.searchValue == item.customerClueOptionId"></radioGroup>
-          </template>
-        </van-radio-group>
-      </template>
-      <!-- 回答类型:wb-文本,sz-数字,rq-日期,zp-照片,dx-单选,bg-表格 -->
-      <template v-if="val.answerType == 'wb'">
-        <div class="title" v-if="val.customerClueName">
-          <span class="van-f-red" v-if="val.isMust == 0">*</span>
-          {{ val.customerClueName }}
-        </div>
-        <template v-if="parentOptionList.searchValue == val.itemOptionParentId">
-          <van-field
-            v-model="val.answerValue"
-            :placeholder="val.remark"
-            :minTextLength="val.minTextLength"
-            :error-message="val.remark"
-            :class="{
-              fieldInput: true,
-              rulesClass: val.answerValue != null && val.answerValue.length < val.minTextLength,
-            }" />
-          <span
-            class="rulesErrorMessage"
-            v-if="val.answerValue != null && val.answerValue.length < val.minTextLength">
-            {{ val.remark }}
-          </span>
-        </template>
-      </template>
-      <!-- 数字输入框 -->
-      <template v-if="val.answerType == 'sz'">
-        <div class="title" v-if="val.customerClueName">
-          <span class="van-f-red" v-if="val.isMust == 0">*</span>
-          {{ val.customerClueName }}
-        </div>
-        <van-field
-          class="fieldInput"
-          v-model="val.answerValue"
-          :placeholder="val.remark"
-          :minTextLength="val.minTextLength"
-          :error-message="val.remark"
-          type="number"></van-field>
-      </template>
-      <!-- 表格 -->
-      <template v-if="val.answerType == 'bg'">
-        <div class="title" v-if="val.customerClueName">
-          <span class="van-f-red" v-if="val.isMust == 0">*</span>
-          {{ val.customerClueName }}
-        </div>
-        <el-table :data="val.tableData.data" style="width: 100%; position: relative; left: -10px">
-          <el-table-column
-            v-for="(item, index) in val.tableData.title"
-            :prop="item.prop"
-            :label="item.label"
-            align="center">
-            <template slot-scope="scope">
-              <template v-if="item.answerType == 'text'">
-                {{ scope.row[item.prop] }}
-              </template>
-              <template v-if="item.answerType == 'wb'">
-                <van-field v-model="scope.row[item.prop]" />
-              </template>
-              <!-- 正整数 digit -->
-              <template v-if="item.answerType == 'sz'">
-                <van-field v-model="scope.row[item.prop]" type="digit" />
-              </template>
-            </template>
-          </el-table-column>
-        </el-table>
-      </template>
-    </template>
-  </div>
-</template>
-<script>
-export default {
-  name: 'radioGroup',
-  props: {
-    clueOptionList: {
-      type: Array,
-      default: () => [],
-    },
-    parentOptionList: {
-      type: Object,
-      default: () => {},
-    },
-    parentId: {
-      type: [Number, null],
-      default: null,
-    },
-  },
-  data() {
-    return {};
-  },
-  watch: {
-    clueOptionList: {
-      handler(val) {
-        val.forEach((item) => {
-          // bg表格数据存在remark
-          if (item.answerType == 'bg') {
-            this.$set(item, 'tableData', JSON.parse(item.remark));
-          }
-        });
-      },
-      immediate: true,
-    },
-  },
-  created() {
-    // console.log(this.clueOptionList);
-  },
-  methods: {
-    radioGroupChange(name) {
-      if (!name) return;
-      // console.log(name);
-      // console.log(this.clueOptionList);
-      // 如果选中的数据有父级,将父级数据修改为选中状态
-      if (this.parentOptionList && this.parentId) {
-        this.$set(this.parentOptionList, 'searchValue', this.parentId);
-      }
-      // 获取选中数据
-      let clueOptionList = this.clueOptionList.find((val) => val.searchValue == name);
-      let activaRadio = clueOptionList.customerClueOptionList.find(
-        (val) => val.customerClueOptionId == name
-      );
-      // 修改选中状态
-      this.$set(activaRadio, 'value', 'Y');
-
-      // 过滤未选中的数据
-      let exceptItself = clueOptionList.customerClueOptionList.filter(
-        (val) => val.customerClueOptionId !== name
-      );
-      // 删除未选中数据状态兄弟级和子级
-      // console.log(exceptItself);
-      this.toggleOtheChildren(exceptItself);
-    },
-    toggleOtheChildren(exceptItself) {
-      if (!exceptItself) return;
-      exceptItself.forEach((val) => {
-        this.$set(val, 'value', 'N');
-        if (val.customerClueItemList && val.customerClueItemList[0]) {
-          this.$set(val.customerClueItemList[0], 'searchValue', null);
-          if (
-            val.customerClueItemList[0] &&
-            val.customerClueItemList[0].customerClueOptionList.length
-          ) {
-            this.toggleOtheChildren(val.customerClueItemList[0].customerClueOptionList);
-          }
-        }
-      });
-    },
-    radioClick(event) {
-      // console.log(event);
-    },
-  },
-};
-</script>
-<style lang="scss">
-.radioGroup {
-  font-size: 15px;
-  .van-radio {
-    padding: 5px 0;
-  }
-  .van-radio-group {
-    padding-left: 20px;
-  }
-  .van-cell {
-    padding: 10px 0;
-    /* font-size: 14px; */
-  }
-  .van-cell::after {
-    border: 0;
-  }
-  .van-field {
-    padding: 0;
-    width: 100%;
-    border-radius: 4px;
-    overflow: hidden;
-    background-color: unset;
-    height: 30px;
-    line-height: 30px;
-    border: 1px solid #cdc8c8;
-  }
-  .van-field__control {
-    /* padding: 0 10px; */
-    /* margin: 5px 0; */
-    padding-left: 10px;
-  }
-  .van-radio__label {
-    /* font-size: 14px; */
-  }
-  .van-f-red {
-    font-size: 14px;
-  }
-  .rulesClass {
-    border: 1px solid #ff0505;
-  }
-  .fieldInput {
-    /* height: 38px; */
-  }
-  .rulesErrorMessage {
-    color: red;
-    font-size: 12px;
-    padding: 3px 0;
-  }
-  .uploadImg {
-    width: 50px;
-  }
-  .el-table {
-    .el-table__cell {
-      padding: 3px 0;
-    }
-  }
-}
-</style>

+ 1 - 1
src/views/week/index.vue

@@ -64,7 +64,7 @@
         </van-cell>
       </van-cell-group>
       <!--拜访照片识别异常反馈-->
-      <van-cell-group inset class="mtb10" v-if="photoApprovalNum">
+      <van-cell-group inset class="mtb10">
         <van-cell title="拜访照片识别异常反馈" to="/AIImage">
           <template #icon>
             <van-icon :name="history" class="zicon" />