客户/供应商 子表分开,id改回自增
This commit is contained in:
luojiaquan
2026-09-10 14:43:51 +08:00
parent 05c8d3f90d
commit 9e99a4a6c2
20 changed files with 1810 additions and 737 deletions
@@ -8,6 +8,7 @@
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input
@@ -158,13 +159,19 @@
<dict-tag :options="sys_normal_disable" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column label="业务员用户ID" align="center" prop="salesUserId" />
<!-- <el-table-column label="业务员用户ID" align="center" prop="salesUserId" /> -->
<el-table-column label="业务员姓名" align="center" prop="salesUser" />
<el-table-column label="资金额度" align="center" prop="ed" />
<el-table-column label="回款账期" align="center" prop="zq" />
<el-table-column label="结算员用户ID" align="center" prop="settlementUserId" />
<!-- <el-table-column label="结算员用户ID" align="center" prop="settlementUserId" /> -->
<el-table-column label="结算员姓名" align="center" prop="settlementUser" />
<el-table-column label="客服用户ID" align="center" prop="serviceUserId" />
<!-- <el-table-column label="结算员" align="center">-->
<!-- <template slot-scope="scope">-->
<!-- {{ getUserName(scope.row.settlementUserId) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="客服用户ID" align="center" prop="serviceUserId" /> -->
<el-table-column label="客服姓名" align="center" prop="serviceUser" />
<el-table-column label="结算方式" align="center" prop="settlementType" />
<el-table-column label="临时额度" align="center" prop="tempEd" />
@@ -198,6 +205,7 @@
<el-form ref="customerRef" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="客户编码" prop="customerCode">
<el-input v-model="form.customerCode" placeholder="请输入客户编码" />
</el-form-item>
@@ -238,6 +246,25 @@
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="联系人" prop="contactList">
<div style="margin-bottom: 8px;">
<el-button type="primary" plain icon="Plus" size="small" @click="handleAddContact">新增联系人</el-button>
</div>
<el-table :data="form.contactList" border size="small" :max-height="240">
<el-table-column label="序号" type="index" width="55" align="center" />
<el-table-column label="联系人" align="center" prop="contactName" show-overflow-tooltip />
<el-table-column label="职位" align="center" prop="position" show-overflow-tooltip />
<el-table-column label="手机号" align="center" prop="phone" show-overflow-tooltip />
<el-table-column label="操作" align="center" width="160">
<template #default="scope">
<el-button link type="primary" size="small" @click="handleEditContact(scope.row, scope.$index)">编辑</el-button>
<el-button link type="danger" size="small" @click="handleDeleteContact(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="启用状态" prop="isEnable">
<el-select
@@ -595,6 +622,118 @@
</div>
</template>
</el-dialog>
<!-- 联系人编辑对话框 -->
<el-dialog :title="contactDialogTitle" v-model="contactDialogVisible" width="800px" append-to-body>
<el-form ref="contactRef" :model="contactForm" :rules="contactRules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="联系人姓名" prop="contactName">
<el-input v-model="contactForm.contactName" placeholder="请输入联系人姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职位" prop="position">
<el-input v-model="contactForm.position" placeholder="如 采购经理/财务总监" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号" prop="phone">
<el-input v-model="contactForm.phone" placeholder="请输入手机号" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门" prop="department">
<el-input v-model="contactForm.department" placeholder="如 采购部/财务部" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="座机" prop="landline">
<el-input v-model="contactForm.landline" placeholder="含区号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电子邮箱" prop="email">
<el-input v-model="contactForm.email" placeholder="请输入电子邮箱" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="微信号" prop="wechat">
<el-input v-model="contactForm.wechat" placeholder="请输入微信号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="QQ号" prop="qq">
<el-input v-model="contactForm.qq" placeholder="请输入QQ号" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="国家/地区" prop="country" label-width="90px">
<el-input v-model="contactForm.country" placeholder="中国" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="省份" prop="province" label-width="60px">
<el-input v-model="contactForm.province" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="城市" prop="city" label-width="60px">
<el-input v-model="contactForm.city" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="区/县" prop="district" label-width="60px">
<el-input v-model="contactForm.district" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮政编码" prop="postalCode">
<el-input v-model="contactForm.postalCode" placeholder="请输入邮政编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="详细地址" prop="contactAddress">
<el-input v-model="contactForm.contactAddress" placeholder="街道、门牌号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系人类型" prop="contactType">
<el-select v-model="contactForm.contactType" placeholder="请选择" clearable>
<el-option label="业务联系人" value="0" />
<el-option label="财务联系人" value="1" />
<el-option label="紧急联系人" value="2" />
<el-option label="其他" value="3" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否默认" prop="isDefault">
<el-radio-group v-model="contactForm.isDefault">
<el-radio label="0">否</el-radio>
<el-radio label="1">是</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="排序" prop="sortOrder">
<el-input-number v-model="contactForm.sortOrder" :min="0" controls-position="right" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="contactForm.remark" type="textarea" :rows="2" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitContactForm">确 定</el-button>
<el-button @click="contactDialogVisible = false">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@@ -602,7 +741,7 @@
import { listCustomer, getCustomer, delCustomer, addCustomer, updateCustomer } from "@/api/customersuppliermanagement/customerinfo/customer.js"
import { listUser } from "@/api/system/user"
import { getToken } from "@/utils/auth"
// import customerSelect from "@/components/customerSelect/index.vue"
const { proxy } = getCurrentInstance()
@@ -796,6 +935,7 @@ function reset() {
productIds: null,
attachmentList: [],
companyList: [],
contactList: [],
remark: null,
createBy: null,
createTime: null,
@@ -844,6 +984,9 @@ function handleUpdate(row) {
if (!form.value.companyList) {
form.value.companyList = []
}
if (!form.value.contactList) {
form.value.contactList = []
}
open.value = true
title.value = "修改客户"
})
@@ -1000,6 +1143,93 @@ function submitCompanyForm() {
proxy.$modal.msgSuccess(companyEditingIndex.value >= 0 ? "修改成功" : "新增成功")
}
/* ============ 联系人子表 ============ */
const contactDialogVisible = ref(false)
const contactDialogTitle = ref("")
const contactForm = ref({})
const contactEditingIndex = ref(-1)
const contactRules = {
contactName: [{ required: true, message: '联系人姓名不能为空', trigger: 'blur' }],
phone: [{ required: true, message: '手机号不能为空', trigger: 'blur' }]
}
/** 重置联系人表单 */
function resetContactForm() {
contactForm.value = {
contactId: null,
customerId: form.value.customerId || null,
contactName: '',
position: '',
department: '',
phone: '',
landline: '',
email: '',
wechat: '',
qq: '',
country: '中国',
province: '',
city: '',
district: '',
contactAddress: '',
postalCode: '',
isDefault: '0',
contactType: '0',
sortOrder: 0,
remark: ''
}
proxy.resetForm("contactRef")
}
function getUserName(userId) {
if (!userId) return ''
const user = this.userOptions.find(u => String(u.userId) === String(userId))
return user ? user.nickName : userId
}
/** 新增联系人(本地子表,跟随主表一起提交) */
function handleAddContact() {
resetContactForm()
contactEditingIndex.value = -1
contactDialogTitle.value = "新增联系人"
contactDialogVisible.value = true
}
/** 编辑联系人 */
function handleEditContact(row, index) {
resetContactForm()
contactForm.value = { ...row }
contactEditingIndex.value = index
contactDialogTitle.value = "修改联系人"
contactDialogVisible.value = true
}
/** 删除联系人(仅从子表移除;未入库的不调后端,已入库的在主表保存后由后端增量处理) */
function handleDeleteContact(index) {
proxy.$modal.confirm('是否确认删除该条联系人记录?').then(() => {
form.value.contactList.splice(index, 1)
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}
/** 提交联系人表单(本地保存,跟随主表提交一起入库) */
function submitContactForm() {
if (!contactForm.value.contactName) {
proxy.$modal.msgWarning("联系人姓名不能为空")
return
}
if (!Array.isArray(form.value.contactList)) {
form.value.contactList = []
}
if (contactEditingIndex.value >= 0) {
form.value.contactList.splice(contactEditingIndex.value, 1, { ...contactForm.value })
} else {
form.value.contactList.push({ ...contactForm.value })
}
contactDialogVisible.value = false
proxy.$modal.msgSuccess(contactEditingIndex.value >= 0 ? "修改成功" : "新增成功")
}
getUserList()
getList()
</script>
@@ -33,8 +33,8 @@
clearable
@change="handleQuery"
>
<el-option label="正常" :value="0" />
<el-option label="停用" :value="1" />
<el-option label="正常" value="0" />
<el-option label="停用" value="1" />
</el-select>
</el-form-item>
@@ -101,7 +101,6 @@
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['customersupplier:supplierinfo:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
@@ -143,7 +142,9 @@
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="对外代码" align="center" prop="supplierCodeDw" />
<el-table-column label="统一社会信用代码" align="center" prop="creditCode" />
<el-table-column label="供应商类型" align="center" prop="supplierType" />
<el-table-column label="供应商类型" align="center" prop="supplierType">
<template #default="scope">{{ formatOption(supplierTypeOptions, scope.row.supplierType) }}</template>
</el-table-column>
<el-table-column label="启用状态" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.isEnable" />
@@ -154,15 +155,21 @@
<el-table-column label="应付账期" align="center" prop="zq" />
<el-table-column label="结算员姓名" align="center" prop="settlementUser" />
<el-table-column label="跟单员姓名" align="center" prop="serviceUser" />
<el-table-column label="结算方式" align="center" prop="settlementType" />
<el-table-column label="结算方式" align="center" prop="settlementType">
<template #default="scope">{{ formatOption(settlementTypeOptions, scope.row.settlementType) }}</template>
</el-table-column>
<el-table-column label="临时额度" align="center" prop="tempEd" />
<el-table-column label="应付余额" align="center" prop="accountBalance" />
<el-table-column label="外币应付余额" align="center" prop="foreignCurrencyBalance" />
<el-table-column label="信用额度" align="center" prop="creditEd" />
<el-table-column label="重量阈值" align="center" prop="weightThreshold" />
<el-table-column label="抛比" align="center" prop="throwRatio" />
<el-table-column label="合作开始日期" align="center" prop="cooperationStartDate" />
<el-table-column label="合作状态" align="center" prop="cooperationStatus" />
<el-table-column label="合作开始日期" align="center" prop="cooperationStartDate">
<template #default="scope">{{ formatDateOnly(scope.row.cooperationStartDate) }}</template>
</el-table-column>
<el-table-column label="合作状态" align="center" prop="cooperationStatus">
<template #default="scope">{{ formatOption(cooperationStatusOptions, scope.row.cooperationStatus) }}</template>
</el-table-column>
<el-table-column label="绑定渠道ID" align="center" prop="channelIds" />
<el-table-column label="备注说明" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -659,6 +666,36 @@ const attachmentTypeOptions = ref([
{ value: "2", label: "合同文件" },
{ value: "3", label: "其他" }
])
const supplierTypeOptions = ref([
{ value: "0", label: "生产商" },
{ value: "1", label: "代理商" },
{ value: "2", label: "个人" },
{ value: "3", label: "物流商" },
{ value: "4", label: "其他" }
])
const settlementTypeOptions = ref([
{ value: "0", label: "月结" },
{ value: "1", label: "周结" },
{ value: "2", label: "日结" },
{ value: "3", label: "票结" }
])
const cooperationStatusOptions = ref([
{ value: "0", label: "正常" },
{ value: "1", label: "暂停" },
{ value: "2", label: "终止" }
])
function formatOption(options, value) {
if (value === null || value === undefined || value === '') return ''
const opt = options.find(o => String(o.value) === String(value))
return opt ? opt.label : value
}
function formatDateOnly(value) {
if (!value) return ''
const s = String(value)
return s.length > 10 ? s.substring(0, 10) : s
}
const ATTACHMENT_SIZE_LIMIT = 50
const ATTACHMENT_EXTENSIONS = ["pdf", "jpg", "jpeg", "png", "doc", "docx", "xls", "xlsx", "zip", "rar"]
@@ -696,7 +733,7 @@ function handleAttachmentUploadSuccess(res, file) {
if (res.code === 200) {
form.value.attachmentList.push({
attachmentId: null,
customerId: form.value.supplierId || null,
supplierId: form.value.supplierId || null,
fileName: file.name,
filePath: res.fileName,
fileSize: file.size,
@@ -913,7 +950,7 @@ const companyEditingIndex = ref(-1)
function resetCompanyForm() {
companyForm.value = {
companyId: null,
customerId: null,
supplierId: null,
companyNameFull: '',
englishName: '',
creditCode: '',