Sfoglia il codice sorgente

服务商合并+推广任务

zhengjinyi 3 settimane fa
parent
commit
e166b9bdf0
32 ha cambiato i file con 2129 aggiunte e 404 eliminazioni
  1. 1 1
      src/api/contentLibrary/context.js
  2. 90 0
      src/api/serviceSettlement/group.js
  3. 27 2
      src/api/serviceSettlement/service.js
  4. 124 0
      src/api/serviceSettlement/task.js
  5. 61 14
      src/router/modules/serviceSettlement.js
  6. 11 12
      src/views/dataBase/components/UploadFile.vue
  7. 1 1
      src/views/finance/receipt/user.vue
  8. 1 10
      src/views/operate/home/exclusive-img-edit.vue
  9. 1 10
      src/views/operate/home/exclusive-small-edit.vue
  10. 1 10
      src/views/operate/home/zones-image-edit.vue
  11. 206 0
      src/views/serviceSettlement/club/index.vue
  12. 1 1
      src/views/serviceSettlement/components/CmQrcode/index.vue
  13. 1 1
      src/views/serviceSettlement/components/goods-dialog.vue
  14. 139 0
      src/views/serviceSettlement/components/group-dialog.vue
  15. 54 0
      src/views/serviceSettlement/components/task-Item.vue
  16. 159 0
      src/views/serviceSettlement/components/task-goods-dialog.vue
  17. 140 0
      src/views/serviceSettlement/components/task-service-dialog.vue
  18. 3 3
      src/views/serviceSettlement/contract/edit.vue
  19. 7 7
      src/views/serviceSettlement/contract/index.vue
  20. 10 10
      src/views/serviceSettlement/goods/index.vue
  21. 204 0
      src/views/serviceSettlement/group/group-team.vue
  22. 204 0
      src/views/serviceSettlement/group/index.vue
  23. 75 24
      src/views/serviceSettlement/list/edit.vue
  24. 122 58
      src/views/serviceSettlement/list/index.vue
  25. 1 0
      src/views/serviceSettlement/mixin/index.js
  26. 185 0
      src/views/serviceSettlement/task/edit.vue
  27. 41 234
      src/views/serviceSettlement/task/index.vue
  28. 257 0
      src/views/serviceSettlement/task/task-details.vue
  29. 2 3
      src/views/user/club-portrait/index.vue
  30. 0 1
      src/views/user/consult/detail.vue
  31. 0 1
      src/views/user/consult/list.vue
  32. 0 1
      src/views/user/consult/unreg-detail.vue

+ 1 - 1
src/api/contentLibrary/context.js

@@ -25,7 +25,7 @@ export const getContextDetail = (params) => request({
 })
 
 export const uploadFile = (data) => request({
-  url: '/formData/oss/MultiPictareaddData',
+  url: '/formData/MultiPictareaddData',
   method: 'POST',
   headers: {
     'Content-Type': 'multipart/form-data'

+ 90 - 0
src/api/serviceSettlement/group.js

@@ -0,0 +1,90 @@
+import request from '@/utils/request'
+/**
+ * 获取服务商列表
+ * @returns
+ */
+export function getServiceList(params) {
+  return request({
+    url: '/providers/addGroups',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 服务商团队列表
+ * @returns
+ */
+export const getTeamList = (params) => request({
+  url: '/providers/teamList',
+  method: 'get',
+  params
+})
+/**
+ * 添加服务商团队
+ * @param {*} name 团队名称
+ * @param {*} teamId 团队ID
+ * @param {*} leaderId 团队管理员ID
+ * @returns
+ */
+export const addTeam = (data) => request({
+  url: '/providers/add/team',
+  method: 'post',
+  data
+})
+/**
+ * 删除团队
+ * @param {*} id 团队ID
+ * @returns
+ */
+export const delTeam = (params) => request({
+  url: '/providers/del/team',
+  method: 'get',
+  params
+})
+
+/**
+ * 团队成员列表
+ * @param {*} id 团队ID
+ * @returns
+ */
+export const groupList = (params) => request({
+  url: '/providers/groupList',
+  method: 'get',
+  params
+})
+/**
+ * 删除成员
+ * @param {*} teamId 团队ID
+ * @param {*} spId 成员ID
+ * @returns
+ */
+export const delGroup = (params) => request({
+  url: '/providers/del/group',
+  method: 'get',
+  params
+})
+
+/**
+ * 添加成员
+ * @param {*} teamId 团队ID
+ * @param {*} spId 成员ID(逗号隔开)
+ * @returns
+ */
+export const addGroup = (params) => request({
+  url: '/providers/add/group',
+  method: 'get',
+  params
+})
+
+/**
+ * 设置团队管理员
+ * @param {*} teamId 团队ID
+ * @param {*} leaderId 组长ID
+ * @returns
+ */
+export const updateLeader = (data) => request({
+  url: '/providers/update/leader',
+  method: 'post',
+  data
+})
+

+ 27 - 2
src/api/serviceSettlement/service.js

@@ -13,7 +13,7 @@ export const getProviderList = (params) => request({
 })
 
 export const addProvider = (data) => request({
-  url: '/providers/add ',
+  url: '/providers/add',
   method: 'post',
   data
 })
@@ -25,7 +25,7 @@ export const getProviderDetail = (params) => request({
 })
 
 export const updatedStatus = (data) => request({
-  url: `/providers/updateStatus?userIds=${data.userIds}&status=${data.status}`,
+  url: `/providers/updateStatus?serviceProviderId=${data.serviceProviderId}&status=${data.status}`,
   method: 'post',
   data
 })
@@ -35,3 +35,28 @@ export const selectUploadImage = (data) => request({
   method: 'post',
   data
 })
+/**
+ * 服务商账号重置密码
+ * @param {*} userId 服务商userId
+ * @param {*} password 密码
+ * @returns
+ */
+export const updatePassword = (params) => request({
+  url: '/providers/update/pass',
+  method: 'get',
+  params
+})
+/**
+ * 服务商机构列表
+ * @param {*} spId 服务商Id
+ * @param {*} clubId 机构ID
+ * @param {*} name 机构名称
+ * @param {*} linkMan 联系人
+ * @param {*} bindMobile 手机号
+ * @returns
+ */
+export const providersClubList = (params) => request({
+  url: '/providers/clubList',
+  method: 'get',
+  params
+})

+ 124 - 0
src/api/serviceSettlement/task.js

@@ -0,0 +1,124 @@
+import request from '@/utils/request'
+/**
+ * 获取服务商任务列表
+ * @returns
+ */
+export function getTaskList(params) {
+  return request({
+    url: '/providers/task/list',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 获取任务分配详情服务商列表
+ * @returns
+ */
+export function getTaskProvider(params) {
+  return request({
+    url: '/providers/taskProvider/list',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 获取服务商列表
+ * @returns
+ */
+export function getServiceList(params) {
+  return request({
+    url: '/providers/addGroups',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 任务分配服务商过滤列表
+ * @param {*} taskId 任务id
+ * @returns
+ */
+export function getReceiveList(params) {
+  return request({
+    url: '/providers/receive/list',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 任务分配服务商过滤列表
+ * @param {*} taskId 任务id
+ * @returns
+ */
+export function getTaskDetail(params) {
+  return request({
+    url: '/providers/task/detail',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 添加任务
+ * @param {*} title 任务标题
+ * @param {*} topPic 任务封面
+ * @param {*} archiveId 内容库Id
+ * @param {*} shopId 供应商Id
+ * @param {*} startTime 开始时间
+ * @param {*} endTime 结束时间
+ * @returns
+ */
+export const addTask = (data) => request({
+  url: '/providers/add/task',
+  method: 'post',
+  data
+})
+
+/**
+ * 任务下发服务商
+ * @param {*} id 任务id
+ * @param {*} serviceProviderIds 服务商Id
+ * @returns
+ */
+export const assignTask = (params) => request({
+  url: '/providers/assign/task',
+  method: 'get',
+  params
+})
+
+/**
+ * 任务删除服务商
+ * @param {*} taskId 任务id
+ * @param {*} serviceProviderIds 服务商Id
+ * @returns
+ */
+export const taskProviderDel = (params) => request({
+  url: 'providers/taskProvider/del',
+  method: 'get',
+  params
+})
+
+/**
+ * 任务下发服务商
+ * @param {*} name 商品名称
+ * @param {*} shopName 供应商名称
+ * @param {*} productId 商品Id
+ * @param {*} pageSize 条数
+ * @param {*} pageNum 页码
+ * @returns
+ */
+export const getTaskProducts = (params) => request({
+  url: '/providers/task/products',
+  method: 'get',
+  params
+})
+/**
+ * 审核服务商任务提交
+ * @param {*} taskId 任务Id
+ * @param {*} serviceProviderId 服务商Id
+ * @param {*} auditStatus 通过 2 不通过 3
+ * @returns
+ */
+export const getTaskaAudit = (params) => request({
+  url: '/providers/task/audit',
+  method: 'get',
+  params
+})

+ 61 - 14
src/router/modules/serviceSettlement.js

@@ -3,7 +3,7 @@ import Layout from '@/layout'
 export default {
   path: '/service',
   component: Layout,
-  meta: { title: '服务商入驻', icon: 'link' },
+  meta: { title: '服务商管理', icon: 'link' },
   name: 'Service',
   redirect: '/service/settlement',
   alwaysShow: true,
@@ -11,7 +11,7 @@ export default {
     {
       path: 'settlement',
       name: 'Settlement',
-      meta: { title: '入驻列表', icon: 'component' },
+      meta: { title: '服务商列表', icon: 'component' },
       redirect: '/service/settlement/list',
       component: () => import('@/views/index'),
       children: [
@@ -20,14 +20,14 @@ export default {
           hidden: true,
           component: () => import('@/views/serviceSettlement/list/index.vue'),
           name: 'SettlementList',
-          meta: { title: '入驻列表', activeMenu: '/service/settlement' }
+          meta: { title: '服务商列表', activeMenu: '/service/settlement' }
         },
         {
           path: 'edit',
           hidden: true,
           component: () => import('@/views/serviceSettlement/list/edit.vue'),
           name: 'SettlementEdit',
-          meta: { title: '编辑列表', noCache: true, activeMenu: '/service/settlement' }
+          meta: { title: '编辑服务商', noCache: true, activeMenu: '/service/settlement' }
         },
         {
           path: 'goods',
@@ -46,6 +46,23 @@ export default {
             }
           ]
         },
+        {
+          path: 'club',
+          hidden: true,
+          component: () => import('@/views/index'),
+          name: 'SettlementClub',
+          redirect: '/service/settlement/club',
+          meta: { title: '服务商机构', noCache: true, activeMenu: '/service/settlement' },
+          children: [
+            {
+              path: 'list',
+              hidden: true,
+              component: () => import('@/views/serviceSettlement/club/index.vue'),
+              name: 'SettlementClubList',
+              meta: { title: '服务商机构列表', noCache: true, activeMenu: '/service/settlement' }
+            }
+          ]
+        },
         {
           path: 'contract',
           hidden: true,
@@ -73,25 +90,55 @@ export default {
       ]
     },
     {
-      path: 'settlement',
-      name: 'Settlement',
-      meta: { title: '服务商任务', icon: 'component' },
-      redirect: '/service/settlement/task',
+      path: 'group',
+      name: 'Group',
       component: () => import('@/views/index'),
+      redirect: '/service/group/list',
+      meta: { title: '服务商团队', icon: 'component', activeMenu: '/service/group' },
       children: [
         {
           path: 'list',
           hidden: true,
-          component: () => import('@/views/serviceSettlement/list/index.vue'),
-          name: 'SettlementList',
-          meta: { title: '任务列表', activeMenu: '/service/settlement' }
+          component: () => import('@/views/serviceSettlement/group/index.vue'),
+          name: 'SettlementGroupList',
+          meta: { title: '服务商团队', noCache: true, activeMenu: '/service/group' }
+        },
+        {
+          path: 'group-team',
+          hidden: true,
+          component: () => import('@/views/serviceSettlement/group/group-team.vue'),
+          name: 'SettlementGroupTeam',
+          meta: { title: '团队成员', noCache: true, activeMenu: '/service/group' }
+        }
+      ]
+    },
+    {
+      path: 'task',
+      name: 'Task',
+      component: () => import('@/views/index'),
+      redirect: '/service/task/list',
+      meta: { title: '服务商推广', icon: 'component', activeMenu: '/service/task' },
+      children: [
+        {
+          path: 'list',
+          hidden: true,
+          component: () => import('@/views/serviceSettlement/task/index.vue'),
+          name: 'SettlementTaskList',
+          meta: { title: '服务商推广', noCache: true, activeMenu: '/service/task' }
         },
         {
           path: 'edit',
           hidden: true,
-          component: () => import('@/views/serviceSettlement/list/edit.vue'),
-          name: 'SettlementEdit',
-          meta: { title: '编辑列表', noCache: true, activeMenu: '/service/settlement' }
+          component: () => import('@/views/serviceSettlement/task/edit.vue'),
+          name: 'SettlementTaskEdit',
+          meta: { title: '添加/编辑推广', noCache: true, activeMenu: '/service/task' }
+        },
+        {
+          path: 'task-details',
+          hidden: true,
+          component: () => import('@/views/serviceSettlement/task/task-details.vue'),
+          name: 'SettlementTaskDetails',
+          meta: { title: '下发服务商', noCache: true, activeMenu: '/service/task' }
         }
       ]
     }

+ 11 - 12
src/views/dataBase/components/UploadFile.vue

@@ -134,21 +134,20 @@ export default {
       const f = file.target.files[0]
       console.log(f)
       const formData = new FormData()
-      const isType = this.accept.indexOf('.pdf') !== -1
-      formData.append('multipartFile', f)
-      formData.append('type', isType ? 1 : '')
+      // const isType = this.accept.indexOf('.pdf') !== -1
+      formData.append('file', f)
+      // formData.append('type', isType ? 1 : '')
       try {
         this.$emit('change-loading')
         const data = await uploadFile(formData)
-        if (data.success || data.code === 0) {
-          this.dataList.push({ fileName: data.fileName, ossUrl: data.url, ossName: data.ossName })
-          this.$emit('success', { fileList: this.dataList })
-          this.$emit('change-loading')
-          this.$message({
-            type: 'success',
-            message: '上传成功'
-          })
-        }
+        this.dataList.push({ fileName: f.name, ossUrl: data.data, ossName: f.name })
+        this.$emit('success', { fileList: this.dataList })
+        this.$emit('change-loading')
+        this.$message({
+          type: 'success',
+          message: '上传成功'
+        })
+        // if (data.success || data.code === 0) {}
       } catch (error) {
         this.$message({
           type: 'error',

+ 1 - 1
src/views/finance/receipt/user.vue

@@ -17,7 +17,7 @@
         </el-form-item>
         <el-form-item label="收款用户类型:" prop="userType">
           <el-radio-group v-model="receiptUser.userType">
-            <el-radio :label="1">协销</el-radio>
+            <el-radio :label="1">服务商</el-radio>
             <el-radio :label="2">客服</el-radio>
             <el-radio :label="3">财务</el-radio>
             <el-radio :label="4">超级管理员</el-radio>

+ 1 - 10
src/views/operate/home/exclusive-img-edit.vue

@@ -171,16 +171,7 @@ export default {
       // 保存
       await saveTopAdvertisement(params)
       this.$notify.success({ title: '保存成功~', message: '' })
-      setTimeout(() => {
-        this.$store.dispatch('tagsView/delView', this.$route).then(() => {
-          this.$nextTick(() => {
-            this.$router.replace({
-              path: '/operate/zones/exclusive-image',
-              query: { activeName: 'first' }
-            })
-          })
-        })
-      }, 1000)
+      this.$router.back()
     },
     // 取消选择商品
     handleCancel() {

+ 1 - 10
src/views/operate/home/exclusive-small-edit.vue

@@ -177,16 +177,7 @@ export default {
       // 保存
       await saveAdvertisement(params)
       this.$notify.success({ title: '保存成功~', message: '' })
-      setTimeout(() => {
-        this.$store.dispatch('tagsView/delView', this.$route).then(() => {
-          this.$nextTick(() => {
-            this.$router.replace({
-              path: '/operate/zones/exclusive-image',
-              query: { activeName: 'second' }
-            })
-          })
-        })
-      }, 1000)
+      this.$router.back()
     },
     // 取消选择商品
     handleCancel() {

+ 1 - 10
src/views/operate/home/zones-image-edit.vue

@@ -177,16 +177,7 @@ export default {
       // 保存
       await saveZoneImage(params)
       this.$notify.success({ title: '保存成功~', message: '' })
-      setTimeout(() => {
-        this.$store.dispatch('tagsView/delView', this.$route).then(() => {
-          this.$nextTick(() => {
-            this.$router.replace({
-              path: '/operate/zones/zones-image',
-              query: { id: this.$route.query.zoneId, floorTitle: this.$route.query.floorTitle }
-            })
-          })
-        })
-      }, 1000)
+      this.$router.back()
     },
     // 取消选择商品
     handleCancel() {

+ 206 - 0
src/views/serviceSettlement/club/index.vue

@@ -0,0 +1,206 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>机构ID:</span>
+        <el-input
+          v-model="listQuery.clubId"
+          style="width: 120px"
+          placeholder="机构ID"
+          clearable
+          maxlength="10"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>机构名称:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="机构名称"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input
+          v-model="listQuery.bindMobile"
+          placeholder="手机号"
+          maxlength="11"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>联系人:</span>
+        <el-input
+          v-model="listQuery.linkMan"
+          placeholder="联系人名称"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+      </div>
+    </div>
+    <!-- 列表 -->
+    <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="660">
+      <el-table-column prop="clubId" fixed label="机构ID" align="center" width="80" />
+      <el-table-column prop="name" fixed label="机构名称" align="center" />
+      <el-table-column prop="linkMan" label="联系人" align="center" />
+      <el-table-column prop="spName" label="服务商名称" align="center" />
+      <el-table-column prop="contractMobile" label="手机号" align="center">
+        <template slot-scope="{ row }">
+          {{ row.contractMobile ? row.contractMobile : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="status" label="机构状态" align="center" width="100">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.status === 1" type="warning" size="small">待审核</el-tag>
+          <el-tag v-if="row.status === 90" type="success" size="small">已上线</el-tag>
+          <el-tag v-if="row.status === 91" type="info" size="small">已下线</el-tag>
+          <el-tag v-if="row.status === 92" type="danger" size="small">审核未通过</el-tag>
+          <el-tag v-if="row.status === 93" type="warning" size="small">已确认</el-tag>
+          <el-tag v-if="row.status === 94" type="danger" size="small">已冻结</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="userIdentity" label="机构级别" align="center">
+        <template slot-scope="{ row }">
+          <template v-if="row.userIdentity === '4'">
+            <el-tag v-if="row.userIdentity === '4' && row.svipUserFlag === 1" type="success" size="small">个人机构(超级会员)</el-tag>
+            <el-tag v-else type="info" size="small">个人机构(普通会员)</el-tag>
+          </template>
+          <template v-if="row.userIdentity === '2'">
+            <el-tag v-if="row.userIdentity === '2' && row.svipUserFlag ===1" type="success" size="small">资质机构(超级会员)</el-tag>
+            <el-tag v-if="row.userIdentity === '2' && row.svipUserFlag !==1 && !row.medicalPracticeLicenseImg" type="warning" size="small">资质机构(高级会员)</el-tag>
+            <el-tag v-if="row.userIdentity === '2' && row.svipUserFlag !==1 && row.medicalPracticeLicenseImg" type="danger" size="small">资质机构(医美会员)</el-tag>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column prop="addTime" label="注册时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.addTime ? row.addTime : '---' }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20, 30, 100]"
+      :page-size="20"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="providersClubList"
+    />
+  </div>
+</template>
+
+<script>
+import { providersClubList } from '@/api/serviceSettlement/service'
+import pickerOptions from '@/utils/time-picker.js'
+export default {
+  name: 'CustomerList',
+  filters: {},
+  data() {
+    return {
+      isLoading: true,
+      pickerOptions,
+      time: [],
+      time1: [],
+      listQuery: {
+        spId: this.$route.query.serviceProviderId,
+        clubId: '',
+        name: '',
+        bindMobile: '',
+        linkMan: '',
+        pageNum: 1,
+        pageSize: 20
+      },
+      list: [],
+      total: 0,
+      shopDialogVisible: false,
+      dialogFormVisible: false,
+      renewCustome: {
+        id: '',
+        status: ''
+      },
+      rules: {
+        status: [{ required: true, message: '请设置统计状态', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {},
+  created() {
+    this.getList()
+  },
+  mounted() {},
+  methods: {
+    // 获取行为记录列表
+    getList() {
+      this.list = []
+      this.isLoading = true
+      this.listQuery.pageNum = 1
+      this.providersClubList()
+    },
+    // 获取机构列表
+    async providersClubList() {
+      try {
+        const res = await providersClubList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作
+    handleRecordDetail(type, row) {
+      switch (type) {
+        case 1: // 咨询记录
+          this.$router.push({
+            path: '/user/consult/list',
+            query: { clubName: row.name, clubId: row.clubId }
+          })
+          break
+        case 2: // 行为记录
+          this.$router.push({
+            path: '/user/record-list',
+            query: { type: 'first', corporateName: row.name, clubId: row.clubId }
+          })
+          break
+        case 3: // 机构画像
+          this.$router.push({
+            path: '/user/club-portrait',
+            query: { clubName: row.name, clubId: row.clubId }
+          })
+          break
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 1 - 1
src/views/serviceSettlement/components/CmQrcode/index.vue

@@ -74,7 +74,7 @@ export default {
       }).then(async() => {
         this.isLoading = true
         // 使用a链接下载
-        const downUrl = `${process.env.VUE_APP_BASE_API}/providers/download/image?ids=${this.itemObj.id}&type=2`
+        const downUrl = `${process.env.VUE_APP_BASE_API}/providers/download/image?ids=${this.itemObj.serviceProviderId}&type=2`
         this.downloadWithUrl(downUrl, this.itemObj.name)
           .catch((err) => {
             console.log(err)

+ 1 - 1
src/views/serviceSettlement/components/goods-dialog.vue

@@ -93,7 +93,7 @@ export default {
     return {
       visible: true,
       listQuery: {
-        providerId: this.$route.query.providersId,
+        serviceProviderId: this.$route.query.serviceProviderId,
         shopId: '',
         productId: '',
         shopName: '',

+ 139 - 0
src/views/serviceSettlement/components/group-dialog.vue

@@ -0,0 +1,139 @@
+<template>
+  <el-dialog title="添加成员" :visible.sync="visible" width="1200px" :close-on-click-modal="false" :show-close="false">
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>服务商名称:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="服务商名称"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="手机号"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+      </div>
+    </div>
+    <el-table
+      ref="table"
+      v-loading="isLoading"
+      :data="list"
+      height="400px"
+      border
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="服务商ID" prop="serviceProviderId" align="center" />
+      <el-table-column label="服务商名称" prop="name" align="center" />
+      <el-table-column label="手机号" prop="mobile" align="center" />
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20]"
+      :page-size="10"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getServiceList"
+    />
+    <div slot="footer">
+      <el-button @click="handleCanle"> 取 消 </el-button>
+      <el-button type="primary" :disabled="disabled" @click="handleConfirm"> 确 定 </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getServiceList } from '@/api/serviceSettlement/group'
+
+export default {
+  name: 'GoodsDialog',
+  data() {
+    return {
+      visible: true,
+      listQuery: {
+        pageNum: 1,
+        pageSize: 100
+      },
+      list: [],
+      total: 0,
+      groupRadio: null,
+      isLoading: true
+    }
+  },
+  computed: {
+    disabled() {
+      return this.groupRadio === null
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取所有供应商列表
+    async getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getServiceList()
+    },
+    // 获取所有服务商列表
+    async getServiceList() {
+      try {
+        const res = await getServiceList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 选择服务商
+    handleSelectionChange(row) {
+      this.groupRadio = row
+      console.log('row', row)
+    },
+    // 确认选择服务商
+    handleConfirm() {
+      this.$emit('confirm', this.groupRadio)
+    },
+    handleCanle() {
+      // 取消弹窗
+      this.$emit('cancel')
+    },
+    // 已选择的禁用勾选框
+    selectable(row) {
+      if (row.flag) {
+        return true
+      } else {
+        return false
+      }
+    },
+    checkedInput(event, type) {
+      let pattern = ''
+      switch (type) {
+        case 1:
+          pattern = /[^\d]/g
+          break
+        case 2:
+          pattern = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g
+          break
+      }
+      return event.replace(pattern, '')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped></style>

+ 54 - 0
src/views/serviceSettlement/components/task-Item.vue

@@ -0,0 +1,54 @@
+<template>
+  <div class="store-item">
+    <el-image :src="selectStore.mainImage" />
+    <div class="store-name">{{ selectStore.productName }}</div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    selectStore: {
+      type: Object,
+      default: null
+    }
+  },
+  data() {
+    return {
+    }
+  },
+  watch: {
+    selectStore: {
+      handler(val) {
+        console.log(val)
+        this.selectStore = val
+      },
+      deep: true
+    }
+  },
+  created() {
+    console.log('selectStore', this.selectStore)
+    console.log('mainImage', this.selectStore.mainImage)
+    console.log('productName', this.selectStore.productName)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.store-item {
+  padding: 10px;
+  margin: 10px 0;
+  display: flex;
+  align-items: center;
+  background: #66666636;
+  margin-bottom: 10px;
+  .el-image {
+    width: 80px;
+    height: 80px;
+    margin-right: 10px;
+  }
+  .store-name {
+    width: calc(100% - 80px);
+  }
+}
+</style>

+ 159 - 0
src/views/serviceSettlement/components/task-goods-dialog.vue

@@ -0,0 +1,159 @@
+<template>
+  <el-dialog title="添加商品" :visible.sync="visible" width="1200px" :close-on-click-modal="false" :show-close="false">
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>商品ID:</span>
+        <el-input
+          v-model="listQuery.productId"
+          placeholder="商品ID"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>商品名称:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="商品名称"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>供应商名称:</span>
+        <el-input
+          v-model="listQuery.shopName"
+          placeholder="供应商名称"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+      </div>
+    </div>
+    <el-table
+      ref="table"
+      v-loading="isLoading"
+      :data="list"
+      height="400px"
+      border
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="商品ID" prop="productId" align="center" width="100" />
+      <el-table-column prop="mainImage" label="商品图片" align="center" width="120">
+        <template slot-scope="{ row }">
+          <img v-if="row.mainImage" :src="row.mainImage" alt="" style="width: 50px; height: 50px" />
+          <span v-else>---</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品名称" prop="productName" align="center" />
+      <el-table-column label="供应商名称" prop="shopName" align="center" />
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20]"
+      :page-size="10"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getTaskProducts"
+    />
+    <div slot="footer">
+      <el-button @click="handleCanle"> 取 消 </el-button>
+      <el-button type="primary" :disabled="disabled" @click="handleConfirm"> 确 定 </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getTaskProducts } from '@/api/serviceSettlement/task'
+
+export default {
+  name: 'GoodsDialog',
+  data() {
+    return {
+      visible: true,
+      listQuery: {
+        name: '',
+        shopName: '',
+        productId: '',
+        pageNum: 1, // 页码
+        pageSize: 10 // 页面数据数
+      },
+      list: [],
+      total: 0,
+      shopsRadio: null,
+      isLoading: true
+    }
+  },
+  computed: {
+    disabled() {
+      return this.shopsRadio === null
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取所有供应商列表
+    async getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getTaskProducts()
+    },
+    // 获取所有供应商列表
+    async getTaskProducts() {
+      try {
+        const res = await getTaskProducts(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 选择供应商
+    handleSelectionChange(row) {
+      this.shopsRadio = row
+      console.log('row', row)
+    },
+    // 确认选择供应商
+    handleConfirm() {
+      this.$emit('confirm', this.shopsRadio)
+    },
+    handleCanle() {
+      // 取消弹窗
+      this.$emit('cancel')
+    },
+    // 已选择的禁用勾选框
+    selectable(row) {
+      if (row.flag) {
+        return true
+      } else {
+        return false
+      }
+    },
+    checkedInput(event, type) {
+      let pattern = ''
+      switch (type) {
+        case 1:
+          pattern = /[^\d]/g
+          break
+        case 2:
+          pattern = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g
+          break
+      }
+      return event.replace(pattern, '')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped></style>

+ 140 - 0
src/views/serviceSettlement/components/task-service-dialog.vue

@@ -0,0 +1,140 @@
+<template>
+  <el-dialog title="选择服务商" :visible.sync="visible" width="1200px" :close-on-click-modal="false" :show-close="false">
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>服务商名称:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="服务商名称"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input
+          v-model="listQuery.mobile"
+          placeholder="手机号"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+      </div>
+    </div>
+    <el-table
+      ref="table"
+      v-loading="isLoading"
+      :data="list"
+      height="400px"
+      border
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="服务商ID" prop="serviceProviderId" align="center" />
+      <el-table-column label="服务商名称" prop="name" align="center" />
+      <el-table-column label="手机号" prop="mobile" align="center" />
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20]"
+      :page-size="10"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getReceiveList"
+    />
+    <div slot="footer">
+      <el-button @click="handleCanle"> 取 消 </el-button>
+      <el-button type="primary" :disabled="disabled" @click="handleConfirm"> 确 定 </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getReceiveList } from '@/api/serviceSettlement/task'
+
+export default {
+  name: 'TaskServiceDialog',
+  data() {
+    return {
+      visible: true,
+      listQuery: {
+        taskId: this.$route.query.taskId,
+        pageNum: 1,
+        pageSize: 100
+      },
+      list: [],
+      total: 0,
+      groupRadio: null,
+      isLoading: true
+    }
+  },
+  computed: {
+    disabled() {
+      return this.groupRadio === null
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取任务服务商列表
+    async getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getReceiveList()
+    },
+    // 获取任务服务商列表
+    async getReceiveList() {
+      try {
+        const res = await getReceiveList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 选择服务商
+    handleSelectionChange(row) {
+      this.groupRadio = row
+      console.log('row', row)
+    },
+    // 确认选择服务商
+    handleConfirm() {
+      this.$emit('confirm', this.groupRadio)
+    },
+    handleCanle() {
+      // 取消弹窗
+      this.$emit('cancel')
+    },
+    // 已选择的禁用勾选框
+    selectable(row) {
+      if (row.flag) {
+        return true
+      } else {
+        return false
+      }
+    },
+    checkedInput(event, type) {
+      let pattern = ''
+      switch (type) {
+        case 1:
+          pattern = /[^\d]/g
+          break
+        case 2:
+          pattern = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g
+          break
+      }
+      return event.replace(pattern, '')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped></style>

+ 3 - 3
src/views/serviceSettlement/contract/edit.vue

@@ -78,8 +78,8 @@ export default {
     id() {
       return this.$route.query.id || false
     },
-    providersId() {
-      return Number(this.$route.query.providersId) || false
+    serviceProviderId() {
+      return Number(this.$route.query.serviceProviderId) || false
     },
     isCheck() {
       return !!Number(this.$route.query.isCheck)
@@ -99,7 +99,7 @@ export default {
     submitForm(form) {
       this.$refs[form].validate(async valid => {
         if (valid) {
-          const form = Object.assign(this.formLabelAlign, { providersId: this.providersId, createBy: this.fullName })
+          const form = Object.assign(this.formLabelAlign, { serviceProviderId: this.serviceProviderId, createBy: this.fullName })
           await addContract(form)
           this.$router.back()
         }

+ 7 - 7
src/views/serviceSettlement/contract/index.vue

@@ -27,7 +27,7 @@
       </div>
       <div class="filter-control">
         <el-button type="primary" @click="getList">查询</el-button>
-        <el-button type="primary" @click="$router.push('/service/settlement/contract/edit?providersId=' + providersId)">添加</el-button>
+        <el-button type="primary" @click="$router.push('/service/settlement/contract/edit?serviceProviderId=' + serviceProviderId)">添加</el-button>
       </div>
     </div>
     <el-table
@@ -62,7 +62,7 @@
             v-else
             type="primary"
             size="mini"
-            @click="$router.push('/service/settlement/contract/edit?id=' + scope.row.id + '&providersId=' + providersId + '&isCheck=1')"
+            @click="$router.push('/service/settlement/contract/edit?id=' + scope.row.id + '&serviceProviderId=' + serviceProviderId + '&isCheck=1')"
           >查看</el-button>
         </template>
       </el-table-column>
@@ -96,12 +96,12 @@ export default {
     }
   },
   computed: {
-    providersId() {
-      return this.$route.query.providersId || false
+    serviceProviderId() {
+      return this.$route.query.serviceProviderId || false
     }
   },
   mounted() {
-    if (this.providersId) {
+    if (this.serviceProviderId) {
       this.getList()
     }
   },
@@ -110,7 +110,7 @@ export default {
       const form = Object.assign(this.listQuery, {
         contractStartDate: obj ? obj[0] : '',
         contractEndDate: obj ? obj[1] : '',
-        providersId: this.providersId || ''
+        serviceProviderId: this.serviceProviderId || ''
       })
       const { data } = await getContractList(form)
       this.list = data.results
@@ -118,7 +118,7 @@ export default {
     handleSelectionChange() {},
     checkout(row) {
       console.log(row)
-      this.$router.push('/service/settlement/contract/edit?id=' + row.row.id + '&providersId=' + this.providersId)
+      this.$router.push('/service/settlement/contract/edit?id=' + row.row.id + '&serviceProviderId=' + this.serviceProviderId)
     }
   }
 }

+ 10 - 10
src/views/serviceSettlement/goods/index.vue

@@ -54,7 +54,7 @@
       @pagination="getShopProduct"
     />
     <!--  选择商品弹窗 -->
-    <goods-dialog v-if="goodsDialogVisible" ref="shopDialog" @confirm="handleAddGoodsConfirm" @cancel="handleCancel" />
+    <goods-dialog v-if="goodsDialogVisible" ref="goodsDialog" @confirm="handleAddGoodsConfirm" @cancel="handleCancel" />
   </div>
 </template>
 
@@ -69,7 +69,7 @@ export default {
     return {
       isLoading: true,
       listQuery: {
-        providerId: this.$route.query.providersId,
+        serviceProviderId: this.$route.query.serviceProviderId,
         productName: '',
         productId: '',
         pageNum: 1,
@@ -81,8 +81,8 @@ export default {
     }
   },
   computed: {
-    providersId() {
-      return this.$route.query.providersId || false
+    serviceProviderId() {
+      return this.$route.query.serviceProviderId || false
     }
   },
   created() {
@@ -103,12 +103,12 @@ export default {
       data.forEach((ele) => {
         productIds.push(ele.productId)
       })
-      this.addProducts({ providerId: this.providersId, productIds: productIds.join(',') })
+      this.addProducts({ serviceProviderId: this.serviceProviderId, productIds: productIds.join(',') })
     },
     // 取消选择供商品
     handleCancel() {
       this.goodsDialogVisible = false
-      this.$refs.shopDialog.visible = false
+      this.$refs.goodsDialog.visible = false
     },
     // 获取服务商商品列表
     async getProvidersProducts() {
@@ -131,7 +131,7 @@ export default {
           title: '',
           message: '添加成功',
           type: 'success'
-        });
+        })
         this.getList()
       } catch (error) {
         console.log(error)
@@ -150,15 +150,15 @@ export default {
         this.$message.info('已取消删除操作')
       }
     },
-    // 调用删除广告图
+    // 调用删除商品
     async delProduct(row) {
       try {
-        await delProduct({ providerId: this.providersId, productId: row.productId })
+        await delProduct({ serviceProviderId: this.serviceProviderId, productId: row.productId })
         this.$notify({
           title: '',
           message: '删除成功',
           type: 'success'
-        });
+        })
         this.getList()
       } catch (error) {
         console.log(error)

+ 204 - 0
src/views/serviceSettlement/group/group-team.vue

@@ -0,0 +1,204 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <el-button type="primary" @click="dialogFormVisible = true"> 添加成员 </el-button>
+      </div>
+    </div>
+    <!-- 列表 -->
+    <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="660">
+      <el-table-column prop="serviceProviderId" label="成员ID" align="center" width="120" />
+      <el-table-column prop="name" label="成员名称" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.serviceProviderId === row.leaderId" type="primary" size="mini" style="margin:5px;">管理员</el-tag>
+          <span>{{ row.name }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="mobile" label="联系电话" align="center" />
+      <el-table-column label="操作" align="center" width="200">
+        <template slot-scope="{ row }">
+          <el-button type="primary" size="mini" style="margin: 5px;" :disabled="row.serviceProviderId === row.leaderId ? true : false" @click="handleUpdateLeader(row)">设为管理员</el-button>
+          <el-button type="danger" size="mini" style="margin: 2px" :disabled="row.serviceProviderId === row.leaderId ? true : false" @click="handleDelete(row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20, 30, 100]"
+      :page-size="20"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="groupList"
+    />
+    <!--  选择成员弹窗 -->
+    <group-dialog v-if="dialogFormVisible" ref="groupDialog" @confirm="handleAddGroupConfirm" @cancel="handleCancel" />
+  </div>
+</template>
+
+<script>
+import { groupList, addGroup, delGroup, updateLeader } from '@/api/serviceSettlement/group'
+import GroupDialog from '../components/group-dialog'
+export default {
+  name: 'GroupTeam',
+  components: { GroupDialog },
+  filters: {},
+  data() {
+    return {
+      isLoading: true,
+      listQuery: {
+        id: this.$route.query.teamId,
+        pageNum: 1,
+        pageSize: 20
+      },
+      list: [],
+      total: 0,
+      dialogFormVisible: false
+    }
+  },
+  computed: {
+    leaderId() {
+      return this.$route.query.leaderId * 1 || 0
+    },
+    teamId() {
+      return this.$route.query.teamId * 1 || 0
+    }
+  },
+  created() {
+    this.getList()
+  },
+  mounted() {},
+  methods: {
+    // 获取行为记录列表
+    getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.groupList()
+    },
+    // 确认选择成员
+    handleAddGroupConfirm(data) {
+      console.log('data', data)
+      const serviceProviderIds = []
+      data.forEach((ele) => {
+        serviceProviderIds.push(ele.serviceProviderId)
+      })
+      this.addGroup({ teamId: this.teamId, spId: serviceProviderIds.join(',') })
+    },
+    // 取消选择供成员
+    handleCancel() {
+      this.dialogFormVisible = false
+      this.$refs.shopDialog.visible = false
+    },
+    // 获取团队成员列表
+    async groupList() {
+      try {
+        this.isLoading = true
+        const res = await groupList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 保存添加成员
+    async addGroup(params) {
+      try {
+        await addGroup(params)
+        this.dialogFormVisible = false
+        this.$notify({
+          title: '',
+          message: '添加成功',
+          type: 'success'
+        })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作设置管理员
+    async handleUpdateLeader(row) {
+      try {
+        await this.$confirm('确定设置该成员为管理员吗?', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        this.updateLeader(row)
+      } catch (error) {
+        this.$message.info('已取消删除操作')
+      }
+    },
+    // 调用设置管理员
+    async updateLeader(row) {
+      try {
+        await updateLeader({ leaderId: row.serviceProviderId, teamId: this.teamId })
+        this.$notify({
+          title: '',
+          message: '设置成功~',
+          type: 'success'
+        })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作删除成员
+    async handleDelete(row) {
+      try {
+        await this.$confirm('确定删除该成员吗?', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        this.delGroup(row)
+      } catch (error) {
+        this.$message.info('已取消删除操作')
+      }
+    },
+    // 调用删除成员
+    async delGroup(row) {
+      try {
+        await delGroup({ spId: row.serviceProviderId, teamId: this.teamId })
+        this.$notify({
+          title: '',
+          message: '删除成功',
+          type: 'success'
+        })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.tags-sms {
+  width: 100%;
+  height: auto;
+  font-size: 16px;
+  color: #333333;
+  line-height: 28px;
+  box-sizing: border-box;
+  padding: 5px;
+}
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 204 - 0
src/views/serviceSettlement/group/index.vue

@@ -0,0 +1,204 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <el-button type="primary" @click="handleAdd">添加团队</el-button>
+      </div>
+    </div>
+
+    <el-table
+      ref="table"
+      v-loading="isLoading"
+      :data="list"
+      border
+      :default-sort="{ prop: 'frequency', order: 'descending' }"
+    >
+      <!--<el-table-column type="selection" width="55" align="center" />-->
+      <el-table-column
+        label="序号"
+        type="index"
+        sortable="custom"
+        align="center"
+        width="50"
+      />
+      <el-table-column prop="name" label="团队名称" align="center" />
+      <el-table-column prop="leaderName" label="团队管理员" align="center" />
+      <el-table-column prop="groupCount" label="成员数量" align="center" />
+      <el-table-column prop="createdTime" label="添加时间" align="center" />
+      <el-table-column label="操作" align="center" width="300">
+        <template slot-scope="{ row }">
+          <div class="labelCenter">
+            <el-button type="primary" size="mini" @click="handleEdit(row)">编辑</el-button>
+            <el-button
+              type="primary"
+              size="mini"
+              @click="$router.push(`/service/group/group-team?teamId=${row.teamId}`)"
+            >团队成员</el-button>
+            <el-button type="danger" size="mini" @click="handleDele(row)">删除</el-button>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 添加团队 -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible" width="500px">
+      <el-form ref="dataForm" :rules="rules" :model="form" label-position="right" label-width="120px">
+        <el-form-item label="团队名称:" prop="name">
+          <el-input v-model="form.name" type="text" placeholder="请输入团队名称" maxlength="20" style="width:300px;" />
+        </el-form-item>
+        <el-form-item v-if="!isEdit" label="团队管理员:" prop="leaderId">
+          <el-select v-model="form.leaderId" placeholder="请选择团队管理员" style="width:300px;">
+            <el-option value="" label="请选择" />
+            <el-option
+              v-for="item in sellerList"
+              :key="item.serviceProviderId"
+              :label="item.name"
+              :value="item.serviceProviderId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" @click="handleAddGroup">确定</el-button>
+      </div>
+    </el-dialog>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { getTeamList, addTeam, delTeam, getServiceList } from '@/api/serviceSettlement/group'
+import serviceMixin from '../mixin/index'
+
+export default {
+  mixins: [serviceMixin],
+  data() {
+    return {
+      listQuery: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      time: '',
+      showQrImag: false,
+      isLoading: false,
+      exportDialogVisible: false,
+      list: [],
+      indexMethod: 1,
+      total: 0,
+      selectType: 0,
+      providerItem: {},
+      dialogFormVisible: false,
+      form: {
+        name: '', // 小组名称
+        leaderId: '' // 小组管理员ID
+      },
+      rules: {
+        name: [{ required: true, message: '请输入小组名称', trigger: 'blur' }],
+        leaderId: [{ required: true, message: '请选择小组管理员', trigger: 'blur' }]
+      },
+      sellerList: [],
+      dialogTitle: '添加团队',
+      isEdit: false
+    }
+  },
+  mounted() {
+    this.getServiceList()
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      const { data } = await getTeamList(this.listQuery)
+      this.list = data.results
+      this.total = data.totalRecord
+    },
+    // 获取协销列表选项
+    async getServiceList() {
+      try {
+        const res = await getServiceList({ pageNum: 1, pageSize: 100 })
+        this.sellerList = res.data.results
+      } catch (error) {
+        console.warn(error)
+      }
+    },
+    // 添加团队
+    handleAdd() {
+      this.isEdit = false
+      this.dialogTitle = '添加团队'
+      this.form = { name: '', leaderId: '' }
+      this.dialogFormVisible = true
+    },
+    // 添加取消
+    closeDialog() {
+      this.$refs.dataForm.resetFields()
+      this.dialogFormVisible = false
+    },
+    // 编辑团队
+    handleEdit(row) {
+      this.isEdit = true
+      this.dialogTitle = '编辑团队'
+      this.form = { ...this.form, ...row }
+      this.dialogFormVisible = true
+    },
+    // 保存重置新密码
+    async handleAddGroup() {
+      try {
+        await this.$refs.dataForm.validate()
+        this.addTeam(this.form)
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 保存团队
+    async addTeam(params) {
+      await addTeam(params)
+      this.$notify.success({ title: '添加团队成功~', message: '' })
+      this.closeDialog()
+      this.getList()
+    },
+    // 删除团队
+    async handleDele(row) {
+      try {
+        console.log('row', row)
+        await this.$confirm('确定删除该团队吗?', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        this.delTeam(row)
+      } catch (error) {
+        this.$notify.info({ title: '用户取消操作~', message: '' })
+      }
+    },
+    // 调用删除专区
+    async delTeam(row) {
+      try {
+        await delTeam({ id: row.teamId })
+        this.$notify.success({ title: '删除成功~', message: '' })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.labelCenter {
+  display: grid;
+  grid-template-rows: repeat(1, 1fr);
+  grid-template-columns: repeat(3, 1fr);
+  grid-gap: 5px;
+  .el-button {
+    width: 80px;
+    margin-left: 0;
+  }
+}
+</style>

+ 75 - 24
src/views/serviceSettlement/list/edit.vue

@@ -19,9 +19,19 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="服务商品牌:" prop="brandName" v-if="formLabelAlign.serviceLevel === 4 || formLabelAlign.serviceLevel === 5">
+      <el-form-item v-if="formLabelAlign.serviceLevel === 4 || formLabelAlign.serviceLevel === 5" label="服务商品牌:" prop="brandName">
         <el-input v-model="formLabelAlign.brandName" placeholder="服务商品牌" />
       </el-form-item>
+      <el-form-item label="服务商类型:" prop="serviceCategory">
+        <el-select v-model="formLabelAlign.serviceCategory" placeholder="服务商类型">
+          <el-option
+            v-for="i in serviceCategoryList"
+            :key="i.id"
+            :label="i.value"
+            :value="i.id"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="服务商地区:" prop="address">
         <!--<el-cascader
           ref="cascader"
@@ -34,12 +44,12 @@
           :placeholder="cascaderPlaceholder"
           @change="handleChange"
         />-->
-        <el-input v-model="formLabelAlign.address" placeholder="请服务商地区" />
+        <el-input v-model="formLabelAlign.address" placeholder="请输入服务商地区" />
       </el-form-item>
-      <el-form-item label="服务商类型:" prop="serviceCategory">
-        <el-select v-model="formLabelAlign.serviceCategory" placeholder="服务商类型">
+      <el-form-item label="服务商分类:" prop="insiderFlag">
+        <el-select v-model="formLabelAlign.insiderFlag" placeholder="请选择服务商分类">
           <el-option
-            v-for="i in serviceCategoryList"
+            v-for="i in insiderFlagList"
             :key="i.id"
             :label="i.value"
             :value="i.id"
@@ -60,6 +70,14 @@
           oninput="value=value.replace(/[^\d]/g, '')"
         />
       </el-form-item>
+      <template v-if="editType === 'add'">
+        <el-form-item label="登录密码:" prop="password">
+          <el-input v-model="formLabelAlign.password" placeholder="请输入登录密码" />
+        </el-form-item>
+        <el-form-item label="确认密码:" prop="confirmPassword">
+          <el-input v-model="formLabelAlign.confirmPassword" placeholder="请确认登录密码" />
+        </el-form-item>
+      </template>
       <el-form-item label="简介图:" prop="textRelateds">
         <image-upload
           :limit="6"
@@ -76,7 +94,7 @@
           placeholder="请输入内容"
         />
       </el-form-item>
-      <el-form-item v-if="id" label="资格证书:">
+      <el-form-item v-if="serviceProvidersId" label="资格证书:">
         <el-image style="width: 200px;" :src="qualificationImage" :preview-src-list="[qualificationImage]" />
       </el-form-item>
       <el-form-item label="资料上传:" prop="infoRelateds">
@@ -91,7 +109,7 @@
           @remove="handleRemove($event, 'infoRelateds')"
         />
       </el-form-item>
-      <div v-if="!id">
+      <template v-if="!serviceProvidersId">
         <el-form-item label="合同:">
           (由于是添加新服务商,必须添加合同,后续可去合同列表编辑及添加)
         </el-form-item>
@@ -124,7 +142,7 @@
             @remove="contractHandleRemove($event)"
           />
         </el-form-item>
-      </div>
+      </template>
       <el-form-item>
         <el-button type="primary" @click="submitForm('formLabelAlign')">保存</el-button>
         <el-button @click="$router.back()">返回</el-button>
@@ -151,9 +169,21 @@ export default {
   },
   mixins: [serviceMixin],
   data() {
+    // 自定义密码一致性验证规则
+    const validateConfirmPassword = (rule, value, callback) => {
+      if (value !== this.formLabelAlign.password) {
+        callback(new Error('两次输入的密码不一致!'))
+      } else {
+        callback()
+      }
+    }
     return {
+      editType: 'add',
       formLabelAlign: {
         address: '',
+        serviceLevel: '',
+        insiderFlag: '',
+        serviceCategory: '',
         brandName: '',
         infoRelateds: [],
         area: [],
@@ -174,15 +204,23 @@ export default {
         ],
         brandName: [{ required: true, message: '请输入服务商品牌', trigger: 'blur' }],
         address: [{ required: true, message: '请输入地址', trigger: 'blur' }],
+        password: [{ required: true, message: '请输入登录密码', trigger: 'blur' }],
+        confirmPassword: [
+          { required: true, message: '请再次输入密码', trigger: 'blur' },
+          { validator: validateConfirmPassword, trigger: 'blur' } // 使用自定义校验器
+        ],
         serviceLevel: [
           { required: true, message: '请选择服务商级别', trigger: 'change' }
         ],
-        //splitCode: [{ required: true, message: '请输入联系服务商分账号', trigger: 'blur' }],
+        // splitCode: [{ required: true, message: '请输入联系服务商分账号', trigger: 'blur' }],
         mobile: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
         linkMan: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
         serviceCategory: [
           { required: true, message: '请选择服务商类型', trigger: 'change' }
         ],
+        insiderFlag: [
+          { required: true, message: '请选择服务商分类', trigger: 'change' }
+        ],
         textRelateds: [{ required: true, message: '请上传简介图', trigger: 'change' }],
         contract: {
           contractId: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
@@ -201,8 +239,8 @@ export default {
   },
   computed: {
     ...mapGetters(['userId', 'username', 'fullName', 'phone']),
-    id() {
-      return this.$route.query.id || false
+    serviceProvidersId() {
+      return this.$route.query.serviceProviderId || false
     },
     cascaderPlaceholder() {
       return this.cascaderDisplay ? this.formLabelAlign.address : '请选择所在区域'
@@ -230,18 +268,19 @@ export default {
     }
   },
   mounted() {
-    if (this.id) {
+    if (this.serviceProvidersId) {
+      this.editType = this.$route.query.type || 'edit'
       this.getInfo()
     }
   },
   methods: {
     async getInfo() {
-      const { data } = await getProviderDetail({ providersId: this.id })
+      const { data } = await getProviderDetail({ serviceProvidersId: this.serviceProvidersId })
       this.formLabelAlign = data
       this.infoList = data.infoRelateds.map((e, i) => ({ name: e.fileName, response: { data: e.image }}))
       this.textRelateds = data.textRelateds.map((e, i) => ({ uid: i, url: e.image }))
-      this.formLabelAlign.area = data.address.split('/').map(e => e.trim())
       this.qualificationImage = data.qualificationImage
+      this.formLabelAlign.area = data.address.split('/').map(e => e.trim())
     },
     // 地区选择
     handleChange($event) {
@@ -255,22 +294,34 @@ export default {
     contractHandleRemove($event) {
       this.formLabelAlign.contract.contractRelateds = $event.fileList.map(e => ({ image: e.response?.data || '', fileName: e.name }))
     },
+    // 提交保存
     submitForm(form) {
-      console.log(this.formLabelAlign)
       this.$refs[form].validate(async(valid) => {
         if (valid) {
-          try {
-            delete this.formLabelAlign.area
-            const form = Object.assign(this.formLabelAlign, { createBy: this.fullName })
-            await addProvider(form)
-            this.$message({ type: 'success', message: '添加成功' })
-            this.$router.back()
-          } catch (e) {
-            console.warn(e)
-          }
+          this.$confirm('是否提交保存数据?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            console.log('formLabelAlign', this.formLabelAlign)
+            this.addProvider(this.formLabelAlign)
+          })
         }
       })
     },
+    // 保存
+    async addProvider(params) {
+      try {
+        delete params.area
+        delete params.confirmPassword
+        const form = Object.assign(params, { createBy: this.fullName })
+        await addProvider(form)
+        this.$notify.success({ title: '保存成功~', message: '' })
+        this.$router.back()
+      } catch (e) {
+        console.warn(e)
+      }
+    },
     beforeUpload(file) {
       console.log(file)
       if (file.size / 1024 / 1024 < 50) {

+ 122 - 58
src/views/serviceSettlement/list/index.vue

@@ -6,7 +6,7 @@
         <span>服务商名称:</span>
         <el-input
           v-model="listQuery.name"
-          placeholder="关键词"
+          placeholder="服务商名称"
           clearable
           @keyup.enter.native="getList"
           @clear="getList"
@@ -39,7 +39,7 @@
         <span>资格证书编号:</span>
         <el-input
           v-model="listQuery.qualificationId"
-          placeholder="关键词"
+          placeholder="资格证书编号"
           clearable
           @keyup.enter.native="getList"
           @clear="getList"
@@ -61,7 +61,6 @@
       <div class="filter-control">
         <el-button type="primary" @click="getList">查询</el-button>
         <el-button type="primary" @click="$router.push('/service/settlement/edit')">添加</el-button>
-        <el-button type="primary" @click="batchOffline(3)">下线</el-button>
         <el-button type="primary" @click="batchOffline(1)">下载资格证书</el-button>
         <el-button type="primary" @click="batchOffline(2)">下载二维码</el-button>
       </div>
@@ -73,79 +72,86 @@
       :data="list"
       border
       :default-sort="{ prop: 'frequency', order: 'descending' }"
-      @selection-change="handleSelectionChange"
     >
-      <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column
-        label="序号"
-        type="index"
-        sortable="custom"
-        align="center"
-        width="50"
-      />
+      <el-table-column prop="serviceProviderId" label="ID" align="center" width="60" />
       <el-table-column prop="name" label="服务商名称" align="center" />
-      <el-table-column prop="serviceLevel" label="服务商级别" align="center">
+      <el-table-column prop="mobile" label="手机号" align="center" width="120" />
+      <el-table-column prop="insiderFlag" label="服务商分类" align="center" width="120">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.insiderFlag === 1" type="info" size="mini">外部服务商</el-tag>
+          <el-tag v-else type="primary" size="mini">内部服务商</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="serviceLevel" label="服务商级别" align="center" width="120">
         <template slot-scope="{ row }">
-          <el-tag v-if="row.serviceLevel === 1" type="success" effect="dark" size="mini">一级</el-tag>
-          <el-tag v-if="row.serviceLevel === 2" type="success" effect="dark" size="mini">二级</el-tag>
-          <el-tag v-if="row.serviceLevel === 3" type="success" effect="dark" size="mini">三级</el-tag>
-          <el-tag v-if="row.serviceLevel === 4" type="success" effect="dark" size="mini">品牌特约</el-tag>
-          <el-tag v-if="row.serviceLevel === 5" type="success" effect="dark" size="mini">品牌指定</el-tag>
+          <el-tag v-if="row.serviceLevel === 1" type="success" size="mini">一级</el-tag>
+          <el-tag v-if="row.serviceLevel === 2" type="success" size="mini">二级</el-tag>
+          <el-tag v-if="row.serviceLevel === 3" type="success" size="mini">三级</el-tag>
+          <el-tag v-if="row.serviceLevel === 4" type="success" size="mini">品牌特约</el-tag>
+          <el-tag v-if="row.serviceLevel === 5" type="success" size="mini">品牌指定</el-tag>
         </template>
       </el-table-column>
-      <el-table-column prop="serviceCategory" label="服务商类型" align="center">
+      <el-table-column prop="serviceCategory" label="服务商类型" align="center" width="120">
         <template slot-scope="scope">
           <div>
             {{ scope.row.serviceCategory == "1" ? "个人" : "企业" }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="serviceCategory" label="服务商分账号" align="center">
+      <el-table-column prop="serviceCategory" label="服务商分账号" align="center" width="120">
         <template slot-scope="{ row }">
           <div>
             {{ row.splitCode ? row.splitCode : "--" }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="contractStartDate" label="授权起始日期" align="center" />
-      <el-table-column prop="contractEndDate" label="授权截止日期" align="center" />
-      <el-table-column prop="status" label="状态" align="center" width="100">
-        <template slot-scope="scope">
-          <div>
-            已{{ scope.row.status === 90 ? "上线" : "下线" }}
-          </div>
+      <el-table-column prop="contractStartDate" label="授权起始日期" align="center" width="120" />
+      <el-table-column prop="contractEndDate" label="授权截止日期" align="center" width="120" />
+      <el-table-column prop="status" label="状态" align="center" width="140">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.status === 90" type="success" size="small">已上线</el-tag>
+          <el-tag v-else type="danger" size="small">已下线</el-tag>
+          <el-button v-if="row.status === 91" type="primary" size="mini" @click="handleStatus({ serviceProviderId: row.serviceProviderId, status: row.status })">
+            上线
+          </el-button>
+          <el-button v-else type="primary" size="mini" @click="handleStatus({ serviceProviderId: row.serviceProviderId, status: row.status })">
+            下线
+          </el-button>
         </template>
       </el-table-column>
-      <el-table-column prop="updateTime" label="添加时间" align="center" />
-      <el-table-column prop="createBy" label="创建人" align="center" />
-      <el-table-column label="操作" align="center" width="200">
+      <el-table-column prop="addTime" label="添加时间" align="center" width="100" />
+      <el-table-column prop="createBy" label="创建人" align="center" width="100" />
+      <el-table-column label="操作" align="center" width="300">
         <template slot-scope="{ row }">
           <div class="labelCenter">
             <el-button
-              type="primary"
+              type="success"
               size="mini"
-              @click="handleStatus({ userIds: row.userId, status: row.status })"
-            >{{ row.status === 91 ? "上线" : "下线" }}</el-button>
+              @click="$router.push('/service/settlement/edit?type=edit&serviceProviderId=' + row.serviceProviderId)"
+            >编辑</el-button>
+            <el-button type="success" size="mini" @click="showQrCode(row)">二维码</el-button>
             <el-button
-              type="primary"
+              type="success"
               size="mini"
-              @click="$router.push('/service/settlement/edit?id=' + row.id)"
-            >编辑</el-button>
-            <el-button type="primary" size="mini" @click="showQrCode(row)">二维码</el-button>
+              @click="$router.push('/service/settlement/club/list?serviceProviderId=' + row.serviceProviderId)"
+            >
+              机构详情
+            </el-button>
             <el-button
               type="primary"
               size="mini"
-              @click="
-                $router.push('/service/settlement/contract/list?providersId=' + row.id)
-              "
-            >合同管理</el-button>
+              @click="$router.push('/service/settlement/contract/list?serviceProviderId=' + row.serviceProviderId)"
+            >
+              合同管理
+            </el-button>
             <el-button
               type="primary"
               size="mini"
-              @click="
-                $router.push('/service/settlement/goods/list?providersId=' + row.id)
-              "
-            >商品管理</el-button>
+              @click="$router.push('/service/settlement/goods/list?serviceProviderId=' + row.serviceProviderId)"
+            >
+              商品管理
+            </el-button>
+            <el-button type="danger" size="mini" @click="handleChangePassword(row)">重置密码</el-button>
           </div>
         </template>
       </el-table-column>
@@ -158,14 +164,28 @@
       @showQrCode="showQrCode"
     />
 
-    <el-dialog title="选择服务商" :visible.sync="exportDialogVisible" width="70%">
+    <el-dialog title="选择服务商" :visible.sync="exportDialogVisible" width="70%" top="8vh">
       <service-list-selector
         v-if="exportDialogVisible"
         @cancel="onSelectorCancel"
         @confirm="onSelectorConfirm"
       />
     </el-dialog>
-
+    <!-- 重置密码 -->
+    <el-dialog title="重置密码" :visible.sync="dialogFormVisible" width="440px">
+      <el-form ref="dataForm" :rules="rules" :model="form" label-position="right" label-width="100px">
+        <el-form-item label="新密码:" prop="password">
+          <el-input v-model="form.password" type="text" placeholder="请输入新密码" maxlength="20" />
+        </el-form-item>
+        <el-form-item label="确认新密码:" prop="confirmPassword">
+          <el-input v-model="form.confirmPassword" type="text" placeholder="请再次确认新密码" maxlength="20" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" @click="handleSavePassword">确定</el-button>
+      </div>
+    </el-dialog>
     <!-- 页码 -->
     <pagination
       :total="total"
@@ -179,7 +199,7 @@
 <script>
 import QrCode from '../components/CmQrcode/index.vue'
 import ServiceListSelector from '../components/ServiceListSelector.vue'
-import { getProviderList, updatedStatus } from '@/api/serviceSettlement/service'
+import { getProviderList, updatedStatus, updatePassword } from '@/api/serviceSettlement/service'
 import serviceMixin from '../mixin/index'
 
 export default {
@@ -189,10 +209,20 @@ export default {
   },
   mixins: [serviceMixin],
   data() {
+    // 自定义密码一致性验证规则
+    const validateConfirmPassword = (rule, value, callback) => {
+      if (value !== this.form.password) {
+        callback(new Error('两次输入的密码不一致!'))
+      } else {
+        callback()
+      }
+    }
     return {
       listQuery: {
         pageNum: 1,
         pageSize: 10,
+        name: '',
+        qualificationId: '',
         serviceCategory: '',
         serviceLevel: ''
       },
@@ -204,7 +234,20 @@ export default {
       indexMethod: 1,
       total: 0,
       selectType: 0,
-      providerItem: {}
+      providerItem: {},
+      dialogFormVisible: false,
+      form: {
+        id: '',
+        password: '', // 新密码
+        confirmPassword: '' // 确认新密码
+      },
+      rules: {
+        password: [{ required: true, message: '请输入新密码', trigger: 'blur' }],
+        confirmPassword: [
+          { required: true, message: '请再次输入新密码', trigger: 'blur' },
+          { validator: validateConfirmPassword, trigger: 'blur' } // 使用自定义校验器
+        ]
+      }
     }
   },
   mounted() {
@@ -215,7 +258,7 @@ export default {
       const form = Object.assign(this.listQuery, {
         contractStartDate: obj ? obj[0] : '',
         contractEndDate: obj ? obj[1] : '',
-        providersId: this.providersId || ''
+        serviceProviderId: this.serviceProviderId || ''
       })
       const { data } = await getProviderList(form)
       this.list = data.results
@@ -232,7 +275,6 @@ export default {
       this.selectType = type
       this.exportDialogVisible = true
     },
-    handleSelectionChange() {},
     async handleStatus($event) {
       this.$confirm(`是否${$event.status === 91 ? '上线' : '下线'}该服务商?`, '提示', {
         confirmButtonText: '确定',
@@ -241,14 +283,11 @@ export default {
       }).then(async() => {
         try {
           const data = await updatedStatus({
-            userIds: $event.userIds,
+            serviceProviderId: $event.serviceProviderId,
             status: $event.status === 91 ? 90 : 91
           })
           if (data.code === 0) {
-            this.$message({
-              message: '更新成功',
-              type: 'success'
-            })
+            this.$notify.success({ title: '操作成功~', message: '' })
             this.getList()
           }
         } catch (error) {
@@ -256,6 +295,31 @@ export default {
         }
       })
     },
+    // 重置密码
+    handleChangePassword(row) {
+      this.form = { ...this.form, ...row }
+      this.dialogFormVisible = true
+    },
+    // 保存重置新密码
+    async handleSavePassword() {
+      try {
+        await this.$refs.dataForm.validate()
+        this.updatePassword(this.form)
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 重置密码
+    async updatePassword(params) {
+      await updatePassword(params)
+      this.$notify.success({ title: '重置密码成功~', message: '' })
+      this.closeDialog()
+    },
+    // 添加取消
+    closeDialog() {
+      this.$refs.dataForm.resetFields()
+      this.dialogFormVisible = false
+    },
     onSelectorCancel() {
       this.exportDialogVisible = false
     },
@@ -288,7 +352,7 @@ export default {
       const toSelect = {
         3: () =>
           this.handleStatus({
-            userIds: $event.map((e) => e.userId).join(','),
+            serviceProviderId: $event.map((e) => e.userId).join(','),
             status: 90
           }),
         1: () =>
@@ -312,7 +376,7 @@ export default {
 .labelCenter {
   display: grid;
   grid-template-rows: repeat(2, 1fr);
-  grid-template-columns: repeat(2, 1fr);
+  grid-template-columns: repeat(3, 1fr);
   grid-gap: 10px;
   .el-button {
     width: 80px;

+ 1 - 0
src/views/serviceSettlement/mixin/index.js

@@ -11,6 +11,7 @@ export default {
         { id: 4, value: '品牌特约' },
         { id: 5, value: '品牌指定' }
       ],
+      insiderFlagList: [{ id: '', value: '请选择' }, { id: 0, value: '内部服务商' }, { id: 1, value: '外部服务商' }],
       serviceCategoryList: [{ id: '', value: '请选择' }, { id: 1, value: '个人' }, { id: 2, value: '企业' }]
     }
   },

+ 185 - 0
src/views/serviceSettlement/task/edit.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="app-container">
+    <el-form
+      ref="form"
+      label-width="120px"
+      :model="form"
+      :rules="rules"
+    >
+      <el-form-item label="推广任务标题:" prop="title">
+        <el-input v-model="form.title" placeholder="请输入推广标题" maxlength="50" style="width: 630px;" />
+      </el-form-item>
+      <el-form-item label="推广关联商品:" prop="productId">
+        <store-item v-if="selectStore" :select-store="selectStore" />
+        <el-button type="primary" @click="handleAddPros">{{ selectStore ? '选择商品' : '关联商品' }}</el-button>
+      </el-form-item>
+      <el-form-item label="推广任务赏金:" prop="reward">
+        <el-input v-model="form.reward" placeholder="请输入推广任务赏金" maxlength="5" style="width: 220px;">
+          <template slot="append">元</template>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="推广起始日期:" prop="startTime">
+        <el-date-picker
+          v-model="form.startTime"
+          type="datetime"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="选择日期"
+        />
+      </el-form-item>
+      <el-form-item label="推广截止日期:" prop="endTime">
+        <el-date-picker
+          v-model="form.endTime"
+          type="datetime"
+          placeholder="选择日期"
+          value-format="yyyy-MM-dd HH:mm:ss"
+        />
+      </el-form-item>
+      <el-form-item label="推广任务封面:" prop="topPic">
+        <image-upload
+          :limit="1"
+          :image-list="fileList"
+          @success="handleImageSuccess($event, 'textRelateds')"
+          @remove="handleImageRemove($event, 'textRelateds')"
+        />
+      </el-form-item>
+      <el-form-item label="推广任务内容:" prop="content">
+        <editor-input v-model="form.content" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="submitForm('form')">保存</el-button>
+        <el-button @click="$router.back()">返回</el-button>
+      </el-form-item>
+    </el-form>
+    <!--  选择商品弹窗 -->
+    <goods-dialog v-if="goodsDialogVisible" ref="goodsDialog" @confirm="handleAddGoodsConfirm" @cancel="handleCancel" />
+  </div>
+</template>
+
+<script>
+import ImageUpload from '@/components/UploadImage/index.vue'
+import GoodsDialog from '../components/task-goods-dialog.vue'
+import StoreItem from '../components/task-Item.vue'
+import EditorInput from '@/components/Editor/index.vue'
+import { addTask, getTaskDetail } from '@/api/serviceSettlement/task'
+import { mapGetters } from 'vuex'
+
+export default {
+  components: {
+    ImageUpload,
+    GoodsDialog,
+    StoreItem,
+    EditorInput
+  },
+  data() {
+    return {
+      editType: 'add',
+      selectStore: null,
+      goodsDialogVisible: false,
+      fileList: [],
+      form: {
+        title: '', // 推广标题
+        reward: '', // 推广赏金
+        productId: '', // 关联商品Id
+        shopId: '', // 供应商Id
+        topPic: '', // 宣传封面
+        startTime: '', // 开始时间
+        endTime: '', // 结束时间
+        content: '' // 文本内容
+      },
+      rules: {
+        title: [{ required: true, message: '请输入推广标题', trigger: 'blur' }],
+        reward: [{ required: true, message: '请设置推广赏金', trigger: 'blur' }],
+        topPic: [{ required: true, message: '请上传封面图', trigger: 'blur' }],
+        productId: [{ required: true, message: '请选择商品', trigger: 'blur' }],
+        startTime: [
+          { required: true, message: '请选择推广起始时间', trigger: 'change' }
+        ],
+        endTime: [
+          { required: true, message: '请选择推广结束时间', trigger: 'change' }
+        ],
+        content: [{ required: true, message: '请添加推广内容', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['userId', 'username', 'fullName', 'phone']),
+    taskId() {
+      return this.$route.query.taskId || false
+    }
+  },
+  mounted() {
+    this.editType = this.$route.query.type || 'edit'
+    if (this.taskId) {
+      this.getInfo()
+    }
+  },
+  methods: {
+    async getInfo() {
+      const { data } = await getTaskDetail({ taskId: this.taskId })
+      this.form = data
+      const file = { uid: data.id, url: data.topPic }
+      this.fileList.push(file)
+    },
+    // 确认选择商品
+    handleAddGoodsConfirm(data) {
+      console.log('data', data[0])
+      const vForm = {
+        productId: data[0].productId,
+        shopId: data[0].shopId
+      }
+      this.form = Object.assign(this.form, vForm)
+      this.selectStore = data[0]
+      this.goodsDialogVisible = false
+    },
+    // 添加商品
+    handleAddPros() {
+      this.goodsDialogVisible = true
+    },
+    // 取消选择供商品
+    handleCancel() {
+      this.goodsDialogVisible = false
+      this.$refs.goodsDialog.visible = false
+    },
+    // 提交保存
+    submitForm(form) {
+      this.$refs[form].validate(async(valid) => {
+        if (valid) {
+          this.$confirm('是否提交保存数据?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            console.log('form', this.form)
+            this.addTask(this.form)
+          })
+        }
+      })
+    },
+    // 保存推广
+    async addTask(params) {
+      this.btnLoading = true
+      await addTask(params)
+      this.$notify.success({ title: '添加推广成功~', message: '' })
+      this.$router.back()
+    },
+    handleImageSuccess(file) {
+      console.log(file)
+      this.form.topPic = file.response.data
+    },
+    handleImageRemove(file) {
+      console.log(file)
+      this.form.topPic = ''
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-textarea__inner {
+  width: 500px;
+}
+::v-deep .el-form {
+  width: 750px;
+  margin: 0 auto;
+}
+</style>

+ 41 - 234
src/views/serviceSettlement/task/index.vue

@@ -5,65 +5,16 @@
       <div class="filter-control">
         <span>服务商名称:</span>
         <el-input
-          v-model="listQuery.name"
-          placeholder="关键词"
+          v-model="listQuery.shopName"
+          placeholder="供应商商名称"
           clearable
           @keyup.enter.native="getList"
           @clear="getList"
         />
       </div>
-      <div class="filter-control">
-        <span>服务商级别:</span>
-        <el-select v-model="listQuery.serviceLevel" placeholder="请选择服务商级别" @change="getList">
-          <el-option
-            v-for="(i, index) in serviceLevel"
-            :key="index"
-            :label="i.value"
-            :value="i.id"
-          />
-        </el-select>
-      </div>
-      <div class="filter-control">
-        <span>服务商类型:</span>
-        <el-select v-model="listQuery.serviceCategory" placeholder="服务商类型" @change="getList">
-          <el-option
-            v-for="(i, index) in serviceCategoryList"
-            :key="index"
-            :label="i.value"
-            :value="i.id"
-            @change="getList"
-          />
-        </el-select>
-      </div>
-      <div class="filter-control">
-        <span>资格证书编号:</span>
-        <el-input
-          v-model="listQuery.qualificationId"
-          placeholder="关键词"
-          clearable
-          @keyup.enter.native="getList"
-          @clear="getList"
-        />
-      </div>
-      <div class="filter-control">
-        <span>授权起止日期:</span>
-        <el-date-picker
-          v-model="time"
-          type="daterange"
-          unlink-panels
-          range-separator="至"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          value-format="yyyy-MM-dd"
-          @change="getList"
-        />
-      </div>
       <div class="filter-control">
         <el-button type="primary" @click="getList">查询</el-button>
-        <el-button type="primary" @click="$router.push('/service/settlement/edit')">添加</el-button>
-        <el-button type="primary" @click="batchOffline(3)">下线</el-button>
-        <el-button type="primary" @click="batchOffline(1)">下载资格证书</el-button>
-        <el-button type="primary" @click="batchOffline(2)">下载二维码</el-button>
+        <el-button type="primary" @click="$router.push('/service/task/edit')">添加推广任务</el-button>
       </div>
     </div>
 
@@ -71,238 +22,95 @@
       ref="table"
       v-loading="isLoading"
       :data="list"
+      height="660"
       border
       :default-sort="{ prop: 'frequency', order: 'descending' }"
-      @selection-change="handleSelectionChange"
     >
-      <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column
-        label="序号"
-        type="index"
-        sortable="custom"
-        align="center"
-        width="50"
-      />
-      <el-table-column prop="name" label="服务商名称" align="center" />
-      <el-table-column prop="serviceLevel" label="服务商级别" align="center">
-        <template slot-scope="{ row }">
-          <el-tag v-if="row.serviceLevel === 1" type="success" effect="dark" size="mini">一级</el-tag>
-          <el-tag v-if="row.serviceLevel === 2" type="success" effect="dark" size="mini">二级</el-tag>
-          <el-tag v-if="row.serviceLevel === 3" type="success" effect="dark" size="mini">三级</el-tag>
-          <el-tag v-if="row.serviceLevel === 4" type="success" effect="dark" size="mini">品牌特约</el-tag>
-          <el-tag v-if="row.serviceLevel === 5" type="success" effect="dark" size="mini">品牌指定</el-tag>
-        </template>
+      <el-table-column label="序号" align="center" width="50">
+        <template slot-scope="scope">{{ scope.$index + 1 }}</template>
       </el-table-column>
-      <el-table-column prop="serviceCategory" label="服务商类型" align="center">
-        <template slot-scope="scope">
-          <div>
-            {{ scope.row.serviceCategory == "1" ? "个人" : "企业" }}
-          </div>
-        </template>
-      </el-table-column>
-      <el-table-column prop="serviceCategory" label="服务商分账号" align="center">
+      <el-table-column prop="title" label="推广标题" align="center" />
+      <el-table-column prop="reward" label="推广赏金" align="center">
         <template slot-scope="{ row }">
-          <div>
-            {{ row.splitCode ? row.splitCode : "--" }}
-          </div>
+          {{ row.reward }}元
         </template>
       </el-table-column>
-      <el-table-column prop="contractStartDate" label="授权起始日期" align="center" />
-      <el-table-column prop="contractEndDate" label="授权截止日期" align="center" />
-      <el-table-column prop="status" label="状态" align="center" width="100">
-        <template slot-scope="scope">
-          <div>
-            已{{ scope.row.status === 90 ? "上线" : "下线" }}
-          </div>
+      <el-table-column prop="topPic" label="推广封面" align="center" width="120">
+        <template slot-scope="{ row }">
+          <img v-if="row.topPic" :src="row.topPic" alt="" style="width: 50px; height: 50px" />
+          <span v-else>---</span>
         </template>
       </el-table-column>
-      <el-table-column prop="updateTime" label="添加时间" align="center" />
-      <el-table-column prop="createBy" label="创建人" align="center" />
+      <el-table-column prop="shopName" label="关联供应商" align="center" />
+      <el-table-column prop="startTime" label="任务起始日期" align="center" />
+      <el-table-column prop="endTime" label="任务截止日期" align="center" />
+      <el-table-column prop="addTime" label="添加时间" align="center" />
       <el-table-column label="操作" align="center" width="200">
         <template slot-scope="{ row }">
           <div class="labelCenter">
             <el-button
-              type="primary"
-              size="mini"
-              @click="handleStatus({ userIds: row.userId, status: row.status })"
-            >{{ row.status === 91 ? "上线" : "下线" }}</el-button>
-            <el-button
-              type="primary"
+              type="success"
               size="mini"
-              @click="$router.push('/service/settlement/edit?id=' + row.id)"
+              @click="$router.push('/service/task/edit?type=edit&taskId=' + row.id)"
             >编辑</el-button>
-            <el-button type="primary" size="mini" @click="showQrCode(row)">二维码</el-button>
             <el-button
               type="primary"
               size="mini"
-              @click="
-                $router.push('/service/settlement/contract/list?providersId=' + row.id)
-              "
-            >合同管理</el-button>
-            <el-button
-              type="primary"
-              size="mini"
-              @click="
-                $router.push('/service/settlement/goods/list?providersId=' + row.id)
-              "
-            >商品管理</el-button>
+              @click="$router.push('/service/task/task-details?taskId=' + row.id)"
+            >
+              下发服务商
+            </el-button>
           </div>
         </template>
       </el-table-column>
     </el-table>
-
-    <qr-code
-      ref="qrCode"
-      :item-obj="providerItem"
-      :show-qr-code="showQrImag"
-      @showQrCode="showQrCode"
-    />
-
-    <el-dialog title="选择服务商" :visible.sync="exportDialogVisible" width="70%">
-      <service-list-selector
-        v-if="exportDialogVisible"
-        @cancel="onSelectorCancel"
-        @confirm="onSelectorConfirm"
-      />
-    </el-dialog>
-
     <!-- 页码 -->
     <pagination
       :total="total"
       :page.sync="listQuery.pageNum"
       :limit.sync="listQuery.pageSize"
-      @pagination="getList"
+      @pagination="getTaskList"
     />
   </div>
 </template>
 
 <script>
-import QrCode from '../components/CmQrcode/index.vue'
-import ServiceListSelector from '../components/ServiceListSelector.vue'
-import { getProviderList, updatedStatus } from '@/api/serviceSettlement/service'
-import serviceMixin from '../mixin/index'
+import { getTaskList } from '@/api/serviceSettlement/task'
 
 export default {
-  components: {
-    QrCode,
-    ServiceListSelector
-  },
-  mixins: [serviceMixin],
   data() {
     return {
       listQuery: {
         pageNum: 1,
         pageSize: 10,
-        serviceCategory: '',
-        serviceLevel: ''
+        shopName: ''
       },
-      time: '',
-      showQrImag: false,
       isLoading: false,
-      exportDialogVisible: false,
       list: [],
-      indexMethod: 1,
-      total: 0,
-      selectType: 0,
-      providerItem: {}
+      total: 0
     }
   },
   mounted() {
     this.getList()
   },
   methods: {
-    async getList(obj) {
-      const form = Object.assign(this.listQuery, {
-        contractStartDate: obj ? obj[0] : '',
-        contractEndDate: obj ? obj[1] : '',
-        providersId: this.providersId || ''
-      })
-      const { data } = await getProviderList(form)
-      this.list = data.results
-      this.total = data.totalRecord
-    },
-    showQrCode($event) {
-      if ($event) {
-        this.providerItem = $event
-      }
-      this.showQrImag = !this.showQrImag
+    // 获取行为记录列表
+    getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getTaskList()
     },
-    // 批量下线
-    batchOffline(type) {
-      this.selectType = type
-      this.exportDialogVisible = true
-    },
-    handleSelectionChange() {},
-    async handleStatus($event) {
-      this.$confirm(`是否${$event.status === 91 ? '上线' : '下线'}该服务商?`, '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(async() => {
-        try {
-          const data = await updatedStatus({
-            userIds: $event.userIds,
-            status: $event.status === 91 ? 90 : 91
-          })
-          if (data.code === 0) {
-            this.$message({
-              message: '更新成功',
-              type: 'success'
-            })
-            this.getList()
-          }
-        } catch (error) {
-          console.log(error)
-        }
-      })
-    },
-    onSelectorCancel() {
-      this.exportDialogVisible = false
-    },
-    downLoadImage(options) {
+    // 获取服务商商品列表
+    async getTaskList() {
       try {
-        this.$confirm('是否下载所选的内容?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(async() => {
-          this.isLoading = true
-          // 使用a链接下载
-          const downUrl = `${process.env.VUE_APP_BASE_API}/providers/download/image?ids=${options.ids}&type=${options.type}`
-          const confirmText = options.type === 1 ? '服务商资格证书' : '服务商二维码'
-          this.downloadWithUrl(downUrl, confirmText)
-            .catch((err) => {
-              console.log(err)
-              this.$message.error(`下载${confirmText}失败`)
-            })
-            .finally(() => {
-              this.isLoading = false
-            })
-        })
+        this.isLoading = true
+        const res = await getTaskList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
       } catch (error) {
         console.log(error)
       }
-    },
-    onSelectorConfirm($event) {
-      this.exportDialogVisible = false
-      const toSelect = {
-        3: () =>
-          this.handleStatus({
-            userIds: $event.map((e) => e.userId).join(','),
-            status: 90
-          }),
-        1: () =>
-          this.downLoadImage({
-            ids: $event.map((e) => e.id).join(','),
-            type: this.selectType
-          }),
-        2: () =>
-          this.downLoadImage({
-            ids: $event.map((e) => e.id).join(','),
-            type: this.selectType
-          })
-      }
-      toSelect[this.selectType]()
     }
   }
 }
@@ -311,12 +119,11 @@ export default {
 <style lang="scss" scoped>
 .labelCenter {
   display: grid;
-  grid-template-rows: repeat(2, 1fr);
+  grid-template-rows: repeat(1, 1fr);
   grid-template-columns: repeat(2, 1fr);
   grid-gap: 10px;
   .el-button {
-    width: 80px;
-    margin-left: 0;
+    margin: 0px;
   }
 }
 </style>

+ 257 - 0
src/views/serviceSettlement/task/task-details.vue

@@ -0,0 +1,257 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>服务商名称:</span>
+        <el-input
+          v-model="listQuery.name"
+          placeholder="服务商名称"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input
+          v-model="listQuery.bindMobile"
+          placeholder="手机号"
+          maxlength="11"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+        <el-button type="primary" @click="dialogFormVisible = true"> 分配服务商 </el-button>
+      </div>
+    </div>
+    <!-- 列表 -->
+    <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="660">
+      <el-table-column prop="serviceProviderId" fixed label="服务商ID" align="center" width="80" />
+      <el-table-column prop="name" fixed label="服务商名称" align="center" />
+      <el-table-column prop="mobile" label="手机号" align="center">
+        <template slot-scope="{ row }">
+          {{ row.mobile ? row.mobile : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="auditStatus" label="任务状态" align="center" width="120">
+        <template slot-scope="{ row }">
+          <template v-if="row.receiveFlag === 1">
+            <el-tag v-if="row.auditStatus === 0" type="info" size="small">已领取</el-tag>
+            <el-tag v-if="row.auditStatus === 1" type="warning" size="small">待审核</el-tag>
+            <el-tag v-if="row.auditStatus === 2" type="success" size="small">审核通过</el-tag>
+            <el-tag v-if="row.auditStatus === 3" type="danger" size="small">审核未通过</el-tag>
+          </template>
+          <template v-else>
+            <el-tag type="info" size="small">未领取</el-tag>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" width="200">
+        <template slot-scope="{ row }">
+          <el-button v-if="row.auditStatus === 1" v-permission="'task:list:examine'" type="primary" size="mini" @click="handleExamine(row)">审核</el-button>
+          <el-button type="danger" size="mini" @click="handleDelete(row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[10, 20, 30, 100]"
+      :page-size="20"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getTaskProvider"
+    />
+    <!--  选择成员弹窗 -->
+    <task-service-dialog v-if="dialogFormVisible" ref="taskServiceDdialog" @confirm="handleConfirm" @cancel="handleCancel" />
+    <!-- 审核任务完成情况 -->
+    <el-dialog title="审核任务" :visible.sync="dialogVisible" width="700px" top="8vh">
+      <el-form ref="dataForm" label-position="top" label-width="120px" style="height: 600px;overflow-y: scroll;">
+        <el-form-item label="推广截图:">
+          <div class="block">
+            <el-image v-for="(item, index) in taskInfo.images" :key="index" :src="item" />
+          </div>
+        </el-form-item>
+        <el-form-item v-if="taskInfo.taskDesc" label="备注:">
+          <p v-text="taskInfo.taskDesc"></p>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="danger" @click="handleAudit(3)"> 审核不通过 </el-button>
+        <el-button type="primary" @click="handleAudit(2)"> 审核通过 </el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getTaskProvider, assignTask, taskProviderDel, getTaskaAudit } from '@/api/serviceSettlement/task'
+import TaskServiceDialog from '../components/task-service-dialog'
+export default {
+  name: 'TaskDetails',
+  components: { TaskServiceDialog },
+  filters: {},
+  data() {
+    return {
+      isLoading: true,
+      time: [],
+      time1: [],
+      listQuery: {
+        taskId: this.$route.query.taskId,
+        pageNum: 1,
+        pageSize: 10
+      },
+      list: [],
+      total: 0,
+      dialogFormVisible: false,
+      renewCustome: {
+        id: '',
+        status: ''
+      },
+      rules: {
+        status: [{ required: true, message: '请设置统计状态', trigger: 'blur' }]
+      },
+      dialogVisible: false,
+      taskInfo: {}
+    }
+  },
+  computed: {
+    taskId() {
+      return this.$route.query.taskId * 1 || 0
+    }
+  },
+  created() {
+    this.getList()
+  },
+  mounted() {},
+  methods: {
+    // 获取行为记录列表
+    getList() {
+      this.list = []
+      this.isLoading = true
+      this.listQuery.pageNum = 1
+      this.getTaskProvider()
+    },
+    // 获取分配服务商列表
+    async getTaskProvider() {
+      try {
+        const res = await getTaskProvider(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 确认选择分配的服务商
+    handleConfirm(data) {
+      console.log('data', data)
+      const serviceProviderIds = []
+      data.forEach((ele) => {
+        serviceProviderIds.push(ele.serviceProviderId)
+      })
+      this.assignTask({ id: this.taskId, serviceProviderIds: serviceProviderIds.join(',') })
+    },
+    // 取消选择选择分配服务商
+    handleCancel() {
+      this.dialogFormVisible = false
+      this.$refs.shopDialog.visible = false
+    },
+    // 确认分配服务商
+    async assignTask(params) {
+      try {
+        await assignTask(params)
+        this.dialogFormVisible = false
+        this.$notify({
+          title: '',
+          message: '分配成功',
+          type: 'success'
+        })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作审核任务
+    handleExamine(row) {
+      this.taskInfo = row
+      this.dialogVisible = true
+    },
+    // 操作审核
+    handleAudit(status) {
+      const params = {
+        auditStatus: status,
+        taskId: this.taskId,
+        serviceProviderId: this.taskInfo.serviceProviderId
+      }
+      this.getTaskaAudit(params)
+    },
+    // 调用审核
+    async getTaskaAudit(params) {
+      try {
+        await getTaskaAudit(params)
+        this.$notify({
+          title: '',
+          message: '操作成功',
+          type: 'success'
+        })
+        this.getList()
+        this.dialogVisible = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作删除服务商
+    async handleDelete(row) {
+      try {
+        await this.$confirm('确定删除该服务商吗?', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        this.taskProviderDel(row)
+      } catch (error) {
+        this.$message.info('已取消删除操作')
+      }
+    },
+    // 调用删除成员
+    async taskProviderDel(row) {
+      try {
+        await taskProviderDel({ serviceProviderId: row.serviceProviderId, taskId: this.taskId })
+        this.$notify({
+          title: '',
+          message: '删除成功',
+          type: 'success'
+        })
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 2 - 3
src/views/user/club-portrait/index.vue

@@ -95,8 +95,7 @@ import ClubDialog from './components/club-dialog.vue'
 import {
   getIns_statistics,
   getIns_orderTrends,
-  getIns_accessStatistics,
-  getCulbDemand
+  getIns_accessStatistics
 } from '@/api/mallPortrait/disitrib'
 
 export default {
@@ -293,7 +292,7 @@ export default {
      * 获取机构需求
      */
     async getCulbDemand(e) {
-      const { data } = await getCulbDemand({
+      const { data } = await getIns_orderTrends({
         startCreateTime: e[0],
         endCreateTime: e[1]
       })

+ 0 - 1
src/views/user/consult/detail.vue

@@ -450,7 +450,6 @@ export default {
 <style>
 .filter-container {
   padding: 10px;
-  background: #f7f7f7;
   margin: 10px 0;
 }
 .span-labels {

+ 0 - 1
src/views/user/consult/list.vue

@@ -587,7 +587,6 @@ export default {
 <style>
 .filter-container {
   padding: 10px;
-  background: #f7f7f7;
   margin: 10px 0;
 }
 .span-labels {

+ 0 - 1
src/views/user/consult/unreg-detail.vue

@@ -403,7 +403,6 @@ export default {
 <style>
 .filter-container {
   padding: 10px;
-  background: #f7f7f7;
   margin: 10px 0;
 }
 .span-labels {