页面调整

pull/781/head
zy 2025-05-01 12:31:20 +08:00
parent 28154362b2
commit 2a156f4616
11 changed files with 87 additions and 108 deletions

View File

@ -10,7 +10,7 @@
<el-row>
<el-col :span="8">
<el-form-item label="商机名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入商机名称" />
<el-input v-model="formData.name" :disabled="type" clearable placeholder="请输入商机名称" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -35,7 +35,8 @@
<el-select
v-model="formData.requestorUserId"
clearable
:disabled="formType"
:disabled="formType || type"
placeholder="请选择需求提交人"
class="w-1/1"
>
@ -51,7 +52,7 @@
<el-col :span="8">
<el-form-item label="客户名称" prop="customerId">
<el-select
:disabled="formData.customerDefault"
:disabled="formData.customerDefault || type"
v-model="formData.customerId"
clearable
placeholder="请选择客户"
@ -72,6 +73,7 @@
<el-tree-select
v-model="formData.deptId"
:data="deptTree"
:disabled="type"
:props="defaultProps"
filterable
clearable
@ -88,7 +90,7 @@
placeholder="请选择商机状态组"
clearable
class="w-1/1"
:disabled="formType"
:disabled="formType || type"
>
<el-option
v-for="item in statusTypeList"
@ -104,6 +106,7 @@
<el-date-picker
v-model="formData.dealTime"
type="date"
:disabled="type"
value-format="x"
placeholder="选择预计成交日期"
class="!w-1/1"
@ -112,7 +115,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="销售阶段" prop="saleStage">
<el-select v-model="formData.saleStage" clearable placeholder="请选择销售阶段">
<el-select v-model="formData.saleStage" :disabled="type" clearable placeholder="请选择销售阶段">
<el-option
v-for="dict in getIntDictOptions('sale_stage')"
:key="dict.value"
@ -125,7 +128,7 @@
<el-col :span="8">
<el-form-item label="授信方式" prop="creditMethod">
<el-select v-model="formData.creditMethod" clearable placeholder="请选择授信方式">
<el-select v-model="formData.creditMethod" :disabled="type" clearable placeholder="请选择授信方式">
<el-option
v-for="dict in getIntDictOptions('credit_method')"
:key="dict.value"
@ -137,7 +140,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="账期" prop="paymentTerm">
<el-select v-model="formData.paymentTerm" @change="changePayment" clearable placeholder="请选择账期">
<el-select v-model="formData.paymentTerm" :disabled="type" @change="changePayment" clearable placeholder="请选择账期">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PAYMENT_TERM)"
:key="dict.value"
@ -167,7 +170,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="技术需求支持" prop="techSupport">
<el-radio-group v-model="formData.techSupport">
<el-radio-group v-model="formData.techSupport" :disabled="type">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.TECH_SUPPORT)"
:key="dict.value"
@ -180,7 +183,7 @@
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.remark" clearable placeholder="请输入备注" />
<el-input type="textarea" :disabled="type" v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
@ -191,7 +194,7 @@
<BusinessProductForm
ref="productFormRef"
:products="formData.products"
:disabled="disabled"
:disabled="type"
@success="setList"
/>
</el-tab-pane>
@ -227,7 +230,7 @@
</el-col>
</el-row>
</el-form>
<div style="text-align: right">
<div style="text-align: right" v-if="!type">
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="goBack"> </el-button>
</div>
@ -246,7 +249,7 @@ import { useUserStore } from '@/store/modules/user';
import { defaultProps, handleTree } from '@/utils/tree';
import BusinessProductForm from './components/BusinessProductForm.vue';
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils';
import { number } from 'vue-types';
import { propTypes } from '@/utils/propTypes'
const { proxy }: any = getCurrentInstance();
const { t } = useI18n();
@ -298,7 +301,9 @@ const userOptions = ref<UserApi.UserVO[]>([]);
const statusTypeList = ref([]);
const customerList = ref([]);
const deptTree = ref();
const props = defineProps({
type: propTypes.number.def(undefined)
})
const subTabsName = ref('product');
const productFormRef = ref();
@ -380,6 +385,7 @@ const submitForm = async () => {
const valid = await formRef.value.validate();
if (!valid) return;
formLoading.value = true;
try {
const data = formData.value as unknown as BusinessApi.BusinessVO;
@ -422,9 +428,8 @@ const resetForm = () => {
const route = useRoute();
onMounted(async () => {
const customerId = route.query.customerId;
console.log('%csrc/views/crm/business/BusinessForm.vue:425 formData.value', 'color: #007acc;', formData.value);
formData.value.ownerUserId = customerId ? '' : useUserStore().getUser.id;
formType.value = route.query.id;
formType.value = route.query.id || route.params.id;
if (formType.value) open(formType.value, customerId)
customerList.value = await CustomerApi.getCustomerSimpleList();
statusTypeList.value = await BusinessStatusApi.getBusinessStatusTypeSimpleList();

View File

@ -18,8 +18,17 @@
</template>
</el-table-column>
<el-table-column label="产品明细" align="center" prop="detailType" width="160">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_DETAIL_TYPE" :value="scope.row.detailType" />
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.detailType`" :rules="formRules.detailType" class="mb-0px!">
<el-select v-model="row.detailType" placeholder="请选择状态" >
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_DETAIL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="80">
@ -29,7 +38,7 @@
</el-table-column>
<el-table-column label="线上价格(元)" fixed="right" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.onlinePrice`" class="mb-0px!">
<el-form-item :prop="`${$index}.onlinePrice`" :rules="formRules.onlinePrice" class="mb-0px!">
<el-input-number
v-model="row.onlinePrice"
controls-position="right"
@ -42,7 +51,7 @@
</el-table-column>
<el-table-column label="线下价格(元)" fixed="right" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.offlinePrice`" class="mb-0px!">
<el-form-item :prop="`${$index}.offlinePrice`" :rules="formRules.offlinePrice" class="mb-0px!">
<el-input-number
v-model="row.offlinePrice"
controls-position="right"
@ -60,7 +69,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<el-table-column align="center" fixed="right" label="操作" width="60" v-if="!disabled">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
@ -84,8 +93,11 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict';
const formLoading = ref(false); //
const formData = ref([]); //
const formRules = reactive({
detailType: [{ required: true, message: '产品明细不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
businessPrice: [{ required: true, message: '合同价格不能为空', trigger: 'blur' }]
businessPrice: [{ required: true, message: '合同价格不能为空', trigger: 'blur' }],
onlinePrice: [{ required: true, message: '线上价格(元)不能为空', trigger: 'blur' }],
offlinePrice: [{ required: true, message: '线下价格(元)不能为空', trigger: 'blur' }]
});
const formRef = ref(null); // Ref
const productList = ref<ProductApi.ProductVO[]>([]); //

View File

@ -1,55 +1,11 @@
<template>
<ContentWrap>
<el-collapse v-model="activeNames">
<el-collapse-item name="basicInfo">
<template #title>
<span class="text-base font-bold">基本信息</span>
</template>
<el-descriptions :column="4">
<el-descriptions-item label="商机姓名">{{ business.name }}</el-descriptions-item>
<el-descriptions-item label="客户名称">{{ business.customerName }}</el-descriptions-item>
<el-descriptions-item label="商机金额(元)">
{{ erpPriceInputFormatter(business.totalPrice) }}
</el-descriptions-item>
<el-descriptions-item label="预计成交日期">
{{ formatDate(business.dealTime) }}
</el-descriptions-item>
<el-descriptions-item label="下次联系时间">
{{ formatDate(business.contactNextTime) }}
</el-descriptions-item>
<el-descriptions-item label="商机状态组">
{{ business.statusTypeName }}
</el-descriptions-item>
<el-descriptions-item label="商机阶段">{{ business.statusName }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ business.remark }}</el-descriptions-item>
</el-descriptions>
</el-collapse-item>
<el-collapse-item name="systemInfo">
<template #title>
<span class="text-base font-bold">系统信息</span>
</template>
<el-descriptions :column="4">
<el-descriptions-item label="负责人">{{ business.ownerUserName }}</el-descriptions-item>
<el-descriptions-item label="最后跟进时间">
{{ formatDate(business.contactLastTime) }}
</el-descriptions-item>
<el-descriptions-item label="">&nbsp;</el-descriptions-item>
<el-descriptions-item label="">&nbsp;</el-descriptions-item>
<el-descriptions-item label="创建人">{{ business.creatorName }}</el-descriptions-item>
<el-descriptions-item label="创建时间">
{{ formatDate(business.createTime) }}
</el-descriptions-item>
<el-descriptions-item label="更新时间">
{{ formatDate(business.updateTime) }}
</el-descriptions-item>
</el-descriptions>
</el-collapse-item>
</el-collapse>
<BusinessForm :type="1" />
</ContentWrap>
</template>
<script setup lang="ts">
import * as BusinessApi from '@/api/crm/business'
import { formatDate } from '@/utils/formatTime'
import BusinessForm from '../BusinessForm.vue'
import { erpPriceInputFormatter } from '@/utils'
const { business } = defineProps<{

View File

@ -1,8 +1,8 @@
<template>
<BusinessDetailsHeader v-loading="loading" :business="business">
<el-button v-if="permissionListRef?.validateWrite" @click="openForm('update', business.id)">
<!-- <el-button v-if="permissionListRef?.validateWrite" @click="openForm('update', business.id)">
编辑
</el-button>
</el-button> -->
<el-button
v-if="permissionListRef?.validateWrite"
:disabled="business.endStatus"
@ -31,12 +31,12 @@
:customer-id="business.customerId"
/>
</el-tab-pane>
<el-tab-pane label="产品">
<!-- <el-tab-pane label="产品">
<BusinessProductList :business="business" />
</el-tab-pane>
<el-tab-pane label="合同" lazy>
</el-tab-pane> -->
<!-- <el-tab-pane label="合同" lazy>
<ContractList :biz-id="business.id!" :biz-type="BizTypeEnum.CRM_BUSINESS" />
</el-tab-pane>
</el-tab-pane> -->
<el-tab-pane label="操作日志">
<OperateLogV2 :log-list="logList" />
</el-tab-pane>

View File

@ -52,15 +52,15 @@
<el-tab-pane label="下属负责的" name="3" />
</el-tabs>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="商机名称" prop="name" width="160">
<el-table-column align="center" fixed="left" label="商机名称" prop="name" width="200">
<template #default="scope">
<el-link :underline="false" type="primary" @click="openDetail(scope.row.id)">
{{ scope.row.name }}
</el-link>
</template>
</el-table-column>
<el-table-column align="center" fixed="left" label="客户名称" prop="customerName" width="120">
<template #default="scope">
<el-table-column align="center" label="客户名称" prop="customerName" width="220">
<!-- <template #default="scope">
<el-link
:underline="false"
type="primary"
@ -68,7 +68,7 @@
>
{{ scope.row.customerName }}
</el-link>
</template>
</template> -->
</el-table-column>
<el-table-column
:formatter="erpPriceTableColumnFormatter"
@ -118,14 +118,12 @@
<el-table-column align="center" label="创建人" prop="creatorName" width="100px" />
<el-table-column
align="center"
fixed="right"
label="商机状态组"
prop="statusTypeName"
width="140"
/>
<el-table-column
align="center"
fixed="right"
label="商机阶段"
prop="statusName"
width="120"

View File

@ -116,8 +116,8 @@
</el-link>
</template>
</el-table-column>
<el-table-column align="center" fixed="left" label="客户名称" prop="customerName" width="120">
<template #default="scope">
<el-table-column align="center" fixed="left" label="客户名称" prop="customerName" width="220">
<!-- <template #default="scope">
<el-link
:underline="false"
type="primary"
@ -125,7 +125,7 @@
>
{{ scope.row.customerName }}
</el-link>
</template>
</template> -->
</el-table-column>
<el-table-column align="center" label="手机" prop="mobile" width="120" />
<el-table-column align="center" label="电话" prop="telephone" width="130" />

View File

@ -253,6 +253,7 @@ if(limitFormRef.value) {
if(contractExtensionFormRef.value) {
const extensionValid = await contractExtensionFormRef.value.validate()
console.log('%csrc/views/crm/contrxact/ContractChange.vue:247 123', 'color: #007acc;', extensionValid,123);
if (!extensionValid) return
}
@ -265,7 +266,6 @@ if(contractExtensionFormRef.value) {
// if (!contractValid) return
console.log('%csrc/views/crm/contract/ContractChange.vue:247 123', 'color: #007acc;', extensionValid,123);
return
//

View File

@ -79,7 +79,6 @@
<el-tab-pane label="下属负责的" name="3" />
</el-tabs>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="合同编号" prop="no" width="180" />
<el-table-column align="center" fixed="left" label="合同名称" prop="name" width="160">
<template #default="scope">
<el-link :underline="false" type="primary" @click="openDetail(scope.row)">
@ -87,8 +86,9 @@
</el-link>
</template>
</el-table-column>
<el-table-column align="center" label="合同编号" prop="no" width="180" />
<el-table-column align="center" label="客户名称" prop="customerName" width="120">
<template #default="scope">
<!-- <template #default="scope">
<el-link
:underline="false"
type="primary"
@ -96,7 +96,7 @@
>
{{ scope.row.customerName }}
</el-link>
</template>
</template> -->
</el-table-column>
<el-table-column align="center" label="商机名称" prop="businessName" width="130">
<template #default="scope">
@ -192,7 +192,7 @@
width="180px"
/>
<el-table-column align="center" label="创建人" prop="creatorName" width="120" />
<el-table-column align="center" fixed="right" label="合同状态" prop="auditStatus" width="120">
<el-table-column align="center" label="合同状态" prop="auditStatus" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
</template>

View File

@ -173,19 +173,19 @@ const handleUnlock = async () => {
await getCustomer()
}
// /** */
// const handleReceive = async () => {
// await message.confirm(`${customer.value.name} `)
// await CustomerApi.receiveCustomer([unref(customerId.value)])
// message.success(`${customer.value.name}`)
// await getCustomer()
// }
/** 领取客户 */
const handleReceive = async () => {
await message.confirm(`确定领取客户【${customer.value.name}】 吗?`)
await CustomerApi.receiveCustomer([unref(customerId.value)])
message.success(`领取客户【${customer.value.name}】成功`)
await getCustomer()
}
// /** */
// const distributeForm = ref<InstanceType<typeof CustomerDistributeForm>>() // Ref
// const handleDistributeForm = async () => {
// distributeForm.value?.open(customerId.value)
// }
/** 分配客户 */
const distributeForm = ref<InstanceType<typeof CustomerDistributeForm>>() // Ref
const handleDistributeForm = async () => {
distributeForm.value?.open(customerId.value)
}
/** 客户放入公海 */
const handlePutPool = async () => {

View File

@ -100,7 +100,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" label="客户名称" fixed="left" prop="name" width="160">
<el-table-column align="center" label="客户名称" fixed="left" prop="name" width="220">
<template #default="scope">
<el-link :underline="false" type="primary" @click="openDetail(scope.row.id)">
{{ scope.row.name }}
@ -112,9 +112,16 @@
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="scope.row.source" />
</template>
</el-table-column>
<el-table-column label="手机" align="center" prop="mobile" width="120" />
<el-table-column label="电话" align="center" prop="telephone" width="130" />
<el-table-column label="邮箱" align="center" prop="email" width="180" />
<el-table-column label="合作类型" align="center" prop="mobile" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_COOPERATION_TYPE" :value="scope.row.cooperationType" />
</template>
</el-table-column>
<el-table-column label="合作地区" align="center" prop="telephone" width="130">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_COOPERATION_AREA" :value="scope.row.cooperationArea" />
</template>
</el-table-column>
<el-table-column align="center" label="客户级别" prop="level" width="135">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
@ -125,6 +132,7 @@
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
</template>
</el-table-column>
<el-table-column align="center" label="信用统一代码" prop="creditNo" width="180" />
<el-table-column
:formatter="dateFormatter"
align="center"

View File

@ -85,16 +85,16 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="报价单编号" align="center" prop="no" />
<el-table-column label="客户名称" align="center" prop="customerId">
<el-table-column label="报价单编号" align="center" prop="no" width="200" />
<el-table-column label="客户名称" align="center" prop="customerId" width="220">
<template #default="scope">
<el-link
<!-- <el-link
:underline="false"
type="primary"
@click="openCustomerDetail(scope.row.customerId)"
>
> -->
{{ scope.row.customerName }}
</el-link>
<!-- </el-link> -->
</template>
</el-table-column>
<el-table-column label="商机负责人" align="center" prop="ownerUserId">