This commit is contained in:
Vinjor 2025-11-07 17:21:33 +08:00
parent fb0d8cde1e
commit 4f9b4afcfd
9 changed files with 192 additions and 120 deletions

View File

@ -117,6 +117,7 @@ public class CusMainController extends BaseController
@Log(title = "客户信息", businessType = BusinessType.INSERT) @Log(title = "客户信息", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody CusMainVO cusMainVO){ public AjaxResult add(@RequestBody CusMainVO cusMainVO){
cusMainVO.getMainInfo().setCusCode(codeGenerator.generate());
cusMainService.saveNewCus(cusMainVO); cusMainService.saveNewCus(cusMainVO);
return success(); return success();
} }

View File

@ -1,12 +1,16 @@
package com.ruoyi.cus.service.impl; package com.ruoyi.cus.service.impl;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cus.domain.*; import com.ruoyi.cus.domain.*;
import com.ruoyi.cus.mapper.*; import com.ruoyi.cus.mapper.*;
import com.ruoyi.cus.service.*; import com.ruoyi.cus.service.*;
import com.ruoyi.cus.vo.CusMainVO; import com.ruoyi.cus.vo.CusMainVO;
import com.ruoyi.cus.vo.MarkVO;
import com.ruoyi.utils.SnowflakeIdGenerator; import com.ruoyi.utils.SnowflakeIdGenerator;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -53,6 +57,9 @@ public class CusMainServiceImpl extends ServiceImpl<CusMainMapper,CusMain> impl
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveNewCus(CusMainVO cusMainVO) { public void saveNewCus(CusMainVO cusMainVO) {
CusMain cusMain = cusMainVO.getMainInfo(); CusMain cusMain = cusMainVO.getMainInfo();
if(!cusMainVO.getMainInfo().getMainProdList().isEmpty()){
cusMain.setMainProds(String.join(",",cusMainVO.getMainInfo().getMainProdList()));
}
cusMainMapper.insert(cusMain); cusMainMapper.insert(cusMain);
//联系人信息 //联系人信息
List<CusContacts> contacts = cusMainVO.getContact(); List<CusContacts> contacts = cusMainVO.getContact();
@ -62,24 +69,56 @@ public class CusMainServiceImpl extends ServiceImpl<CusMainMapper,CusMain> impl
} }
cusContactsService.saveBatch(contacts); cusContactsService.saveBatch(contacts);
//公司信息 //公司信息
CusCompany cusCompany = cusMainVO.getCompanyInfo(); CusCompany cusCompany = Optional.ofNullable(cusMainVO.getCompanyInfo()).orElseGet(CusCompany::new);
cusCompany.setCusId(cusMain.getId()); cusCompany.setCusId(cusMain.getId());
cusCompanyService.save(cusCompany); cusCompanyService.save(cusCompany);
//管理信息 //管理信息
CusManager cusManager = cusMainVO.getManagementInfo(); CusManager cusManager = Optional.ofNullable(cusMainVO.getManagementInfo()).orElseGet(CusManager::new);
cusManager.setCusId(cusMain.getId()); cusManager.setCusId(cusMain.getId());
cusManagerService.save(cusManager); cusManagerService.save(cusManager);
//银行信息 //银行信息
List<CusBank> bankList = cusMainVO.getBankInfo(); List<CusBank> bankList = Optional.ofNullable(cusMainVO.getBankInfo()).orElseGet(ArrayList::new);
if(!bankList.isEmpty()){ if(!bankList.isEmpty()){
bankList.forEach(bank -> bank.setCusId(cusMain.getId())); bankList.forEach(bank -> bank.setCusId(cusMain.getId()));
cusBankService.saveBatch(bankList); cusBankService.saveBatch(bankList);
} }
//唛头信息 //唛头信息
List<CusMark> markList = cusMainVO.getMark(); List<CusMark> markList = this.getMarkList(Optional.ofNullable(cusMainVO.getMark()).orElseGet(MarkVO::new), cusMain.getId());
if(!markList.isEmpty()){ cusMarkService.saveBatch(markList);
markList.forEach(mark -> mark.setCusId(cusMain.getId())); }
cusMarkService.saveBatch(markList);
} /**
* 将mark对象转为list存储
* @author vinjor-M
* @date 15:09 2025/11/7
* @return java.util.List<com.ruoyi.cus.domain.CusMark>
**/
private List<CusMark> getMarkList(MarkVO markVO, String cusId) {
List<CusMark> markList = new ArrayList<>();
markList.add(CusMark.builder()
.cusId(cusId)
.markPosition("主唛")
.textContent(markVO.getMainText())
.imageUrl(markVO.getMainPic())
.build());
markList.add(CusMark.builder()
.cusId(cusId)
.markPosition("主侧唛")
.textContent(markVO.getMainSideText())
.imageUrl(markVO.getMainSidePic())
.build());
markList.add(CusMark.builder()
.cusId(cusId)
.markPosition("内主唛")
.textContent(markVO.getInText())
.imageUrl(markVO.getInPic())
.build());
markList.add(CusMark.builder()
.cusId(cusId)
.markPosition("内侧唛")
.textContent(markVO.getInSideText())
.imageUrl(markVO.getInSidePic())
.build());
return markList;
} }
} }

View File

@ -2,13 +2,14 @@ package com.ruoyi.cus.vo;
import com.ruoyi.cus.domain.*; import com.ruoyi.cus.domain.*;
import lombok.Data; import lombok.Data;
import org.yaml.snakeyaml.error.Mark;
import java.util.List; import java.util.List;
@Data @Data
public class CusMainVO { public class CusMainVO {
/** 客户信息 */ /** 客户信息 */
private CusMain mainInfo; private MainVO mainInfo;
/** 联系人信息 */ /** 联系人信息 */
private List<CusContacts> contact; private List<CusContacts> contact;
/** 公司信息 */ /** 公司信息 */
@ -18,5 +19,5 @@ public class CusMainVO {
/** 银行信息 */ /** 银行信息 */
private List<CusBank> bankInfo; private List<CusBank> bankInfo;
/** 唛头信息 */ /** 唛头信息 */
private List<CusMark> mark; private MarkVO mark;
} }

View File

@ -0,0 +1,14 @@
package com.ruoyi.cus.vo;
import com.ruoyi.cus.domain.CusMain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class MainVO extends CusMain {
/** 主营产品list */
private List<String> mainProdList;
}

View File

@ -0,0 +1,23 @@
package com.ruoyi.cus.vo;
import lombok.Data;
@Data
public class MarkVO {
/** 主唛(文字)*/
private String mainText;
/** 主唛(图形) */
private String mainPic;
/** 主侧唛(文字) */
private String mainSideText;
/** 主侧唛(图形) */
private String mainSidePic;
/** 内主唛(文字) */
private String inText;
/** 内主唛(图形) */
private String inPic;
/** 内侧唛(文字) */
private String inSideText;
/** 内侧唛(图形) */
private String inSidePic;
}

View File

@ -42,6 +42,7 @@ public class DlBaseEntity implements Serializable
/** 是否删除(0未删除|1已删除) */ /** 是否删除(0未删除|1已删除) */
@TableLogic @TableLogic
@TableField(value = "del_flag", fill = FieldFill.INSERT)
private String delFlag; private String delFlag;
/** 查询条件 */ /** 查询条件 */

View File

@ -20,7 +20,7 @@
<!-- 必填项 --> <!-- 必填项 -->
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="客户名称" prop="fullName" label-width="100px"> <el-form-item label="客户名称" prop="mainInfo.fullName" label-width="100px">
<el-input v-model="formData.mainInfo.fullName" placeholder="客户名称"> <el-input v-model="formData.mainInfo.fullName" placeholder="客户名称">
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -40,7 +40,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="客户类型" prop="cusType" label-width="100px"> <el-form-item label="客户类型" prop="mainInfo.cusType" label-width="100px">
<el-select style="width: 100%" v-model="formData.mainInfo.cusType" filterable placeholder="客户类型" clearable> <el-select style="width: 100%" v-model="formData.mainInfo.cusType" filterable placeholder="客户类型" clearable>
<el-option <el-option
v-for="dict in dict.type.cus_type" v-for="dict in dict.type.cus_type"
@ -84,7 +84,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="主营产品" label-width="100px"> <el-form-item label="主营产品" label-width="100px">
<!-- collapse-tags--> <!-- collapse-tags-->
<el-select style="width: 100%" v-model="formData.mainInfo.mainProds" multiple collapse-tags filterable placeholder="主营产品" clearable> <el-select style="width: 100%" v-model="formData.mainInfo.mainProdList" multiple collapse-tags filterable placeholder="主营产品" clearable>
<el-option <el-option
v-for="dict in dict.type.cus_main_product" v-for="dict in dict.type.cus_main_product"
:key="dict.value" :key="dict.value"
@ -246,7 +246,7 @@
</el-form> </el-form>
</div> </div>
<div class="dl-drawer-footer"> <div class="dl-drawer-footer">
<el-button type="primary" @click="submitForm"></el-button> <el-button type="primary" @click="submitForm"></el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-drawer> </el-drawer>
@ -279,7 +279,7 @@ export default {
country: '', country: '',
shortName: '', shortName: '',
zoneName: '', zoneName: '',
mainProds: "", mainProdList: "",
siteUrl: '', siteUrl: '',
remark: "", remark: "",
files: "" files: ""
@ -309,13 +309,10 @@ export default {
timeZoneList: [], timeZoneList: [],
// //
rules: { rules: {
cusCode: [ "mainInfo.fullName": [
{ required: true, message: '请输入客户编码', trigger: 'blur' }
],
fullName: [
{ required: true, message: '请输入客户名称', trigger: 'blur' } { required: true, message: '请输入客户名称', trigger: 'blur' }
], ],
cusType: [ "mainInfo.cusType": [
{ required: true, message: '请选择客户类型', trigger: 'blur' } { required: true, message: '请选择客户类型', trigger: 'blur' }
], ],
'contact': [ 'contact': [
@ -338,7 +335,7 @@ export default {
name: '', name: '',
ifDefault: false, ifDefault: false,
nickName: '', nickName: '',
sex: '0', sex: '1',
birthday: '', birthday: '',
contactAddress: '', contactAddress: '',
email: '', email: '',
@ -417,7 +414,7 @@ export default {
country: '', country: '',
shortName: '', shortName: '',
zoneName: '', zoneName: '',
mainProds: "", mainProdList: "",
siteUrl: '', siteUrl: '',
remark: "", remark: "",
files: "" files: ""
@ -444,9 +441,33 @@ export default {
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs["formData"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
//
if(this.formData.contact.length>0){
this.formData.contact.map((item)=>{
if(item.telephone && item.telephonePre){
item.telephone = item.telephonePre + item.telephone
}
if(item.whatsApp && item.whatsAppPre){
item.whatsApp = item.whatsAppPre + item.whatsApp
}
})
}else{
this.$message.warning("请至少添加一个联系人")
return
}
addMain(this.formData).then(response => {
if(response.code==200){
this.$message.success("新增成功");
setTimeout(() => {
this.cancel()
},700)
}else{
this.$message.error(response.msg);
}
})
} }
}) })
}, },

View File

@ -43,24 +43,15 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-dropdown v-hasPermi="['cus:main:add']" @command="handleCommand">
type="primary" <el-button type="primary" plain size="mini">
plain 新建客户<i class="el-icon-arrow-down el-icon--right"></i>
icon="el-icon-plus" </el-button>
size="mini" <el-dropdown-menu slot="dropdown">
@click="handleAddQuick" <el-dropdown-item command="quick" @click="handleAddQuick">快速新建</el-dropdown-item>
v-hasPermi="['cus:main:add']" <el-dropdown-item command="add" @click="handleAdd">普通新建</el-dropdown-item>
>快速新增</el-button> </el-dropdown-menu>
</el-col> </el-dropdown>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['cus:main:add']"
>新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
@ -197,72 +188,12 @@ export default {
country: null, country: null,
mainProds: null, mainProds: null,
}, },
//
chooseContactIndexs: [],
//
onlyRequired: {
mainInfo: false,
contact: false,
},
//
formData: {
mainInfo: {
cusCode: '',
fullName: '',
cusType: '',
country: '',
shortName: '',
zoneName: '',
mainProds: "",
siteUrl: '',
remark: "",
files: ""
},
contact: [
{
name: '',
ifDefault: true,
nickName: '',
sex: '1',
birthday: '',
contactAddress: '',
email: '',
telephone: '',
telephonePre: '',
whatsApp: '',
whatsAppPre: '',
wechat: '',
qq: '',
}
]
},
//
//
countryList: [],
//
timeZoneList: [],
//
rules: {
cusCode: [
{ required: true, message: '请输入客户编码', trigger: 'blur' }
],
fullName: [
{ required: true, message: '请输入客户名称', trigger: 'blur' }
],
cusType: [
{ required: true, message: '请选择客户类型', trigger: 'blur' }
],
'contact': [
{
type: 'array',
required: true,
message: '请至少添加一个联系人',
trigger: 'change'
}
]
}
}; };
}, },
activated() {
//
this.getList();
},
created() { created() {
this.getList(); this.getList();
}, },
@ -293,6 +224,13 @@ export default {
this.single = selection.length!==1 this.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
handleCommand(command){
if("quick"==command){
this.handleAddQuick()
}else if("add"){
this.handleAdd()
}
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.$router.push({path:'/cus/newForm'}) this.$router.push({path:'/cus/newForm'})

View File

@ -69,20 +69,19 @@
<!-- 必填项 --> <!-- 必填项 -->
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户名称" prop="fullName"> <el-form-item label="客户名称" prop="mainInfo.fullName">
<el-input v-model="formData.mainInfo.fullName" placeholder="客户名称"> <el-input v-model="formData.mainInfo.fullName" placeholder="客户名称">
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户编码" prop="cusCode"> <el-form-item label="客户编码" prop="cusCode">
<el-input v-model="formData.mainInfo.cusCode" placeholder="请输入客户编码"> <el-input readonly v-model="formData.mainInfo.cusCode" placeholder="保存后系统自动生成">
<el-button slot="append">申请编码</el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户类型" prop="cusType"> <el-form-item label="客户类型" prop="mainInfo.cusType">
<el-select style="width: 100%" v-model="formData.mainInfo.cusType" filterable placeholder="客户类型" clearable> <el-select style="width: 100%" v-model="formData.mainInfo.cusType" filterable placeholder="客户类型" clearable>
<el-option <el-option
v-for="dict in dict.type.cus_type" v-for="dict in dict.type.cus_type"
@ -132,7 +131,7 @@
<el-col :span="16"> <el-col :span="16">
<el-form-item label="主营产品"> <el-form-item label="主营产品">
<!-- collapse-tags--> <!-- collapse-tags-->
<el-select style="width: 100%" v-model="formData.mainInfo.mainProds" multiple filterable placeholder="主营产品" clearable> <el-select style="width: 100%" v-model="formData.mainInfo.mainProdList" multiple filterable placeholder="主营产品" clearable>
<el-option <el-option
v-for="dict in dict.type.cus_main_product" v-for="dict in dict.type.cus_main_product"
:key="dict.value" :key="dict.value"
@ -489,7 +488,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="内主唛(图形)" label-width="150px"> <el-form-item label="内主唛(图形)" label-width="150px">
<image-upload v-model="formData.mark.inSidePic" :limit="1"/> <image-upload v-model="formData.mark.inPic" :limit="1"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -515,7 +514,7 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="附件"> <el-form-item label="附件">
<file-upload v-model="formData.files"/> <file-upload v-model="formData.mainInfo.files"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -583,7 +582,7 @@ export default {
country: '', country: '',
shortName: '', shortName: '',
zoneName: '', zoneName: '',
mainProds: "", mainProdList: "",
siteUrl: '', siteUrl: '',
remark:"", remark:"",
files:"" files:""
@ -646,13 +645,10 @@ export default {
timeZoneList: [], timeZoneList: [],
// //
rules: { rules: {
cusCode: [ 'mainInfo.fullName': [
{ required: true, message: '请输入客户编码', trigger: 'blur' }
],
fullName: [
{ required: true, message: '请输入客户名称', trigger: 'blur' } { required: true, message: '请输入客户名称', trigger: 'blur' }
], ],
cusType: [ 'mainInfo.cusType': [
{ required: true, message: '请选择客户类型', trigger: 'blur' } { required: true, message: '请选择客户类型', trigger: 'blur' }
], ],
'contact': [ 'contact': [
@ -671,6 +667,15 @@ export default {
const contentContainer = this.$refs.contentContainer const contentContainer = this.$refs.contentContainer
this.debouncedScroll = debounce(this.handleContentScroll) this.debouncedScroll = debounce(this.handleContentScroll)
contentContainer.addEventListener('scroll', this.debouncedScroll) contentContainer.addEventListener('scroll', this.debouncedScroll)
//
// getCode().then(response => {
// if(response.code==200){
// this.formData.mainInfo.cusCode=response.data;
// }else{
// this.$message.error(response.msg);
// }
// }
// );
}, },
beforeDestroy() { beforeDestroy() {
// //
@ -753,7 +758,7 @@ export default {
name: '', name: '',
ifDefault: false, ifDefault: false,
nickName: '', nickName: '',
sex: '0', sex: '1',
birthday: '', birthday: '',
contactAddress: '', contactAddress: '',
email: '', email: '',
@ -814,11 +819,40 @@ export default {
handleSaveAndNew() { handleSaveAndNew() {
// //
console.log('保存并新建') console.log('保存并新建')
this.handleSave("refresh")
}, },
handleSave() { handleSave(str) {
// //
this.$refs['form'].validate(valid => { this.$refs['form'].validate(valid => {
if (valid) { if (valid) {
//
if(this.formData.contact.length>0){
this.formData.contact.map((item)=>{
if(item.telephone && item.telephonePre){
item.telephone = item.telephonePre + item.telephone
}
if(item.whatsApp && item.whatsAppPre){
item.whatsApp = item.whatsAppPre + item.whatsApp
}
})
}else{
this.$message.warning("请至少添加一个联系人")
return
}
addMain(this.formData).then(response => {
if(response.code==200){
this.$message.success("新增成功");
setTimeout(() => {
if(str=="refresh"){
location.reload()
}else{
history.back()
}
},700)
}else{
this.$message.error(response.msg);
}
})
} }
}) })
}, },