浏览代码

Merge branch 'feature_20260203_完美门店' into uat(dev)

zhujindu 3 天之前
父节点
当前提交
c7199bd8bd

二进制
src/assets/shouzhi.png


+ 10 - 0
src/router/index.js

@@ -304,6 +304,16 @@ const router = new VueRouter({
           name: 'skuRecognize',
           component: () => import('@/views/historicalVisit/skuRecognize.vue'),
         },
+        {
+          path: '/perfectStoreSign',
+          name: 'perfectStoreSign',
+          component: () => import('@/views/historicalVisit/perfectStoreSign.vue'),
+        },
+        {
+          path: '/perfectStoreTSJ',
+          name: 'perfectStoreTSJ',
+          component: () => import('@/views/historicalVisit/perfectStoreTSJ.vue'),
+        },
       ],
     },
     {

+ 10 - 11
src/views/deviceOutside/index.vue

@@ -435,20 +435,17 @@
               <van-icon :name="times" color="#ee0a24" size="32" />
             </div>
             <template v-if="item.stateString == '已拜访'">
-              <div class="statstext">
-                已拜访
+              <div class="statstext" style="background-color: #e3f0fe">
+                <span style="color: #387bca">已拜访</span>
                 <div
                   class="statstextIcon"
-                  style="border-radius: 6px; background-color: #e3f0fe; color: #387bca"
+                  style="background-color: #0057ba"
                   v-if="item.jinpaiStore"
                   @click="openPerfectStore(item)">
-                  <div style="margin: 3px 7px; font-size: 14px; font-weight: 600">
-                    <p style="line-height: 20px; margin: 0">
-                      查看<img
-                        style="width: 18px; height: 20px; margin-left: 5px; vertical-align: -5px"
-                        :src="require('@/assets/shouzhi.png')" />
-                    </p>
-                    <p style="line-height: 20px; margin: 0">完美门店</p>
+                  <div style="margin: 4px; font-size: 14px; font-weight: 600">
+                    <img
+                      style="width: 18px; height: 20px; margin: 0 5px; vertical-align: -5px"
+                      :src="require('@/assets/shouzhi.png')" />完美门店报告
                   </div>
                 </div>
               </div>
@@ -2592,9 +2589,11 @@ export default {
   height: 0.7em;
 }
 .statstextIcon {
+  width: 121px;
   position: absolute;
-  left: -11px;
+  left: -62px;
   top: 31px;
+  border-radius: 15px 0 0 15px;
 }
 .tipsTitle {
   padding: 5px 0;

+ 10 - 11
src/views/deviceWithin/index.vue

@@ -437,20 +437,17 @@
             <van-icon :name="times" color="#ee0a24" size="32" />
           </div>
           <template v-if="item.stateString == '已拜访'">
-            <div class="statstext">
-              已拜访
+            <div class="statstext" style="background-color: #e3f0fe">
+              <span style="color: #387bca">已拜访</span>
               <div
                 class="statstextIcon"
-                style="border-radius: 6px; background-color: #e3f0fe; color: #387bca"
+                style="background-color: #0057ba"
                 v-if="item.jinpaiStore"
                 @click="openPerfectStore(item)">
-                <div style="margin: 3px 7px; font-size: 14px; font-weight: 600">
-                  <p style="line-height: 20px; margin: 0">
-                    查看<img
-                      style="width: 18px; height: 20px; margin-left: 5px; vertical-align: -5px"
-                      :src="require('@/assets/shouzhi.png')" />
-                  </p>
-                  <p style="line-height: 20px; margin: 0">完美门店</p>
+                <div style="margin: 4px; font-size: 14px; font-weight: 600">
+                  <img
+                    style="width: 18px; height: 20px; margin: 0 5px; vertical-align: -5px"
+                    :src="require('@/assets/shouzhi.png')" />完美门店报告
                 </div>
               </div>
             </div>
@@ -1850,9 +1847,11 @@ export default {
   height: 0.7em;
 }
 .statstextIcon {
+  width: 121px;
   position: absolute;
-  left: -11px;
+  left: -62px;
   top: 31px;
+  border-radius: 15px 0 0 15px;
 }
 .visitStoreIco {
   float: left;

+ 95 - 119
src/views/historicalVisit/perfectStore.vue

@@ -3,7 +3,7 @@
     <!--        顶部条-->
     <van-nav-bar class="navBar" title="完美门店报告" left-arrow @click-left="onClickLeft">
       <template #right>
-        <!-- <span
+        <span
           style="
             color: white;
             background: #74a4d9;
@@ -13,7 +13,8 @@
           "
           @click="editorFn"
           v-if="!remarkShow && sameDay"
-          >编辑</span> -->
+          >编辑</span
+        >
       </template>
     </van-nav-bar>
     <!--        主体内容-->
@@ -92,100 +93,67 @@
           <p style="text-align: right">点评时间:{{ managerRemarkContents[0].createTime }}</p>
         </van-collapse-item>
       </van-collapse> -->
-      <!-- <template v-if="list.isSku == '是'">
-        <div style="padding: 10px 16px; font-size: 16px; font-weight: bold">SKU图像识别结果</div>
-        <div class="card">
-          <div
-            class="info"
-            @click="toSkuRecognize"
-            style="
-              display: flex;
-              align-items: center;
-              justify-content: space-between;
-              padding: 3px;
-            ">
-            <p
-              style="flex: 1; margin: 0; line-height: 24px; padding: 10px 0; display: inline-block">
-              拍摄的所有产品陈列照识别结果:<span v-if="list.skuTotal" style="color: red"
-                >{{ list.skuTotal }}个</span
-              >
-            </p>
-            <p class="arrowdetils1">
-              <van-icon name="arrow" />
-            </p>
-          </div>
-        </div>
-      </template> -->
       <!-- 特殊任务展示 -->
       <!-- 店招 -->
       <div class="shopSign specialTask" v-if="shopSignDetail && shopSignDetail.qualifiedState">
-        <div class="specialTaskLeft">
-          <div class="SignText" style="width: 40px">店招:</div>
+        <div class="specialTaskLeft" @click="openPerfectStoreSign">
+          <div class="SignText">AI 店招识别</div>
           <div class="signContent">
-            <div class="icon">
-              <van-icon
-                name="checked"
-                color="#07c160"
-                v-if="shopSignDetail.qualifiedState == '1'" />
-              <van-icon name="warning" color="#ee0a24" v-else />
-            </div>
-            <div
-              class="content"
-              :style="{ color: shopSignDetail.qualifiedState == '1' ? '#07c160' : '#ee0a24' }">
-              {{
-                shopSignDetail.qualifiedState == '1' ? '已通过' : shopSignDetail.unqualifiedReason
-              }}
+            <div class="" style="display: flex">
+              <van-button round type="primary" v-if="shopSignDetail.qualifiedState == '1'"
+                >通过</van-button
+              >
+              <van-button round type="danger" v-else>不通过</van-button>
+              <div class="jiantou">
+                <van-icon name="arrow" />
+              </div>
             </div>
           </div>
         </div>
-        <div class="shopSignImg">
-          <img :src="shopSignDetail.fileUrl" @click="previewsImg(shopSignDetail.fileUrl)" />
-        </div>
       </div>
       <!-- 调色机 -->
       <div class="TSJBox specialTask" v-if="tiaoSJDetail && tiaoSJDetail.qualifiedState">
-        <div class="specialTaskLeft">
-          <div class="SignText">调色机:</div>
+        <div class="specialTaskLeft" @click="openPerfectStoreTSJ">
+          <div class="SignText">AI 调色机识别</div>
           <div class="signContent">
-            <div class="icon">
-              <van-icon name="checked" color="#07c160" v-if="tiaoSJDetail.qualifiedState == '1'" />
-              <van-icon name="warning" color="#ee0a24" v-else />
-            </div>
-            <div
-              class="content"
-              :style="{ color: tiaoSJDetail.qualifiedState == '1' ? '#07c160' : '#ee0a24' }">
-              {{ tiaoSJDetail.qualifiedState == '1' ? '已通过' : tiaoSJDetail.unqualifiedReason }}
+            <div class="" style="display: flex">
+              <van-button round type="primary" v-if="tiaoSJDetail.qualifiedState == '1'"
+                >通过</van-button
+              >
+              <van-button round type="danger" v-else>不通过</van-button>
+              <div class="jiantou">
+                <van-icon name="arrow" />
+              </div>
             </div>
           </div>
         </div>
-        <div class="shopSignImg" v-if="tiaoSJDetail.qualifiedState">
-          <img :src="tiaoSJDetail.fileUrl" @click="previewsImg(tiaoSJDetail.fileUrl)" />
+      </div>
+      <!-- 陈列SKU个数: -->
+      <div class="TSJBox specialTask" v-if="list.isSku == '是'">
+        <div class="specialTaskLeft">
+          <div class="SignText">
+            AI SKU个数识别: <span v-if="list.skuNum">{{ list.skuNum }}个</span>
+          </div>
+          <div class="signContent" @click="toSkuRecognize">
+            <div class="" style="display: flex">
+              <span style="color: rgb(25, 137, 250)">查看详情</span>
+              <div class="jiantou">
+                <van-icon name="arrow" />
+              </div>
+            </div>
+          </div>
         </div>
       </div>
-      <div class="SKUBox">
-        <div
-          class="SKUTotal"
-          style="padding: 5px 0 15px 0"
-          @click="toSkuRecognize"
-          v-if="list.isSku == '是'">
-          <p
-            style="
-              flex: 1;
-              margin: 0;
-              line-height: 24px;
-              /* padding: 10px 0; */
-              display: inline-block;
-              font-weight: 600;
-            ">
-            陈列SKU个数:<span v-if="list.skuTotal">{{ list.skuTotal }}个</span>
-          </p>
-          <p class="arrowdetils1" style="margin: 0">
-            查看详情
-            <van-icon name="arrow" />
-          </p>
+      <!-- 目前陈列任务 -->
+      <div
+        class="TSJBox specialTask"
+        v-if="list.isSku == '是' && taskTypeArr && taskTypeArr.length">
+        <div class="specialTaskLeft">
+          <div class="SignText">AI 陈列任务识别</div>
         </div>
+      </div>
+      <div class="SKUBox" v-if="taskTypeArr && taskTypeArr.length">
         <div class="SKUList">
-          <div class="SKUListTitle">目前陈列任务:</div>
           <div
             class="itemList"
             v-for="(value, index) in taskTypeArr"
@@ -207,7 +175,7 @@
       </div>
 
       <div style="padding: 15px 16px; font-size: 16px; font-weight: bold; background: #f5f5f5">
-        任务
+        其他拜访任务
       </div>
       <div class="card" v-if="list.visitSource != 2">
         <div
@@ -579,6 +547,18 @@ export default {
     previewsImg(url) {
       ImagePreview([url]);
     },
+    openPerfectStoreSign() {
+      this.$router.push({
+        path: '/perfectStoreSign',
+        query: { visitId: this.visitsId },
+      });
+    },
+    openPerfectStoreTSJ() {
+      this.$router.push({
+        path: '/perfectStoreTSJ',
+        query: { visitId: this.visitsId },
+      });
+    },
   },
 };
 </script>
@@ -588,53 +568,46 @@ export default {
   .specialTask {
     display: flex;
     flex-direction: row;
-    margin: 0px 10px;
+    margin: 5px 10px;
     border-radius: 10px;
-    min-height: 90px;
-    padding: 10px 10px;
+    // min-height: 90px;
+    padding: 10px 0px 10px 10px;
     font-size: 16px;
     justify-content: space-between;
+    background: #e5faff;
     .specialTaskLeft {
       display: flex;
       flex-direction: row;
+      justify-content: space-between;
+      width: 100%;
     }
     .SignText {
-      color: rgb(25, 137, 250);
-      width: 55px;
       font-weight: 600;
     }
     .signContent {
       display: flex;
       flex-direction: row;
       margin: 0 8px;
-      flex: 1;
       .icon {
         padding-top: 2px;
         margin-right: 5px;
       }
     }
-    .shopSignImg {
-      img {
-        height: 80px;
-        width: 80px;
-        border-radius: 8px;
-      }
-    }
-  }
-  .shopSign {
-    background: #e5faff;
-  }
-  .TSJBox {
-    background: #fff4e4;
-    margin-top: 20px;
   }
+  // .shopSign {
+  //   background: #e5faff;
+  // }
+  // .TSJBox {
+  //   background: #fff4e4;
+  //   margin-top: 20px;
+  // }
   .SKUBox {
-    margin: 10px 10px 10px 10px;
+    margin: 0px 10px 10px 10px;
     border-radius: 10px;
-    min-height: 90px;
+    // min-height: 90px;
     padding: 5px 10px;
     font-size: 16px;
-    background: #ffecf4;
+    // background: #ffecf4;
     .SKUTotal {
       display: flex;
       justify-content: space-between;
@@ -648,26 +621,29 @@ export default {
         justify-content: space-between;
         align-items: center;
         padding: 3px 0;
-        .itemTitle {
-          flex: 1;
-          // text-decoration: underline;
-          // color: rgb(25, 137, 250);
-        }
-        .jiantou {
-          margin-left: 5px;
-          color: rgb(25, 137, 250);
-          display: flex;
-          align-items: center;
-        }
-        button {
-          width: 55px;
-          height: 28px;
-          padding: 0;
-          font-size: 12px;
-        }
       }
     }
   }
+  .itemList,
+  .signContent {
+    .itemTitle {
+      flex: 1;
+      // text-decoration: underline;
+      // color: rgb(25, 137, 250);
+    }
+    .jiantou {
+      margin-left: 5px;
+      color: rgb(25, 137, 250);
+      display: flex;
+      align-items: center;
+    }
+    button {
+      width: 55px;
+      height: 28px;
+      padding: 0;
+      font-size: 12px;
+    }
+  }
 }
 .container {
   padding-bottom: 50px;

+ 174 - 0
src/views/historicalVisit/perfectStoreSign.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="perfectStoreSign">
+    <van-nav-bar class="navBar" title="AI 店招识别" left-arrow @click-left="onClickLeft" />
+    <div class="content">
+      <div class="contentBox">
+        <div class="shopSign specialTask" v-if="shopSignDetail && shopSignDetail.qualifiedState">
+          <div class="specialTaskLeft">
+            <div class="SignText">识别结果:</div>
+            <div class="signContent">
+              <div class="icon">
+                <van-icon
+                  name="checked"
+                  color="#07c160"
+                  v-if="shopSignDetail.qualifiedState == '1'" />
+                <van-icon name="warning" color="#ee0a24" v-else />
+              </div>
+              <div :style="{ color: shopSignDetail.qualifiedState == '1' ? '#07c160' : '#ee0a24' }">
+                {{
+                  shopSignDetail.qualifiedState == '1' ? '已通过' : shopSignDetail.unqualifiedReason
+                }}
+              </div>
+            </div>
+            <div class="shopSignButton">
+              <div class="" style="display: flex">
+                <van-button round type="primary" v-if="shopSignDetail.qualifiedState == '1'"
+                  >通过</van-button
+                >
+                <van-button round type="danger" v-else>不通过</van-button>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="shopSignImg">
+          <div class="text">店招照片</div>
+          <div class="imgBox">
+            <img
+              v-if="shopSignDetail && shopSignDetail.qualifiedState"
+              :src="shopSignDetail.fileUrl"
+              @click="previewsImg(shopSignDetail.fileUrl)" />
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import deleteUploadImg from '@/components/deleteUploadImg';
+import { getVisitsDetailPerfectStore } from '@/api/index';
+import { ImagePreview } from 'vant';
+export default {
+  name: 'perfectStoreSign',
+  components: { deleteUploadImg },
+  data() {
+    return {
+      visitsId: '',
+      detail: null,
+      shopSignDetail: null,
+    };
+  },
+  activated() {
+    this.visitsId = this.$route.query.visitId || '';
+    this.detail = null;
+    this.getVisitsDetailFn();
+  },
+  methods: {
+    getVisitsDetailFn() {
+      this.shopSignDetail = null;
+      getVisitsDetailPerfectStore({ visitsId: this.visitsId })
+        .then((res) => {
+          this.toastLoading().clear();
+          if (res.code == 200) {
+            this.detail = res.data;
+            let shopSignArr = this.detail.sfaTaskList.filter((val) => val.photoIdentifyType == '1');
+            if (shopSignArr.length) this.shopSignDetail = shopSignArr[0];
+          } else {
+            this.$dialog.alert({
+              message: res.msg,
+            });
+          }
+        })
+        .catch((err) => {
+          this.$dialog.alert({
+            message: err.msg,
+          });
+        });
+    },
+    previewsImg(url) {
+      ImagePreview([url]);
+    },
+    onClickLeft() {
+      this.$router.go(-1);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.perfectStoreSign {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  .content {
+    flex: 1;
+    overflow-y: auto;
+    padding: 10px 15px;
+    .contentBox {
+      width: 100%;
+      height: 100%;
+      background: #fff;
+      padding-top: 15px;
+    }
+    .specialTask {
+      display: flex;
+      flex-direction: row;
+      padding: 10px;
+      font-size: 16px;
+      justify-content: space-between;
+      background: #e5faff;
+      .specialTaskLeft {
+        display: flex;
+        flex-direction: row;
+        width: 100%;
+      }
+      .SignText {
+        width: 80px;
+        font-weight: 600;
+      }
+      .signContent {
+        flex: 1;
+        display: flex;
+        flex-direction: row;
+        margin: 0 8px;
+        .icon {
+          padding-top: 2px;
+          margin-right: 5px;
+        }
+      }
+    }
+    .shopSignButton {
+      width: 56px;
+      button {
+        width: 55px;
+        height: 28px;
+        padding: 0;
+        font-size: 12px;
+      }
+    }
+    .shopSignImg {
+      .text {
+        font-size: 16px;
+        font-weight: 600;
+        padding: 15px 10px;
+      }
+      .imgBox {
+        width: 100%;
+        text-align: center;
+        img {
+          width: 60%;
+        }
+      }
+    }
+  }
+}
+</style>
+<style lang="scss">
+.perfectStoreSign {
+  .van-button--danger {
+    background-color: #ee0a24 !important;
+    border: 1px solid #ee0a24 !important;
+  }
+}
+</style>

+ 44 - 78
src/views/historicalVisit/perfectStoreSku.vue

@@ -1,15 +1,7 @@
 <template>
   <div class="perfectStoreSku">
     <van-nav-bar class="navBar" title="拜访任务详情" left-arrow @click-left="onClickLeft">
-      <template #right>
-        <!-- <van-button
-          style="height: 30px; padding: 5px; border-radius: 5px"
-          type="info"
-          v-if="detail && detail.skuPhotoIdentifyId"
-          @click="clickFeedbackShow"
-          >识别异常反馈</van-button
-        > -->
-      </template>
+      <template #right> </template>
     </van-nav-bar>
     <div class="content" v-if="detail">
       <div class="container">
@@ -17,9 +9,6 @@
           <span class="headlineIcon"></span>
           <span class="headlineTitle">生动化陈列</span>
         </div>
-        <!-- <div class="tipsTitle" style="padding: 10px">
-          目前识别桶装和战略产品合计106个,后续会增加识别产品数
-        </div> -->
         <div style="padding: 10px">
           <van-row gutter="10">
             <van-col span="6" v-for="(urls, index) in detail.fileUrlList" :key="index">
@@ -30,14 +19,13 @@
           </van-row>
         </div>
       </div>
-      <div class="skuDeatil" v-if="detail.skuList">
+      <div class="skuDeatil" v-if="skuList">
         <div class="headline" style="margin-top: 10px">
           <span class="headlineIcon"></span>
-          <span class="headlineTitle">SKU图像识别结果:{{ detail.skuTotal }}个</span>
+          <span class="headlineTitle">SKU图像识别结果:{{ detail.skuNum }}个</span>
         </div>
-        <!-- <div class="tableTitle">SKU图像识别结果:{{ detail.skuTotal }}个</div> -->
         <el-table
-          :data="detail.skuList"
+          :data="skuList"
           style="width: 100%; border-radius: 10px"
           border
           class="table-headermd1">
@@ -55,44 +43,31 @@
           <el-table-column label="排面数" prop="count" align="center" width="50"></el-table-column>
         </el-table>
       </div>
-      <!-- 返回历史 -->
-      <!-- <div class="feedbackHistorical" v-if="detail.feedbackList.length">
-        <div class="tableTitle">识别异常反馈</div>
-        <div class="historicalContent">
-          <div class="rejectMsgItem" v-for="(item, index) in detail.feedbackList" :key="index">
-            <div class="item approver">
-              <span class="label">反馈人:</span>
-              <span class="value">{{ item.nickName }}</span>
-            </div>
-            <div class="item approvalTime">
-              <span class="label">反馈时间:</span>
-              <span class="value">{{ item.createTime }}</span>
-            </div>
-            <div class="item rejectCause">
-              <span class="label">反馈内容:</span>
-              <span class="value">{{ item.feedbackContent }}</span>
-            </div>
-          </div>
+      <div class="skuDeatil" v-if="daojuList">
+        <div class="headline" style="margin-top: 10px">
+          <span class="headlineIcon"></span>
+          <span class="headlineTitle">道具识别结果:{{ daojuNum }}个</span>
         </div>
-      </div> -->
-    </div>
-    <!-- 识别异常反馈 -->
-    <van-popup v-model="feedbackShow" round class="feedbackMsgBox" :close-on-click-overlay="false">
-      <div class="feedbackTitle">SKU图像识别结果异常反馈</div>
-      <div class="feedbackContent">
-        <van-field
-          v-model="feedbackMessage"
-          rows="2"
-          autosize
-          type="textarea"
-          :formatter="formatter"
-          placeholder="若识别SKU有遗漏、缺失,请在此反馈,本部会根据实际情况优化模型,谢谢!" />
-      </div>
-      <div class="btnBox">
-        <van-button type="info" plain @click="feedbackShow = false">取消</van-button>
-        <van-button type="info" @click="feedbackSubmit">提交</van-button>
+        <el-table
+          :data="daojuList"
+          style="width: 100%; border-radius: 10px"
+          border
+          class="table-headermd1">
+          <el-table-column label="序号" type="index" align="center" width="40"> </el-table-column>
+          <el-table-column
+            label="品类"
+            prop="skuProductType"
+            align="center"
+            width="60"></el-table-column>
+          <el-table-column label="道具名称" prop="name" align="center">
+            <template slot-scope="scope">
+              <span class="tipTitle">{{ scope.row.name }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="排面数" prop="count" align="center" width="50"></el-table-column>
+        </el-table>
       </div>
-    </van-popup>
+    </div>
   </div>
 </template>
 
@@ -107,8 +82,9 @@ export default {
     return {
       visitsId: '',
       detail: null,
-      feedbackShow: false,
-      feedbackMessage: '', //反馈内容
+      daojuNum: 0,
+      skuList: [],
+      daojuList: [],
     };
   },
   activated() {
@@ -124,6 +100,20 @@ export default {
           this.toastLoading().clear();
           if (res.code == 200) {
             this.detail = res.data;
+            this.skuList = [];
+            this.daojuList = [];
+            this.detail.skuList.forEach((val) => {
+              if (val.skuProductType == '道具') {
+                this.daojuList.push(val);
+              } else {
+                this.skuList.push(val);
+              }
+            });
+            if (this.detail.skuTotal != null && this.detail.skuNum != null) {
+              this.daojuNum = this.detail.skuTotal - this.detail.skuNum;
+            } else {
+              this.daojuNum = 0;
+            }
           } else {
             this.$dialog.alert({
               message: res.msg,
@@ -136,36 +126,12 @@ export default {
           });
         });
     },
-    // 提交反馈
-    feedbackSubmit() {
-      if (this.feedbackMessage == '') {
-        this.$toast('请输入反馈意见!');
-        return;
-      }
-      photoSkuFeedback({
-        photoIdentifyId: this.detail.skuPhotoIdentifyId, //long	sku识别信息id
-        feedbackContent: this.feedbackMessage, //string	内容
-      }).then((res) => {
-        this.feedbackShow = false;
-        this.getDetail();
-      });
-    },
     previewsImg(index) {
       ImagePreview({
         images: this.detail.fileUrlList,
         startPosition: index,
       });
     },
-    formatter(value) {
-      return value.replace(
-        /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/gi,
-        '',
-      );
-    },
-    clickFeedbackShow() {
-      this.feedbackMessage = '';
-      this.feedbackShow = true;
-    },
     onClickLeft() {
       this.$router.go(-1);
     },

+ 495 - 0
src/views/historicalVisit/perfectStoreTSJ.vue

@@ -0,0 +1,495 @@
+<template>
+  <div class="perfectStoreSign">
+    <van-nav-bar class="navBar" title="AI 调色机识别" left-arrow @click-left="onClickLeft" />
+    <div class="content">
+      <div class="contentBox" v-for="val in tiaoSJArr">
+        <div class="deviceCode">
+          <div class="vertical"></div>
+          <div class="codeData">
+            <p>设备编号:{{ val.deviceCode || '' }}</p>
+            <p>投放编号:{{ val.putInCode || '' }}</p>
+          </div>
+        </div>
+        <div class="shopSign specialTask" v-if="val && val.qualifiedState">
+          <div class="specialTaskLeft">
+            <div class="SignText">识别结果:</div>
+            <div class="signContent">
+              <!-- <div class="icon">
+                <van-icon name="checked" color="#07c160" v-if="val.qualifiedState == '1'" />
+                <van-icon name="warning" color="#ee0a24" v-else />
+              </div> -->
+              <!-- <div :style="{ color: val.qualifiedState == '1' ? '#07c160' : '#ee0a24' }">
+                {{ val.qualifiedState == '1' ? '已通过' : val.unqualifiedReason }}
+              </div> -->
+            </div>
+            <div class="shopSignButton">
+              <div class="" style="display: flex">
+                <van-button round type="primary" v-if="val.qualifiedState == '1'">通过</van-button>
+                <van-button round type="danger" v-else>不通过</van-button>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div
+          class="container containert"
+          style="width: 100%; margin: 0 auto; border-radius: 6px"
+          v-if="val.collectionItemList.length">
+          <van-form ref="tabstoreVal">
+            <div v-for="(item, index) in val.collectionItemList" :key="index">
+              <div v-if="item.answerType == 'tel_send_code'" class="formLabel z-cell z-cells">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0">{{ item.answerValue }}</p>
+                </div>
+              </div>
+              <div v-if="item.answerType == 'nyr'" class="formLabel z-cell z-cells">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0">{{ item.answerValue }}</p>
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'sz'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <p class="mg0">{{ item.answerValue }}</p>
+                <p
+                  style="
+                    color: #444;
+                    font-size: 12px;
+                    margin: 0;
+                    padding: 10px 0;
+                    text-align: right;
+                  ">
+                  <van-field
+                    class="mobile-input"
+                    v-model="item.collectionOptionList[0].collectionOption"
+                    autosize
+                    readonly
+                    type="textarea" />
+                </p>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'zp'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div
+                class="formLabel z-cell z-cells"
+                v-if="item.answerType == 'wb' || item.answerType == 'dhwb'">
+                <van-cell>
+                  <template #title>
+                    {{ index + 1 }}.{{ item.collectionName }}
+                    <span
+                      style="color: #00afff; position: absolute; top: 8px; right: 0px"
+                      v-if="item.showHistory == 1"
+                      @click="getCollectionShowHistory(item)"
+                      >回显历史</span
+                    >
+                  </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0">{{ item.answerValue }}</p>
+                </div>
+                <p style="color: #444; font-size: 12px; margin: 0; text-align: right">
+                  <van-field
+                    class="mobile-input"
+                    v-model="item.collectionOptionList[0].collectionOption"
+                    autosize
+                    readonly
+                    type="textarea" />
+                </p>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'tel'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0">{{ item.answerValue }}</p>
+                </div>
+                <p style="color: #444; font-size: 12px; margin: 0; text-align: right">
+                  <van-field
+                    class="mobile-input"
+                    v-model="item.collectionOptionList[0].collectionOption"
+                    autosize
+                    readonly
+                    type="textarea" />
+                </p>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'date'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0">{{ item.answerValue }}</p>
+                </div>
+                <p style="color: #444; font-size: 12px; margin: 0; text-align: right">
+                  <van-field
+                    class="mobile-input"
+                    v-model="item.collectionOptionList[0].collectionOption"
+                    autosize
+                    readonly
+                    type="textarea" />
+                </p>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'sm'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <div style="font-size: 14px" v-if="item.collectionOptionList[0].answerValue">
+                    <div v-if="item.success" style="color: green">
+                      <p>系统资产编码:{{ item.equipmentCode1 }}</p>
+                      <p>&nbsp;&nbsp;&nbsp;&nbsp;条形码编码:{{ item.equipmentCode2 }}</p>
+                      <span style="float: right; margin-top: -48px"
+                        ><van-icon name="passed" size="16" />&nbsp;一致</span
+                      >
+                    </div>
+                    <div v-if="!item.success" style="color: red">
+                      <p>系统资产编码:{{ item.equipmentCode1 }}</p>
+                      <p>&nbsp;&nbsp;&nbsp;&nbsp;条形码编码:{{ item.equipmentCode2 }}</p>
+                      <span style="float: right; margin-top: -48px"
+                        ><van-icon name="close" size="16" />&nbsp;不一致</span
+                      >
+                    </div>
+                  </div>
+                </div>
+                <p
+                  style="color: #444; font-size: 12px; margin: 0; text-align: right"
+                  v-if="item.collectionOptionList[0].collectionOption">
+                  <van-field
+                    class="mobile-input"
+                    v-model="item.collectionOptionList[0].collectionOption"
+                    autosize
+                    readonly
+                    type="textarea" />
+                </p>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'duox'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0" v-for="(item1, index1) in item.collectionOptionList" :key="index1">
+                    <span v-if="item1.isCheck == 1">{{ item1.collectionOption }}</span>
+                  </p>
+                </div>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+              <div class="formLabel z-cell z-cells" v-if="item.answerType == 'dx'">
+                <van-cell>
+                  <template #title> {{ index + 1 }}.{{ item.collectionName }} </template>
+                </van-cell>
+                <div class="selesetText">
+                  <p class="mg0" v-for="(item2, index2) in item.collectionOptionList" :key="index2">
+                    <span v-if="item2.isCheck == 1">{{ item2.collectionOption }}</span>
+                  </p>
+                </div>
+                <div v-if="item.fileInfoList" class="imgBox">
+                  <img
+                    v-for="value in item.fileInfoList"
+                    :src="value.fileUrl"
+                    @click="previewsImg(item.fileInfoList)" />
+                </div>
+              </div>
+            </div>
+          </van-form>
+        </div>
+        <!-- <div class="shopSignImg">
+          <div class="text">店招照片</div>
+          <div class="imgBox">
+            <img
+              v-if="val && val.qualifiedState"
+              :src="val.fileUrl"
+              @click="previewsImg(val.fileUrl)" />
+          </div>
+        </div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import deleteUploadImg from '@/components/deleteUploadImg';
+import { getVisitsDetailPerfectStore } from '@/api/index';
+import { ImagePreview } from 'vant';
+export default {
+  name: 'perfectStoreSign',
+  components: { deleteUploadImg },
+  data() {
+    return {
+      visitsId: '',
+      detail: null,
+      tiaoSJArr: null,
+      //   collectionItemList: [],
+    };
+  },
+  activated() {
+    this.visitsId = this.$route.query.visitId || '';
+    this.detail = null;
+    this.getVisitsDetailFn();
+  },
+  methods: {
+    getVisitsDetailFn() {
+      this.toastLoading(0, '加载中...', true);
+      this.tiaoSJArr = null;
+      //   this.collectionItemList = [];
+      getVisitsDetailPerfectStore({ visitsId: this.visitsId })
+        .then((res) => {
+          this.toastLoading().clear();
+          if (res.code == 200) {
+            this.detail = res.data;
+            this.tiaoSJArr = this.detail.sfaTaskList.filter((val) => val.photoIdentifyType == '3');
+            console.log(this.tiaoSJArr);
+            for (let i = 0; i < this.tiaoSJArr.length; i++) {
+              this.filterCollectionItemLists(this.tiaoSJArr[i].collectionItemList);
+            }
+          } else {
+            this.$dialog.alert({
+              message: res.msg,
+            });
+          }
+        })
+        .catch((err) => {
+          this.$dialog.alert({
+            message: err.msg,
+          });
+        });
+    },
+    filterCollectionItemLists(item) {
+      for (let q = 0; q < item.length; q++) {
+        if (
+          item[q].answerType == 'sz' ||
+          item[q].answerType == 'wb' ||
+          item[q].answerType == 'tel' ||
+          item[q].answerType == 'date' ||
+          item[q].answerType == 'tel_send_code' ||
+          item[q].answerType == 'check_code' ||
+          item[q].answerType == 'nyr' ||
+          item[q].answerType == 'dhwb'
+        ) {
+          item[q].answerValue = item[q].collectionOptionList[0].answerValue;
+        }
+        if (item[q].answerType == 'sm') {
+          item[q].success = false;
+          if (
+            item[q].collectionOptionList[0].answerValue != null &&
+            item[q].collectionOptionList[0].answerValue != ''
+          ) {
+            item[q].equipmentCode2 = item[q].collectionOptionList[0].answerValue.split(',')[1];
+            if (item[q].collectionOptionList[0].answerValue.split(',')[0] != 'null') {
+              item[q].equipmentCode1 = item[q].collectionOptionList[0].answerValue.split(',')[0];
+            } else {
+              item[q].equipmentCode1 = '编码不存在';
+            }
+            if (
+              item[q].collectionOptionList[0].answerValue.split(',')[0] ==
+              item[q].collectionOptionList[0].answerValue.split(',')[1]
+            ) {
+              item[q].success = true;
+            }
+          }
+        }
+        if (item[q].answerType == 'duox' || item[q].answerType == 'dx') {
+          item[q].answerValue = [];
+          if (item[q].collectionOptionList.length) {
+            for (var qq = 0; qq < item[q].collectionOptionList.length; qq++) {
+              if (item[q].collectionOptionList[qq].isCheck == 1) {
+                item[q].answerValue.push(item[q].collectionOptionList[qq].collectionOptionId);
+                item[q].collectionOptionList[qq].code = item[q].collectionCode;
+                item[q].collectionOptionList[qq].answerType = item[q].answerType;
+              }
+            }
+            item[q].answerValue = item[q].answerValue.join();
+          }
+        }
+      }
+    },
+    previewsImg(fileInfoList) {
+      var arrimg = [];
+      for (var imgi = 0; imgi < fileInfoList.length; imgi++) {
+        arrimg.push(fileInfoList[imgi].fileUrl);
+      }
+      ImagePreview(arrimg);
+    },
+    onClickLeft() {
+      this.$router.go(-1);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.perfectStoreSign {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  .content {
+    flex: 1;
+    overflow-y: auto;
+    padding: 10px 15px;
+    .contentBox {
+      width: 100%;
+      background: #fff;
+      margin-top: 10px;
+      .deviceCode {
+        font-size: 16px;
+        background-color: white;
+        border-radius: 5px;
+        position: relative;
+        overflow: hidden;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+      }
+      .vertical {
+        background-color: rgb(25, 137, 250);
+        height: 14px;
+        width: 8px;
+        border-radius: 40px;
+        margin-right: 10px;
+        /* position: absolute;
+  left: -3px;
+  top: 50px; */
+      }
+    }
+
+    // ///////
+    .specialTask {
+      display: flex;
+      flex-direction: row;
+      padding: 10px;
+      font-size: 16px;
+      justify-content: space-between;
+      background: #e5faff;
+      .specialTaskLeft {
+        display: flex;
+        flex-direction: row;
+        width: 100%;
+      }
+      .SignText {
+        width: 80px;
+        font-weight: 600;
+      }
+      .signContent {
+        flex: 1;
+        display: flex;
+        flex-direction: row;
+        margin: 0 8px;
+        .icon {
+          padding-top: 2px;
+          margin-right: 5px;
+        }
+      }
+    }
+    .shopSignButton {
+      width: 56px;
+      button {
+        width: 55px;
+        height: 28px;
+        padding: 0;
+        font-size: 12px;
+      }
+    }
+    .shopSignImg {
+      .text {
+        font-size: 16px;
+        font-weight: 600;
+        padding: 15px 10px;
+      }
+    }
+  }
+  .imgBox {
+    width: 100%;
+    text-align: center;
+    img {
+      width: 60%;
+    }
+  }
+}
+</style>
+<style lang="scss">
+.perfectStoreSign {
+  .van-button--danger {
+    background-color: #ee0a24 !important;
+    border: 1px solid #ee0a24 !important;
+  }
+  .formLabel {
+    margin: 0 16px;
+    padding-bottom: 16px;
+    border-bottom: 1px solid #f1f1f1;
+  }
+
+  .formLabel .van-cell {
+    padding: 10px 0;
+  }
+
+  .formLabel .van-cell::after {
+    border: 0;
+  }
+
+  .formLabel .van-field {
+    border: 1px solid #f1f1f1;
+    padding: 6px;
+    width: 100%;
+    border-radius: 4px;
+    overflow: hidden;
+  }
+
+  .formLabel .van-field__control {
+    padding: 0 10px;
+  }
+
+  .formLabel .formLabeltitle {
+    position: absolute;
+    top: 8px;
+  }
+}
+</style>