From e5f38da710477388671a6b92fb027f7a0d457231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B3=95=E6=8B=8951246?= <719602854@qq.com> Date: Thu, 12 Jun 2025 15:08:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E4=B8=8D?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E6=95=B0=E6=8D=AE=E5=BD=92=E5=B1=9E=20?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E4=B9=9F=E8=83=BD=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=89=93=E5=8D=B0=EF=BC=88=E4=B8=8D=E4=BC=9AselectOne=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E4=BA=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/DefaultDBFieldHandler.java | 16 ++++++----- .../vo/CustomerInfoSaveReqVO.java | 2 +- .../admin/info/vo/InfoSaveReqVO.java | 4 +-- .../customerinfo/CustomerInfoMapper.java | 24 +++++++++++++--- .../customerinfo/CustomerInfoServiceImpl.java | 6 +++- .../visit/service/info/InfoServiceImpl.java | 28 ++++++++++++------- .../service/product/ProductServiceImpl.java | 5 ++++ yudao-ui/yudao-ui-admin-vue3/.env.local | 6 ++-- .../src/views/Home/components/PieChart.vue | 2 +- .../visit/customerinfo/CustomerInfoForm.vue | 12 +++----- .../views/visit/customerinfo/productTable.vue | 1 + .../src/views/visit/info/InfoForm.vue | 4 +-- 12 files changed, 71 insertions(+), 39 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 7e2a1d2..cff53dd 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -61,15 +61,17 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 Object modifier = getFieldValByName("updater", metaObject); - Long userId = WebFrameworkUtils.getLoginUserId(); - if (Objects.nonNull(userId) && Objects.isNull(modifier)) { - setFieldValByName("updater", userId.toString(), metaObject); +// Long userId = WebFrameworkUtils.getLoginUserId(); + String userName = WebFrameworkUtils.getLoginUserName(); + if (Objects.nonNull(userName) && Objects.isNull(modifier)) { + setFieldValByName("updater", userName, metaObject); } + //更新不改变数据归属 //自动插入登录人所属分公司id - Long userDeptId = WebFrameworkUtils.getLoginUserDeptId(); - if (Objects.nonNull(userDeptId)) { - setFieldValByName("companyId", userDeptId, metaObject); - } +// Long userDeptId = WebFrameworkUtils.getLoginUserDeptId(); +// if (Objects.nonNull(userDeptId)) { +// setFieldValByName("companyId", userDeptId, metaObject); +// } } } diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoSaveReqVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoSaveReqVO.java index fe8bd6a..8aee049 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoSaveReqVO.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoSaveReqVO.java @@ -68,7 +68,7 @@ public class CustomerInfoSaveReqVO { private String productNames; @Schema(description = "客户部门") - @NotEmpty(message = "客户部门不能为空") +// @NotEmpty(message = "客户部门不能为空") private String department; } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoSaveReqVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoSaveReqVO.java index 7f3229a..c916bfd 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoSaveReqVO.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoSaveReqVO.java @@ -67,11 +67,11 @@ public class InfoSaveReqVO { private Integer customerStatus; @Schema(description = "拜访品种(多选,逗号分隔)") -// @NotEmpty(message = "拜访品种不能为空") + @NotEmpty(message = "拜访品种不能为空") private String visitProductIds; @Schema(description = "拜访品种名称(多选,逗号分隔)") -// @NotEmpty(message = "拜访品种名称不能为空") + @NotEmpty(message = "拜访品种名称不能为空") private String visitProductNames; @Schema(description = "拜访方式(字典)") diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/customerinfo/CustomerInfoMapper.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/customerinfo/CustomerInfoMapper.java index 64f4953..6372869 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/customerinfo/CustomerInfoMapper.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/customerinfo/CustomerInfoMapper.java @@ -46,10 +46,26 @@ public interface CustomerInfoMapper extends BaseMapperX { //根据公司名称查询客户信息(验证是否唯一使用) default CustomerInfoDO selectByCompanyName(String companyName){ Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return selectOne(new LambdaQueryWrapperX() - .eq(CustomerInfoDO::getCompanyName, companyName) - .eqIfPresent(CustomerInfoDO::getCompanyId, companyId) - ); + LambdaQueryWrapperX eq = new LambdaQueryWrapperX() + .eq(CustomerInfoDO::getCompanyName, companyName); + if (companyId == null) { + eq.isNull(CustomerInfoDO::getCompanyId); + }else{ + eq.eq(CustomerInfoDO::getCompanyId, companyId); + } + return selectOne(eq); + } + + //根据公司名称查询客户名称和所属分公司id(打印用) + default CustomerInfoDO selectByCompanyName(String companyName,Long companyId){ + LambdaQueryWrapperX eq = new LambdaQueryWrapperX() + .eq(CustomerInfoDO::getCompanyName, companyName); + if (companyId == null) { + eq.isNull(CustomerInfoDO::getCompanyId); + }else{ + eq.eq(CustomerInfoDO::getCompanyId, companyId); + } + return selectOne(eq); } // 根据公司名称或手机号查询(根据任一条件带出符合条件的列表) diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoServiceImpl.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoServiceImpl.java index 02fa06e..984e72a 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoServiceImpl.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoServiceImpl.java @@ -87,7 +87,8 @@ public class CustomerInfoServiceImpl implements CustomerInfoService { validateCustomerInfoExists(updateReqVO.getId()); // 更新 CustomerInfoDO updateObj = BeanUtils.toBean(updateReqVO, CustomerInfoDO.class); - CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(updateObj.getCompanyName()); + CustomerInfoDO customerInfoDO0 = customerInfoMapper.selectById(updateObj.getId()); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(updateObj.getCompanyName(), customerInfoDO0.getCompanyId());//修改的这条数据的所属分公司中,是否有重复的companyName if (customerInfoDO != null && !customerInfoDO.getId().equals(updateObj.getId())) { throw exception(CUSTOMER_INFO_COMPANY_NAME_DUPLICATE); } @@ -95,6 +96,9 @@ public class CustomerInfoServiceImpl implements CustomerInfoService { String url = uploadMapImageByUrl(updateObj.getLocationImage(), null); updateObj.setLocationImage(url); } + if (customerInfoDO != null) { + updateObj.setCompanyId(customerInfoDO.getCompanyId());// 设置原本的companyId + } customerInfoMapper.updateById(updateObj); } diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoServiceImpl.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoServiceImpl.java index ebb7012..66dc5e7 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoServiceImpl.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoServiceImpl.java @@ -118,10 +118,15 @@ public class InfoServiceImpl implements InfoService { validateInfoExists(updateReqVO.getId()); // 更新 InfoDO updateObj = BeanUtils.toBean(updateReqVO, InfoDO.class); + //按id查询获取companyId原本归属 + InfoDO infoDO = infoMapper.selectById(updateReqVO.getId()); if (updateObj.getLocationImage() != null&& updateObj.getLocationImage().startsWith("https://apis.map.qq.com/ws/staticmap/v2/")){ String url = uploadMapImageByUrl(updateObj.getLocationImage(), null); updateObj.setLocationImage(url); } + if (infoDO != null){ + updateObj.setCompanyId(infoDO.getCompanyId()); + } infoMapper.updateById(updateObj); } @@ -152,17 +157,17 @@ public class InfoServiceImpl implements InfoService { return vos; } List> groupedByCompany = list.stream() - // 按公司名称分组,取每个公司最近四次(结果:Map>) - .collect(Collectors.groupingBy(InfoDO::getCompanyName)) - .values().stream() // 遍历每个公司的记录列表 + // 按 (companyName, companyId) 组合分组 + .collect(Collectors.groupingBy(info -> info.getCompanyName() + "::" + info.getCompanyId())) + .values().stream() .map(companyRecords -> companyRecords.stream() - // 按拜访时间降序排序 - .sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()) - .limit(4) // 取最近 4 条 + .sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()) // 按时间降序 + .limit(4) // 取前 4 条 .collect(Collectors.toList()) ) - .collect(Collectors.toList()); // 收集为 List> + .collect(Collectors.toList()); + groupedByCompany.forEach(info -> { //服务内容(最近四次) List serviceContent = new ArrayList<>(); @@ -172,6 +177,7 @@ public class InfoServiceImpl implements InfoService { List visitDateList = new ArrayList<>(); //以第一个公司名称作为合并打印的公司 String companyName = info.get(0).getCompanyName(); + Long companyId = info.get(0).getCompanyId(); //取最多4张服务图片 int maxImages = 4; for (InfoDO infoDO : info) { @@ -193,7 +199,7 @@ public class InfoServiceImpl implements InfoService { }); //下面获取客户信息 InfoPrintVO infoPrintVO = new InfoPrintVO(); - CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName,companyId); if (customerInfoDO != null){ infoPrintVO.setVisitProductNames(customerInfoDO.getProductNames());//本次拜访品种 infoPrintVO.setCompanyName(customerInfoDO.getCompanyName());//公司名称 @@ -278,6 +284,7 @@ public class InfoServiceImpl implements InfoService { //现根据客户名称获取历史拜访记录 List info = infoMapper.selectByCompanyName(companyName); if (info != null && !info.isEmpty()){ + Long companyId = info.get(0).getCompanyId(); //取最近四次 info = info.stream() // 筛选本月记录(基于 LocalDateTime) @@ -306,7 +313,7 @@ public class InfoServiceImpl implements InfoService { visitDateList.add(infoDO.getVisitDate().toLocalDate()); }); //下面获取客户信息 - CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName,companyId);//这个companyId是从根据companyId获取得数据List中获取得,一定和点得这条匹配 infoPrintVO.setVisitProductNames(customerInfoDO.getProductNames());//本次拜访品种 infoPrintVO.setCompanyName(customerInfoDO.getCompanyName());//公司名称 infoPrintVO.setSalesman(customerInfoDO.getCreator());//拜访记录的创建者就是该记录的业务员 @@ -355,6 +362,7 @@ public class InfoServiceImpl implements InfoService { List visitDateList = new ArrayList<>(); //以第一个公司名称作为合并打印的公司 String companyName = info.get(0).getCompanyName(); + Long companyId = info.get(0).getCompanyId(); //取最多4张服务图片 int maxImages = 4; for (InfoDO infoDO : info) { @@ -376,7 +384,7 @@ public class InfoServiceImpl implements InfoService { }); //下面获取客户信息 InfoPrintVO infoPrintVO = new InfoPrintVO(); - CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName,companyId); if (customerInfoDO != null){ infoPrintVO.setVisitProductNames(customerInfoDO.getProductNames());//本次拜访品种 infoPrintVO.setCompanyName(customerInfoDO.getCompanyName());//公司名称 diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductServiceImpl.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductServiceImpl.java index 3ca33aa..604c075 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductServiceImpl.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductServiceImpl.java @@ -52,8 +52,13 @@ public class ProductServiceImpl implements ProductService { public void updateProduct(ProductSaveReqVO updateReqVO) { // 校验存在 validateProductExists(updateReqVO.getId()); + //按id查,取出归属companyId + ProductDO productDO = productMapper.selectById(updateReqVO.getId()); // 更新 ProductDO updateObj = BeanUtils.toBean(updateReqVO, ProductDO.class); + if (productDO != null){ + updateObj.setCompanyId(productDO.getCompanyId()); + } productMapper.updateById(updateObj); } diff --git a/yudao-ui/yudao-ui-admin-vue3/.env.local b/yudao-ui/yudao-ui-admin-vue3/.env.local index f1de5db..66290b7 100644 --- a/yudao-ui/yudao-ui-admin-vue3/.env.local +++ b/yudao-ui/yudao-ui-admin-vue3/.env.local @@ -5,8 +5,8 @@ VITE_DEV=true # 请求路径 # VITE_BASE_URL='http://192.168.0.133:48080' -VITE_BASE_URL='https://hntqwl.com' -# VITE_BASE_URL='http://localhost:48080' +# VITE_BASE_URL='https://hntqwl.com' +VITE_BASE_URL='http://localhost:48080' # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 VITE_UPLOAD_TYPE=server @@ -33,4 +33,4 @@ VITE_MALL_H5_DOMAIN='http://localhost:3000' VITE_APP_CAPTCHA_ENABLE=false # GoView域名 -VITE_GOVIEW_URL='http://127.0.0.1:3000' \ No newline at end of file +VITE_GOVIEW_URL='http://127.0.0.1:3000' diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/PieChart.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/PieChart.vue index 87fe6c4..9678e87 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/PieChart.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/PieChart.vue @@ -104,7 +104,7 @@ const chartOption = computed(() => { { name: props.tooltipTip, type: 'pie', - radius: ['40%', '70%'], + radius: ['30%', '50%'], center: ['30%', '50%'], label: { show: false diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/CustomerInfoForm.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/CustomerInfoForm.vue index c7f2288..0b4de57 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/CustomerInfoForm.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/CustomerInfoForm.vue @@ -9,10 +9,10 @@ :disabled="isDetail" > - + - + @@ -78,14 +78,14 @@ - + - + ({ const formRules = reactive({ companyName: [{ required: true, message: '公司名称不能为空', trigger: 'blur' }], customerType: [{ required: true, message: '性质等级不能为空', trigger: 'change' }], - department: [{ required: true, message: '客户部门不能为空', trigger: 'change' }], provinceName: [{ required: true, message: '省名称不能为空', trigger: 'blur' }], cityName: [{ required: true, message: '市名称不能为空', trigger: 'blur' }], areaName: [{ required: true, message: '区名称不能为空', trigger: 'blur' }], @@ -189,9 +188,6 @@ const productListRef = ref | null>(null) // // 打开二级产品列表弹窗 const openProduct = () => { - if (formData.value.productNames) { - return - } productListRef.value?.open() // 调用子组件暴露的方法 } diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/productTable.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/productTable.vue index 979aaff..cd54080 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/productTable.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/productTable.vue @@ -174,6 +174,7 @@ const handleSelectionChange = (val) => { /** 查询列表 */ const getList = async () => { loading.value = true + queryParams.status = getIntDictOptions(DICT_TYPE.COMMON_STATUS).find(item => item.label === '正常')?.value try { const data = await ProductApi.getProductPage(queryParams) list.value = data.list diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/InfoForm.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/InfoForm.vue index c18eba6..c405f64 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/InfoForm.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/InfoForm.vue @@ -9,10 +9,10 @@ :disabled="isDetail" > - + - +