Explorar o código

feature_20260319_质感服务商拜访任务

zhujindu hai 4 semanas
pai
achega
82a4ab5483

+ 9 - 0
src/api/index.js

@@ -1160,3 +1160,12 @@ export function getVisitsDetailPerfectStore(query) {
     params: query,
   });
 }
+
+// 获取服务商档案信息接口
+export function getServiceProviderArchives(query) {
+  return request({
+    url: 'mobile/store/getServiceProviderArchives',
+    method: 'get',
+    params: query,
+  });
+}

+ 166 - 142
src/views/storeManagement/FSQStoreDetail.vue

@@ -12,157 +12,168 @@
         <van-icon name="volume" color="#64a8eb" size="18" />
         <span>如需修改服务商的姓名和手机号,请提IT工单到低代码合同系统修改</span>
       </div>
-      <van-form ref="tabstoreVal" readonly :scroll-to-error="true" :show-error="false">
-        <van-field readonly :value="fromData.storeCode" label="编号">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          v-model="fromData.storeName"
-          label="名称"
-          placeholder="请输入名称"
-          :rules="[{ required: true, message: '请输入名称' }]">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          readonly
-          clickable
-          name="picker"
-          :value="fromData.storeCategoryName"
-          label="类型"
-          placeholder="点击选择类型">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          v-model="fromData.orgName"
-          label="销售部"
-          placeholder="请输入销售部"
-          :rules="[{ required: true, message: '请输入销售部' }]">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-row style="border-bottom: 1px solid #ebedf0">
-          <van-field
-            rows="1"
-            autosize
-            type="textarea"
-            readonly
-            clickable
-            name="picker"
-            :value="fromData.chainName"
-            label="经销商名称"
-            placeholder="点击选择经销商名称"
-            :rules="[
-              {
-                required: true,
-                message: '请选择经销商',
-              },
-            ]">
-            <template #left-icon>
-              <span class="van-f-red"></span>
-            </template>
-          </van-field>
-        </van-row>
-        <van-field
-          readonly
-          clickable
-          name="picker"
-          :value="fromData.provinceName"
-          label="省(州)"
-          placeholder="点击选择省(州)">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          readonly
-          clickable
-          name="picker"
-          :value="fromData.cityName"
-          label="城市"
-          placeholder="点击选择城市">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          readonly
-          clickable
-          name="picker"
-          :value="fromData.districtName"
-          label="区(县)"
-          placeholder="点击选择区(县)">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          readonly
-          clickable
-          name="picker"
-          :value="fromData.townName"
-          label="街道"
-          placeholder="点击选择街道">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          v-model="fromData.addressLine"
-          label="地址"
-          placeholder="请输入地址"
-          rows="1"
-          autosize
-          type="textarea"
-          :rules="[
-            {
-              required: true,
-              message: '请输入地址',
-            },
-          ]">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field readonly v-model="fromData.contactName" label="实际经营人">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          type="tel"
-          v-model="fromData.telephone"
-          label="实际经营人电话"
-          placeholder="请输入实际经营人电话">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-        <van-field
-          readonly
-          v-model="fromData.salesmanName"
-          label="所属销售员"
-          placeholder="所属销售员">
-          <template #left-icon>
-            <span class="van-f-red"></span>
-          </template>
-        </van-field>
-      </van-form>
+      <van-tabs class="myTab" v-model="tabVal" color="#0057ba" @change="tabChange">
+        <van-tab title="基础信息" name="insidePlan" ref="dispsps">
+          <van-form ref="tabstoreVal" readonly :scroll-to-error="true" :show-error="false">
+            <van-field readonly :value="fromData.storeCode" label="编号">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              v-model="fromData.storeName"
+              label="名称"
+              placeholder="请输入名称"
+              :rules="[{ required: true, message: '请输入名称' }]">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              readonly
+              clickable
+              name="picker"
+              :value="fromData.storeCategoryName"
+              label="类型"
+              placeholder="点击选择类型">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              v-model="fromData.orgName"
+              label="销售部"
+              placeholder="请输入销售部"
+              :rules="[{ required: true, message: '请输入销售部' }]">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-row style="border-bottom: 1px solid #ebedf0">
+              <van-field
+                rows="1"
+                autosize
+                type="textarea"
+                readonly
+                clickable
+                name="picker"
+                :value="fromData.chainName"
+                label="经销商名称"
+                placeholder="点击选择经销商名称"
+                :rules="[
+                  {
+                    required: true,
+                    message: '请选择经销商',
+                  },
+                ]">
+                <template #left-icon>
+                  <span class="van-f-red"></span>
+                </template>
+              </van-field>
+            </van-row>
+            <van-field
+              readonly
+              clickable
+              name="picker"
+              :value="fromData.provinceName"
+              label="省(州)"
+              placeholder="点击选择省(州)">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              readonly
+              clickable
+              name="picker"
+              :value="fromData.cityName"
+              label="城市"
+              placeholder="点击选择城市">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              readonly
+              clickable
+              name="picker"
+              :value="fromData.districtName"
+              label="区(县)"
+              placeholder="点击选择区(县)">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              readonly
+              clickable
+              name="picker"
+              :value="fromData.townName"
+              label="街道"
+              placeholder="点击选择街道">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              v-model="fromData.addressLine"
+              label="地址"
+              placeholder="请输入地址"
+              rows="1"
+              autosize
+              type="textarea"
+              :rules="[
+                {
+                  required: true,
+                  message: '请输入地址',
+                },
+              ]">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field readonly v-model="fromData.contactName" label="实际经营人">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              type="tel"
+              v-model="fromData.telephone"
+              label="实际经营人电话"
+              placeholder="请输入实际经营人电话">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+            <van-field
+              readonly
+              v-model="fromData.salesmanName"
+              label="所属销售员"
+              placeholder="所属销售员">
+              <template #left-icon>
+                <span class="van-f-red"></span>
+              </template>
+            </van-field>
+          </van-form>
+        </van-tab>
+        <!-- 质感服务商档案 -->
+        <van-tab title="服务商档案" name="outsidePlan">
+          <FSQattributeDetail :storeCode="fromData.storeCode"></FSQattributeDetail>
+        </van-tab>
+      </van-tabs>
     </div>
   </div>
 </template>
 
 <script>
 import { getById } from '@/api/index';
+import FSQattributeDetail from './FSQattributeDetail.vue';
 export default {
+  components: { FSQattributeDetail },
   data() {
     return {
+      tabVal: 'insidePlan',
       fromData: {
         storeCode: '',
         storeName: '',
@@ -200,6 +211,7 @@ export default {
         }
       });
     },
+    tabChange(name, title) {},
     onClickLeft() {
       this.$router.go(-1);
     },
@@ -218,6 +230,18 @@ export default {
   .content {
     flex: 1;
     overflow-y: auto;
+    .myTab .van-tabs__nav--card {
+      margin: 0 !important;
+      border-left: 0;
+      border-right: 0;
+    }
+    .myTab .van-tabs__wrap,
+    .van-tabs__nav--card {
+      height: 40px;
+    }
+    .myTab .van-tab {
+      line-height: 40px;
+    }
   }
   .detailHeader {
     padding: 10px 20px;

+ 70 - 0
src/views/storeManagement/FSQattributeDetail.vue

@@ -0,0 +1,70 @@
+<template>
+  <div class="ZGattributeDetail">
+    <van-field
+      readonly
+      v-model="storeArchives.estimateSalesYearTarget"
+      label="年预估销额目标/干元:" />
+    <van-field readonly v-model="storeArchives.zgwqWorkerNum" label="旗下质感外墙工人数量:" />
+    <van-field readonly v-model="storeArchives.projectYearNum" label="年承接项目数量:" />
+    <van-field
+      readonly
+      autosize
+      type="textarea"
+      v-model="storeArchives.operateCompetitor"
+      label="是否经营竞品:" />
+    <van-field
+      v-if="storeArchives.operateCompetitor == '是'"
+      readonly
+      autosize
+      type="textarea"
+      v-model="storeArchives.mainCompetitorBrand"
+      label="主营竞品品牌:" />
+    <van-field
+      v-if="storeArchives.operateCompetitor == '是'"
+      readonly
+      v-model="storeArchives.mainCompetitorSalesYear"
+      label="主营竞品年销售额/干元:" />
+  </div>
+</template>
+<script>
+import { getServiceProviderArchives } from '@/api/index';
+export default {
+  props: {
+    storeCode: {
+      type: [String, Number],
+    },
+  },
+  data() {
+    return {
+      storeArchives: {},
+    };
+  },
+  created() {
+    this.getDetail();
+  },
+  methods: {
+    getDetail() {
+      getServiceProviderArchives({ storeCode: this.storeCode }).then((res) => {
+        if (res.code == 200) {
+          this.storeArchives = res.data;
+        } else {
+          this.$toast.fail(res.msg);
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss">
+.ZGattributeDetail {
+  // padding: 0 16px;
+  background: #fff;
+  .van-cell {
+    // padding: 10px 0;
+    // border-bottom: 1px solid #ccc;
+  }
+  .van-field__label {
+    width: 10em;
+  }
+}
+</style>

+ 198 - 0
src/views/storeManagement/FSQattributeEdit.vue

@@ -0,0 +1,198 @@
+<template>
+  <div class="FSQattributeEdit">
+    <van-nav-bar class="navBar" title="公装经销商编辑" left-arrow @click-left="onClickLeft" />
+    <div class="content" v-if="detail">
+      <van-form ref="tabstoreVal" @submit="onSubmit">
+        <van-field
+          label="是否终端客户"
+          :rules="[{ required: true, message: '请选择是否终端客户' }]">
+          <template #left-icon>
+            <span class="van-f-red">*</span>
+          </template>
+          <template #input>
+            <van-radio-group v-model="detail.terminalCustomer" direction="horizontal">
+              <van-radio name="是">是</van-radio>
+              <van-radio name="否">否</van-radio>
+            </van-radio-group>
+          </template>
+        </van-field>
+        <van-field
+          v-if="detail.terminalCustomer == '否'"
+          label="是否双包客户"
+          :rules="[{ required: true, message: '请选择是否双包客户' }]">
+          <template #left-icon>
+            <span class="van-f-red">*</span>
+          </template>
+          <template #input>
+            <van-radio-group v-model="detail.doubleCustomer" direction="horizontal">
+              <van-radio name="是">是</van-radio>
+              <van-radio name="否">否</van-radio>
+            </van-radio-group>
+          </template>
+        </van-field>
+        <van-field
+          v-if="detail.doubleCustomer == '是' && detail.terminalCustomer == '否'"
+          :rules="[{ required: true, message: '请选择客户类型' }]"
+          autosize
+          type="textarea"
+          label="客户类型">
+          <template #left-icon>
+            <span class="van-f-red">*</span>
+          </template>
+          <template #input>
+            <van-checkbox-group v-model="detail.customerType" direction="horizontal">
+              <van-checkbox
+                v-for="(item, index) in doubleustomer"
+                :name="item.dictLabel"
+                shape="square"
+                :key="index">
+                {{ item.dictValue }}
+              </van-checkbox>
+            </van-checkbox-group>
+          </template>
+        </van-field>
+        <van-field
+          v-if="detail.terminalCustomer == '否'"
+          autosize
+          type="textarea"
+          label="渠道类型"
+          :rules="[{ required: true, message: '请选择渠道类型' }]">
+          <template #left-icon>
+            <span class="van-f-red">*</span>
+          </template>
+          <template #input>
+            <van-radio-group v-model="detail.channelType" direction="horizontal">
+              <van-radio
+                v-for="(item, index) in channelTypeArr"
+                :name="item.dictLabel"
+                :key="index">
+                {{ item.dictValue }}
+              </van-radio>
+            </van-radio-group>
+          </template>
+        </van-field>
+      </van-form>
+    </div>
+    <div class="footer-btn">
+      <van-button
+        style="color: white; background: rgb(0, 87, 186); border-radius: 6px; width: 90%"
+        @click="confirmShare">
+        保 存
+      </van-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getDictOption } from '@/api/index';
+import { getGzVisitLabel, updateVisitLabel } from '@/api/storeManagement';
+export default {
+  name: 'FSQattributeEdit',
+  data() {
+    return {
+      detail: null,
+      channelTypeArr: [],
+      doubleustomer: [],
+    };
+  },
+  activated() {
+    this.detail = null;
+    this.toastLoading(0, '加载中...', true);
+    // 公装拜访标签渠道类型:gz_visit_label_channel_type 公装拜访标签双包客户:gz_visit_label_double_customer
+    Promise.all([
+      this.getDictOptionFun('gz_visit_label_channel_type'),
+      this.getDictOptionFun('gz_visit_label_double_customer'),
+    ]).then((res) => {
+      this.channelTypeArr = res[0];
+      this.doubleustomer = res[1];
+      console.log(this.doubleustomer);
+      this.getDetaild();
+    });
+  },
+  methods: {
+    getDictOptionFun(type) {
+      return new Promise((resolve, reject) => {
+        getDictOption({}, type).then((res) => {
+          resolve(res.data);
+        });
+      });
+    },
+    getDetaild() {
+      getGzVisitLabel({ storeCode: this.$route.query.storeCode }).then((res) => {
+        this.toastLoading().clear();
+        if (res.code == 200) {
+          res.data.customerType = res.data.customerType ? res.data.customerType.split(',') : [];
+          this.detail = res.data;
+        }
+      });
+    },
+    // 保存
+    confirmShare() {
+      this.$refs.tabstoreVal.submit();
+    },
+    onSubmit(value) {
+      this.toastLoading(0, '加载中...', true);
+      let params = JSON.parse(JSON.stringify(this.detail));
+      params.customerType = params.customerType.join(',');
+      params.storeCode = this.$route.query.storeCode;
+      params.chainCode = this.$route.query.chainCode;
+      if (params.terminalCustomer == '是') {
+        params.doubleCustomer = null;
+        params.customerType = '';
+        params.channelType = '';
+      }
+      if (params.doubleCustomer == '否') params.customerType = '';
+      updateVisitLabel(params).then((res) => {
+        this.toastLoading().clear();
+        if (res.code == 200) {
+          this.$toast(res.msg);
+          this.$router.go(-1);
+        } else {
+          this.$toast(res.msg);
+        }
+      });
+    },
+    onClickLeft() {
+      this.$router.go(-1);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.FSQattributeEdit {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  overflow: hidden;
+  .content {
+    flex: 1;
+    overflow-y: auto;
+    background: #fff;
+    padding: 10px 15px;
+    margin-top: 10px;
+    background: #fff;
+    .van-cell {
+      padding: 10px 0;
+      border-bottom: 1px solid #ccc;
+    }
+    .van-field__label {
+      width: 9em;
+    }
+    .van-checkbox--horizontal {
+      margin-bottom: 10px;
+      width: 100%;
+    }
+    .van-radio--horizontal {
+      margin-bottom: 10px;
+    }
+  }
+  .footer-btn {
+    display: flex;
+    justify-content: space-around;
+    padding: 10px 0;
+  }
+}
+</style>

+ 0 - 71
src/views/storeManagement/ZGattributeDetail.vue

@@ -1,71 +0,0 @@
-<template>
-  <div class="ZGattributeDetail">
-    <van-field readonly v-model="storeArchives.ownerMobile" label="主经营者电话" />
-    <van-field readonly v-model="storeArchives.ownerName" label="主经营者姓名" />
-    <van-field readonly v-model="storeArchives.ownerBirthday" label="主经营者出生日期" />
-    <van-field
-      readonly
-      autosize
-      type="textarea"
-      v-model="storeArchives.mainProductCategorys"
-      label="主营/擅长经营品类" />
-    <van-field
-      readonly
-      autosize
-      type="textarea"
-      v-model="storeArchives.totalSalesAmount"
-      label="门店24年总进货额(含所有品牌品类,单位:万元)" />
-    <van-field readonly v-model="storeArchives.performanceRatio" label="门店立邦业绩占比(单位:%)" />
-    <van-field
-      readonly
-      autosize
-      type="textarea"
-      v-model="storeArchives.mainBrand"
-      label="门店主营TOP3品牌" />
-    <van-field
-      readonly
-      v-model="storeArchives.constructionResource"
-      label="是否有工地资源(支持工地配送,承接工地双包等)" />
-    <van-field
-      v-if="storeArchives.constructionResource == '是'"
-      readonly
-      v-model="storeArchives.constructionYearNum"
-      label="年工地数量" />
-    <van-field readonly v-model="storeArchives.doubleContracting" label="是否有双包能力" />
-    <van-field readonly v-model="storeArchives.emergencyContactRelation" label="紧急联系人身份" />
-    <van-field readonly v-model="storeArchives.emergencyContact" label="紧急联系人姓名" />
-    <van-field
-      readonly
-      v-model="storeArchives.emergencyContactBirthday"
-      label="紧急联系人出生日期" />
-    <van-field readonly v-model="storeArchives.emergencyContactMobile" label="紧急联系人电话" />
-  </div>
-</template>
-<script>
-export default {
-  props: {
-    storeArchives: {
-      type: Object,
-      default: () => {},
-    },
-  },
-  data() {
-    return {};
-  },
-  activated() {},
-  methods: {},
-};
-</script>
-<style scoped lang="scss">
-.ZGattributeDetail {
-  // padding: 0 16px;
-  background: #fff;
-  .van-cell {
-    // padding: 10px 0;
-    // border-bottom: 1px solid #ccc;
-  }
-  .van-field__label {
-    width: 9em;
-  }
-}
-</style>

+ 1 - 6
src/views/storeManagement/storeDetail.vue

@@ -334,10 +334,6 @@
             </van-collapse-item>
           </van-collapse>
         </van-tab>
-        <!-- 质感服务商档案 -->
-        <van-tab title="服务商档案" name="outsidePlan" v-if="list.storeCategory == 'C108'">
-          <ZGattributeDetail :storeCode="list.storeCode"></ZGattributeDetail>
-        </van-tab>
         <van-tab title="属性信息" name="outsidePlan">
           <!-- 金牌店档案信息 -->
           <template v-if="list.ifJpStoreType == '1' && list.storeArchives">
@@ -654,9 +650,8 @@ import uploadImg from '@/components/viewaddreddUploadImg.vue';
 import helpPage from './helpPage.vue';
 import { getPosition, getMapPoi, getkeywordPoi, getTicketFun } from '@/utils/TXApiFun';
 import { getOrderUrlByStoreId } from '@/api/inventory';
-import ZGattributeDetail from './ZGattributeDetail.vue';
 export default {
-  components: { uploadImg, mapmarker, viewUploadImg, helpPage, ZGattributeDetail },
+  components: { uploadImg, mapmarker, viewUploadImg, helpPage },
   data() {
     return {
       addresssb: '',