Browse Source

应收账款管理

qymljy 1 year ago
parent
commit
4eb3bb047c

+ 261 - 0
src/HDrpManagement/accountsReceivableMag/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div>
+    <normal-layout style="height: calc(100vh - 125px)">
+      <div slot="titleRight">
+        <exportFile :param="param" :columns="param.content.querytype == '0'?tablecolsSaler:tablecolsCustomer" fileName="应收账款" :dataid="param.content.dataid"></exportFile>
+      </div>
+      <div slot="content">
+        <div class="container">
+          <template>
+            <div class="mt-10 inline-16">
+              <label class="search__label">查询方式:</label>
+              <el-radio-group v-model="param.content.querytype" @change="listData">
+                <el-radio :label="0">按业务员</el-radio>
+                <el-radio :label="1">按客户</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="mt-10 inline-16" style="margin-left: 20px">
+              <departmentSalesperson ref="departmentSalesperson" class="inline-16" @depSelect="depSelect" @personSelect="personSelect" ></departmentSalesperson>
+            </div>
+            <div  class="inline-16">
+              <label class="search__label">入账节点:</label>
+              <el-select v-model="param.content.point" placeholder="请选择" size="small" @change="listData">
+                <el-option label="全部" value="全部" ></el-option>
+                <el-option label="订单" value="订单" ></el-option>
+                <el-option label="出货" value="出货" ></el-option>
+                <el-option label="开票" value="开票" ></el-option>
+              </el-select>
+            </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">{{'总应收'}}</p>
+                    <p class="normal-title" style="font-size:1.825rem;color:#151515" >
+                      <small>{{allList.sumallaoverduemount || allList.sumallaoverduemount == '0'?'¥':''}}</small>
+                      {{allList.sumallaoverduemount || allList.sumallaoverduemount == 0?tool.formatAmount(allList.sumallaoverduemount,2):'--'}}
+                    </p>
+                  </div>
+                </el-col>
+                <el-col :span="6" class="mt-10">
+                  <div class="acccounet__panel" style="border:1px solid #d8dde8">
+                    <p class="normal-margin">{{'逾期1月以内'}}</p>
+                    <p class="normal-title" style="font-size:1.825rem;color:#151515" >
+                      <small>{{allList.sumonemonthamount || allList.sumonemonthamount == '0'?'¥':''}}</small>
+                      {{allList.sumonemonthamount || allList.sumonemonthamount == 0?tool.formatAmount(allList.sumonemonthamount,2):'--'}}</p>
+                  </div>
+                </el-col>
+                <el-col :span="6" class="mt-10">
+                  <div class="acccounet__panel" style="border:1px solid #d8dde8">
+                    <p class="normal-margin">{{'逾期1-3月'}}</p>
+                    <p class="normal-title" style="font-size:1.825rem;color:#151515" >
+                      <small>{{allList.sumthreemonthamount || allList.sumthreemonthamount == '0'?'¥':''}}</small>
+                      {{allList.sumthreemonthamount || allList.sumthreemonthamount == 0?tool.formatAmount(allList.sumthreemonthamount,2):'--'}}</p>
+                  </div>
+                </el-col>
+                <el-col :span="6" class="mt-10">
+                  <div class="acccounet__panel" style="border:1px solid #d8dde8">
+                    <p class="normal-margin">{{'逾期3月及以上'}}</p>
+                    <p class="normal-title" style="font-size:1.825rem;color:#151515" >
+                      <small>{{allList.sumupthreemonthamount || allList.sumupthreemonthamount == '0'?'¥':''}}</small>
+                      {{allList.sumupthreemonthamount || allList.sumupthreemonthamount == 0?tool.formatAmount(allList.sumupthreemonthamount,2):'--'}}</p>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+            <div style="flex:0 1 auto;width: 100%;">
+              <tableMainLayout :layout="param.content.querytype == '0'?tablecolsSaler:tablecolsCustomer" height="calc(100vh - 410px)" :data="list" fixedName="operation" :width="true" :custom="true">
+                <template v-slot:customcol="scope">
+                  <div v-if="scope.column.columnname === 'allaoverduemount'">
+                    <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'onemonthamount'">
+                    <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'threemonthamount'">
+                    <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+                  </div>
+                  <div v-else-if="scope.column.columnname === 'upthreemonthamount'">
+                    <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+                  </div>
+                  <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?scope.column.data[scope.column.columnname]:'--'}}</p>
+                </template>
+                <template v-slot:opreation="scope">
+                  <detailInfo :data="scope.data" :items="param.content"></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:[],
+      tablecolsSaler:[],
+      tablecolsCustomer:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      allList:{},
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+          "issystem": 1
+        }
+      },
+      param:{
+        "id": 20240423110404,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "type":"0",//1按部门 0按人员
+          "dataid":JSON.parse(sessionStorage.getItem('active_account')).userid,//部门人员id
+          "querytype":0,//0按业务员 1按客户
+          "point":"全部",// 入账节点
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  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
+    },
+    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()
+    this.listData()
+  },
+  created() {
+    this.tablecolsSaler = this.tool.tabelCol(this.$route.name).accountsReceivableSalerTable.tablecols
+    this.tablecolsCustomer = this.tool.tabelCol(this.$route.name).accountsReceivableCustomerTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+.acccounet__panel{
+  padding: 10px;
+  line-height: 30px;
+  border:1px solid #f1f2f3;
+  color:#666;
+  border-radius: 5px;
+  cursor: pointer;
+}
+</style>

+ 106 - 0
src/HDrpManagement/accountsReceivableMag/modules/detailInfo.vue

@@ -0,0 +1,106 @@
+<template>
+  <div>
+    <el-button size="mini" type="text" @click="onShow(dialogVisible = true)">明细</el-button>
+    <el-drawer
+        :title="param.content.querytype == '0'?'业务员逾期订单明细':'客户逾期订单明细'"
+        :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="param.content.querytype == '0'?tablecolsSaler:tablecolsCustomer" :fileName="param.content.querytype == '0'?'业务员逾期订单明细':'客户逾期订单明细'" :dataid="param.content.dataid"></exportFile>
+        <tableNewLayout :layout="param.content.querytype == '0'?tablecolsSaler:tablecolsCustomer"  height="calc(100vh - 207px)" :data="list" fixedName="operation" :width="true" :custom="true">
+          <template v-slot:customcol="scope">
+            <div v-if="scope.column.columnname === 'overdueamount'">
+              <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+            </div>
+            <div v-else-if="scope.column.columnname === 'amount'">
+              <span><small>¥</small>{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}</span>
+            </div>
+            <p v-else>{{scope.column.data[scope.column.columnname] || scope.column.columnname === 'operation'?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'],
+  data(){
+    return {
+      dialogVisible:false,
+      tablecolsSaler:[],
+      tablecolsCustomer:[],
+      list:[],
+      currentPage:0,
+      total:0,
+      param:{
+        "id": 202400321085104,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 100,
+          "dataid":"",// 按业务员时 传userid 按客户时传 sa_customersid
+          "querytype":"",//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.tablecolsSaler = this.tool.tabelCol(this.$route.name).salerDetailTable.tablecols
+    this.tablecolsCustomer = this.tool.tabelCol(this.$route.name).customerDetailTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 10 - 0
src/router/HDrpManagement.js

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