收款计划
parent
9f891fc362
commit
b4cf7a6e15
|
|
@ -4,6 +4,7 @@ import request from '@/config/axios'
|
|||
export interface ProjectVO {
|
||||
id: number // 主键ID
|
||||
deptId: number // 部门ID
|
||||
name?: string
|
||||
siteId: number // 场地ID
|
||||
totalInvestment: number // 项目总投资额
|
||||
ownerUserId: string // 项目合伙人
|
||||
|
|
@ -51,3 +52,8 @@ export const deleteProject = async (id: number) => {
|
|||
export const exportProject = async (params: any) => {
|
||||
return await request.download({ url: `/crm/project/export-excel`, params })
|
||||
}
|
||||
|
||||
// 获取项目列表
|
||||
export const getProjectSimpleList = async () => {
|
||||
return await request.get({ url: `/crm/project/simple-list` })
|
||||
}
|
||||
|
|
@ -8,6 +8,8 @@ export interface ReceivableVO {
|
|||
customerId?: number
|
||||
customerName?: string
|
||||
contractId?: number
|
||||
type: number
|
||||
deptId: number
|
||||
contract?: {
|
||||
id?: number
|
||||
name?: string
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import request from '@/config/axios'
|
|||
export interface ReceivablePlanVO {
|
||||
id: number
|
||||
period: number
|
||||
receivableId: number
|
||||
receivableId: number[]
|
||||
price: number
|
||||
returnTime: Date
|
||||
remindDays: number
|
||||
|
|
@ -25,10 +25,10 @@ export interface ReceivablePlanVO {
|
|||
creatorName?: string // 创建人名称
|
||||
createTime: Date // 创建时间
|
||||
updateTime: Date // 更新时间
|
||||
receivable?: {
|
||||
receivable?: [{
|
||||
price: number
|
||||
returnTime: Date
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
||||
// 查询收款计划列表
|
||||
|
|
|
|||
|
|
@ -204,7 +204,8 @@ export enum DICT_TYPE {
|
|||
CRM_AUDIT_STATUS = 'crm_audit_status', // CRM 审批状态
|
||||
CRM_BIZ_TYPE = 'crm_biz_type', // CRM 业务类型
|
||||
CRM_BUSINESS_END_STATUS_TYPE = 'crm_business_end_status_type', // CRM 商机结束状态类型
|
||||
CRM_RECEIVABLE_RETURN_TYPE = 'crm_receivable_return_type', // CRM 回款的还款方式
|
||||
CRM_RECEIVABLE_RETURN_TYPE = 'crm_receivable_return_type', // CRM 付款的付款方式
|
||||
CRM_RECEIVABLE_TYPE = 'crm_receivable_type', // CRM 付款类型
|
||||
CRM_CUSTOMER_INDUSTRY = 'crm_customer_industry', // CRM 客户所属行业
|
||||
CRM_CUSTOMER_DEAL_STATUS = 'crm_customer_deal_status', // CRM 客户成交状态
|
||||
CRM_CUSTOMER_LEVEL = 'crm_customer_level', // CRM 客户级别
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@
|
|||
</Dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ProjectApi, ProjectVO } from '@/api/crm/project'
|
||||
import * as ProjectApi from '@/api/crm/project'
|
||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||
import * as DeptApi from '@/api/system/dept'
|
||||
import * as ContractApi from '@/api/crm/contract'
|
||||
|
|
@ -224,7 +224,7 @@ const formData = ref({
|
|||
id: undefined,
|
||||
deptId: undefined,
|
||||
siteId: undefined,
|
||||
totalInvestment: undefined,
|
||||
totalInvestment: 0,
|
||||
partner: undefined,
|
||||
ratio: undefined,
|
||||
investment: 0,
|
||||
|
|
@ -308,7 +308,7 @@ const submitForm = async () => {
|
|||
// 提交请求
|
||||
formLoading.value = true
|
||||
try {
|
||||
const data = formData.value as unknown as ProjectVO
|
||||
const data = formData.value as unknown as ProjectApi.ProjectVO
|
||||
if (formType.value === 'create') {
|
||||
await ProjectApi.createProject(data)
|
||||
message.success(t('common.createSuccess'))
|
||||
|
|
@ -330,7 +330,7 @@ const resetForm = () => {
|
|||
id: undefined,
|
||||
deptId: undefined,
|
||||
siteId: undefined,
|
||||
totalInvestment: undefined,
|
||||
totalInvestment: 0,
|
||||
partner: undefined,
|
||||
ratio: undefined,
|
||||
investment: 0,
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@
|
|||
<script setup lang="ts">
|
||||
import { dateFormatter } from '@/utils/formatTime'
|
||||
import download from '@/utils/download'
|
||||
import { ProjectApi, ProjectVO } from '@/api/crm/project'
|
||||
import * as ProjectApi from '@/api/crm/project'
|
||||
import ProjectForm from './ProjectForm.vue'
|
||||
|
||||
/** CRM 项目信息 列表 */
|
||||
|
|
@ -154,7 +154,7 @@ const message = useMessage() // 消息弹窗
|
|||
const { t } = useI18n() // 国际化
|
||||
|
||||
const loading = ref(true) // 列表的加载中
|
||||
const list = ref<ProjectVO[]>([]) // 列表的数据
|
||||
const list = ref<ProjectApi.ProjectVO[]>([]) // 列表的数据
|
||||
const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
|
|
|
|||
|
|
@ -9,22 +9,38 @@
|
|||
>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="付款编号" prop="no">
|
||||
<el-input v-model="formData.no" disabled placeholder="保存时自动生成" />
|
||||
<el-form-item label="付款期数" prop="planId">
|
||||
<el-select
|
||||
v-model="formData.planId"
|
||||
:disabled="formType !== 'create' || !formData.contractId"
|
||||
class="!w-1/1"
|
||||
placeholder="请选择付款期数"
|
||||
@change="handleReceivablePlanChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="data in receivablePlanList"
|
||||
:key="data.id"
|
||||
disabled
|
||||
:label="'第 ' + data.period + ' 期'"
|
||||
:value="data.id!"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="负责人" prop="ownerUserId">
|
||||
<el-form-item label="付款单位" prop="contractId">
|
||||
<el-select
|
||||
v-model="formData.ownerUserId"
|
||||
:disabled="formType !== 'create'"
|
||||
v-model="formData.deptId"
|
||||
disabled
|
||||
class="w-1/1"
|
||||
filterable
|
||||
placeholder="请选择付款单位"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in userOptions"
|
||||
:key="item.id"
|
||||
:label="item.nickname"
|
||||
:value="item.id"
|
||||
v-for="data in deptList"
|
||||
:key="data.id"
|
||||
:label="data.name"
|
||||
:value="data.id!"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
|
@ -32,13 +48,13 @@
|
|||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="客户名称" prop="customerId">
|
||||
<el-form-item label="收款单位" prop="customerId">
|
||||
<el-select
|
||||
v-model="formData.customerId"
|
||||
:disabled="formType !== 'create'"
|
||||
class="w-1/1"
|
||||
filterable
|
||||
placeholder="请选择客户"
|
||||
placeholder="请选择收款单位"
|
||||
@change="handleCustomerChange"
|
||||
>
|
||||
<el-option
|
||||
|
|
@ -71,39 +87,6 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="付款期数" prop="planId">
|
||||
<el-select
|
||||
v-model="formData.planId"
|
||||
:disabled="formType !== 'create' || !formData.contractId"
|
||||
class="!w-1/1"
|
||||
placeholder="请选择付款期数"
|
||||
@change="handleReceivablePlanChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="data in receivablePlanList"
|
||||
:key="data.id"
|
||||
:disabled="data.receivableId"
|
||||
:label="'第 ' + data.period + ' 期'"
|
||||
:value="data.id!"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="付款方式" prop="returnType">
|
||||
<el-select v-model="formData.returnType" class="w-1/1" placeholder="请选择付款方式">
|
||||
<el-option
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="付款金额" prop="price">
|
||||
|
|
@ -129,12 +112,30 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="付款方式" prop="returnType">
|
||||
<el-select v-model="formData.returnType" class="w-1/1" placeholder="请选择付款方式">
|
||||
<el-option
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="收支类型" prop="incomeType">
|
||||
<el-select v-model="formData.incomeType" placeholder="请选择收支类型" class="w-1/1">
|
||||
<el-option label="收入" value="income" />
|
||||
<el-option label="支出" value="expense" />
|
||||
<el-option
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_RECEIVABLE_TYPE)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
@ -152,7 +153,7 @@
|
|||
<el-option
|
||||
v-for="item in projectList"
|
||||
:key="item.id"
|
||||
:label="item.id + ' - ' + item.deptId"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
|
|
@ -166,8 +167,8 @@
|
|||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="收入/开支内容" prop="content">
|
||||
<el-input v-model="formData.content" placeholder="请输入收入/开支内容" type="textarea" />
|
||||
<el-form-item label="备注" prop="content">
|
||||
<el-input v-model="formData.content" placeholder="请输入备注" type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
|
@ -186,6 +187,7 @@ import * as UserApi from '@/api/system/user'
|
|||
import * as CustomerApi from '@/api/crm/customer'
|
||||
import * as ContractApi from '@/api/crm/contract'
|
||||
import * as ProjectApi from '@/api/crm/project'
|
||||
import * as DeptApi from '@/api/system/dept'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||
|
||||
|
|
@ -209,12 +211,13 @@ const formRules = reactive({
|
|||
returnTime: [{ required: true, message: '付款日期不能为空', trigger: 'blur' }],
|
||||
price: [{ required: true, message: '付款金额不能为空', trigger: 'blur' }],
|
||||
date: [{ required: true, message: '日期不能为空', trigger: 'blur' }],
|
||||
content: [{ required: true, message: '收入/开支内容不能为空', trigger: 'blur' }],
|
||||
content: [{ required: true, message: '备注不能为空', trigger: 'blur' }],
|
||||
incomeType: [{ required: true, message: '收支类型不能为空', trigger: 'change' }],
|
||||
projectId: [{ required: true, message: '项目名称不能为空', trigger: 'change' }],
|
||||
isDeposit: [{ required: true, message: '请选择是否押金', trigger: 'change' }],
|
||||
})
|
||||
const formRef = ref() // 表单 Ref
|
||||
const deptList = ref<DeptApi.DeptVO[]>([])
|
||||
const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表
|
||||
const contractList = ref<ContractApi.ContractVO[]>([]) // 合同列表
|
||||
const receivablePlanList = ref<ReceivablePlanApi.ReceivablePlanVO[]>([]) // 付款计划列表
|
||||
|
|
@ -242,18 +245,21 @@ const open = async (
|
|||
formLoading.value = false
|
||||
}
|
||||
}
|
||||
// 加载部门列表
|
||||
deptList.value = await DeptApi.querySimpleDeptList(2)
|
||||
// 获得用户列表
|
||||
userOptions.value = await UserApi.getSimpleUserList()
|
||||
// 获得客户列表
|
||||
customerList.value = await CustomerApi.getCustomerSimpleList()
|
||||
// 获得项目列表
|
||||
projectList.value = await ProjectApi.getProjectPage({ pageSize: 1000, pageNo: 1 }).then(res => res.list || [])
|
||||
projectList.value = await ProjectApi.getProjectSimpleList()
|
||||
// 默认新建时选中自己
|
||||
if (formType.value === 'create') {
|
||||
formData.value.ownerUserId = useUserStore().getUser.id
|
||||
}
|
||||
// 从付款计划创建付款
|
||||
if (receivablePlan) {
|
||||
|
||||
// 修复 receivablePlan.contractId 可能为 undefined 的类型问题
|
||||
if (receivablePlan) {
|
||||
formData.value.customerId = receivablePlan.customerId
|
||||
|
|
@ -302,6 +308,7 @@ const submitForm = async () => {
|
|||
const resetForm = () => {
|
||||
formData.value = {} as ReceivableApi.ReceivableVO
|
||||
formRef.value?.resetFields()
|
||||
formData.value.isDeposit = false // 默认不是押金
|
||||
}
|
||||
|
||||
/** 处理切换客户 */
|
||||
|
|
@ -330,6 +337,8 @@ const handleContractChange = async (contractId: number) => {
|
|||
const contract = contractList.value.find((item) => item.id === contractId)
|
||||
if (contract) {
|
||||
formData.value.price = contract.totalPrice - contract.totalReceivablePrice
|
||||
// 设置付款方
|
||||
formData.value.deptId = contract.deptId
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@ const submitForm = async () => {
|
|||
// 提交请求
|
||||
formLoading.value = true
|
||||
try {
|
||||
formData.value.type = 0
|
||||
const data = formData.value as unknown as ReceivablePlanApi.ReceivablePlanVO
|
||||
if (formType.value === 'create') {
|
||||
await ReceivablePlanApi.createReceivablePlan(data)
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@
|
|||
<!-- 列表 -->
|
||||
<ContentWrap>
|
||||
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
|
||||
|
||||
<el-table-column
|
||||
:formatter="dateFormatter2"
|
||||
align="center"
|
||||
|
|
@ -132,10 +133,9 @@
|
|||
width="160"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-text v-if="scope.row.receivable">
|
||||
{{ erpPriceInputFormatter(scope.row.receivable.price) }}
|
||||
<el-text>
|
||||
{{ erpPriceInputFormatter((scope.row.receivable && Array.isArray(scope.row.receivable) && scope.row.receivable.length > 0) ? scope.row.receivable.reduce((sum, r) => sum + (r.price || 0), 0) : 0) }}
|
||||
</el-text>
|
||||
<el-text v-else>{{ erpPriceInputFormatter(0) }}</el-text>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column
|
||||
|
|
@ -152,10 +152,9 @@
|
|||
width="160"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-text v-if="scope.row.receivable">
|
||||
{{ erpPriceInputFormatter(scope.row.price - scope.row.receivable.price) }}
|
||||
<el-text>
|
||||
{{ erpPriceInputFormatter(scope.row.price - ((scope.row.receivable && Array.isArray(scope.row.receivable) && scope.row.receivable.length > 0) ? scope.row.receivable.reduce((sum, r) => sum + (r.price || 0), 0) : 0)) }}
|
||||
</el-text>
|
||||
<el-text v-else>{{ erpPriceInputFormatter(scope.row.price) }}</el-text>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="审核状态" align="center" width="90" prop="auditStatus">
|
||||
|
|
@ -171,7 +170,6 @@
|
|||
link
|
||||
type="success"
|
||||
@click="openReceivableForm(scope.row)"
|
||||
:disabled="scope.row.receivableId"
|
||||
>
|
||||
创建付款
|
||||
</el-button>
|
||||
|
|
|
|||
Loading…
Reference in New Issue