# Conflicts:
#	src/views/crm/customer/CustomerForm.vue
pull/781/head
zy 2025-05-25 15:02:51 +08:00
parent 3a1bd12787
commit bee919cfb6
29 changed files with 1713 additions and 1318 deletions

View File

@ -7,10 +7,7 @@ VITE_DEV=true
# VITE_BASE_URL='http://8.130.12.151:48080' # VITE_BASE_URL='http://8.130.12.151:48080'
# VITE_BASE_URL='http://lhy.free.idcfengye.com' # VITE_BASE_URL='http://lhy.free.idcfengye.com'
# VITE_BASE_URL='http://m94844f6.natappfree.cc' # VITE_BASE_URL='http://m94844f6.natappfree.cc'
# VITE_BASE_URL='http://172.22.3.168:48080' VITE_BASE_URL='http://172.22.3.49:48080'
# VITE_BASE_URL='http://m94844f6.natappfree.cc'
# VITE_BASE_URL='http://172.22.3.168:48080'
VITE_BASE_URL='http://localhost:48080'
# VITE_BASE_URL='http://172.22.3.203:48080' # VITE_BASE_URL='http://172.22.3.203:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务 # 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务

View File

@ -12,7 +12,7 @@
"test-server": "vite --mode test", "test-server": "vite --mode test",
"ts:check": "vue-tsc --noEmit", "ts:check": "vue-tsc --noEmit",
"build:local": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build", "build:local": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build",
"build:dev": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode dev", "build:dev": "node --max_old_space_size=5048 ./node_modules/vite/bin/vite.js build --mode dev",
"build:test": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode test", "build:test": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode test",
"build:stage": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode stage", "build:stage": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode stage",
"build:prod": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod", "build:prod": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod",

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,6 @@ const allFilterEvents = ref([])
watch(() => props.modelValue, (val) => { watch(() => props.modelValue, (val) => {
selectValue.value = val selectValue.value = val
console.log('%csrc/components/SelectCustomer/src/index.vue:48 val,', 'green', val,props.customerList);
nextTick(() => { nextTick(() => {
let arr = options.value.filter(v => v.id === val) let arr = options.value.filter(v => v.id === val)
if (!arr.length) { if (!arr.length) {
@ -57,12 +56,10 @@ watch(() => props.modelValue, (val) => {
watch(() => props.customerList, (val) => { watch(() => props.customerList, (val) => {
options.value = val.slice(0, 10) options.value = val.slice(0, 10)
console.log('%csrc/components/SelectCustomer/src/index.vue:60 props.customerList,4444', 'color: pink;', props.modelValue,props.customerList,4444);
nextTick(() => { nextTick(() => {
let arr = options.value.filter(v => v.id === props.modelValue) let arr = options.value.filter(v => v.id === props.modelValue)
if (!arr.length) { if (!arr.length) {
let selectItem = props.customerList.filter(v => v.id === props.modelValue) let selectItem = props.customerList.filter(v => v.id === props.modelValue)
console.log('%csrc/components/SelectCustomer/src/index.vue:65 selectItem', 'color: #007acc;', selectItem);
options.value = [...options.value, ...selectItem] options.value = [...options.value, ...selectItem]
} }
}) })

View File

@ -1,5 +1,5 @@
<template> <template>
<el-form :model="model" :rules="rules" label-width="120px" v-loading="loading"> <el-form :model="model" ref="innerFormRef" :rules="rules" label-width="120px" v-loading="loading">
<el-row> <el-row>
<!-- 动态渲染插槽内容 --> <!-- 动态渲染插槽内容 -->
<template v-for="(field, index) in Object.keys(fields)" :key="index"> <template v-for="(field, index) in Object.keys(fields)" :key="index">
@ -12,8 +12,8 @@
</el-form> </el-form>
</template> </template>
<script lang="ts"> <script lang="ts" >
import { defineComponent, PropType } from 'vue'; import { defineComponent, PropType, defineExpose } from 'vue';
export default defineComponent({ export default defineComponent({
name: 'processForm', name: 'processForm',
@ -35,5 +35,25 @@ export default defineComponent({
default: false, default: false,
}, },
}, },
setup(props) {
const innerFormRef = ref(null);
// validate
defineExpose({
validate: () => {
if (innerFormRef.value) {
return innerFormRef.value.validate();
} else {
console.error('innerFormRef.value is null');
return Promise.reject(new Error('Form reference is not available'));
}
},
});
return {
innerFormRef,
};
},
}); });
</script> </script>

View File

@ -397,7 +397,7 @@ export enum DICT_TYPE {
// 考核类型 // 考核类型
HRM_ASSESS_TYPE = 'hrm_assess_type', HRM_ASSESS_TYPE = 'hrm_assess_type',
//需求部门 //需求部门
HRM_EMAND_DEPARTMENT = 'hrm_emand_department' HRM_EMAND_DEPARTMENT = 'hrm_emand_department',
HRM_CLOCK_STATUS = 'hrm-clock-status',
} }

View File

@ -15,7 +15,7 @@
</el-col> --> </el-col> -->
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<SelectComponent :customerList="customerList" :disabled="formData.customerDefault || type" v-model="formData.customerId" /> <SelectComponent :customerList="customerList" @change="changeCustomer" :disabled="formData.customerDefault || type || route.query.bizId" v-model="formData.customerId" />
<!-- <el-select <!-- <el-select
:disabled="formData.customerDefault || type" :disabled="formData.customerDefault || type"
v-model="formData.customerId" v-model="formData.customerId"
@ -50,6 +50,24 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="维护人" prop="maintenanceUserId">
<el-select
v-model="formData.maintenanceUserId"
clearable
disabled
placeholder=""
class="w-1/1"
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="需求提交人" prop="requestorUserId"> <el-form-item label="需求提交人" prop="requestorUserId">
<el-select <el-select
@ -69,25 +87,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="维护人" prop="maintenanceUserId">
<el-select
v-model="formData.maintenanceUserId"
clearable
:disabled="formType || type"
:placeholder="formType ? '' : '请选择维护人'"
class="w-1/1"
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="8"> <!-- <el-col :span="8">
<el-form-item label="归属部门" prop="deptId"> <el-form-item label="归属部门" prop="deptId">
@ -370,7 +370,7 @@ const techOptions = ref([]);
const difficultOptions = ref([]); const difficultOptions = ref([]);
const deptTree = ref(); const deptTree = ref();
const props = defineProps({ const props = defineProps({
type: propTypes.number.def(undefined) type: propTypes.number.def(undefined),
}) })
const subTabsName = ref('product'); const subTabsName = ref('product');
const productFormRef = ref(); const productFormRef = ref();
@ -500,17 +500,29 @@ const resetForm = () => {
formRef.value?.resetFields(); formRef.value?.resetFields();
}; };
const changeCustomer = async (val) => {
const customerRes = await CustomerApi.getCustomer(val);
formData.value.clueDeveloper = customerRes.clueDeveloper
formData.value.maintenanceUserId = customerRes.maintainer
}
const changeCheck = (val) => { const changeCheck = (val) => {
productFormRef.value.getData(val) productFormRef.value.getData(val)
} }
const route = useRoute(); const route = useRoute();
onMounted(async () => { onMounted(async () => {
console.log('%csrc/views/crm/business/BusinessForm.vue:512 props', 'color: #007acc;', route.query);
const customerId = route.query.customerId; const customerId = route.query.customerId;
formData.value.clueDeveloper = customerId ? '' : useUserStore().getUser.id; formData.value.customerId = Number(route.query.bizId) || ''
formData.value.clueDeveloper = Number(route.query.clueDeveloper) || ''
formData.value.maintenanceUserId = Number(route.query.maintenanceUserId) || ''
formData.value.requestorUserId = customerId ? '' : useUserStore().getUser.id; formData.value.requestorUserId = customerId ? '' : useUserStore().getUser.id;
formType.value = route.query.id || route.params.id; formType.value = route.query.id || route.params.id;
if (formType.value) open(formType.value, customerId) if (formType.value) open(formType.value, customerId)
customerList.value = await CustomerApi.getSelfCustomerSimpleList(); customerList.value = await CustomerApi.getSelfCustomerSimpleList();
statusTypeList.value = await BusinessStatusApi.getBusinessStatusTypeSimpleList(); statusTypeList.value = await BusinessStatusApi.getBusinessStatusTypeSimpleList();
userOptions.value = await UserApi.getSimpleUserList(); userOptions.value = await UserApi.getSimpleUserList();

View File

@ -1,7 +1,7 @@
<template> <template>
<!-- 操作栏 --> <!-- 操作栏 -->
<el-row justify="end"> <el-row justify="end">
<el-button @click="openForm"> <el-button @click="openForm" type="primary">
<Icon class="mr-5px" icon="ep:opportunity" /> <Icon class="mr-5px" icon="ep:opportunity" />
创建商机 创建商机
</el-button> </el-button>
@ -74,6 +74,8 @@ const props = defineProps<{
bizId: number // bizId: number //
customerId?: number // customerId customerId?: number // customerId
contactId?: number // contactId?: number //
clueDeveloper: number
maintenanceUserId: number
}>() }>()
const loading = ref(true) // const loading = ref(true) //
@ -130,7 +132,15 @@ const handleQuery = () => {
const { push } = useRouter() const { push } = useRouter()
const formRef = ref() const formRef = ref()
const openForm = () => { const openForm = () => {
push({ name: 'CrmBusinessAdd' }) console.log('%csrc/views/crm/business/components/BusinessList.vue:135 props', 'color: green;', props);
push({
name: 'CrmBusinessAdd',
query: {
bizId: props.bizId,
clueDeveloper: props.clueDeveloper,
maintenanceUserId: props.maintenanceUserId
}
})
} }
/** 打开联系人详情 */ /** 打开联系人详情 */

View File

@ -34,13 +34,6 @@
</el-select> --> </el-select> -->
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="name">
<el-input v-model="formData.name" placeholder="请输入联系人" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="登记人" prop="ownerUserId"> <el-form-item label="登记人" prop="ownerUserId">
<el-select <el-select
@ -58,11 +51,35 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="name">
<el-input v-model="formData.name" placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="角色" prop="contactRoleType">
<el-select v-model="formData.contactRoleType" placeholder="请选择角色" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CONTACT_ROLE_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-col :span="12">
<el-form-item label="手机" prop="mobile"> <el-form-item label="手机" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入手机" /> <el-input v-model="formData.mobile" placeholder="请输入手机" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="职位" prop="post">
<el-input v-model="formData.post" placeholder="请输入职位" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row> <el-row>
<!-- <el-col :span="12"> <!-- <el-col :span="12">
@ -74,31 +91,13 @@
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入邮箱" /> <el-input v-model="formData.email" placeholder="请输入邮箱" />
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="角色" prop="contactRoleType">
<el-select v-model="formData.contactRoleType" placeholder="请选择角色" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CONTACT_ROLE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="微信" prop="wechat"> <el-form-item label="微信" prop="wechat">
<el-input v-model="formData.wechat" placeholder="请输入微信" /> <el-input v-model="formData.wechat" placeholder="请输入微信" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">
<el-col :span="12">
<el-form-item label="职位" prop="post">
<el-input v-model="formData.post" placeholder="请输入职位" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关键决策人" prop="master" style="width: 400px"> <el-form-item label="关键决策人" prop="master" style="width: 400px">
<el-radio-group v-model="formData.master"> <el-radio-group v-model="formData.master">
<el-radio <el-radio
@ -110,7 +109,7 @@
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>-->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="性别" prop="sex"> <el-form-item label="性别" prop="sex">
<el-select v-model="formData.sex" placeholder="请选择" class="w-1/1"> <el-select v-model="formData.sex" placeholder="请选择" class="w-1/1">
@ -128,7 +127,7 @@
<el-input v-model="formData.birthday" placeholder="请输入生日" /> <el-input v-model="formData.birthday" placeholder="请输入生日" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col>
<el-form-item label="爱好" prop="hobby"> <el-form-item label="爱好" prop="hobby">
<el-input v-model="formData.hobby" placeholder="请输入爱好" /> <el-input v-model="formData.hobby" placeholder="请输入爱好" />
</el-form-item> </el-form-item>
@ -161,16 +160,16 @@
/> />
</el-form-item> </el-form-item>
</el-col>--> </el-col>-->
<el-col >
<el-form-item label="注册地址" prop="registeredAddress">
<el-input v-model="formData.registeredAddress" disabled placeholder="请输入注册地址" />
</el-form-item>
</el-col>
<el-col > <el-col >
<el-form-item label="家庭地址" prop="detailAddress"> <el-form-item label="家庭地址" prop="detailAddress">
<el-input v-model="formData.detailAddress" placeholder="请输入家庭地址" /> <el-input v-model="formData.detailAddress" placeholder="请输入家庭地址" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col >
<el-form-item label="办公地址" prop="registeredAddress">
<el-input v-model="formData.registeredAddress" disabled placeholder="办公地址自动带出" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row> <el-row>
<!-- <el-col :span="12"> <!-- <el-col :span="12">

View File

@ -1,11 +1,11 @@
<template> <template>
<!-- 操作栏 --> <!-- 操作栏 -->
<el-row justify="end"> <el-row justify="end">
<el-button @click="openForm"> <el-button @click="openForm" type="primary">
<Icon class="mr-5px" icon="system-uicons:contacts" /> <Icon class="mr-5px" icon="system-uicons:contacts" />
创建联系人 创建联系人
</el-button> </el-button>
<el-button <el-button type="primary"
v-if="queryParams.businessId" v-if="queryParams.businessId"
v-hasPermi="['crm:contact:create-business']" v-hasPermi="['crm:contact:create-business']"
@click="openBusinessModal" @click="openBusinessModal"
@ -13,7 +13,7 @@
<Icon class="mr-5px" icon="ep:circle-plus" /> <Icon class="mr-5px" icon="ep:circle-plus" />
关联 关联
</el-button> </el-button>
<el-button <el-button type="danger"
v-if="queryParams.businessId" v-if="queryParams.businessId"
v-hasPermi="['crm:contact:delete-business']" v-hasPermi="['crm:contact:delete-business']"
@click="deleteContactBusinessList" @click="deleteContactBusinessList"
@ -42,7 +42,7 @@
</el-table-column> </el-table-column>
<el-table-column align="center" label="手机号" prop="mobile" /> <el-table-column align="center" label="手机号" prop="mobile" />
<el-table-column align="center" label="职位" prop="post" /> <el-table-column align="center" label="职位" prop="post" />
<el-table-column align="center" label="直属上级" prop="parentName" /> <!-- <el-table-column align="center" label="直属上级" prop="parentName" />-->
<el-table-column align="center" label="是否关键决策人" min-width="100" prop="master"> <el-table-column align="center" label="是否关键决策人" min-width="100" prop="master">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" /> <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" />

View File

@ -7,7 +7,7 @@
:inline="true" :inline="true"
:model="queryParams" :model="queryParams"
class="-mb-15px" class="-mb-15px"
label-width="90px" label-width="120px"
> >
<el-form-item label="联系人名称" prop="name"> <el-form-item label="联系人名称" prop="name">
<el-input <el-input
@ -54,7 +54,7 @@
</el-table-column> </el-table-column>
<el-table-column align="center" label="手机号" prop="mobile" /> <el-table-column align="center" label="手机号" prop="mobile" />
<el-table-column align="center" label="职位" prop="post" /> <el-table-column align="center" label="职位" prop="post" />
<el-table-column align="center" label="直属上级" prop="parentName" /> <!-- <el-table-column align="center" label="直属上级" prop="parentName" />-->
<el-table-column align="center" label="是否关键决策人" min-width="100" prop="master"> <el-table-column align="center" label="是否关键决策人" min-width="100" prop="master">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" /> <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" />

View File

@ -102,7 +102,7 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" fixed="left" label="客户名称" prop="customerName" width="220"> <el-table-column align="center" fixed="left" label="客户名称" prop="customerName" width="280">
<!-- <template #default="scope"> <!-- <template #default="scope">
<el-link <el-link
:underline="false" :underline="false"
@ -118,11 +118,11 @@
<el-table-column align="center" label="邮箱" prop="email" width="180" /> <el-table-column align="center" label="邮箱" prop="email" width="180" />
<el-table-column align="center" label="职位" prop="post" width="120" /> <el-table-column align="center" label="职位" prop="post" width="120" />
<el-table-column align="center" label="地址" prop="detailAddress" width="120" /> <el-table-column align="center" label="地址" prop="detailAddress" width="120" />
<el-table-column align="center" label="关键决策人" prop="master" width="100"> <!-- <el-table-column align="center" label="关键决策人" prop="master" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" /> <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" />
</template> </template>
</el-table-column> </el-table-column>-->
<el-table-column align="center" label="直属上级" prop="parentName" width="160"> <el-table-column align="center" label="直属上级" prop="parentName" width="160">
<template #default="scope"> <template #default="scope">
<el-link :underline="false" type="primary" @click="openDetail(scope.row.parentId)"> <el-link :underline="false" type="primary" @click="openDetail(scope.row.parentId)">

View File

@ -77,7 +77,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="变更项目" prop="endTime"> <el-form-item label="变更项目" prop="changeItem">
<el-radio-group v-model="formData.changeItem"> <el-radio-group v-model="formData.changeItem">
<el-radio :value="1">额度</el-radio> <el-radio :value="1">额度</el-radio>
<el-radio :value="2">授权人</el-radio> <el-radio :value="2">授权人</el-radio>
@ -96,7 +96,6 @@
v-if="formData.changeItem == 1" v-if="formData.changeItem == 1"
ref="limitFormRef" ref="limitFormRef"
:formFields="formFields" :formFields="formFields"
:data="formData" :data="formData"
:disabled="disabled" :disabled="disabled"
/> />
@ -104,18 +103,22 @@
<ContentWrap style="border: none"> <ContentWrap style="border: none">
甲方现授权人信息 甲方现授权人信息
</ContentWrap> </ContentWrap>
<ContractAuthPersonInfo <ContentWrap>
ref="personDataRef" <ContractAuthPersonInfo
:products="formData.contractAAuthorizedPersons" ref="personDataRef"
/> :products="formData.contractAAuthorizedPersons"
/>
</ContentWrap>
<ContentWrap style="border: none"> <ContentWrap style="border: none">
甲方授权人 甲方授权人
</ContentWrap> </ContentWrap>
<ContractBAuthorizedPersonForm ref="ContractBAuthorizedPersonFormRef" :customerId="formData.customerId" :contract-id="formData.id" /> <ContentWrap>
<ContractBAuthorizedPersonForm ref="ContractBAuthorizedPersonFormRef" :formFields="formFields" :customerId="formData.customerId" :contract-id="formData.id" />
</ContentWrap>
</div> </div>
<ContracExtension ref="contractExtensionFormRef" v-if="formData.changeItem == 3" :data="formData" /> <ContracExtension ref="contractExtensionFormRef" :formFields="formFields" v-if="formData.changeItem == 3" :data="formData" />
<ContractStop ref="contractStopFormRef" :formData="formData" v-if="formData.changeItem == 4" /> <ContractStop ref="contractStopFormRef" :formData="formData" :formFields="formFields" v-if="formData.changeItem == 4" />
<ContractAAuthorizedCompanyForm ref="contractAAuthorizedCompanyFormRef1" v-if="formData.changeItem == 5" :data="formData.contractAAuthorizedCompanys" /> <ContractAAuthorizedCompanyForm ref="contractAAuthorizedCompanyFormRef1" :formFields="formFields" v-if="formData.changeItem == 5" :data="formData.contractAAuthorizedCompanys" />
<ContractForm ref="contractFormRef" :type="1" v-if="formData.changeItem == 6" /> <ContractForm ref="contractFormRef" :type="1" v-if="formData.changeItem == 6" />
</ContentWrap> </ContentWrap>
</el-form> </el-form>
@ -166,9 +169,35 @@ const formFields = ref({
creditAmount: 1, creditAmount: 1,
creditLimit: 1, creditLimit: 1,
partnerCompanyId: 1, partnerCompanyId: 1,
changeAmount: 1, changeAmount: 2,
afterAmount: 1, afterAmount: 1,
changeAmountDeadline: 1, changeAmountDeadline: 2,
contractAAuthorizedCompanysother: 1,
contractAAuthorizedCompanysunifiedCreditCode: 1,
contractAAuthorizedCompanysinvoicingAddress: 1,
contractAAuthorizedCompanysinvoicingTelephone: 1,
contractAAuthorizedCompanyscompanyBank: 1,
contractAAuthorizedCompanyscompanyAccount: 1,
contractAAuthorizedCompanyscompanyAddress: 1,
contractAAuthorizedCompanysother2: 1,
contractAAuthorizedPersonsother: 1,
contractAAuthorizedPersonscustomerName: 1,
contractAAuthorizedPersonsauthPersonType: 1,
contractAAuthorizedPersonsphoneNumber: 1,
contractAAuthorizedPersonswechat: 1,
contractAAuthorizedPersonsidNumber: 1,
contractAAuthorizedPersonsemail: 1,
contractAAuthorizedPersonsother2: 1,
contractBAuthorizedPersonsother: 1,
contractBAuthorizedPersonsauthType: 1,
contractBAuthorizedPersonsuserId: 1,
contractBAuthorizedPersonspostName: 1,
contractBAuthorizedPersonsuserRank: 1,
contractBAuthorizedPersonsauthDesc: 1,
contractBAuthorizedPersonsphoneNumber: 1,
contractBAuthorizedPersonswechat: 1,
contractBAuthorizedPersonsemail: 1,
contractBAuthorizedPersonsother2: 1,
}) })
const formData = ref({ const formData = ref({
authPerson: [], authPerson: [],

View File

@ -176,4 +176,4 @@ const getData = () => {
} }
defineExpose({ validate, getData }) defineExpose({ validate, getData })
</script> </script>

View File

@ -162,7 +162,7 @@
<template #changeAmount> <template #changeAmount>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="调整金额(元)" prop="changeAmount"> <el-form-item label="调整金额(元)" prop="changeAmount">
<el-input v-model="formData.changeAmount" :disabled="formFields.contractBody !== 2 || isTrue" oninput="value=value.match(/^\d+(?:\.\d{0,2})?/)" placeholder="请输入调整金额(元)" @input="onChangeAmount" /> <el-input v-model="formData.changeAmount" :disabled="formFields.changeAmount !== 2 || isTrue" oninput="value=value.match(/^\d+(?:\.\d{0,2})?/)" placeholder="请输入调整金额(元)" @input="onChangeAmount" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template>
@ -180,7 +180,7 @@
v-model="formData.changeAmountDeadline" v-model="formData.changeAmountDeadline"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
type="date" type="date"
:disabled="formFields.contractBody !== 2 || isTrue" :disabled="formFields.changeAmountDeadline !== 2 || isTrue"
placeholder="请选择调整金额截止日期" placeholder="请选择调整金额截止日期"
style="width: 100%" style="width: 100%"
/> />
@ -293,27 +293,7 @@ const quotationProductFormRef = ref()
const props = defineProps<{ const props = defineProps<{
data: undefined, data: undefined,
type: undefined, type: undefined,
formFields: { formFields: {}
type: Object,
defualt: {
cooperationType: 1,
regType: 1,
actualCapital: 1,
socialEmployeeNum: 1,
defendantRecord: 1,
abnormalService: 1,
equityPledge: 1,
dishonestyRecord: 1,
financeRecord: 1,
judgmentRecord: 1,
creditAmount: 1,
creditLimit: 1,
partnerCompanyId: 1,
changeAmount: 1,
afterAmount: 1,
changeAmountDeadline: 1,
}
}
}>() }>()
watch( watch(
@ -393,8 +373,9 @@ const open = async (type: string) => {
} }
/** 表单校验 */ /** 表单校验 */
const validate = () => { const validate = async () => {
return formRef.value.validate() const isValid = await formRef.value.innerFormRef.validate()
return isValid
} }
/** 表单值 */ /** 表单值 */
@ -438,7 +419,7 @@ const resetForm = () => {
const route = useRoute(); const route = useRoute();
onMounted(async () => { onMounted(async () => {
isTrue.value = !!route.query.isDetail isTrue.value = !!route.query.isDetail
console.log('%csrc/views/crm/quotation/QuotationForm.vue:596 route', 'color: #007acc;', props.formFields); console.log('%csrc/views/crm/quotation/QuotationForm.vue:596 route', 'color: pink;', props.formFields.changeAmount !== 2 , isTrue.value);
// formType.value = route.query.id; // formType.value = route.query.id;
// if (formType.value) open(formType.value) // if (formType.value) open(formType.value)

View File

@ -1,7 +1,7 @@
<template> <template>
<!-- 操作栏 --> <!-- 操作栏 -->
<el-row justify="end"> <el-row justify="end">
<el-button @click="openForm"> <el-button @click="openForm" type="primary">
<Icon class="mr-5px" icon="clarity:contract-line" /> <Icon class="mr-5px" icon="clarity:contract-line" />
创建合同 创建合同
</el-button> </el-button>

View File

@ -1,7 +1,7 @@
<template> <template>
<!-- 操作栏 --> <!-- 操作栏 -->
<el-row justify="end"> <el-row justify="end">
<el-button @click="openFormAdd"> <el-button @click="openFormAdd" type="primary">
<Icon class="mr-5px" icon="clarity:contract-line" /> <Icon class="mr-5px" icon="clarity:contract-line" />
创建方案报价 创建方案报价
</el-button> </el-button>

View File

@ -38,7 +38,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template>
<template #auditStatus> <!-- <template #auditStatus>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="合同状态" prop="auditStatus"> <el-form-item label="合同状态" prop="auditStatus">
<el-select v-model="formData.auditStatus" disabled clearable placeholder="请选择合同状态"> <el-select v-model="formData.auditStatus" disabled clearable placeholder="请选择合同状态">
@ -51,7 +51,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template> -->
<template #endTime> <template #endTime>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="协议截止日期" prop="endTime"> <el-form-item label="协议截止日期" prop="endTime">
@ -103,11 +103,11 @@
<ContentWrap style="border: none"> <ContentWrap style="border: none">
甲方授权人 甲方授权人
</ContentWrap> </ContentWrap>
<ContractBAuthorizedPersonForm :type="1" ref="ContractBAuthorizedPersonFormRef" :customerId="formData.customerId" :contract-id="formData.id" /> <ContractBAuthorizedPersonForm :formFields="formFields" :type="1" ref="ContractBAuthorizedPersonFormRef" :customerId="formData.customerId" :contract-id="formData.id" />
</div> </div>
<ContracExtension ref="contractExtensionFormRef" v-if="formData.changeItem == 3" :disabled="true" :data="formData" /> <ContracExtension ref="contractExtensionFormRef" :formFields="formFields" v-if="formData.changeItem == 3" :disabled="true" :data="formData" />
<ContractStop ref="contractStopFormRef" :formData="formData" :disabled="true" v-if="formData.changeItem == 4" /> <ContractStop ref="contractStopFormRef" :formFields="formFields" :formData="formData" :disabled="true" v-if="formData.changeItem == 4" />
<ContractAAuthorizedCompanyForm ref="contractAAuthorizedCompanyFormRef1" :type="true" v-if="formData.changeItem == 5" :data="formData.contractAAuthorizedCompanys" /> <ContractAAuthorizedCompanyForm :formFields="formFields" ref="contractAAuthorizedCompanyFormRef1" :type="true" v-if="formData.changeItem == 5" :data="formData.contractAAuthorizedCompanys" />
<ContractForm ref="contractFormRef" :type="1" :id="formData.id" v-if="formData.changeItem == 6" /> <ContractForm ref="contractFormRef" :type="1" :id="formData.id" v-if="formData.changeItem == 6" />
</ContentWrap> </ContentWrap>
</template> </template>
@ -184,6 +184,32 @@ const formFields = ref({
changeAmount: 1, changeAmount: 1,
afterAmount: 1, afterAmount: 1,
changeAmountDeadline: 1, changeAmountDeadline: 1,
contractAAuthorizedCompanysother: 1,
contractAAuthorizedCompanysunifiedCreditCode: 1,
contractAAuthorizedCompanysinvoicingAddress: 1,
contractAAuthorizedCompanysinvoicingTelephone: 1,
contractAAuthorizedCompanyscompanyBank: 1,
contractAAuthorizedCompanyscompanyAccount: 1,
contractAAuthorizedCompanyscompanyAddress: 1,
contractAAuthorizedCompanysother2: 1,
contractAAuthorizedPersonsother: 1,
contractAAuthorizedPersonscustomerName: 1,
contractAAuthorizedPersonsauthPersonType: 1,
contractAAuthorizedPersonsphoneNumber: 1,
contractAAuthorizedPersonswechat: 1,
contractAAuthorizedPersonsidNumber: 1,
contractAAuthorizedPersonsemail: 1,
contractAAuthorizedPersonsother2: 1,
contractBAuthorizedPersonsother: 1,
contractBAuthorizedPersonsauthType: 1,
contractBAuthorizedPersonsuserId: 1,
contractBAuthorizedPersonspostName: 1,
contractBAuthorizedPersonsuserRank: 1,
contractBAuthorizedPersonsauthDesc: 1,
contractBAuthorizedPersonsphoneNumber: 1,
contractBAuthorizedPersonswechat: 1,
contractBAuthorizedPersonsemail: 1,
contractBAuthorizedPersonsother2: 1,
}) })
const formData = ref({ const formData = ref({
authPerson: [], authPerson: [],

View File

@ -284,7 +284,19 @@
command="handlePrint" command="handlePrint"
v-if="checkPermi(['crm:contract:print']) && scope.row.auditStatus === 2" v-if="checkPermi(['crm:contract:print']) && scope.row.auditStatus === 2"
> >
合同下载 下载未盖章合同
</el-dropdown-item>
<el-dropdown-item
command="handleUpload"
v-if="checkPermi(['crm:contract:print']) && scope.row.auditStatus === 2"
>
合同上传
</el-dropdown-item>
<el-dropdown-item
command="handlePrintComplate"
v-if="checkPermi(['crm:contract:print']) && scope.row.contractFileUrl"
>
下载盖章合同
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
command="handleDelete" command="handleDelete"
@ -411,6 +423,11 @@ const handleCommand = (command: string, row) => {
case 'handleDelete': case 'handleDelete':
handleDelete(row.id) handleDelete(row.id)
break break
case 'handleUpload':
handleUpload(row.id)
break
case 'handlePrintComplate':
handlePrintComplate(row.contractFileUrl)
default: default:
break break
} }
@ -457,6 +474,16 @@ const getPrintTemplate = (row) => {
formRef.value.open(row.id) formRef.value.open(row.id)
} }
const handleUpload = (val) => {
}
//
const handlePrintComplate = (val) => {
window.open(val)
}
//
const onPrintContract = async (row: ContractApi.ContractVO) => { const onPrintContract = async (row: ContractApi.ContractVO) => {
try { try {
const res = await ContractApi.printContract(row.id) const res = await ContractApi.printContract(row.id)

View File

@ -44,19 +44,6 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12">
<el-form-item label="客户来源" prop="source">
<el-select v-model="formData.source" filterable placeholder="请选择客户来源" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_SOURCE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="公司类型" prop="cooperationType"> <el-form-item label="公司类型" prop="cooperationType">
<el-select v-model="formData.cooperationType" filterable placeholder="请选择合作类型" class="w-1/1"> <el-select v-model="formData.cooperationType" filterable placeholder="请选择合作类型" class="w-1/1">
@ -72,8 +59,8 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="维护人" prop="maintainer"> <el-form-item label="维护人" prop="maintainer">
<el-select <el-select
class="w-1/1" class="w-1/1"
placeholder="请选择维护人" placeholder="请选择维护人"
v-model="formData.maintainer" v-model="formData.maintainer"
filterable filterable
> >
@ -85,6 +72,47 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户来源" prop="source">
<el-select v-model="formData.source" filterable placeholder="请选择客户来源" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_SOURCE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="签约人" prop="contractor">
<el-select
class="w-1/1"
placeholder="请选择签约人"
v-model="formData.contractor"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属行业" prop="industryId">
<el-select v-model="formData.industryId" placeholder="请选择所属行业" >
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="合作地区" prop="cooperationArea"> <el-form-item label="合作地区" prop="cooperationArea">
@ -98,13 +126,45 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> --> </el-col> -->
<el-col :span="12">
<el-form-item label="服务对接人" prop="servicor">
<el-select
class="w-1/1"
placeholder="请选择服务对接人"
v-model="formData.servicor"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="法人代表" prop="legalPersonName">
<el-input v-model="formData.legalPersonName" disabled placeholder="" />
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="法人代表" prop="legalPersonName"> <el-form-item label="技术对接人" prop="technicalLead">
<el-input v-model="formData.legalPersonName" disabled placeholder="" /> <el-select
</el-form-item> class="w-1/1"
</el-col> placeholder="请选择技术对接人"
</el-row> v-model="formData.technicalLead"
<el-row> filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="负责人" prop="ownerUserId"> <el-form-item label="负责人" prop="ownerUserId">
@ -212,7 +272,38 @@
<el-form-item label="注册资本" prop="registerCapital"> <el-form-item label="注册资本" prop="registerCapital">
<el-input v-model="formData.registerCapital" disabled placeholder="" /> <el-input v-model="formData.registerCapital" disabled placeholder="" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="结算对接人" prop="settlementLead">
<el-select
class="w-1/1"
placeholder="请选择结算对接人"
v-model="formData.settlementLead"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="注册日期" prop="contactNextTime">
<el-date-picker
disabled
v-model="formData.startDate"
placeholder=""
type="date"
value-format="x"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<!-- <el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="网站" prop=""> <el-form-item label="网站" prop="">
<el-input v-model="formData.website" placeholder="请输入网站" /> <el-input v-model="formData.website" placeholder="请输入网站" />
@ -242,98 +333,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> --> </el-col> -->
<el-col :span="12">
<el-form-item label="注册日期" prop="contactNextTime">
<el-date-picker
disabled
v-model="formData.startDate"
placeholder=""
type="date"
value-format="x"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户行业" prop="industryId">
<el-select v-model="formData.industryId" placeholder="请选择客户行业" >
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="服务对接人" prop="servicor">
<el-select
class="w-1/1"
placeholder="请选择服务对接人"
v-model="formData.servicor"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术对接人" prop="technicalLead">
<el-select
class="w-1/1"
placeholder="请选择技术对接人"
v-model="formData.technicalLead"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结算对接人" prop="settlementLead">
<el-select
class="w-1/1"
placeholder="请选择结算对接人"
v-model="formData.settlementLead"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="签约人" prop="contractor">
<el-select
class="w-1/1"
placeholder="请选择签约人"
v-model="formData.contractor"
filterable
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="地址" prop="areaId"> <el-form-item label="地址" prop="areaId">
<el-cascader <el-cascader

View File

@ -0,0 +1,263 @@
<template>
<!-- 操作栏 -->
<el-row justify="end">
<el-button @click="openFormAdd" type="primary">
<Icon class="mr-5px" icon="system-uicons:contacts" />
创建投诉建议
</el-button>
</el-row>
<!-- 列表 -->
<ContentWrap class="mt-10px">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="客户名称" align="center" prop="customerId" />
<el-table-column label="反馈联系人" align="center" prop="contactId" />
<el-table-column label="联系电话" align="center" prop="mobile" />
<el-table-column label="电子邮箱" align="center" prop="email" />
<el-table-column label="反馈类型" align="center" prop="feedbackType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_FEEDBACK_TYPE" :value="scope.row.feedbackType" />
</template>
</el-table-column>
<el-table-column label="反馈级别" align="center" prop="feedbackLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_FEEDBACK_LEVEL" :value="scope.row.feedbackLevel" />
</template>
</el-table-column>
<el-table-column label="紧急程度" align="center" prop="urgencyLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_URGENCY_LEVEL" :value="scope.row.urgencyLevel" />
</template>
</el-table-column>
<el-table-column
label="反馈时间"
align="center"
prop="feedbackTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="当事人" align="center" prop="relatedPerson" />
<el-table-column label="所属部门" align="center" prop="deptId" />
<el-table-column label="客户累计计数" align="center" prop="customerFeedbackCount" />
<el-table-column label="当事人累计计数" align="center" prop="relatedPersonFeedbackCount" />
<el-table-column label="反馈主体" align="center" prop="feedbackCompanyEntity" />
<el-table-column label="反馈内容" align="center" prop="feedbackContent" />
<el-table-column label="附件" align="center" prop="attachment">
<template #default="scope">
<el-link
v-if="scope.row.attachment"
:underline="false"
type="primary"
@click="previewFile(scope.row.attachment)"
>
预览
</el-link>
<span v-else></span>
</template>
</el-table-column>
<!-- <el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/> -->
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<!-- <el-button
link
type="primary"
@click="openFormEdit(scope.row)"
v-hasPermi="['crm:customer-feedback:update']"
>
编辑
</el-button> -->
<el-button
v-hasPermi="['crm:customer-feedback:query']"
link
type="primary"
@click="openDetail(scope.row)"
>
详情
</el-button>
<el-button
v-if="scope.row.auditStatus !== 0"
link
v-hasPermi="['crm:customer-feedback:query']"
type="primary"
@click="handleProcessDetail(scope.row)"
>
进度
</el-button>
<!-- <el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['crm:customer-feedback:delete']"
>
删除
</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<!-- <CustomerFeedbackForm ref="formRef" @success="getList" /> -->
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CustomerFeedbackApi, CustomerFeedbackVO } from '@/api/crm/feedback'
import CustomerFeedbackForm from './CustomerFeedbackForm.vue'
/** 客户反馈 列表 */
defineOptions({ name: 'CustomerFeedback' })
const message = useMessage() //
const { t } = useI18n() //
const props = defineProps<{
bizId: number //
}>()
const loading = ref(true) //
const list = ref<CustomerFeedbackVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
customerId: undefined,
contactId: undefined,
mobile: undefined,
email: undefined,
feedbackType: undefined,
feedbackLevel: undefined,
urgencyLevel: undefined,
feedbackTime: [],
relatedPerson: undefined,
deptId: undefined,
customerFeedbackCount: undefined,
relatedPersonFeedbackCount: undefined,
feedbackCompanyEntity: undefined,
feedbackContent: undefined,
attachment: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const route = useRouter()
const getList = async () => {
loading.value = true
try {
console.log('%csrc/views/crm/customer/detail/ComplaintsSuggestion.vue:159 route', 'color: #007acc;', route);
queryParams.customerId = props.bizId
console.log('%csrc/views/crm/customer/detail/ComplaintsSuggestion.vue:163 queryParams', 'color: #007acc;', queryParams);
const data = await CustomerFeedbackApi.getCustomerFeedbackPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
defineExpose({ getList })
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
//
const previewFile = (fileUrls) => {
// // fileUrls URL
if (!fileUrls) {
message.error('没有附件');
return;
}
//
const fileExtension = fileUrls.split('.').pop().toLowerCase();
router.push({
name: 'FileTemplatePreview',
query: {
src: encodeURIComponent(fileUrls),
type: fileExtension
}
})
}
/** 添加/修改操作 */
const formRef = ref()
// const openForm = (type: string, id?: number) => {
// formRef.value.open(type, id)
// }
const router = useRouter() //
const openFormAdd = () => {
router.push({ name: 'CustomerFeedbackCreate' })
}
const openFormEdit = (row: Object) => {
router.push({ name: 'CustomerFeedbackEdit', query: { id: row.id} })
}
const openDetail = (row: Object) => {
router.push({ name: 'CustomerFeedbackDetail', query: { id: row.id } })
}
/** 查看审批 */
const handleProcessDetail = (row) => {
router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } })
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await CustomerFeedbackApi.deleteCustomerFeedback(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CustomerFeedbackApi.exportCustomerFeedback(queryParams)
download.excel(data, '客户反馈.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
onActivated(()=>{
getList()
})
</script>

View File

@ -31,9 +31,9 @@
<!-- <el-collapse v-model="activeNames" class=""> --> <!-- <el-collapse v-model="activeNames" class=""> -->
<el-descriptions :column="4"> <el-descriptions :column="4">
<el-descriptions-item label="客户名称"> <!-- <el-descriptions-item label="客户名称">
{{ customer.name }} {{ customer.name }}
</el-descriptions-item> </el-descriptions-item> -->
<el-descriptions-item label="成交状态">{{ customer.dealStatus ? '已成交' : '未成交' }}</el-descriptions-item> <el-descriptions-item label="成交状态">{{ customer.dealStatus ? '已成交' : '未成交' }}</el-descriptions-item>
<el-descriptions-item label="客户来源"> <el-descriptions-item label="客户来源">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="customer.source" /> <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="customer.source" />
@ -46,10 +46,13 @@
</el-descriptions-item> </el-descriptions-item>
<!-- <el-descriptions-item label="合作地区">{{ getName(getIntDictOptions(DICT_TYPE.CRM_COOPERATION_AREA),customer.cooperationArea) }}</el-descriptions-item> --> <!-- <el-descriptions-item label="合作地区">{{ getName(getIntDictOptions(DICT_TYPE.CRM_COOPERATION_AREA),customer.cooperationArea) }}</el-descriptions-item> -->
<!-- <el-descriptions-item label="行业">{{ getName(getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY),customer.industryId) }}</el-descriptions-item> --> <!-- <el-descriptions-item label="行业">{{ getName(getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY),customer.industryId) }}</el-descriptions-item> -->
<el-descriptions-item label="行业"> <el-descriptions-item label="所属行业">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="customer.industryId" /> <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="customer.industryId" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label=" 拓展人">{{ customer.developerName }}</el-descriptions-item> <el-descriptions-item label="合作状态">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_STSTUS" :value="customer.customerStatus" />
</el-descriptions-item>
<el-descriptions-item label=" 拓展人">{{ customer.clueDeveloperName }}</el-descriptions-item>
<!-- <el-descriptions-item label="线索拓展人">{{ customer.clueDeveloperName }}</el-descriptions-item>--> <!-- <el-descriptions-item label="线索拓展人">{{ customer.clueDeveloperName }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="协助人">{{ customer.assistName }}</el-descriptions-item> --> <!-- <el-descriptions-item label="协助人">{{ customer.assistName }}</el-descriptions-item> -->
=<el-descriptions-item label="维护人">{{ customer.maintainerName }}</el-descriptions-item> =<el-descriptions-item label="维护人">{{ customer.maintainerName }}</el-descriptions-item>
@ -59,6 +62,7 @@
<el-descriptions-item label="服务对接人">{{ customer.servicorName }}</el-descriptions-item> <el-descriptions-item label="服务对接人">{{ customer.servicorName }}</el-descriptions-item>
<el-descriptions-item label="结算对接人">{{ customer.settlementLeadName }}</el-descriptions-item> <el-descriptions-item label="结算对接人">{{ customer.settlementLeadName }}</el-descriptions-item>
<el-descriptions-item label="创建时间">{{ formatDate(customer.createTime) }}</el-descriptions-item> <el-descriptions-item label="创建时间">{{ formatDate(customer.createTime) }}</el-descriptions-item>
<el-descriptions-item label="最后跟进时间">{{ formatDate(customer.contactLastTime) }}</el-descriptions-item>
<!-- <el-descriptions-item label="手机号">{{ customer.mobile }}</el-descriptions-item> <!-- <el-descriptions-item label="手机号">{{ customer.mobile }}</el-descriptions-item>
<el-descriptions-item label="电话">{{ customer.telephone }}</el-descriptions-item> <el-descriptions-item label="电话">{{ customer.telephone }}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ customer.email }}</el-descriptions-item>--> <el-descriptions-item label="邮箱">{{ customer.email }}</el-descriptions-item>-->

View File

@ -61,7 +61,7 @@
/> />
</el-tab-pane> --> </el-tab-pane> -->
<el-tab-pane label="商机" lazy name="BusinessListRef"> <el-tab-pane label="商机" lazy name="BusinessListRef">
<BusinessList ref="BusinessListRef" :biz-id="customer.id!" :biz-type="BizTypeEnum.CRM_CUSTOMER" /> <BusinessList ref="BusinessListRef" :biz-id="customer.id!" :biz-type="BizTypeEnum.CRM_CUSTOMER" :clueDeveloper="customer.clueDeveloper" :maintenanceUserId="customer.maintainer" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="方案报价" lazy name="QuotationListRef"> <el-tab-pane label="方案报价" lazy name="QuotationListRef">
<QuotationList ref="QuotationListRef" :biz-id="customer.id!" :biz-type="BizTypeEnum.CRM_CUSTOMER" /> <QuotationList ref="QuotationListRef" :biz-id="customer.id!" :biz-type="BizTypeEnum.CRM_CUSTOMER" />
@ -76,6 +76,9 @@
<ReceivablePlanList :customer-id="customer.id!" @create-receivable="createReceivable" /> <ReceivablePlanList :customer-id="customer.id!" @create-receivable="createReceivable" />
<ReceivableList ref="receivableListRef" :customer-id="customer.id!" /> <ReceivableList ref="receivableListRef" :customer-id="customer.id!" />
</el-tab-pane> --> </el-tab-pane> -->
<el-tab-pane label="投诉建议" name="ComplaintsSuggestionRef">
<ComplaintsSuggestion ref="ComplaintsSuggestionRef" :biz-id="customer.id!" />
</el-tab-pane>
<el-tab-pane label="操作日志"> <el-tab-pane label="操作日志">
<OperateLogV2 :log-list="logList" /> <OperateLogV2 :log-list="logList" />
</el-tab-pane> </el-tab-pane>
@ -93,6 +96,7 @@ import * as CustomerApi from '@/api/crm/customer'
import CustomerForm from '@/views/crm/customer/CustomerForm.vue' import CustomerForm from '@/views/crm/customer/CustomerForm.vue'
import CompanyDetailsInfo from './companyDetailsInfo.vue' // import CompanyDetailsInfo from './companyDetailsInfo.vue' //
import CustomerDetailsInfo from './CustomerDetailsInfo.vue' // - import CustomerDetailsInfo from './CustomerDetailsInfo.vue' // -
import ComplaintsSuggestion from './ComplaintsSuggestion.vue' // -
import CustomerDetailsHeader from './CustomerDetailsHeader.vue' // - import CustomerDetailsHeader from './CustomerDetailsHeader.vue' // -
import ReturnVisitrecord from './returnvisitrecord/index.vue' // 访 import ReturnVisitrecord from './returnvisitrecord/index.vue' // 访
import ContactList from '@/views/crm/contact/components/ContactList.vue' // import ContactList from '@/views/crm/contact/components/ContactList.vue' //
@ -227,6 +231,7 @@ const ContactListRef = ref('')
const BusinessListRef = ref('') const BusinessListRef = ref('')
const QuotationListRef = ref('') const QuotationListRef = ref('')
const ContractListRef = ref('') const ContractListRef = ref('')
const ComplaintsSuggestionRef = ref('')
const handleClick = async (val) => { const handleClick = async (val) => {
let name = val.props.name let name = val.props.name
@ -241,6 +246,7 @@ const handleClick = async (val) => {
BusinessListRef: BusinessListRef.value, BusinessListRef: BusinessListRef.value,
QuotationListRef: QuotationListRef.value, QuotationListRef: QuotationListRef.value,
ContractListRef: ContractListRef.value, ContractListRef: ContractListRef.value,
ComplaintsSuggestionRef: ComplaintsSuggestionRef.value
} }
objRef[name].getList() objRef[name].getList()
} else { } else {

View File

@ -164,7 +164,7 @@
<el-table-column align="center" label="技术对接人" prop="technicalLeadName" width="120" /> <el-table-column align="center" label="技术对接人" prop="technicalLeadName" width="120" />
<el-table-column align="center" label="服务对接人" prop="servicorName" width="120" /> <el-table-column align="center" label="服务对接人" prop="servicorName" width="120" />
<el-table-column align="center" label="结算对接人" prop="settlementLeadName" width="120" /> <el-table-column align="center" label="结算对接人" prop="settlementLeadName" width="120" />
<el-table-column align="center" label="行业" prop="industryId" width="100"> <el-table-column align="center" label="所属行业" prop="industryId" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" /> <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
</template> </template>
@ -176,12 +176,13 @@
<el-table-column align="center" label="负责人" prop="ownerUserName" width="100px" /> <el-table-column align="center" label="负责人" prop="ownerUserName" width="100px" />
<el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100px" /> <el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100px" />
<el-table-column <el-table-column
:formatter="dateFormatter"
align="center" align="center"
label="创建时间" label="创建时间"
prop="createTime" prop="createTime"
width="180px" width="180px"
/> >
{{ moment(createTime).format('YYYY-MM-DD')}}
</el-table-column>
<el-table-column align="center" label="创建人" prop="creatorName" width="100px" /> <el-table-column align="center" label="创建人" prop="creatorName" width="100px" />
<!-- <el-table-column align="center" label="客户状态" prop="serviceStatus" width="120" /> --> <!-- <el-table-column align="center" label="客户状态" prop="serviceStatus" width="120" /> -->
<!-- <el-table-column align="center" label="电话" prop="telephone" width="130" /> <!-- <el-table-column align="center" label="电话" prop="telephone" width="130" />
@ -300,6 +301,7 @@ import * as CustomerApi from '@/api/crm/customer'
import CustomerForm from './CustomerForm.vue' import CustomerForm from './CustomerForm.vue'
import CustomerImportForm from './CustomerImportForm.vue' import CustomerImportForm from './CustomerImportForm.vue'
import { TabsPaneContext } from 'element-plus' import { TabsPaneContext } from 'element-plus'
import moment from 'moment';
defineOptions({ name: 'CrmCustomer' }) defineOptions({ name: 'CrmCustomer' })

View File

@ -55,7 +55,7 @@
<FollowUpRecordContactForm @success="del" :contacts="formData.contacts" /> <FollowUpRecordContactForm @success="del" :contacts="formData.contacts" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-if="formData.bizType == BizTypeEnum.CRM_CUSTOMER"> <!-- <el-col :span="24" v-if="formData.bizType == BizTypeEnum.CRM_CUSTOMER">
<el-form-item label="关联商机" prop="businessIds"> <el-form-item label="关联商机" prop="businessIds">
<el-button @click="handleOpenBusiness"> <el-button @click="handleOpenBusiness">
<Icon class="mr-5px" icon="ep:plus" /> <Icon class="mr-5px" icon="ep:plus" />
@ -63,7 +63,7 @@
</el-button> </el-button>
<FollowUpRecordBusinessForm :businesses="formData.businesses" /> <FollowUpRecordBusinessForm :businesses="formData.businesses" />
</el-form-item> </el-form-item>
</el-col> </el-col>-->
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>

View File

@ -9,7 +9,7 @@
</el-table-column> </el-table-column>
<el-table-column label="手机号" align="center" prop="mobile" /> <el-table-column label="手机号" align="center" prop="mobile" />
<el-table-column label="职位" align="center" prop="post" /> <el-table-column label="职位" align="center" prop="post" />
<el-table-column label="直属上级" align="center" prop="parentName" /> <!-- <el-table-column label="直属上级" align="center" prop="parentName" />-->
<el-table-column label="是否关键决策人" align="center" prop="master" min-width="100"> <el-table-column label="是否关键决策人" align="center" prop="master" min-width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" /> <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" />

View File

@ -32,30 +32,6 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="客单价" prop="customerPrice">
<el-input
v-model="queryParams.customerPrice"
placeholder="请输入客单价"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-select
v-model="queryParams.unit"
placeholder="请选择单位"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_UNIT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="采购成本" prop="procurementCost"> <el-form-item label="采购成本" prop="procurementCost">
<el-input <el-input
v-model="queryParams.procurementCost" v-model="queryParams.procurementCost"
@ -65,24 +41,6 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="客单价 - 采购成本" prop="profit">
<el-input
v-model="queryParams.profit"
placeholder="请输入客单价 - 采购成本"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="说明" prop="describe">
<el-input
v-model="queryParams.describe"
placeholder="请输入说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime"
@ -271,4 +229,4 @@ const handleExport = async () => {
onMounted(() => { onMounted(() => {
getList() getList()
}) })
</script> </script>

View File

@ -19,7 +19,7 @@
<el-form-item label="打卡状态(正常、迟到、早退、缺卡等)" prop="clockStatus"> <el-form-item label="打卡状态(正常、迟到、早退、缺卡等)" prop="clockStatus">
<el-select v-model="formData.clockStatus" placeholder="请选择打卡状态(正常、迟到、早退、缺卡等)"> <el-select v-model="formData.clockStatus" placeholder="请选择打卡状态(正常、迟到、早退、缺卡等)">
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HRM_ CLOCK_STATUS)" v-for="dict in getStrDictOptions(DICT_TYPE.HRM_CLOCK_STATUS)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
@ -151,4 +151,4 @@ const resetForm = () => {
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
</script> </script>

View File

@ -43,7 +43,7 @@
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HRM_ CLOCK_STATUS)" v-for="dict in getStrDictOptions(DICT_TYPE.HRM_CLOCK_STATUS)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
@ -140,7 +140,7 @@
<el-table-column label="岗位ID" align="center" prop="postId" /> <el-table-column label="岗位ID" align="center" prop="postId" />
<el-table-column label="打卡状态(正常、迟到、早退、缺卡等)" align="center" prop="clockStatus"> <el-table-column label="打卡状态(正常、迟到、早退、缺卡等)" align="center" prop="clockStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_ CLOCK_STATUS" :value="scope.row.clockStatus" /> <dict-tag :type="DICT_TYPE.HRM_CLOCK_STATUS" :value="scope.row.clockStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="打卡类型(正常上下班、加班)" align="center" prop="clockType"> <el-table-column label="打卡类型(正常上下班、加班)" align="center" prop="clockType">
@ -298,4 +298,4 @@ const handleExport = async () => {
onMounted(() => { onMounted(() => {
getList() getList()
}) })
</script> </script>