Browse Source

Merge branch 'redUrgent' into testToMerge

qymljy 11 months ago
parent
commit
9a19e16ca2
32 changed files with 2113 additions and 47 deletions
  1. 2 1
      .gitignore
  2. 0 1
      public/index.html
  3. 2 2
      src/HDrpManagement/salerPortrait/index.vue
  4. 265 0
      src/HManagement/actsRecMag/index.vue
  5. 153 0
      src/HManagement/actsRecMag/modules/balanceUpd.vue
  6. 109 0
      src/HManagement/actsRecMag/modules/detailInfo.vue
  7. 208 0
      src/HManagement/actsRecMag/modules/importFile.vue
  8. 5 0
      src/SDrpManagement/agentOrder/modules/productlist.vue
  9. 5 0
      src/SDrpManagement/salerOrder/modules/productlist.vue
  10. 264 0
      src/SManagement/actsRec/index.vue
  11. 109 0
      src/SManagement/actsRec/modules/detailInfo.vue
  12. 2 2
      src/components/attachment_list/index.vue
  13. 4 0
      src/components/dynamic-newTable/index.vue
  14. 19 1
      src/components/export_file/index.vue
  15. 3 2
      src/components/marketingExpenses/index.vue
  16. 8 11
      src/components/newLayout/index.vue
  17. 16 3
      src/components/newLayout/modules/header.vue
  18. 14 2
      src/components/normal-basic-layout-new/details/index.vue
  19. 377 0
      src/components/normal-basic-layout-new/details/modules/followTable/index.vue
  20. 3 2
      src/components/normal-basic-layout-new/details/modules/followUp/editLog.vue
  21. 12 2
      src/components/normal-basic-layout-new/details/modules/followUp/followUp.vue
  22. 11 2
      src/components/normal-basic-layout-new/details/modules/tabs/tab.vue
  23. 13 2
      src/components/normal-basic-layout/details/index.vue
  24. 377 0
      src/components/normal-basic-layout/details/modules/followTable/index.vue
  25. 1 1
      src/components/normal-basic-layout/details/modules/followUp/addLog.vue
  26. 3 2
      src/components/normal-basic-layout/details/modules/followUp/editLog.vue
  27. 13 2
      src/components/normal-basic-layout/details/modules/followUp/followUp.vue
  28. 11 2
      src/components/normal-basic-layout/details/modules/tabs/tab.vue
  29. 10 0
      src/router/HManagement.js
  30. 10 0
      src/router/SManagement.js
  31. 79 0
      src/template/dialogTemplate/normal.vue
  32. 5 7
      src/template/tableMainLayout/index.vue

+ 2 - 1
.gitignore

@@ -1,2 +1,3 @@
 node_modules
-yos
+yos
+package-lock.json

+ 0 - 1
public/index.html

@@ -20,4 +20,3 @@
     <meta http-equiv="pragma" content="no-cache">
   </head>
 </html>
- 

+ 2 - 2
src/HDrpManagement/salerPortrait/index.vue

@@ -43,7 +43,7 @@
           </el-select>
         </div>
         <div class="mt-10" style="margin-right:10px">
-          <label  class="search__label" >{{$t(`范围`)}}:</label>
+          <label  class="search__label" >{{ $t('范围') }}:</label>
           <el-date-picker
               size="small"
               @change="timeChange"
@@ -51,7 +51,7 @@
               v-model="dateSelect"
               type="daterange"
               :range-separator="$t('至')"
-             :start-placeholder="$t('开始日期')"
+              :start-placeholder="$t('开始日期')"
               :end-placeholder="$t('结束日期')"
               clearable>
           </el-date-picker>

+ 265 - 0
src/HManagement/actsRecMag/index.vue

@@ -0,0 +1,265 @@
+<template>
+  <div>
+    <normal-layout style="height: calc(100vh - 125px)">
+      <div slot="titleRight">
+        <exportFile class="inline-16" :param="param" :columns="tablecols" fileName="应收账款" :dataid="param.content.dataid" :custom="true" :point="param.content.point" :dateData="dateData"></exportFile>
+        <balanceUpd class="inline-16" ref="balanceRef" v-if="tool.checkAuth($route.name,'balanceUpdated')"></balanceUpd>
+      </div>
+      <div slot="content">
+        <div class="container">
+          <template>
+            <div class="mt-10 inline-16">
+              <label class="search__label">{{$t('查询方式')}}:</label>
+              <el-select v-model="param.content.point" :placeholder="$t('请选择')" size="small" @change="listData">
+                <el-option :label="$t(`出货`)" value="出货" ></el-option>
+                <el-option :label="$t(`开票`)" value="开票" ></el-option>
+              </el-select>
+            </div>
+            <div class="mt-10 inline-16" style="margin-left: 20px">
+              <departmentSalesperson ref="departmentSalesperson" class="inline-16" @depSelect="depSelect" @personSelect="personSelect" ></departmentSalesperson>
+            </div>
+            <div>
+              <el-row :gutter="20">
+                <el-col :span="6" class="mt-10">
+                  <div class="acccounet__panel" style="border:1px solid #d8dde8">
+                    <p class="normal-margin">{{$t('总应收')}}</p>
+                    <p class="normal-title" style="font-size:29px;color:#151515" >
+                      <small>{{allList.sumtotalamount || allList.sumtotalamount == '0'?'¥':''}}</small>
+                      {{allList.sumtotalamount || allList.sumtotalamount == 0?tool.formatAmount(allList.sumtotalamount,2):'--'}}
+                    </p>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+            <div style="flex:0 1 auto;width: 100%;">
+              <tableMainLayout :layout="tablecols" height="calc(100vh - 410px)" :data="list" fixedName="operation" :width="true" :custom="true"
+                               :headerOptions="['openingbalance','receivableamount','totalamount']">
+                <template v-slot:header="scope">
+                  <div v-if="scope.column.columnname === 'openingbalance'">
+                    {{dateData?'期初余额'+'('+dateData+')':'期初余额(2021-12-31)'}}
+                  </div>
+                  <div v-if="scope.column.columnname == 'receivableamount'">
+                    <div v-if="param.content.point == '出货'">{{$t(`出货总金额(2022-01-01至今)`)}}</div>
+                    <div v-else>{{$t(`开票总金额(2022-01-01至今)`)}}</div>
+                  </div>
+                  <div v-if="scope.column.columnname == 'totalamount'">
+                    <div v-if="param.content.point == '出货'">{{$t(`出货总应收`)}}</div>
+                    <div v-else>{{$t(`开票总应收`)}}</div>
+                  </div>
+                </template>
+                <template v-slot:customcol="scope">
+                  <div v-if="scope.column.columnname === 'openingbalance'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'receivableamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'revenueamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'totalamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?$t(scope.column.data[scope.column.columnname]):'--'}}</p>
+                </template>
+                <template v-slot:opreation="scope">
+                  <detailInfo :data="scope.data" :items="param.content" :point="param.content.point"></detailInfo>
+                </template>
+              </tableMainLayout>
+            </div>
+            <div class="container normal-panel" style="text-align:right">
+              <el-pagination
+                  background
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-sizes="[100, 50, 100, 200]"
+                  :page-size="100"
+                  layout="total,sizes, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </template>
+        </div>
+      </div>
+    </normal-layout>
+  </div>
+</template>
+
+<script>
+import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
+import detailInfo from './modules/detailInfo'
+import exportFile from '@/components/export_file/index'
+import balanceUpd from '../actsRecMag/modules/balanceUpd'
+export default {
+  name: "index",
+  components:{departmentSalesperson,detailInfo,exportFile,balanceUpd},
+  data(){
+    return {
+      value:'全部',
+      options:[],
+      tablecols:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      allList:{},
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+        }
+      },
+      param:{
+        "id": 20241217135703,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "type":"0",//1按部门 0按人员
+          "dataid":JSON.parse(sessionStorage.getItem('active_account')).userid,//部门人员id
+          "querytype":1,//0按业务员 1按客户
+          "point":"开票",// 入账节点
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      dateData:null
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.allList = res.data.length > 0 ? res.data[0]:{}
+      this.total = res.total
+      this.currentPage = res.pageNumber
+    },
+    async departmentrtment() {
+      const res = await this.$api.requested(this.depmentParam)
+      this.$refs.departmentSalesperson.deplist = this.createMenu(res.data.dep)
+      this.$refs.departmentSalesperson.personnelList = res.data.hr
+      this.$refs.departmentSalesperson.depment = res.data.dep[0].departmentid
+      this.param.content.type = 1
+      this.param.content.dataid = res.data.dep[0].departmentid
+      this.queryDate()
+    },
+    /*获取期初日期*/
+    async queryDate(){
+      const res = await this.$api.requested({
+        "id": 20241218101003,
+        "content": {
+          "where":{
+            "condition":"",
+            "begindate":"",
+            "enddate":""
+          }
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        if (res.data.length > 0){
+          const newDate = new Date(res.data[0].openingdate)
+          this.dateData = this.tool.getDataChange(newDate)
+        }else {
+          this.dateData = null
+        }
+        this.listData()
+      }
+    },
+    createMenu (array) {
+      var that = this
+      let arr = []
+      function convertToElementTree(node) {
+        // 新节点
+        if (node.subdep.length === 0){
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+          }
+        }else {
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+            children: []
+          }
+        }
+        if (node.subdep && node.subdep.length > 0) {
+          // 如果存在子节点
+          for (var index = 0; index < node.subdep.length; index++) {
+            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+            elNode.children.push(convertToElementTree(node.subdep[index]));
+          }
+        }
+        return elNode;
+      }
+      array.forEach((element) => {
+        arr.push(convertToElementTree(element))
+      });
+      return arr
+    },
+    /*选择部门*/
+    depSelect(val){
+      this.param.content.type = 1
+      this.param.content.dataid = val
+      this.dataid = val
+      this.listData()
+    },
+    /*选择业务员*/
+    personSelect(val){
+      this.param.content.type = 0
+      this.param.content.dataid = val
+      this.dataid = val
+      this.listData()
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+    this.departmentrtment()
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).actsRecTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+.acccounet__panel{
+  padding: 10px;
+  line-height: 30px;
+  border:1px solid #f1f2f3;
+  color:#666;
+  border-radius: 5px;
+  cursor: pointer;
+}
+</style>

+ 153 - 0
src/HManagement/actsRecMag/modules/balanceUpd.vue

@@ -0,0 +1,153 @@
+<template>
+  <div>
+    <el-button size="small" type="primary"  @click="showBalance">{{$t(`期初余额更新`)}}</el-button>
+    <el-drawer
+        title="期初余额更新记录"
+        :visible.sync="drawVisible"
+        size="80%"
+        direction="rtl"
+        append-to-body
+        :show-close="false"
+    >
+      <div class="drawer__panel" style="margin-bottom: 0 !important;padding-bottom: 0!important;">
+        <div style="margin-bottom: 10px;">
+          <importFile class="inline-16" title="期初余额更新" :bindData="{ownertable:'balance',ownerid:'',usetype:'default'}" :errorUrl="errorUrl" @clearUrl="errorUrl = null" @onSuccess="bindImport"></importFile>
+          <div class="mt-10 inline-16">
+            <div class="search__label">{{$t(`更新时间:`)}}</div>
+            <el-date-picker
+                size="small"
+                v-model="selectDate"
+                type="daterange"
+                @change="dateChange"
+                value-format="yyyy-MM-dd"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期">
+            </el-date-picker>
+          </div>
+          <div class="mt-10 inline-16">
+            <div class="search__label">{{$t(`搜索:`)}}</div>
+            <el-input  style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="clearSearchValue" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+            </el-input>
+          </div>
+        </div>
+        <tableNewLayout :layout="tablecols"  height="calc(100vh - 190px)" :data="list" fixedName="operation" :width="true" :custom="true">
+          <template v-slot:customcol="scope">
+            <div v-if="scope.column.columnname === 'openingbalance'">
+              <span><small>¥</small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+            </div>
+            <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?$t(scope.column.data[scope.column.columnname]):'--'}}</p>
+          </template>
+          <template v-slot:opreation="scope"></template>
+        </tableNewLayout>
+        <div class="container normal-panel" style="text-align:right">
+          <el-pagination
+              background
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-sizes="[100,150, 200]"
+              :page-size="100"
+              layout="total,sizes, prev, pager, next, jumper"
+              :total="total">
+          </el-pagination>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import importFile from './importFile'
+export default {
+  name: "balanceUpd",
+  components:{importFile},
+  props:{
+
+  },
+  data(){
+    return {
+      drawVisible:false,
+      errorUrl:null,
+      param:{
+        "id": 20241218101003,
+        "content": {
+          "pageNumber":1,
+          "pageSize":100,
+          "where":{
+            "condition":"",
+            "begindate":"",
+            "enddate":""
+          }
+        }
+      },
+      list:[],
+      tablecols:[],
+      currentPage:0,
+      total:0,
+      selectDate:[]
+    }
+  },
+  methods:{
+    showBalance(){
+      this.drawVisible = true
+      this.listData()
+    },
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      console.log(res.data)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    async bindImport (id) {
+      const res = await this.$api.requested({
+        "id": 20241218102503,
+        "content": {
+          "attachmentid":id
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        if (res.data !== '成功') {
+          this.errorUrl = res.data
+        }
+        this.listData()
+      }
+    },
+    clearSearchValue () {
+      this.$store.dispatch('clearSearchValue')
+      this.listData(this.param.content.pageNumber = 1)
+    },
+    dateChange(){
+      if (this.selectDate){
+        this.param.content.where.begindate = this.selectDate[0]
+        this.param.content.where.enddate = this.selectDate[1]
+      }else {
+        this.param.content.where.begindate = ''
+        this.param.content.where.enddate = ''
+      }
+      this.listData()
+    }
+
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).balanceUpdTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 109 - 0
src/HManagement/actsRecMag/modules/detailInfo.vue

@@ -0,0 +1,109 @@
+<template>
+  <div>
+    <el-button size="mini" type="text" @click="onShow(dialogVisible = true)">{{$t('明细')}}</el-button>
+    <el-drawer
+        :title="$t(point == '开票'?'客户开票明细':'客户出货明细')"
+        :visible.sync="dialogVisible"
+        size="80%"
+        direction="rtl"
+        append-to-body
+        :show-close="false"
+        >
+      <div class="drawer__panel" style="margin-bottom: 0 !important;">
+        <exportFile style="margin-bottom: 20px" :param="param" :columns="tablecols" :fileName="point == '开票'?'客户开票明细':'客户出货明细'" :dataid="param.content.dataid" :custom="true" :point="point"></exportFile>
+        <tableNewLayout :layout="tablecols"  height="calc(100vh - 165px)" :data="list" fixedName="operation" :width="true" :custom="true" :headerOptions="['overdueamount']">
+          <template v-slot:header="scope">
+            <div v-if="scope.column.columnname === 'overdueamount'">
+              {{$t(point == '开票'?'开票金额':'出货金额')}}
+            </div>
+          </template>
+          <template v-slot:customcol="scope">
+            <div v-if="scope.column.columnname === 'overdueamount'">
+              <span><small>¥</small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+            </div>
+            <div v-else-if="scope.column.columnname === 'amount'">
+              <span><small>¥</small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+            </div>
+            <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?$t(scope.column.data[scope.column.columnname]):'--'}}</p>
+          </template>
+          <template v-slot:opreation="scope"></template>
+        </tableNewLayout>
+<!--        <div class="container normal-panel" style="text-align:right">
+          <el-pagination
+              background
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-sizes="[100,150, 200]"
+              :page-size="100"
+              layout="total,sizes, prev, pager, next, jumper"
+              :total="total">
+          </el-pagination>
+        </div>-->
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
+import exportFile from '@/components/export_file/index'
+export default {
+  name: "detailInfo",
+  components:{departmentSalesperson,exportFile},
+  props:['data','items','point'],
+  data(){
+    return {
+      dialogVisible:false,
+      tablecols:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      param:{
+        "id": 20241217135903,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "dataid":"",// 按业务员时 传userid 按客户时传 sa_customersid
+          "querytype":"1",//0按业务员 1按客户
+          "point":"",//入账节点
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    onShow(){
+      this.param.content.dataid = this.items.querytype == '0'?this.data.userid:this.data.sa_customersid
+      this.param.content.querytype = this.items.querytype
+      this.param.content.point = this.items.point
+      this.listData()
+    },
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).detailTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 208 - 0
src/HManagement/actsRecMag/modules/importFile.vue

@@ -0,0 +1,208 @@
+<template>
+  <div>
+    <el-button type="primary" size="small" @click="onShow">{{$t(title)}}</el-button>
+    <el-dialog :title="$t('文件上传')" class="import-panel" :visible.sync="dialogUploadVisible" width="500px" append-to-body :close-on-click-modal="false" :show-close="false" @close="clearFiles">
+      <div slot="title"></div>
+      <div style="background:#f1f2f3" class="my-tabs" >
+        <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+          <!-- <el-tab-pane :label="$t('导入经销商线索')" name="first"></el-tab-pane> -->
+          <el-tab-pane :label="$t(`导入`)" name="second"></el-tab-pane>
+        </el-tabs>
+      </div>
+      <div style="padding:20px">
+        <el-upload
+            style="width:100%"
+            ref="my-upload"
+            class="upload-demo normal-margin"
+            :accept="accept"
+            action="#"
+            :auto-upload="false"
+            :show-file-list="false"
+            :on-change="handleChange"
+            drag
+            multiple>
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">{{$t('将文件拖到此处,或') + ' '}}<em>{{$t('点击上传')}}</em></div>
+        </el-upload>
+        <div class="progress_panel" v-for="file in filelist" :key="file.uid">
+          <img v-if="file.type === 'DOC' || file.type === 'DOCX'" width="30" src="@/assets/file_icons/word.png"
+               alt="">
+          <img v-else-if="file.type === 'PDF'" width="30" src="@/assets/file_icons/PDF.png" alt="">
+          <img v-else-if="file.type === 'MP4' || file.type === 'AVI'" width="30" src="@/assets/file_icons/video.png"
+               alt="">
+          <img v-else-if="file.type === 'XLS' || file.type === 'XLSX'" width="30" src="@/assets/file_icons/excel.png"
+               alt="">
+          <img v-else-if="file.type === 'PNG' || file.type === 'JPG'|| file.type === 'JPEG'" width="30"
+               src="@/assets/file_icons/image.png" alt="">
+          <img v-else-if="file.type === 'PPT' || file.type === 'PPTX'" width="30" src="@/assets/file_icons/PPT.png"
+               alt="">
+          <img v-else width="30" src="@/assets/file_icons/unknow.png" alt="">
+          <div>
+            <p v-if="file.progress === 100" style="float:right"><span style="color:#67C23A">●</span>{{$t('上传成功')}}</p>
+            <p>{{file.raw?file.raw.name:$t('暂无上传文件')}}</p>
+            <el-progress :percentage="file.progress" :show-text="false"></el-progress>
+          </div>
+        </div>
+        <slot name="errorFile"></slot>
+        <p class="tips">• + {{$t('为保证数据导入顺利,推荐您下载并使用' + ' ')}}<a :href="modelurl">《{{$t('Excel标准模板')}}》</a></p>
+        <p class="tips">• {{$t('文件中数据不能超过5000行')}}</p>
+        <a :href="errorUrl" class="tips" style="color:red" v-if="errorUrl">•{{$t(`下载错误数据`)}}</a>
+        <div class="dialog-footer">
+          <el-button size="small" @click="cancel" class="normal-btn-width">{{$t('取 消')}}</el-button>
+          <el-button size="small" type="warning" @click="dialogUploadVisible = false" class="normal-btn-width btn-warning">{{$t('确 定')}}</el-button>
+        </div>
+      </div>
+
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "importFile",
+  props:['ordertype','btntype','accept','bindData','errorUrl','title'],
+  data () {
+    return {
+      dialogUploadVisible: false,
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '',
+          "filetype": '',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+      file: {},
+      filelist: [],
+      CampaignList:[],
+      activeName:'last',
+      modelurl:'',
+      campaignid:'',
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
+      orderType:0
+    }
+  },
+  methods: {
+    onShow (type) {
+      this.orderType = type
+      this.dialogUploadVisible = true
+      this.getModelUrl()
+    },
+    cancel () {
+      this.dialogUploadVisible = false
+      this.campaignid = ''
+      this.$refs['my-upload'].clearFiles()
+      this.filelist = []
+    },
+    handleChange (file, filelist) {
+      this.filelist = filelist
+      var index = file.raw.name.lastIndexOf(".");
+      var ext = file.name.substr(index + 1);
+      this.params.content.filename = file.raw.name
+      this.params.content.filetype = ext
+      this.getUploadUrl(file, ext)
+    },
+    handleClick () {
+      this.getModelUrl()
+    },
+    // 获取导入模板
+    async getModelUrl () {
+      const res = await this.$api.requested({
+        "id":20241218102403,
+        "content": {
+        }
+      })
+      this.modelurl = res.data
+
+    },
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext) {
+      this.params.content.parentid = this.folderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename)
+    },
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename) {
+      let THIS = this
+      let config = {
+        headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : { 'Content-Type': 'application/octet-stream' },
+        onUploadProgress: function (progressEvent) {
+          let percent = progressEvent.loaded / progressEvent.total * 100
+          THIS.filelist.forEach(e => {
+            if (e.uid === file.uid) {
+              THIS.$set(e, 'type', ext.toUpperCase());
+              THIS.$set(e, 'progress', percent);
+            }
+          })
+        },
+      }
+      const res = await this.$upload.hw_upload(url, file.raw, config)
+      console.log(res.data,'1111111')
+      this.createFileRecord(obsfilename)
+    },
+
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename) {
+      let obj = {
+        "serialfilename": obsfilename
+      }
+      obj = Object.assign({},obj,this.bindData)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+
+      const res = await this.$api.requested(param)
+      console.log(res.data,'获取附件')
+      this.$emit('onSuccess',res.data.attachmentids[0])
+    },
+
+    clearFiles () {
+      this.$refs['my-upload'].clearFiles()
+      this.filelist = []
+      this.dialogUploadVisible = false
+      this.$emit('clearUrl')
+    },
+  }
+}
+</script>
+
+<style scoped>
+.import-panel .el-dialog__header,.import-panel .el-dialog__body{
+  padding: 0 !important;
+}
+.upload-demo > div {
+  width: 100% !important;
+}
+.upload-demo .el-upload-dragger {
+  width: 100% !important;
+}
+</style>
+  <style scoped>
+  .progress_panel {
+    display: flex;
+    align-items: center;
+    padding: 10px;
+    margin: 10px 0;
+    border-radius: 5px;
+    transition: linear 0.2s all;
+  }
+.progress_panel:hover {
+  box-shadow: 0px 0px 5px #ccc;
+}
+.progress_panel > div {
+  flex: 1;
+  padding: 0 10px;
+}
+.progress_panel > div > p {
+  line-height: 30px;
+}
+.tips{
+  line-height: 30px;
+}
+</style>

+ 5 - 0
src/SDrpManagement/agentOrder/modules/productlist.vue

@@ -151,6 +151,11 @@
               ¥&nbsp;{{ tool.formatAmount(scope.column.data.amount, 2) }}
             </p>
           </div>
+          <div v-else-if="scope.column.columnname === 'aftersalesmagamount'">
+            <p style="color: red; font-weight: 500">
+              ¥&nbsp;{{ tool.formatAmount(scope.column.data.aftersalesmagamount, 2) }}
+            </p>
+          </div>
           <div v-else-if="scope.column.columnname === 'remarks'">
             <el-input
               v-model="scope.column.data.remarks"

+ 5 - 0
src/SDrpManagement/salerOrder/modules/productlist.vue

@@ -157,6 +157,11 @@
               ¥&nbsp;{{ tool.formatAmount(scope.column.data.amount, 2) }}
             </p>
           </div>
+          <div v-else-if="scope.column.columnname === 'aftersalesmagamount'">
+            <p style="color: red; font-weight: 500">
+              ¥&nbsp;{{ tool.formatAmount(scope.column.data.aftersalesmagamount, 2) }}
+            </p>
+          </div>
           <div v-else-if="scope.column.columnname === 'remarks'">
             <el-input
               v-model="scope.column.data.remarks"

+ 264 - 0
src/SManagement/actsRec/index.vue

@@ -0,0 +1,264 @@
+<template>
+  <div>
+    <normal-layout style="height: calc(100vh - 125px)">
+      <div slot="titleRight">
+        <exportFile :param="param" :columns="tablecols" fileName="应收账款" :dataid="param.content.dataid" :custom="true" :point="param.content.point" :dateData="dateData"></exportFile>
+      </div>
+      <div slot="content">
+        <div class="container">
+          <template>
+            <div class="mt-10 inline-16">
+              <label class="search__label">{{$t('查询方式')}}:</label>
+              <el-select v-model="param.content.point" :placeholder="$t('请选择')" size="small" @change="listData">
+                <el-option :label="$t(`出货`)" value="出货" ></el-option>
+                <el-option :label="$t(`开票`)" value="开票" ></el-option>
+              </el-select>
+            </div>
+            <div class="mt-10 inline-16" style="margin-left: 20px">
+              <departmentSalesperson ref="departmentSalesperson" class="inline-16" @depSelect="depSelect" @personSelect="personSelect" ></departmentSalesperson>
+            </div>
+            <div>
+              <el-row :gutter="20">
+                <el-col :span="6" class="mt-10">
+                  <div class="acccounet__panel" style="border:1px solid #d8dde8">
+                    <p class="normal-margin">{{$t('总应收')}}</p>
+                    <p class="normal-title" style="font-size:29px;color:#151515" >
+                      <small>{{allList.sumtotalamount || allList.sumtotalamount == '0'?'¥':''}}</small>
+                      {{allList.sumtotalamount || allList.sumtotalamount == 0?tool.formatAmount(allList.sumtotalamount,2):'--'}}
+                    </p>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+            <div style="flex:0 1 auto;width: 100%;">
+              <tableMainLayout :layout="tablecols" height="calc(100vh - 410px)" :data="list" fixedName="operation" :width="true" :custom="true"
+                               :headerOptions="['receivableamount','totalamount','openingbalance']">
+                <template v-slot:header="scope">
+                  <div v-if="scope.column.columnname === 'openingbalance'">
+                    {{dateData?'期初余额'+'('+dateData+')':'期初余额(2021-12-31)'}}
+                  </div>
+                  <div v-if="scope.column.columnname == 'receivableamount'">
+                    <div v-if="param.content.point == '出货'">{{$t(`出货总金额(2022-01-01至今)`)}}</div>
+                    <div v-else>{{$t(`开票总金额(2022-01-01至今)`)}}</div>
+                  </div>
+                  <div v-if="scope.column.columnname == 'totalamount'">
+                    <div v-if="param.content.point == '出货'">{{$t(`出货总应收`)}}</div>
+                    <div v-else>{{$t(`开票总应收`)}}</div>
+                  </div>
+                </template>
+                <template v-slot:customcol="scope">
+                  <div v-if="scope.column.columnname === 'openingbalance'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'receivableamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'revenueamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'totalamount'">
+                    <span><small>¥ </small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+                  </div>
+                  <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?$t(scope.column.data[scope.column.columnname]):'--'}}</p>
+                </template>
+                <template v-slot:opreation="scope">
+                  <detailInfo :data="scope.data" :items="param.content" :point="param.content.point"></detailInfo>
+                </template>
+              </tableMainLayout>
+            </div>
+            <div class="container normal-panel" style="text-align:right">
+              <el-pagination
+                  background
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-sizes="[100, 50, 100, 200]"
+                  :page-size="100"
+                  layout="total,sizes, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </template>
+        </div>
+      </div>
+    </normal-layout>
+  </div>
+</template>
+
+<script>
+import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
+import detailInfo from './modules/detailInfo'
+import exportFile from '@/components/export_file/index'
+export default {
+  name: "index",
+  components:{departmentSalesperson,detailInfo,exportFile},
+  data(){
+    return {
+      value:'全部',
+      options:[],
+      tablecols:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      allList:{},
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+        }
+      },
+      param:{
+        "id": 20241217135803,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "type":"0",//1按部门 0按人员
+          "dataid":JSON.parse(sessionStorage.getItem('active_account')).userid,//部门人员id
+          "querytype":1,//0按业务员 1按客户
+          "point":"开票",// 入账节点
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      dateData:null
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      console.log(res.data,'数据')
+      this.list = res.data
+      this.allList = res.data.length > 0 ? res.data[0]:{}
+      this.total = res.total
+      this.currentPage = res.pageNumber
+    },
+    async departmentrtment() {
+      const res = await this.$api.requested(this.depmentParam)
+      this.$refs.departmentSalesperson.deplist = this.createMenu(res.data.dep)
+      this.$refs.departmentSalesperson.personnelList = res.data.hr
+      const name = JSON.parse(sessionStorage.getItem('active_account')).name
+      this.$refs.departmentSalesperson.person = name
+      this.queryDate()
+    },
+    /*获取期初日期*/
+    async queryDate(){
+      const res = await this.$api.requested({
+        "id": 20241218101003,
+        "content": {
+          "where":{
+            "condition":"",
+            "begindate":"",
+            "enddate":""
+          }
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        if (res.data.length > 0){
+          const newDate = new Date(res.data[0].openingdate)
+          this.dateData = this.tool.getDataChange(newDate)
+        }else {
+          this.dateData = null
+        }
+        this.listData()
+      }
+    },
+    createMenu (array) {
+      var that = this
+      let arr = []
+      function convertToElementTree(node) {
+        // 新节点
+        if (node.subdep.length === 0){
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+          }
+        }else {
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+            children: []
+          }
+        }
+        if (node.subdep && node.subdep.length > 0) {
+          // 如果存在子节点
+          for (var index = 0; index < node.subdep.length; index++) {
+            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+            elNode.children.push(convertToElementTree(node.subdep[index]));
+          }
+        }
+        return elNode;
+      }
+      array.forEach((element) => {
+        arr.push(convertToElementTree(element))
+      });
+      return arr
+    },
+    /*选择部门*/
+    depSelect(val){
+      console.log(val,'val3333')
+      this.param.content.type = 1
+      this.param.content.dataid = val
+      this.dataid = val
+      this.listData()
+    },
+    /*选择业务员*/
+    personSelect(val){
+      this.param.content.type = 0
+      this.param.content.dataid = val
+      this.dataid = val
+      this.listData()
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+    this.departmentrtment()
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).actsRecTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+.acccounet__panel{
+  padding: 10px;
+  line-height: 30px;
+  border:1px solid #f1f2f3;
+  color:#666;
+  border-radius: 5px;
+  cursor: pointer;
+}
+</style>

+ 109 - 0
src/SManagement/actsRec/modules/detailInfo.vue

@@ -0,0 +1,109 @@
+<template>
+  <div>
+    <el-button size="mini" type="text" @click="onShow(dialogVisible = true)">{{$t('明细')}}</el-button>
+    <el-drawer
+        :title="$t(point == '开票'?'客户开票明细':'客户出货明细')"
+        :visible.sync="dialogVisible"
+        size="80%"
+        direction="rtl"
+        append-to-body
+        :show-close="false"
+        >
+      <div class="drawer__panel" style="margin-bottom: 0 !important;">
+        <exportFile style="margin-bottom: 20px" :param="param" :columns="tablecols" :fileName="point == '开票'?'客户开票明细':'客户出货明细'" :dataid="param.content.dataid" :custom="true" :point="point"></exportFile>
+        <tableNewLayout :layout="tablecols"  height="calc(100vh - 165px)" :data="list" fixedName="operation" :width="true" :custom="true" :headerOptions="['overdueamount']">
+          <template v-slot:header="scope">
+            <div v-if="scope.column.columnname === 'overdueamount'">
+              {{$t(point == '开票'?'开票金额':'出货金额')}}
+            </div>
+          </template>
+          <template v-slot:customcol="scope">
+            <div v-if="scope.column.columnname === 'overdueamount'">
+              <span><small>¥</small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+            </div>
+            <div v-else-if="scope.column.columnname === 'amount'">
+              <span><small>¥</small>{{scope.column.data[scope.column.columnname]?tool.formatAmount(scope.column.data[scope.column.columnname],2):'0.00'}}</span>
+            </div>
+            <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?$t(scope.column.data[scope.column.columnname]):'--'}}</p>
+          </template>
+          <template v-slot:opreation="scope"></template>
+        </tableNewLayout>
+<!--        <div class="container normal-panel" style="text-align:right">
+          <el-pagination
+              background
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-sizes="[100,150, 200]"
+              :page-size="100"
+              layout="total,sizes, prev, pager, next, jumper"
+              :total="total">
+          </el-pagination>
+        </div>-->
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
+import exportFile from '@/components/export_file/index'
+export default {
+  name: "detailInfo",
+  components:{departmentSalesperson,exportFile},
+  props:['data','items','point'],
+  data(){
+    return {
+      dialogVisible:false,
+      tablecols:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      param:{
+        "id": 20241217135903,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "dataid":"",// 按业务员时 传userid 按客户时传 sa_customersid
+          "querytype":"1",//0按业务员 1按客户
+          "point":"",//入账节点
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    onShow(){
+      this.param.content.dataid = this.items.querytype == '0'?this.data.userid:this.data.sa_customersid
+      this.param.content.querytype = this.items.querytype
+      this.param.content.point = this.items.point
+      this.listData()
+    },
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).detailTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 2 - 2
src/components/attachment_list/index.vue

@@ -30,7 +30,7 @@
           slot-scope="scope"
         >{{scope.row.contentlength > 1073741824?(scope.row.contentlength / Math.pow(1024,3)).toFixed(2)+'GB':scope.row.contentlength > 1048576?(scope.row.contentlength / Math.pow(1024,2)).toFixed(2)+'MB':scope.row.contentlength > 1024?(scope.row.contentlength / Math.pow(1024,1)).toFixed(2)+'KB':scope.row.contentlength+'B'}}</template>
       </el-table-column>
-      <el-table-column :label="$t(`操作`)" min-width="170">
+      <el-table-column :label="$t(`操作`)" :min-width="minWidth?minWidth:170">
         <template slot-scope="scope">
           <div v-if="actid === scope.row.attachmentid">
             <el-button
@@ -82,7 +82,7 @@
 <script>
 import SeeFile from "@/components/file-block/components/SeeFile1";
 export default {
-  props: ["attinfos", "onlyread", "status","attachmentDisabled","disabled"],
+  props: ["attinfos", "onlyread", "status","attachmentDisabled","disabled","minWidth"],
   data() {
     return {
       actid: null,

+ 4 - 0
src/components/dynamic-newTable/index.vue

@@ -29,6 +29,9 @@
         <template v-slot:header="{ column,$index }" v-if="customHeader">
           <slot name="header" :data="column"></slot>
         </template>
+        <template :slot="headerOptions ? headerOptions.includes(col.columnname) ? 'header' : '' : ''" slot-scope="scope">
+          <slot name="header" :column="{data:scope.row,columnname:col.columnname}"></slot>
+        </template>
         <template slot-scope="scope">
           <div class="table-panel">
             <!-- 自定义表格显示内容 -->
@@ -68,6 +71,7 @@ export default {
     "redirect",
     "customHeader",
     "minHeight",
+    "headerOptions"
   ],
   data() {
     return {

+ 19 - 1
src/components/export_file/index.vue

@@ -6,7 +6,7 @@
 
 <script>
 export default {
-  props: ["param", "type", "columns", "columnsIndex", "fileName", "dataid"],
+  props: ["param", "type", "columns", "columnsIndex", "fileName", "dataid","custom","point","dateData"],
   data() {
     return {
       columnsData: [],
@@ -24,6 +24,24 @@ export default {
           });
         });
       }
+      console.log(rs,'表格字段')
+      if (this.columns){
+        rs.forEach(item=>{
+          if (item.fieldname == 'totalamount'){
+            item.fieldlabel = this.point == '开票'?'开票总应收':'出货总应收'
+          }
+          if (item.fieldname == 'receivableamount'){
+            item.fieldlabel = this.point == '开票'?'开票总金额(2022-01-01至今)':'出货总金额(2022-01-01至今)'
+          }
+          if (item.fieldname == 'overdueamount'){
+            item.fieldlabel = this.point == '开票'?'开票金额':'出货金额'
+          }
+          if (item.fieldname == 'openingbalance' && this.dateData){
+            item.fieldlabel = this.dateData?'期初余额'+'('+this.dateData+')':'期初余额(2021-12-31)'
+          }
+        })
+      }
+      console.log(rs,'表格字段1111')
       this.param.content.dataid = this.dataid;
       this.param.content.exportFields = rs;
       this.param.content.isExport = 1;

+ 3 - 2
src/components/marketingExpenses/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div>
-    <el-button type="text" @click="onShow" size="mini">
+    <el-button v-if="isOperation" type="text" @click="onShow" size="mini">{{$t(`费用明细`)}}</el-button>
+    <el-button v-else type="text" @click="onShow" size="mini">
       <svg t="1727063099768" class="icon" viewBox="0 0 1027 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12550" width="14" height="14"><path d="M291.648 112.448h697.6c19.2 0 38.4 19.2 38.4 38.4s-19.2 32-38.4 32h-697.6c-19.2 0-38.4-19.2-38.4-38.4s19.2-32 38.4-32z m-147.2-76.8h-70.4c-38.4 0-70.4 32-70.4 70.4v76.8c0 38.4 32 70.4 70.4 70.4h70.4c38.4 0 70.4-32 70.4-70.4v-70.4c6.4-44.8-25.6-76.8-70.4-76.8z m0 147.2h-70.4v-70.4h70.4v70.4z m147.2 294.4h256c19.2 0 38.4 19.2 38.4 38.4s-19.2 32-38.4 32h-256c-19.2 0-38.4-19.2-38.4-38.4s19.2-32 38.4-32z m-147.2-76.8h-70.4c-38.4 0-70.4 32-70.4 70.4v70.4c0 38.4 32 70.4 70.4 70.4h70.4c38.4 0 70.4-32 70.4-70.4v-64c6.4-44.8-25.6-76.8-70.4-76.8z m0 147.2h-70.4v-70.4h70.4v70.4z m147.2 294.4h256c19.2 0 38.4 19.2 38.4 38.4s-19.2 38.4-38.4 38.4h-256c-19.2 0-38.4-19.2-38.4-38.4s19.2-38.4 38.4-38.4z m-147.2-76.8h-70.4c-38.4 0-70.4 32-70.4 70.4v70.4c0 38.4 32 70.4 70.4 70.4h70.4c38.4 0 70.4-32 70.4-70.4v-70.4c6.4-32-25.6-70.4-70.4-70.4z m0 147.2h-70.4v-70.4h70.4v70.4z m550.4-147.2h294.4c19.2 0 38.4 19.2 38.4 38.4s-19.2 38.4-38.4 38.4h-294.4c-19.2 0-38.4-19.2-38.4-38.4s19.2-38.4 38.4-38.4z m0-140.8h294.4c19.2 0 38.4 19.2 38.4 38.4s-19.2 32-38.4 32h-294.4c-19.2 0-38.4-19.2-38.4-38.4s19.2-32 38.4-32z" fill="#999999" p-id="12551"></path><path d="M880.448 950.848v-326.4c0-19.2-19.2-38.4-38.4-38.4s-38.4 19.2-38.4 38.4v326.4c0 19.2 19.2 38.4 38.4 38.4s38.4-19.2 38.4-38.4z" fill="#999999" p-id="12552"></path><path d="M835.648 682.048l179.2-179.2c12.8-19.2 12.8-38.4-6.4-51.2-12.8-12.8-32-12.8-51.2 0l-179.2 179.2c-19.2 12.8-19.2 38.4-6.4 51.2 12.8 19.2 38.4 19.2 64 0-6.4 6.4-6.4 0 0 0z" fill="#999999" p-id="12553"></path><path d="M848.448 682.048l-179.2-179.2c-12.8-19.2-12.8-38.4 6.4-51.2 12.8-12.8 32-12.8 51.2 0l179.2 179.2c12.8 19.2 12.8 38.4-6.4 51.2-12.8 12.8-38.4 12.8-51.2 0z" fill="#999999" p-id="12554"></path></svg>
       <span style="font-size: 14px;color: #333333;margin-left: 5px;vertical-align: middle">{{$t(`费用明细`)}}</span></el-button>
     <el-dialog
@@ -154,7 +155,7 @@
 <script>
 export default {
   name: "index",
-  props: ["ownertable", "ownerid", "dataTime", "userid"],
+  props: ["ownertable", "ownerid", "dataTime", "userid","isOperation"],
   data() {
     return {
       dialogVisible: false,

+ 8 - 11
src/components/newLayout/index.vue

@@ -108,24 +108,21 @@ export default {
         clearTimeout(this.timer);
       }
       this.timer = setTimeout(() => {
-        if (this.$refs.menu) {
-          let size = this.$refs.menu.$refs.menuList.$el.clientHeight / 40 - 1;
-          if (this.$refs.menu.$refs.menuList.$el.clientHeight === 80) {
-            this.divTop =
-              this.$refs.menu.$refs.menuList.$el.clientHeight -
-              25 * size +
-              "px";
-          } else {
-            this.divTop = 0 + "px";
-          }
+        let size = this.$refs.menu.$refs.menuList.$el.clientHeight / 40 - 1;
+        if (this.$refs.menu.$refs.menuList.$el.clientHeight === 80) {
+          this.divTop =
+            this.$refs.menu.$refs.menuList.$el.clientHeight - 25 * size + "px";
+        } else {
+          this.divTop = 0 + "px";
         }
+
         /* this.divHeight = (this.$refs.divContent.clientHeight - this.$refs.menu.$refs.menuList.$el.clientHeight + 10) + 'px'*/
         /* if (this.$refs.menu.$el.clientWidth < 1206 && Array.from(this.$refs.menu.$el.getElementsByTagName('li')).filter(item => item.className.indexOf('el-submenu') != -1).length > 8) {
           this.marginTrue = true
         } else {
           this.marginTrue = false
         }*/
-      }, 1000);
+      }, 200);
     },
     goPassword() {
       this.dialogVisible = false;

+ 16 - 3
src/components/newLayout/modules/header.vue

@@ -39,7 +39,18 @@
       </el-dropdown-menu>
     </el-dropdown>-->
       <!--    <el-divider direction="vertical"></el-divider>-->
-      <el-button size="mint" type="primary"  style="background-color:rgb(52 106 145);margin-right: 20px;color: #FFFFFF" v-if="(usertype == 1 || usertype == 0) && (siteid == 'HY' || siteid == 'YOSTEST1')" @click="$router.push('/serviceDataScreen')">{{$t(`业务数据大屏`)}}</el-button>
+      <el-button
+        size="mint"
+        type="primary"
+        style="
+          background-color: rgb(52 106 145);
+          margin-right: 20px;
+          color: #ffffff;
+        "
+        v-if="(usertype == 1 || usertype == 0) && (siteid == 'HY' || siteid == 'YOSTEST1')"
+        @click="$router.push('/serviceDataScreen')"
+        >{{ $t(`业务数据大屏`) }}</el-button
+      >
       <svg
         t="1725853431060"
         class="icon"
@@ -144,7 +155,7 @@ export default {
       nowType: "ZH",
       languagename: "",
       usertype: JSON.parse(sessionStorage.getItem("active_account")).usertype,
-      siteid: JSON.parse(sessionStorage.getItem('active_account')).siteid
+      siteid: JSON.parse(sessionStorage.getItem("active_account")).siteid,
     };
   },
   props: ["onRender"],
@@ -292,6 +303,7 @@ export default {
           .languagename || "简体中文";
       localStorage.setItem("languagename", this.languagename);
       localStorage.setItem("lang", type);
+      localStorage.setItem("languagename", this.languagename);
       this.$nextTick(() => {
         this.$i18n.locale = type;
         this.editorChangeLanguage();
@@ -342,11 +354,12 @@ export default {
       });
     },
   },
-
   mounted() {
     this.siteInfos();
     this.languagelist();
 
+    this.languagename = localStorage.getItem("languagename") ||"简体中文";
+
     try {
       this.languagename = localStorage.getItem("languagename") || "简体中文";
     } catch (error) {

+ 14 - 2
src/components/normal-basic-layout-new/details/index.vue

@@ -60,7 +60,7 @@
       <el-row class="flex-align-stretch no-wrap" :gutter="activeApp.isdatateam?10:activeApp.isdatafollowup?10:0">
         <el-col style="flex:1 0 auto;" :span="activeApp.isdatateam?18:activeApp.isdatafollowup?18:24">
           <slot name="customBefore"></slot>
-          <tabTemp :status="status" :tabs="tabs" :editData="editData" :idname="idname" :ownerid="ownerid" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onTabClick="onTabClick">
+          <tabTemp ref="tabRef" :status="status" :tabs="tabs" :editData="editData" :idname="idname" :ownerid="ownerid" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onTabClick="onTabClick" @newFollow="newFollow" :isFollow="activeApp.isdatafollowup">
             <div :slot="'slot' + index" v-for="(tab,index) in tabs" :key="tab.index">
               <slot :name="'slot' + index"></slot>
             </div>
@@ -74,7 +74,7 @@
           <group v-if="activeApp.isdatateam" :isGroup="isGroup" :status="status" ref="group" style="margin-bottom:10px"  :justsaler="justsaler" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onSuccess="onSuccess" @teamList="teamList">
             <el-button slot="collapse" type="text" icon="el-icon-s-unfold" class="inline-16" @click="onCollapse"></el-button>
           </group>
-          <follow-up v-if="activeApp.isdatafollowup" :status="status" ref="follow" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" :editData="editData" :idname="idname" @logSuccess="logSuccess">
+          <follow-up v-if="activeApp.isdatafollowup" :status="status" ref="follow" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" :editData="editData" :idname="idname" @logSuccess="logSuccess" @onMore="onMore">
             <el-button slot="collapse" type="text" icon="el-icon-s-unfold" class="inline-16" @click="onCollapse"></el-button>
           </follow-up>
         </el-col>
@@ -420,6 +420,18 @@ export default {
     },
     logSuccess(){
       this.$emit('logSuccess')
+    },
+    newFollow(){
+      setTimeout(()=>{
+        this.$refs.follow.queryLogs()
+      },1000)
+    },
+    onMore(val){
+      console.log(val,'22222')
+      this.$refs.tabRef.$refs.followRef.listData()
+      if (val == '查看更多'){
+        this.$refs.tabRef.activeName = 'follow'
+      }
     }
   },
   mounted () {

+ 377 - 0
src/components/normal-basic-layout-new/details/modules/followTable/index.vue

@@ -0,0 +1,377 @@
+<template>
+  <div>
+    <el-input  style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="clearSearchValue" size="small" class="input-with-select inline-16 layout_search__panel mt-10" clearable>
+    </el-input>
+    <el-table
+        ref="table"
+        :row-class-name="tableClassName"
+        :data="tableData"
+        highlight-current-row
+        size="mini"
+        :header-cell-style="{height:'40px',color:'#606266',fontWeight:'400',fontSize:'14px'}"
+        :cell-style="{height:'40px',color:'#666666',fontWeight:'400'}"
+        border
+    >
+      <el-table-column
+          prop="createby"
+          label="跟进人"
+          min-width="60">
+      </el-table-column>
+      <el-table-column
+          prop="createdate"
+          label="跟进时间"
+          min-width="139">
+      </el-table-column>
+      <el-table-column
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail' || $route.path === '/phonebookDetail'"
+          prop="type"
+          label="跟进类型"
+          min-width="80">
+      </el-table-column>
+      <el-table-column
+          prop="contacts"
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail' || $route.path === '/phonebookDetail'"
+          label="跟进对象"
+          min-width="69">
+        <template slot-scope="scope">
+          <div v-for="item in scope.row.contacts" :key="item.index">
+            <span v-if="item.rowindex === scope.row.contacts.length" class="span-style">
+              {{item.name}}
+            </span>
+            <span v-else class="span-style">
+              {{item.name + ','}}
+            </span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+          prop="content"
+          label="跟进内容"
+          min-width="500"
+          >
+        <template slot-scope="scope">
+          <div v-if="($route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail' || $route.path === '/phonebookDetail')">
+            <div>{{$t(`目的:`)}}{{scope.row.target}}</div>
+            <div>{{$t(`过程:`)}}{{scope.row.content}}</div>
+            <div>{{$t(`结果:`)}}{{scope.row.results}}</div>
+            <div>{{$t(`下次跟进计划:`)}}{{scope.row.nextplan}}</div>
+          </div>
+          <div v-else>{{scope.row.content}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+          prop="attcount"
+          label="附件数"
+          min-width="69">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="showFiles(scope.row)">{{scope.row.attcount}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail' || $route.path === '/phonebookDetail'"
+          prop="salesfeesamount"
+          label="营销费用"
+          min-width="80">
+        <template slot-scope="scope">
+          {{scope.row.salesfeesamount?tool.formatAmount(scope.row.salesfeesamount,2,'¥'):'¥0.00'}}
+        </template>
+      </el-table-column>
+      <el-table-column
+          label="操作"
+          fixed="right"
+          min-width="220">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="showReview(scope.row)" class="inline-16">{{$t(`评论`)}}({{scope.row.commentqty}})</el-button>
+          <editLog v-if="userid === scope.row.createuserid && !disabled"  ref="edits" :data="scope.row" :ownertable="ownertable" @onSuccess="onSuccess" :isOperation="true"></editLog>
+          <el-button type="text" size="small" class="inline-16" @click="onDelFollow(scope.row)" v-if="userid === scope.row.createuserid && !disabled">{{$t(`删除`)}}</el-button>
+          <marketingExpenses  v-if="($route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail' || $route.path === '/phonebookDetail') && !disabled"
+                              class="inline-16" ownertable="sa_customers" :ownerid="scope.row.sys_datafollowupid" :dataTime="scope.row.createdate" :userid="scope.row.createuserid" :isOperation="true"
+                              @onSuccess="listData"></marketingExpenses>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div  class="container normal-panel" style="text-align:right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="100"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+    <normalDialog ref="normalDialogFile" title="附件" >
+      <template slot="content">
+        <attachmentList style="margin-top: -10px;margin-bottom: 10px" :attinfos="attinfo_attachment" :onlyread="true" minWidth="80">
+        </attachmentList>
+      </template>
+    </normalDialog>
+    <normalDialog ref="normalDialogReview" title="评论" @closeDialog="closeDialog">
+      <template slot="content">
+        <div style="padding: 10px">
+          <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px">
+            <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="content" :placeholder="$t(`我评论`)+':'"></el-input>
+            <el-divider></el-divider>
+            <div style="display: flex;justify-content: right">
+              <el-button   type="primary" size="small" :disabled="content.length == 0" @click="onComment">{{$t(`发布`)}}</el-button>
+            </div>
+          </div>
+        </div>
+        <div style="padding: 0 10px 10px 10px">
+          <div style="max-height: 360px;min-height:200px;background: #F5F5F5;border-radius: 2px;padding: 10px;overflow:auto">
+            <div style="color: #333;font-size: 16px;font-weight: bold">{{$t(`评论`)}}({{commentqty}})</div>
+            <div v-for="item in comment" :key="item.index" style="margin-top: 10px">
+              <div style="color: #333;font-size: 14px;font-weight: bold;margin-top: 5px">{{item.createby}}</div>
+              <div style="color:#666;font-size: 14px;margin-top: 5px">{{item.content}}</div>
+              <div style="display: flex;justify-content: space-between;align-items: center;margin-top: -5px;margin-bottom: -5px">
+                <div style="display: flex;justify-content: space-between;align-items: center">
+                  <div style="font-size: 12px;color: #999">{{item.createdate}}</div>
+                  <el-button type="text" size="small" class="margin-5" v-if="userid == item.createuserid"><svg style="vertical-align: middle" t="1727053625238" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11334" width="14" height="14"><path d="M343.113143 156.379429h333.897143v-73.142858H343.113143v73.142858zM677.010286 0a83.456 83.456 0 0 1 83.456 83.456v64.146286h215.917714a46.299429 46.299429 0 1 1 0 92.672h-48.64v700.196571a83.456 83.456 0 0 1-83.456 83.456H176.128a83.456 83.456 0 0 1-83.456-83.456V240.054857H47.542857a46.299429 46.299429 0 0 1 0-92.452571h212.114286v-64.146286A83.456 83.456 0 0 1 343.113143 0h333.897143z m156.525714 241.371429H186.587429v688.859428h647.021714v-689.005714zM384.877714 345.6a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.691428-41.764571z m250.441143 0a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.545142-41.764571z" fill="#999999" p-id="11335"></path></svg>
+                    <span style="color: #666666;font-size: 14px;margin-left: 5px;vertical-align: middle" @click="onDel(item)">{{$t(`删除`)}}</span></el-button>
+                </div>
+                <div>
+                  <el-button type="text"  v-if="!isContentShow" size="small" @click="isContentShow = true;sys_datacommentid = item.sys_datacommentid">
+                    <svg t="1727055468269" class="icon" style="vertical-align: middle" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                    <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`回复`)}}</span></el-button>
+                  <el-button type="text"  v-if="isContentShow " size="small" @click="isContentShow = false;sys_datacommentid = ''">
+                    <svg t="1727055468269" class="icon" viewBox="0 0 1024 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                    <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`取消回复`)}}</span></el-button>
+                </div>
+              </div>
+              <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px" v-if="isContentShow && sys_datacommentid == item.sys_datacommentid">
+                <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="replyContent" :placeholder="$t('我回复')+item.createby+':'"></el-input>
+                <el-divider></el-divider>
+                <div style="display: flex;justify-content: right">
+                  <el-button   type="primary" size="small" :disabled="replyContent.length == 0" @click="onReply(sys_datafollowupid,item)">{{$t(`发布`)}}</el-button>
+                </div>
+              </div>
+              <div v-if="item.subcomment.length > 0" style="margin-left: 10px;margin-top: 10px">
+                <div v-for="k in item.subcomment" :key="k.index" style="margin-top: 10px">
+                  <div style="display: flex;justify-content: left;align-items: center">
+                    <div style="font-size: 14px;font-weight: bold;color:#333;">{{k.createby}}</div><i style="margin: 0 10px 0 10px" class="el-icon-caret-right"></i><div style="font-size: 14px;font-weight: bold;color:#333;">{{k.replyusername}}</div>
+                  </div>
+                  <div style="color:#666;font-size: 14px;margin-top: 5px">{{k.content}}</div>
+                  <div style="display: flex;justify-content: space-between;align-items: center;margin-top: -5px;margin-bottom: -5px">
+                    <div style="display: flex;justify-content: space-between;align-items: center">
+                      <div style="font-size: 12px;color:#999;margin-right: 10px">{{k.createdate}}</div>
+                      <el-button type="text" size="small" v-if="userid == k.createuserid"><svg style="vertical-align: middle" t="1727053625238" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11334" width="14" height="14"><path d="M343.113143 156.379429h333.897143v-73.142858H343.113143v73.142858zM677.010286 0a83.456 83.456 0 0 1 83.456 83.456v64.146286h215.917714a46.299429 46.299429 0 1 1 0 92.672h-48.64v700.196571a83.456 83.456 0 0 1-83.456 83.456H176.128a83.456 83.456 0 0 1-83.456-83.456V240.054857H47.542857a46.299429 46.299429 0 0 1 0-92.452571h212.114286v-64.146286A83.456 83.456 0 0 1 343.113143 0h333.897143z m156.525714 241.371429H186.587429v688.859428h647.021714v-689.005714zM384.877714 345.6a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.691428-41.764571z m250.441143 0a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.545142-41.764571z" fill="#999999" p-id="11335"></path></svg>
+                        <span style="color: #666666;font-size: 14px;margin-left: 5px;vertical-align: middle" @click="onDel(k)">{{$t(`删除`)}}</span></el-button>
+                    </div>
+                    <div>
+                      <el-button  type="text" v-if="!isContentShow "  size="small" @click="isContentShow = true;sys_datacommentid = k.sys_datacommentid">
+                        <svg t="1727055468269" class="icon" style="vertical-align: middle" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                        <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`回复`)}}</span></el-button>
+                      <el-button type="text" v-if="isContentShow " size="small" @click="isContentShow = false;sys_datacommentid = ''">
+                        <svg t="1727055468269" style="vertical-align: middle" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                        <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`取消回复`)}}</span></el-button>
+                    </div>
+                  </div>
+                  <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px" v-if="isContentShow && sys_datacommentid == k.sys_datacommentid">
+                    <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="replyContent" :placeholder="$t('我回复')+k.createby+':'"></el-input>
+                    <el-divider></el-divider>
+                    <div style="display: flex;justify-content: right">
+                      <el-button   type="primary" size="small" :disabled="replyContent.length == 0" @click="onReply(sys_datafollowupid,k)">{{$t(`发布`)}}</el-button>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </template>
+    </normalDialog>
+  </div>
+</template>
+
+<script>
+import marketingExpenses from '@/components/marketingExpenses/index'
+import normalDialog from '@/template/dialogTemplate/normal'
+import attachmentList from '@/components/attachment_list/index.vue'
+import editLog from '../followUp/editLog'
+export default {
+  name: "index",
+  props:['ownertable','disabled'],
+  components:{marketingExpenses,normalDialog,attachmentList,editLog},
+  data() {
+    return {
+      tableData:[],
+      currentPage:0,
+      total:0,
+      attinfo_attachment:[],
+      content:'',
+      comment:[],
+      commentqty:0,
+      userid:JSON.parse(sessionStorage.getItem('active_account')).userid,
+      isContentShow:false,
+      sys_datacommentid:'',
+      replyContent:'',
+      sys_datafollowupid:'',
+      param:{
+        "id": 20220930121501,
+        "content": {
+          "ownertable":'',
+          "ownerid":'',
+          "pageNumber": 1,
+          "pageSize": 50,
+          "where":{
+            "condition":''
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async listData(type,id){
+      this.param.content.ownerid = this.$route.query.id
+      this.param.content.ownertable = this.ownertable
+      const res = await this.$api.requested(this.param)
+      this.tableData = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      if (type){
+        this.tableData.forEach(item=>{
+          if (item.sys_datafollowupid == id){
+            this.comment = item.comment
+            this.commentqty = item.commentqty
+          }
+        })
+      }
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    tableClassName({ row, rowIndex }) {
+      row.index = rowIndex;
+    },
+    clearSearchValue () {
+      this.$store.dispatch('clearSearchValue')
+      this.listData(this.param.content.pageNumber = 1)
+    },
+    showFiles(data){
+      this.$refs.normalDialogFile.dialogVisible = true
+      this.attinfo_attachment = data.attinfos
+    },
+    showReview(data){
+      this.$refs.normalDialogReview.dialogVisible = true
+      this.comment = data.comment
+      this.commentqty = data.commentqty
+      this.sys_datafollowupid = data.sys_datafollowupid
+    },
+    onDel(data){
+      console.log(data,'删除')
+      this.$confirm(this.$t('确定删除该评论吗')+'?', this.$t('提示'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: 'warning'
+      }).then(async() => {
+        const res = await this.$api.requested({
+          "id": 20240429161701,
+          "content": {
+            "sys_datacommentid":data.sys_datacommentid
+          }
+        })
+        this.tool.showMessage(res,()=>{
+          this.listData('删除',this.sys_datafollowupid)
+          this.$emit('newFollow')
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: this.$t('已取消删除'),
+        });
+      });
+
+    },
+    async onReply(id,data){
+      const res = await this.$api.requested({
+        "id": 20240429161601,
+        "content": {
+          "ownertable":'sys_datafollowup',//数据表
+          "ownerid":id,//数据id
+          "content":this.replyContent,//内容
+          "replyid":data.sys_datacommentid//被回复评论id
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.replyContent = ''
+        this.isContentShow = false
+        this.sys_datacommentid = ''
+        this.listData('回复',this.sys_datafollowupid)
+        this.$emit('newFollow')
+      })
+    },
+    async onComment(){
+      const res = await this.$api.requested({
+        "id": 20240429161601,
+        "content": {
+          "ownertable":'sys_datafollowup',//数据表
+          "ownerid":this.sys_datafollowupid,//数据id
+          "content":this.content,//内容
+          "replyid":"0"//被回复评论id
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.content = ''
+        this.sys_datacommentid = ''
+        this.listData('回复',this.sys_datafollowupid)
+        this.$emit('newFollow')
+      })
+    },
+    closeDialog(){
+      this.content = ''
+      this.replyContent = ''
+      this.isContentShow = false
+    },
+    onSuccess(){
+      this.listData()
+      this.$emit('newFollow')
+    },
+    onDelFollow(val){
+      this.$confirm(this.$t('确定删除该跟进动态吗?'), this.$t('提示'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: 'warning'
+      }).then(async() => {
+        const res = await this.$api.requested({
+          "id": 20220930121701,
+          "content": {
+            "sys_datafollowupid":val.sys_datafollowupid
+          }
+        })
+        this.tool.showMessage(res,()=>{
+          this.listData()
+          this.$emit('newFollow')
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        });
+      });
+    }
+  },
+  mounted() {
+    this.listData()
+  }
+}
+</script>
+
+<style scoped>
+  .table-style{
+    width: 100%;
+    height: calc(100vh - 390px);
+  }
+  /deep/ .el-table .cell.el-tooltip {
+    white-space: break-spaces;
+    min-width: 50px;
+  }
+</style>

+ 3 - 2
src/components/normal-basic-layout-new/details/modules/followUp/editLog.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="inline-16">
-    <el-button type="text" size="mini" @click="onShow(dialogFormVisible = true)" :disabled="status === '已结案' || status === '已失败'">
+    <el-button v-if="isOperation" type="text" @click="onShow(dialogFormVisible = true)" size="mini">{{$t(`编辑`)}}</el-button>
+    <el-button v-else type="text" size="mini" @click="onShow(dialogFormVisible = true)" :disabled="status === '已结案' || status === '已失败'">
       <svg t="1727058404479" class="icon" viewBox="0 0 1024 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12347" width="14" height="14"><path d="M319.122286 565.101714a8.265143 8.265143 0 0 0-1.609143 2.852572l-51.2 188.928a32.109714 32.109714 0 0 0 39.277714 39.350857l187.538286-51.2h0.658286a8.118857 8.118857 0 0 0 5.851428-2.413714l501.540572-501.467429a80.457143 80.457143 0 0 0 23.04-57.344 98.011429 98.011429 0 0 0-29.257143-68.681143l-47.396572-47.469714a98.157714 98.157714 0 0 0-68.681143-29.257143 80.457143 80.457143 0 0 0-57.856 23.698286L319.853714 563.712c-0.512 0.512-0.365714 1.170286-0.731428 1.755429m632.685714-373.028572l-49.810286 49.810286-80.969143-81.92 49.078858-49.078857a23.332571 23.332571 0 0 1 31.744 2.267428l47.396571 47.469715a25.819429 25.819429 0 0 1 7.753143 17.993142 19.090286 19.090286 0 0 1-5.412572 13.604572m-543.524571 380.342857l361.764571-361.545143 80.457143 82.066286-360.521143 361.252571z m-65.828571 146.724571l26.185142-95.963428 69.778286 69.778286z m641.170285-328.704a34.742857 34.742857 0 0 0-34.596571 34.669715v467.894857a44.470857 44.470857 0 0 1-44.470857 44.397714H113.590857a44.544 44.544 0 0 1-44.470857-44.397714V130.486857a44.544 44.544 0 0 1 44.470857-44.470857h509.366857a34.596571 34.596571 0 0 0 0-69.193143H108.324571A108.544 108.544 0 0 0-0.073143 125.220571v773.558858a108.544 108.544 0 0 0 108.397714 108.397714h801.353143a108.470857 108.470857 0 0 0 108.397715-108.397714V426.130286a34.669714 34.669714 0 0 0-34.596572-34.450286" fill="#999999" p-id="12348"></path></svg>
       <span style="font-size: 14px;color: #333;margin-left: 5px;vertical-align: middle">{{$t(`编辑`)}}</span></el-button>
     <el-drawer :title="$t(`编辑跟进动态`)" size="600px" append-to-body :visible.sync="dialogFormVisible" @close="onClose">
@@ -76,7 +77,7 @@ import upload from '@/components/upload/hw_obs_upload.vue'
 import previewImage from '@/components/previewImage/index.vue'
 import contactsList from '@/template/projectChange/contactsList.vue'
 export default {
-  props:['data','ownertable','status','ownerid'],
+  props:['data','ownertable','status','ownerid','disabled','isOperation'],
   components:{
     upload,
     previewImage,

+ 12 - 2
src/components/normal-basic-layout-new/details/modules/followUp/followUp.vue

@@ -3,10 +3,10 @@
     <div class="container flex-align-center flex-between" style="padding: 10px 10px 0 10px !important;">
       <div>
         <slot name="collapse"></slot>
-        <p class="inline-16">{{$t(`跟进动态`)}}</p>
+        <p class="inline-16">{{$t(`跟进动态`)}}{{'('+ total +')'}}</p>
       </div>
       <div style="display: flex;justify-content: space-between">
-        <fullScreen class="inline-16" domId="containerFull" @onFull="onFull" @backFull="backFull"></fullScreen>
+        <el-button type="default" size="mini" @click="onMore('查看更多')" class="inline-16">{{$t(`查看更多`)}}</el-button>
         <addLog :ownertable="ownertable" @onSuccess="queryLogs" :status="status"></addLog>
       </div>
     </div>
@@ -229,6 +229,7 @@ export default {
       sys_datacommentid:'',
       isContentShow:false,
       replyContent:'',
+      total:0
     }
   },
   methods:{
@@ -238,12 +239,18 @@ export default {
         "content": {
           "ownertable":this.ownertable,
           "ownerid":this.$route.query.id,
+          "pageNumber": 1,
+          "pageSize": 9999,
           "where":{
             "condition":this.search
           }
         }
       })
       this.logList = res.data
+      this.total = res.total
+      setTimeout(()=>{
+        this.onMore()
+      },1000)
     },
     async queryLogsNew(ownertable,ownerid) {
       this.owneridNew = ownerid
@@ -368,6 +375,9 @@ export default {
       }else {
         this.commentShowId = i.sys_datafollowupid
       }
+    },
+    onMore(val){
+      this.$emit('onMore',val)
     }
   },
   mounted () {

+ 11 - 2
src/components/normal-basic-layout-new/details/modules/tabs/tab.vue

@@ -3,6 +3,7 @@
     <div>
       <el-tabs v-model="activeName"  @tab-click="handleClick">
         <el-tab-pane v-for="(tab,index) in tabs" :key="index" :label="$t(tab)" :name="'tab' + index"></el-tab-pane>
+        <el-tab-pane v-if="isFollow" :label="$t('跟进动态')" name="follow"></el-tab-pane>
         <el-tab-pane :label="$t('附件')" name="file"></el-tab-pane>
         <el-tab-pane :label="$t('操作记录')" name="log"></el-tab-pane>
       </el-tabs>
@@ -11,6 +12,9 @@
     <div v-show="'tab'+index === activeName" v-for="(item,index) in tabs" :key="index">
       <slot v-if="'tab'+index === activeName"  :name="'slot' + index"></slot>
     </div>
+    <div v-show="activeName === 'follow'">
+      <followTable :ownertable="ownertable" :disabled="disabled" @newFollow="newFollow" ref="followRef"></followTable>
+    </div>
     <div v-show="activeName === 'file'">
       <attachmentList v-if="activeName === 'file'" :status="status" :attinfos="attinfo_attachment" @onSuccess="queryAttments" @cancelEdit="queryAttments">
         <upload slot="upload" :folderid="folderid" :status="status"
@@ -28,13 +32,15 @@
 import attachmentList from '@/components/attachment_list/index.vue'
 import upload from '@/components/upload/hw_obs_upload.vue'
 import datalog from '../datalog/index.vue'
+import followTable from '../followTable/index'
 
 export default {
-  props:['tabs','editData','ownertable','idname','status','ownerid'],
+  props:['tabs','editData','ownertable','idname','status','ownerid','disabled','isFollow'],
   components:{
     attachmentList,
     upload,
-    datalog
+    datalog,
+    followTable
   },
   data () {
     return {
@@ -63,6 +69,9 @@ export default {
       console.log(this.activeName)
       /*this.queryAttments()*/
       this.$emit('onTabClick')
+    },
+    newFollow(){
+      this.$emit('newFollow')
     }
   },
   mounted () {

+ 13 - 2
src/components/normal-basic-layout/details/index.vue

@@ -82,7 +82,7 @@
       <el-row class="flex-align-stretch no-wrap" :gutter="activeApp.isdatateam?10:activeApp.isdatafollowup?10:0">
         <el-col style="flex:1 0 auto;" :span="activeApp.isdatateam?18:activeApp.isdatafollowup?18:24">
           <slot name="customBefore"></slot>
-          <tabTemp :disabled="disabled" :status="status" :tabs="tabs" :editData="editData" :idname="idname" :attachmentDisabled="attachmentDisabled" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onTabClick="onTabClick">
+          <tabTemp ref="tabRef" :disabled="disabled" :status="status" :tabs="tabs" :editData="editData" :idname="idname" :attachmentDisabled="attachmentDisabled" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onTabClick="onTabClick" @newFollow="newFollow" :isFollow="activeApp.isdatafollowup">
             <div :slot="'slot' + index" v-for="(tab,index) in tabs" :key="tab.index">
               <slot :name="'slot' + index"></slot>
             </div>
@@ -96,7 +96,7 @@
           <group v-if="activeApp.isdatateam" :isGroup="isGroup" :status="status" :disabled="disabled" ref="group" style="margin-bottom:10px"  :justsaler="justsaler" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onSuccess="onSuccess" @teamList="teamList">
             <el-button slot="collapse" type="text" icon="el-icon-s-unfold" class="inline-16" @click="onCollapse"></el-button>
           </group>
-          <follow-up v-if="activeApp.isdatafollowup" :status="status" ref="follow" :disabled="disabled" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" :editData="editData" :idname="idname" @logSuccess="logSuccess">
+          <follow-up v-if="activeApp.isdatafollowup" :status="status" ref="follow" :disabled="disabled" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" :editData="editData" :idname="idname" @logSuccess="logSuccess" @onMore="onMore">
             <el-button slot="collapse" type="text" icon="el-icon-s-unfold" class="inline-16" @click="onCollapse"></el-button>
           </follow-up>
         </el-col>
@@ -500,6 +500,17 @@ export default {
     },
     logSuccess(){
       this.$emit('logSuccess')
+    },
+    newFollow(){
+      setTimeout(()=>{
+        this.$refs.follow.queryLogs()
+      },1000)
+    },
+    onMore(val){
+      this.$refs.tabRef.$refs.followRef.listData()
+      if (val == '查看更多'){
+        this.$refs.tabRef.activeName = 'follow'
+      }
     }
   },
   mounted () {

+ 377 - 0
src/components/normal-basic-layout/details/modules/followTable/index.vue

@@ -0,0 +1,377 @@
+<template>
+  <div>
+    <el-input  style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="clearSearchValue" size="small" class="input-with-select inline-16 layout_search__panel mt-10" clearable>
+    </el-input>
+    <el-table
+        ref="table"
+        :row-class-name="tableClassName"
+        :data="tableData"
+        highlight-current-row
+        size="mini"
+        :header-cell-style="{height:'40px',color:'#606266',fontWeight:'400',fontSize:'14px'}"
+        :cell-style="{height:'40px',color:'#666666',fontWeight:'400'}"
+        border
+    >
+      <el-table-column
+          prop="createby"
+          label="跟进人"
+          min-width="60">
+      </el-table-column>
+      <el-table-column
+          prop="createdate"
+          label="跟进时间"
+          min-width="139">
+      </el-table-column>
+      <el-table-column
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail'"
+          prop="type"
+          label="跟进类型"
+          min-width="80">
+      </el-table-column>
+      <el-table-column
+          prop="contacts"
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail'"
+          label="跟进对象"
+          min-width="69">
+        <template slot-scope="scope">
+          <div v-for="item in scope.row.contacts" :key="item.index">
+            <span v-if="item.rowindex === scope.row.contacts.length" class="span-style">
+              {{item.name}}
+            </span>
+            <span v-else class="span-style">
+              {{item.name + ','}}
+            </span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+          prop="content"
+          label="跟进内容"
+          min-width="500"
+          >
+        <template slot-scope="scope">
+          <div v-if="($route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail')">
+            <div>{{$t(`目的:`)}}{{scope.row.target}}</div>
+            <div>{{$t(`过程:`)}}{{scope.row.content}}</div>
+            <div>{{$t(`结果:`)}}{{scope.row.results}}</div>
+            <div>{{$t(`下次跟进计划:`)}}{{scope.row.nextplan}}</div>
+          </div>
+          <div v-else>{{scope.row.content}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+          prop="attcount"
+          label="附件数"
+          min-width="69">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="showFiles(scope.row)">{{scope.row.attcount}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column
+          v-if="$route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail'"
+          prop="salesfeesamount"
+          label="营销费用"
+          min-width="80">
+        <template slot-scope="scope">
+          {{scope.row.salesfeesamount?tool.formatAmount(scope.row.salesfeesamount,2,'¥'):'¥0.00'}}
+        </template>
+      </el-table-column>
+      <el-table-column
+          label="操作"
+          fixed="right"
+          min-width="220">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="showReview(scope.row)" class="inline-16">{{$t(`评论`)}}({{scope.row.commentqty}})</el-button>
+          <editLog v-if="userid === scope.row.createuserid && !disabled"  ref="edits" :data="scope.row" :ownertable="ownertable" @onSuccess="onSuccess" :isOperation="true"></editLog>
+          <el-button type="text" size="small" class="inline-16" @click="onDelFollow(scope.row)" v-if="userid === scope.row.createuserid && !disabled">{{$t(`删除`)}}</el-button>
+          <marketingExpenses  v-if="($route.path === '/projectChangeDetail' || $route.path === '/customerDetail' || $route.path === '/PublicCustomerDetail') && !disabled"
+                              class="inline-16" ownertable="sa_customers" :ownerid="scope.row.sys_datafollowupid" :dataTime="scope.row.createdate" :userid="scope.row.createuserid" :isOperation="true"
+                              @onSuccess="listData"></marketingExpenses>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div  class="container normal-panel" style="text-align:right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="100"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+    <normalDialog ref="normalDialogFile" title="附件" >
+      <template slot="content">
+        <attachmentList style="margin-top: -10px;margin-bottom: 10px" :attinfos="attinfo_attachment" :onlyread="true" minWidth="80">
+        </attachmentList>
+      </template>
+    </normalDialog>
+    <normalDialog ref="normalDialogReview" title="评论" @closeDialog="closeDialog">
+      <template slot="content">
+        <div style="padding: 10px">
+          <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px">
+            <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="content" :placeholder="$t(`我评论`)+':'"></el-input>
+            <el-divider></el-divider>
+            <div style="display: flex;justify-content: right">
+              <el-button   type="primary" size="small" :disabled="content.length == 0" @click="onComment">{{$t(`发布`)}}</el-button>
+            </div>
+          </div>
+        </div>
+        <div style="padding: 0 10px 10px 10px">
+          <div style="max-height: 360px;min-height:200px;background: #F5F5F5;border-radius: 2px;padding: 10px;overflow:auto">
+            <div style="color: #333;font-size: 16px;font-weight: bold">{{$t(`评论`)}}({{commentqty}})</div>
+            <div v-for="item in comment" :key="item.index" style="margin-top: 10px">
+              <div style="color: #333;font-size: 14px;font-weight: bold;margin-top: 5px">{{item.createby}}</div>
+              <div style="color:#666;font-size: 14px;margin-top: 5px">{{item.content}}</div>
+              <div style="display: flex;justify-content: space-between;align-items: center;margin-top: -5px;margin-bottom: -5px">
+                <div style="display: flex;justify-content: space-between;align-items: center">
+                  <div style="font-size: 12px;color: #999">{{item.createdate}}</div>
+                  <el-button type="text" size="small" class="margin-5" v-if="userid == item.createuserid"><svg style="vertical-align: middle" t="1727053625238" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11334" width="14" height="14"><path d="M343.113143 156.379429h333.897143v-73.142858H343.113143v73.142858zM677.010286 0a83.456 83.456 0 0 1 83.456 83.456v64.146286h215.917714a46.299429 46.299429 0 1 1 0 92.672h-48.64v700.196571a83.456 83.456 0 0 1-83.456 83.456H176.128a83.456 83.456 0 0 1-83.456-83.456V240.054857H47.542857a46.299429 46.299429 0 0 1 0-92.452571h212.114286v-64.146286A83.456 83.456 0 0 1 343.113143 0h333.897143z m156.525714 241.371429H186.587429v688.859428h647.021714v-689.005714zM384.877714 345.6a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.691428-41.764571z m250.441143 0a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.545142-41.764571z" fill="#999999" p-id="11335"></path></svg>
+                    <span style="color: #666666;font-size: 14px;margin-left: 5px;vertical-align: middle" @click="onDel(item)">{{$t(`删除`)}}</span></el-button>
+                </div>
+                <div>
+                  <el-button type="text"  v-if="!isContentShow" size="small" @click="isContentShow = true;sys_datacommentid = item.sys_datacommentid">
+                    <svg t="1727055468269" class="icon" style="vertical-align: middle" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                    <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`回复`)}}</span></el-button>
+                  <el-button type="text"  v-if="isContentShow " size="small" @click="isContentShow = false;sys_datacommentid = ''">
+                    <svg t="1727055468269" class="icon" viewBox="0 0 1024 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                    <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`取消回复`)}}</span></el-button>
+                </div>
+              </div>
+              <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px" v-if="isContentShow && sys_datacommentid == item.sys_datacommentid">
+                <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="replyContent" :placeholder="$t('我回复')+item.createby+':'"></el-input>
+                <el-divider></el-divider>
+                <div style="display: flex;justify-content: right">
+                  <el-button   type="primary" size="small" :disabled="replyContent.length == 0" @click="onReply(sys_datafollowupid,item)">{{$t(`发布`)}}</el-button>
+                </div>
+              </div>
+              <div v-if="item.subcomment.length > 0" style="margin-left: 10px;margin-top: 10px">
+                <div v-for="k in item.subcomment" :key="k.index" style="margin-top: 10px">
+                  <div style="display: flex;justify-content: left;align-items: center">
+                    <div style="font-size: 14px;font-weight: bold;color:#333;">{{k.createby}}</div><i style="margin: 0 10px 0 10px" class="el-icon-caret-right"></i><div style="font-size: 14px;font-weight: bold;color:#333;">{{k.replyusername}}</div>
+                  </div>
+                  <div style="color:#666;font-size: 14px;margin-top: 5px">{{k.content}}</div>
+                  <div style="display: flex;justify-content: space-between;align-items: center;margin-top: -5px;margin-bottom: -5px">
+                    <div style="display: flex;justify-content: space-between;align-items: center">
+                      <div style="font-size: 12px;color:#999;margin-right: 10px">{{k.createdate}}</div>
+                      <el-button type="text" size="small" v-if="userid == k.createuserid"><svg style="vertical-align: middle" t="1727053625238" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11334" width="14" height="14"><path d="M343.113143 156.379429h333.897143v-73.142858H343.113143v73.142858zM677.010286 0a83.456 83.456 0 0 1 83.456 83.456v64.146286h215.917714a46.299429 46.299429 0 1 1 0 92.672h-48.64v700.196571a83.456 83.456 0 0 1-83.456 83.456H176.128a83.456 83.456 0 0 1-83.456-83.456V240.054857H47.542857a46.299429 46.299429 0 0 1 0-92.452571h212.114286v-64.146286A83.456 83.456 0 0 1 343.113143 0h333.897143z m156.525714 241.371429H186.587429v688.859428h647.021714v-689.005714zM384.877714 345.6a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.691428-41.764571z m250.441143 0a41.764571 41.764571 0 0 1 41.764572 41.764571v333.897143a41.764571 41.764571 0 0 1-83.456 0V387.364571a41.764571 41.764571 0 0 1 41.545142-41.764571z" fill="#999999" p-id="11335"></path></svg>
+                        <span style="color: #666666;font-size: 14px;margin-left: 5px;vertical-align: middle" @click="onDel(k)">{{$t(`删除`)}}</span></el-button>
+                    </div>
+                    <div>
+                      <el-button  type="text" v-if="!isContentShow "  size="small" @click="isContentShow = true;sys_datacommentid = k.sys_datacommentid">
+                        <svg t="1727055468269" class="icon" style="vertical-align: middle" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                        <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`回复`)}}</span></el-button>
+                      <el-button type="text" v-if="isContentShow " size="small" @click="isContentShow = false;sys_datacommentid = ''">
+                        <svg t="1727055468269" style="vertical-align: middle" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11646" width="14" height="14"><path d="M643.657143 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286 36.571429 0 58.514286-29.257143 58.514285-58.514286 0-36.571429-29.257143-58.514286-58.514285-58.514286-29.257143-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11647"></path><path d="M1024 142.774857c0-43.885714-43.885714-87.771429-87.771429-87.771428H87.771429c-43.885714 0-87.771429 36.571429-87.771429 87.771428v621.714286c0 51.2 43.885714 87.771429 87.771429 87.771428h307.2l117.028571 117.028572 117.028571-117.028572h307.2c51.2 0 87.771429-43.885714 87.771429-87.771428v-621.714286z m-65.828571 592.457143c0 29.257143-21.942857 51.2-51.2 51.2H592.457143l-80.457143 80.457143-80.457143-80.457143H117.028571c-29.257143 0-51.2-21.942857-51.2-51.2v-563.2c0-29.257143 21.942857-51.2 51.2-51.2h789.942858c29.257143 0 51.2 21.942857 51.2 51.2v563.2z" fill="#3874F6" p-id="11648"></path><path d="M453.485714 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514286-58.514286c0-36.571429-21.942857-65.828571-58.514286-65.828572s-58.514286 29.257143-58.514286 65.828572M256 457.289143c0 36.571429 29.257143 58.514286 58.514286 58.514286s58.514286-29.257143 58.514285-58.514286c0-36.571429-29.257143-58.514286-58.514285-58.514286-36.571429-7.314286-58.514286 21.942857-58.514286 58.514286" fill="#3874F6" p-id="11649"></path></svg>
+                        <span style="color: #3874F6;font-size: 14px;margin-left: 5px;vertical-align: middle">{{$t(`取消回复`)}}</span></el-button>
+                    </div>
+                  </div>
+                  <div style="border: 1px solid #9ca3af;padding: 10px;border-radius: 5px" v-if="isContentShow && sys_datacommentid == k.sys_datacommentid">
+                    <el-input type="textarea" style="border: none;margin-bottom: 10px" :rows="1" v-model="replyContent" :placeholder="$t('我回复')+k.createby+':'"></el-input>
+                    <el-divider></el-divider>
+                    <div style="display: flex;justify-content: right">
+                      <el-button   type="primary" size="small" :disabled="replyContent.length == 0" @click="onReply(sys_datafollowupid,k)">{{$t(`发布`)}}</el-button>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </template>
+    </normalDialog>
+  </div>
+</template>
+
+<script>
+import marketingExpenses from '@/components/marketingExpenses/index'
+import normalDialog from '@/template/dialogTemplate/normal'
+import attachmentList from '@/components/attachment_list/index.vue'
+import editLog from '../followUp/editLog'
+export default {
+  name: "index",
+  props:['ownertable','disabled'],
+  components:{marketingExpenses,normalDialog,attachmentList,editLog},
+  data() {
+    return {
+      tableData:[],
+      currentPage:0,
+      total:0,
+      attinfo_attachment:[],
+      content:'',
+      comment:[],
+      commentqty:0,
+      userid:JSON.parse(sessionStorage.getItem('active_account')).userid,
+      isContentShow:false,
+      sys_datacommentid:'',
+      replyContent:'',
+      sys_datafollowupid:'',
+      param:{
+        "id": 20220930121501,
+        "content": {
+          "ownertable":'',
+          "ownerid":'',
+          "pageNumber": 1,
+          "pageSize": 50,
+          "where":{
+            "condition":''
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async listData(type,id){
+      this.param.content.ownerid = this.$route.query.id
+      this.param.content.ownertable = this.ownertable
+      const res = await this.$api.requested(this.param)
+      this.tableData = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      if (type){
+        this.tableData.forEach(item=>{
+          if (item.sys_datafollowupid == id){
+            this.comment = item.comment
+            this.commentqty = item.commentqty
+          }
+        })
+      }
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    tableClassName({ row, rowIndex }) {
+      row.index = rowIndex;
+    },
+    clearSearchValue () {
+      this.$store.dispatch('clearSearchValue')
+      this.listData(this.param.content.pageNumber = 1)
+    },
+    showFiles(data){
+      this.$refs.normalDialogFile.dialogVisible = true
+      this.attinfo_attachment = data.attinfos
+    },
+    showReview(data){
+      this.$refs.normalDialogReview.dialogVisible = true
+      this.comment = data.comment
+      this.commentqty = data.commentqty
+      this.sys_datafollowupid = data.sys_datafollowupid
+    },
+    onDel(data){
+      console.log(data,'删除')
+      this.$confirm(this.$t('确定删除该评论吗')+'?', this.$t('提示'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: 'warning'
+      }).then(async() => {
+        const res = await this.$api.requested({
+          "id": 20240429161701,
+          "content": {
+            "sys_datacommentid":data.sys_datacommentid
+          }
+        })
+        this.tool.showMessage(res,()=>{
+          this.listData('删除',this.sys_datafollowupid)
+          this.$emit('newFollow')
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: this.$t('已取消删除'),
+        });
+      });
+
+    },
+    async onReply(id,data){
+      const res = await this.$api.requested({
+        "id": 20240429161601,
+        "content": {
+          "ownertable":'sys_datafollowup',//数据表
+          "ownerid":id,//数据id
+          "content":this.replyContent,//内容
+          "replyid":data.sys_datacommentid//被回复评论id
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.replyContent = ''
+        this.isContentShow = false
+        this.sys_datacommentid = ''
+        this.listData('回复',this.sys_datafollowupid)
+        this.$emit('newFollow')
+      })
+    },
+    async onComment(){
+      const res = await this.$api.requested({
+        "id": 20240429161601,
+        "content": {
+          "ownertable":'sys_datafollowup',//数据表
+          "ownerid":this.sys_datafollowupid,//数据id
+          "content":this.content,//内容
+          "replyid":"0"//被回复评论id
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.content = ''
+        this.sys_datacommentid = ''
+        this.listData('回复',this.sys_datafollowupid)
+        this.$emit('newFollow')
+      })
+    },
+    closeDialog(){
+      this.content = ''
+      this.replyContent = ''
+      this.isContentShow = false
+    },
+    onSuccess(){
+      this.listData()
+      this.$emit('newFollow')
+    },
+    onDelFollow(val){
+      this.$confirm(this.$t('确定删除该跟进动态吗?'), this.$t('提示'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: 'warning'
+      }).then(async() => {
+        const res = await this.$api.requested({
+          "id": 20220930121701,
+          "content": {
+            "sys_datafollowupid":val.sys_datafollowupid
+          }
+        })
+        this.tool.showMessage(res,()=>{
+          this.listData()
+          this.$emit('newFollow')
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        });
+      });
+    }
+  },
+  mounted() {
+    this.listData()
+  }
+}
+</script>
+
+<style scoped>
+  .table-style{
+    width: 100%;
+    height: calc(100vh - 390px);
+  }
+  /deep/ .el-table .cell.el-tooltip {
+     white-space: break-spaces;
+    min-width: 50px;
+  }
+</style>

+ 1 - 1
src/components/normal-basic-layout/details/modules/followUp/addLog.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-button type="default" size="mini" @click="onShow" :disabled="status === '已结案' || status === '已失败' || disabled">{{$t(`新 建`)}}</el-button>
+    <el-button type="primary" size="mini" @click="onShow" :disabled="status === '已结案' || status === '已失败' || disabled">{{$t(`新 建`)}}</el-button>
     <el-drawer :title="$t(`新建跟进动态`)" size="600px" append-to-body :visible.sync="dialogFormVisible" @close="onClose">
       <div class="drawer__panel">
         <el-form :model="form" ref="form" label-position="top" :label-width="tool.onlyZh('80px')">

+ 3 - 2
src/components/normal-basic-layout/details/modules/followUp/editLog.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="inline-16">
-    <el-button  type="text" size="mini" @click="onShow(dialogFormVisible = true)" :disabled="status === '已结案' || status === '已失败'">
+    <el-button v-if="isOperation" type="text" @click="onShow(dialogFormVisible = true)" size="mini">{{$t(`编辑`)}}</el-button>
+    <el-button v-else type="text" size="mini" @click="onShow(dialogFormVisible = true)" :disabled="status === '已结案' || status === '已失败'">
       <svg t="1727058404479" class="icon" viewBox="0 0 1024 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12347" width="14" height="14"><path d="M319.122286 565.101714a8.265143 8.265143 0 0 0-1.609143 2.852572l-51.2 188.928a32.109714 32.109714 0 0 0 39.277714 39.350857l187.538286-51.2h0.658286a8.118857 8.118857 0 0 0 5.851428-2.413714l501.540572-501.467429a80.457143 80.457143 0 0 0 23.04-57.344 98.011429 98.011429 0 0 0-29.257143-68.681143l-47.396572-47.469714a98.157714 98.157714 0 0 0-68.681143-29.257143 80.457143 80.457143 0 0 0-57.856 23.698286L319.853714 563.712c-0.512 0.512-0.365714 1.170286-0.731428 1.755429m632.685714-373.028572l-49.810286 49.810286-80.969143-81.92 49.078858-49.078857a23.332571 23.332571 0 0 1 31.744 2.267428l47.396571 47.469715a25.819429 25.819429 0 0 1 7.753143 17.993142 19.090286 19.090286 0 0 1-5.412572 13.604572m-543.524571 380.342857l361.764571-361.545143 80.457143 82.066286-360.521143 361.252571z m-65.828571 146.724571l26.185142-95.963428 69.778286 69.778286z m641.170285-328.704a34.742857 34.742857 0 0 0-34.596571 34.669715v467.894857a44.470857 44.470857 0 0 1-44.470857 44.397714H113.590857a44.544 44.544 0 0 1-44.470857-44.397714V130.486857a44.544 44.544 0 0 1 44.470857-44.470857h509.366857a34.596571 34.596571 0 0 0 0-69.193143H108.324571A108.544 108.544 0 0 0-0.073143 125.220571v773.558858a108.544 108.544 0 0 0 108.397714 108.397714h801.353143a108.470857 108.470857 0 0 0 108.397715-108.397714V426.130286a34.669714 34.669714 0 0 0-34.596572-34.450286" fill="#999999" p-id="12348"></path></svg>
       <span style="font-size: 14px;color: #333;margin-left: 5px;vertical-align: middle" >{{$t(`编辑`)}}</span></el-button>
     <el-drawer :title="$t(`编辑跟进动态`)" size="600px" append-to-body :visible.sync="dialogFormVisible" @close="onClose">
@@ -76,7 +77,7 @@ import upload from '@/components/upload/hw_obs_upload.vue'
 import previewImage from '@/components/previewImage/index.vue'
 import contactsList from '@/template/projectChange/contactsList.vue'
 export default {
-  props:['data','ownertable','status','disabled'],
+  props:['data','ownertable','status','disabled','isOperation'],
   components:{
     upload,
     previewImage,

+ 13 - 2
src/components/normal-basic-layout/details/modules/followUp/followUp.vue

@@ -3,10 +3,11 @@
     <div class="container flex-align-center flex-between" style="padding: 10px 10px 0 10px !important;">
       <div>
         <slot name="collapse"></slot>
-        <p class="inline-16">{{$t(`跟进动态`)}}</p>
+        <p class="inline-16">{{$t(`跟进动态`)}}{{'('+ total +')'}}</p>
       </div>
       <div style="display: flex;justify-content: space-between">
-        <fullScreen class="inline-16" domId="containerFull" @onFull="onFull" @backFull="backFull"></fullScreen>
+<!--        <fullScreen class="inline-16" domId="containerFull" @onFull="onFull" @backFull="backFull"></fullScreen>-->
+        <el-button type="default" size="mini" @click="onMore('查看更多')" class="inline-16">{{$t(`查看更多`)}}</el-button>
         <addLog :ownertable="ownertable" @onSuccess="queryLogs" :status="status" :disabled="disabled"></addLog>
       </div>
     </div>
@@ -229,6 +230,7 @@ export default {
       sys_datacommentid:'',
       isContentShow:false,
       replyContent:'',
+      total:0
     }
   },
   methods:{
@@ -238,12 +240,18 @@ export default {
         "content": {
             "ownertable":this.ownertable,
             "ownerid":this.$route.query.id,
+            "pageNumber": 1,
+            "pageSize": 9999,
             "where":{
               "condition":this.search
             }
         }
       })
       this.logList = res.data
+      this.total = res.total
+      setTimeout(()=>{
+        this.onMore()
+      },1000)
     },
     async queryLogsNew(ownertable,ownerid) {
       this.owneridNew = ownerid
@@ -368,6 +376,9 @@ export default {
       }else {
         this.commentShowId = i.sys_datafollowupid
       }
+    },
+    onMore(val){
+      this.$emit('onMore',val)
     }
   },
   mounted () {

+ 11 - 2
src/components/normal-basic-layout/details/modules/tabs/tab.vue

@@ -3,6 +3,7 @@
     <div>
       <el-tabs v-model="activeName"  @tab-click="handleClick">
         <el-tab-pane v-for="(tab,index) in tabs" :key="index" :label="$t(tab)" :name="'tab' + index"></el-tab-pane>
+        <el-tab-pane v-if="isFollow" :label="$t('跟进动态')" name="follow"></el-tab-pane>
         <el-tab-pane :label="$t('附件')" name="file"></el-tab-pane>
         <el-tab-pane :label="$t('操作记录')" name="log"></el-tab-pane>
       </el-tabs>
@@ -11,6 +12,9 @@
     <div v-show="'tab'+index === activeName" v-for="(item,index) in tabs" :key="index">
       <slot v-if="'tab'+index === activeName"  :name="'slot' + index"></slot>
     </div>
+    <div v-show="activeName === 'follow'">
+      <followTable :ownertable="ownertable" :disabled="disabled" @newFollow="newFollow" ref="followRef"></followTable>
+    </div>
     <div v-show="activeName === 'file'">
       <attachmentList v-if="activeName === 'file'" :disabled="disabled" :status="status" :attachmentDisabled="attachmentDisabled"  :attinfos="attinfo_attachment" @onSuccess="queryAttments" @cancelEdit="queryAttments">
         <upload slot="upload" :folderid="folderid" :status="status" :attachmentDisabled="attachmentDisabled" :disabled="disabled"
@@ -28,13 +32,15 @@
 import attachmentList from '@/components/attachment_list/index.vue'
 import upload from '@/components/upload/hw_obs_upload.vue'
 import datalog from '../datalog/index.vue'
+import followTable from '../followTable/index'
 
 export default {
-  props:['tabs','editData','ownertable','idname','status','attachmentDisabled','disabled'],
+  props:['tabs','editData','ownertable','idname','status','attachmentDisabled','disabled','isFollow'],
   components:{
     attachmentList,
     upload,
-    datalog
+    datalog,
+    followTable
   },
   data () {
     return {
@@ -61,6 +67,9 @@ export default {
     handleClick(){
       console.log(this.activeName)
       this.$emit('onTabClick')
+    },
+    newFollow(){
+      this.$emit('newFollow')
     }
   },
   mounted () {

+ 10 - 0
src/router/HManagement.js

@@ -703,6 +703,16 @@ const HManagement = [
       keeproute: true
     },
     component: () => import(/* webpackChunkName: "about" */ '@/HManagement/serviceDataScreen/index')
+  },
+  {
+    path: '/actsRecMag',
+    name: 'actsRecMag',
+    meta: {
+      title: '应收账款管理',
+      ast_nav: true,
+      keeproute: true
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/HManagement/actsRecMag/index')
   }
 
 ]

+ 10 - 0
src/router/SManagement.js

@@ -273,5 +273,15 @@ const SManagement = [{
     },
   ]
 },
+  {
+    path: '/actsRec',
+    name: 'actsRec',
+    meta: {
+      title: '应收账款',
+      ast_nav: true,
+      keeproute: true
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/SManagement/actsRec/index')
+  }
 ]
 export default SManagement

+ 79 - 0
src/template/dialogTemplate/normal.vue

@@ -0,0 +1,79 @@
+<template>
+  <div>
+    <el-dialog
+        :title="title"
+        :visible.sync="dialogVisible"
+        width="700px"
+        append-to-body
+        :show-close="false"
+        >
+      <slot name="content"></slot>
+      <div slot="footer" class="dialog-footer" style="margin-top: 0;!important;">
+        <el-button @click="onClose" size="small" style="width: 200px">{{$t(`关闭`)}}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: "normal",
+  props:{
+    title:String,
+  },
+  data() {
+    return {
+      dialogVisible:false
+    }
+  },
+  methods:{
+    onClose(){
+      this.dialogVisible = false
+      this.$emit('closeDialog')
+    }
+  },
+}
+</script>
+
+<style scoped>
+  /deep/ .el-dialog__title {
+    line-height: 24px;
+    font-size: 16px;
+    color: #303133;
+  }
+  /deep/ .el-dialog__header {
+    padding: 10px 10px;
+    padding-bottom: 10px;
+  }
+  /deep/ .el-dialog__footer {
+    padding: 10px;
+    padding-top: 10px;
+    text-align: right;
+    box-sizing: border-box;
+  }
+  /deep/ .el-dialog__headerbtn {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    padding: 0;
+    background: 0 0;
+    border: none;
+    outline: 0;
+    cursor: pointer;
+    font-size: 16px;
+  }
+  /deep/ .el-dialog__body {
+    padding: 0px 10px !important;
+  }
+  /deep/ .el-form-item__label {
+    text-align: right;
+    vertical-align: middle;
+    float: left;
+    font-size: 13px;
+    color: #606266;
+    line-height: 40px;
+    padding: 0 12px 0 0;
+    box-sizing: border-box;
+  }
+</style>

+ 5 - 7
src/template/tableMainLayout/index.vue

@@ -13,6 +13,9 @@
           @handleSelectionChange="handleSelectionChange">
       </el-table-column>
       <el-table-column show-overflow-tooltip v-for="(col,index) in layout" :key="col.tablecolid" :prop="col.columnname" :label="col.title" :min-width="col.width || 150" :fixed="fixedName ? fixedName.indexOf(col.columnname)!= -1?redirect ? redirect : 'right' :false : false">
+        <template :slot="headerOptions ? headerOptions.includes(col.columnname) ? 'header' : '' : ''" slot-scope="scope">
+          <slot name="header" :column="{data:scope.row,columnname:col.columnname}"></slot>
+        </template>
         <template slot-scope="scope">
 
           <slot v-if="col.columnname !== 'operation'" name="customcol" :column="{data:scope.row,columnname:col.columnname}"></slot>
@@ -51,7 +54,7 @@ export default {
     custom:是否启用自定义结构;
     opwidth:操作列宽度
   */
-  props:['data','tableName','custom','layout','fixRightData','fixLeftData','height','fixedName','redirect','isCheck'],
+  props:['data','tableName','custom','layout','fixRightData','fixLeftData','height','fixedName','redirect','isCheck','headerOptions'],
   data () {
     return {
       list:[],
@@ -66,11 +69,6 @@ export default {
     })
   },
   watch:{
-    tableName () {
-      this.$nextTick(() => {
-        this.$refs.tables.doLayout()
-      });
-    },
     data(){
       this.$nextTick(() => {
         this.$refs.tables.doLayout()
@@ -99,7 +97,7 @@ export default {
     },
     inputChange (val) {
       this.value = val
-    }
+    },
   },
   mounted () {
   }