Browse Source

feat(资产数据管理):资产数据管理页面构建

sufan 3 months ago
parent
commit
bc237a1e17

+ 1 - 1
src/api/dataSource/businessLedger/index.ts

@@ -17,7 +17,7 @@ export function submitBusines(data) {
 }
 
 
-// 其他业务修改 - 下载
+// 业务台账 - 下载
 export function downloadFiles(data) {
   return http.post<any, AxiosResponseRes>('/business/standingBook/downloadBusinessStandingBook', { data, responseType: 'arraybuffer' })
 }

+ 6 - 0
src/api/dataSource/customerLedger/index.ts

@@ -0,0 +1,6 @@
+import { http } from "@/utils/http"
+
+// 业务台账-列表
+export function getList(data?) {
+  return http.post<any, AxiosResponseRes>('/customer/standingBook/list', { data })
+}

+ 139 - 99
src/router/modules/dataSource.ts

@@ -12,7 +12,114 @@ export default {
     icon: 'system'
   },
   children: [
-     {
+    {
+      path: '/financialReport',
+      name: 'FinancialReport',
+      component: () => import('@/views/dataSource/financialStatement/index.vue'),
+      meta: {
+        title: '财务报表',
+        showParent: true
+      },
+      children: [
+        {
+          path: '/financialReport/financialReportAdd',
+          name: 'FinancialReportAdd',
+          component: () => import('@/views/dataSource/financialStatement/Add.vue'),
+          meta: {
+            title: '新增财务报表',
+            activePath: '/financialReport',
+            showLink: false
+          },
+        },
+        {
+          path: '/financialReport/financialReportDetail',
+          name: 'FinancialReportDetail',
+          component: () => import('@/views/dataSource/financialStatement/Detail.vue'),
+          meta: {
+            title: '财务报表查看',
+            activePath: '/financialReport',
+            showLink: false
+          },
+        }
+      ]
+    },
+    {
+      path: '/annualSetting',
+      name: 'AnnualSetting',
+      component: () => import('@/views/dataSource/annualSetting/index.vue'),
+      meta: {
+        title: '年度设定'
+      },
+      children: [
+        {
+          path: '/annualSetting/annualGoalAdd',
+          name: 'AnnualGoalAdd',
+          component: () => import('@/views/dataSource/annualSetting/annualGoalAdd.vue'),
+          meta: {
+            title: '年度目标新增',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+        {
+          path: '/annualSetting/annualGoalDetail',
+          name: 'AnnualGoalDetail',
+          component: () => import('@/views/dataSource/annualSetting/annualGoalDetail.vue'),
+          meta: {
+            title: '年度目标查看',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+        {
+          path: '/annualSetting/annualBudgetAdd',
+          name: 'AnnualBudgetAdd',
+          component: () => import('@/views/dataSource/annualSetting/annualBudgetAdd.vue'),
+          meta: {
+            title: '公司预算新增',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+        {
+          path: '/annualSetting/annualBudgetDetail',
+          name: 'AnnualBudgetDetail',
+          component: () => import('@/views/dataSource/annualSetting/annualBudgetDetail.vue'),
+          meta: {
+            title: '公司预算查看',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+        {
+          path: '/annualSetting/annualBudgetPartAdd',
+          name: 'AnnualBudgetPartAdd',
+          component: () => import('@/views/dataSource/annualSetting/annualBudgetPartAdd.vue'),
+          meta: {
+            title: '部门预算新增',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+        {
+          path: '/annualSetting/annualBudgetPartDetail',
+          name: 'AnnualBudgetPartDetail',
+          component: () => import('@/views/dataSource/annualSetting/annualBudgetPartDetail.vue'),
+          meta: {
+            title: '部门预算查看',
+            showParent: true,
+            activePath: '/annualSetting',
+            showLink: false
+          },
+        },
+      ]
+    },
+    {
       path: '/receiveLendingLedger',
       name: 'ReceiveLendingLedger',
       component: () => import('@/views/dataSource/receiveLendingLedger/index.vue'),
@@ -105,32 +212,21 @@ export default {
       ]
     },
     {
-      path: '/financialReport',
-      name: 'FinancialReport',
-      component: () => import('@/views/dataSource/financialStatement/index.vue'),
+      path: '/assetDataManage',
+      name: 'AssetDataManage',
+      component: () => import('@/views/dataSource/assetDataManage/index.vue'),
       meta: {
-        title: '财务报表',
-        showParent: true
+        title: '资产数据管理'
       },
       children: [
         {
-          path: '/financialReport/financialReportAdd',
-          name: 'FinancialReportAdd',
-          component: () => import('@/views/dataSource/financialStatement/Add.vue'),
-          meta: {
-            title: '新增财务报表',
-            activePath: '/financialReport',
-            showLink: false
-          },
-        },
-        {
-          path: '/financialReport/financialReportDetail',
-          name: 'FinancialReportDetail',
-          component: () => import('@/views/dataSource/financialStatement/Detail.vue'),
+          path: '/customerLedgerDetails',
+          name: 'CustomerLedgerDetails',
+          component: () => import('@/views/dataSource/customerLedger/details.vue'),
           meta: {
-            title: '财务报表查看',
-            activePath: '/financialReport',
-            showLink: false
+            title: '客户台账明细',
+            showLink: false,
+            activePath: '/customerLedger'
           },
         }
       ]
@@ -219,82 +315,6 @@ export default {
         }
       ]
     },
-    {
-      path: '/annualSetting',
-      name: 'AnnualSetting',
-      component: () => import('@/views/dataSource/annualSetting/index.vue'),
-      meta: {
-        title: '年度设定'
-      },
-      children: [
-        {
-          path: '/annualSetting/annualGoalAdd',
-          name: 'AnnualGoalAdd',
-          component: () => import('@/views/dataSource/annualSetting/annualGoalAdd.vue'),
-          meta: {
-            title: '年度目标新增',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-        {
-          path: '/annualSetting/annualGoalDetail',
-          name: 'AnnualGoalDetail',
-          component: () => import('@/views/dataSource/annualSetting/annualGoalDetail.vue'),
-          meta: {
-            title: '年度目标查看',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-        {
-          path: '/annualSetting/annualBudgetAdd',
-          name: 'AnnualBudgetAdd',
-          component: () => import('@/views/dataSource/annualSetting/annualBudgetAdd.vue'),
-          meta: {
-            title: '公司预算新增',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-        {
-          path: '/annualSetting/annualBudgetDetail',
-          name: 'AnnualBudgetDetail',
-          component: () => import('@/views/dataSource/annualSetting/annualBudgetDetail.vue'),
-          meta: {
-            title: '公司预算查看',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-        {
-          path: '/annualSetting/annualBudgetPartAdd',
-          name: 'AnnualBudgetPartAdd',
-          component: () => import('@/views/dataSource/annualSetting/annualBudgetPartAdd.vue'),
-          meta: {
-            title: '部门预算新增',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-        {
-          path: '/annualSetting/annualBudgetPartDetail',
-          name: 'AnnualBudgetPartDetail',
-          component: () => import('@/views/dataSource/annualSetting/annualBudgetPartDetail.vue'),
-          meta: {
-            title: '部门预算查看',
-            showParent: true,
-            activePath: '/annualSetting',
-            showLink: false
-          },
-        },
-      ]
-    },
     {
       path: '/assesmentManage',
       name: 'AssesmentManage',
@@ -394,6 +414,26 @@ export default {
           }
         }
       ]
-    }
+    },
+     {
+      path: '/investmentManage',
+      name: 'InvestmentManage',
+      component: () => import('@/views/dataSource/investmentManage/index.vue'),
+      meta: {
+        title: '跟投管理'
+      },
+      children: [
+        {
+          path: '/investmentManageDetails',
+          name: 'InvestmentManageDetails',
+          component: () => import('@/views/dataSource/investmentManage/details.vue'),
+          meta: {
+            title: '跟投管理明细',
+            showLink: false,
+            activePath: '/investmentManage'
+          },
+        }
+      ]
+    },
   ]
 }

+ 7 - 1
src/style/element/ruleForm.scss

@@ -174,12 +174,18 @@
   }
 }
 
+.rule-horizontal-form {
+  .el-input, .el-textarea, .el-select, .el-radio-group, .el-checkbox-group, .el-date-editor, .el-date-picker {
+    width: 100%;
+  }
+}
+
 
 // disabled
 
 $disabledPurpleColor: #6355ff;
 
-.rule-form, .table-box {
+.rule-form, .table-box, .rule-horizontal-form {
   // 文本域
   .el-input.is-disabled .el-input__wrapper {
     background-color: #fff;

+ 248 - 0
src/views/dataSource/assetDataManage/components/AssetTable.columns.tsx

@@ -0,0 +1,248 @@
+import { ref, computed } from 'vue'
+import { useRouter } from 'vue-router'
+import { forMatMoney } from '@utils'
+
+export function useColumns(search) {
+  const router = useRouter()
+  const columns: TableColumnList = [
+    // {
+    //   type: 'selection',
+    // },
+    {
+      label: '序号',
+      type: 'index',
+      width: 55
+    },
+
+    {
+      label: '所属部门',
+      prop: 'businessNo',
+      showOverflowTooltip: true
+    },
+    {
+      label: '资产类型',
+      prop: 'contractNo',
+      showOverflowTooltip: true
+    },
+    {
+      label: '产品类型',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '当月投放(元)',
+      prop: 'financingAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.financingAmount)
+      }
+    },
+    {
+      label: '垫付(元)',
+      prop: 'financingAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.financingAmount)
+      }
+    },
+    {
+      label: '累计(元)',
+      prop: 'financingAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.financingAmount)
+      }
+    },
+    {
+      label: '待还本金(元)',
+      prop: 'financingAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.financingAmount)
+      }
+    },
+    {
+      label: '月份',
+      prop: 'surplusPrincipal',
+      showOverflowTooltip: true,
+      width: '140',
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.surplusPrincipal)
+      }
+    },
+    {
+      label: '操作',
+      width: '160',
+      cellRenderer: ({ index, row }) => {
+        const btnList = [
+          {
+            msg: '明细',
+            icon: 'text-customPurple iconfont icon-watch',
+            power: '',
+            tabPower: ['pending', 'all'],
+            category: 'see'
+          },
+          {
+            msg: '财务修正',
+            icon: 'text-customPurple iconfont icon-edit',
+            power: 'financeModify',
+            tabPower: ['pending'],
+            category: 'financeEdit'
+          },
+          {
+            msg: '再融资修正',
+            icon: 'text-customPurple iconfont icon-shujuxiuzheng',
+            power: 'refinancingModify',
+            tabPower: ['pending'],
+            category: 'refinanceEdit'
+          },
+          {
+            msg: '修正',
+            icon: 'text-customPurple iconfont icon-edit',
+            power: 'riskModify',
+            tabPower: ['all'],
+            category: 'riskEdit'
+          }
+        ]
+        const options = btnList.map((item) => {
+          return (
+            tablePower({ item, tab: activeName.value, row }) && (
+              <el-tooltip effect="dark" content={item.msg} placement="top">
+                <i
+                  class={item.icon}
+                  v-power={item.power}
+                  onClick={() => {
+                    handlerOperate(item.category, row)
+                  }}></i>
+              </el-tooltip>
+            )
+          )
+        })
+        return <>{options}</>
+      }
+    }
+  ]
+
+  const otherColumns: TableColumnList = [
+    {
+      type: 'selection'
+    },
+    {
+      label: '序号',
+      type: 'index',
+      width: 55
+    },
+    {
+      label: '收/放款类型',
+      prop: 'payCollType',
+      showOverflowTooltip: true,
+      cellRenderer: ({ index, row }) => {
+        return row.payCollType === 'income' ? '收款' : '放款'
+      }
+    },
+    {
+      label: '客户名称',
+      prop: 'customerName',
+      showOverflowTooltip: true
+    },
+    {
+      label: '币种',
+      prop: 'currency',
+      showOverflowTooltip: true
+    },
+    {
+      label: '实收/付总金额',
+      prop: 'actualAmount',
+      showOverflowTooltip: true
+    },
+    {
+      label: '实收/付日期',
+      prop: 'actualDate',
+      showOverflowTooltip: true
+    },
+
+    {
+      label: '操作',
+      width: '160',
+      cellRenderer: ({ index, row }) => {
+        const btnList = [
+          {
+            msg: '明细',
+            icon: 'text-customPurple iconfont icon-watch',
+            power: '',
+            tabPower: [],
+            category: 'see'
+          }
+        ]
+        const options = btnList.map((item) => {
+          return (
+            <el-tooltip effect="dark" content={item.msg} placement="top">
+              <i
+                class={item.icon}
+                onClick={() => {
+                  handlerOperate(item.category, row)
+                }}></i>
+            </el-tooltip>
+          )
+        })
+        return <>{options}</>
+      }
+    }
+  ]
+
+  const tablePower = ({ item, tab, row }) => {
+    const { tabPower, rowPower } = item
+    if (rowPower) {
+    } else {
+      if (tabPower.includes(tab)) {
+        return true
+      } else {
+        return false
+      }
+    }
+  }
+
+  const tableData = ref<any[]>([])
+  const total = ref<number>(0)
+
+  const handleSelectionChange = (val) => {
+    console.log(val, 11111111)
+  }
+
+  const handlerOperate = (type, row) => {
+    const { id } = row
+    switch (type) {
+      case 'financeEdit':
+        router.push({ path: '/financeEdit', query: { id } })
+        break
+      case 'refinanceEdit':
+        router.push({ path: '/refinanceEdit', query: { id } })
+        break
+      case 'riskEdit':
+        router.push({
+          path: '/receiveLendingLedgerSee',
+          query: { type: 'riskEdit', id }
+        })
+        break
+      case 'see':
+        if (search.businessType === 'other') {
+          router.push({ path: '/receiveLendingLedgerOtherSee', query: { id } })
+        } else {
+          router.push({
+            path: '/receiveLendingLedgerSee',
+            query: { type: 'see', id }
+          })
+        }
+        break
+      default:
+        break
+    }
+  }
+  return {
+    otherColumns,
+    columns,
+    tableData,
+    total,
+    handleSelectionChange
+  }
+}

+ 185 - 0
src/views/dataSource/assetDataManage/components/AssetTable.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="project-table">
+    <div class="search">
+      <div class="left">
+        <el-button type="primary" icon="Plus" @click="handleAdd"
+          >新增AUM资产表</el-button
+        >
+      </div>
+      <div class="right">
+        <div>
+          <el-date-picker
+            v-model="search.date"
+            type="monthrange"
+            range-separator="至"
+            start-placeholder="收入开始日期"
+            end-placeholder="收入结束日期"
+          />
+        </div>
+        <div>
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择项目名称"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </div>
+        <div>
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择资产类型"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </div>
+        <div class="rightBtn">
+          <el-button type="primary" @click="fetchData('search')"
+            >查询</el-button
+          >
+          <el-button icon="Download" @click="downloadClick">下载</el-button>
+        </div>
+      </div>
+    </div>
+    <cy-table
+      v-loading="loading"
+      :data="tableData"
+      :columns="columns"
+      :total="total"
+      @paginationParams="paginationChange"
+    >
+    </cy-table>
+    <cy-dialog
+      v-model:visible="dialogStatus"
+      title="项目收入表"
+      ref="dialogRef"
+      width="700px"
+    >
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        class="rule-horizontal-form"
+        label-width="100"
+      >
+        <el-form-item label="项目名称" prop="name">
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择项目名称"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="资产类型" prop="name">
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择资产类型"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="当月投放" prop="name">
+          <cy-amount-input
+            v-model="ruleForm.name"
+            placeholder="请输入当月投放"
+            unit="元"
+          />
+        </el-form-item>
+        <el-form-item label="垫付" prop="name">
+          <cy-amount-input
+            v-model="ruleForm.name"
+            placeholder="请输入垫付"
+            unit="元"
+          />
+        </el-form-item>
+        <el-form-item label="累计" prop="name">
+          <cy-amount-input
+            v-model="ruleForm.name"
+            placeholder="请输入累计"
+            unit="元"
+          />
+        </el-form-item>
+        <el-form-item label="待还本金" prop="name">
+          <cy-amount-input
+            v-model="ruleForm.name"
+            placeholder="请输入待还本金"
+            unit="元"
+          />
+        </el-form-item>
+        <el-form-item label="月份" prop="name">
+          <el-date-picker
+            v-model="ruleForm.name"
+            type="month"
+            placeholder="请选择月份"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <div class="submit-btn">
+        <el-button @click="() => (dialogStatus = false)">关闭</el-button>
+        <el-button type="primary" @click="dialogSubmit">提交</el-button>
+      </div>
+    </cy-dialog>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { ref, onMounted, reactive } from 'vue'
+  import type { FormInstance, FormRules } from 'element-plus'
+  import { useDictStore } from '@/store/modules/dict'
+  import { useColumns } from './AssetTable.columns'
+  useDictStore().getConstant(['departmentList', 'productType'])
+  const { constant } = useDictStore()
+
+  const search = reactive({
+    date: [new Date(), new Date()],
+    productType: ''
+  })
+  const dialogStatus = ref<boolean>(false)
+  const dialogRef = ref<HTMLElement | null>(null)
+  const handleAdd = () => {
+    dialogStatus.value = true
+  }
+
+  const { tableData, columns, otherColumns, total, handleSelectionChange } =
+    useColumns(search)
+
+  const loading = ref<boolean>(false)
+  const paginationChange = (params: any) => {
+    console.log(params)
+  }
+  const fetchData = (type) => {}
+  const downloadClick = () => {}
+
+  const ruleForm = ref({
+    name: ''
+  })
+  const ruleFormRef = ref<FormInstance>()
+  const rules = reactive<FormRules>({})
+  const dialogSubmit = () => {}
+</script>
+
+<style lang="scss" scoped></style>

+ 216 - 0
src/views/dataSource/assetDataManage/components/ProjectTable.columns.tsx

@@ -0,0 +1,216 @@
+import { ref, computed } from 'vue'
+import { useRouter } from 'vue-router'
+import { forMatMoney } from '@utils'
+
+export function useColumns(search) {
+  const router = useRouter()
+  const columns: TableColumnList = [
+    // {
+    //   type: 'selection',
+    // },
+    {
+      label: '序号',
+      type: 'index',
+      width: 55,
+    },
+    {
+      label: '所属部门',
+      prop: 'businessNo',
+      showOverflowTooltip: true
+    },
+    {
+      label: '项目名称',
+      prop: 'customerName',
+      showOverflowTooltip: true
+    },
+    {
+      label: '资产类型',
+      prop: 'contractNo',
+      showOverflowTooltip: true
+    },
+    {
+      label: '产品类型',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '项目收入(不含税)/元',
+      prop: 'financingAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.financingAmount)
+      }
+    },
+    {
+      label: '月份',
+      prop: 'surplusPrincipal',
+      showOverflowTooltip: true,
+      width: '140',
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.surplusPrincipal)
+      }
+    },
+    {
+      label: '操作',
+      width: '160',
+      cellRenderer: ({ index, row }) => {
+        const btnList = [
+          {
+            msg: '明细',
+            icon: 'text-customPurple iconfont icon-watch',
+            power: '',
+            tabPower: ['pending', 'all'],
+            category: 'see'
+          },
+          {
+            msg: '财务修正',
+            icon: 'text-customPurple iconfont icon-edit',
+            power: 'financeModify',
+            tabPower: ['pending'],
+            category: 'financeEdit'
+          },
+          {
+            msg: '再融资修正',
+            icon: 'text-customPurple iconfont icon-shujuxiuzheng',
+            power: 'refinancingModify',
+            tabPower: ['pending'],
+            category: 'refinanceEdit'
+          },
+          {
+            msg: '修正',
+            icon: 'text-customPurple iconfont icon-edit',
+            power: 'riskModify',
+            tabPower: ['all'],
+            category: 'riskEdit'
+          },
+        ]
+        const options = btnList.map(item => {
+          return tablePower({item, tab: activeName.value , row}) && (
+            <el-tooltip effect='dark' content={item.msg} placement='top'>
+              <i class={item.icon} v-power={ item.power } onClick={() => { handlerOperate(item.category, row) } }></i>
+            </el-tooltip>
+          )
+        })
+        return <>
+         { options }
+        </>
+      }
+    }
+  ]
+
+  const otherColumns:TableColumnList = [
+    {
+      type: 'selection',
+    },
+    {
+      label: '序号',
+      type: 'index',
+      width: 55,
+    },
+    {
+      label: '收/放款类型',
+      prop: 'payCollType',
+      showOverflowTooltip: true,
+      cellRenderer: ({ index, row }) => {
+        return row.payCollType === 'income' ? '收款' : '放款'
+      }
+    },
+    {
+      label: '客户名称',
+      prop: 'customerName',
+      showOverflowTooltip: true
+    },
+    {
+      label: '币种',
+      prop: 'currency',
+      showOverflowTooltip: true
+    },
+      {
+      label: '实收/付总金额',
+      prop: 'actualAmount',
+      showOverflowTooltip: true
+    },
+    {
+      label: '实收/付日期',
+      prop: 'actualDate',
+      showOverflowTooltip: true
+    },
+
+      {
+      label: '操作',
+      width: '160',
+      cellRenderer: ({ index, row }) => {
+        const btnList = [
+          {
+            msg: '明细',
+            icon: 'text-customPurple iconfont icon-watch',
+            power: '',
+            tabPower: [],
+            category: 'see'
+          }
+        ]
+        const options = btnList.map(item => {
+          return (
+            <el-tooltip effect='dark' content={item.msg} placement='top' >
+              <i class={item.icon} onClick={() => { handlerOperate(item.category, row) } }></i>
+            </el-tooltip>
+          )
+        })
+        return <>
+         { options }
+        </>
+      }
+    }
+  ]
+
+  const tablePower = ({ item, tab, row }) => {
+    const { tabPower, rowPower } = item
+    if (rowPower) {
+
+    } else {
+      if (tabPower.includes(tab)) {
+        return true
+      } else {
+        return false
+      }
+    }
+  }
+
+  const tableData = ref<any[]>([])
+  const total = ref<number>(0)
+
+  const handleSelectionChange = (val) => {
+    console.log(val, 11111111)
+  }
+
+  const handlerOperate = (type, row) => {
+    const { id } = row
+    switch (type) {
+      case 'financeEdit':
+        router.push({ path: '/financeEdit', query: { id }})
+        break;
+      case 'refinanceEdit':
+        router.push({ path: '/refinanceEdit',  query: { id }})
+        break;
+      case 'riskEdit':
+        router.push({ path: '/receiveLendingLedgerSee',  query: { type: 'riskEdit',  id }})
+      break;
+      case 'see':
+        if (search.businessType === 'other') {
+          router.push({ path: '/receiveLendingLedgerOtherSee', query: { id }})
+        } else {
+          router.push({ path: '/receiveLendingLedgerSee',  query: { type: 'see', id }})
+        }
+        break;
+      default:
+        break;
+    }
+  }
+  return {
+    otherColumns,
+    columns,
+    tableData,
+    total,
+    handleSelectionChange
+  }
+}

+ 164 - 0
src/views/dataSource/assetDataManage/components/ProjectTable.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="project-table">
+    <div class="search">
+      <div class="left">
+        <el-button type="primary" icon="Plus" @click="handleAdd"
+          >新增项目收入表</el-button
+        >
+      </div>
+      <div class="right">
+        <div>
+          <el-date-picker
+            v-model="search.date"
+            type="monthrange"
+            range-separator="至"
+            start-placeholder="收入开始日期"
+            end-placeholder="收入结束日期"
+          />
+        </div>
+        <div>
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择项目名称"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </div>
+        <div>
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择资产类型"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </div>
+        <div class="rightBtn">
+          <el-button type="primary" @click="fetchData('search')"
+            >查询</el-button
+          >
+          <el-button icon="Download" @click="downloadClick">下载</el-button>
+        </div>
+      </div>
+    </div>
+    <cy-table
+      v-loading="loading"
+      :data="tableData"
+      :columns="columns"
+      :total="total"
+      @paginationParams="paginationChange"
+    >
+    </cy-table>
+    <cy-dialog
+      v-model:visible="dialogStatus"
+      title="项目收入表"
+      ref="dialogRef"
+      width="700px"
+    >
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        class="rule-horizontal-form"
+        label-width="100"
+      >
+        <el-form-item label="项目" prop="name">
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择项目"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="资产类型" prop="name">
+          <el-select
+            v-model="search.productType"
+            clearable
+            placeholder="请选择资产类型"
+          >
+            <el-option
+              v-for="item in constant.productType"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目收入" prop="name">
+          <cy-amount-input
+            v-model="ruleForm.name"
+            placeholder="请输入项目收入"
+            unit="元"
+          />
+        </el-form-item>
+        <el-form-item label="月份" prop="name">
+          <el-date-picker
+            v-model="ruleForm.name"
+            type="month"
+            placeholder="请选择月份"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <div class="submit-btn">
+        <el-button @click="() => (dialogStatus = false)">关闭</el-button>
+        <el-button type="primary" @click="dialogSubmit">提交</el-button>
+      </div>
+    </cy-dialog>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { ref, onMounted, reactive } from 'vue'
+  import type { FormInstance, FormRules } from 'element-plus'
+  import { useDictStore } from '@/store/modules/dict'
+  import { useColumns } from './ProjectTable.columns'
+  useDictStore().getConstant(['departmentList', 'productType'])
+  const { constant } = useDictStore()
+
+  const search = reactive({
+    date: [new Date(), new Date()],
+    productType: ''
+  })
+  const dialogStatus = ref<boolean>(false)
+  const dialogRef = ref<HTMLElement | null>(null)
+  const handleAdd = () => {
+    dialogStatus.value = true
+  }
+
+  const { tableData, columns, otherColumns, total, handleSelectionChange } =
+    useColumns(search)
+
+  const loading = ref<boolean>(false)
+  const paginationChange = (params: any) => {
+    console.log(params)
+  }
+  const fetchData = (type) => {}
+  const downloadClick = () => {}
+
+  const ruleForm = ref({
+    name: ''
+  })
+  const ruleFormRef = ref<FormInstance>()
+  const rules = reactive<FormRules>({})
+  const dialogSubmit = () => {}
+</script>
+
+<style lang="scss" scoped></style>

+ 28 - 0
src/views/dataSource/assetDataManage/index.vue

@@ -0,0 +1,28 @@
+<template>
+  <div class="asset-data-manage">
+    <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="项目收入表" name="pending">
+        <project-table />
+      </el-tab-pane>
+      <el-tab-pane label="AUM资产表" name="all">
+        <asset-table />
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { ref } from 'vue'
+  import type { TabsPaneContext } from 'element-plus'
+  import ProjectTable from './components/ProjectTable.vue'
+  import AssetTable from './components/AssetTable.vue'
+  defineOptions({
+    name: 'AssetAataManage'
+  })
+  const activeName = ref<string | number>('pending')
+  const handleClick = (tab: TabsPaneContext) => {
+    activeName.value = tab.paneName
+  }
+</script>
+
+<style lang="scss" scoped></style>

+ 68 - 19
src/views/dataSource/customerLedger/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="business-ledger">
+  <div class="customer-ledger">
     <div class="search">
       <div class="left"></div>
       <div class="right">
@@ -7,15 +7,43 @@
           <el-input
             clearable
             v-model="search.fastSearch"
-            style="width: 280px"
-            placeholder="请输入客户名称/合同编号/业务编号"
+            style="width: 200px"
+            placeholder="请输入客户名称/业务编号"
           ></el-input>
         </div>
         <div>
           <el-select
-            v-model="search.orgName"
+            v-model="search.projectStatus"
             clearable
-            placeholder="请选择所属部门"
+            placeholder="请选择项目状态"
+          >
+            <el-option
+              v-for="item in constant.departmentList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div>
+          <el-select
+            v-model="search.creditType"
+            clearable
+            placeholder="请选择授信类型"
+          >
+            <el-option
+              v-for="item in constant.departmentList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div>
+          <el-select
+            v-model="search.creditExpiry"
+            clearable
+            placeholder="请选择授信是否到期"
           >
             <el-option
               v-for="item in constant.departmentList"
@@ -25,21 +53,32 @@
             />
           </el-select>
         </div>
-
         <div>
           <el-select
-            v-model="search.productType"
+            v-model="search.projectInitFinishDate"
             clearable
-            placeholder="请选择产品类型"
+            placeholder="请选择日期"
           >
             <el-option
-              v-for="item in constant.productType"
-              :key="item.code"
+              v-for="item in constant.departmentList"
+              :key="item.id"
               :label="item.name"
-              :value="item.code"
+              :value="item.id"
             />
           </el-select>
         </div>
+        <div>
+          <el-date-picker
+            v-model="search.reviewDate"
+            type="daterange"
+            range-separator="至"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            style="width: 200px"
+          />
+        </div>
         <div class="rightBtn">
           <el-button type="primary" @click="fetchData('search')"
             >查询</el-button
@@ -61,22 +100,26 @@
 
 <script lang="ts" setup>
   import { ref, reactive, onMounted } from 'vue'
-  import { getList } from '@api/dataSource/businessLedger'
+  import { getList } from '@api/dataSource/customerLedger'
   import { useColumns } from './index.columns'
   import { useDictStore } from '@/store/modules/dict'
 
   defineOptions({
-    name: 'ReceiveLendingLedger'
+    name: 'CustomerLedger'
   })
 
   useDictStore().getConstant(['departmentList', 'productType'])
   const { constant } = useDictStore()
 
   const search = reactive({
-    businessType: 'factoring',
     fastSearch: '',
-    orgName: '',
-    productType: '',
+    projectStatus: '',
+    creditType: '',
+    creditExpiry: '',
+    projectInitFinishDate: '',
+    reviewStartDate: '',
+    reviewExpiryDate: '',
+    reviewDate: [],
     page: 1,
     rows: 10
   })
@@ -85,8 +128,7 @@
     useColumns(search)
 
   onMounted(() => {
-    tableData.value = [{ contractAmount: '213123123' }]
-    // fetchData()
+    fetchData()
   })
 
   const loading = ref<boolean>(false)
@@ -98,7 +140,14 @@
       search.rows = 10
       total.value = 0
     }
-    getList({ ...search }).then(({ records, rows }) => {
+    const { reviewDate } = search
+    const params = {
+      ...search,
+      reviewStartDate: (reviewDate && reviewDate[0]) || '',
+      reviewExpiryDate: (reviewDate && reviewDate[1]) || ''
+    }
+    delete params.reviewDate
+    getList(params).then(({ records, rows }) => {
       loading.value = false
       tableData.value = rows
       total.value = records

+ 82 - 0
src/views/dataSource/investmentManage/details.vue

@@ -0,0 +1,82 @@
+<template>
+  <div class="investment-manage-details">
+    <el-form
+      ref="ruleFormRef"
+      :model="ruleForm"
+      :rules="rules"
+      label-position="top"
+      class="rule-form"
+    >
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input
+          v-model="ruleForm.projectName"
+          disabled
+          placeholder="请输入项目名称"
+        />
+      </el-form-item>
+      <el-form-item label="合同编号" prop="businessNo">
+        <el-input
+          v-model="ruleForm.businessNo"
+          disabled
+          placeholder="请输入合同编号"
+        />
+      </el-form-item>
+      <el-form-item label="批次号" prop="customerName">
+        <el-input
+          v-model="ruleForm.customerName"
+          disabled
+          placeholder="请输入批次号"
+        />
+      </el-form-item>
+    </el-form>
+    <cy-info-title class="mb-[10px] mt-[10px]">跟投利息明细</cy-info-title>
+    <pure-table class="table-box" :columns="columns" :data="tableData">
+    </pure-table>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { reactive, ref, watch } from 'vue'
+  import type { FormInstance, FormRules } from 'element-plus'
+  import { useColumns } from './interest.columns'
+  const props = withDefaults(
+    defineProps<{
+      detailsInfo: any
+    }>(),
+    {
+      detailsInfo: () => {}
+    }
+  )
+
+  const { columns, tableData } = useColumns()
+
+  const ruleForm = ref({
+    projectName: '',
+    businessNo: '',
+    customerName: '',
+    contractNo: '',
+    quotaDisburseBatch: '',
+    applicantName: '',
+    debtorName: '',
+    currency: '',
+    contractAmount: '',
+    orgName: '',
+    projectManagerName: ''
+  })
+  const ruleFormRef = ref<FormInstance>()
+  const rules = reactive<FormRules>({})
+
+  watch(
+    () => props.detailsInfo,
+    (newV) => {
+      if (newV === undefined || !Object.keys(newV).length) return
+      ruleForm.value = newV
+    },
+    {
+      immediate: true,
+      deep: true
+    }
+  )
+</script>
+
+<style lang="scss" scoped></style>

+ 159 - 0
src/views/dataSource/investmentManage/index.columns.tsx

@@ -0,0 +1,159 @@
+import { ref, computed } from 'vue'
+import { useRouter } from 'vue-router'
+import { forMatMoney } from '@utils'
+
+export function useColumns(search) {
+  const router = useRouter()
+  const columns: TableColumnList = [
+    // {
+    //   type: 'selection'
+    // },
+    {
+      label: '序号',
+      type: 'index',
+      width: 55
+    },
+    {
+      label: '项目名称',
+      prop: 'businessNo',
+      showOverflowTooltip: true
+    },
+    {
+      label: '合同编号',
+      prop: 'customerName',
+      showOverflowTooltip: true
+    },
+    {
+      label: '批次',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '放款金额',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '跟投金额',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '分配利息金额',
+      prop: 'currency',
+      showOverflowTooltip: true
+    },
+
+    {
+      label: '债权人',
+      prop: 'contractAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.contractAmount)
+      }
+    },
+    {
+      label: '债务人',
+      prop: 'quotaDisburseBatch',
+      showOverflowTooltip: true
+    },
+    {
+      label: '所属部门',
+      prop: 'contractAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.contractAmount)
+      }
+    },
+    {
+      label: '项目经理',
+      prop: 'contractAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.contractAmount)
+      }
+    },
+      {
+      label: '发布日期',
+      prop: 'contractAmount',
+      showOverflowTooltip: true,
+      cellRenderer: ({ row }) => {
+        return forMatMoney(row.contractAmount)
+      }
+    },
+
+    {
+      label: '操作',
+      width: '160',
+      cellRenderer: ({ index, row }) => {
+        const btnList = [
+          {
+            msg: '明细',
+            icon: 'text-customPurple iconfont icon-watch',
+            power: '',
+            category: 'see'
+          },
+          {
+            msg: '修正',
+            icon: 'text-customPurple iconfont icon-edit',
+            power: 'riskModify',
+            tabPower: ['all'],
+            category: 'edit'
+          }
+        ]
+        const options = btnList.map((item) => {
+          return (
+            <el-tooltip effect="dark" content={item.msg} placement="top">
+              <i
+                class={item.icon}
+                v-power={item.power}
+                onClick={() => {
+                  handlerOperate(item.category, row)
+                }}></i>
+            </el-tooltip>
+          )
+        })
+        return <>{options}</>
+      }
+    }
+  ]
+
+  const tablePower = ({ item, tab, row }) => {
+    const { tabPower, rowPower } = item
+    if (rowPower) {
+    } else {
+      if (tabPower.includes(tab)) {
+        return true
+      } else {
+        return false
+      }
+    }
+  }
+
+  const tableData = ref<any[]>([])
+  const total = ref<number>(0)
+
+  const handleSelectionChange = (val) => {
+    console.log(val, 11111111)
+  }
+
+  const handlerOperate = (type, row) => {
+    const { id } = row
+    switch (type) {
+      case 'see':
+        router.push({
+          path: '/investmentManageDetails',
+          query: { id, type: 'see' }
+        })
+        break
+      default:
+        break
+    }
+  }
+  return {
+    columns,
+    tableData,
+    total,
+    handleSelectionChange
+  }
+}

+ 110 - 0
src/views/dataSource/investmentManage/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="investment-manage">
+    <div class="search">
+      <div class="left"></div>
+      <div class="right">
+        <div>
+          <el-date-picker
+            clearable
+            v-model="search.fastSearch"
+            type="month"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择发布日期"
+          />
+        </div>
+        <div>
+          <el-input
+            clearable
+            v-model="search.fastSearch"
+            style="width: 280px"
+            placeholder="请输入项目名称/合同编号/债权人/债务人"
+          ></el-input>
+        </div>
+        <div>
+          <el-select
+            v-model="search.orgName"
+            clearable
+            placeholder="请选择所属部门"
+          >
+            <el-option
+              v-for="item in constant.departmentList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div class="rightBtn">
+          <el-button type="primary" @click="fetchData('search')"
+            >查询</el-button
+          >
+          <el-button icon="Download" @click="fetchData">下载</el-button>
+        </div>
+      </div>
+    </div>
+    <cy-table
+      v-loading="loading"
+      :data="tableData"
+      :columns="columns"
+      :total="total"
+      @paginationParams="paginationChange"
+    >
+    </cy-table>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { ref, reactive, onMounted } from 'vue'
+  import { getList } from '@api/dataSource/businessLedger'
+  import { useColumns } from './index.columns'
+  import { useDictStore } from '@/store/modules/dict'
+
+  defineOptions({
+    name: 'ReceiveLendingLedger'
+  })
+
+  useDictStore().getConstant(['departmentList', 'productType'])
+  const { constant } = useDictStore()
+
+  const search = reactive({
+    businessType: 'factoring',
+    fastSearch: '',
+    orgName: '',
+    productType: '',
+    page: 1,
+    rows: 10
+  })
+
+  const { tableData, columns, total, handleSelectionChange } =
+    useColumns(search)
+
+  onMounted(() => {
+    tableData.value = [{ contractAmount: '213123123' }]
+    // fetchData()
+  })
+
+  const loading = ref<boolean>(false)
+
+  const fetchData = (type?: string): void => {
+    loading.value = true
+    if (type === 'search') {
+      search.page = 1
+      search.rows = 10
+      total.value = 0
+    }
+    getList({ ...search }).then(({ records, rows }) => {
+      loading.value = false
+      tableData.value = rows
+      total.value = records
+    })
+  }
+
+  const paginationChange = (pageParams) => {
+    search.page = pageParams.currentPage
+    search.rows = pageParams.pageSize
+    fetchData()
+  }
+</script>
+
+<style lang="scss" scoped></style>

+ 31 - 0
src/views/dataSource/investmentManage/interest.columns.tsx

@@ -0,0 +1,31 @@
+import { ref, computed } from 'vue'
+
+export function useColumns() {
+  const tableData = ref<any[]>([])
+  const total = ref<number>(0)
+
+
+  const columns: TableColumnList = [
+    {
+      label: '序号',
+      type: 'index',
+      width: 55
+    },
+    {
+      label: '分配日期',
+      prop: 'gmtModified',
+      showOverflowTooltip: true
+    },
+     {
+      label: '分配利息',
+      prop: 'gmtModified',
+      showOverflowTooltip: true
+    },
+
+  ]
+
+  return {
+    columns,
+    tableData
+  }
+}

+ 3 - 3
src/views/dataSource/receiveLendingLedger/index.columns.tsx

@@ -132,9 +132,9 @@ export function useColumns(search, activeName) {
   ]
 
   const otherColumns:TableColumnList = [
-    {
-      type: 'selection',
-    },
+    // {
+    //   type: 'selection',
+    // },
     {
       label: '序号',
       type: 'index',

+ 2 - 2
src/views/dataSource/receiveLendingLedger/index.vue

@@ -38,9 +38,9 @@
           >
             <el-option
               v-for="item in constant.departmentList"
-              :key="item.id"
+              :key="item.name"
               :label="item.name"
-              :value="item.id"
+              :value="item.name"
             />
           </el-select>
         </div>